安装与查询本地软件包
在内网生产环境中,服务器往往不能直接连公网,我们需要安装事先下载好的 .deb 本地包。实验机的 /opt/packages/ 目录下已经放好了 tree 的安装包:
crow@opsbox:~$ ls /opt/packages
crow@opsbox:~$ dpkg-deb -f /opt/packages/tree_*.deb Package Depends
Package: tree
Depends: libc6 (>= 2.34)
dpkg-deb -f 用来读取 .deb 包里的控制信息(control)。这里提取了 Package 和 Depends 两个字段,可以看到它依赖版本不低于 2.34 的系统基础库 libc6。
安装本地 .deb 包时,推荐直接用 apt install 并写明本地文件路径(必须以 / 或 ./ 开头,好让 APT 识别出这是本地文件而不是远程包名)。APT 会自动检查依赖关系,并调用 dpkg 完成解包与配置:
crow@opsbox:~$ sudo apt install /opt/packages/tree_*.deb
crow@opsbox:~$ command -v tree
/usr/bin/tree
crow@opsbox:~$ tree -L 1 /srv/bulletin
/srv/bulletin
├── hours.txt
├── location.txt
└── weekend.txt
1 directory, 3 files
安装完成后,运行 tree -L 1 /srv/bulletin 展开一级目录,就能看到公告目录下的三个文本文件。
如果想查清“某个软件包往系统里装了哪些文件”或者“磁盘上某个命令是哪个软件包安装的”,可以用 dpkg 查询:
crow@opsbox:~$ dpkg -L tree
crow@opsbox:~$ dpkg -S /usr/bin/tree
tree: /usr/bin/tree
dpkg -L tree:列出已安装的 tree 软件包写入系统的所有文件和目录路径;
dpkg -S /usr/bin/tree:反查某个文件归属于哪个已安装的软件包。如果系统目录下的某个二进制文件查不到归属包,就要留心是不是有人手动放进去的。
现在试试卸载 tree:
crow@opsbox:~$ sudo apt remove tree
crow@opsbox:~$ command -v tree
卸载后 command -v tree 没有输出,说明命令已经移除。需要注意两点:
apt remove 只会删掉软件包自身的程序文件,不会碰 /srv/bulletin/ 里的业务数据或用户家目录。
- 对于带有
/etc/ 系统配置文件的服务软件,apt remove 默认只删程序、保留配置文件,方便日后重装时复用;如果想连系统级配置文件一起清掉,改用 sudo apt purge tree。
联网环境下的 APT 命令
如果服务器能连外部镜像源或内网私有源,日常安装和更新软件的命令如下(当前实验机为离线环境,了解各条命令的作用即可):
user@local:~$ sudo apt update
user@local:~$ apt search tree
user@local:~$ apt show tree
user@local:~$ sudo apt install tree
sudo apt update:从软件源下载最新的软件包索引清单(保存在 /var/lib/apt/lists/)。它只刷新“目录清单”,不会升级已安装的软件;
apt search / apt show:在本地索引中搜索关键字、查看版本与依赖项(不需要 sudo);
sudo apt install:从软件源下载目标包及依赖包,校验签名和哈希后完成安装;
sudo apt upgrade:根据更新后的索引,把已安装的软件包升级到新版本。
软件源地址配置在 /etc/apt/sources.list 和 /etc/apt/sources.list.d/ 目录下。