Linux软件安装管理的三种方Linux软件安装管理的三种方式
Linux下常规的安装方式有三种,源码安装,二进制安装,在线使用yum和apt工具安装,三种方式各有优劣。下面逐步讲解Debian和RedHat系列的三种安装方式。
源码,即程序软件的源代码(一般也叫Tarball,即将软件的源码以tar打包后再压缩的资源包)。源代码分发提供了软件所有程序源代码,需要用户自己编译成可执行的二进制代码并进行安装,根据应用环境的不同进行编译安装。
特点:
命令步骤:
cd /usr/local/src/
wget https://www.sudo.ws/dist/sudo-1.9.5p2.tar.gz
sha256sum sudo-1.9.5p2.tar.gz //验证sha256sum码(有的提供md5码),与官方对照,确定是否被篡改;
tar -zxvf sudo-1.9.5p2.tar.gz //解压,*.bz2包则执行 tar -jxvf *.bz2
cd sudo-1.9.5p2/ && ./configure #检测操作环境并生成makefile文件
make && make install #编译安装
不指定前缀,安装后
卸载:
make uninstall
或
手动删除软件在上述目录中的文件
注意事项:
./configure --prefix=目录名
,指定软件将要安装到目标路径,这样最后删除或者移动目录名,即可操作便捷干净需要先将源代码编译生成rpm二进制包,再以rpm二进制包的形式安装(参二2)
rpm -rebuild *.src.rpm
:编译源文件,并在/usr/src/dist/RPMS下生成二进制的rpm包
卸载方式参考rpm二进制安装
gcc,make, configure
,则可以通过yum/apt
在线安装虽然使用源码可以具有定制化设置,但是对于不同的
Linux distribution
的发行商,增加了软件管理的负担,严重影响linux
平台上软件的发行和推广。
为了解决这个问题,厂商在他们的系统上已为用户编译好了相关软件,然后将编译好可执行的软件直接发布给用户安装。
不同的linux
发行版使用不同的打包形式,不过一般分为两个包管理阵营:Debian 的”.deb“
,和Red Hat的”.rpm”
。也有一些重要的例外,比方说 Gentoo, Slackware,和 Foresight。
接下来介绍包安装的两种方式
二进制包,如 Red Hat发行版的.rpm包,Debian发行版的.deb包。
RPM全称“RedHat Package Manager”
,该机制最早由Red Hat这家公司开发出来的,后来实在很好用,因此很多distributons就使用这个机制来作为软件安装的管理方式,包括Fedora,CentOS,SuSE等知名的开发商都是用它。
RPM最大的特点就是需要安装的软件已经编译过,并已经打包成RPM机制的安装包,通过里头默认的数据库记录这个软件安装时需要的依赖软件。
当安装在你的Linux主机时,RPM会先依照软件里头的数据查询Linux主机的依赖属性软件是否满足,若满足则予以安装,若不满足则不予安装。
优点:
缺点:
为了解决RPM属性依赖的问题,下面也将会为你详细介绍YUM的使用方法。
RPM包全名的命名格式:软件名称-版本号-发布次数.适合linux系统.硬件平台.rpm
例如:ftp-0.17-74.fc27.i686.rpm
注意:
包全名:rpm操作没有安装的软件包,软件包使用的是包全名
包 名:rpm操作的已经安装的软件,软件包使用的是包名
例如上面的例子,包全名为ftp-0.17-74.fc27.i686.rpm,包名为ftp。
/etc
配置文件放置目录
/usr/bin
一些可执行文件
/usr/lib
一些程序使用的动态链接库
/usr/share/doc
一些基本的软件使用手册与说明文件
/usr/share/man
一些man page档案
rpm -ivh 包全名 //例: rpm -ivh emacs-25.3-1.fc28.aarch64.rpm
rpm参数说明(后面括号内为英文说明):
rpm –Uvh foo-2.0-1.i386.rpm
参数说明(后面括号内为英文说明):
RPM在查询的时候,其实查询的地方是/var/lib/rpm/这个目录下的数据库文件。
另外,RPM也可以查询未安装的RPM文件内的信息。
rpm {-q|--query} [select-options] [query-options]
注意:在查询的部分,所有的参数之前都要加上-q才是所谓的查询
常用参数说明(后面括号内为英文说明):
使用场景
a. 查询你的Linux是否有安装某个软件: rpm -q yum
b. 查询属于该软件所提供的所有目录与文件:
rpm -ql yum
rpm -qc yum
rpm -qd yum
c. 列出gcc这个软件的相关数据说明: rpm -qi gcc
d. 找出/bin/sh是由哪个软件提供的: rpm -qf /bin/sh
e. 假设我有下载一个RPM文件,包名为wget-1.19.1-3.fc27.aarc64.rpm,想要知道该文件的需求文件
rpm -qpR wget-1.19.1-3.fc27.aarc64.rpm
使用rpm的卸载过程一定要由最上层往下卸载,不过很常发生软件属性依赖导致无法使用某些软件的问题。
rpm -e gcc
dpkg - package manager for Debian (debian系统的包管理工具)。
dpkg是Debian的一个底层包管理工具,主要用于对已下载到本地和已安装的软件包进行管理。
dpkg这个机制最早由Debian Linux社区所开发出来的,通过dpkg的机制,Debian提供的软件就能够简单的安装起来,同时能提供安装后的软件信息,实在非常不错。只要派生于Debian的其它Linux distributions大多使用dpkg这个机制来管理,包括B2D,Ubuntu等。
格式为:Package_Version-Build_Architecture.deb
如:nano_1.3.10-2_i386.deb
/etc/dpkg/dpkg.cfg
dpkg包管理软件的配置文件【Configuration file with default options】
/var/log/dpkg.log
dpkg包管理软件的日志文件【Default log file (see /etc/dpkg/dpkg.cfg(5) and option --log)】
/var/lib/dpkg/available
存放系统所有安装过的软件包信息【List of available packages.】
/var/lib/dpkg/status
存放系统现在所有安装软件的状态信息
/var/lib/dpkg/info
记安装软件包控制目录的控制信息文件
dpkg 使用文本文件作为数据库来维护系统中软件,包括文件清单, 依赖关系, 软件状态, 等等详细的内容,通 常在 /var/lib/dpkg 目录
下。
通常情况:
如上图,每条记录对应一个软件包。注意看红框中,每条记录的第一、二、三个字符,这就是软件包的状态标识,后边依此是软件包名称、版本号和简单描述。
1)第一字符:期望值(Desired=Unknown/Install/Remove/Purge/Hold)
,它包括:
2)第二字符:软件包的当前状态(Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
)
3)第三字符:标识错误状态,第一种状态标识没有问题,为空. 其它符号则标识相应问题(Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
)
举个栗子:
ii —— 表示系统正常安装了该软件
pn —— 表示安装了该软件,后来又清除了
un —— 表示从未安装过该软件
iu —— 表示安装了该软件,但是未配置
rc —— 该软件已被删除,但配置文件仍在
为了方便用户使用,dpkg不仅提供了大量的参数选项, 同时也提供了许多子命令。
比如:dpkg-deb、dpkg-divert、dpkg-query、dpkg-split、dpkg-statoverride、start-stop-daemon
这里将不会对dpkg的命令作详细说明,如需了解可自行查阅资料。
dpkg -i package-name.deb # --install
安装软件包,必须是deb包的完整名称。(软件的安装可被拆分为两个对立的过程“解包”和“配置”)
dpkg --unpack package-name.deb
#“解包”:解开软件包到系统目录但不配置, 如果和-R一起使用,参数可以是一个目录dpkg --configure package-name.deb
#“配置”:配置软件包dpkg -c package-name.deb
#列出 deb 包的内容参数:
-R, --recursive Recursively handle all regular files matching pattern *.deb found at specified directories and all of its
This can be used with -i, -A, --install, --unpack
--avail actions(递归地指向特定目录的所有安装包,可以结合-i, -A, --install, --unpack 与
--avail一起使用)
dpkg -l package-name-pattern # --list
, 查看系统中软件包名符合pattern模式的软件包dpkg -L package-name # --listfiles
, 查看package-name对应的软件包安装的文件及目录dpkg -p package-name # --print-avail
, 显示包的具体信息dpkg -s package-name # --status
, 查看package-name(已安装)对应的软件包信息dpkg -S filename-search-pattern # --search
, 从已经安装的软件包中查找包含filename的软件包名称 (Tip:也可使用子命令dpkg-query来进行查询操作)例1:列出系统上安装的与dpkg相关的软件包
dpkg -l \*dpkg*
例2:查看dpkg软件包安装到系统中的文件
dpkg -L dpkg
dpkg -r package-name # --remove
, 移除软件包,但保留其配置文件dpkg -P package-name # --purge
, 清除软件包的所有文件(removes everything, including configfiles)更多dpkg的使用方法可在命令行里使用man dpkg
来查阅 或直接使用dpkg --help
。
为了解决上面二进制包安装的属性依赖问题,linux发行商提供了在线安装的方式。在线安装方式和包安装方式也分为两大阵营。rpm对应yum, deb对应debian。
YUM可以看作是CS架构的软件,YUM的存在很好的解决了RPM的属性依赖问题。
YUM通过依赖rpm软件包管理器, 实现了rpm软件包管理器在功能上的扩展, 因此YUM是不能脱离rpm而独立运行的。
Server端先对程序包进行分类后存储到不同repository容器中;
再通过收集到大量的rpm的数据库文件中程序包之间的依赖关系数据, 生成对应的依赖关系和所需文件在本地的存放位置的说明文件(.xml格式), 存放在本地的repodata目录下供Client端取用
Cilent端通过yum命令安装软件时发现缺少某些依赖性程序包, Client会根据本地的配置文件(/etc/yum.repos.d/*.repo
)找到指定的Server端, 从Server端repo目录下获取说明文件xxx.xml后存储在本地/var/cache/yum中方便以后读取, 通过xxx.xml文件查找到需要安装的依赖性程序包在Server端的存放位置, 再进入Server端yum库中的指定repository容器中获取所需程序包, 下载完成后在本地实现安装。
yum从系统站点镜像拉取软件相关信息,一般来说这个源是就近配置,越近越快。就像是网购,国内购的速度总比海购要快得多。
系统站点镜像的配置说明:
CentOS的镜像站点(http://ftp.twaren.net/Linux/C…)后,就会发现里面有一堆链接,那些链接就是这个yum服务器所提供的容器了,包括centosplus、extras、fasttrack、os、updates等容器,最好认的就是os(系统默认的软件)与updates(软件升级版本)。
在yum服务器的容器里面,最重要的一个目录就是那个“repodata”,该目录是分析RPM软件后所产生的软件依赖数据放置处。因此,当你找到容器所在网址时,最重要的就是该网址下面一定要有一个名为“repodata”的目录存在,那就是容器的网址了。
下面都是以我的主机为例:CentOS 7.4.1708
查询命令:yum repolist all
![yum repolist all]](https://img-blog.csdnimg.cn/20210224183222481.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTE0MTc4MjA=,size_16,color_FFFFFF,t_70)
只有当最右边的status为enabled该容器才算激活
/etc/yum.repos.d/里面会有多个配置文件(文件名以.repo结尾),yum会从里面逐个查找,所以里面的容器名称不能有重复。
vi /etc/yum.repos.d/CenOS-Base.repo
配置文件说明:
[base]:代表容器的名字。中括号一定要存在,里面的名称可以随意起,但不能有两个相同的容器名称,否则yum会不知道去哪里找容器相关软件列表文件。
name:只是说明一下这个容器的意义而已,重要性不高。
mirrorlist:列出这个容器可以使用的镜像站点,如果不想使用可以批注掉这一行。
baseurl:这个最重要,因为后面接的就是容器的实际网址。mirrorlist是由yum程序自行去找镜像站点,
baseurl则是指定固定的一个容器网址。
enable=1:启动这个容器,默认值也为1。关闭这个容器可以设置enable=0。
gpgcheck=1:指定是否需要查阅RPM文件内的数字证书。
gpgkey:数字证书的公钥文件所在位置,使用默认值即可。
注意:
语法:yum clean [packages|headers|all]
参数:
packages:将已下载的软件文件删除
headers:将下载的软件文件头删除
all:将所有容器数据都删除
例:删除已下载过的所有容器相关数据(含软件本身与列表): yum clean all
search:搜索某个软件名称或者是描述的重要关键字;
list:列出目前yum所管理的所有的软件名称与版本,有点类似于rpm -qa
info:同上,不过有点类似于rpm -qai
provides:从文件去搜索软件!类似于rpm -qf
使用案例:
1) 查询与ftp相关的软件有哪些: yum search ftp
2) 查询gcc这个软件的功能: yum info gcc
可以查询到该软件的版本号、描述信息、是否已安装等信息。
3) 列出yum服务器上所提供的所有软件名称: yum list
4) 列出目前服务器上可供本机进行升级的软件有哪些: yum list updates
5) 列出提供passwd这个文件的软件有哪些: yum provides passwd
6) 查找以pam开头的软件名称有哪些: yum list pam*
install:后面接要安装的软件(-y,当遇到需要等待用户输入时,这个选项会提供yes的响应)
update:后面接要升级的软件。不接软件名,则整个系统都升级。
remove : yum remove gcc
grouplist:列出所有可用的组列表
groupinfo:后面接group name,则可以了解该组内含的所有组名称
groupstall:安装一整级的软件
groupremove:删除某个组
使用案例:
1)查询目前容器与本机上面的可用与安装过的软件组有哪些: yum grouplist
2)查看一个软件组的信息: yum groupinfo GNOME
3)安装桌面环境GNOME: yum groupstall GNOME
更多yum的用法,可以查看man yum查看yum的帮助文档
虽然我们在使用dpkg时,已经解决掉了 软件安装过程中的大量问题,但是当依赖关系不满足时,仍然需要手动解决,而apt这个工具解决了这样的问题。
linux distribution 先将软件放置到对应的服务器中,然后分析软件的依赖关系,并且记录下来,
然后当客户端有安装软件需求时,通过清单列表与本地的dpkg以存在的软件数据相比较,就能从网络端获取所有需要的具有依赖属性的软件了。
Ubuntu采用集中式的软件仓库机制,将各式各样的软件包分门别类地存放在软件仓库中,进行有效地组织和管理。然后,将软件仓库置于许许多多的镜像服务器中,并保持基本一致。这样,所有的Ubuntu用户随时都能获得最新版本的安装软件包。因此,对于用户,这些镜像服务器就是他们的软件源(Reposity)
为了能够有选择地访问,在Ubuntu系统中,使用软件源配置文件/etc/apt/sources.list,由用户配置最合适访问的镜像站点地址。
1. apt-get的更新过程
1). 执行apt-get update
2). 程序分析/etc/apt/sources.list
3). 自动连网寻找list中对应的Packages/Sources/Release列表文件,如果有更新则下载之,存入/var/lib/apt/lists/目录
4). 然后 apt-get install 相应的包 ,下载并安装。
即使这样,软件源配置文件只是告知Ubuntu系统可以访问的镜像站点地址,但那些镜像站点具体都拥有什么软件资源并不清楚。
若每安装一个软件包,就在服务器上寻找一遍,效率是很低的。
因而,就有必要为这些软件资源列个清单(建立索引文件),以便本地主机查询。
刷新软件源,建立更新软件包列表: apt-get update
在Ubuntu Linux中,“apt-get update”命令会扫描每一个软件源服务器,并为该服务器所具有软件包资源建立索引文件,存放在本地的/var/lib/apt/lists/目录中。
使用apt-get执行安装、更新操作时,都将依据这些索引文件,向软件源服务器申请资源。
因此,在计算机设备空闲时,经常使用“apt-get update”命令刷新软件源,是一个好的习惯。
/var/lib/dpkg/available
文件的内容是软件包的描述信息, 该软件包括当前系统所使用的Debian 装源中的所有软件包,其中包括当前系统中已安装的和未安装的软件包.
/etc/apt/sources.list
记录软件源的地址(当你执行 sudo apt-get install xxx
时,Ubuntu 就去这些站点下载软件包到本地并执行安装)
/var/cache/apt/archives
已经下载到的软件包都放在这里(用 apt-get install
安装软件时,软件包的临时存放路径)
/var/lib/apt/lists
使用apt-get update命令会从/etc/apt/sources.list
中下载软件列表,并保存到该目录
/etc/apt/sources.list
![/etc/apt/sources.list]](https://img-blog.csdnimg.cn/20210224183325193.png)
/etc/apt/sources.list
文件里面都是一些网址信息,这每一条网址就是一个源,这个地址指向的数据标识着这台源服务器上有哪些软件可以安装使用。
国内一般使用各种云厂商和高校的源地址,如阿里的、网易,清华源、中科大源。
注意:不同的ubuntu的发行版本的源地址不一样,修改时注意选择
清华大学开源软件镜像站
阿里云镜像源
网易镜像源
通过解压Packages.gz后我们可以看到所有软件包的基本信息,并且Packages.gz 已经包含所有所依赖的软件及其版本信息、以及下载地址。
apt是命令行接口,跟APT(Advanced Packaging Tool) 工具apt-get 和 apt-cache 相比,apt 具有一些更适合交互式场景的选项,它更倾向于成为面向最终用户的工具(而不仅仅是系统管理员)。
换句话说,apt 比 apt-get 用起来更简单,用户体验更好。
用法:apt [选项] 命令
配置文件:早期 apt 默认的配置文件为 /etc/apt/apt.conf,但是当前的 Ubuntu 系统中默认没有这个文件。如果 /etc/apt/apt.conf 文件存在,apt 仍然会读取它。但现在的设计思路是把配置文件分隔后放置在 /etc/apt/apt.conf.d 目录下,这样更容易管理。
常用子命令:
命令 | 例子 | 描述 | 备注 |
---|---|---|---|
list | list packages based on package names | 类似dpkg-query --list,提供选项可安装(–installed), 可升级(–upgradeable),所有(–all-versions) versions. | |
search | apt search sudo | search in package descriptions | |
show | apt show sudo | show package details | |
install | apt install vim=2:8.0.1453-1ubuntu1 | install packages | 类似apt-get |
reinstall | reinstall packages | 类似apt-get | |
remove | remove packages | 类似apt-get | |
autoremove | Remove automatically all unused packages | 类似apt-get | |
update | 从配置的源下载包信息 | 类似apt-get | |
upgrade | upgrade the system by installing/upgrading packages | 类似apt-get | |
full-upgrade | 升级,如果需要将系统升级到新的版本,则会删除当前已安装的包。 | 类似apt-get | |
edit-sources | apt edit-sources | edit the source information file | 类似apt-get |
satisfy | apt satisfy “foo, bar (>= 1.0)” “Conflicts: baz, fuzz” | satisfy dependency strings | 类似apt-get |
apt-get 是一个下载安装软件包的简单命令行接口。最常用的命令是update(更新)和install(安装)。
用法: apt-get [选项] 命令
命令:以更新sudo包为例
命令 | 例子 | 说明 | 备注 |
---|---|---|---|
update | apt-get update | 从所有已配置的源/etc/apt/sources.list 同步软件包索引文件 |
只检查,不更新 |
upgrade | apt-get upgrade sudo | 更新已安装的包sudo包到最新版本 | 若已经最新则忽略 |
dist-upgrade | apt-get dist-upgrade | 升级系统 | 有一定风险!此时 apt 将首先升级重要的包,如果有冲突的话,可能会删除一些次要的包(详见 man apt_preferences) |
install | apt-get install pac1 sudo … | 安装或升级一个或多个软件 | 可指定版本号,pac可是用正则匹配 |
remove | apt-get remove pac1 sudo… | 删除软件,保留配置文件 | 用法类似install |
purge | apt-get purge pac1 sudo… | 删除软件和配置文件 | 用法类似remove |
source | apt-get source pac | 获取源码到当前目录 | |
check | apt-get check | 更新缓存,检查是否有损坏的依赖 | |
download | apt-get download pac | 下载二进制包到当前目录 | |
clean | apt-get clean | 清除检索到的软件包文件的本地存储库 | |
autoclean | apt-get autoclean | 类似clean,但仅删除不再下载且几乎无用的软件包文件 | 更安全 |
autoremove | apt-get autoremove | 删除只是为了满足依赖,而自动安装的软件包,并且不再需要了 | 更安全 |
简单来说 apt 命令就是 apt-get、apt-cache 和 apt-config 中最常用命令选项的集合。下面是几个常见命令的对照关系:
list:与 dpkg --list 相似
search:与 apt-cache search 相似
show:与 apt-cache show 相似
update:与 apt-get update 相同
install/remove:与 apt-get install/remove 相似,但是多了进度条提示
upgrade:与 apt-get upgrade --with-new-pkgs 相同
full-upgrade:与 apt-get dist-upgrade 相似
在我们使用的过程中,比较明显的区别是可以看到 apt 命令的进度条,个人感觉并不是太有用。
执行 apt update 命令,会提示可以升级的包的个数,而 apt-get update 命令则没有这样的提升
查询APT缓存
apt-cache对APT的程序包缓存执行各种操作。
apt-cache不会操纵系统状态,但会提供操作方式从程序包元数据中搜索并生成有趣的输出。
命令 | 例子 | 说明 |
---|---|---|
apt-cache | apt-cache depends packagename | 了解使用依赖 |
apt-cache | apt-cache rdepends packagename | 是查看该包被哪些包依赖 |
apt-cache/aptitude | apt-cache/aptitude search packagename | 搜索包 |
apt-cache/aptitude | apt-cache/aptitude show packagename | 获取包的相关信息,如说明、大小、版本等 |
apt-cache | apt-cache showpkg packagename | 显示软件包的大致信息 |
参考:
Linux软件安装管理之——源码安装详解
Linux软件安装管理之——dpkg与apt-*详解
Linux软件安装管理之——RPM与YUM详解
Ubuntu下安装软件的三种方式
Ubuntu : apt 命令