About Blog Contact

Linux系统下的软件应该安装在哪儿?

*知乎问题:Linux系统下的软件应该安装在哪儿?

我在windows系统下安装软件都会安装在别的地方不会装在c盘,因为怕拖慢系统的运行速度,那在linux系统下需不需要这样做呢?而且linux系统安装软件装完了都不知道装到哪儿了,感觉到处都有,让强迫症很难受,能不能把它们都装在同一个地方?

Linux下面的软件,按照安装方式,一般有这几种:

1. 使用各种包管理器安装的包:比较常见的例子有aptyumpipnpm等,也 包括dpkg手动安装的.deb文件。这些软件,其安装位置一般都不好设置,比如apt,安装位置在.deb文件中都写死了,改起来很费尽。不过这种情况下一般不会出现 “装完了都不知道装到哪儿了”的问题,包管理器一般都提供查询已安装软件情况的功能,比如apt

    $ apt list --installed

会显示已经安装的包,输出类似下面的格式:

    hostname/eoan,now 3.22 amd64 [installed]
    hplip-data/eoan,eoan,now 3.19.6+dfsg0-1ubuntu1 all [installed,automatic]
    hplip/eoan,now 3.19.6+dfsg0-1ubuntu1 amd64 [installed,automatic]
    htop/eoan,now 2.2.0-2 amd64 [installed]使用源代码变异

这里[installed]指的是用户主动安装的包,[installed, automatic] 指的是用户安装别的包时候的依赖。如果我apt remove 某个包,那么所有他依赖的包也会被移除。所以查自己装的包,只看[installed]状态的就可以了。

如果实在想知道安装到了那里,可以这样干。比如我想找htop在什么地方:

    $ dpkg -L htop
    /usr
    /usr/bin
    /usr/bin/htop
    /usr/share
    /usr/share/applications
    /usr/share/applications/htop.desktop
    /usr/share/doc
    /usr/share/doc/htop
    /usr/share/doc/htop/AUTHORS
    /usr/share/doc/htop/README
    /usr/share/doc/htop/changelog.Debian.gz
    /usr/share/doc/htop/copyright
    /usr/share/man
    /usr/share/man/man1
    /usr/share/man/man1/htop.1.gz
    /usr/share/pixmaps
    /usr/share/pixmaps/htop.png

可以看出,软件在/usr/bin/htop,文档在/usr/share/doc/htop/usr/share/man/man1/htop.1.gz

你要实在不想按照他写的位置安的话,可以把里面的文件导出来,不过可能有权限和其他的设置问题(apt还要运行.deb里边的安装脚本,设置驱动什么的),如果愿意去解决这些问题的话可以试试。 不过向htop这种程序,只有一个二进制文件/usr/bin/htop是必须的,真导出来放在自己想要的地方也无妨。

2. 使用源代码编译再安装的软件。许多开发库,或者包管理软件上没有的软件,只能使用源代码编译再安装,常见的步骤是./configure && make && sudo make install,设置、编译、安装。一般情况下默认设置是可执行文件安装到/usr/bin,库安装到/usr/lib(这也是一般要加sudo的原因)。如果想改位置的话,比较常见的方法是在 ./configure中加一个flag:

    $ ./configure --prefix=安装这个软件的文件夹

不一定所有情况都支持(这里吐槽一下C和C++程序的混乱的build system……这就是一门语言没有爹的后果),最好查一下软件的说明。当然了,C和C++之外的语言一般就用自己的编译工具了,各自有各自的情况。

这种情况的问题是一般只能通过make uninstall卸载,如果有着源代码和Makefile的文件夹没了,那就不好办了。现在我的电脑里面就有不知道多少个这样的软件…… (还有向gcc这样不提供make uninstall的,只能手动去删了。)

3. 别人提供好的二进制可执行程序,让你下个tar.gz压缩包的一般都是这种情况。这个就没有任何规律了,运行后在任何地方存东西都有可以,不过比较多的是存在$HOME/.config/软件名里面。不过和Windows不一样,一般不会把可执行文件扔到别的地方,所以之后想要再用的话一般也是执行这个程序。或者说这种情况一般没有什么”安装”的概念,可以说是”portable”。我是在$HOME目录建了个文件夹,所有的这种程序都放在这里。

最后再说一句,你的强迫症没什么错对之分,不过我觉得你担心的原因没什么道理:”怕拖慢系统的运行速度”。不知道你是不是担心和系统文件存在同一个盘上,读取程序的时候和系统抢硬盘读写带宽?我刚用iotop看了一下,系统在正常运行的时候对硬盘的读写并不多,无论是随机读写还是顺序读写,都远远占不满,估计Windows也差不多。因此,存在哪个目录下面我觉得没有太大的实际区别。