你手里这份某高校 Linux 实验大全,光是目录就能列满好几页,从最基础的关机重启、文件复制,一路排到 LVM 扩容、systemd 服务自启、防火墙策略和 SSH 加固。第一次完整做完的人普遍反馈是:体力消耗极大,但收获也极大。这篇文章我想从一个带过实验、也亲手把所有实验重跑过一遍的人的角度,拆一拆这套实验到底在训练什么、哪些环节最容易卡人、以及怎么把它跑得更值。适合刚开始学 Linux 的在校生,也适合正在准备实验课设计的人参考。
1. 这个“大全”到底覆盖了什么:内容框架与实验分类
1.1 教学级实验常见的编排顺序
我最初拿到这套某高校 Linux 实验大全的时候,第一反应是内容多——从开机关机、文件管理一路排到 DNS 服务、防火墙安全策略。后来真按流程做过一轮,才明白它难能可贵的地方不是实验题多,而是顺序排得很讲究。实验清单不是按照命令字母顺序平铺,而是按照“先单机、后多机;先命令、后脚本;先配置、后排错”的逻辑层层递进。
这种编排逻辑对新手非常友好。比如第一类实验只让你在虚拟机上装一个最小化系统,然后反复操练文件目录、查看帮助、文本处理;这时候你不会遇到任何复杂概念,只需要把 ls、cd、grep、find、awk、sed 这些高频命令用到条件反射。中间几组实验开始引入用户、权限、进程、磁盘,这些是横向穿插的普适知识;最后的服务和安全实验则要求把前面所有能力串起来,用一台干净主机把 Web 服务、DNS、防火墙完整搭起来。它其实在模拟一个真实的运维场景:给一台裸机,从头把它变成一个能对外提供服务的环境。
我在带实验课的时候发现,很多学生学 Linux 半途而废,不是因为某个命令难,而是因为没有应用场景,学完就忘。这套实验用“任务”而不是“知识点”来组织内容,每一章都有明确验收标准,比如“能用一条命令找出占用磁盘最大的三个文件”“能通过密钥登录目标主机”,这种验收导向让学习有即时反馈,不容易陷入迷茫。
1.2 实验内容分类与典型课时分布
整套实验可以做一个粗粒度分类。按照教学内容,大致能拆成 8 个方向:基础命令与文本处理、Shell 脚本编程、用户与权限管理、进程与任务调度、存储与文件系统、网络配置与服务、系统监控与日志、安全加固。每个方向的实验数量和侧重点不同,这里给一个我根据实际课时统计的经验比例:
| 实验方向 | 占比 | 核心实验示例 |
|---|---|---|
| 基础命令与文本处理 | 15% | find 查文件、grep 过滤日志、awk 统计 |
| Shell 脚本编程 | 15% | 批量建用户、定期备份、函数与循环 |
| 用户与权限管理 | 10% | sudoers 配置、setuid/setgid、umask |
| 进程与作业调度 | 10% | top 分析、kill 进程、crontab 定时任务 |
| 存储与文件系统 | 10% | fdisk 分区、LVM 扩容、quota 配额 |
| 网络配置与服务 | 20% | IP 配置、SSH 密钥、Web 服务、DNS |
| 系统监控与日志 | 10% | journalctl 查询、logrotate 轮转、sar |
| 安全加固 | 10% | 防火墙规则、SSH 加固、基础审计 |
这些比例会随着课程定位浮动。如果是网络安全方向,最后安全加固的占比会明显上调;如果偏运维方向,网络与服务那块更重。这个表中的分布更适合把 Linux 作为专业基础课的定位,覆盖面广,但每个点都不会深入太多,让学生先建立全景视图。
1.3 实验环境搭建与虚拟化快照管理
做这套实验前,环境准备比想象中重要。如果直接用实体机,一旦 fstab 写错、防火墙策略改完失联,恢复成本很高。所以我强烈建议在虚拟机里跑全套实验,并且养成一个习惯:每个大实验开始前打一个快照,出问题直接回滚,而不是花半小时在系统里“抢救”。
虚拟机平台的选择没有什么硬性要求,常用的虚拟机软件都能胜任。关键是在安装系统时做几个决定:磁盘尽量给大一点,分区时保留一块未分配空间,后面 LVM 实验和 fstab 实验都要用;网络模式建议选 NAT,方便宿主机与虚拟机互通,后面做 Web 访问验证时会非常顺手。装好系统后,我习惯先配好一个最小化快照,再开始做实验。这样无论实验过程把系统折腾成什么样,一条命令回到干净状态,等于给每次实验都加了一个“后悔药”。
2. 核心实验环节的实操拆解与避坑要点
2.1 用户权限实验:sudoers 与 setuid 的细节
用户权限是实验课堂里翻车率最高的部分。表面上看,涉及的无非是 useradd、chmod、chown 几个命令,但真正操作起来,各种边界情况很容易把人卡住。比如最经典的“添加用户到管理员组但仍然无法用 sudo”,在 Ubuntu 系的系统中,要把用户加到 sudo 组而不是 wheel 组;在 RHEL/CentOS 系,则是 wheel 组。不同发行版默认的管理员权限组不一样,实验讲义如果只写一个命令而不区分发行版,学生照抄很容易踩坑。
sudoers 文件本身也是个坑点。实验要求学生给某个用户配置免密 sudo,很多学生直接 vi /etc/sudoers,一旦写错一行,最典型的结果是“sudo 无法使用”,因为 sudo 在每次执行前都会检查配置文件,语法错误直接拒绝所有后续操作。正确的做法是使用 visudo——它不但会锁定文件,退出时还会做语法检查。更安全的思路是在 /etc/sudoers.d/ 下新建独立文件,比如 /etc/sudoers.d/devops,内容写一行:
dev ALL=(ALL) NOPASSWD:ALL这样避免和主文件耦合,检查起来也清晰。如果已经写出语法错误导致 sudo 全挂,不用慌,重启进入单用户模式,或者用系统安装介质进入 emergency shell,把那一行注释掉即可。这里我强烈建议实验者提前养成一个习惯:任何涉及关键配置的修改,改之前备份原文件,改完马上用一个终端验证“还能不能执行 sudo”,不行就立刻恢复。
另一个容易让新手困惑的是 setuid 实验。实验课里常见的要求是“让普通用户能执行某个需要 root 权限的程序”,直观思路是 chmod u+s 程序文件。这个思路对编译好的二进制程序有效,但对脚本基本无效——Linux 内核会主动忽略脚本文件上的 setuid 位,这是安全机制,防止用户通过一个可写的解释器脚本提权。所以如果题目说“写一个脚本并设置 setuid”,要么它考的不是 Linux 平台,要么题目本身不严谨。正确演示场景是:写一个小 C 程序,setuid 位后变成普通用户可执行,程序内部再通过 setuid(getuid()/seteuid) 切换身份。这块更深的原因是 setuid 位实际上是四个数字中的第一个,4000 表示 setuid、2000 表示 setgid、1000 表示 sticky,chmod 4775 这种写法,第一个 4 才是关键。
注意:setuid 实验涉及提权技术,做实验时必须严格在隔离的实验环境里进行,不要对着不信任的脚本随手加 s 位。
2.2 存储与分区实验:fdisk、fstab 与 LVM 的组合操作
存储实验通常会给你一块“新磁盘”,让你完成分区、格式化、挂载、开机自动挂载四个动作。这里有一个很容易被忽略的开头:新加的磁盘在虚拟机里可能显示为 /dev/sdb,但在某些虚拟化平台上可能会变成 /dev/vdb。名字不一样,操作思路完全一样,先 lsblk 看盘符,再动分区工具。
fdisk 操作磁盘要注意三点。第一,别选错磁盘,fdisk /dev/sda 和 fdisk /dev/sdb 只差一个字母,但对系统盘的破坏是灾难级的。第二,操作完分区表后一定要用 partprobe 或 reboot 让内核重新读取,否则 mkfs 时内核还沿用旧分区表,会直接报“设备忙”。第三,分区的大小计算看着简单,实际用 fdisk 的交互式命令时,默认单位是扇区,换算成 MB 要自己心算,容易出错,所以我更推荐在支持 parted 的环境里用parted /dev/sdb mklabel gpt、parted /dev/sdb mkpart primary ext4 1MiB 100%这种非交互方式,脚本可控性强。
格式化之后是挂载与 fstab。实验要求把数据盘挂到 /data 并开机自动挂载。很多学生喜欢写/dev/sdb1 /data ext4 defaults 0 0,这种写法在当前机器上能用,但强烈不推荐,因为设备名在系统重启后可能变化,特别是插了多块磁盘时,/dev/sdb 可能变成 /dev/sdc,挂载就失败了。正确的做法是先用blkid或lsblk -f查到分区的 UUID,然后写UUID=xxxx /data ext4 defaults 0 0。改完 fstab 之后,一定要执行一遍mount -a,它会把 fstab 里的所有条目都尝试挂载一遍,检查语法和挂载点是否正确。最恐怖的坑是 fstab 写错导致开机时系统无法正常进入,如果根分区也被写错,系统会直接进入 emergency mode。这种问题修复起来很费劲,所以实验规则里最好加一条:改 fstab 必须保留当前终端,确保能随时通过另一个 root 会话恢复。
LVM 实验是整套实验里比较有含金量的部分。标准流程是:pvcreate 把物理分区变成物理卷,vgcreate 组合成卷组,lvcreate 切出逻辑卷,再 mkfs 和挂载。这一套操作实际上模拟的是生产环境里的“动态扩容”能力。我特别建议把“扩容逻辑卷”这个动作做一次完整的验证,因为这才是 LVM 区别于传统分区的本质:对卷组剩余空间执行lvextend -l +100%FREE /dev/vg01/lvdata,然后根据文件系统类型执行resize2fs(ext4)或xfs_growfs(xfs),文件系统才能真实变大。实验课里最常见的错误是 lvextend 之后不执行 resize 命令,然后用 df 看,发现容量没变,误以为扩容失败。
2.3 网络与服务实验:从 IP 配置到 systemd 服务自启
网络实验基本是整套实验里最烧脑的一块,因为它牵扯的不只是命令,还有不同发行版的网络管理机制。我这次实验环境主要跑过 Ubuntu 的 netplan 和 RHEL 系列的 systemd-networkd/NetworkManager,记忆深刻的是三者配置文件格式完全不同:netplan 是 YAML,systemd-networkd 是 ini 风格的键值对,NetworkManager 则可以用 nmcli 或 nmtui 操作。好在现在的发行版大多提供了半图形配置入口,建议实验时先用 nmtui 这类工具配通,再去读它生成的配置文件,理解底层格式。
网络实验里的“ping 不通”是最让人崩溃的排查场景。很多学生一遇到 ping 不通就怀疑 IP、掩码、网关,其实十个案例里至少有三个是防火墙拦截。现代发行版默认启用 firewall 或 ufw,ICMP 请求默认可能被丢弃,或者服务端口没有放行。验证思路应该是:先ip addr确认自己有地址,再ip route确认有默认路由,接着确认对端地址可达,最后再用curl之类做端口级探测。把层次拆开,问题就很容易定位到某一层。
服务实验离不开 systemd。写好一个 systemd unit 文件是必须掌握的能力,因为服务没有自启、服务启动失败、服务重启策略不对,这些都会在实验验收时被扣分。一个最小可用的服务单元文件要包含 [Unit] 里的 Description、After,以及 [Service] 里的 ExecStart、Restart,还有 [Install] 里的 WantedBy=multi-user.target。写完放 /etc/systemd/system/ 目录后,必须systemctl daemon-reload,否则 systemd 不认新文件。启动失败时,第一时间用systemctl status xxx.service和journalctl -u xxx.service -e看日志,而不是反复 restart 碰运气。这里有个细节:ExecStart 里的命令如果不是绝对路径,systemd 执行时可能找不到命令;还有 StartLimitBurst 默认值限制服务崩溃后的重启次数,如果你看到“start-limit-hit repeatedly”,那就是这个原因,改配置文件里的 StartLimitIntervalSec 和 StartLimitBurst,或者用 RestartSec 延后重启时间。
2.4 日志与安全实验:journalctl 查询、防火墙与 SSH 加固
日志与安全实验看似独立,其实是前面所有内容的“收口”环节。没有日志,你不知道自己配置的服务为什么失败;没有防火墙,你搭出来的 Web 服务在公网环境下可能活不过几分钟。journalctl 是我在实验里用得最多的日志命令,一张速查就能覆盖大部分场景:journalctl -u 服务名看指定服务日志,-f实时跟踪,--since "10 minutes ago"按时间窗口过滤,-p err只看错误级别以上。这些用法比 cat /var/log/messages 再手动翻页高效得多。
SSH 加固实验里,最常见的问题是密钥认证失败。学生生成好密钥对,把公钥传到服务器,还是提示要输密码。排查顺序很固定:先看 sshd 配置文件里是否开启 PubkeyAuthentication,再确认 authorized_keys 文件路径和权限。私钥权限 600,公钥 644,.ssh 目录 700,这三条缺一不可。如果 .ssh 目录对组或其他用户开放了写权限,sshd 会出于安全考虑直接忽略 authorized_keys 文件。另外还要提醒学生,开启密钥认证后不要马上关掉密码认证,先保留一个 root 终端,确保密钥能登进去,再执行PermitRootLogin prohibit-password和PasswordAuthentication no这些加固项,否则一个配置错误就彻底失联了。
3. 三个典型的完整实验过程记录
3.1 实验一:批量创建 100 个用户并生成密码表
批量建用户是最典型的 Shell 脚本实验,因为它的输出明确、可验证,又涉及循环、变量、密码生成、权限判断等多个知识点。实验要求往往是:创建 stu01 到 stu100 共 100 个用户,每个用户拥有独立家目录,密码随机生成但可以登录。
我的实现思路分三步。第一步,生成用户名列表,这一步不建议手打 100 行,而是用 seq 配合 printf。第二步,循环调用 useradd,加 -m 参数生成家目录,-s 指定默认 shell,密码用随机字符串生成。第三步,把用户名和密码写入一个权限为 600 的文本,方便验收和后续登录。
完整脚本如下,我一般建议学生在这个骨架基础上再自己加参数判断和日志:
#!/bin/bash set -euo pipefail output="/root/user_pass.txt" > "$output" for i in $(seq -w 1 100); do username="stu${i}" password=$(tr -dc 'A-Za-z0-9' < /dev/urandom | head -c 12) useradd -m -s /bin/bash "$username" || { echo "useradd $username failed"; exit 1; } echo "$username:$password" | chpasswd echo "$username:$password" | tee -a "$output" done echo "completed, check $output"这里有两个关键点。一是set -euo pipefail,有任何一个命令失败就立即退出,避免“以为全成功,实际一半失败”;二是密码生成用tr -dc 'A-Za-z0-9'只保留字母和数字,因为纯随机字符串可能带斜杠或空格,在某些登录场景会极其难处理,尤其在实验验收时。输出文件写完后,我习惯再用chmod 600锁紧权限,毕竟里面有明文密码。
脚本写出来之后,别急着交。先跑一遍,然后用tail -5 /etc/passwd查看最后几个用户是否都创建成功,再用id stu50随机抽一个用户验证。批量操作的幂等性也非常重要:如果脚本执行一半中断,第二次运行时,已经创建的用户会报错,脚本可能中途退出,所以最好在 useradd 前加一个判断:grep -q "^${username}:" /etc/passwd || useradd ...,这样支持重复执行。这个小点往往是实验报告里能拿高分的地方。
3.2 实验二:用 Nginx 上线站点并开放外部访问
Web 服务实验是检验学生能不能把网络、权限、服务、防火墙四块知识融合起来。最常见的版本是:在一台全新虚拟机上用 Nginx 跑一个静态页面,并且要求从宿主机或其他虚拟机访问。
我的操作顺序是:先装包,再配页面,再启动服务,最后开防火墙。以 Ubuntu 环境为例,apt install nginx装好后默认的网站根目录在 /var/www/html。大多数学生直接往这个目录放一个 index.html,然后启动服务,会遇到两种报错。第一种是 403 Forbidden,原因是网页目录的权限不足,Nginx worker 进程权限是 www-data,如果用户直接把文件放到一个权限为 700 的目录里再用 alias 指向它,worker 进程没有 x 权限就无法进入目录。解决办法是把目录权限调整到 755,保证其他用户至少可以读和执行。第二种是 curl 在本机可以访问,但外部访问不通,这通常是防火墙没有放行 80 端口。Ubuntu 上执行ufw allow 80/tcp,RHEL 上是firewall-cmd --permanent --add-service=http && firewall-cmd --reload。
启动服务也有规范动作。我用的是systemctl enable --now nginx,这个命令把 enable(开机自启)和 start(立即启动)合成一步。不要用/usr/sbin/nginx这种方式手工启动,因为它无法被 systemd 管理,也不会自动注册开机项。启动后确认监听端口:ss -tlnp | grep :80。这个命令能看到监听端口对应的程序和 PID,如果没输出,说明服务没起来,马上去journalctl -u nginx -e看错误日志。
最后一步是验证。在宿主机上打开虚拟机的 IP,如果页面是默认欢迎页,再换成自己的内容。验证这一步很多学生不做,但我觉得它才是实验的关键——服务不是为了启动而启动,而是要能被别人访问到。实验报告里最好附上 curl 结果和网页截图,这是验收的重要凭证。另外,我每次都会提醒:不要在 root 下直接给 /var/www/html 一刀切设置 777 权限,应该用chown -R www-data:www-data /var/www/html来保证属主正确。
3.3 实验三:通过日志定位高 CPU 异常进程的链路
这套实验大全里比较进阶的部分是系统监控与日志。典型的实验场景是:实验环境里跑着一个隐藏的异常进程,CPU 占用极高,你需要在半小时内通过系统工具找到它,说明它的启动方式、可执行文件位置、以及它到底在干什么。
第一步,打开终端,跑top -b -n 1 | head -20看谁排在 CPU 前面,通常嫌疑进程会占很高的 %CPU。第二步,用ps -fp <PID>查这个进程的完整启动命令,看能不能从参数里得到线索。如果启动命令看不出所以然,就用ls -l /proc/<PID>/exe看它的可执行文件在哪个路径,再用readlink /proc/<PID>/cwd看工作目录。这些 /proc 下的信息比任何第三方工具都可靠,是排查进程的“第一现场”。
拿到可执行文件路径之后,我需要判断它是不是被调度任务拉起的。下一步是检查 crontab:crontab -l看当前用户的 cron,cat /etc/crontab和 /etc/cron.d/ 下的脚本看系统级任务。这里有一个典型的 cron 坑:cron 执行脚本时的 PATH 环境非常精简,如果你在终端手动执行脚本能跑、放 cron 里就报错,通常是因为脚本开头没有定义 PATH,或者使用了相对路径。所以实验里我会把绝对路径和 PATH 写在脚本头部。
日志环节是不可跳过的。我用journalctl -f实时观察系统日志,或者根据时间窗口执行journalctl --since "30 minutes ago"来缩小范围。系统服务相关的日志要看 /var/log/messages 或 /var/log/syslog;用户登录和认证信息在 /var/log/auth.log 或 /var/log/secure,这些路径因发行版而异,最好一起看。完整的排查链路我给学生的口诀是:top 找进程,ps 看命令,/proc 找文件,cron 找来源,日志找痕迹。按这个顺序做下来,绝大多数情况下都能在一个小时内定位到异常进程。
4. 高频报错速查与排错思路实录
4.1 实验里出现频率最高的 9 个问题
我把这几年踩过的坑和学生在实验课上问得最多的报错收敛成一张速查表,方便大家对照。
| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| sudo 执行时报“不在 sudoers 文件中” | 用户未加入管理员组,或加入的组名与发行版不匹配 | usermod -aG sudo/wheel 用户名 |
| 修改 fstab 后系统进入 emergency mode | fstab 语法错误或挂载点不存在 | 用救援模式恢复,注释错误行再 mount -a |
| 服务本机 curl 通但外部不通 | 防火墙未放行端口 | ufw allow / firewall-cmd --add-port |
| SSH 密钥认证被拒绝 | 私钥权限过大或 authorized_keys 路径/权限不符 | 私钥 600,公钥 644,.ssh 目录 700 |
| systemd 服务启动后立即退出 | ExecStart 命令路径不对或环境变量缺失 | 用绝对路径,journalctl -u 查看退出原因 |
| 脚本在终端正常但 cron 不执行 | cron 的 PATH 太精简,命令找不到 | 脚本内用绝对路径并定义 PATH |
| kill -9 无法结束进程 | 僵尸进程或不可中断睡眠状态 | 僵尸进程杀父进程,D 状态等待 I/O |
| 端口被占用无法启动服务 | 前一个服务实例仍在运行 | ss -tlnp 找占用进程,停掉再 start |
| mkfs 时提示“设备忙” | 分区表变更后内核未重新读取 | 执行 partprobe 或重启 |
这张表里的问题,几乎每一个我都在真实实验中碰到过至少两次。比如 sudo 的问题,很多学生以为是权限不足就直接把自己加到 /etc/passwd 里,其实用户存在与否和是否具备 sudo 权限是两个独立维度。还有 SSH 密钥授权失败,十有八九是 .ssh 目录权限被改了,sshd 对目录权限极其敏感,组和其他人有写权限就直接拒绝加载 authorized_keys。
4.2 一条通用排错流程
碰到报错的反应方式,比记住多少命令更重要。我总结了一条适合实验课的通用排错流程,一共四步。
第一步,先看日志,再改操作。绝大多数系统问题都在日志里有记录。服务类的用 journalctl,内核相关的用 dmesg,用户认证相关的看 /var/log/auth.log 或 /var/log/secure。如果不确定看哪个日志,先跑journalctl -p err -b,它会把本次开机以来所有 error 级别以上的日志列出来,信息量大但很值得扫一眼。
第二步,验证状态而非猜测。检查服务有没有在跑,监听端口是不是正确,进程是不是还在。命令组合是systemctl status xxx、ss -tlnp、ps aux | grep xxx三连。用事实代替推测,少走弯路。
第三步,控制变量。网络问题尤其如此:先确认本机地址(ip addr),再确认路由(ip route),然后确认对端(ping),最后确认端口(curl/telnet)。一层一层往下剥,连通性在哪一层断了,答案就在哪一层。
第四步,改动前备份,改动后可回滚。配置文件动之前 cp 一份带 .bak 后缀的备份,执行有风险的命令前先在虚拟机里打一个快照。在实验环境里这个习惯可能显得多余,但到了真实服务器上,这就是救命的操作。
这套流程我一直在实验指导里反复强调,因为它把排查从“碰运气”变成了“流水线”。你可能记不住每个服务的配置项,但只要按照这个顺序走,绝大多数普通问题都能在 10 分钟内解决。
4.3 把“报错现场”变成自己的错题集
实验课上有一个很普遍的现象:学生遇到报错就截图问老师,老师给一句“看看日志”,学生看完日志还是不知道下一步怎么办。问题不在于命令不熟练,而在于没有积累自己的排错经验。我建议大家准备一个属于自己的“排错笔记本”,把每次遇到的报错、当时的环境、原因、最终解决命令记下来,最好附上完整的报错信息截图。
这个习惯的复利效应非常明显。第一次遇到“start-limit-hit”你可能要花 20 分钟查文档,第二次 5 分钟,第三次看到这个关键词就知道是系统默认重启限制在作祟。实验大全里的知识点是有限的,但报错组合是无穷的,把“错题集”做厚,比反复刷命令更有效率。我自己带实验时,也会把典型的报错现场整理成新的“附加实验”,让学生故意改坏一个配置再修复,这种破坏性训练对真实技能的提升比按部就班做十个普通实验都大。
5. 整套实验做完后,我沉淀下来的东西
把整套实验完整走一遍,和只看实验手册是两种体验。我自己的感觉是:这更像一场“强化训练营”,每做完一个实验,不光是命令变熟了,更重要的是建立了一种“系统是一层层搭起来”的直觉。比如你亲手配置过 netplan、启动过 systemd 服务、写过 fstab 自动挂载,以后再遇到“开机起不来”或者“网络不通”,你脑子里自然会浮现出那几个关键配置文件,这就是排查的思路基础。
如果让我给后来者几个具体建议,第一条是不要满足于“照着讲义敲能出结果”,而是每做完一个实验,自己动手把环境推倒重来一次,不看讲义,只看验收目标,独立完成。这个过程才是真正把知识变成技能的环节。第二条是每个实验做完后,加一个属于自己的“扩展小实验”,比如批量建用户之后,再加一个“限制用户只能从某个终端登录”的条件;配置完 Web 服务之后,再加一个“把默认端口从 80 改成 8080”的需求。这样练出来的灵活性,比单纯背命令要有用得多。
最后再分享一个小技巧:把每一次实验的验收结果整理成一张“能力清单”,比如“能独立完成 LVM 扩容”“能通过 journalctl 定位服务启动失败原因”。这套实验做完,这份清单就是你最扎实的 Linux 基础证明。实验大全里学到的东西会过时,但“先看日志、再查状态、最后动手改”的排查习惯永远不会过时,这也算是我从这套实验里获得的最大收益。