CentOS7下的软件安装⽅法及策略详解
2010 年开始正式接触 Linux,⼊门发⾏版是 Ubuntu 10.10,后来过渡到 Ubunu 11.04,这其中也尝试了很多其他主流的发⾏版。进⼊实验室之后,开始⽤ CentOS 5,然后是 CentOS 6,现在进化到 CentOS 7。
使⽤了四年的 Linux,前三年都是在瞎折腾,浪费了不少时间,也得到了不少经验与教训。现在可能是真的⽼了,已经不愿意折腾了,只希望配置好⼀个系统之后,就⼀直使⽤下去。
为什么要写/读这⼀篇
使⽤ Linux 尤其是 CentOS 会遇到⼀些坑,或是⼀些有洁癖的⼈不能忍的事情:
官⽅源中的软件包版本太⽼,在功能上⽆法满⾜需求;多个源的软件包存在版本冲突;⼿动编译软件,默认会将不同⽂件放置在 /usr/local 下不同的⼦⽬录下,使得软件的更新和删除变得⿇烦。等等…wps自动生成目录
在经历了⼏次重装 CentOS 之后,特总结出如下⼏条软件安装的⽅法与原则,以尽可能保证当前系统的稳定、整洁,尽可能降低系统洁癖引起的重装冲动。
以下所说,仅限于 CentOS7,对其他发⾏版,或许有借鉴意义。
官⽅源
CentOS ⾃带的四个官⽅源中,默认打开的有 base、updates、extras,这三个源中包含了约 9000 个软件包,是最稳定、也是最值得信赖的源。
因⽽若⼀个软件包在官⽅源内,则应通过官⽅源安装:
sudo yum install PackageName
第三⽅源
官⽅源虽然包含了很多软件包,但⽆法满⾜⽇常需求。幸好有第三⽅源,可以作为官⽅源的补充。
在使⽤第三⽅源的过程中,最怕遇到这两个问题:
第三⽅源和官⽅源中有相同的包,导致官⽅源的包被第三⽅源替代;多个第三⽅源中存在同⼀个软件包,且版本不⼀致,存在冲突;
这两个问题经常是致命的,出现各种预料不到的后果,因⽽选择第三⽅源要遵循如下原则:
只选择可靠的第三⽅源,要确保第三⽅源不会替换官⽅源中的包;使⽤尽量少的第三⽅源,以保证第三⽅源之间不会冲突;
就 CentOS ⽽⾔,根据以上的原则,使⽤如下第三⽅源:
⼤型第三⽅源,已确认不会替换官⽅源的包,且相互之间⽆冲突 EPEL:包含 6500 多个软件,科研必备 ELRepo:包含⼏⼗个各种硬件的驱动程序 Nux Dextop:多媒体相关的软件包(与 EPEL 的个别软件相冲突,可忽略)
有些⼩型第三⽅源,仅包含了⼏个软件,确认与官⽅源和 EPEL 源不会冲突,也可以添加 Google Chrome:包含了 Google Chrome,不会与官⽅源和 EPEL 源冲突; Adobe:仅包含 flash 插件,已确认不会冲突; dropbox:仅包含 dropbox ⼀个软件,已确认不会冲突;
因⽽,若⼀个软件包位于 EPEL、ELRepo 中,或⼀些⼩型的第三⽅源中,则添加该第三⽅源,并⽤ yum 命令安装:
sudo yum install PackageName
官⽅ rpm 包
⼤部分⾮开源的软件,在 CentOS 官⽅源或 EPEL 中是没有的。有些软件的官⽅⽹站会提供官⽅ rpm 包。此时可以从官⽅⽹站下载与当前系统对应的 rpm 包,直接⽤如下命令安装:
sudo rpm -i PackageName.rpm
⽐如,WPS for Linux 就是其中⼀个。在安装的过程中 rpm 命令会⾃动检查依赖关系,若该软件所依赖的包在官⽅源和 EPEL 源中可以到,则⾃动安装。
直接安装 rpm 包的做法相当省事,但该软件不能由 yum 更新,稍稍⿇烦⼀点。有些软件,⽐如前⾯提到的 Google、Dropbox 和 Adobe 其实也可以通过这种⽅法安装,在安装的同时会给系统添加源,对于这类软件依然可以很⽅便的更新与删除。
解压即⽤
有些软件,官⽅提供了压缩包,解压之后即可直接运⾏其中的⼆进制⽂件,⽐如很多 Java 写的软件。这类软件没有给源代码,⽽是给了可以在当前平台下直接执⾏的⼆进制⽂件。⼤多数⾮开源的商业软件都采取这种办法。
⽐如 sublime_text、pycharm、mendeley、TauP、sac 等,直接解压,然后将解压后的⽂件夹复制到 /opt ⽬录下,然后将该软件的 bin ⽬录加⼊到 PATH 中即可。⽐如 Mathematics、Matlab、intel studio,软件包中提供安装脚本,执⾏该脚本即可安装;
Linux 下的习惯是,商业软件或第三⽅软件都安装到 /opt ⽬录下,这也是⼤多数商业软件包的默认安装路径,尽量遵循该习惯。
第三⽅ rpm 包
有些软件,CentOS 源和 EPEL 源中不到,官⽅⼜没有提供 rpm 包,但是其他第三⽅源提供了 rpm 包。分情况讨论:
若该第三⽅源只包含了很少量的包,且确定这些包与官⽅源以及其他已使⽤的第三⽅源不冲突,则可以添加该第三⽅源。若该第三⽅源包含了很多软件,很可能与官⽅源或 EPEL 源有冲突,则不添加该源若该软件包没有复杂的依赖关系,则直接安装该源中的 rpm 包;若该软件包依赖于该第三⽅源中的其他包,则放弃,寻其他⽅法;
第三⽅包管理器
不同的发⾏版使⽤不同的软件包管理器,CentOS 使⽤ yum,Ubuntu 使⽤ apt-get。近些年⼜出现了⼀些与发⾏版⽆关的第三⽅包管理器,⽐如 Linuxbrew、Gentoo Prefix、pkgsrc。
Linuxbrew
Linuxbrew 是由 OS X 平台下⾮常流⾏的 Homebrew 移植到 Linux 下的。Linuxbrew 可以作为系统⾃带的包管理器的⼀个补充。其特⾊在于:
所有软件都安装在 ${HOME}/.linuxbrew ⽬录下;软件的版本相对很新; install、uninstall、info、list、update、upgrade 等功能若库中没有需要的软件包,可以很简单地⾃⼰创建 formulae
试⽤了⼀下,⼀个⽐较坑的地⽅是,linuxbrew 会⾃⼰内部解决依赖问题。⽐如,我试着通过 linuxbrew 安装 terminator,然后发现 terminator 依赖于Python,尽管系统已经安装了 python,linuxbrew 还是会安装⼀份 python,⼜由于 python 依赖于更多的东西,导致⼜安装了更多软件包在 home 下。⽽且,linuxbrew 是从源码编译软件的,所以相对来说速度较慢。
编译源码
⼤部分软件⽤前⾯的⼏种⽅法应该都能安装上了。如果没安装上,那就得问问⾃⼰,真的需要安装这个软件么。如果不是⾮常必要的话就不要安装啦。如果是必须的软件,那就必须要⼿动编译了。
常见的源码编译,⼀般也就是如下⼏步。当然,具体情况具体对待:
tar - ./configure --prefix=/opt/xxxx make sudo make install
⼀般来说,这类软件的默认安装⽬录都是 /usr/local ,最终⽂件会被分别放在 /usr/local 的 bin、lib、share、man ⽬录下。
我个⼈⾮常不喜欢这种⽅式,因为作为⼀个通过源码编译的软件来说,意味着编译者要完全负起管理该软件的义务,这样的放置⽅式会来更新或卸载软件带来很多⿇烦。所以我总是会在 configure 的时候加上 prefix ⼿动指定安装路径。要卸载该软件就直接删除 /opt 下对应的⽬录,要更新的话,也可以先删除,再重新编译⼀遍。这样做稍微⿇烦的⼀点是,需要⼿动将该软件的 bin ⽬录加⼊到 PATH 中,还有可能需要修改 LD_LIBRARY_PATH。但是⼀般来说,需要编译源码的软件很少,所以不会造成太⼤的⿇烦。
编译代码
好吧,其实我不知道该怎么起标题了。。
前⼀节 “编译源码” 主要针对的是⼀些⼤型软件包,这⼀节 “编译代码” 指的是对⼀些专业性很强的⼩代码包的处理⽅式。⽐如有些软件包编译之后实际需要的只是⼀个⼆进制⽂件,这个时候就没有必要安装到 /opt 了,合适的⽅式是在⾃⼰的 HOME 下建⽴ bin ⽬录,并将其路径加⼊到 .bashrc 中,然后将编译⽣成的⼆进制⽂件复制到该⽬录下即可:
mkdir ${HOME}/bin echo 'export PATH=${HOME}/bin:$PATH'>> ~/.bashrc
⽐如我的 ${HOME}/bin ⽬录下有如下⽂件:
distaz :给出地球上两点经纬度,计算震中距和⽅位⾓ pssac :在 GMT 中绘制 SAC ⽂件 rdseed :SEED 格式转 SAC 格式win2sac_32 、 catwin32 :Hi-net ⽹站提供的⽤于处理 Hi-net 数据的程序 st :sublime_text 被安装到 /opt ⽬录下,在此建⽴
⼀个软链接,⽅便在命令⾏调⽤ sublime text wlt.pl :校内⽤于登陆⽹络通的脚本,在命令⾏修改⽹络端⼝,好 happy fk 、 fk.pl 、 syn 、 trav :Prof. Lupei Zhu 的⽤于计算合成地震图的程序,源代码有不少,实际需要⽤的也就这三个可执⾏⽂件和⼀个 perl 脚本。 matlab :指向 matlab 的⼀个软连接;
不要随便什么⼆进制⽂件都往 bin ⾥放,这⾥只应放⼀些常⽤的命令或很通⽤的⼯具。
⾃成系统的软件
有⼀类软件,其拥有众多模块或包,为了管理这众多的模块,就需要拥有⼀个⾃⼰的模块 / 包管理器。这其中以 TeX、Perl 和Python 为代表。对于这⼀类软件,其众多的模块是最⼤的优势,也是最值得利⽤的资源,因⽽我通常会选择⼿动安装它们,原因如下:
系统的源中不可能包含该软件的所有模块;系统的源中该软件的模块的更新要远远滞后于最新版本;
当然,即便是使⽤系统⾃带的版本,也依然可以⽤该软件⾃带的包管理器来安装模块。但将导致:
部分模块⽤系统的 yum 管理,部分模块⽤软件⾃带的包管理器管理; yum 安装的模块⼀般版本较⽼,软件的包管理器要安装的⼤多是最新版本;
这⼀⽅⾯会导致模块管理的混乱,另⼀⽅⾯⽤软件⾃带的包管理其安装模块时,可能会依赖于其他模块的最新版本,若该模块是通过系统 yum 安装的较旧的版本,则可能导致模块的安装失败。
因⽽,对于这类软件,⼀般单独安装,并⽤各⾃的包管理器管理模块:
TeXLive:通过 TeXLive iso 镜像⽂件安装,使⽤其⾃带的 tlmgr 管理包 Perl:通过 plenv 安装最新版本的 Perl,使⽤ plenv ⾃带的 cpanm 安装模块 Python:通过 pyenv 安装最新版本的 Python,使⽤ Python ⾃带的 pip 安装模块
例外
有规则总有例外。
第三⽅源
mosquito-myrepo 是⼀个私⼈维护的源,其中包含了中⽂输⼊法、QQ、飞信、为知笔记、有道词典、百度云以及若⼲⾳频、视频播放器。我对这个源的态度是⼜爱⼜恨,其提供了很多中国⼈需要的软件,
但因为其依赖于除 EPEL 外的其他第三⽅软件源,进⽽可能导致包冲突。所以对该源的使⽤,要保持谨慎。
总结
简单总结⼀下:
为系统添加 EPEL 源、Nux Dextop、ELRepo 源和个别其他⼩型第三⽅源能够从源中安装的就从源中安装不能从源中安装的尽量 rpm 包安装不到 rpm 包的就试试 linuxbrew 能不⼿动编译的就不要⼿动编译