LinuxNotes

附录:附录:Linux 速查手册

zjc 于 2026-02-01 发布

这是《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、专项性能优化