📁 第02课:文件系统层次结构

阶段一:文件系统 第2/6课

📚 课程目标

一、FHS标准

1.1 什么是FHS

FHS (Filesystem Hierarchy Standard) 定义了Linux目录结构的布局规范,确保不同发行版之间的一致性。当前版本为3.0,由Linux基金会维护。

1.2 根目录结构一览

/
├── bin/     # 基本用户命令(所有用户可用)
├── sbin/    # 系统管理命令(通常root使用)
├── boot/    # 启动加载文件(内核、initrd、GRUB)
├── dev/     # 设备文件(一切皆文件的体现)
├── etc/     # 系统配置文件
├── home/    # 用户家目录
├── root/    # root用户家目录
├── lib/     # 基本共享库
├── lib64/   # 64位共享库
├── media/   # 可移动设备自动挂载点
├── mnt/     # 临时手动挂载点
├── opt/     # 第三方软件安装目录
├── proc/    # 虚拟文件系统(内核与进程信息)
├── sys/     # 虚拟文件系统(硬件与驱动信息)
├── run/     # 运行时数据(PID文件、socket)
├── srv/     # 服务数据目录
├── tmp/     # 临时文件(重启可能清除)
├── usr/     # 用户程序与数据(第二层次)
│   ├── bin/   # 用户命令
│   ├── sbin/  # 非必需系统命令
│   ├── lib/   # 库文件
│   ├── include/ # C头文件
│   ├── share/   # 共享数据(man、doc)
│   └── local/   # 本地编译安装的软件
└── var/     # 可变数据(日志、缓存、邮件)
    ├── log/    # 系统日志
    ├── cache/  # 应用缓存
    ├── lib/    # 应用状态数据
    ├── spool/  # 打印/邮件队列
    └── tmp/    # 持久临时文件

二、核心目录详解

2.1 /bin 和 /sbin — 系统命令

在initramfs和单用户模式下必须可用的命令存放在此。现代发行版中/bin/sbin通常是指向/usr/bin/usr/sbin的符号链接(usr merge)。

$ ls / | head -25
total 10424437
drwxr-xr-x  25 root root       4096 May 19 21:38 .
drwxr-xr-x  25 root root       4096 May 19 21:38 ..
-rw-r--r--   1 root root          0 May 13 10:43 .autorelabel
lrwxrwxrwx   1 root root          7 Apr 22  2024 bin -> usr/bin
drwxr-xr-x   2 root root       4096 Feb 26  2024 bin.usr-is-merged
drwxr-xr-x   3 root root       4096 May 14 12:17 boot
dr-xr-xr-x   2 root root       4096 Apr 23  2024 cdrom
drwxr-xr-x   2 root root       4096 Apr 29  2024 data
drwxr-xr-x  19 root root       3960 May 19 02:15 dev
drwxr-xr-x 130 root root      12288 May 19 21:32 etc
drwxr-xr-x   4 root root       4096 May 13 10:43 home
drwxrwxrwx   1 root root          0 Jan  1  1970 lhcos-data
lrwxrwxrwx   1 root root          7 Apr 22  2024 lib -> usr/lib
lrwxrwxrwx   1 root root          9 Apr 22  2024 lib64 -> usr/lib64
drwxr-xr-x   2 root root       4096 Feb 26  2024 lib.usr-is-merged
drwx------   2 root root      16384 Apr 26  2024 lost+found
drwxr-xr-x   2 root root       4096 Apr 23  2024 media
drwxr-xr-x   2 root root       4096 Apr 23  2024 mnt
drwxr-xr-x   3 root root       4096 May 18 21:13 opt
dr-xr-xr-x 210 root root          0 May 19 02:15 proc
drwx------  17 root root       4096 May 19 21:32 root
drwxr-xr-x  35 root root       1200 May 19 20:04 run
lrwxrwxrwx   1 root root          8 Apr 22  2024 sbin -> usr/sbin
drwxr-xr-x   2 root root       4096 Apr  3  2024 sbin.usr-is-merged
$ ls /bin | head -20
[
aa-enabled
aa-exec
aa-features-abi
aclocal
aclocal-1.16
acpidbg
acpi_listen
add-apt-repository
addpart
addr2line
ambiguous_words
apport-bug
apport-cli
apport-collect
apport-unpack
appstreamcli
apropos
apt
apt-add-repository

2.2 /etc — 系统配置

/etc是系统管理的核心目录,存放几乎所有服务和程序的配置文件。名称源于早期UNIX的"et cetera"。

$ ls /etc | head -25
acpi
adduser.conf
alternatives
apparmor
apparmor.d
apport
apt
bash.bashrc
bash_completion
bash_completion.d
bindresvport.blacklist
binfmt.d
byobu
ca-certificates
ca-certificates.conf
chrony
cloud
cni
console-setup
credstore
credstore.encrypted
cron.d
cron.daily
cron.hourly
cron.monthly

📋 /etc中的重要配置文件

文件用途
/etc/passwd用户账户信息
/etc/shadow用户密码哈希(仅root可读)
/etc/group组信息
/etc/fstab文件系统挂载表
/etc/hostname主机名
/etc/hosts静态DNS解析
/etc/resolv.confDNS解析器配置
/etc/ssh/sshd_configSSH服务端配置
/etc/sudoerssudo权限配置
/etc/crontab系统定时任务
/etc/apt/sources.listAPT软件源
/etc/nginx/nginx.confNginx配置

2.3 /proc — 虚拟文件系统(进程与内核)

/proc是内核暴露给用户空间的接口,内容在内存中动态生成,不占磁盘空间。每个进程有对应的/proc/PID/目录。

$ ls /proc | head -15
1
10
1000
1049
1055
1086
1107
1119
1123
1136
1149
1150
1154
1193
1194
$ head -5 /proc/meminfo
MemTotal:        7870368 kB
MemFree:         1671488 kB
MemAvailable:    5669864 kB
Buffers:          350228 kB
Cached:          3586964 kB
$ head -5 /proc/cpuinfo
processor	: 0
vendor_id	: AuthenticAMD
cpu family	: 23
model		: 49
model name	: AMD EPYC 7K62 48-Core Processor

📋 /proc重要条目

路径内容
/proc/cpuinfoCPU信息
/proc/meminfo内存信息
/proc/version内核版本
/proc/cmdline内核启动参数
/proc/mounts已挂载文件系统
/proc/loadavg系统负载
/proc/uptime运行时间
/proc/PID/status进程状态
/proc/PID/fd/进程打开的文件描述符
/proc/PID/maps进程内存映射
/proc/sys/内核参数(可运行时修改)

2.4 /dev — 设备文件

Linux中"一切皆文件"的最佳体现,硬件设备以文件形式出现在/dev中。udev守护进程动态管理设备节点。

$ ls -la /dev | head -20
total 4
drwxr-xr-x 19 root root        3960 May 19 02:15 .
drwxr-xr-x 25 root root        4096 May 19 21:38 ..
crw-r--r--  1 root root     10, 235 May 19 02:15 autofs
drwxr-xr-x  2 root root         280 May 19 02:16 block
drwxr-xr-x  2 root root          60 May 19 02:15 bsg
crw-rw----  1 root disk     10, 234 May 19 02:15 btrfs-control
drwxr-xr-x  3 root root          60 May 19 02:15 bus
lrwxrwxrwx  1 root root           3 May 19 02:15 cdrom -> sr0
drwxr-xr-x  2 root root        3340 May 19 02:15 char
crw-------  1 root root      5,   1 May 19 02:16 console
lrwxrwxrwx  1 root root          11 May 19 02:15 core -> /proc/kcore
drwxr-xr-x  4 root root          80 May 19 02:15 cpu
crw-------  1 root root     10, 123 May 19 02:15 cpu_dma_latency
crw-------  1 root root     10, 203 May 19 02:15 cuse
drwxr-xr-x  8 root root         160 May 19 02:16 disk
drwxr-xr-x  2 root root          60 May 19 02:15 dma_heap
drwxr-xr-x  3 root root          80 May 19 02:15 dri
crw-------  1 root root     10, 125 May 19 02:15 ecryptfs
crw-rw----  1 root video    29,   0 May 19 02:15 fb0

📋 设备文件类型

设备文件类型说明
/dev/sda, /dev/nvme0n1块设备(b)磁盘
/dev/tty0, /dev/pts/0字符设备(c)终端
/dev/null字符设备黑洞(丢弃所有写入)
/dev/zero字符设备无限输出0x00
/dev/random字符设备随机数(阻塞)
/dev/urandom字符设备随机数(非阻塞)
/dev/stdin, stdout, stderr符号链接标准I/O
# /dev/null 用法示例
# 丢弃输出
command > /dev/null 2>&1

# /dev/zero 创建空文件
dd if=/dev/zero of=/tmp/test.img bs=1M count=10

# /dev/urandom 生成随机数据
head -c 16 /dev/urandom | xxd

2.5 /var — 可变数据

$ du -sh /var/log /var/cache /var/lib 2>/dev/null
97M	/var/log
586M	/var/cache
1.7G	/var/lib

2.6 /sys — 内核对象模型

/sys(sysfs)是2.6内核引入的虚拟文件系统,以结构化方式展示内核对象(kobject)层次,替代了/proc的部分功能。

$ ls /sys | head -15
block
bus
class
dev
devices
firmware
fs
hypervisor
kernel
module
power

三、文件系统挂载

3.1 mount命令

$ mount | head -15
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,nosuid,relatime,size=3894440k,nr_inodes=973610,mode=755,inode64)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)
tmpfs on /run type tmpfs (rw,nosuid,nodev,noexec,relatime,size=787040k,mode=755,inode64)
/dev/vda2 on / type ext4 (rw,relatime)
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,inode64)
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k,inode64)
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate,memory_recursiveprot)
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)
bpf on /sys/fs/bpf type bpf (rw,nosuid,nodev,noexec,relatime,mode=700)
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=32,pgrp=1,timeout=0,minproto=5,maxproto=5,direct,pipe_ino=564)
hugetlbfs on /dev/hugepages type hugetlbfs (rw,nosuid,nodev,relatime,pagesize=2M)
mqueue on /dev/mqueue type mqueue (rw,nosuid,nodev,noexec,relatime)

3.2 /etc/fstab — 自动挂载配置

/etc/fstab定义了系统启动时自动挂载的文件系统。格式为6个字段:

# 设备/UUID    挂载点    文件系统类型    挂载选项    dump  fsck顺序
# UUID=xxx     /        ext4           defaults    0     1
# /dev/sda1    /boot    ext4           defaults    0     2
$ cat /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#                
# / was on /dev/vda2 during curtin installation
/dev/disk/by-uuid/9842d3d6-a839-4127-bda7-f19137effe71 / ext4 defaults 0 1
/swap.img	none	swap	sw	0	0
/swapfile none swap sw 0 0

📋 fstab挂载选项说明

选项说明
defaultsrw,suid,dev,exec,auto,nouser,async
noatime不更新访问时间,提升性能
nodiratime不更新目录访问时间
ro / rw只读 / 读写
noexec禁止执行二进制文件
nosuid忽略SUID位
user允许普通用户挂载

3.3 手动挂载操作

# 查看可用磁盘
lsblk

# 查看UUID
blkid

# 手动挂载
sudo mkdir -p /mnt/data
sudo mount /dev/sdb1 /mnt/data

# 查看挂载信息
findmnt /mnt/data

# 卸载
sudo umount /mnt/data

# 使用UUID挂载(推荐)
sudo mount UUID="xxxx-xxxx" /mnt/data

四、实机操作:探索文件系统

# 1. 查看目录树(前2层)
find / -maxdepth 2 -type d 2>/dev/null | head -50

# 2. 统计各目录文件数量
for dir in /bin /etc /var /usr /proc /sys /dev; do
    echo ": 47 entries"
done

# 3. 查看符号链接
find / -maxdepth 1 -type l 2>/dev/null | while read link; do
    echo " -> "
done

# 4. 查看大文件
find /var -type f -size +100M 2>/dev/null

# 5. 查看SUID文件
find /usr -perm -4000 -type f 2>/dev/null | head -10

五、故障排查

❌ 问题:/proc和/sys目录为空

原因:虚拟文件系统未挂载

# 手动挂载
sudo mount -t proc proc /proc
sudo mount -t sysfs sysfs /sys
sudo mount -t devtmpfs devtmpfs /dev

❌ 问题:mount报"mount point does not exist"

原因:挂载点目录不存在

sudo mkdir -p /mnt/data   # 创建挂载点
sudo mount /dev/sdb1 /mnt/data

❌ 问题:umount报"target is busy"

原因:有进程正在使用该挂载点

# 查看谁在使用
lsof /mnt/data
fuser -v /mnt/data

# 强制卸载(危险,可能导致数据丢失)
sudo umount -l /mnt/data   # 延迟卸载
sudo umount -f /mnt/data   # 强制卸载(NFS)

六、练习

📝 练习1:目录用途匹配

将以下路径与用途对应:

  1. /etc/passwd A. 内核信息
  2. /proc/cpuinfo B. 用户账户
  3. /var/log/syslog C. 设备文件
  4. /dev/sda D. 系统日志
  5. /boot/vmlinuz E. 内核映像

答案:1-B, 2-A, 3-D, 4-C, 5-E

📝 练习2:文件系统探索

# 执行以下命令并记录输出
# 1. 查看根目录各目录大小
du -sh /* 2>/dev/null | sort -rh | head -10

# 2. 查看/usr的子目录结构
ls -la /usr/

# 3. 找出/etc下所有.conf文件
find /etc -name "*.conf" 2>/dev/null | wc -l

# 4. 查看/proc下当前进程
ls -d /proc/[0-9]* | wc -l
🏆

成就解锁:文件系统导航员

✅ 掌握FHS目录结构规范

✅ 理解/proc、/sys、/dev虚拟文件系统

✅ 学会使用mount管理挂载

✅ 能够排查挂载相关问题