Linux 学习路径:从文件与进程到排障与安全

使用方式

Linux 分支有八百多个条目,这条路径只挑四十个。先把文件、进程、网络、排障四条主线走通,再按命令分类扩展;否则很容易把时间花在背参数上。

四个阶段按依赖顺序排列,每个阶段建议留 2–3 小时:

Linux 的知识密度高在“组合”,不在单个命令。每个阶段都要把多个命令串成一条可重复的检查流程。

阶段一:文件、权限与文本

目标:能在任意目录定位文件,读懂权限位,并用 grep、sed、awk 从日志里提取需要的信息。

阅读顺序:

  1. ls — 先看清 inode、权限、时间戳和隐藏文件。
  2. cd — 目录切换、cd - 和相对路径的基准。
  3. cat — 小文件查看,以及 -n、-A 这类排错选项。
  4. find — 按名称、类型、时间、大小查找,并安全地批量处理。
  5. grep — 文本过滤、递归搜索、上下文和退出码。
  6. sed — 流式替换、按行删除和原地修改的风险。
  7. awk — 按字段处理结构化文本,做统计和筛选。
  8. chmod — 读写执行位、目录的执行位和特殊位。
  9. chown — 属主与属组,递归修改前先确认范围。
  10. xargs — 把查找结果安全地传给下一个命令,理解 -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

过关标准:

阶段二:进程、资源与系统

目标:能回答“谁在跑、占了多少资源、打开了什么、由谁管理、什么时候自动跑”。

阅读顺序:

  1. ps — 进程快照、父子关系和自定义输出字段。
  2. top — 实时视图,重点看负载、CPU、内存和 D 状态进程。
  3. pstree — 从进程树确认服务由谁拉起、有没有多余子进程。
  4. systemctl — 单元管理、启动失败原因和开机自启。
  5. journalctl — 按单元、时间、优先级过滤日志。
  6. lsof — 进程打开的文件、端口和已删除但仍占空间的文件。
  7. crontab — 定时任务的五个时间字段和环境变量陷阱。
  8. pidstat — 按进程持续采样 CPU、内存和 IO。
  9. free — 区分 free、available、buff/cache,不要被数字误导。
  10. uptime — 1/5/15 分钟负载趋势和运行时长。

动手任务:找出当前占用 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

过关标准:

阶段三:网络与存储

目标:能确认监听端口、连接状态、路由、DNS、HTTP 响应,以及磁盘空间和文件传输是否正常。

阅读顺序:

  1. ss — 比 netstat 更快地看监听、连接和 socket 队列。
  2. ip — 地址、路由、链路和邻居表,替代旧的 ifconfig/route。
  3. curl — HTTP 请求、响应头、超时、重试和 TLS 细节。
  4. ssh — 远程登录、密钥认证、端口转发和跳板。
  5. df — 文件系统空间和 inode 使用率。
  6. du — 目录占用,理解硬链接和重复计算。
  7. tar — 打包、压缩、保留权限和跨目录解压。
  8. ping — 连通性、RTT 和丢包,不负责验证端口。
  9. dig — DNS 查询、记录类型、递归与权威应答。
  10. rsync — 增量同步、排除规则和删除语义。

动手任务:起一个本地 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/

过关标准:

阶段四:排障与安全

目标:能用系统调用、资源采样和审计日志定位权限拒绝、磁盘写满、IO 饱和和异常提权。

阅读顺序:

  1. strace — 跟踪系统调用,确认程序卡在哪个文件或网络操作。
  2. vmstat — 运行队列、内存换页、IO 等待和上下文切换。
  3. iostat — 磁盘吞吐、延迟、队列和利用率。
  4. sar — 历史性能数据,适合事后复盘。
  5. dmesg — 内核日志、OOM、磁盘错误和驱动异常。
  6. sudo — 提权规则、环境保留和最小授权。
  7. auditd — 审计规则、命令执行和文件访问追踪。
  8. permission-denied — 从 EACCES/EPERM 倒推权限、属主和挂载选项。
  9. no-space-left — 空间、inode、保留块和已删除文件的完整排查顺序。
  10. linux-performance-triage — 把前面的命令串成 USE 排查流程。

动手任务:在一次性的虚拟机里制造权限拒绝和磁盘写满,用系统调用和内核日志确认根因;再配置一条审计规则观察 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

过关标准:

常见误区

读完自测

合上页面,先回答,再展开对照。

  1. 目录的 x 权限和文件的 x 权限分别控制什么?
  2. df -h 显示磁盘已满,但 du -sh 统计不出对应大小,最可能是什么原因?
  3. 一个进程报 Permission denied,你会按什么顺序确认是权限位、属主、ACL、挂载选项还是安全模块?
答案
  1. 文件上的 x 表示可以执行该文件;目录上的 x 表示可以进入目录、访问其中的已知文件名,以及把目录作为路径的一部分。目录只有 r 没有 x 时,可以列出名字但无法访问条目。
  2. 最可能是文件已被删除,但仍被某个进程打开着,inode 和磁盘块没有释放。用 lsof +L1 或 lsof | grep deleted 找到持有进程,重启或让它关闭文件后空间才会释放。另一种可能是被挂载点覆盖的隐藏目录占用了空间。
  3. 先看 ls -l 的属主和模式位,再看 getfacl 的 ACL,然后确认父目录的 x 权限和挂载选项(如 noexec、nosuid、只读),最后看 SELinux/AppArmor 审计。用 strace -e openat 可以直接看到被拒绝的具体路径和错误码。

相关条目