安装与管理软件包

接下来我们要接手管理图书馆公告服务器。不过这台实验机是精简安装的系统,连查看目录树的 tree 命令都没有。

在 Linux 里,软件通常以软件包(Package)的形式集中分发。软件包里不仅包含编译好的二进制程序和配置文件模板,还记录了版本号、安装路径清单、依赖哪些动态库(如 libc6),以及安装前后要执行的初始化脚本。

Debian、Ubuntu 和 Kali Linux 采用 dpkg(底层包操作工具)与 APT(高级包管理器)管理软件包。我们先用离线安装包给实验机装上 tree。

启动实验环境

先从下方的任务卡打开本模块的第二个实验终端。这台实验机模拟了图书馆公告服务器:已发布的通知文件放在 /srv/bulletin/,服务配置文件放在 /etc/bulletin/server.env。后面几个章节都会在这台机器上操作。

配置并检查文件服务

Lab

打开 OPSBOX 终端 OPSBOX 终端(启动 Lab 后显示)。从本章开始,依次完成软件包安装、账号目录配置、手动启动服务、systemd 服务管理、日志配置和连接检查。 最终让 bulletin.service 在本机 8080 端口提供 /srv/bulletin 中的文件,读取 weekend.txt,并提交其中的周末开放时段,格式为 HH:MM-HH:MM。 SSH 与文件传输也使用本题实例,完成后再提交。本题不依赖上一个 Lab 的文件。

加载会话状态…

提交 coin

题解 Hint

安装与查询本地软件包

在内网生产环境中,服务器往往不能直接连公网,我们需要安装事先下载好的 .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 没有输出,说明命令已经移除。需要注意两点:

  1. apt remove 只会删掉软件包自身的程序文件,不会碰 /srv/bulletin/ 里的业务数据或用户家目录。
  2. 对于带有 /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
  1. sudo apt update:从软件源下载最新的软件包索引清单(保存在 /var/lib/apt/lists/)。它只刷新“目录清单”,不会升级已安装的软件;
  2. apt search / apt show:在本地索引中搜索关键字、查看版本与依赖项(不需要 sudo);
  3. sudo apt install:从软件源下载目标包及依赖包,校验签名和哈希后完成安装;
  4. sudo apt upgrade:根据更新后的索引,把已安装的软件包升级到新版本。

软件源地址配置在 /etc/apt/sources.list 和 /etc/apt/sources.list.d/ 目录下。