刚接触Linux的新手常被各种安装方式搞得晕头转向,而老手们则苦恼于如何优雅地管理系统中的数百个软件包。我在运维岗位摸爬滚打十年,处理过从单机到集群的软件部署,深刻体会到掌握Linux程序管理就像获得了一把瑞士军刀。不同于Windows的傻瓜式安装,Linux提供了rpm、deb、源码编译等多条路径,每种方式背后都对应着不同的管理哲学。
当前主流Linux发行版主要分为两大阵营:基于Red Hat的yum/dnf系(如CentOS、Fedora)和基于Debian的apt系(如Ubuntu)。以部署Nginx为例,在CentOS上你会用yum install nginx,而在Ubuntu上则是apt install nginx。虽然命令不同,但底层都在做同样的事情:解决依赖关系、下载软件包、验证完整性并安装到标准路径。理解这种差异是成为Linux熟手的第一步。
RPM(Red Hat Package Manager)和DEB(Debian Package)是Linux世界的两大打包格式。我曾拆解过一个典型的Nginx RPM包,其内部结构就像精密设计的集装箱:
code复制/usr/sbin/nginx # 主程序
/etc/nginx/nginx.conf # 配置文件
/usr/lib/systemd/system/nginx.service # 服务单元
使用rpm -ivh package.rpm安装时,系统会将这些文件释放到预定位置,并记录在/var/lib/rpm数据库中。而查询已安装包可以用rpm -qa | grep nginx,移除则是rpm -e nginx。DEB包的操作类似,只是工具换成了dpkg -i和dpkg -l。
重要提示:永远不要强制安装有依赖缺失的包(如
rpm -ivh --nodeps),这会导致系统处于不可预测状态。我曾因此不得不重装整个生产环境。
现代Linux更推荐使用高级包管理工具:
bash复制# CentOS 8+
dnf install epel-release # 添加EPEL仓库
dnf config-manager --set-enabled powertools
# Ubuntu
add-apt-repository ppa:nginx/stable
apt update
配置仓库时遇到过证书错误?试试这个修复方案:
bash复制# 更新CA证书
sudo update-ca-trust force-enable
sudo cp new_cert.crt /etc/pki/ca-trust/source/anchors/
sudo update-ca-trust extract
当需要最新特性或自定义功能时,源码安装是终极解决方案。以编译Python 3.11为例:
bash复制wget https://www.python.org/ftp/python/3.11.0/Python-3.11.0.tgz
tar xzf Python-3.11.0.tgz
cd Python-3.11.0
./configure --enable-optimizations --with-lto
make -j$(nproc) # 并行编译
sudo make altinstall # 保留系统Python
关键参数解析:
--enable-optimizations:启用PGO优化,性能提升10-20%--with-lto:链接时优化altinstall:避免覆盖系统Python编译失败90%源于依赖缺失。这个命令组合能救急:
bash复制# Red Hat系
sudo dnf build-dep python3
# Debian系
sudo apt build-dep python3
sudo apt install build-essential zlib1g-dev libncurses5-dev libgdbm-dev libnss3-dev libssl-dev libreadline-dev libffi-dev
容器化正在改变软件部署方式。用Docker安装MySQL只需:
bash复制docker pull mysql:8.0
docker run --name mysql01 -e MYSQL_ROOT_PASSWORD=ComplexP@ss -p 3306:3306 -d mysql:8.0 --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
参数说明:
-e 设置环境变量-p 端口映射--character-set-server 配置UTF-8编码容器重启后数据会丢失,必须挂载卷:
bash复制docker volume create mysql_data
docker run -v mysql_data:/var/lib/mysql [其他参数]
现代Linux使用systemd管理服务。创建自定义服务:
ini复制# /etc/systemd/system/myapp.service
[Unit]
Description=My Custom App
After=network.target
[Service]
ExecStart=/usr/local/bin/myapp
User=appuser
Restart=on-failure
[Install]
WantedBy=multi-user.target
关键命令:
bash复制systemctl daemon-reload
systemctl enable --now myapp
journalctl -u myapp -f # 查看日志
防止服务耗尽资源:
ini复制[Service]
MemoryLimit=512M
CPUQuota=150%
永远不要用root运行应用服务:
bash复制sudo useradd -r -s /sbin/nologin appuser
sudo chown -R appuser:appuser /opt/myapp
遇到权限拒绝时不要直接禁用SELinux,正确做法:
bash复制ausearch -m avc -ts recent # 查看拒绝记录
sudo semanage fcontext -a -t httpd_sys_content_t "/opt/myapp(/.*)?"
sudo restorecon -Rv /opt/myapp
高并发服务需要调整限制:
bash复制# 临时生效
ulimit -n 65535
# 永久生效
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
# systemd服务需额外配置
[Service]
LimitNOFILE=infinity
针对Nginx等高性能服务:
bash复制# /etc/sysctl.conf
net.core.somaxconn = 32768
net.ipv4.tcp_max_syn_backlog = 8192
vm.swappiness = 10
应用配置:sysctl -p
当命令找不到时:
bash复制# 查找命令所属包
yum provides */nginx
dpkg -S $(which nginx)
# 查看动态库依赖
ldd $(which nginx)
使用journalctl的高级用法:
bash复制# 按时间过滤
journalctl --since "2023-01-01" --until "2023-01-02"
# 按优先级
journalctl -p err -b
# 实时跟踪特定服务
journalctl -u nginx -f
批量安装软件的ansible剧本示例:
yaml复制- hosts: webservers
become: yes
tasks:
- name: Install EPEL
yum:
name: epel-release
state: present
- name: Install Nginx
yum:
name: nginx
state: latest
- name: Start service
service:
name: nginx
state: started
enabled: yes
使用ansible模板管理配置文件:
yaml复制- name: Deploy config
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
owner: root
group: root
mode: 0644
notify: Restart Nginx
管理多个Java版本:
bash复制sudo alternatives --config java
使用pyenv管理Python版本:
bash复制curl https://pyenv.run | bash
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'command -v pyenv >/dev/null || export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(pyenv init -)"' >> ~/.bashrc
exec "$SHELL"
pyenv install 3.11.0
pyenv global 3.11.0
搭建内部软件仓库:
bash复制# 安装工具
yum install createrepo httpd
# 创建仓库目录
mkdir -p /var/www/html/repos/base/Packages
cp *.rpm /var/www/html/repos/base/Packages/
# 生成元数据
createrepo /var/www/html/repos/base/
# 配置客户端
cat > /etc/yum.repos.d/local.repo <<EOF
[local]
name=Local Repository
baseurl=http://server_ip/repos/base/
enabled=1
gpgcheck=0
EOF
私有镜像仓库部署:
bash复制docker run -d -p 5000:5000 --restart=always --name registry registry:2
# 推送镜像
docker tag myimage localhost:5000/myimage
docker push localhost:5000/myimage
使用top的增强版htop:
bash复制# 安装
yum install htop # 或 apt install htop
# 常用快捷键
# F2 - 设置
# F5 - 树状视图
# F6 - 排序选择
sysstat工具集使用:
bash复制# 安装
yum install sysstat
# CPU使用率采样
sar -u 1 5
# 内存监控
sar -r 1 5
# IO统计
sar -b 1 5
保存已安装包列表:
bash复制# RPM系
rpm -qa > installed_packages.txt
# DEB系
dpkg --get-selections > installed_packages.txt
# 恢复安装
yum install $(cat installed_packages.txt)
使用etckeeper管理/etc:
bash复制yum install etckeeper git
etckeeper init
etckeeper commit "Initial commit"
firewalld高级用法:
bash复制# 开放端口
firewall-cmd --permanent --add-port=8080/tcp
# 限制源IP
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="3306" accept'
# 服务重载
firewall-cmd --reload
常用网络排错命令:
bash复制# 连通性测试
mtr 8.8.8.8
# 端口检查
nc -zv example.com 443
# DNS解析
dig +trace example.com
配置sudoers策略:
bash复制# 使用visudo安全编辑
visudo
# 示例规则
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx, /usr/bin/systemctl status nginx
使用访问控制列表:
bash复制# 设置ACL
setfacl -m u:appuser:rwx /opt/myapp
# 查看ACL
getfacl /opt/myapp
逻辑卷管理示例:
bash复制# 创建物理卷
pvcreate /dev/sdb1
# 创建卷组
vgcreate vg_data /dev/sdb1
# 创建逻辑卷
lvcreate -L 100G -n lv_mysql vg_data
# 扩展逻辑卷
lvextend -L +50G /dev/vg_data/lv_mysql
resize2fs /dev/vg_data/lv_mysql
使用fio进行基准测试:
bash复制yum install fio
fio --name=randwrite --ioengine=libaio --iodepth=32 --rw=randwrite --bs=4k --direct=1 --size=1G --numjobs=4 --runtime=60 --group_reporting
创建基本隔离环境:
bash复制mkdir -p /chroot/centos
yum --installroot=/chroot/centos install bash coreutils vim
chroot /chroot/centos /bin/bash
使用unshare创建隔离环境:
bash复制unshare --pid --fork --mount-proc /bin/bash
ps aux # 查看隔离后的进程树
内核模块常用操作:
bash复制# 列出已加载模块
lsmod
# 查看模块信息
modinfo ext4
# 加载模块
modprobe nf_conntrack
# 永久生效
echo "nf_conntrack" >> /etc/modules-load.d/custom.conf
运行时修改内核参数:
bash复制# 查看当前值
sysctl kernel.threads-max
# 临时修改
sysctl -w kernel.threads-max=16384
# 永久修改
echo "kernel.threads-max=16384" >> /etc/sysctl.d/99-custom.conf
sysctl -p /etc/sysctl.d/99-custom.conf
分析启动耗时:
bash复制systemd-analyze blame
systemd-analyze critical-chain
调整systemd并行度:
ini复制# /etc/systemd/system.conf
DefaultTasksMax=infinity
自定义logrotate规则:
ini复制# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 appuser appgroup
sharedscripts
postrotate
systemctl reload myapp
endscript
}
使用systemd定时器替代cron:
ini复制# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target