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) 人类可读的文本 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

文件读取流程
  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 最后访问时间 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 练习

  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

相关推荐
殷色玫瑰13 小时前
C语言编译和链接:从 .c到 .exe,程序到底经历了什么?
linux·c语言·c++·算法
菜鸟~noob23313 小时前
【太空电子战】午夜锤行动中的电磁静默区:可逆干扰的实战验证【含matlab代码】
linux·开发语言·matlab·电子战
Fcy64814 小时前
Linux下 传输层协议TCP详解
linux·网络·tcp/ip
BIM云平台开发15 小时前
DAZ里,如何保存现在姿势,如果调错了,可以重新导回
linux·服务器·前端·daz基础教程
栖凤15 小时前
多 Agent 工作流实践:从单打独斗到协同作战
java·linux·服务器
羔羊++15 小时前
20_实验十九_内核源码准备与配置
linux
askama0015 小时前
Ubuntu安装Anaconda并配置环境
linux·python
zhangrelay16 小时前
ubuntu图形化和命令行查看硬件参数方式汇总-Surface Go
linux·笔记·学习·ubuntu
MicrosoftCloud16 小时前
用户权限 02|/etc/passwd、/etc/shadow、/etc/group:三个文件讲透 Linux 用户体系
linux·运维·ubuntu·用户管理·权限·useradd
崽崽..16 小时前
【Linux】ping命令刨析
linux·运维·服务器·网络