本文系统归纳 Linux 文件系统核心知识:目录树与 FHS 标准、根目录 / /usr / /var 详解、文件系统类型对比、inode 与 Block 深入、硬链接与软链接、文件权限与特殊权限、/proc 与 /sys 虚拟文件系统、磁盘分区与挂载实战。与《Linux命令完全指南》及《Shell命令与基础》配合使用,内容只增不减。
目录
- [一、目录树与 FHS 的由来](#一、目录树与 FHS 的由来)
- [二、FHS 的四种目录形态](#二、FHS 的四种目录形态)
- [三、根目录 (/) 的意义与内容](#三、根目录 (/) 的意义与内容)
- [四、/usr 的意义与内容](#四、/usr 的意义与内容)
- [五、/var 的意义与内容](#五、/var 的意义与内容)
- 六、目录树特性与不可与根分离的目录
- 七、绝对路径与相对路径
- [八、Linux 文件类型与扩展名](#八、Linux 文件类型与扩展名)
- [九、文件属性与 inode 深入](#九、文件属性与 inode 深入)
- 十、硬链接与软链接
- 十一、文件系统类型对比
- 十二、文件权限与特殊权限
- [十三、/proc 与 /sys 虚拟文件系统](#十三、/proc 与 /sys 虚拟文件系统)
- 十四、磁盘分区与挂载实战
- 十五、综合速查与练习
一、目录树与 FHS 的由来
1.1 Linux 文件系统整体结构

1.2 概念说明
- 在 Linux 下执行
ls -l /,可见根下有很多目录(如 etc、usr、var、bin 等),整体呈树形结构。 - 文件系统 用于组织和排列文件存取,是可见的;Linux 中由 / 起始的树形结构即为文件系统的入口。
- 根目录 /:Linux 文件系统的顶端,称为 root;所有目录、文件、设备都在 / 之下,/ 是文件系统的组织者和最上级。
- 因 Linux 开放源码,各发行版根下目录差异较大,为统一规范,FHS(Filesystem Hierarchy Standard) 应运而生。
- FHS 的主要目的:让使用者了解已安装软件通常放在哪个目录,使独立软件开发商、操作系统制作者和用户都能遵循同一标准;重点在于规范每个特定目录下应放置什么数据。
- 参考:http://www.pathname.com/fhs/。
1.3 Linux 与 Windows 文件系统对比
| 对比项 | Linux | Windows |
|---|---|---|
| 根起点 | 唯一根目录 / |
多个驱动器 C:\ D:\ |
| 路径分隔符 | /(斜杠) |
\(反斜杠) |
| 大小写 | 严格区分 | 默认不区分 |
| 文件类型判断 | 权限位(x)决定是否可执行 | 靠扩展名(.exe .bat) |
| 隐藏文件 | 以 . 开头的文件名 |
文件属性设置 |
| 设备访问 | 通过 /dev/ 下的文件 |
通过驱动器字母 |
| 配置文件 | 纯文本文件(/etc/) | 注册表 + 文件 |
二、FHS 的四种目录形态
FHS 按「是否可分享」与「是否可变动」将目录分为四类:
FHS 目录分类
可分享 Shareable
不可分享 Unshareable
不变 Static
/usr /opt
可变 Variable
/var/mail
不变 Static
/etc /boot
可变 Variable
/var/run /var/lock
| 可分享的 (shareable) | 不可分享的 (unshareable) | |
|---|---|---|
| 不变的 (static) | /usr(软件)、/opt(第三方) | /etc(配置)、/boot(开机与内核) |
| 可变动的 (variable) | /var/mail、/var/spool/news | /var/run、/var/lock |
| 属性 | 说明 | 典型例子 |
|---|---|---|
| 可分享 | 可被其他系统挂载使用 | 执行文件、用户邮件 |
| 不可分享 | 仅与本机相关 | 设备文件、socket、运行时数据 |
| 不变 | 安装后很少变动 | 库文件、说明文件、服务配置 |
| 可变 | 经常变化 | 日志、新闻组、队列数据 |
FHS 主要定义三层目录:
| 层级 | 目录 | 全称 | 说明 |
|---|---|---|---|
| 第一层 | / | root | 与开机系统有关 |
| 第二层 | /usr | Unix Software Resource | 与软件安装与执行有关 |
| 第三层 | /var | variable | 与系统运行过程有关 |
三、根目录 (/) 的意义与内容
- 根目录是最重要的目录:所有目录由根衍生,且与开机/还原/系统修复有关。
- FHS 建议:根分区应尽量小,应用程序最好不与根放在同一分区,以提升效能并降低根文件系统出错概率(类似 Windows 的 C 盘)。
3.1 根目录下主要子目录及用途
| 目录 | 应放置内容 |
|---|---|
| /bin | 单人维护模式下仍可用的基本命令,如 cat, chmod, chown, date, mv, mkdir, cp, bash 等;root 与普通用户均可使用。 |
| /boot | 开机所需文件:内核(如 vmlinuz)、开机选单、grub 等;若用 grub 则有 /boot/grub/。 |
| /dev | 设备文件;通过访问该目录下文件即访问设备。重要:/dev/null, /dev/zero, /dev/tty, /dev/lp*, /dev/hd*, /dev/sd*。 |
| /etc | 系统主要配置文件:账号密码、服务启动脚本等;一般用户可读,仅 root 可改。重要:/etc/inittab, /etc/init.d/, /etc/fstab, /etc/sysconfig/。 |
| /home | 普通用户家目录。~ 表示当前用户家目录,~guest 表示用户 guest 的家目录。 |
| /lib | 开机与 /bin、/sbin 所需库;/lib/modules/ 为内核模块。 |
| /lib64 | 64 位系统的共享库(与 /lib 对应的 64 位版本)。 |
| /media | 可移动媒体挂载点(如软盘、光盘、DVD、U 盘)。 |
| /mnt | 临时挂载点(管理员手动挂载外部设备的位置)。 |
| /opt | 第三方可选软件(如 Oracle、Google Chrome 等非发行版自带软件)。 |
| /root | root 用户家目录;建议与根目录同分区,便于单人维护时挂载根即可访问。 |
| /run | 运行时数据(tmpfs),开机后生成,存放 PID 文件等(替代旧的 /var/run)。 |
| /sbin | 系统管理命令,多为 root 使用;如 fdisk, fsck, ifconfig, init, mkfs, reboot。 |
| /srv | 服务数据(如 WWW 网页可放 /srv/www/,FTP 数据放 /srv/ftp/)。 |
| /tmp | 临时文件,所有人可写;建议开机时可清理。通常设有 Sticky Bit。 |
| /usr | 用户程序与只读数据(见下一节)。 |
| /var | 可变数据(见第五节)。 |
3.2 其他常见目录
| 目录 | 说明 |
|---|---|
| /lost+found | ext2/ext3/ext4 文件系统在发生错误时存放恢复片段的目录;每个分区顶层可有该目录。 |
| /proc | 虚拟文件系统,数据在内存中,不占磁盘;如 /proc/cpuinfo, /proc/meminfo(详见第十三节)。 |
| /sys | 与 /proc 类似,虚拟文件系统,记录内核与硬件信息,不占磁盘(详见第十三节)。 |
3.3 /dev 下重要设备文件
| 设备文件 | 说明 |
|---|---|
/dev/null |
空设备(黑洞),写入即丢弃,读取立即返回 EOF |
/dev/zero |
零设备,读取返回无限 \0,常用于创建空文件 |
/dev/random |
真随机数生成器(可能阻塞) |
/dev/urandom |
伪随机数生成器(不阻塞) |
/dev/tty |
当前终端 |
/dev/sda |
第一块 SATA/SCSI 磁盘 |
/dev/sda1 |
第一块磁盘的第一个分区 |
/dev/nvme0n1 |
第一块 NVMe SSD |
/dev/loop0 |
回环设备(挂载镜像文件) |
/dev/sr0 |
光驱 |
bash
# 常见用法
echo "test" > /dev/null # 丢弃输出
dd if=/dev/zero of=blank.img bs=1M count=100 # 创建 100MB 空文件
dd if=/dev/urandom bs=32 count=1 | base64 # 生成随机字符串
四、/usr 的意义与内容
- /usr 不是 "user" 的缩写,而是 Unix Software Resource,即与软件安装/执行相关的只读数据。
- 可分享、不可变;若通过 NFS 挂载,可被多台主机共享。
- 类似 Windows 的
C:\Windows\+C:\Program files\的综合。
4.1 常见子目录
| 目录 | 说明 |
|---|---|
| /usr/bin | 绝大部分用户命令;与 /bin 区别在于是否与开机过程有关。 |
| /usr/sbin | 非开机必需的系统命令(如网络服务 daemon)。 |
| /usr/lib | 各应用库、目标文件;x86_64 上可有 /usr/lib64。 |
| /usr/include | C/C++ 头文件(#include 引用的文件存放处)。 |
| /usr/local | 本机自行安装的软件(非发行版默认),便于与发行版软件区分。 |
| /usr/local/bin | 本地安装软件的可执行文件。 |
| /usr/local/lib | 本地安装软件的库文件。 |
| /usr/local/etc | 本地安装软件的配置文件。 |
| /usr/share | 与架构无关的共享数据,如 man、doc、zoneinfo。 |
| /usr/share/man | 在线手册页。 |
| /usr/share/doc | 软件文档。 |
| /usr/share/zoneinfo | 时区数据。 |
| /usr/src | 源码;内核源码常放在 /usr/src/linux/。 |
4.2 /bin 与 /usr/bin 的关系
注意 :在现代 Linux 发行版(如 CentOS 7+、Fedora、Ubuntu 等)中,
/bin已合并为/usr/bin的符号链接,/sbin合并为/usr/sbin的符号链接,/lib合并为/usr/lib的符号链接。这称为 UsrMerge。
bash
ls -ld /bin # lrwxrwxrwx 1 root root 7 ... /bin -> usr/bin
ls -ld /sbin # lrwxrwxrwx 1 root root 8 ... /sbin -> usr/sbin
ls -ld /lib # lrwxrwxrwx 1 root root 7 ... /lib -> usr/lib
五、/var 的意义与内容
- /var 存放可变数据,随系统运行逐渐占用空间。
5.1 常见子目录
| 目录 | 说明 | 典型内容 |
|---|---|---|
| /var/cache | 应用程序缓存 | yum/apt 下载缓存 |
| /var/lib | 程序运行所需持久数据 | /var/lib/mysql、/var/lib/rpm、/var/lib/docker |
| /var/lock | 锁文件,保证设备或资源一次只被一个程序使用 | 串口设备锁 |
| /var/log | 日志目录(最重要) | messages、syslog、auth.log、wtmp、secure |
| /var/mail | 用户邮箱(常与 /var/spool/mail 互为链接) | 用户收件箱 |
| /var/run | 运行中程序的 PID 等(现代系统常为 /run 的链接) | sshd.pid |
| /var/spool | 队列数据 | mail、cron(crontab)、mqueue、cups |
| /var/tmp | 比 /tmp 更持久的临时文件(重启不一定清理) | 编译中间文件 |
5.2 /var/log 下重要日志文件
| 日志文件 | 说明 | 查看命令 |
|---|---|---|
/var/log/messages |
系统综合日志(CentOS/RHEL) | tail -f /var/log/messages |
/var/log/syslog |
系统综合日志(Debian/Ubuntu) | tail -f /var/log/syslog |
/var/log/auth.log |
认证与授权日志 | cat /var/log/auth.log |
/var/log/secure |
安全日志(CentOS/RHEL) | cat /var/log/secure |
/var/log/dmesg |
内核环形缓冲区日志 | dmesg |
/var/log/wtmp |
登录/注销记录(二进制) | last |
/var/log/btmp |
失败登录记录(二进制) | lastb |
/var/log/lastlog |
每个用户最后登录记录 | lastlog |
/var/log/cron |
定时任务日志 | cat /var/log/cron |
/var/log/boot.log |
系统启动日志 | cat /var/log/boot.log |
六、目录树特性与不可与根分离的目录
6.1 目录树特性
| 特性 | 说明 |
|---|---|
| 唯一根起点 | 起点为根目录 /,所有文件从此衍生 |
| 可挂载不同设备 | 每个目录可使用本地分区或网络文件系统(如 NFS) |
| 路径唯一性 | 每个文件在目录树中的完整路径名唯一 |
| 多设备统一 | 不同磁盘/分区通过挂载统一在同一棵目录树中 |
6.2 不可与根目录分开的目录(必须与 / 同分区)
/ 根分区
/etc 配置文件
/bin 基本命令
/dev 设备文件
/lib 共享库
/sbin 系统命令
| 目录 | 必须同根分区的原因 |
|---|---|
| /etc | 配置文件,开机时需读取 |
| /bin | 基本命令,单人维护模式必需 |
| /dev | 设备文件,内核启动早期需要 |
| /lib | 共享库与内核模块,/bin 和 /sbin 依赖 |
| /sbin | 系统管理命令,开机修复必需 |
原因:开机过程中仅挂载根分区,上述目录若在不同分区则无法在开机早期使用。
6.3 可独立分区的目录
| 目录 | 独立分区的好处 |
|---|---|
| /home | 用户数据隔离,系统重装不影响 |
| /var | 日志增长不影响根分区 |
| /tmp | 临时文件过大不影响系统 |
| /boot | GRUB 引导需求,某些场景需独立分区 |
| /usr | 大量软件安装,独立管理 |
| /opt | 第三方软件独立管理 |
七、绝对路径与相对路径
7.1 概念对比
路径
绝对路径
从 / 开始
相对路径
从当前目录开始
/home/user/file
/etc/passwd
./file
../var/log
| 类型 | 定义 | 开头 | 示例 |
|---|---|---|---|
| 绝对路径 | 从根目录 / 写起的完整路径 | / |
/home/user/.bashrc |
| 相对路径 | 相对于当前目录的路径 | 非 / |
./file、../var/log |
7.2 特殊目录符号
| 符号 | 含义 | 示例 |
|---|---|---|
. |
当前目录 | ./script.sh(执行当前目录下的脚本) |
.. |
上一级目录 | cd ..(返回上级) |
~ |
当前用户家目录 | cd ~(回家目录) |
~USER |
指定用户家目录 | cd ~guest |
- |
上一次工作目录(仅用于 cd) | cd -(来回切换) |
7.3 示例
bash
# 当前在 /home,要进入 /var/log
cd /var/log # 绝对路径
cd ../var/log # 相对路径
# 先在 /var/spool/mail,再进 /var/spool/cron
cd /var/spool/mail
cd ../cron # 相对路径更简洁
# 执行当前目录下的脚本(当前目录不在 PATH 中时必须用 ./)
./run.sh
# 来回切换两个目录
cd /etc
cd /var/log
cd - # 回到 /etc
cd - # 又回到 /var/log
八、Linux 文件类型与扩展名
8.1 文件类型(ls -l 第一字符)
Linux 文件类型
- 普通文件 d 目录
l 符号链接
b 块设备
c 字符设备
s 套接字
p 管道
文本文件
二进制文件
数据文件
| 字符 | 类型 | 说明 | 典型示例 |
|---|---|---|---|
| - | 普通文件 | 文本、二进制、数据文件等 | /etc/passwd、/bin/ls |
| d | 目录 | 目录文件 | /home、/etc |
| l | 符号链接 | 类似快捷方式 | /bin -> usr/bin |
| b | 块设备 | 按块读写的设备 | /dev/sda、/dev/nvme0n1 |
| c | 字符设备 | 按字符读写的设备 | /dev/tty、/dev/null |
| s | 套接字 | Socket 通信文件 | /var/lib/mysql/mysql.sock |
| p | 管道 | FIFO(命名管道) | mkfifo 创建的文件 |
普通文件细分:
| 子类型 | 说明 | 查看方式 |
|---|---|---|
| 纯文本(ASCII) | 人类可读的文本 | cat、less |
| 二进制(binary) | 编译后的可执行程序 | file 命令识别 |
| 数据格式(data) | 特定格式的数据文件 | 需专用命令(如 last 读 wtmp) |
8.2 扩展名(仅供参考)
- Linux 不靠扩展名判断是否可执行,可执行与否由权限位(x)决定。
- 常见扩展名约定仅便于人类识别,不影响执行。
| 扩展名 | 类型 | 说明 |
|---|---|---|
.sh |
脚本 | Shell 脚本 |
.py |
脚本 | Python 脚本 |
.conf / .cfg |
配置 | 配置文件 |
.log |
日志 | 日志文件 |
.tar.gz / .tgz |
压缩 | tar + gzip 压缩包 |
.tar.bz2 |
压缩 | tar + bzip2 压缩包 |
.tar.xz |
压缩 | tar + xz 压缩包 |
.zip |
压缩 | zip 压缩包 |
.rpm |
包 | Red Hat 系安装包 |
.deb |
包 | Debian 系安装包 |
.so |
库 | 共享库文件 |
.html / .php |
网页 | Web 文件 |
8.3 文件名限制
| 规则 | 说明 |
|---|---|
| 单一文件/目录名 | 最长 255 字符 |
| 完整路径名 | 最长 4096 字符 |
| 禁用字符 | 仅 / 不能用作文件名(\0 也不行) |
| 大小写 | 严格区分 (File.txt 和 file.txt 是两个文件) |
以 . 开头 |
隐藏文件(ls -a 可见) |
| 避免字符 | `* ? > < ; & ! [ ] |
| 避免开头 | 不建议用 - 或 + 开头(易与选项混淆) |
bash
# 查看文件类型
file /bin/ls # ELF 64-bit LSB executable
file /etc/passwd # ASCII text
file image.png # PNG image data
file /dev/null # character special
# 查看包含隐藏文件
ls -a # 显示所有文件
ls -A # 显示所有但不包括 . 和 ..
九、文件属性与 inode 深入
9.1 文件系统结构总览
磁盘
分区
文件系统
超级块
Superblock
inode 区
元数据
Block 区
实际数据
文件系统大小
inode/block 总数
空闲数量等
权限 属主 属组
大小 时间戳
数据块指针
文件实际内容
目录条目等
9.2 inode 详解
inode(索引节点) 是 Linux 文件系统的核心数据结构,存储文件的元数据而非文件名和数据内容。
inode 存储的信息
| 信息 | 说明 |
|---|---|
| 文件类型 | 普通文件、目录、符号链接等 |
| 权限 | 读®、写(w)、执行(x) |
| 属主 UID | 文件所有者 |
| 属组 GID | 文件所属组 |
| 文件大小 | 字节数 |
| atime | 最后访问时间(Access Time) |
| mtime | 最后内容修改时间(Modify Time) |
| ctime | 最后属性改变时间(Change Time) |
| 硬链接数 | 指向此 inode 的目录条目数 |
| 数据块指针 | 指向文件实际数据所在的 Block |
重要 :inode 不存储文件名 。文件名存储在目录条目中(目录也是一种文件,其数据块存储的是「文件名 → inode 号」的映射表)。
inode 与 Block 的关系
| 概念 | 说明 | 典型大小 |
|---|---|---|
| 扇区(Sector) | 磁盘最小物理存储单位 | 512 字节 |
| Block | 文件系统最小逻辑存取单位(= 连续扇区) | 1KB / 2KB / 4KB(默认) |
| inode | 索引节点,存储元数据 | 128 或 256 字节 |
| Superblock | 超级块,文件系统全局信息 | 1KB |
目录条目
filename → inode 号
inode
权限 大小 时间
数据块指针
直接指针
12 个
一级间接指针
二级间接指针
三级间接指针
Block 0..11
索引 Block
数据 Block
二级索引
索引 Block
数据 Block
文件读取流程
- 在目录中查找文件名 → 获得 inode 号
- 根据 inode 号找到 inode 结构体 → 获得权限、大小、Block 指针
- 检查权限是否允许操作
- 根据 Block 指针读取实际数据
9.3 ls -l 输出含义
示例:ls -lih 输出
2095120 lrwxrwxrwx 1 root root 11 11-22 06:58 linklog.log -> log2012.log
| 列 | 含义 | 示例中的值 |
|---|---|---|
| 第 1 列 | inode 号 | 2095120 |
| 第 2 列 | 文件类型 + 权限 | lrwxrwxrwx(l=符号链接) |
| 第 3 列 | 硬链接数 | 1 |
| 第 4 列 | 属主(Owner) | root |
| 第 5 列 | 属组(Group) | root |
| 第 6 列 | 文件大小 | 11(字节) |
| 第 7~8 列 | 最后修改时间 | 11-22 06:58 |
| 第 9 列 | 文件名 | linklog.log -> log2012.log |
9.4 三个时间戳
| 时间戳 | 缩写 | 含义 | 触发时机 | 查看命令 |
|---|---|---|---|---|
| Access Time | atime | 最后访问时间 | cat、less 等读取操作 |
stat file、ls -lu |
| Modify Time | mtime | 最后内容修改时间 | vim 编辑、echo > 等 |
stat file、ls -l(默认) |
| Change Time | ctime | 最后属性改变时间 | chmod、chown 等 |
stat file、ls -lc |
bash
stat filename # 显示详细的 inode 信息(含三个时间戳)
ls -i filename # 显示 inode 号
ls -li # inode 号 + 详细信息
9.5 查看与诊断 inode 的命令
| 命令 | 说明 |
|---|---|
ls -i |
显示文件 inode 号 |
stat file |
显示文件完整 inode 信息 |
df -i |
查看各分区 inode 使用情况 |
df -ih |
同上,人类可读格式 |
dumpe2fs /dev/sda1 |
查看 ext 文件系统详细信息(含 inode 大小) |
tune2fs -l /dev/sda1 |
查看文件系统参数 |
find / -inum N |
通过 inode 号查找文件 |
find / -inum N -delete |
通过 inode 号删除文件 |
bash
# 查看各分区 inode 使用情况
df -i
# Filesystem Inodes IUsed IFree IUse% Mounted on
# /dev/sda1 524288 10000 514288 2% /
# 查看某文件详细信息
stat /etc/passwd
# File: /etc/passwd
# Size: 2476 Blocks: 8 IO Block: 4096 regular file
# Device: sda1 Inode: 393449 Links: 1
# Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)
# Access: 2026-02-12 10:00:00
# Modify: 2026-01-15 09:30:00
# Change: 2026-01-15 09:30:00
9.6 inode 耗尽问题
问题现象 :即使磁盘空间充足(df -h 显示有剩余),由于 inode 耗尽也无法创建新文件。
常见原因:大量小文件(如临时文件、Session 文件、缓存碎片)占满了所有 inode。
排查与解决:
bash
# 1. 确认 inode 耗尽
df -i # 查看 IUse% 是否为 100%
# 2. 定位哪个目录文件最多
for d in /*; do echo "$d"; find "$d" -maxdepth 1 | wc -l; done
# 3. 递归排查具体目录
find /var -xdev -type f | wc -l # 统计 /var 下文件总数
find /tmp -xdev -type f | wc -l # 统计 /tmp 下文件总数
# 4. 清理不需要的文件
find /tmp -type f -mtime +30 -delete # 删除 30 天前的临时文件
# 5. 通过 inode 号删除乱码文件
ls -i # 找到 inode 号
find . -inum 12345 -delete # 按 inode 号删除
注意 :inode 总数在文件系统创建(
mkfs)时就已固定,通常无法在线扩容,需要格式化重建文件系统(会丢失数据)。
十、硬链接与软链接
10.1 原理对比
软链接 Soft Link
file_c
inode 12345
Block 数据
file_d 软链接
inode 67890
路径: file_c
硬链接 Hard Link
file_a
inode 12345
file_b 硬链接
Block 数据
10.2 详细对比表
| 特性 | 硬链接(Hard Link) | 软链接(Symbolic Link) |
|---|---|---|
| 创建命令 | ln source link |
ln -s source link |
| inode | 与原文件共享同一 inode | 拥有独立的 inode |
| 文件大小 | 与原文件相同 | 存储路径字符串的大小 |
| ls -l 类型 | - 普通文件 |
l 符号链接 |
| 删除原文件 | 硬链接仍可访问(数据不丢失) | 软链接失效(悬空链接) |
| 跨文件系统 | 不能 | 可以 |
| 指向目录 | 不能(root 也不行) | 可以 |
| 链接计数 | 创建时原文件链接数 +1 | 不影响原文件链接数 |
| 空间占用 | 几乎不占额外空间 | 占一个 inode + 一个 Block |
| 相对/绝对路径 | 不涉及 | 建议使用绝对路径 |
10.3 实战示例
bash
# ========== 硬链接 ==========
echo "Hello World" > original.txt
ln original.txt hardlink.txt # 创建硬链接
ls -li original.txt hardlink.txt
# 393449 -rw-r--r-- 2 user user 12 Feb 12 10:00 hardlink.txt
# 393449 -rw-r--r-- 2 user user 12 Feb 12 10:00 original.txt
# ↑ 同一 inode ↑ 链接数为 2
rm original.txt # 删除原文件
cat hardlink.txt # 仍可访问:Hello World
ls -li hardlink.txt
# 393449 -rw-r--r-- 1 user user 12 ... # 链接数减为 1
# ========== 软链接 ==========
echo "Hello World" > original.txt
ln -s original.txt softlink.txt # 创建软链接
ls -li original.txt softlink.txt
# 393450 -rw-r--r-- 1 user user 12 Feb 12 10:00 original.txt
# 393451 lrwxrwxrwx 1 user user 12 Feb 12 10:00 softlink.txt -> original.txt
# ↑ 不同 inode ↑ l=符号链接
rm original.txt # 删除原文件
cat softlink.txt # 报错!No such file or directory(悬空链接)
# ========== 查找硬链接 ==========
find / -inum 393449 2>/dev/null # 查找指向同一 inode 的所有文件
# ========== 目录软链接 ==========
ln -s /var/log /home/user/logs # 为目录创建软链接
ls /home/user/logs # 等同于 ls /var/log
10.4 使用建议
| 场景 | 推荐 | 原因 |
|---|---|---|
| 防止误删重要文件 | 硬链接 | 删除原文件后仍可访问 |
| 跨文件系统创建快捷方式 | 软链接 | 硬链接不支持跨文件系统 |
| 指向目录 | 软链接 | 硬链接不支持目录 |
| 版本切换(如 python → python3.9) | 软链接 | 方便修改指向 |
| 库文件版本管理(如 libfoo.so → libfoo.so.1.2) | 软链接 | 更新版本只需改链接 |
十一、文件系统类型对比
11.1 Linux 文件系统演进
ext2
1993
ext3
2001
+日志
ext4
2008
+extent
XFS
1994 SGI
XFS for Linux
2001
Btrfs
2009
Oracle
11.2 主要文件系统对比
| 特性 | ext2 | ext3 | ext4 | XFS | Btrfs |
|---|---|---|---|---|---|
| 日志 | 无 | 有 | 有 | 有 | 有(CoW) |
| 最大文件 | 2TB | 2TB | 16TB | 8EB | 16EB |
| 最大文件系统 | 4TB | 32TB | 1EB | 8EB | 16EB |
| 在线扩容 | 否 | 是 | 是 | 是 | 是 |
| 在线缩容 | 否 | 否 | 是 | 否 | 是 |
| 快照 | 否 | 否 | 否 | 否 | 是 |
| 透明压缩 | 否 | 否 | 否 | 否 | 是 |
| 数据校验 | 否 | 否 | 部分 | 否 | 是 |
| 内置 RAID | 否 | 否 | 否 | 否 | 是 |
| 默认发行版 | 旧版 Linux | CentOS 5 | Debian/Ubuntu | RHEL 7+ | openSUSE |
| 稳定性 | 成熟 | 成熟 | 成熟 | 企业级 | 持续改进 |
11.3 使用建议
| 场景 | 推荐文件系统 | 原因 |
|---|---|---|
| 桌面 / 小型服务器 | ext4 | 成熟稳定,兼容性最好 |
| 大型数据库 / 企业存储 | XFS | 高并发 I/O 性能优异 |
| 大文件(视频/科学计算) | XFS | 大文件处理性能最佳 |
| 需要快照/压缩/去重 | Btrfs | 高级功能最丰富 |
| 嵌入式 / 闪存 | ext2 或 f2fs | 无日志减少写入 |
| /boot 分区 | ext4 或 ext2 | GRUB 兼容性最好 |
11.4 其他常见文件系统
| 文件系统 | 说明 |
|---|---|
| swap | 交换分区(虚拟内存),不是传统文件系统 |
| tmpfs | 基于内存的临时文件系统(/tmp、/run 常用) |
| proc | 进程信息虚拟文件系统(挂载在 /proc) |
| sysfs | 内核/设备信息虚拟文件系统(挂载在 /sys) |
| devtmpfs | 设备文件虚拟文件系统(挂载在 /dev) |
| NFS | 网络文件系统,远程共享 |
| CIFS/SMB | Windows 共享文件系统 |
| ISO 9660 | 光盘文件系统 |
| VFAT/FAT32 | Windows 兼容,U 盘常用 |
| NTFS | Windows 文件系统(Linux 通过 ntfs-3g 支持) |
| f2fs | Flash-Friendly FS,针对闪存优化 |
| OverlayFS | 联合挂载文件系统(Docker 默认存储驱动) |
bash
# 查看当前挂载的文件系统类型
df -Th
# 查看支持的文件系统类型
cat /proc/filesystems
# 查看某分区的文件系统类型
blkid /dev/sda1
lsblk -f
十二、文件权限与特殊权限
12.1 基本权限(rwx)
文件权限 rwxrwxrwx
Owner 属主
前 3 位
Group 属组
中 3 位
Others 其他
后 3 位
r=4 读
w=2 写
x=1 执行
| 权限 | 字母 | 数字 | 对文件的含义 | 对目录的含义 |
|---|---|---|---|---|
| 读 | r |
4 | 读取文件内容 | 列出目录内容(ls) |
| 写 | w |
2 | 修改文件内容 | 在目录中创建/删除文件 |
| 执行 | x |
1 | 执行文件 | 进入目录(cd) |
| 无 | - |
0 | 无权限 | 无权限 |
数字表示法:
| 权限 | 数字 | 含义 |
|---|---|---|
rwx |
7 | 读+写+执行 |
rw- |
6 | 读+写 |
r-x |
5 | 读+执行 |
r-- |
4 | 只读 |
--- |
0 | 无权限 |
bash
# 常见权限设置
chmod 755 script.sh # rwxr-xr-x(所有者可读写执行,其他人可读和执行)
chmod 644 file.txt # rw-r--r--(所有者可读写,其他人只读)
chmod 700 private/ # rwx------(仅所有者可访问)
chmod 777 public/ # rwxrwxrwx(所有人完全访问,慎用!)
# 字母表示法
chmod u+x script.sh # 给属主加执行权限
chmod g-w file.txt # 去除属组写权限
chmod o=r file.txt # 其他人设为只读
chmod a+r file.txt # 所有人加读权限(a = all)
# 递归设置权限
chmod -R 755 directory/ # 递归设置目录及其所有内容
# 修改属主与属组
chown user:group file # 同时修改属主和属组
chown user file # 只修改属主
chgrp group file # 只修改属组
chown -R user:group dir/ # 递归修改
12.2 特殊权限(SUID / SGID / Sticky Bit)
特殊权限
SUID
数字 4
属主执行位显示 s
SGID
数字 2
属组执行位显示 s
Sticky Bit
数字 1
其他执行位显示 t
以文件属主身份执行
如 /usr/bin/passwd
以文件属组身份执行
目录: 新文件继承组
仅文件属主可删除
如 /tmp 目录
| 特殊权限 | 数字 | 作用对象 | 效果 | ls -l 显示 |
|---|---|---|---|---|
| SUID | 4 | 文件 | 执行者临时获得文件属主的权限 | 属主 x 位显示 s |
| SGID | 2 | 文件 | 执行者临时获得文件属组的权限 | 属组 x 位显示 s |
| SGID | 2 | 目录 | 目录内新建文件自动继承目录的属组 | 属组 x 位显示 s |
| Sticky Bit | 1 | 目录 | 目录内文件只有属主和 root 可删除 | 其他 x 位显示 t |
大写 S / T 的含义:
| 显示 | 含义 |
|---|---|
小写 s(SUID/SGID) |
原本有 x 权限 + 特殊权限,有效 |
大写 S |
原本无 x 权限 + 特殊权限,无意义 |
小写 t(Sticky) |
原本有 x 权限 + Sticky,有效 |
大写 T |
原本无 x 权限 + Sticky,无意义 |
bash
# SUID 示例
ls -l /usr/bin/passwd
# -rwsr-xr-x 1 root root ... ← 属主 x 位为 s
# 普通用户运行 passwd 时临时获得 root 权限修改 /etc/shadow
chmod u+s file # 设置 SUID
chmod u-s file # 取消 SUID
chmod 4755 file # 数字形式:4 = SUID
# SGID 示例(共享目录)
mkdir /shared
chgrp developers /shared
chmod 2775 /shared # 2 = SGID
# 该目录下新建文件自动属于 developers 组
chmod g+s dir # 设置 SGID
chmod g-s dir # 取消 SGID
# Sticky Bit 示例(/tmp 目录)
ls -ld /tmp
# drwxrwxrwt 10 root root ... ← 其他 x 位为 t
# 所有人可写,但只能删除自己的文件
chmod o+t dir # 设置 Sticky Bit
chmod o-t dir # 取消 Sticky Bit
chmod 1777 dir # 数字形式:1 = Sticky
# 查找系统中所有 SUID 文件(安全审计)
find / -perm -4000 -type f 2>/dev/null
# 查找系统中所有 SGID 文件
find / -perm -2000 -type f 2>/dev/null
12.3 默认权限与 umask
| 概念 | 说明 |
|---|---|
| umask | 权限掩码,决定新建文件/目录的默认权限 |
| 文件默认 | 666 - umask(文件默认无 x 权限) |
| 目录默认 | 777 - umask |
| 常见 umask | 022 → 文件 644,目录 755 |
| root 的 umask | 022(默认) |
| 普通用户 umask | 002(默认) |
bash
umask # 查看当前 umask 值(如 0022)
umask 027 # 设置 umask:文件 640,目录 750
umask -S # 以符号形式显示(如 u=rwx,g=rx,o=)
十三、/proc 与 /sys 虚拟文件系统
13.1 虚拟文件系统概述
虚拟文件系统
数据在内存中,不占磁盘
/proc
进程与内核信息
/sys
硬件设备与驱动
进程信息
/proc/PID/
内核参数
/proc/sys/
硬件信息
cpuinfo meminfo
设备层次
/sys/devices/
设备分类
/sys/class/
总线类型
/sys/bus/
13.2 /proc 常用文件
系统信息文件
| 文件 | 说明 | 查看命令 |
|---|---|---|
/proc/cpuinfo |
CPU 详细信息(型号、核心数、频率等) | cat /proc/cpuinfo |
/proc/meminfo |
内存使用详情(总量、可用、缓存等) | cat /proc/meminfo |
/proc/version |
内核版本信息 | cat /proc/version |
/proc/uptime |
系统运行时长(秒) | cat /proc/uptime |
/proc/loadavg |
系统负载(1/5/15 分钟平均) | cat /proc/loadavg |
/proc/stat |
CPU 活动统计 | cat /proc/stat |
/proc/vmstat |
虚拟内存统计 | cat /proc/vmstat |
/proc/mounts |
当前挂载的文件系统 | cat /proc/mounts |
/proc/filesystems |
内核支持的文件系统列表 | cat /proc/filesystems |
/proc/partitions |
磁盘分区信息 | cat /proc/partitions |
/proc/cmdline |
内核启动参数 | cat /proc/cmdline |
/proc/swaps |
交换分区信息 | cat /proc/swaps |
/proc/net/dev |
网络设备统计 | cat /proc/net/dev |
进程信息目录(/proc/PID/)
每个运行中的进程都有一个以 PID 命名的目录:
| 文件 | 说明 |
|---|---|
/proc/PID/cmdline |
启动命令行 |
/proc/PID/status |
进程状态详情(名称、状态、PID、内存等) |
/proc/PID/maps |
内存映射信息 |
/proc/PID/fd/ |
文件描述符目录(每个打开的文件一个符号链接) |
/proc/PID/cwd |
当前工作目录(符号链接) |
/proc/PID/exe |
可执行文件路径(符号链接) |
/proc/PID/environ |
环境变量 |
bash
# 查看 CPU 核心数
grep -c processor /proc/cpuinfo
# 查看总内存
grep MemTotal /proc/meminfo
# 查看某进程的信息
cat /proc/1/status # PID 1(init/systemd)的状态
ls -l /proc/1/fd # PID 1 打开的文件描述符
readlink /proc/1/exe # PID 1 的可执行文件路径
# 查看系统负载
cat /proc/loadavg
# 0.15 0.20 0.18 2/350 12345
# 1分钟 5分钟 15分钟 运行/总进程 最后PID
/proc/sys/ 可写参数(内核调优)
| 参数路径 | 说明 | 示例 |
|---|---|---|
/proc/sys/net/ipv4/ip_forward |
IP 转发开关 | echo 1 > ...(开启路由) |
/proc/sys/vm/swappiness |
交换倾向(0~100) | echo 10 > ...(减少 swap 使用) |
/proc/sys/fs/file-max |
系统最大文件打开数 | echo 100000 > ... |
/proc/sys/net/core/somaxconn |
最大监听队列 | echo 1024 > ... |
/proc/sys/kernel/hostname |
主机名 | echo myhost > ... |
bash
# 临时修改内核参数
echo 1 > /proc/sys/net/ipv4/ip_forward
# 永久修改(推荐用 sysctl)
sysctl -w net.ipv4.ip_forward=1 # 临时生效
# 写入 /etc/sysctl.conf 后执行 sysctl -p 永久生效
13.3 /sys 常用目录
| 目录 | 说明 |
|---|---|
/sys/devices/ |
全局设备层次结构(物理拓扑) |
/sys/class/ |
按功能分类的设备(如 net/、block/、input/) |
/sys/bus/ |
按总线类型分类(如 pci/、usb/、scsi/) |
/sys/kernel/ |
内核可调整参数 |
/sys/module/ |
已加载的内核模块信息 |
/sys/block/ |
块设备信息 |
/sys/fs/ |
文件系统相关信息 |
bash
# 查看网络设备
ls /sys/class/net/
# 查看块设备
ls /sys/class/block/
# 查看 CPU 频率
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_cur_freq
# 查看硬盘调度器
cat /sys/block/sda/queue/scheduler
# 查看 USB 设备
ls /sys/bus/usb/devices/
13.4 /proc 与 /sys 对比
| 对比项 | /proc | /sys |
|---|---|---|
| 主要内容 | 进程信息 + 内核参数 | 硬件设备 + 驱动 |
| 组织方式 | 按进程 PID + 内核子系统 | 按设备层次/功能分类 |
| 是否可写 | /proc/sys/ 部分可写 | 部分属性可写 |
| 存在时间 | 较早(Linux 最初版本) | 较新(Linux 2.6 引入) |
| 占用磁盘 | 不占(内存中) | 不占(内存中) |
| 典型用途 | 查看进程、CPU、内存、内核参数调优 | 查看/管理硬件设备 |
十四、磁盘分区与挂载实战
14.1 磁盘管理流程
识别磁盘
lsblk / fdisk -l
分区
fdisk / gdisk
格式化
mkfs
临时挂载
mount
永久挂载
/etc/fstab
验证
mount -a / df
14.2 分区方案:MBR vs GPT
| 对比项 | MBR(Master Boot Record) | GPT(GUID Partition Table) |
|---|---|---|
| 最大磁盘 | 2TB | 9.4ZB(理论) |
| 最大分区数 | 4 主分区(或 3 主 + 1 扩展) | 128 分区 |
| 分区工具 | fdisk |
gdisk / parted |
| 引导方式 | BIOS + MBR | UEFI + GPT(现代标准) |
| 数据安全 | 分区表无备份 | 分区表有备份(头尾各一份) |
| 兼容性 | 所有系统 | 需要 UEFI 支持 |
14.3 设备命名规则
| 设备类型 | 命名规则 | 示例 |
|---|---|---|
| SATA / SCSI / USB | /dev/sd[a-z] |
/dev/sda(第一块磁盘) |
| SATA 分区 | /dev/sd[a-z][1-9] |
/dev/sda1(第一块磁盘第一个分区) |
| NVMe SSD | /dev/nvme[0-9]n[1-9] |
/dev/nvme0n1(第一块 NVMe) |
| NVMe 分区 | /dev/nvme[0-9]n[1-9]p[1-9] |
/dev/nvme0n1p1 |
| 虚拟磁盘 | /dev/vd[a-z] |
/dev/vda(KVM 虚拟机) |
| LVM 逻辑卷 | /dev/mapper/VG-LV |
/dev/mapper/centos-root |
| 光驱 | /dev/sr0 |
/dev/sr0 |
| 软驱 | /dev/fd0 |
/dev/fd0 |
14.4 常用磁盘管理命令
查看类命令
| 命令 | 说明 | 常用选项 |
|---|---|---|
lsblk |
树状显示块设备 | -f(含文件系统类型) |
fdisk -l |
列出所有磁盘分区 | 需 root |
blkid |
显示设备 UUID 和文件系统类型 | |
df |
查看文件系统磁盘使用 | -Th(类型+可读) |
df -i |
查看 inode 使用情况 | -ih(可读) |
du |
查看文件/目录磁盘占用 | -sh(汇总+可读) |
parted -l |
列出分区信息(支持 GPT) |
bash
# 树状显示所有块设备
lsblk
# NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
# sda 8:0 0 50G 0 disk
# ├─sda1 8:1 0 1G 0 part /boot
# ├─sda2 8:2 0 49G 0 part
# │ ├─centos-root 253:0 0 45G 0 lvm /
# │ └─centos-swap 253:1 0 4G 0 lvm [SWAP]
# 显示含文件系统类型
lsblk -f
# 查看磁盘空间使用
df -Th
# Filesystem Type Size Used Avail Use% Mounted on
# /dev/mapper/cl-root xfs 45G 15G 30G 34% /
# /dev/sda1 ext4 976M 150M 760M 17% /boot
# 查看目录大小
du -sh /var/log # /var/log 总大小
du -sh /var/log/* # /var/log 下每个子目录/文件大小
# 查看 inode 使用
df -ih
# 查看设备 UUID
blkid
分区、格式化与挂载
bash
# ===== 分区(MBR 方式) =====
fdisk /dev/sdb # 进入交互式分区工具
# n → 新建分区
# p → 主分区
# 1 → 分区号
# → 起始扇区(默认)
# +10G → 大小 10GB
# w → 写入保存
# ===== 分区(GPT 方式) =====
gdisk /dev/sdb # GPT 分区工具
parted /dev/sdb # 通用分区工具(支持脚本)
# ===== 格式化 =====
mkfs.ext4 /dev/sdb1 # 格式化为 ext4
mkfs.xfs /dev/sdb1 # 格式化为 XFS
mkfs -t ext4 /dev/sdb1 # 同上(-t 指定类型)
# ===== 创建交换分区 =====
mkswap /dev/sdb2 # 初始化为 swap
swapon /dev/sdb2 # 启用 swap
swapoff /dev/sdb2 # 停用 swap
# ===== 临时挂载 =====
mkdir -p /mnt/data
mount /dev/sdb1 /mnt/data # 挂载分区到目录
mount -t xfs /dev/sdb1 /mnt/data # 指定文件系统类型
mount -o ro /dev/sdb1 /mnt/data # 只读挂载
# ===== 卸载 =====
umount /mnt/data # 卸载(不能在该目录下执行)
umount -l /mnt/data # 懒卸载(延迟到不被使用时卸载)
# ===== 挂载 ISO 镜像 =====
mount -o loop image.iso /mnt/iso
# ===== 查看当前挂载 =====
mount # 列出所有挂载
findmnt # 树状显示挂载
14.5 永久挂载(/etc/fstab)
/etc/fstab 的格式:
| 字段 | 说明 | 示例 |
|---|---|---|
| 第 1 列 | 设备(UUID 或设备路径) | UUID=xxx 或 /dev/sdb1 |
| 第 2 列 | 挂载点 | /mnt/data |
| 第 3 列 | 文件系统类型 | ext4、xfs、swap |
| 第 4 列 | 挂载选项 | defaults、noatime、ro |
| 第 5 列 | dump 备份(0=不备份) | 0 |
| 第 6 列 | fsck 检查顺序(0=不检查,1=根,2=其他) | 2 |
bash
# /etc/fstab 示例
UUID=a1b2c3d4-5678-90ab-cdef /mnt/data ext4 defaults 0 2
/dev/sdb2 swap swap defaults 0 0
# 常用挂载选项
# defaults = rw,suid,dev,exec,auto,nouser,async
# noatime = 不更新访问时间(提升性能)
# ro = 只读挂载
# noexec = 不允许执行(安全性)
# nosuid = 不允许 SUID(安全性)
# nofail = 设备不存在时不报错(云服务器常用)
# 测试 fstab 是否正确(不要重启前先测试!)
mount -a # 挂载 fstab 中所有条目
# 获取 UUID
blkid /dev/sdb1 # UUID="a1b2c3d4-5678-..."
安全提示 :编辑
/etc/fstab前务必先用mount -a测试,错误的 fstab 可能导致系统无法启动!
十五、综合速查与练习
15.1 文件系统命令速查表
| 目的 | 命令 |
|---|---|
| 查看目录树结构 | tree /path 或 ls -R |
| 查看磁盘使用 | df -Th |
| 查看 inode 使用 | df -ih |
| 查看目录大小 | du -sh /path |
| 查看块设备 | lsblk -f |
| 查看设备 UUID | blkid |
| 查看文件类型 | file filename |
| 查看 inode 号 | ls -i filename |
| 查看详细元数据 | stat filename |
| 查看文件系统类型 | df -T 或 lsblk -f |
| 查看挂载信息 | mount 或 findmnt |
| 创建硬链接 | ln source link |
| 创建软链接 | ln -s source link |
| 修改权限 | chmod 755 file |
| 修改属主 | chown user:group file |
| 查看 umask | umask |
| 查看 CPU 信息 | cat /proc/cpuinfo |
| 查看内存信息 | cat /proc/meminfo 或 free -h |
| 分区 | fdisk /dev/sdX(MBR)或 gdisk(GPT) |
| 格式化 | mkfs.ext4 /dev/sdX1 |
| 挂载 | mount /dev/sdX1 /mnt/dir |
| 永久挂载 | 编辑 /etc/fstab + mount -a |
15.2 练习
- 查看根分区的 inode 使用率:
bash
df -ih /
- 创建一个共享目录,组内成员可写,但不能删除他人文件:
bash
mkdir /shared
chgrp developers /shared
chmod 3775 /shared # SGID(2) + Sticky(1) + rwxrwxr-x
# 3 = SGID + Sticky Bit
- 新加一块磁盘,分区、格式化并永久挂载到 /data:
bash
lsblk # 确认新磁盘(如 /dev/sdb)
fdisk /dev/sdb # 分区
mkfs.ext4 /dev/sdb1 # 格式化
mkdir -p /data
mount /dev/sdb1 /data # 临时挂载
blkid /dev/sdb1 # 获取 UUID
# 编辑 /etc/fstab 添加:
# UUID=xxx /data ext4 defaults 0 2
mount -a # 测试
- 查找系统中所有 SUID 程序:
bash
find / -perm -4000 -type f -ls 2>/dev/null
- 通过 inode 号删除乱码文件名的文件:
bash
ls -i # 找到 inode 号(如 123456)
find . -inum 123456 -delete