Skip to content

Linux 文件系统 ​

在 Linux 里,「一切皆文件」不是口号——硬盘是文件,键盘是文件,连进程信息都以文件形式存在。理解文件系统,等于拿到了 Linux 系统的地图。

目录结构 FHS ​

Linux 遵循 FHS(Filesystem Hierarchy Standard,文件系统层次结构标准),根目录是 /,所有内容都挂在它下面。

/
├── /bin -> usr/bin    # 基本命令(ls、cp、mv 等)
├── /boot              # 内核和启动文件
├── /dev               # 设备文件(硬盘、键盘、终端...)
├── /etc               # 系统配置文件(80% 的运维操作在这里)
├── /home              # 普通用户的家目录(/home/username)
├── /lib -> usr/lib    # 系统库文件
├── /media             # 自动挂载的移动设备
├── /mnt               # 临时手动挂载点
├── /opt               # 第三方软件安装目录
├── /proc              # 虚拟文件系统,进程和内核信息
├── /root              # root 用户的家目录
├── /run               # 运行时临时文件(重启后清空)
├── /sbin -> usr/sbin  # 系统管理命令
├── /tmp               # 临时文件(所有用户可写,重启可能清空)
├── /usr               # 用户程序和数据(Unix System Resources)
└── /var               # 可变数据(日志、缓存、数据库)

重点记住这 5 个

  • /etc:所有配置在这里,改配置 90% 在操作 /etc
  • /home:你的文件在这里,备份数据优先备份这里
  • /var:日志在这里,排查问题先看 /var/log
  • /tmp:临时文件,别把重要东西放这
  • /proc:不是真实文件,是内核的窗口。cat /proc/cpuinfo 看 CPU,cat /proc/meminfo 看内存

文件类型 ​

用 ls -l 看到的第一个字符就是文件类型:

首字符类型示例
-普通文件文本、图片、二进制
d目录文件夹
l软链接(符号链接)快捷方式
b块设备硬盘 /dev/sda
c字符设备键盘、终端 /dev/tty
sSocket网络通信套接字

硬链接 vs 软链接 ​

链接是 Linux 文件系统的核心概念,理解它就理解了文件存储的本质。

类似 Windows 的「快捷方式」。ln -s 源文件 链接名:

bash
ln -s /usr/local/nginx/conf/nginx.conf /etc/nginx.conf
# 现在 /etc/nginx.conf 指向实际文件,方便访问
  • 软链接有自己的 inode,只存了目标文件的路径
  • 源文件删除后,软链接会变成「死链接」(变红)
  • 可以跨文件系统
  • 可以做目录链接

硬链接是文件内容的另一个名字。ln 源文件 链接名:

bash
echo "hello" > file1.txt
ln file1.txt file2.txt
# file1.txt 和 file2.txt 完全等价,指向同一数据块
  • 硬链接和源文件共享同一个 inode,地位完全平等
  • 删除任何一个,数据仍存在,直到链接数为 0
  • 不能跨文件系统
  • 不能链接目录(防止循环引用)

怎么理解 inode

inode 是文件的身份证号,存储文件的元数据(权限、大小、位置),但不包括文件名。文件名只是 inode 的标签。ls -i 可以查看文件的 inode 号。如果两个文件的 inode 号相同,说明它们是硬链接关系——这本质上不是两个文件,而是同一个文件有多个名字。

文件权限 ​

这是 Linux 安全模型的基础。ls -l 的输出:

bash
-rwxr-xr--  1 user group  4096 Jul 26 10:00 script.sh

分解来看:

部分含义
-文件类型(- 普通文件)
rwx所有者权限(Owner)
r-x所属组权限(Group)
r--其他人权限(Others)
user文件所有者
group文件所属组

rwx 含义 ​

权限文件目录
r(read 读)可以查看文件内容可以列出目录下的文件(ls)
w(write 写)可以修改文件内容可以在目录中创建/删除文件
x(execute 执行)可以执行这个文件可以进入这个目录(cd)

chmod 修改权限 ​

两种方式:数字和符号。

数字方式(推荐):r=4, w=2, x=1

bash
chmod 755 script.sh    # rwxr-xr-x(所有者全权限,其他人读+执行)
chmod 644 file.txt     # rw-r--r--(所有者读写,其他人只读)
chmod 600 secret.key   # rw-------(只有所有者能读写,最安全)
chmod 700 private/     # rwx------(只有所有者能进入的目录)

符号方式:u=所有者, g=所属组, o=其他人, a=全部

bash
chmod u+x script.sh      # 给所有者加执行权限
chmod g-w file.txt       # 移除所属组的写权限
chmod o= file.txt        # 清空其他人的所有权限
chmod a+r *.txt          # 所有人可读所有 txt 文件

chown / chgrp 修改归属 ​

bash
chown user:group file    # 同时改所有者和所属组
chown -R www:www /var/www  # 递归修改整个目录
chgrp devops file        # 只改所属组

不是 chmod 777 就能解决一切

新手常见错误:权限不对就 chmod 777。这会打开安全漏洞——任何人都能修改你的文件。正确的做法是分析谁需要什么权限,精准授权。原则是「最小权限」:够用就好,不多给。

mount / umount ​

Linux 中没有「C 盘」「D 盘」的概念,所有设备都挂载到目录树中:

bash
mount                          # 查看所有挂载
mount /dev/sdb1 /mnt/data      # 把硬盘分区挂载到 /mnt/data
umount /mnt/data               # 卸载挂载

通俗理解

想象 Linux 的目录树是一棵大树,mount 就是把一块新硬盘(或 U 盘)「嫁接」到树上某个枝桠。之后访问那个目录,实际读写的就是这块硬盘。

df / du 查看磁盘空间 ​

bash
df -h                          # 各分区的磁盘使用情况(-h 人类可读)
df -i                          # inode 使用情况(创建不了文件?可能是 inode 满了)

du -sh /var/log                # 目录总大小
du -sh *                       # 当前目录下各子目录的大小
du -sh * | sort -hr            # 按大小排序,找出占空间大户

实操示例 ​

bash
# 1. 创建目录并设置权限
mkdir -p /tmp/lab/private
chmod 700 /tmp/lab/private

# 2. 创建软链接(方便访问带版本号的目录)
mkdir /opt/myapp-1.2.3
ln -s /opt/myapp-1.2.3 /opt/myapp    # 升级只需改软链接指向

# 3. 创建硬链接理解 inode
echo "data" > a.txt
ln a.txt b.txt
ls -li a.txt b.txt    # 观察 inode 号相同

# 4. 排查磁盘空间
df -h                    # 先看哪个分区满了
du -sh /* 2>/dev/null    # 再找哪个目录占空间
# 逐个深入,定位大文件

小结 ​

  • / 是根,/etc 管配置,/home 管数据,/var 管日志
  • 软链接是快捷方式,硬链接是文件内容的另一个名字
  • 权限 = r(4) + w(2) + x(1),分所有者-所属组-其他人三组
  • mount 把设备嫁接到目录树,df / du 看磁盘
  • 别滥用 chmod 777,最小权限原则

掌握了文件系统,接下来就可以放心地探索 Linux 的各个角落了。


🎯 本章要点 ​

  • 系统配置在 /etc,日志在 /var/log,系统信息在 /proc
  • /proc 是虚拟文件系统,反映内核和进程实时状态
  • 排故优先看 /etc、/var/log、/proc 三个目录
加载练习题中...

有问题或补充?欢迎留言