Linux 分支有八百多个条目,这条路径只挑四十个。先把文件、进程、网络、排障四条主线走通,再按命令分类扩展;否则很容易把时间花在背参数上。
四个阶段按依赖顺序排列,每个阶段建议留 2–3 小时:
Linux 的知识密度高在“组合”,不在单个命令。每个阶段都要把多个命令串成一条可重复的检查流程。
目标:能在任意目录定位文件,读懂权限位,并用 grep、sed、awk 从日志里提取需要的信息。
阅读顺序:
cd - 和相对路径的基准。-n、-A 这类排错选项。-0。动手任务:在 /tmp 下造一个日志目录,用查找、过滤和字段提取做一份访问统计,再改一次权限并验证。
mkdir -p /tmp/linux-lab/logs
printf 'GET / 200\nPOST /login 401\nGET /admin 403\n' > /tmp/linux-lab/logs/access.log
find /tmp/linux-lab -type f -name '*.log' -print0 | xargs -0 ls -l
grep -c ' 403$' /tmp/linux-lab/logs/access.log
awk '$3 == 403 {print $2}' /tmp/linux-lab/logs/access.log
sed -n '2p' /tmp/linux-lab/logs/access.log
chmod 640 /tmp/linux-lab/logs/access.log
ls -l /tmp/linux-lab/logs/access.log
过关标准:
x 和目录上的 x 分别意味着什么。find -exec 和 xargs -0 各自适合什么场景,以及文件名带空格时会发生什么。grep、sed、awk 各自解决哪类问题,而不是混着用。目标:能回答“谁在跑、占了多少资源、打开了什么、由谁管理、什么时候自动跑”。
阅读顺序:
动手任务:找出当前占用 CPU 最高的进程,查它打开的资源和所属单元,再创建一条每分钟执行的定时任务并验证日志。
ps -eo pid,ppid,pcpu,pmem,comm --sort=-pcpu | head
pstree -p $$
systemctl status sshd --no-pager
journalctl -u sshd -n 20 --no-pager
lsof -p $$ | head
pidstat 1 3
free -m
uptime
过关标准:
systemctl 管理单元和 journalctl 读取日志的职责。lsof 找到一个“已删除但磁盘没释放”的文件。目标:能确认监听端口、连接状态、路由、DNS、HTTP 响应,以及磁盘空间和文件传输是否正常。
阅读顺序:
netstat 更快地看监听、连接和 socket 队列。ifconfig/route。动手任务:起一个本地 HTTP 服务,确认监听和访问链路,再打包并增量同步目录。
python3 -m http.server 8080 &
ss -lntp | grep 8080
curl -v --max-time 3 http://127.0.0.1:8080/
dig example.com +short
ip route
df -h /tmp && df -i /tmp
du -sh /tmp/linux-lab
tar -czf /tmp/linux-lab.tar.gz -C /tmp linux-lab
rsync -av /tmp/linux-lab/ /tmp/linux-lab-backup/
过关标准:
LISTEN、ESTABLISHED、TIME_WAIT 分别代表什么。df 显示满但 du 加起来不大的常见原因。curl 返回非零退出码时,先看 DNS、连接还是 TLS 阶段。目标:能用系统调用、资源采样和审计日志定位权限拒绝、磁盘写满、IO 饱和和异常提权。
阅读顺序:
动手任务:在一次性的虚拟机里制造权限拒绝和磁盘写满,用系统调用和内核日志确认根因;再配置一条审计规则观察 sudo 执行。
chmod 000 /tmp/linux-lab/logs/access.log
strace -e trace=openat cat /tmp/linux-lab/logs/access.log
fallocate -l 64M /tmp/small.img
mkfs.ext4 -q /tmp/small.img
mkdir -p /mnt/small && sudo mount -o loop /tmp/small.img /mnt/small
df -h /mnt/small
vmstat 1 3
iostat -xz 1 3
dmesg -T | tail -30
sudo ausearch -m USER_CMD -ts recent
过关标准:
EACCES 和 EPERM,并知道分别先查什么。vmstat 的 r、b、si、so、wa,判断是 CPU、内存还是 IO 问题。lsof +L1 找持有进程。ls、cat、tail -f。chmod 777 解决所有权限问题,破坏最小权限原则。free 很小就判断内存不足,忽略可回收的 page cache。find 结果上直接用 xargs,不处理空格和换行。strace、iostat 和内核参数,影响真实业务。合上页面,先回答,再展开对照。
x 权限和文件的 x 权限分别控制什么?df -h 显示磁盘已满,但 du -sh 统计不出对应大小,最可能是什么原因?Permission denied,你会按什么顺序确认是权限位、属主、ACL、挂载选项还是安全模块?x 表示可以执行该文件;目录上的 x 表示可以进入目录、访问其中的已知文件名,以及把目录作为路径的一部分。目录只有 r 没有 x 时,可以列出名字但无法访问条目。lsof +L1 或 lsof | grep deleted 找到持有进程,重启或让它关闭文件后空间才会释放。另一种可能是被挂载点覆盖的隐藏目录占用了空间。ls -l 的属主和模式位,再看 getfacl 的 ACL,然后确认父目录的 x 权限和挂载选项(如 noexec、nosuid、只读),最后看 SELinux/AppArmor 审计。用 strace -e openat 可以直接看到被拒绝的具体路径和错误码。