UNIX/Linux系统管理技术手册-读书笔记-第六章
《UNIX/Linux系统管理技术手册-读书笔记-第六章
软件的安装与管理
1. 操作系统安装(自动化部署)
1.1 交互式安装 vs 网络自动化安装
| 方式 | 适用场景 | 说明 |
|---|---|---|
| 交互式安装(光盘/USB) | 单机或少量的物理机 | GUI引导,直观但重复性高、易出错 |
| 网络安装(PXE + DHCP + TFTP + HTTP/NFS) | 10台以上或需要标准化部署的站点 | 无需物理介质,从网络引导并获取安装文件 |
| PXE(预引导执行环境) | 标准化大规模部署 | Intel标准,BIOS/UEFI通过网卡从网络引导,下载引导文件并执行安装 |
PXE工作流程:
- 主机广播PXE发现请求
- DHCP服务器返回引导服务器IP + 引导文件名
- 客户端通过TFTP下载引导文件(如PXELINUX)
- 引导文件提供菜单,指向操作系统安装镜像(HTTP/FTP/NFS)
- 配合无人值守安装工具(kickstart/preseed)实现全自动
💡 常用PXE引导器:PXELINUX(SYSLINUX系列)、iPXE(支持无线网络)。DHCP可用ISC DHCP或轻量级Dnsmasq。
1.2 Kickstart(Red Hat / CentOS 自动化安装)
| 概念 | 说明 | 能做什么 |
|---|---|---|
| Kickstart | Red Hat Anaconda安装程序的脚本化接口 | 无人值守安装RHEL/CentOS/Fedora |
| ks.cfg | 配置文件,分3个区块:命令区、软件包区、预/后安装脚本区 | 定义语言、键盘、分区、root密码、要装的软件包、安装前后执行的命令 |
| system-config-kickstart | GUI工具(可选) | 用鼠标生成ks.cfg,降低上手门槛 |
| pykickstart | Python库 | 编程生成/读写kickstart配置 |
ks.cfg关键配置示例:
|
|
部署方式:
- 引导时在
boot:提示符输入linux inst.ks=http://server/path/ks.cfg - 或配合PXE自动获取(DHCP的
next-server+filename选项)
1.3 Preseed(Debian / Ubuntu 自动化安装)
| 概念 | 说明 | 能做什么 |
|---|---|---|
| Preseed | Debian Installer的预配置方法 | 无人值守安装Debian/Ubuntu |
| preseed.cfg | 回答安装程序所有问题的配置文件 | 定义键盘、网络、分区、用户、软件选择等 |
| debconf-get-selections | 从已安装系统导出配置 | 先交互装一台,导出作为模板 |
preseed关键配置示例:
|
|
部署方式:内核参数传递preseed/url=http://host/path/to/preseed.cfg。
Ubuntu也兼容kickstart,但功能不完整(缺LVM/防火墙等),建议优先用preseed。
1.4 Cobbler(开源网络引导/预配置服务器)
| 概念 | 说明 | 能做什么 |
|---|---|---|
| Cobbler | 整合DHCP/DNS/TFTP/镜像管理的网络引导工具 | 统一管理PXE、kickstart、preseed,支持物理机和虚拟机部署 |
| Snippet(脚本片段) | 可复用的shell命令片段 | 在多个kickstart/preseed模板中共享配置(如添加SSH公钥) |
| 模板 | 支持条件化定制 | 不同数据中心/角色生成不同的分区、软件包、时区配置 |
安装:主流Linux发行版标准仓库中均有Cobbler包,GitHub有源码和文档。
1.5 FreeBSD 自动化安装
| 概念 | 说明 |
|---|---|
| bsdinstall | FreeBSD标准文本安装程序,自动化能力较初级 |
| 定制ISO | 解包ISO → 修改/etc/installerconfig → 重新打包ISO(mkisofs) |
| installerconfig | 包含两部分:先期设置 + 安装后执行的shell脚本 |
| mfsBSD | 轻量级PXE镜像(~47MiB),适用于网络引导 |
📖 最佳参考:
man bsdinstall
2. Linux 软件包管理(底层工具)
2.1 RPM(Red Hat / CentOS)
| 命令 | 功能 | 示例 |
|---|---|---|
rpm -i package.rpm |
安装 | 不处理依赖(可能失败) |
rpm -U package.rpm |
升级(若未装则安装) | 推荐替代-i |
rpm -e package |
删除 | |
rpm -qa |
列出所有已装包 | rpm -qa | grep httpd |
rpm -q --whatrequires package |
查询依赖此包的包 | |
rpm -qf /path/to/file |
查询文件属于哪个包 | |
rpm -V package |
验证包文件完整性 | 检查被修改的文件 |
依赖地狱:rpm不自动解决依赖,安装时可能报错。需手动找齐所有依赖包,或使用高层工具(yum/DNF)。
包版本号 ≠ 软件版本号(维护者可能backport补丁并修改次版本号)。查看实际版本应以二进制程序自身报告为准。
2.2 dpkg(Debian / Ubuntu)
| 命令 | 功能 | 示例 |
|---|---|---|
dpkg --install package.deb |
安装 | |
dpkg --remove package |
删除(保留配置文件) | |
dpkg --purge package |
完全删除(含配置文件) | |
dpkg -l [pattern] |
列出已装包 | dpkg -l | grep nginx |
dpkg -S /path/to/file |
查询文件属于哪个包 |
状态码:ii = 已安装,rc = 已删除但配置残留,pn = 未安装。
3. Linux 高层软件包管理系统
3.1 软件仓库核心概念
| 概念 | 说明 |
|---|---|
| 发布(Release) | 全部软件包的快照,自洽的基线(如Ubuntu Xenial、RHEL 7) |
| 组件(Component) | 发布中的子集(如main/universe/multiverse/restricted) |
| 体系(Architecture) | 硬件类型(x86_64、arm64等) |
| 仓库 | 服务器上按发布/组件/体系组织的软件包集合 |
3.2 APT(Debian/Ubuntu核心工具)
核心命令:
| 命令 | 功能 |
|---|---|
apt update |
刷新软件包索引(必须定期执行) |
apt install package |
安装(自动解决依赖) |
apt upgrade |
升级所有包(不删除旧包) |
apt full-upgrade |
升级并智能处理依赖(可能删除包) |
apt remove / purge |
删除/彻底删除 |
apt autoremove |
删除不再需要的依赖包 |
apt search keyword |
搜索软件包 |
apt show package |
查看包详细信息 |
apt list --upgradable |
列出可升级的包 |
apt是全功能包装命令(替代apt-get+apt-cache)。老文档中apt-get install依然有效。
配置文件:/etc/apt/sources.list(核心)
deb http://archive.ubuntu.com/ubuntu xenial main restricted
deb http://archive.ubuntu.com/ubuntu xenial-updates main restricted
deb http://archive.ubuntu.com/ubuntu xenial universe
deb http://security.ubuntu.com/ubuntu xenial-security main restricted
字段含义:deb(二进制包)或deb-src(源码包) → URL → 发行版代号(xenial) → 组件列表(main/universe/multiverse/restricted)。
本地镜像:使用apt-mirror软件包可创建本地仓库镜像,避免多台主机重复下载,适用于大规模环境。
3.3 YUM / DNF(Red Hat / CentOS)
| 命令(yum) | 功能 | 注意 |
|---|---|---|
yum install package |
安装 | 支持通配符yum install 'lib*'(需引号) |
yum update |
升级所有包 | ⚠️ 不同于apt update(仅刷新索引) |
yum upgrade |
升级(可能删除旧包) | 与update略有差异 |
yum remove package |
删除 | |
yum search keyword |
搜索 | |
yum list installed |
列出已装包 | |
yum makecache |
重建本地缓存 | |
yum -C |
使用缓存(不联网验证) | 性能改善有限 |
配置文件:/etc/yum.conf + /etc/yum.repos.d/*.repo
DNF:Yum的下一代,Fedora默认,未来将完全取代Yum。提供更好的依赖解析和API。
4. FreeBSD 软件管理
4.1 三类软件来源
| 类别 | 说明 | 管理方式 |
|---|---|---|
| 基准系统(Base System) | 核心操作系统(内核+基本命令) | freebsd-update(仅RELEASE分支) |
| 二进制软件包(pkg) | 预编译的附加软件(推荐优先使用) | pkg命令 |
| Ports Collection | 从源代码构建(可定制编译选项) | make + portmaster(仅在无二进制包或需定制时使用) |
4.2 pkg 命令速查
| 命令 | 功能 |
|---|---|
pkg install -y package |
安装(-y跳过确认) |
pkg delete package |
卸载 |
pkg update |
更新本地编目 |
pkg upgrade |
升级所有包 |
pkg info |
列出已装包 |
pkg info package |
查看包详情 |
pkg search -i keyword |
搜索(区分大小写,支持正则) |
pkg which /path/file |
查询文件属于哪个包 |
pkg audit -F |
检查已知安全漏洞 |
pkg autoremove |
删除未使用的依赖 |
pkg backup |
备份本地数据库(/var/db/pkg/local.sqlite) |
版本比较:pkg version -vIL= 列出所有非当前版本的包(<表示有更新可用)。
4.3 Ports Collection
| 操作 | 命令 |
|---|---|
| 初始化ports树 | portsnap fetch extract |
| 更新ports树 | portsnap fetch update |
| 构建安装 | cd /usr/ports/category/package && make install clean |
| 卸载 | 同目录下 make deinstall |
| 批量管理 | 安装portmaster:portmaster -L查看更新,portmaster -a全部升级 |
ports构建耗时且占空间,优先用
pkg。仅当二进制包不存在或需要自定义编译选项时使用ports。
5. 软件本地化与配置管理(核心原则)
5.1 什么是“本地化”
本地化 = 配置现有发行版/软件包,使其符合本地安全策略、文件布局、网络拓扑和用户需求的过程。
5.2 设计良好本地化的原则
| 原则 | 说明 |
|---|---|
| 非管理员不应有root | 任何需要root的正常操作都值得怀疑(应改进本地配置) |
| 促进而非妨碍工作 | 用户不故意破坏系统,安全机制应防御无心之失 |
| 将违规视为学习机会 | 用户“走捷径”可能反映架构问题 |
| 以客户为中心 | 主动询问用户痛点,简化任务流程 |
| 用户喜欢才是真的 | 提供多种选择,而非“我觉得好” |
| 公开决策原因 | 管理决策影响用户体验时,说明初衷 |
| 文档最新且易访问 | 详见31.3节 |
5.3 结构化更新策略
| 策略 | 说明 |
|---|---|
| 金丝雀发布(Canary) | 先在非关键系统测试,逐步扩大范围 |
| 分阶段实施 | 接纳其他团队需求,渐进式推进 |
| 不在周五改动关键系统 | 给自己留足回退时间 |
| 小增量发布 | 持续集成/部署理念,比“大版本”风险更低 |
| 限制活跃发布数量 | 减少管理负担,避免老旧系统无法打补丁 |
| 强制测试 | 厂商补丁也要测试(历史上有过rm -rf /的惨剧) |
| 内部镜像先行验证 | 不要将生产系统直接连接厂商更新源 |
5.4 版本控制 + 配置管理系统
| 工具/方法 | 目的 |
|---|---|
| 版本控制系统(Git等) | 追踪所有本地化配置的修改历史,知道谁改了什么、为什么改 |
| 配置管理工具(Ansible/Salt/Puppet/Chef) | 以可重现的方式安装/配置软件,避免“雪花服务器” |
| 统一配置 vs 差异化 | 尽量统一,不可避免的差异通过分层管理(全局→角色→主机) |
6. 本章核心命令速查表
| 命令 | 功能 | 平台 |
|---|---|---|
rpm -Uvh package.rpm |
安装/升级RPM包 | RHEL/CentOS |
rpm -qa | grep name |
查询已装包 | RHEL/CentOS |
dpkg -i package.deb |
安装deb包 | Debian/Ubuntu |
dpkg -l | grep name |
查询已装包 | Debian/Ubuntu |
apt update |
刷新包索引 | Debian/Ubuntu |
apt install/upgrade |
安装/升级 | Debian/Ubuntu |
yum install/update |
安装/升级 | RHEL/CentOS |
yum search |
搜索包 | RHEL/CentOS |
pkg install/upgrade |
安装/升级 | FreeBSD |
pkg search/info |
搜索/查询 | FreeBSD |
portsnap fetch extract |
初始化ports树 | FreeBSD |
freebsd-update fetch install |
更新基准系统 | FreeBSD |
system-config-kickstart |
GUI生成ks.cfg | RHEL/CentOS |
debconf-get-selections |
导出preseed模板 | Debian/Ubuntu |
apt-mirror |
创建本地仓库镜像 | Debian/Ubuntu |
portmaster -a |
升级所有ports | FreeBSD |
DBA视角补充:
- 数据库部署自动化:使用Kickstart/Preseed + Cobbler可批量部署数据库服务器(如MySQL、PostgreSQL专用主机),确保分区方案(数据盘独立、日志独立)和内核参数一致。
- 包管理优先:数据库软件(如MySQL官方提供的APT/YUM仓库)应优先通过包管理器安装,便于版本跟踪和安全补丁更新。不建议手动编译源码部署生产库。
- 本地仓库价值:如有数十台数据库服务器,建立本地APT/YUM镜像可大幅节省带宽、加速部署,同时可在推送更新前先在内网测试。
- 版本控制:数据库配置文件(my.cnf、postgresql.conf)应纳入Git管理,配合Ansible等工具统一分发,避免“每台数据库配置不同”的运维噩梦。
- 升级策略:数据库升级(尤其是大版本)必须在测试环境先验证(金丝雀),绝不在周五下午直接操作生产库。
文章作者 会写代码的小郎中
上次更新 2011-06-16
许可协议 CC BY-NC-ND 4.0