Linux文件系统
Linux 文件系统是 Linux 操作系统中用于存储和组织文件的结构。以下是一些关键概念和常见的 Linux 文件系统类型:
关键概念
-
文件系统层次结构:Linux 使用统一的文件系统层次结构,所有文件和目录都从根目录
/
开始。 -
目录结构:
/
:根目录。/home
:用户的主目录。/etc
:系统配置文件。/var
:可变数据,如日志文件。/usr
:用户程序和数据。/bin
:基本命令。/sbin
:系统管理命令。
-
权限管理:Linux 文件系统使用权限(读、写、执行)来控制对文件和目录的访问。
-
挂载:文件系统可以被挂载到目录中,使其内容可用。
常见的文件系统类型
-
ext4:最常用的 Linux 文件系统,支持大文件和大容量存储。
-
XFS:高性能文件系统,适用于大文件和高并发环境。
-
Btrfs:现代文件系统,支持快照、压缩和动态分配。
-
FAT32:常用于 USB 驱动器和其他可移动存储设备,兼容性好。
-
NTFS:Windows 文件系统,Linux 支持读写,但可能不如原生文件系统稳定。
常用命令
ls
:列出目录内容。cd
:更改目录。cp
:复制文件或目录。mv
:移动或重命名文件或目录。rm
:删除文件或目录。chmod
:更改文件或目录的权限。df
:显示文件系统的磁盘空间使用情况。mount
:挂载文件系统。
文件系统底层( ext4 和 XFS 文件系统)
ext4 文件系统
-
底层结构:
- 超级块(Superblock):存储文件系统的整体信息,如块大小、inode 数量、块组数量等。
- 块组描述符表(Block Group Descriptor Table):每个块组有一个块组描述符表,记录块组的信息,如空闲块数量、inode 数量等。
- inode 表:存储所有文件和目录的 inode 结构。
- 数据块:存储文件的实际数据。
-
物理结构:
- 块组:每个块组包含超级块、块组描述符表、块位图、inode 位图和数据块。
- 块位图:记录数据块的使用情况。
- inode 位图:记录 inode 的使用情况。
- 数据块:存储文件的实际数据。
XFS 文件系统
-
底层结构:
- 超级块(Superblock):存储文件系统的整体信息。
- AG(Allocation Group):将文件系统划分为多个 AG,每个 AG 包含数据块、inode 等。
- inode:存储文件和目录的元数据。
-
物理结构:
- AG:每个 AG 包含超级块、inode 区域、数据块区域和日志区域。
- inode 区域:存储 inode 结构。
- 数据块区域:存储文件的实际数据。
- 日志区域:用于记录文件系统的变化,以确保一致性。
比较
- ext4 使用块组的概念,而 XFS 使用 AG 的概念。
- ext4 的 inode 和数据块分布在块组中,而 XFS 的 inode 和数据块分布在 AG 中。
- XFS 在处理大文件和高并发时性能更好,而 ext4 在一般用途下更常见。
ls -la 的执行结果
数据存储位置
目录项(Directory Entry):
每个目录在文件系统中都有一个目录项,目录项包含文件名和对应的 inode 号。
目录项存储在目录的特定数据块中。
inode:
每个文件和目录都有一个 inode,inode 存储了文件的元数据,包括权限、所有者、大小、时间戳等。
inode 信息存储在文件系统的 inode 表中。
执行过程
当您执行 ls -la 命令时,系统会进行以下操作:
读取目录:首先读取当前目录的目录项,获取所有文件和子目录的 inode 号。
获取 inode 信息:根据 inode 号,读取每个文件或目录的 inode,获取其元数据。
显示信息:将获取的文件名和 inode 信息格式化并输出到终端。
i节点和数据块
在 Linux 文件系统中,i 节点(inode)和数据块是存储文件和目录信息的基本结构。
i 节点(inode)
-
定义:
- i 节点是文件系统中用于存储文件或目录元数据的结构,包括文件类型、权限、所有者、大小、时间戳(创建、修改、访问时间、指向数据块的指针)等。
-
操作:
- 创建文件:当创建一个新文件时,文件系统会分配一个新的 i 节点,并在目录中添加一个目录项,指向该 i 节点。
- 读取文件:读取文件时,首先通过目录项获取对应的 i 节点,然后根据 i 节点中的信息找到数据块。
- 修改文件:修改文件内容时,文件系统会更新数据块,并可能更新 i 节点中的时间戳。
- 删除文件:删除文件时,文件系统会从目录中移除对应的目录项,并释放 i 节点和数据块。
-
存储:
- 在传统 Unix 文件系统中(如 ext2、ext3、ext4 等),i 节点表通常存储在文件系统的固定位置,通常是文件系统的预留区域。
文件系统会维护一个 i 节点表,其中包含所有文件和目录的 i 节点信息,通过这个表可以找到每个文件或目录对应的 i 节点。 - 一些现代文件系统(如 Btrfs、XFS 等)采用了不同的方式来管理 i 节点,可能会将 i 节点信息分散存储在文件系统的数据结构中,而不是集中存储在一个表中。
- 在传统 Unix 文件系统中(如 ext2、ext3、ext4 等),i 节点表通常存储在文件系统的固定位置,通常是文件系统的预留区域。
数据块
-
定义:
- 数据块是文件系统中用于存储文件实际数据的基本单位。文件的内容存储在一个或多个数据块中。
-
操作:
- 写入数据:当写入数据到文件时,文件系统会分配一个或多个数据块,并将数据写入这些块中。
- 读取数据:读取文件时,文件系统根据 i 节点中的数据块指针读取相应的数据块。
- 扩展文件:如果文件增加了数据,文件系统可能需要分配新的数据块,并更新 i 节点中的数据块指针。
- 释放数据块:当文件被删除或截断时,文件系统会释放不再使用的数据块。
具体操作示例
-
创建文件:
touch example.txt
这将创建一个新的文件
example.txt
,并分配一个新的 i 节点。 -
查看 i 节点 信息:
ls -i example.txt
这将显示
example.txt
的 i 节点号。 -
查看文件内容:
cat example.txt
这将读取文件内容,文件系统会根据 i 节点找到数据块并读取数据。
-
删除文件:
rm example.txt
这将删除
example.txt
,并释放其 i 节点和数据块。
vim和重定向的区别
vim打开一个已经存在的文件的时候,实际上创建了一个新的i节点,然后改变文件名和i节点的链接。
而重定向输出到文件末尾不会改变i节点。
vim打开一个存在的文件夹的时候,实际上是创建了一个和原文件相同的隐藏文件,这样既可以让其他用户访问该文件,也可以在出现异常断电的时候保存未完成的文件。
rm
以下是关于 rm
命令的一些重要知识:
-
基本用法:
- 删除单个文件:
rm filename
- 删除多个文件:
rm file1 file2 file3
- 删除单个文件:
-
常用选项:
-f
:强制删除,不提示确认。-i
:交互式删除,删除前会询问确认。-r
或-R
:递归删除,用于删除目录及其内容。-v
:显示详细的删除过程。
-
删除目录:
- 删除空目录:
rmdir dirname
- 删除非空目录:
rm -r dirname
- 删除空目录:
-
安全性:
- 使用
rm
命令时要小心,因为删除的文件通常无法恢复。 - 可以使用
-i
选项来增加安全性,避免误删。
- 使用
rm
命令的底层实现是通过系统调用来完成文件或目录的删除操作。具体来说,rm
命令会调用unlink()
系统调用来删除一个文件,或者调用rmdir()
系统调用来删除一个目录。这些系统调用会直接与文件系统交互,告诉文件系统删除指定的文件或目录。
在底层,文件系统会更新文件系统的数据结构,标记被删除的文件或目录的磁盘空间为可重用。这样,被删除的文件或目录在文件系统中就不再存在,但实际上数据并没有被完全擦除,只是被标记为可覆盖。
软链接、硬链接
以下是关于 ln
命令、软链接、硬链接以及文件访问控制列表(File Access Control Lists,facl)的相关知识:
-
ln
命令:ln
命令用于创建链接(link),可以创建硬链接或软链接。- 语法:
ln [选项] 源文件 目标文件
- 常用选项:
-s
:创建软链接(符号链接)。-f
:强制创建链接,覆盖已存在的目标文件。
-
软链接(符号链接):
- 软链接是一种特殊的文件,它包含指向另一个文件的路径。
- 软链接类似于 Windows 中的快捷方式,可以跨文件系统,但源文件被删除后软链接失效。
- 创建软链接:
ln -s 源文件 目标文件
-
硬链接:
- 硬链接是文件系统中的一个目录项,指向同一索引节点(inode)的不同文件名。
- 硬链接只能在同一文件系统内创建,删除源文件不影响硬链接的可用性。
- 创建硬链接:
ln 源文件 目标文件
-
文件访问控制列表(facl):
- 文件访问控制列表(facl)是一种用于控制文件和目录访问权限的扩展机制。
- facl 允许对文件或目录设置更精细的权限控制,包括用户、组和其他用户的读、写、执行权限。
- 常用命令:
- 设置 facl:
setfacl
- 查看 facl:
getfacl
- 设置 facl:
以下是更多关于 ln
命令、软链接、硬链接和文件访问控制列表(facl)的知识:
-
硬链接与软链接的区别:
- 硬链接:硬链接是文件系统中的目录项,多个文件名指向同一个 inode,删除源文件不影响硬链接的可用性,但不能跨文件系统。
- 软链接:软链接是一个特殊的文件,包含指向另一个文件的路径,源文件被删除后软链接失效,可以跨文件系统。
- 软链接是通过存储源文件的路径信息来访问文件内容,而不是直接通过数据块或 inode 访问文件。
-
使用场景:
- 硬链接适合在同一文件系统内对同一文件创建多个别名,节省存储空间。
- 软链接适合跨文件系统或需要动态指向不同文件的情况,如软件安装目录的符号链接。
-
文件访问控制列表(facl):
- facl 提供了更灵活的权限控制,可以为文件或目录设置额外的访问权限。
- 通过 facl,可以指定不同用户或用户组对文件或目录的读、写、执行权限,实现更细粒度的权限控制。
-
facl 命令示例:
setfacl -m u:user:rw- file.txt #设置facl(为用户 user 设置读写权限)
getfacl file.txt #查看 facl:
- 注意事项:
- 在使用链接时要注意不要形成循环链接,避免出现死循环。
- 使用 facl 时要谨慎设置权限,确保文件和目录的安全性和可访问性。