一、四种常见的软件交付形式同一个软件可能以四种形态到你手里交付形式谁负责依赖和升级常见位置仓库 DEB/RPM包管理器/usr 、/etc单独下载的 DEB/RPM包管理器结合当前仓库由软件包决定预编译程序或压缩包管理员/opt 、/usr/local源码构建管理员由编译参数决定责任划分很清晰前两种由包管理器负责依赖和升级出问题容易追溯后两种由管理员自己负责包括依赖、升级、卸载的全过程。二、什么时候才用预编译或源码仓库没有所需版本或功能时才考虑预编译程序或源码构建。也就是说优先级是仓库包优先。仓库里的版本经过验证依赖自动处理卸载干净。预编译程序和源码构建是补位手段不是首选。源码项目的常见流程是 configure 或 cmake然后 make最后 make install不同项目选择其中一种配置工具。课件以 Nginx 为例指定安装目录和运行身份生成编译规则文件 Makefile再编译并安装。三、二进制兼容编译好的程序不能随便搬家已经编译好的程序里写死了它期望的发行版、CPU 架构和运行库。课件总结了四个检查维度发行版与版本Ubuntu、Debian、Rocky 等系统库有差异。CPU 架构amd64、arm64、ppc64le、riscv64 等。运行库与 ABIC 库版本和 ABI 不匹配就无法运行。来源与签名确认文件来源可信。对应的检查命令命令作用cat /etc/os-release查看发行版uname -m查看 CPU 架构dpkg --print-architecture查看系统包架构file /opt/nginx/sbin/nginx显示二进制文件的 CPU 架构ldd /opt/nginx/sbin/nginx显示运行时需要的共享库dpkg -S /opt/nginx/sbin/nginx查询文件属于哪个包特别说明第三组的结果源码安装到 /opt/nginx 的文件dpkg -S 查不到记录因为它是源码安装不归 APT 管理。这也从侧面印证了包管理器只认自己安装的东西。把 Nginx 迁移到麒麟、openEuler 等系统时先查看发行版和 CPU 架构再确认依赖库是否满足要求。已经编译好的程序不能默认直接运行条件不明确时在目标系统重新编译更稳妥。四、软件源不只是地址镜像、缓存与离线4.1 镜像站常用 Ubuntu 镜像包括阿里云、清华大学、中国科学技术大学、南京大学和 Ubuntu 官方。要区分两种地址软件仓库供 APT 下载软件包和索引ISO 下载站提供系统安装镜像两种地址不能混用。4.2 两个缓存目录目录保存内容/var/lib/apt/lists仓库索引/var/cache/apt/archives下载的软件包4.3 离线下载Ubuntu 只下载软件包用 sudo apt install --download-only tree Rocky 安装 dnf-plugins-core 插件后用 dnf download --resolve --alldeps --destdir ./packages tree 下载包及依赖。课件强调离线准备要记录发行版本、CPU 架构、仓库快照时间和软件包校验值。只复制一个主软件包通常不能构成可重复的离线安装方案。这句话的意思是离线安装的难点从来不在主包而在主包背后的一串依赖。五、版本管理保持、比较与升级影响5.1 固定版本sudo apt-mark hold tree 可以锁定软件包不让它被升级apt-mark showhold 查看锁定了哪些apt-mark unhold 解除锁定。适合场景某个版本经过验证很稳定不想被例行升级打破。5.2 比较版本返回 0 表示当前版本不低于 1.7。这是脚本化判断版本是否达标的通用写法。5.3 升级前的影响检查apt changelog tree | head -n 30 查看更新日志systemctl --failed 查看失败的服务test -f /var/run/reboot-required cat /var/run/reboot-required 检查是否需要重启。升级前先看这三样避免升级带来的意外。六、授权边界sudo 不必给完整的 root课件 D.5 的核心思想sudo 可以把固定管理任务授权给指定用户不必提供完整的 root 权限。流程是管理用户 yangge 通过 sudoers 策略获得受限管理动作。策略要回答四个问题谁、在哪台主机、可切换为哪些身份、允许执行哪些命令。sudo -l 可以验证当前授权。课件示例创建了一条只允许执行 apt update 和 apt install tree 的规则验证后立即删除临时规则。配套的告诫很严肃不要为包管理器添加任意参数通配。软件包维护脚本会以 root 身份运行软件来源和允许安装的包名都属于授权边界。七、DNF另一套世界的对应物Rocky、RHEL、AlmaLinux 和 openEuler 常用 RPM/DNF。管理任务和 APT 一一对应管理任务Ubuntu / DebianRocky / RHEL更新仓库索引apt updatednf makecache搜索软件包apt search treednf search tree查看包信息apt show treednf info tree安装软件包apt install treednf install tree删除软件包apt remove treednf remove tree查询是否安装dpkg -l treerpm -q tree查询文件归属dpkg -S /usr/bin/treerpm -qf /usr/bin/treeDNF 还有三个特色能力软件包组dnf group install 一次准备一类工作环境安装前要查看组内软件和事务影响、事务历史dnf history 可以查询软件包操作记录dnf history undo ID 会重新计算依赖不等同于文件系统快照执行前还要确认仓库是否保留所需版本、补充查询dnf repolist、dnf list --showduplicates tree、dnf provides */tree。八、下篇小结交付形式有四种仓库包优先预编译和源码是补位手段。二进制兼容看四件事发行版、CPU 架构、运行库与 ABI、来源签名条件不明确就在目标系统重新编译。版本可以 hold 固定可以脚本化比较升级前要查日志、失败服务和重启要求。sudo 授权可以精确到具体命令包管理命令的来源和包名都是授权边界。DNF 与 APT 任务一一对应包组、事务历史是其特色