软件包管理:rpm / yum 与 dpkg / apt
一句话记忆:底层工具管「一个包」,上层工具管「仓库和依赖」——rpm 对应 dpkg,yum 对应 apt。 适用:装包、卸包、查包、自建源、源码编译安装。 环境:课程演示用 CentOS / Rocky(rpm + yum),实际生产以 UOS / Debian 系(deb + apt)为主,两套命令并列对照。
一、先把「包」和「工具」分清楚
1.1 三种软件形态
| 形态 | 例子 | 怎么用 | 特点 |
|---|---|---|---|
| 二进制包 | httpd-2.4.6.el7.x86_64.rpm、nginx_1.18.0_amd64.deb |
包管理器安装 | 最快最稳,依赖由工具处理 |
| 源码包 | nginx-1.24.0.tar.gz |
编译安装 | 能定制模块、指定版本,慢且要自己维护 |
| 绿色压缩包 | go1.21.linux-amd64.tar.gz |
解压即用 | 不写系统目录,删目录就等于卸载 |
1.2 两层工具,别混
| 层 | RHEL 系 | Debian 系 | 干什么 | 管依赖吗 |
|---|---|---|---|---|
| 底层 | rpm |
dpkg |
装 / 卸 / 查单个包文件 | 不管 |
| 上层 | yum(新版 dnf) |
apt(apt-get) |
从仓库找包、算依赖、记历史 | 管 |
记住这个对应关系,后面全是平移:
rpm ↔ dpkg
yum ↔ apt
.rpm ↔ .deb
底层工具不管依赖,是因为它只看手里这一个文件,不知道别的包在哪。 上层工具能管依赖,是因为它读了仓库的索引,知道「装 A 还需要 B、C」。
二、底层:rpm 与 dpkg
2.1 装与卸
RHEL 系:
rpm -ivh httpd-2.4.6.el7.x86_64.rpm # 安装(-i install, -v 详细, -h 进度条)
rpm -Uvh httpd-2.4.6.el7.x86_64.rpm # 升级安装:没装就装,装了旧版就升
rpm -e httpd # 卸载:用包名,不是文件名
rpm -e --nodeps httpd # 强卸,跳过依赖检查 —— 危险
Debian 系:
dpkg -i nginx_1.18.0_amd64.deb # 安装(缺依赖只会报错,不会自动装)
dpkg -r nginx # 卸载,保留配置文件
dpkg -P nginx # 彻底卸载,连配置文件一起删(purge)
dpkg -i --force-depends nginx.deb # 强装 —— 危险,优先用 apt -f install 修
| 动作 | rpm | dpkg |
|---|---|---|
| 安装 | rpm -ivh x.rpm |
dpkg -i x.deb |
| 升级安装 | rpm -Uvh x.rpm |
dpkg -i x.deb(同一条命令) |
| 卸载 | rpm -e pkg |
dpkg -r pkg |
| 彻底卸载 | rpm -e pkg |
dpkg -P pkg |
rpm 没有「配置和程序分离」的概念,卸了就全没了。 dpkg 有
-r/-P两档,这是 Debian 系比较细的地方。
2.2 查询(日常用得最多)
rpm -qa # 列出所有已安装的包
rpm -qa | grep httpd
rpm -qi httpd # 包详细信息(版本、安装时间、描述)
rpm -ql httpd # 这个包装了哪些文件
rpm -qc httpd # 只列配置文件
rpm -qd httpd # 只列文档
rpm -qf /usr/sbin/httpd # 这个文件属于哪个包
rpm -qR httpd # 这个包依赖谁
rpm -qp --scripts x.rpm # 看「还没安装」的包的信息和安装脚本
rpm -V httpd # 校验文件是否被改过(大小/权限/摘要)
dpkg -l # 列出已安装(首列状态码)
dpkg -l | grep nginx
dpkg -s nginx # 包状态与信息
dpkg -L nginx # 这个包装了哪些文件
dpkg -S /usr/sbin/nginx # 这个文件属于哪个包
dpkg -c x.deb # 「还没安装」的 deb 包里有哪些文件
dpkg -I x.deb # 「还没安装」的 deb 包的信息
dpkg --configure -a # 修复「装了一半」的包
| 目的 | rpm | dpkg |
|---|---|---|
| 列出已安装 | rpm -qa |
dpkg -l |
| 包信息 | rpm -qi pkg |
dpkg -s pkg |
| 包内文件 | rpm -ql pkg |
dpkg -L pkg |
| 文件属于谁 | rpm -qf /path |
dpkg -S /path |
| 看未安装的包 | rpm -qp… x.rpm |
dpkg -c / -I x.deb |
| 依赖 | rpm -qR pkg |
dpkg -s pkg 的 Depends 行 |
dpkg -l首列两个字母的含义:ii已安装、rc已卸载但配置残留、un未安装。 看到一堆rc就是卸过没清干净,用dpkg -P或apt purge收掉。
三、上层:yum 与 apt
上层工具解决底层不管的三件事:去哪找包、依赖谁来装、操作过什么能不能回滚。
3.1 元数据缓存(最容易搞错的地方)
yum 会把仓库的包索引缓存在本地,索引过期就会出现「明明有新版本却装到旧的」。
yum makecache # 只下载仓库元数据做缓存
yum clean all # 清空所有缓存(元数据 + 下载到本地的 rpm)
yum repolist # 看当前有哪些仓库、各有多少包
apt update # 拉取(更新)元数据索引 —— 注意:不是升级软件
apt upgrade # 这才是升级已安装的软件
apt clean # 清空 /var/cache/apt/archives 里的 deb 缓存
apt policy nginx # 看某个包有哪些版本、分别来自哪个源
apt update≈yum makecache,不是yum update。apt update只刷索引;真正升级是apt upgrade,对应yum update。 这个不对称是 Debian 系新手最常踩的坑。
3.2 安装、卸载、重装
# RHEL 系
yum install httpd -y
yum install 'httpd*' -y # 装一批,注意引号
yum reinstall httpd -y # 配置文件改坏了 → 重装恢复
yum remove httpd -y # 卸载
yum group list # 列出软件组
yum group install "Development Tools" -y
yum group remove "Development Tools" -y
# Debian 系
apt install nginx -y
apt install nginx=1.18.0-1 -y # 指定版本(先 apt policy 看有哪些)
apt reinstall nginx # 重装
apt remove nginx # 卸载,保留配置
apt purge nginx # 连配置一起删
apt autoremove # 清掉没人再用的依赖
tasksel # 软件组的近似物(文本界面)
| 动作 | yum | apt |
|---|---|---|
| 装 | yum install pkg |
apt install pkg |
| 指定版本 | yum install pkg-版本 |
apt install pkg=版本 |
| 重装 | yum reinstall pkg |
apt reinstall pkg |
| 卸载 | yum remove pkg |
apt remove pkg |
| 连配置删 | 无此概念 | apt purge pkg |
| 清无用依赖 | dnf autoremove(yum 无) |
apt autoremove |
| 软件组 | yum groupinstall |
tasksel / meta 包 |
apt 没有真正的「软件组」,等价物是 meta 包——比如
build-essential自己不含代码,只是依赖了一堆编译工具。
3.3 查找,以及「这个文件谁提供」
yum list installed | grep httpd
yum list available 'httpd*' # 仓库里有哪些可装
yum search keyword # 按名称/描述搜索
yum info httpd # 包详情
yum provides /usr/bin/htpasswd # 谁提供这个文件(查仓库)
yum provides '*/htpasswd' # 路径记不全时用通配
apt list --installed | grep nginx
apt list 'nginx*'
apt search keyword
apt show nginx
apt-file search /usr/bin/htpasswd # 需先 apt install apt-file && apt-file update
apt-cache depends nginx # 依赖树
apt-cache rdepends nginx # 谁依赖我(反向依赖)
rpm -qf和yum provides看着都是「查文件属于谁」,角度不同:rpm -qf只查已安装的包,且文件必须真实存在;yum provides查仓库元数据,包还没装也能答出「装谁就有这个文件」。
3.4 历史与回滚
yum history # 列出执行过的 yum 操作,带 ID
yum history info 3 # 第 3 条具体干了什么
yum history undo 3 # 撤销第 3 条:把那一次装的卸掉
yum history redo 3 # 重做
Debian 系没有「一键 undo」,只能靠日志自己还原:
cat /var/log/apt/history.log # 谁在什么时间装了什么
zcat /var/log/apt/history.log.*.gz # 更早的记录
apt-mark showmanual # 手动装的包(与自动依赖区分开)
yum history undo是 yum 相对 apt 的明显优势,适合「装完发现不对、一键退回」。
3.5 装本地包 / 装 URL 上的包
# RHEL 系
yum localinstall samba-4.10.16-5.el7.x86_64.rpm # 老写法
yum install ./samba-4.10.16-5.el7.x86_64.rpm # dnf 时代推荐
yum install https://mirrors.aliyun.com/centos/7.9.2009/os/x86_64/Packages/samba-4.10.16-5.el7.x86_64.rpm
# Debian 系
apt install ./samba_4.10.16_amd64.deb # 前面的 ./ 不能省
wget https://example.com/xxx.deb && apt install ./xxx.deb
apt install ./x.deb里的./不是装饰:不带路径,apt 会去仓库找同名的包。 另外dpkg -i不会装依赖,apt install ./x.deb会 —— 优先用 apt。
四、自建 yum 源(课程实验,CentOS)
适用场景:内网机器上不了外网,或者要锁定某些包的版本,就把 rpm 收集到一台机器上做成仓库。
4.1 准备 rpm 包
四个来源:
- 系统镜像里的
Packages/目录 - 网上的 yum 源
- 用 yum 只下载不安装
- 打开缓存,把装过的包留下来
# 方式 3:只下载不安装
mkdir -p /my_rpms
yum install --downloadonly --downloaddir=/my_rpms httpd -y
# CentOS 7 需要先装插件,否则该参数被忽略:
# yum install yum-plugin-downloadonly -y
# CentOS 8+ / dnf 写法:
# dnf download --destdir=/my_rpms httpd
# 方式 4:保留安装缓存
vi /etc/yum.conf
# 在 [main] 段增加一行:
# keepcache=1
4.2 生成 repodata(关键一步)
yum install createrepo -y
createrepo /my_rpms
createrepo 会在 /my_rpms 下生成 repodata/ 目录,里面是依赖关系索引。
没有它,这个目录对 yum 来说只是一堆文件,不是仓库。
后续往目录里加了新包,要重新执行
createrepo --update /my_rpms。
4.3 把目录共享出去
systemctl stop firewalld # 实验环境图省事,生产别这么干
setenforce 0
yum install vsftpd -y
systemctl start vsftpd
ln -s /my_rpms /var/ftp/my_rpms # /var/ftp 是 vsftpd 的默认根目录
用 cp 或 mv 把目录放进 /var/ftp 也可以,效果一样。
4.4 客户端写 repo 文件
本机目录直接当源:
cat > /etc/yum.repos.d/local.repo <<'EOF'
[local]
name=local repo
baseurl=file:///my_rpms
enabled=1
gpgcheck=0
EOF
走 FTP:
cat > /etc/yum.repos.d/ftp.repo <<'EOF'
[local]
name=ftp repo
baseurl=ftp://服务端IP/my_rpms
enabled=1
gpgcheck=0
EOF
五个字段的含义:
| 字段 | 作用 |
|---|---|
[local] |
仓库 ID,全局唯一,不能和别的 repo 重名 |
name |
给人看的仓库名 |
baseurl |
仓库地址:file:// 本地、ftp://、http:// |
enabled |
1 启用,0 禁用 |
gpgcheck |
1 校验包签名,0 不校验(实验用 0,生产应当用 1) |
yum clean all && yum makecache
yum repolist # 能看到 local 就说明配好了
yum install httpd -y
file:///my_rpms三个斜杠:file://是协议头,/my_rpms是绝对路径。 Debian 系做本地源是另一套(dpkg-scanpackages生成Packages.gz+ 写sources.list),本篇不展开。
五、源码编译安装(以 nginx 1.24.0 为例)
什么时候用源码:要更新的版本、要开特定模块、要指定安装路径。
5.1 装编译环境
yum install gcc gcc-c++ autoconf automake make -y
yum install zlib zlib-devel openssl openssl-devel pcre pcre-devel -y
-devel结尾的包是头文件,只在编译时需要;运行程序不需要它们。
5.2 标准三步
cd /usr/local/src
wget https://nginx.org/download/nginx-1.24.0.tar.gz
tar xf nginx-1.24.0.tar.gz
cd nginx-1.24.0
# 1) 配置:检查环境、生成 Makefile、定制模块与安装路径
./configure --prefix=/usr/local/nginx_1.24.0 \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-stream \
--with-http_gzip_static_module \
--with-http_sub_module
# 2) 编译:把源码变成二进制
make -j4
# 3) 安装:把产物复制到 --prefix 指定的目录
make install
ln -s /usr/local/nginx_1.24.0 /usr/local/nginx # 建软链,方便切版本
/usr/local/nginx/sbin/nginx -V # 确认编译参数生效
5.3 这三步各自在干什么
./configure:把「装到哪、开哪些模块」写进 Makefile。这一步报错最常见,基本都是缺-devel包。make -j4:4 个并发任务同时编译,核多就写-j$(nproc)。make install:本质就是复制文件。所以包管理器不认识它,卸载要么make uninstall(不是每个包都提供),要么直接删--prefix目录。- 软链的价值:将来装
nginx_1.26.0,把软链指过去就行,配置路径和脚本都不用改。
六、命令怎么串起来
make -j4 ; make install # 分号:左边不管成功失败,右边都执行
make -j4 && make install # 与:左边成功(退出码 0)才执行右边
make -j4 || echo 编译失败 # 或:左边失败才执行右边
编译场景必须用 &&:make 失败后接着 make install,装进去的是半成品,而且报错会被后面的输出冲掉,很难查。
其他常见写法:
cmd1 && cmd2 && cmd3 # 链条式,任一步失败就停
set -e # 脚本里更彻底:任何命令出错立刻退出
cd /tmp && rm -rf build # 前面失败就不删,避免误删
速查表
| 任务 | RHEL 系(rpm / yum / dnf) | Debian 系(dpkg / apt) |
|---|---|---|
| 刷新元数据 | yum makecache |
apt update |
| 清缓存 | yum clean all |
apt clean / apt autoclean |
| 升级软件 | yum update |
apt upgrade |
| 装包 | yum install pkg -y |
apt install pkg -y |
| 装指定版本 | yum install pkg-1.2.3 |
apt install pkg=1.2.3 |
| 装本地包(带依赖) | yum install ./x.rpm |
apt install ./x.deb |
| 装本地包(不带依赖) | rpm -ivh x.rpm |
dpkg -i x.deb |
| 修复依赖 | yum install --skip-broken / 手动 |
apt -f install |
| 重装 | yum reinstall pkg |
apt reinstall pkg |
| 卸载 | yum remove pkg |
apt remove pkg |
| 连配置一起删 | 无此概念 | apt purge pkg |
| 清无用依赖 | dnf autoremove |
apt autoremove |
| 已安装列表 | rpm -qa / yum list installed |
dpkg -l / apt list --installed |
| 包信息 | rpm -qi pkg |
dpkg -s pkg / apt show pkg |
| 包内文件 | rpm -ql pkg |
dpkg -L pkg |
| 文件属于谁 | rpm -qf /path |
dpkg -S /path |
| 谁提供某文件 | yum provides /path |
apt-file search /path |
| 搜包 | yum search kw |
apt search kw |
| 依赖 | rpm -qR pkg |
apt-cache depends pkg |
| 谁依赖我 | 无直接命令 | apt-cache rdepends pkg |
| 历史 | yum history |
/var/log/apt/history.log |
| 回滚 | yum history undo N |
无,手动反向操作 |
| 只下载不装 | yum install --downloadonly |
apt download pkg / apt install -d |
| 软件组 | yum groupinstall "x" |
tasksel / meta 包 |
常见坑
apt install之前不apt update—— 会「找不到包」或装到很旧的版本,这是 Debian 系第一高频的坑。- 把
apt update当成升级 —— 它只刷索引,升级是apt upgrade。 dpkg -i报依赖错误就用--force—— 正确做法是apt -f install,让 apt 把缺的依赖补上。rpm -e --nodeps强卸 —— 绕过依赖检查,容易把别的软件一起弄坏。非不得已别用。yum remove会连带删依赖 —— 它会把「因此变得没人用」的依赖一起删掉,而那个依赖可能别的服务还要。执行前先看清它列出的清单。--downloadonly在 CentOS 7 要装插件(yum-plugin-downloadonly),否则这个参数被直接忽略,还会提示「已安装」。- 忘了
createrepo—— 目录里有 rpm 但没有repodata/,客户端报「Cannot find a valid baseurl」。 - 加了新包却没
createrepo --update—— 客户端makecache后照样看不到新包。 gpgcheck=0图省事 —— 关掉签名校验等于不验证包来源。生产应导入公钥:rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-*。- 源码装的软件包管理器不认识 ——
rpm -qa/dpkg -l里查不到,卸载只能删目录,升级要重新编译。 - 源码装完重启就没了 —— 没有 systemd unit,得自己写
/etc/systemd/system/nginx.service再systemctl enable。 ./configure报错九成是缺-devel包 —— 报错信息里会写明缺哪个库,装对应的xxx-devel即可。make -j4; make install—— 编译失败也照样安装,装出半成品。必须用&&。dpkg -l里一堆rc状态 —— 是卸过但没清配置的包,既占空间又占「已安装」名额,apt purge收掉。
动手实验(课程作业,CentOS 9)
这部分是课堂实验,只走 rpm / yum 路线,不做 Debian 对照。
1. 把本地镜像当源,装完再用 history 撤销
mount /dev/sr0 /mnt
# 写 local.repo,baseurl=file:///mnt
yum clean all && yum makecache
yum install httpd -y
yum history # 找到刚才那次操作的 ID
yum history undo <ID> # 撤销安装
2. 官网 repo 装 nginx,再做成内网源
- 从 nginx 官网取
nginx.repo放进/etc/yum.repos.d/,yum install nginx -y - 把缓存的包收集到
/my_rpms,执行createrepo /my_rpms - 克隆一台机器当客户端,写 repo 指向这个源,能装上即算通过
3. 源码装 nginx 1.24.0,与 yum 版共存
- 源码装好并启动
kill掉源码版进程,再yum install nginx启动- 网站根目录放一张图片,手机连同一个 WiFi 访问
访问不通按这个顺序排查:防火墙 → SELinux → 网络连通 → 服务是否真在监听(ss -lntp)。
练习(18 题)
rpm -ivh 和 rpm -Uvh 有什么区别?
查看答案
-i 是 install:只要已经装过(不管版本新旧),直接报错 package is already installed。
-U 是 upgrade:没装就装,装了旧版就升级,只有已装更新版本时才报错。
装新包习惯写
-ivh,升级场景才用-Uvh。用-i强行装已装过的包,得加--replacepkgs才行。
查「httpd 这个包装了哪些文件」,RHEL 系和 Debian 系分别怎么写?
查看答案
RHEL 系:rpm -ql httpd
Debian 系:dpkg -L nginx
-q= query,l= list。rpm 还能细分:-qc只列配置文件,-qd只列文档。Debian 系没有这个细分,得自己grep '\.conf$'。
查 /usr/sbin/nginx 这个文件属于哪个包,两套系统各一条命令。
查看答案
RHEL 系:rpm -qf /usr/sbin/nginx
Debian 系:dpkg -S /usr/sbin/nginx
前提是这个文件必须真实存在且属于某个已安装的包。查不到会返回「not owned by any package」——源码装的文件就属于这种情况。
想知道「哪个包能提供 /usr/bin/htpasswd,但我还没装它」,该用哪条命令?为什么 rpm -qf 做不到?
查看答案
用 yum provides /usr/bin/htpasswd(路径记不全时可以 yum provides '*/htpasswd'),Debian 系用 apt-file search。
rpm -qf查的是已安装包的数据库,包都没装,数据库里自然没有这条记录。yum provides读的是仓库元数据,里面记录了每个包会安装哪些文件,所以能提前回答「装谁就有它」。
yum 和 apt 刷新元数据的命令分别是什么?apt update 会不会升级软件?
查看答案
刷新元数据:yum makecache / apt update。
apt update 不会升级软件,它只更新本地那份「仓库里有哪些包、什么版本」的索引。
真正的升级是
apt upgrade。这组对应关系是apt update ≈ yum makecache、apt upgrade ≈ yum update,口诀里的「update」在两边含义不同。
在 UOS 上装当前目录里已下载的 nginx_1.18.0_amd64.deb,要求自动解决依赖,写命令。
查看答案
apt install ./nginx_1.18.0_amd64.deb
./不能省。不带路径时 apt 会把这个字符串当成包名去仓库里找。apt install ./x.deb会连带安装依赖;dpkg -i不会,装完还得apt -f install补。
apt remove 和 apt purge 的区别是什么?dpkg -r 和 dpkg -P 呢?
查看答案
apt remove 只删程序文件,保留 /etc 下的配置;apt purge 连配置一起删。
dpkg -r 对应 remove,dpkg -P 对应 purge。
想彻底重来(比如配置文件改乱了不想留痕)用 purge。反过来,升级前想保留配置就用 remove。
dpkg -i 装完提示「依赖未满足」,该怎么修?
查看答案
apt -f install # 等价写法 apt install -f
它会读依赖关系,把缺的包补上,并把「装了一半」的包配置好。 万不得已再用
dpkg -i --force-depends,那是把错误掩盖掉而不是解决。
只想把 httpd 的 rpm 包下载到 /my_rpms 而不安装,写命令;Debian 系的对应写法是什么?
查看答案
yum install --downloadonly --downloaddir=/my_rpms httpd -y
CentOS 8+ / dnf:dnf download --destdir=/my_rpms httpd。
Debian 系:apt download httpd(下载到当前目录),或 apt install -d httpd(只下载不安装,放在 /var/cache/apt/archives)。
CentOS 7 上如果没装
yum-plugin-downloadonly,这个参数会被静默忽略。
装完一个包发现搞错了,想一键退回安装前的状态,RHEL 系怎么操作?Debian 系能做到吗?
查看答案
yum history # 找到那次的 ID
yum history undo <ID> # 撤销
Debian 系没有等价命令,只能查 /var/log/apt/history.log 看装了什么,再手动 apt purge 逐个反向操作。
这也是 yum 比 apt 好用的一点。所以 Debian 系装包前最好想清楚,或者先
apt-mark showmanual记下当前状态。
自建 yum 源的三个关键步骤是什么?createrepo 到底生成了什么?
查看答案
三步:准备 rpm 包 → 生成索引(createrepo)→ 把目录共享出去(ftp / http / file)。
createrepo /my_rpms 生成的是 repodata/ 目录,里面有 repomd.xml、primary.xml.gz 等索引文件,记录了「有哪些包、每个包依赖什么、会装哪些文件」。
没有
repodata,yum 只看到一个普通目录。加了新包必须createrepo --update,否则索引还是旧的。
写一个 repo 文件指向本机 /my_rpms 目录,并禁用 GPG 校验,然后逐行说明各字段的作用。
查看答案
cat > /etc/yum.repos.d/local.repo <<'EOF'
[local]
name=local repo
baseurl=file:///my_rpms
enabled=1
gpgcheck=0
EOF
[local]:仓库 ID,全局唯一name:显示给人看的名字baseurl:仓库地址,file://是本地目录,也可以写ftp://、http://enabled=1:启用这个仓库,写 0 就禁用gpgcheck=0:不校验包签名(实验方便,生产应设 1 并导入公钥)
file:///my_rpms是三段:协议file://+ 绝对路径/my_rpms。
源码安装软件的标准三步是什么?make -j4 里的 4 表示什么?
查看答案
三步:./configure(配置,生成 Makefile)→ make(编译)→ make install(安装)。
-j4 表示同时跑 4 个编译任务。核多的机器写 -j$(nproc),能明显缩短时间。
源码安装的 nginx,能用 yum remove nginx 卸掉吗?为什么?那应该怎么卸?
查看答案
不能。源码安装在 /usr/local/nginx_1.24.0 下,没有写进 rpm 数据库,rpm -qa 里根本查不到它。
卸载方式:make uninstall(如果源码包提供了这个目标),或者直接 rm -rf /usr/local/nginx_1.24.0 再删掉软链。
这也说明源码安装的软件不受包管理器管理:升级要重新编译,依赖要自己保证。
make -j4; make install 和 make -j4 && make install 有什么区别?编译场景为什么必须用后者?
查看答案
; 不管左边成功与否都执行右边;&& 只有左边退出码为 0 才执行右边。
编译必须用 &&:make 失败后接着 make install,会把不完整的产物复制进安装目录,而且 make 的报错会被 make install 的输出冲掉,事后很难定位。
查一个包的依赖,rpm 和 dpkg 分别用什么命令?Debian 系想看「谁依赖我」用什么?
查看答案
RHEL 系:rpm -qR pkg
Debian 系:apt-cache depends pkg(也可以用 dpkg -s pkg 看 Depends 那一行)
「谁依赖我」:apt-cache rdepends pkg。rpm 没有直接对应的命令,只能靠 rpm -e --test 试算来发现谁会被牵连。
yum install httpd* 有什么隐患?怎么写才安全?
查看答案
隐患是 shell 会先展开通配符。如果当前目录里正好有 httpd-2.4.6.el7.x86_64.rpm 这类文件,httpd* 会先被展开成文件名,yum 收到的是本地文件路径,行为就从「从仓库装」变成「装本地包」,甚至报错。
正确写法是加引号:yum install 'httpd*' -y,让通配符交给 yum 自己处理。
apt update、apt upgrade、apt autoremove 各做什么?什么情况下必须用 apt autoremove?
查看答案
apt update:刷新本地元数据索引(不装、不升任何软件)apt upgrade:按索引把已安装的软件升级到最新apt autoremove:删掉「当初作为依赖自动装进来、现在没人再用」的包
必须用 autoremove 的场景:卸载了某个软件之后。比如 apt purge nginx 卸掉了主程序,但它依赖的 libnginx-mod-* 之类还留着,既占空间,也在 apt list 里留一堆无主条目。
反向操作是
apt-mark manual pkg:把某个自动安装的包标记成「我手动装的」,免得被 autoremove 清掉。