《UNIX/Linux系统管理技术手册-读书笔记-第六章

软件的安装与管理

1. 操作系统安装(自动化部署)

1.1 交互式安装 vs 网络自动化安装

方式 适用场景 说明
交互式安装(光盘/USB) 单机或少量的物理机 GUI引导,直观但重复性高、易出错
网络安装(PXE + DHCP + TFTP + HTTP/NFS) 10台以上或需要标准化部署的站点 无需物理介质,从网络引导并获取安装文件
PXE(预引导执行环境) 标准化大规模部署 Intel标准,BIOS/UEFI通过网卡从网络引导,下载引导文件并执行安装

PXE工作流程

  1. 主机广播PXE发现请求
  2. DHCP服务器返回引导服务器IP + 引导文件名
  3. 客户端通过TFTP下载引导文件(如PXELINUX)
  4. 引导文件提供菜单,指向操作系统安装镜像(HTTP/FTP/NFS)
  5. 配合无人值守安装工具(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关键配置示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
text
lang en_US
keyboard us
rootpw --iscrypted $6$...   # 使用加密密码(openssl passwd -1生成)
reboot
install
url --url http://installserver/redhat
clearpart --all --initlabel
part / --fstype ext3 --size 4096
part swap --size 1024
part /var --fstype ext3 --size 1 --grow
network --bootproto dhcp
%packages
@ GNOME
@ X Window System
mylocalpackage
%post
# 安装后执行的脚本(chroot环境)

部署方式

  • 引导时在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关键配置示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
d-i debian-installer/locale string en_US
d-i console-setup/ask_detect boolean false
d-i netcfg/choose_interface select auto
d-i partman-auto/method string lvm
d-i partman-auto/choose_recipe select atomic
d-i passwd/user-fullname string Daffy Duck
d-i passwd/username string dduck
d-i passwd/user-password-crypted password $6$...
tasksel tasksel/first multiselect ubuntu-desktop
d-i grub-installer/only_debian boolean true

部署方式:内核参数传递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
批量管理 安装portmasterportmaster -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等工具统一分发,避免“每台数据库配置不同”的运维噩梦。
  • 升级策略:数据库升级(尤其是大版本)必须在测试环境先验证(金丝雀),绝不在周五下午直接操作生产库。