Linux 文件系统
# Linux 文件系统详解
# 1**. 文件系统概述**
# 1.1 什么是文件系统?
文件系统(File System)是操作系统用来组织、存储和管理数据的一套机制,主要作用是:
- 存储数据(文件存在哪里?)
- 管理数据(如何快速找到文件?)
- 访问控制(谁可以访问哪些文件?)
💡 通俗理解:
- 把硬盘看成一本书,文件系统就是书的 目录+索引+内容排布规则。
- 书有章节编号(类似于文件索引 inode),内容按页码存放(类似于数据块),不同书籍可能采用不同的目录结构(类似于不同的文件系统类型)。
# 1.2 文件系统的核心组成
Linux 文件系统主要包含以下几个部分:
组件 | 作用 | 类比 |
---|---|---|
超级块(Superblock) | 记录文件系统的元数据,如大小、文件数等 | 书籍目录页 |
索引节点(Inode) | 存储文件的元信息(权限、大小、时间等) | 书籍的章节索引 |
数据块(Data Block) | 存储文件的实际内容 | 书籍的正文内容 |
目录(Directory) | 组织文件结构,保存文件名和 inode 对应关系 | 书籍的章节列表 |
💡 查看 inode 信息
ls -i /etc/passwd # 查看文件的 inode 号
stat /etc/passwd # 查看文件的详细 inode 信息
2
# 2. 文件系统的类型
# 2.1 常见文件系统
文件系统 | 适用操作系统 | 特点 |
---|---|---|
ext2/ext3/ext4 | Linux | ext4是目前主流的Linux文件系统 |
XFS | Linux | 适用于大规模存储 |
NTFS | Windows | Linux 只读支持(需额外安装 ntfs-3g 才能写入) |
FAT16/FAT32 | Windows | 兼容性好,适用于U盘 |
iso9660 | 光盘 | 只读文件系统 |
NFS | Linux/Unix | 用于网络文件共享 |
# 2.2 Linux 文件类型
- 普通文件 (
-
):文本、图片、视频等。 - 目录文件 (
d
):包含子目录和文件。 - 链接文件 (
l
):类似 Windows 快捷方式。 - 设备文件 (
b
、c
):硬件设备,如/dev/sda
。 - 管道文件 (
p
):用于进程间通信。
# 3. 挂载与分区基础
在 Linux 系统中,分区 和 挂载 是存储管理的核心概念。无论是硬盘、U 盘还是光盘,要在 Linux 中访问这些设备上的数据,都离不开这两个步骤。本文将详细介绍什么是分区、挂载的作用,以及如何在 Linux 中操作它们,带你从零基础理解存储管理的奥秘。
# 3.1 什么是分区?
# 3.11 分区的概念
分区是将物理存储设备(如硬盘)分割成多个独立逻辑单元的过程。每个分区可以看作一个单独的“磁盘”,拥有自己的文件系统和数据存储空间。
为什么要分区?
- 隔离数据:将系统文件、用户数据分开,增强安全性。
- 多系统支持:在一块硬盘上安装多个操作系统(如 Linux 和 Windows)。
- 优化性能:不同分区可以用不同文件系统(如 ext4、NTFS)。
- 管理方便:限制某些分区的大小,避免数据无序增长。
分区类型:
- 主分区:一块硬盘最多 4 个,直接存储数据。
- 扩展分区:解决主分区数量限制,本身不存储数据,包含逻辑分区。
- 逻辑分区:在扩展分区内创建,分区数量无严格限制。
# 3.12 查看分区
在 Linux 中,可以用命令查看硬盘的分区情况:
lsblk
:列出块设备及其分区。- 示例输出:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 1.8T 0 disk |-sda1 8:1 0 200G 0 part / |-sda2 8:2 0 1K 0 part \-sda5 8:5 0 1.6T 0 part /home
1
2
3
4
5sda
是硬盘,sda1
、sda2
、sda5
是分区。MOUNTPOINT
表示挂载点(如/
和/home
)。
- 示例输出:
fdisk -l
:列出所有分区表(需 root 权限)。- 示例:
sudo fdisk -l /dev/sda
- 示例:
# 3.13 分区工具
fdisk
:传统的分区工具,适合初学者。- 示例:
sudo fdisk /dev/sda
进入交互模式。
- 示例:
parted
:更现代,支持大容量磁盘。gparted
:图形化工具,适合桌面用户。
# 3.2 什么是挂载?
# 3.21 挂载的定义
挂载(mount) 是将分区或存储设备(包括文件系统)与 Linux 文件系统中的某个目录关联起来的过程。这个目录称为挂载点,挂载后,你可以通过该目录访问设备中的内容。
比喻:挂载像是给硬盘分区“插上电源”,让它融入 Linux 的文件系统“大家庭”。未挂载的分区就像未通电的设备,无法直接使用。
挂载的作用:
- 访问数据:让分区内容以目录形式可见。
- 统一管理:所有设备通过
/
下的目录访问,形成树状结构。 - 灵活性:随时挂载或卸载设备。
# 3.22 Linux 文件系统的特点
Linux 的文件系统是单一的树状结构,以根目录(/
)为起点。无论是本地硬盘还是外部 U 盘,都需要挂载到某个目录才能使用。这种设计与 Windows 的多盘符(如 C:、D:)不同。
- 示例:
- 分区
/dev/sda1
挂载到/
,成为根文件系统。 - 分区
/dev/sda5
挂载到/home
,存放用户数据。
- 分区
# 3.3 挂载与分区的关系
# 3.31 分区是前提,挂载是桥梁
- 分区:物理上划分存储空间,创建独立的文件系统。
- 挂载:将分区的文件系统接入 Linux 的目录树。
例如:
- 硬盘
sda
分成sda1
(200GB,ext4)和sda5
(1.6TB,ext4)。 sda1
挂载到/
,运行系统;sda5
挂载到/data
,存储文件。- 未挂载的
sda5
,无法通过目录访问其数据。
# 3.32 自动挂载 vs 手动挂载
- 自动挂载:
- 系统启动时,根据
/etc/fstab
文件自动挂载关键分区(如/
、/home
)。 - 示例
/etc/fstab
配置:/dev/sda1 / ext4 defaults 0 1 /dev/sda5 /home ext4 defaults 0 2
1
2
- 系统启动时,根据
- 手动挂载:
- 用户通过
mount
命令挂载临时设备(如 U 盘、光盘)。 - 示例:
mount /dev/sdb1 /mnt
- 用户通过
# 3.4 挂载操作实战
# 3.41 查看当前挂载情况
df -h
:显示已挂载的分区及其使用情况。- 示例:
Filesystem Size Used Avail Use% Mounted on /dev/sda1 200G 50G 140G 26% / /dev/sda5 1.6T 500G 1.1T 32% /home
1
2
3
- 示例:
mount
:列出所有挂载点。- 示例:
/dev/sda1 on / type ext4 (rw,relatime)
- 示例:
# 3.42 手动挂载分区
假设你有一个未挂载的分区 /dev/sda5
,想访问其中的数据:
- 创建挂载点:
mkdir /mnt/data
1 - 挂载分区:
mount /dev/sda5 /mnt/data
1- 如果是 NTFS 分区:
mount -t ntfs /dev/sda5 /mnt/data
- 支持中文:
mount -t vfat /dev/sda5 /mnt/data -o utf8
- 如果是 NTFS 分区:
- 验证挂载:
df -h
1 - 访问数据:
ls /mnt/data
1
# 3.43 卸载分区
用完后卸载:
umount /mnt/data
- 或:
umount /dev/sda5
- 注意:卸载前确保没有进程在使用该挂载点,否则会报错。
# 3.44 挂载其他设备
意思就是你插入优盘,光盘,物理盘并不能用,你要挂载才能访问
- U 盘:
mount /dev/sdb1 /mnt/usb
1 - 光盘:
mount /dev/sr0 /media/cdrom
1 - ISO 文件:
mount -o loop disk.iso /mnt/iso
1
# 4.符号链接与硬链接
符号链接(Symbolic Link)和硬链接(Hard Link)是两种不同的文件链接方式,在 Linux 和 Unix 系统中广泛使用。它们的主要作用是提供对文件的不同访问路径,但在底层的实现方式和行为上存在显著区别。
# 4.1 硬链接(Hard Link)
硬链接是指向同一个文件数据块(inode)的多个文件名。它们共享相同的 inode 号,即多个文件名指向同一物理文件,因此无论哪个名称被修改,数据都会同步变化。
特点
- 硬链接与原文件共享相同的 inode 号 和 数据块,即指向同一个物理文件。
- 删除其中一个硬链接,文件数据不会被删除,只有当所有硬链接都被删除时,数据才会真正被移除。
- 硬链接只能用于同一文件系统(因为 inode 号在不同文件系统中是独立的)。
- 不能对目录创建硬链接(防止形成循环)。
创建硬链接
ln 原文件 硬链接文件
示例:
touch file1 # 创建一个文件
ln file1 file2 # 创建 file1 的硬链接 file2
ls -li # 查看 inode 号
2
3
输出示例:
1001 -rw-r--r-- 2 user user 0 Mar 3 12:00 file1
1001 -rw-r--r-- 2 user user 0 Mar 3 12:00 file2
2
可以看到 file1
和 file2
共享相同的 inode 号(1001)。
# 4.2 符号链接(Symbolic Link)
符号链接类似于 Windows 的快捷方式,它只是一个指向目标文件路径的特殊文件,而不是直接指向数据块。
特点
- 符号链接拥有独立的 inode 号,但其内容仅存储了目标文件的路径。
- 可以跨文件系统,甚至可以指向不存在的文件(即“悬空”或“死链接”)。
- 可以对目录创建符号链接(这在管理目录结构时非常有用)。
- 删除符号链接不会影响目标文件,但如果删除目标文件,符号链接就会变成“悬空”状态(无法访问)。
创建符号链接
ln -s 原文件 符号链接文件
示例:
ln -s file1 symlink1 # 创建指向 file1 的符号链接
ls -l
2
输出示例:
lrwxrwxrwx 1 user user 5 Mar 3 12:00 symlink1 -> file1
这里 symlink1
指向 file1
,l
表示这是一个符号链接。
# 4.3 硬链接与符号链接的区别
特性 | 硬链接(Hard Link) | 符号链接(Symbolic Link) |
---|---|---|
inode 共享 | 是(指向同一 inode) | 否(拥有独立 inode) |
指向目标 | 直接指向数据块 | 仅存储目标路径 |
可跨文件系统 | 否 | 是 |
可指向目录 | 否 | 是 |
影响目标文件 | 共享数据,影响同步 | 只存储路径,不影响目标数据 |
删除目标文件的影响 | 不影响其他硬链接 | 符号链接变成“悬空”状态 |
# 4.4 何时使用硬链接和符号链接?
- 使用硬链接的情况
- 需要多个文件名共享同一数据,确保文件数据一致(如日志文件的不同版本)。
- 目标文件不会移动或跨文件系统。
- 使用符号链接的情况
- 需要在不同文件系统间创建链接(如
/usr/bin
下的命令工具指向/bin
目录)。 - 需要创建目录的快捷方式(如
/var/www/html
软链接到/home/user/website
)。 - 可能删除和替换目标文件,而不影响符号链接的路径指向。
- 需要在不同文件系统间创建链接(如
# 4.5 测试两者的行为
touch testfile
ln testfile hardlink
ln -s testfile symlink
ls -li
2
3
4
输出:
1002 -rw-r--r-- 2 user user 0 Mar 3 12:00 testfile
1002 -rw-r--r-- 2 user user 0 Mar 3 12:00 hardlink
1003 lrwxrwxrwx 1 user user 8 Mar 3 12:00 symlink -> testfile
2
3
testfile
和hardlink
共享 inode 号1002
。symlink
具有自己的 inode1003
,指向testfile
。
删除 testfile
后:
rm testfile
ls -l
2
输出:
-rw-r--r-- 1 user user 0 Mar 3 12:00 hardlink
lrwxrwxrwx 1 user user 8 Mar 3 12:00 symlink -> testfile (broken)
2
hardlink
仍然保留数据。symlink
变成了“悬空”链接(broken link)。
# 5. 文件权限与管理
在 Linux 中,文件和目录的访问权限至关重要,它决定了谁能查看、修改或执行文件。正确的权限管理可以防止数据泄露和误操作。
# 5.1 Linux 访问权限
# 5.11 文件权限的组成
Linux 中,每个文件或目录的权限分为三类用户:
- 所有者 (User, u): 创建文件的用户
- 同组用户 (Group, g): 与所有者属于相同用户组的用户
- 其他用户 (Others, o): 以上两者之外的所有用户
权限由 10 个字符组成:
-rwxr-xr--
位置 | 含义 | 示例 |
---|---|---|
第 1 个字符 | 文件类型 | - 普通文件, d 目录, l 软链接 |
2~4 位 | 所有者权限 | rwx (可读、可写、可执行) |
5~7 位 | 组权限 | r-x (可读、可执行) |
8~10 位 | 其他用户权限 | r-- (可读) |
# 5.12 查看文件权限
使用 ls -l
命令查看文件权限:
ls -l example.txt
示例输出:
-rw-r--r-- 1 user group 1024 Mar 3 10:00 example.txt
说明:
-
:普通文件(若为d
表示目录)rw-
:所有者权限(可读写)r--
:同组用户权限(仅可读)r--
:其他用户权限(仅可读)user
:文件所有者group
:文件所属组
# 5.2 修改文件权限
# (1)文字设定法
chmod [用户类别] [操作符] [权限] 文件名
符号 | 作用 |
---|---|
+ | 添加权限 |
- | 删除权限 |
= | 设定权限(清空其他权限) |
示例
chmod u+x file.txt # 赋予所有者执行权限
chmod o-r file.txt # 取消其他用户的读权限
chmod g=rw file.txt # 设定同组用户可读写
chmod a+x script.sh # 赋予所有用户执行权限
2
3
4
# (2)数字设定法
每种权限对应一个数值:
- 读(r)= 4
- 写(w)= 2
- 执行(x)= 1
组合方式
- rwx = 4+2+1 = 7
- rw- = 4+2 = 6
- r-- = 4
示例
chmod 755 file.txt # rwxr-xr-x(所有者可读写执行,其他用户可读执行)
chmod 644 file.txt # rw-r--r--(所有者可读写,其他用户仅可读)
chmod 700 file.txt # rwx------(仅所有者可读写执行)
2
3
# 5.3 修改文件所有者与组
# 5.31 修改文件所有者
使用 chown
命令修改文件所有者:
sudo chown newuser file.txt
示例:
sudo chown alice document.txt # 将文件所有者改为 alice
# 5.32 修改文件所属组
使用 chgrp
命令修改文件所属组:
sudo chgrp newgroup file.txt
示例:
sudo chgrp developers project_code.py # 将文件所属组改为 developers
# 5.33 修改文件所有者和组
sudo chown newuser:newgroup file.txt
示例:
sudo chown alice:developers report.doc # 更改所有者为 alice,所属组为 developers