🍓 第四章 Linux 系统管理
📄 一句话概括

Linux 只有一棵树,没有 C 盘 D 盘——这一节把根目录下那十几个文件夹逐个交代清楚:谁管程序、谁管配置、谁管数据、谁是虚拟的。外加两个必知的新情况:/usr 合并,和树莓派特有的 /boot/firmware。

📝 本节和前面几节的关系

4-2 教你「怎么找东西」,4-3 教你「谁能动东西」——本节回答「东西为什么在该在的地方」。 3-1 提过一句「文件系统是一棵树不是一堆盘」;本节把这棵树画全。 读完之后再回头看 3-5 的 df -h、2-2 的 /boot/firmware,你会知道那些路径为什么长那样。

一、总纲:一棵树,一个根,没有盘符

对比项 Windows Linux
起点 每个盘一个根:C:\、D:\ 只有一个根:/
分区/U 盘插进来 变成新盘符 E:\ 挂到树上某个目录(如 /media/pi/USB)
路径分隔符 反斜杠 \ 正斜杠 /
大小写 不区分 区分(Notes.txt 和 notes.txt 是两个文件)
💡 「挂载」这个词其实很形象

一块新硬盘或 U 盘插上去,不是「多出一个盘」,而是被挂到已有的树上的某个位置——像往真树上接一个枝。 所以树莓派的 SD 卡插上 U 盘后,你是去 /media/pi/xxx 里找它的文件,而不是找「F 盘」。

再看一眼根目录,其实只有十几个条目:

ls -1 /

二、根下的目录逐个交代(全景表)

先按「用途」分四类记,比按字母背容易得多。

第一类:程序与库(系统自己住的房子)

目录 装什么 一句话
/usr 绝大部分已安装的软件 名字骗人,不是「用户文件」,是 Unix System Resources
/usr/bin 用户能用的可执行程序 ls、python3、apt 都在这儿
/usr/sbin 系统管理类程序 useradd、iptables
/usr/lib 共享库与内部程序 程序依赖的 .so 文件
/usr/share 与架构无关的数据 手册、图标、语言包
/usr/local 你自己手动装的软件 包管理器不碰这里(4-5 会用到)
/opt 第三方整包软件 如某些商业软件整套塞在这儿
/lib /bin /sbin 老位置(现在是快捷方式) 见第三节

第二类:配置与数据(会变的东西)

目录 装什么 一句话
/etc 全系统的配置文件 纯文本,你要改的东西基本都在这(/etc/hostname、/etc/passwd)
/var 一直在变的数据 日志、缓存、数据库文件
/var/log 日志 排查问题必看(syslog、auth.log)
/var/cache 缓存 删了不影响运行
/home 每个用户的家目录 你的东西都在 /home/你的名字,简称 ~
/root root 的家目录 注意它不在 /home 下,是特例
/srv 服务要对外提供的数据 用得少,知道有就行

第三类:启动与设备

目录 装什么 一句话
/boot 开机要用的东西(内核、固件) 树莓派上要再分一层,见第四节
/dev 设备文件 假文件,读写它就是操作硬件(/dev/sda、/dev/ttyAMA0)

第四类:临时与虚拟(重启就清空)

目录 装什么 一句话
/tmp 临时文件 重启清空;Trixie 起还会自动清理 10 天没动的
/run 运行时数据 进程号、socket,重启清空
/proc 内核与进程的实时信息 假的,不在磁盘上(见第五节)
/sys 内核与硬件的接口 同上,改它能调硬件参数
/media 可移动介质自动挂载点 U 盘插上一般出现在这
/mnt 手工临时挂载点 留给管理员自己挂

三、必知的变化:/bin、/sbin、/lib 现在是「快捷方式」

老资料会把 /bin 和 /usr/bin 当两个目录讲——按那套说法,/bin 装「开机必须的」,/usr/bin 装「其余的」。现在的系统已经不这么分了。

老位置 现在实际是
/bin 指向 /usr/bin 的符号链接
/sbin 指向 /usr/sbin
/lib 指向 /usr/lib

这意味着 /bin/bash 和 /usr/bin/bash 是同一个文件。 你可以自己验证:

ls -ld /bin /sbin /lib
# 会看到 lrwxrwxrwx ... /bin -> usr/bin 这一类输出
⚠️ 这个变化为什么值得单独讲

① 老教程里「把程序放 /usr/local/bin 还是 /bin」的纠结已经没有意义了——它们最终都在同一棵子树下。 ② 名字变了之后,PATH 里同时出现 /bin 和 /usr/bin 不是重复,也不是浪费(4-1 里 echo $PATH 那个输出就解释了)。 ③ 别手动去「合并」它:现在的系统在安装时就已经是合并状态了;如果 systemctl 提示 System is tainted: unmerged-bin,那是在说「你这台机器的目录结构比较特殊」——官方建议是忽略它,不要自己动手改(手动合并会破坏后续升级)。

一句话:/bin = /usr/bin,当成同一个地方就行。

四、树莓派特有的:/boot/firmware

普通 Linux 的开机文件在 /boot。树莓派从 Bookworm 起多了一层:

老路径(旧系统/老教程) 现在的真实路径
/boot/config.txt /boot/firmware/config.txt
/boot/cmdline.txt /boot/firmware/cmdline.txt

为什么要这么改:把「固件(GPU 启动代码)读的配置」和「Linux 内核用的文件」分开放——/boot/firmware 是那个单独的小分区(VFAT),/boot 剩下的才留给内核和 initramfs。

🚨 这是本课最容易照着老教程踩空的一处

改串口、开 I2C/SPI、超频、强制 HDMI 分辨率这些操作,全都要编辑 /boot/firmware/config.txt。 老教程写 /boot/config.txt——在新系统上你要么找不到这个文件,要么改了个「不生效的副本」(有些版本里它只是个普通文件或失效链接,改了系统根本不读)。 动手前先确认路径:

ls -l /boot/firmware/config.txt
cat /boot/firmware/cmdline.txt      # 看得到内容,就说明路径对了

改之前先备份:sudo cp /boot/firmware/config.txt /boot/firmware/config.txt.bak——这个文件改错可能开不了机。

顺便认一下这个分区里还有什么(2-2 烧录时你其实见过):

ls /boot/firmware
# 常见:config.txt、cmdline.txt、overlays/(硬件覆盖层)、start*.elf、kernel*.img

五、那些「不在磁盘上」的目录:虚拟文件系统

/proc、/sys、/dev、/run 有个共同点:它们看起来是目录、能 ls、能 cat,但磁盘上并没有对应的数据——它们是内核实时生成的窗口。

目录 看什么 试一下
/proc 进程与内核状态 cat /proc/cpuinfo、cat /proc/version
/proc/<数字> 每个进程一个目录,数字就是 PID ls /proc/self 看当前 Shell 自己
/sys 内核与硬件的接口 cat /sys/class/thermal/thermal_zone0/temp(CPU 温度)
/dev 设备 ls /dev/tty*
/run 运行时数据 重启后内容全变
💡 为什么值得知道

① 树莓派上查型号、查温度、查 CPU 信息,用的就是这些路径——第一章 1-2 提过 cat /proc/device-tree/model,就是这一类。 ② 别对它们做备份、别往里放东西:它们是「镜子」,不是「柜子」。往里写有时会改硬件设置,有时直接报错。 ③ 所以 du -sh /proc 得到 0 是正常的——它本来就没占磁盘。

六、五个「看着像」的目录,一次分清

新手最容易混的就是这一组:

目录 谁的东西 怎么记
/usr/local 你自己编译/手动装的软件 官方发行的软件不在这儿,重装系统前值得备份
/opt 第三方整套软件 一个软件一个文件夹,自成一体
/srv 服务对外提供的数据 如网站文件(用得少)
/media U 盘等自动挂载 插上自动出现,拔了就没了
/mnt 手动临时挂载 空着是正常的,是你自己用的

一句话:local 是我装的,opt 是别人整套塞的,srv 是给外人看的,media 是插进来的,mnt 是我自己挂的。

再补一条实用判断:「我的项目文件该放哪?」

情况 放哪
自己的代码、笔记、脚本 ~(家目录)下随便建,如 ~/projects
想给全系统用的小工具 /usr/local/bin(4-2 讲 PATH 时提过它在这条路上)
树莓派专属的硬件小项目 家目录下建,别放 /boot/firmware
开机参数、硬件开关 /boot/firmware/config.txt
服务/程序的配置 /etc/xxx

七、动手 Demo:把整棵树走一遍

在树莓派上依次跑这九步(每步对应上面某一节):

# 1. 先看根目录到底有哪些条目
ls -1 /

# 2. 验证「/bin 是 /usr/bin 的快捷方式」
ls -ld /bin /sbin /lib

# 3. 验证「同一个文件两个路径」——两条命令结果应完全一致
ls -l /bin/bash
ls -l /usr/bin/bash

# 4. 树莓派专属:确认启动配置在哪一层
ls /boot/
ls /boot/firmware/ | head
test -f /boot/firmware/config.txt && echo "✅ 启动配置在 /boot/firmware/config.txt"

# 5. 虚拟目录:看一眼内核与硬件的实时窗口
cat /proc/version
cat /proc/device-tree/model; echo        # 板子型号(1-2 提过)
awk '{printf "CPU温度: %.1f°C\n", $1/1000}' /sys/class/thermal/thermal_zone0/temp

# 6. 虚拟目录不占磁盘
du -sh /proc /sys 2>/dev/null

# 7. 谁在占磁盘:按分区看
df -h

# 8. 看挂载关系(比 df 更清楚:谁挂在哪一层)
findmnt --tree | head -n 20

# 9. 认一下几个「像」的目录
ls -d /usr/local /opt /srv /media /mnt 2>/dev/null
ls /etc | head -n 12

看到什么算成功:

步骤 预期
2 三行都以 l 开头,形如 /bin -> usr/bin
3 两条命令的输出一模一样(除了路径那一行)——同一个文件
4 /boot/ 里有 firmware;/boot/firmware/ 里有 config.txt、cmdline.txt;最后打印 ✅…
5 版本信息;Raspberry Pi 4 Model B/5 Model B 之类的型号;CPU 温度是个 30~70 之间的数
6 输出基本是 0(虚拟目录不占空间)
7 你会看到 /boot/firmware 单独占一个小分区(几百 MB)——这就是第四节那层结构的实证
8 树形结构里能看到 /、/boot/firmware、/proc、/sys 各自的挂载点
9 五个目录都在(/mnt 大多数时候是空的,正常)

「读结果」提示:第 7、8 两步连起来看,你会第一次真切地看到「分区是怎么挂到树上的」——这比背目录表有用得多。

八、30 秒实验

验证「/tmp 是临时区、重启就清、而且现在还会自动清老文件」。

# 1. 在 /tmp 里放一个带标记的文件
echo "test" > /tmp/我的临时文件.txt
ls -l /tmp/我的临时文件.txt

# 2. 同时,在家目录放一个对照组
echo "test" > ~/我的正式文件.txt

# 3. 看一眼规则(Trixie 起 /tmp 的老文件会被自动清理)
systemctl status systemd-tmpfiles-clean --no-pager | head -n 6

# 4. 重启(这一步可选,做了就验证「重启清空」)
# sudo reboot

# 5. 重启回来后看两个文件
# ls /tmp/我的临时文件.txt      → 应该没了
# ls ~/我的正式文件.txt          → 还在

这 30 秒你收获的是:「临时」在 Linux 里是有明确边界的——/tmp 里的东西不保证活着,/home 里的才算你的。以后写脚本要用临时文件,就放 /tmp,别在家目录里堆垃圾。

(不想重启的话,跑完第 1、3 步,再 rm ~/我的正式文件.txt /tmp/我的临时文件.txt 收尾即可。)

九、常见误区

自测三问 1. Linux 全系统的配置文件、日志、你自己的文件,分别在哪个目录下?(**配置=`/etc`;日志=`/var/log`(在 `/var` 下);你的文件=`/home/你的名字`(`~`)**) 2. 树莓派上要开一个硬件接口(如 I2C),该改哪个文件?(**`/boot/firmware/config.txt`**——不是 `/boot/config.txt`) 3. `/bin`、`/usr/bin` 是什么关系?(**`:bin` 只是指向 `/usr/bin` 的符号链接,同一个地方**;`/bin/bash` 和 `/usr/bin/bash` 是同一个文件)

相关笔记