基本概念
一切皆文件
文件
我们首先理解一下文件是什么,通常文件有三个组成部分:
- 文件名:唯一的标识文件,同时也定位文件的存储位置
- 数据:文件存储的数据(文件内的真实数据)
- 元数据(meta-data):元数据是描述文件的一些附加信息(例如:文件大小,创建时间,修改时间等等)
常见的文件类型
- 普通文件(Regular File):存储数据
- 目录(Directory):目录本身也是一种文件,包含指向其他文件和目录的链接
- 链接(Link):指向另一个文件或目录的引用
- 软连接(Symbolic Link)
- 硬链接(Hard Link)
文件系统
文件系统是操作系统用来组织计算机存储设备上文件和数据的方法和结构
它提供了一个组织和存取文件的方式,使用户和应用程序能够轻松地读取、写入、修改和删除文件
为了给用户提供统一的接口,方便用户使用文件系统,而不用在意不同文件系统之间的差异和实现细节,在用户层与文件系统层引入了中间层,这个中间层称为虚拟文件系统(VFS)
Linux 操作系统中用户空间,虚拟文件系统,缓存,文件系统已经存储之间的关系如下图所示:
文件系统的 索引节点(inode) 和 目录项(dentry)
- 索引节点(index node):inodes 是实现文件存储的关键。在 Linux 中,文件系统中管理的每个对象(文件或目录)表示为一个 inode。用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。
- 目录项(derectory entry):用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存。
普通文件的 inode 的数据块是指向普通文件自己的数据的
目录的 inode 的数据块是指向位于该目录下的目录项的
目录项和索引节点的关系是多对一
如下所示为 ext4 中 inode 的数据结构定义。
struct ext4_inode {
__le16 i_mode; /* File mode */
__le16 i_uid; /* Low 16 bits of Owner Uid */
__le32 i_size_lo; /* Size in bytes */
__le32 i_atime; /* Access time */
__le32 i_ctime; /* Inode Change time */
__le32 i_mtime; /* Modification time */
__le32 i_dtime; /* Deletion Time */
__le16 i_gid; /* Low 16 bits of Group Id */
__le16 i_links_count; /* Links count */
__le32 i_blocks_lo; /* Blocks count */
__le32 i_flags; /* File flags */
union {
struct {
__le32 l_i_version;
} linux1;
struct {
__u32 h_i_translator;
} hurd1;
struct {
__u32 m_i_reserved1;
} masix1;
} osd1; /* OS dependent 1 */
__le32 i_block[EXT4_N_BLOCKS];/* Pointers to blocks */
__le32 i_generation; /* File version (for NFS) */
__le32 i_file_acl_lo; /* File ACL */
__le32 i_size_high;
__le32 i_obso_faddr; /* Obsoleted fragment address */
union {
struct {
__le16 l_i_blocks_high; /* were l_i_reserved1 */
__le16 l_i_file_acl_high;
__le16 l_i_uid_high; /* these 2 fields */
__le16 l_i_gid_high; /* were reserved2[0] */
__le16 l_i_checksum_lo;/* crc32c(uuid+inum+inode) LE */
__le16 l_i_reserved;
} linux2;
struct {
__le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */
__u16 h_i_mode_high;
__u16 h_i_uid_high;
__u16 h_i_gid_high;
__u32 h_i_author;
} hurd2;
struct {
__le16 h_i_reserved1; /* Obsoleted fragment number/size which are removed in ext4 */
__le16 m_i_file_acl_high;
__u32 m_i_reserved2[2];
} masix2;
} osd2; /* OS dependent 2 */
__le16 i_extra_isize;
__le16 i_checksum_hi; /* crc32c(uuid+inum+inode) BE */
__le32 i_ctime_extra; /* extra Change time (nsec << 2 | epoch) */
__le32 i_mtime_extra; /* extra Modification time(nsec << 2 | epoch) */
__le32 i_atime_extra; /* extra Access time (nsec << 2 | epoch) */
__le32 i_crtime; /* File Creation time */
__le32 i_crtime_extra; /* extra FileCreationtime (nsec << 2 | epoch) */
__le32 i_version_hi; /* high 32 bits for 64-bit version */
__le32 i_projid; /* Project ID */
};
查看硬盘分区的 inode 信息
df -i
查看某个文件或目录的 inode 信息
文件系统的扇区(Sector)和逻辑块(Block)
- 扇区(Sector):扇区是磁盘上最小的物理存储单位。传统上,扇区大小通常为512字节,但也有一些现代磁盘使用更大的扇区大小,例如4096字节(4K扇区)
- 逻辑块(Logical Block):逻辑块是文件系统中管理数据的最小单位。文件系统将数据组织成一个个逻辑块进行管理。逻辑块的大小可以由文件系统设置,通常是4096字节(4KB)
索引节点、目录项以及文件数据的关系如下图所示:
磁盘进行格式化的时候,会被分成三个存储区域,分别是超级块、索引节点区和数据块区。
- 超级块,用来存储文件系统的详细信息,比如块个数、块大小、空闲块等等。
- 索引节点区,用来存储索引节点;
- 数据块区,用来存储文件或目录数据;
文件系统的分类
常用的Linux文件系统
-
ext2/ext3/ext4:
ext2
(Second Extended Filesystem)是早期Linux系统上使用的主要文件系统。ext3
引入了日志功能,提高了数据的可靠性和稳定性。ext4
是目前最常用的Linux文件系统,它提供了更好的性能、更大的存储能力和更好的可靠性。
-
XFS:
- XFS是一个高性能的文件系统,特别适合处理大量数据和高并发的文件操作。它支持在线扩展、压缩和加密等功能。
-
Btrfs:
- Btrfs(B-tree Filesystem)是一个新型的文件系统,旨在实现高级功能,如快照、动态卷管理和数据完整性检查。
管理 Linux 文件系统
常用命令
df
- report file system disk space usage:显示有关每个 FILE 所驻留的文件系统的信息,或默认情况下显示所有文件系统的信息。df 详细使用方法du
- estimate file space usage:递归地汇总每个文件的磁盘使用情况。du 详细使用方法lsof
- list open filesfsck
- check and repair a Linux filesystemmkfs
- build a Linux filesystemmount
- mount a filesystem(挂载一个文件系统)
fstab(文件系统表)
fstab 是 file system table的意思,即文件系统表。
它在开机的时候告诉系统挂载哪些分区、挂载点是什么、以什么格式挂载、挂载的选项等等。
然后系统在开机的时候就根据fstab内容,执行挂载操作。在挂载完之后,就可以在文件系统上进行操作。
将需要挂载的分区放入fstab之后,就不需要手动挂载。
fstab文件一行表示一个挂载操作,包含6列信息:file system、mount pt、type、options、dump、pass
- file system:设备名,卷名或者逻辑卷的 UUID
- mount pt:挂载目录
- type:文件系统的文件格式
- options:挂载选项,默认 defaults
- dump:备份选项
- pass:指明自检顺序(0为不自检,1 或 2 为自检选项,根目录设置为 1 ,其他目录只能设置为 2)