跳到主要内容

Linux 系统工程与内核原语实战

“Linux 是现代计算世界的基石。” —— 本专题涵盖从基础命令、权限模型到 Shell 脚本工程化及内核原语的深度练习。


🪜 练习阶梯与评价标准

等级难度目标核心考察点期望达成
Level A常用命令熟练度文件权限、管道/重定向、grep/find实现日常开发自动化
Level BShell 脚本工程化流程控制、正则表达式、进程管理编写工业级运维脚本
Level C内核原理与调优系统调用、内存映射、网络栈优化理解 OS 底层运行逻辑

🎯 考点覆盖模型 (Knowledge Matrix)

知识模块核心考点关联习题推荐等级
文件系统权限掩码 (umask)、硬链接 vs 软链接练习 1, 4Level A
文本处理awk 字段提取、sed 流编辑练习 2Level B
进程管理僵尸进程处理、信号量传递 (kill)练习 3Level B
Shell 编程变量作用域、函数递归、错误捕获练习 5Level B
内核原语系统调用跟踪 (strace)、虚拟内存布局练习 6Level C

📂 核心习题库

Level A:基础巩固 (Foundations)

练习 1:精密文件权限控制

题目描述:如何将文件 secure.key 设置为:仅所有者可读写(不可执行),所属组可读(不可写),其他用户没有任何权限?并说明对应的八进制表示。

Check Solution (Thought Chain & Command)

解题思维链

  1. 权限映射
    • 所有者:Read (4) + Write (2) = 6
    • 所属组:Read (4) = 4
    • 其他:None (0) = 0
  2. 命令合成:使用 chmod 命令。

命令实现

chmod 640 secure.key

验证: 执行 ls -l secure.key,应显示 -rw-r-----

练习 2:高效日志筛选

题目描述:从 access.log 中提取出所有返回状态码为 404 的请求行,并统计这些请求的总数。

Check Solution

命令实现

grep " 404 " access.log | wc -l

或使用 awk

awk '$9 == 404 {print $0}' access.log | wc -l

Level B:综合提升 (Intermediate)

练习 3:僵尸进程 (Zombie Process) 的识别与处理

题目描述

  1. 找出系统中当前所有的僵尸进程。
  2. 解释为什么僵尸进程不能被 kill -9 直接杀死,以及正确的处理方式。
Check Solution

解题思维链

  1. 识别:僵尸进程的状态码为 Z
  2. 本质:僵尸进程已经是死亡的进程,只保留了 PCB 信息供父进程读取。
  3. 处理:无法杀死死人。必须让父进程调用 wait();如果父进程已死,则应杀掉其父进程,让僵尸进程被 init (PID 1) 接管并回收。

操作方案

ps -ef | grep 'defunct' # 或 ps aux | awk '$8=="Z"'

练习 4:软链接与硬链接的底层区别

题目描述:创建一个文件 a.txt,分别创建其硬链接 hard.lnk 和软链接 soft.lnk。删除 a.txt 后,两个链接的行为有何不同?请从 Inode 的角度解释。

Check Solution

Inode 解析

  1. 硬链接:指向相同的 Inode 号。删除 a.txt 只会将引用计数减 1,hard.lnk 依然可以访问文件内容。
  2. 软链接:包含目标文件的路径名。删除 a.txt 后,路径失效,soft.lnk 变为死链接。

Level C:竞赛挑战 (Advanced)

练习 5:健壮性 Shell 脚本编写

题目描述:编写一个脚本 backup.sh,将 /data 目录压缩备份到 /backup,要求:

  1. 检查目标目录是否存在,不存在则创建。
  2. 备份文件名带上时间戳。
  3. 如果备份过程中出现任何错误,立即停止脚本并发送错误信息(可以用 echo 模拟)。
Check Solution (Industrial Implementation)
#!/bin/bash
# 开启严密模式:遇到错误即退出,变量未定义报错
set -euo pipefail

SOURCE="/data"
DEST="/backup"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
FILE="backup_$TIMESTAMP.tar.gz"

# 检查权限与目录
if [[ ! -d "$DEST" ]]; then
mkdir -p "$DEST" || { echo "Error: Failed to create $DEST"; exit 1; }
fi

# 执行备份
echo "Starting backup of $SOURCE to $DEST/$FILE..."
tar -czf "$DEST/$FILE" "$SOURCE" 2>/dev/null

echo "Backup completed successfully."

练习 6:系统调用跟踪 (System Call Tracing)

题目描述:使用 strace 命令观察一个简单的 cat hello.txt 命令,找出它打开文件、读取内容并写入标准输出所对应的核心系统调用。

Check Solution

核心系统调用链

  1. openat(AT_FDCWD, "hello.txt", O_RDONLY):打开文件。
  2. fstat(...):检查文件状态。
  3. read(fd, buf, count):从文件描述符读取。
  4. write(1, buf, count):写入标准输出 (1)。
  5. close(fd):关闭文件。

🏆 训练建议

  1. 熟练掌握管道:尝试用一行命令组合 ps, grep, awk, sort, uniq 完成复杂的统计任务。
  2. 理解三剑客grep 负责过滤,sed 负责替换,awk 负责报表分析。
  3. 内核意识:在编写代码时,时刻意识到每一个 I/O 操作背后都触发了用户态到内核态的上下文切换。