这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 本附录按生产场景组织常用命令。以主流 Linux 发行版和 systemd 环境为主线,不同发行版的路径、服务名和工具参数可能有差异,生产操作前应以当前系统文档为准。
1. 登录后第一分钟
date -Is
hostname
whoami
uptime
free -h
df -hT
ss -s
systemctl --failed --no-pager
dmesg -T | tail -50
进程 Top:
ps -eo pid,ppid,user,stat,%cpu,%mem,rss,etime,cmd \
--sort=-%cpu | head -20
ps -eo pid,ppid,user,stat,%cpu,%mem,rss,etime,cmd \
--sort=-rss | head -20
确认三件事:
| 检查 | 目的 |
|---|---|
| 主机、用户、目录 | 防止误操作 |
| 资源水位 | 快速判断压力 |
| 失败服务和内核错误 | 找明显故障点 |
2. 文件与目录
pwd
ls -lah
ls -ld /opt/app
stat app.conf
file app.bin
mkdir -p /opt/app/{conf,logs,run}
cp -a /opt/app /opt/app.bak
mv app.log archive/
du -sh /var/log
du -h --max-depth=2 /var | sort -h
find /data -xdev -type f -size +1G -printf '%s %p\n' | sort -nr | head
inode:
df -ih
ls -i file
已删除但仍被占用:
lsof +L1
ls -l /proc/<pid>/fd
归档:
tar -czf app-$(date +%F).tar.gz /opt/app
tar -tf app-2026-08-25.tar.gz | head
tar -xzf app-2026-08-25.tar.gz -C /tmp
3. 权限与用户
身份:
id
whoami
groups
getent passwd app
getent group app
修改:
chmod 640 app.conf
chmod 750 deploy.sh
chown app:app app.conf
chown -R app:app /opt/app
find /opt/app -type d -exec chmod 750 {} +
find /opt/app -type f -exec chmod 640 {} +
ACL:
getfacl file
setfacl -m u:dev01:r file
setfacl -m g:audit:r file
setfacl -b file
sudo:
sudo -l
sudo -u app /opt/app/bin/healthcheck.sh
sudo visudo -c
sudo journalctl -t sudo --since today
推荐权限:
| 对象 | 权限 |
|---|---|
| 私钥 | 600 |
| 配置 | 640 |
| 脚本 | 750 |
| 应用目录 | 750 |
.ssh 目录 |
700 |
4. 文本处理
查找:
grep -n ERROR app.log
grep -i error app.log
grep -v DEBUG app.log
grep -r --include='*.log' ERROR /var/log
grep -E 'ERROR|WARN' app.log
zgrep ERROR app.log.gz
字段与替换:
awk '{print $1}' access.log
awk -F, '$3 > 100 {print $1, $3}' orders.csv
sed -n '10,20p' app.log
sed 's/debug=true/debug=false/' app.conf
cp app.conf app.conf.bak
sed -i 's/debug=true/debug=false/' app.conf
diff -u app.conf.bak app.conf
统计:
wc -l app.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10
awk '{print $9}' access.log | sort | uniq -c | sort -k2n
JSON:
jq . event.json
jq '.status' event.json
jq '[.[] | select(.status == "PAID")]' orders.json
jq -r '.[] | [.id, .amount] | @tsv' orders.json
安全传递文件名:
find /opt/app -type f -name '*.log' -print0 |
xargs -0 grep ERROR
5. 进程与信号
查看:
ps auxf
ps -eo pid,ppid,user,stat,%cpu,%mem,etime,cmd --sort=-%cpu
pstree -aps
top -H -p <pid>
ps -T -p <pid>
详情:
cat /proc/<pid>/status
cat /proc/<pid>/io
cat /proc/<pid>/limits
tr '\0' '\n' < /proc/<pid>/environ
readlink -f /proc/<pid>/cwd
readlink -f /proc/<pid>/exe
ls -l /proc/<pid>/fd
信号:
kill -15 <pid>
kill -9 <pid>
pkill -TERM -f 'java -jar order.jar'
退出码:
| 退出码 | 常见含义 |
|---|---|
| 0 | 成功 |
| 126 | 无执行权限 |
| 127 | 命令不存在 |
| 130 | SIGINT |
| 137 | SIGKILL,常见 OOM 或强制停止 |
| 139 | SIGSEGV |
| 143 | SIGTERM |
6. systemd
服务:
systemctl status app --no-pager
sudo systemctl start app
sudo systemctl stop app
sudo systemctl restart app
sudo systemctl reload app
sudo systemctl enable app
sudo systemctl disable app
sudo systemctl daemon-reload
检查:
systemctl cat app
systemctl show app -p MainPID -p ActiveState -p SubState
systemctl list-units --type=service
systemctl list-units --failed
systemctl list-timers --all
日志:
journalctl -u app -n 200 --no-pager
journalctl -u app -f
journalctl -u app --since '1 hour ago'
journalctl -p err --since today
journalctl --disk-usage
sudo journalctl --vacuum-size=2G
常用 unit 片段:
[Service]
Type=simple
User=app
Group=app
WorkingDirectory=/opt/app/current
Environment=APP_ENV=production
EnvironmentFile=-/etc/app/env
ExecStart=/usr/bin/java -jar app.jar
Restart=on-failure
RestartSec=5s
TimeoutStopSec=30s
KillMode=mixed
LimitNOFILE=65535
MemoryHigh=5G
MemoryMax=6G
CPUQuota=300%
7. 软件包
APT:
sudo apt update
apt list --upgradable
sudo apt install nginx
sudo apt remove nginx
sudo apt purge nginx
apt show nginx
dpkg -l | grep nginx
dpkg -L nginx
dpkg -S /usr/sbin/nginx
DNF:
sudo dnf check-update
sudo dnf install nginx
sudo dnf remove nginx
dnf info nginx
dnf history
rpm -qa | grep nginx
rpm -ql nginx
rpm -qf /usr/sbin/nginx
锁定:
sudo apt-mark hold nginx
sudo apt-mark unhold nginx
sudo dnf versionlock add nginx
8. 磁盘与 IO
设备:
lsblk -f
blkid
sudo parted -l
df -hT
df -ih
挂载:
sudo mount /dev/vdb1 /data
sudo umount /data
findmnt
sudo findmnt --verify
LVM:
sudo pvs
sudo vgs
sudo lvs
sudo lvextend -L +50G /dev/datavg/datalv
sudo xfs_growfs /data
sudo resize2fs /dev/datavg/datalv
IO:
iostat -xz 1
pidstat -d 1
iotop -P -d 2
cat /proc/<pid>/io
cat /proc/meminfo | grep -E 'Dirty|Writeback'
fio:
sudo fio --name=rand-read \
--filename=/data/fio.test \
--direct=1 --rw=randread --bs=4k \
--ioengine=libaio --iodepth=32 --numjobs=4 \
--runtime=60 --time_based --group_reporting
9. CPU 与内存
CPU:
uptime
lscpu
vmstat 1
mpstat -P ALL 1
pidstat -u 1
pidstat -t -p <pid> 1
pidstat -w 1
内存:
free -h
cat /proc/meminfo
vmstat 1
ps -eo pid,user,rss,cmd --sort=-rss | head -20
cat /proc/<pid>/smaps_rollup
dmesg -T | grep -Ei 'oom|out of memory|killed process'
容器:
docker stats
kubectl top pod
cat /sys/fs/cgroup/cpu.stat
cat /sys/fs/cgroup/memory.current
cat /sys/fs/cgroup/memory.max
cat /sys/fs/cgroup/memory.events
判断:
| 现象 | 方向 |
|---|---|
| available 低 | 内存压力 |
| si/so 持续 | swap 压力 |
| throttled 增长 | CPU 限流 |
| OOM 日志 | 已牺牲进程 |
| RSS 持续增长 | 泄漏或缓存增长 |
10. 网络
地址与连接:
ip -br addr
ip route
ip -s link
ss -s
ss -lntup
ss -antp
ss -ti
探测:
ping -c 4 <peer>
nc -vz <host> <port>
mtr -rwzc 100 <host>
dig api.example.com
curl -v --max-time 5 https://api.example.com/healthz
统计:
ethtool -S eth0 | grep -Ei 'drop|err|miss|fifo'
nstat -az | grep -Ei 'drop|err|retrans'
netstat -s | grep -Ei 'listen|overflow|retrans'
sudo conntrack -S
抓包:
sudo tcpdump -ni any host <peer> and port <port>
sudo tcpdump -ni eth0 port 443 -w /tmp/net.pcap
11. 性能分析
采样:
perf stat -p <pid> -- sleep 10
sudo perf record -F 99 -g -p <pid> -- sleep 30
sudo perf report --stdio
追踪:
strace -c -p <pid>
strace -T -e trace=file,network -p <pid>
lsof -nP -p <pid>
lsof +L1
eBPF:
sudo biolatency 10 1
sudo runqlat
sudo tcpretrans
sudo execsnoop
sudo opensnoop
USE 方法:
每个资源检查:
Utilization 使用率
Saturation 饱和度
Errors 错误
12. Shell 可靠性
头部:
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
参数与环境:
env_name="${ENV_NAME:?ENV_NAME is required}"
timeout="${TIMEOUT:-5}"
[[ -r "$conf" ]] || { echo "cannot read $conf" >&2; exit 1; }
清理:
tmpdir=$(mktemp -d)
cleanup() {
rm -rf "$tmpdir"
}
trap cleanup EXIT INT TERM
检查:
bash -n script.sh
shellcheck script.sh
shfmt -w script.sh
高危删除前预览:
find /tmp -type f -name '*.tmp' -print
find /tmp -type f -name '*.tmp' -delete
13. 安全基线
账号:
awk -F: '$7 !~ /(nologin|false)/ {print $1}' /etc/passwd
last -a
lastb | head -50
sudo journalctl -u ssh --since today
文件:
find /etc -type f -perm /o+w -ls
find / -xdev -type f -perm /4000 -ls 2>/dev/null
stat /etc/shadow
入侵排查:
ps auxf
ss -antp
crontab -l
sudo ls -la /etc/cron.*
find /tmp /var/tmp /dev/shm -type f -executable -ls
systemctl list-timers --all
rpm -Va
dpkg --verify
加固原则:
[ ] 禁 root SSH
[ ] 禁密码 SSH
[ ] 只允许可信来源
[ ] 服务独立低权限账号
[ ] sudo 最小授权
[ ] 只开放必要端口
[ ] 补丁流程
[ ] 日志集中
[ ] 密钥轮换
[ ] 审计 sudo 和登录
14. 防火墙
nftables:
sudo nft list ruleset
sudo nft list tables
iptables:
sudo iptables -S
sudo iptables -L -n -v
sudo iptables -t nat -L -n -v
sudo iptables-save > firewall.rules
sudo iptables-restore < firewall.rules
firewalld:
sudo firewall-cmd --list-all
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload
ufw:
sudo ufw status verbose
sudo ufw allow 443/tcp
sudo ufw allow from 203.0.113.0/24 to any port 22 proto tcp
远程修改防火墙前必须先保住 SSH 和 established 连接。
15. 备份恢复
文件:
sudo tar -czf /backup/data-$(date +%F).tar.gz /data
sha256sum /backup/data-*.tar.gz > /backup/checksums.txt
sha256sum -c /backup/checksums.txt
sudo rsync -a --delete --dry-run /data/ backup:/backup/data/
sudo rsync -a --delete /data/ backup:/backup/data/
快照:
sudo lvcreate -s -n datalv-snap -L 10G /dev/datavg/datalv
sudo mount /dev/datavg/datalv-snap /mnt/snap
sudo umount /mnt/snap
sudo lvremove /dev/datavg/datalv-snap
必备元数据:
[ ] 备份时间
[ ] 主机和数据集
[ ] 版本
[ ] 校验值
[ ] 加密方式
[ ] 保留期限
[ ] 恢复步骤
[ ] 最近演练结果
16. 监控清单
主机:
CPU 使用率、runq、context switch、throttle
内存 available、swap in/out、OOM
磁盘空间、inode、await、IOPS、吞吐
网络错误包、丢包、重传、连接数
systemd failed、进程重启、日志错误
应用:
QPS、成功率、错误率
P50 / P95 / P99
连接池、线程池、队列
GC、FD、RSS
依赖耗时
发布:
版本、时间、批次、配置版本
回滚事件、变更人、工单
17. 常见故障路径
无法登录
ping <host>
nc -vz <host> 22
ssh -vvv user@<host>
检查安全组、防火墙、sshd、PAM、磁盘满、CPU/IO 打满、账号锁定。
磁盘满
df -hT
df -ih
du -sh /var/* /opt/* /tmp /root
lsof +L1
sudo journalctl --disk-usage
CPU 高
uptime
vmstat 1
pidstat -u 1
top -H -p <pid>
perf record -F 99 -g -p <pid> -- sleep 30
内存不足
free -h
vmstat 1
ps -eo pid,rss,cmd --sort=-rss | head
dmesg -T | grep -Ei 'oom|killed process'
服务启动失败
systemctl status app --no-pager
journalctl -u app -n 200 --no-pager
systemctl cat app
sudo -u app /opt/app/bin/start --check
ss -lntp
网络不通
dig <host>
nc -vz <host> <port>
curl -v <url>
ip route get <host>
sudo tcpdump -ni any host <host> and port <port>
18. 上线检查清单
系统:
[ ] 用户和目录权限
[ ] systemd unit
[ ] ulimit 和资源限制
[ ] 日志轮转
[ ] 时间同步
[ ] 磁盘水位
[ ] 只开放必要端口
应用:
[ ] 健康检查
[ ] 指标暴露
[ ] trace_id
[ ] 超时和重试
[ ] 优雅停机
[ ] 版本记录
发布:
[ ] 制品校验
[ ] 配置校验
[ ] 灰度批次
[ ] 停止条件
[ ] 回滚演练
[ ] 监控看板
[ ] 值班通知
安全与恢复:
[ ] 非 root 运行
[ ] sudo 最小授权
[ ] SSH 来源限制
[ ] 密钥轮换
[ ] 备份可用
[ ] 恢复演练通过
19. 高危命令确认表
| 命令 | 风险 | 执行前 |
|---|---|---|
rm -rf |
删除不可恢复 | 展开通配符和路径 |
dd |
覆盖设备 | 确认 of 目标 |
mkfs |
清空文件系统 | lsblk 确认设备 |
iptables / nft |
锁死管理通道 | 放行 SSH 和 established |
sysctl -w |
改内核行为 | 记录默认值和回滚 |
kill -9 |
丢清理机会 | 先 SIGTERM |
lvreduce |
缩容风险 | 备份并确认文件系统 |
xfs_repair -L |
可能丢数据 | 专家评审和备份 |
执行前三问:
1. 我在哪台机器?
2. 目标真实路径是什么?
3. 回滚命令是什么?
20. 学习地图
第一阶段:命令行、文件、权限、进程
第二阶段:systemd、日志、磁盘、网络、软件包
第三阶段:CPU、内存、IO、网络栈、namespace、cgroup
第四阶段:安全、SSH、防火墙、备份、监控
第五阶段:Shell、Ansible、高负载部署、发布回滚
第六阶段:内核文档、源码、eBPF、专项性能优化