1. Linux软件管理基础
在Linux系统中,软件管理是系统管理员和开发者的核心技能之一。不同于Windows系统的.exe安装包,Linux下的软件包管理更加多样化和灵活。根据不同的发行版,主要有以下几种软件包类型:
1.1 软件包类型解析
压缩包(绿色安装包/源码编译)
这是最原始的软件分发形式,通常以.tar.gz或.tar.bz2等压缩格式提供。这类软件包的特点是:
- 需要手动解压和配置
- 通常包含源代码,需要编译安装
- 安装位置和依赖关系需要用户自行管理
- 适合需要高度定制化的场景
典型安装流程:
bash复制tar -zxvf package.tar.gz
cd package
./configure
make
make install
DEB包(Debian系)
DEB是Debian及其衍生发行版(如Ubuntu)使用的软件包格式,特点包括:
- 包含预编译的二进制文件
- 自动处理依赖关系
- 使用dpkg/apt工具管理
- 包结构规范,包含控制脚本
RPM包(RedHat系)
RPM是Red Hat及其衍生发行版(如CentOS、RHEL)的标准包格式,特点是:
- 同样包含预编译二进制
- 使用rpm/yum/dnf工具管理
- 有完善的元数据信息
- 支持数字签名验证
1.2 RPM包管理核心命令
作为RedHat系Linux的标准包管理工具,rpm命令提供了软件包的安装、查询、验证等全套功能。以下是实际工作中最常用的rpm命令组合:
安装软件包
bash复制rpm -ivh package.rpm
参数说明:
- -i:安装模式
- -v:显示详细输出
- -h:显示进度条
- -U:升级安装(若已安装则升级,未安装则安装)
- --force:强制安装(慎用)
查询已安装包
bash复制rpm -qa | grep package # 查询是否安装
rpm -qi package # 查看包详细信息
rpm -ql package # 列出包安装的文件
rpm -qc package # 查看包的配置文件
卸载软件包
bash复制rpm -e package
注意:卸载前需确保没有其他包依赖它,否则会报错。可以通过rpm -q --whatrequires package查看依赖关系。
验证包完整性
bash复制rpm -V package
验证结果中:
- S:文件大小改变
- M:权限或文件类型改变
- 5:MD5校验和改变
- D:设备文件改变
- L:符号链接改变
- U:用户/组改变
- T:修改时间改变
2. 实验环境配置实战
2.1 虚拟机初始配置
在开始软件管理实验前,我们需要准备一个干净的RHEL9环境。以下是关键配置步骤:
- 创建虚拟机
- 分配至少2核CPU
- 内存建议4GB以上
- 磁盘空间100GB(实际可根据需要调整)
- 选择Server with GUI安装模式
- 基础系统配置
bash复制# 关闭防火墙(实验环境)
systemctl disable --now firewalld
systemctl mask firewalld
# 禁用SELinux
vim /etc/sysconfig/selinux
# 修改为:SELINUX=disabled
# 修改网卡命名规则为传统ethX格式
vim /boot/loader/entries/*.conf
# 在kernel参数行末尾添加:net.ifnames=0
- 网络配置调整
bash复制# 重命名网络连接配置文件
cd /etc/NetworkManager/system-connections/
mv ens160.nmconnection eth0.nmconnection
# 更新配置文件中的接口名
vim eth0.nmconnection
# 将所有ens160替换为eth0
# 重新加载网络配置
nmcli connection reload
nmcli connection up eth0
2.2 本地软件仓库搭建
在企业内网或没有互联网连接的环境中,搭建本地软件仓库是必备技能。以下是详细步骤:
- 挂载安装镜像
bash复制mkdir /rhel9
mount /dev/cdrom /rhel9
# 设置开机自动挂载
echo "mount /dev/cdrom /rhel9" >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
- 配置YUM仓库文件
bash复制cd /etc/yum.repos.d/
vim rhel.repo
[AppStream]
name = AppStream
baseurl = file:///rhel9/AppStream
gpgcheck = 0
enabled = 1
[BaseOS]
name = BaseOS
baseurl = file:///rhel9/BaseOS
gpgcheck = 0
enabled = 1
- 验证仓库可用性
bash复制dnf clean all
dnf repolist
dnf list available
3. DNF高级软件管理
3.1 DNF核心功能
DNF是新一代的RPM包管理器,相比传统的YUM具有更好的性能和依赖解决能力。常用命令包括:
软件安装与移除
bash复制dnf install package # 安装软件包
dnf remove package # 卸载软件包
dnf reinstall package # 重新安装
dnf autoremove # 移除无用依赖
系统更新
bash复制dnf check-update # 检查可用更新
dnf update # 更新所有包
dnf upgrade # 升级系统(相当于update --obsoletes)
dnf distro-sync # 保持与仓库版本一致
仓库管理
bash复制dnf repolist # 列出已启用仓库
dnf repolist --all # 列出所有仓库
dnf config-manager --add-repo=URL # 添加新仓库
dnf config-manager --disable repo # 禁用仓库
3.2 第三方仓库配置
Docker CE仓库
bash复制vim /etc/yum.repos.d/docker.repo
[docker-ce]
name=Docker CE Stable
baseurl=https://mirrors.aliyun.com/docker-ce/linux/rhel/$releasever/$basearch/stable
enabled=1
gpgcheck=0
EPEL仓库配置
bash复制dnf install epel-release
# 或手动配置
vim /etc/yum.repos.d/epel.repo
[epel]
name=EPEL
baseurl=https://mirrors.aliyun.com/epel/$releasever/Everything/$basearch
enabled=1
gpgcheck=0
4. 私有软件仓库建设
在企业环境中,搭建私有软件仓库可以实现:
- 统一软件版本管理
- 离线环境软件分发
- 自定义软件包分发
- 带宽优化(减少重复下载)
4.1 基于HTTP的仓库搭建
- 基础服务安装
bash复制dnf install httpd createrepo
systemctl enable --now httpd
mkdir -p /var/www/html/repos/{custom,epel}
- 下载软件包
bash复制# 下载不安装
dnf install --downloadonly --downloaddir=/var/www/html/repos/custom docker-ce
# 手动添加其他RPM包
cp *.rpm /var/www/html/repos/custom/
- 创建仓库元数据
bash复制createrepo -v /var/www/html/repos/custom
# 更新元数据(添加新包后)
createrepo --update /var/www/html/repos/custom
- 客户端配置
bash复制vim /etc/yum.repos.d/custom.repo
[custom]
name=Custom Repository
baseurl=http://server-ip/repos/custom
enabled=1
gpgcheck=0
4.2 仓库维护技巧
定期同步官方仓库
bash复制reposync -p /var/www/html/repos/epel --repo=epel --download-metadata
createrepo --update /var/www/html/repos/epel
仓库签名(可选)
bash复制# 生成GPG密钥
gpg --gen-key
# 签名仓库
gpg --detach-sign --armor repodata/repomd.xml
# 客户端配置验证
vim /etc/yum.repos.d/custom.repo
gpgcheck=1
gpgkey=http://server-ip/repos/custom/RPM-GPG-KEY-CUSTOM
5. 网络配置深度解析
5.1 网络配置方法对比
传统ifcfg方式
配置文件位置:/etc/sysconfig/network-scripts/ifcfg-eth0
特点:
- 直接编辑配置文件
- 需要重启网络服务生效
- RHEL7及之前版本主要方式
NetworkManager方式
配置文件位置:/etc/NetworkManager/system-connections/
特点:
- 动态网络管理
- 支持热更新
- 提供nmcli/nmtui工具
- RHEL8+推荐方式
nmcli典型配置
bash复制# 查看连接
nmcli connection show
# 添加新连接
nmcli connection add type ethernet ifname eth1 con-name eth1
# 配置静态IP
nmcli connection modify eth1 ipv4.addresses 192.168.1.100/24
nmcli connection modify eth1 ipv4.gateway 192.168.1.1
nmcli connection modify eth1 ipv4.dns "8.8.8.8 8.8.4.4"
nmcli connection modify eth1 ipv4.method manual
# 激活连接
nmcli connection up eth1
5.2 网络调试技巧
基础网络检查
bash复制ip addr show # 查看接口配置
ip route show # 查看路由表
ss -tulnp # 查看监听端口
ping -c4 8.8.8.8 # 测试连通性
tracepath 8.8.8.8 # 跟踪路由
DNS问题排查
bash复制dig example.com # DNS查询测试
nslookup example.com # 另一种DNS查询
cat /etc/resolv.conf # 查看当前DNS配置
systemd-resolve --status # 查看系统DNS缓存
网络性能测试
bash复制# 带宽测试
iperf3 -c server-ip -t 30
# 延迟测试
ping -f -c 1000 8.8.8.8
# 包丢失测试
mtr -n -r -c 100 8.8.8.8
6. 存储管理进阶
6.1 分区工具深度对比
fdisk vs gdisk vs parted
| 特性 | fdisk | gdisk | parted |
|---|---|---|---|
| 分区表类型 | MBR | GPT | 两者都支持 |
| 最大磁盘 | 2TB | 8ZB | 8ZB |
| 最大分区数 | 4主/扩展+逻辑 | 128 | 取决于分区表 |
| 交互模式 | 是 | 是 | 是/否 |
| 脚本支持 | 有限 | 有限 | 完善 |
| 文件系统操作 | 否 | 否 | 是 |
parted高级示例
bash复制# 创建GPT分区表
parted /dev/sdb mklabel gpt
# 创建分区并设置标志
parted /dev/sdb mkpart primary xfs 1MiB 10GiB
parted /dev/sdb set 1 boot on
parted /dev/sdb name 1 system_disk
# 对齐检查
parted /dev/sdb align-check optimal 1
6.2 文件系统选型指南
EXT4
- 优点:成熟稳定、恢复工具完善、适合小文件
- 缺点:最大16TB文件系统、在线调整有限
- 适用场景:系统分区、常规应用
XFS
- 优点:高性能、大文件支持好、快速恢复
- 缺点:不能缩小、元数据开销较大
- 适用场景:数据库、大文件存储
Btrfs
- 优点:快照、压缩、RAID、子卷
- 缺点:稳定性相对欠佳
- 适用场景:需要高级特性的环境
ZFS
- 优点:极致数据完整性、强大管理功能
- 缺点:内存需求高、许可问题
- 适用场景:企业级存储
6.3 LVM高级管理
物理卷(PV)操作
bash复制pvcreate /dev/sdb1 # 创建PV
pvdisplay # 显示PV信息
pvmove /dev/sdb1 /dev/sdc1 # 迁移PV数据
pvremove /dev/sdb1 # 删除PV
卷组(VG)管理
bash复制vgcreate vg0 /dev/sdb1 /dev/sdc1 # 创建VG
vgextend vg0 /dev/sdd1 # 扩展VG
vgreduce vg0 /dev/sdc1 # 缩减VG
vgdisplay # 显示VG信息
逻辑卷(LV)操作
bash复制# 创建LV
lvcreate -n lv_data -L 50G vg0
# 扩展LV(XFS需要先卸载)
lvextend -L +10G /dev/vg0/lv_data
xfs_growfs /data # 对XFS文件系统
# 快照创建
lvcreate -s -n lv_snap -L 5G /dev/vg0/lv_data
7. 系统故障排查实战
7.1 启动问题修复
MBR损坏修复
bash复制# 从安装介质启动进入救援模式
chroot /mnt/sysimage
grub2-install /dev/sda
grub2-mkconfig -o /boot/grub2/grub.cfg
GRUB配置文件丢失
bash复制# 交互式启动后
grub2-mkconfig > /boot/grub2/grub.cfg
内核文件损坏
bash复制# 从救援模式
mount /dev/sda1 /mnt
rpm -ivh --force /mnt/Packages/kernel-*.rpm
7.2 日志分析技巧
关键日志文件
- /var/log/messages:系统综合日志
- /var/log/secure:认证相关日志
- /var/log/audit/audit.log:审计日志
- /var/log/dmesg:内核启动日志
- /var/log/maillog:邮件系统日志
日志分析命令
bash复制journalctl -xe # 查看系统日志
grep -i error /var/log/messages # 筛选错误
tail -f /var/log/secure # 实时监控
dmesg | grep -i eth # 查看网卡相关内核消息
自定义日志规则
bash复制vim /etc/rsyslog.conf
# 记录特定设施和级别的日志
local5.* /var/log/app.log
# 排除特定日志
*.*;authpriv.none /var/log/noauth.log
systemctl restart rsyslog
8. 自动化运维脚本
8.1 网络配置脚本
bash复制#!/bin/bash
# 网络自动配置脚本
# 参数检查
if [ $# -lt 3 ]; then
echo "Usage: $0 <interface> <IP/CIDR> <hostname> [noroute]"
exit 1
fi
# 检查并删除现有连接
CONNECTION=$(nmcli connection show | awk "/$1/ "'{print $1}' | grep "$1")
if [ $? -eq 0 ]; then
echo "Removing existing connection: $CONNECTION"
nmcli connection delete "$CONNECTION"
fi
# 创建新连接
if [ "$4" = "noroute" ]; then
cat > "/etc/NetworkManager/system-connections/$1.nmconnection" <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1
[ipv4]
method=manual
address1=$2
EOF
else
cat > "/etc/NetworkManager/system-connections/$1.nmconnection" <<EOF
[connection]
id=$1
type=ethernet
interface-name=$1
[ipv4]
method=manual
address1=$2,172.25.254.2
dns=8.8.8.8;
EOF
fi
# 设置权限并应用配置
chmod 600 "/etc/NetworkManager/system-connections/$1.nmconnection"
nmcli connection reload
nmcli connection up "$1"
# 设置主机名
hostnamectl set-hostname "$3"
# 更新hosts文件
cat > /etc/hosts <<EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
$2 $3
EOF
# 显示结果
ip addr show "$1"
hostname
8.2 软件仓库同步脚本
bash复制#!/bin/bash
# 自动同步软件仓库脚本
REPO_DIR="/var/www/html/repos"
REPO_LIST=("epel" "docker-ce")
for repo in "${REPO_LIST[@]}"; do
echo "Syncing $repo repository..."
reposync -p "$REPO_DIR/$repo" --repo="$repo" --download-metadata --newest-only
createrepo --update "$REPO_DIR/$repo"
# 清理旧版本包(保留最近3个版本)
find "$REPO_DIR/$repo" -name "*.rpm" | sort -V | head -n -3 | xargs rm -f
done
# 更新仓库索引
createrepo --update "$REPO_DIR/custom"
# 设置权限
chown -R apache:apache "$REPO_DIR"
restorecon -Rv "$REPO_DIR"
echo "Repository sync completed at $(date)"
9. 性能优化技巧
9.1 系统调优建议
内核参数优化
bash复制# 编辑/etc/sysctl.conf
vm.swappiness = 10 # 减少交换空间使用
net.ipv4.tcp_tw_reuse = 1 # 允许重用TIME-WAIT sockets
net.ipv4.tcp_fin_timeout = 30 # 减少FIN-WAIT超时
fs.file-max = 65535 # 增加文件描述符限制
# 应用配置
sysctl -p
服务优化
bash复制# 禁用不必要服务
systemctl disable bluetooth cups abrtd
# 调整journal日志大小
vim /etc/systemd/journald.conf
SystemMaxUse=500M
9.2 存储性能优化
IO调度器选择
bash复制# 查看当前调度器
cat /sys/block/sda/queue/scheduler
# 临时修改为deadline
echo deadline > /sys/block/sda/queue/scheduler
# 永久修改
grubby --update-kernel=ALL --args="elevator=deadline"
文件系统挂载选项
bash复制# XFS性能优化选项
vim /etc/fstab
UUID=xxx /data xfs defaults,noatime,nodiratime,logbufs=8 0 0
# EXT4性能优化
UUID=xxx /app ext4 defaults,noatime,nodiratime,data=writeback 0 0
LVM缓存配置
bash复制# 创建缓存池
lvcreate -L 10G -n cachepool vg0
lvconvert --type cache-pool --poolmetadata vg0/cachepool vg0/cachepool_meta
# 将缓存附加到原始LV
lvconvert --type cache --cachepool vg0/cachepool vg0/lv_data