Linux文件系统与FHS详解

本文系统归纳 Linux 文件系统核心知识:目录树与 FHS 标准、根目录 / /usr / /var 详解、文件系统类型对比、inode 与 Block 深入、硬链接与软链接、文件权限与特殊权限、/proc 与 /sys 虚拟文件系统、磁盘分区与挂载实战。与《Linux命令完全指南》及《Shell命令与基础》配合使用,内容只增不减


目录


一、目录树与 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) 人类可读的文本 catless
二进制(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.txtfile.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 索引节点,存储元数据 128256 字节
Superblock 超级块,文件系统全局信息 1KB

目录条目

filename → inode 号
inode

权限 大小 时间

数据块指针
直接指针

12 个
一级间接指针
二级间接指针
三级间接指针
Block 0..11
索引 Block
数据 Block
二级索引
索引 Block
数据 Block

文件读取流程
  1. 在目录中查找文件名 → 获得 inode 号
  2. 根据 inode 号找到 inode 结构体 → 获得权限、大小、Block 指针
  3. 检查权限是否允许操作
  4. 根据 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 最后访问时间 catless 等读取操作 stat filels -lu
Modify Time mtime 最后内容修改时间 vim 编辑、echo > stat filels -l(默认)
Change Time ctime 最后属性改变时间 chmodchown stat filels -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 高级功能最丰富
嵌入式 / 闪存 ext2f2fs 无日志减少写入
/boot 分区 ext4ext2 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 列 文件系统类型 ext4xfsswap
第 4 列 挂载选项 defaultsnoatimero
第 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 /pathls -R
查看磁盘使用 df -Th
查看 inode 使用 df -ih
查看目录大小 du -sh /path
查看块设备 lsblk -f
查看设备 UUID blkid
查看文件类型 file filename
查看 inode 号 ls -i filename
查看详细元数据 stat filename
查看文件系统类型 df -Tlsblk -f
查看挂载信息 mountfindmnt
创建硬链接 ln source link
创建软链接 ln -s source link
修改权限 chmod 755 file
修改属主 chown user:group file
查看 umask umask
查看 CPU 信息 cat /proc/cpuinfo
查看内存信息 cat /proc/meminfofree -h
分区 fdisk /dev/sdX(MBR)或 gdisk(GPT)
格式化 mkfs.ext4 /dev/sdX1
挂载 mount /dev/sdX1 /mnt/dir
永久挂载 编辑 /etc/fstab + mount -a

15.2 练习

  1. 查看根分区的 inode 使用率:
bash 复制代码
df -ih /
  1. 创建一个共享目录,组内成员可写,但不能删除他人文件:
bash 复制代码
mkdir /shared
chgrp developers /shared
chmod 3775 /shared        # SGID(2) + Sticky(1) + rwxrwxr-x
# 3 = SGID + Sticky Bit
  1. 新加一块磁盘,分区、格式化并永久挂载到 /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                   # 测试
  1. 查找系统中所有 SUID 程序:
bash 复制代码
find / -perm -4000 -type f -ls 2>/dev/null
  1. 通过 inode 号删除乱码文件名的文件:
bash 复制代码
ls -i                      # 找到 inode 号(如 123456)
find . -inum 123456 -delete

相关推荐
zl_dfq4 小时前
Linux 之 【多线程】(死锁、同步与竞态条件、条件变量、pthread_cond_xxx、POSIX信号量、sem_xxx)
linux
学Linux的语莫4 小时前
k8s常用命令
linux·容器·kubernetes
openKylin4 小时前
《2025年度OpenAtom openKylin社区全景案例集》正式发布
linux
CS_Zero4 小时前
Ubuntu安装Claude Code
linux·ubuntu·ai编程·claude
A星空1235 小时前
三、Kconfig介绍以及制作menuconfig界面
linux·运维·服务器
zylyehuo5 小时前
Windows & Linux 双系统资料整理
linux·夯实基础
口袋物联6 小时前
模板方法模式在 C 语言中的应用(含 Linux 内核实例)
linux·c语言·模板方法模式
一个人旅程~7 小时前
Linux Fcitx5输入法这么难念的由来?
linux·经验分享·电脑·ai写作
开开心心就好7 小时前
一键加密隐藏视频,专属格式播放工具
java·linux·开发语言·网络·人工智能·macos