我们使用ls -l的时候看到的除了看到文件名,还看到了文件元数据。
[root@localhost linux]# ls -l
总用量 12
-rwxr-xr-x. 1 root root 7438 "9月 13 14:56" a.out
-rw-r--r--. 1 root root 654 "9月 13 14:56" test.c
每行包含7列:
-
模式 (
-rwxr-xr-x.
): 这列显示了文件的权限和类型。第一个字符表示文件类型,例如-
表示普通文件,d
表示目录。接下来的三组字符分别表示所有者、组和其他用户的读(r)、写(w)和执行(x)权限。最后的点(.
)表示这个文件有SELinux安全上下文。 -
硬链接数 (
1
): 这列显示了文件的硬链接数量。硬链接是指向文件的指针,普通文件的硬链接数至少是1。 -
文件所有者 (
root
): 这列显示了文件的所有者用户名。 -
组 (
root
): 这列显示了文件所属的用户组。 -
大小 (
7438
): 这列显示了文件的大小,单位是字节。 -
最后修改时间 (
"9月 13 14:56"
): 这列显示了文件最后被修改的日期和时间。 -
文件名 (
a.out
和test.c
): 这是文件或目录的名称。
ls -l读取存储在磁盘上的文件信息,然后显示出来
其实这个信息除了通过这种方式来读取,还有一个stat命令能够看到更多信息:
inode
为了能解释清楚inode我们先简单了解一下文件系统:
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。
A:Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
B:超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
C:GDT,Group Descriptor Table:块组描述符,描述块组属性信息,有兴趣的同学可以在了解一下
D:块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
E:inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
F:i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
G:数据区:存放文件内容
将属性和数据分开存放的想法看起来很简单,但实际上是如何工作的呢?我们通过touch一个新文件来看看如何工作。
[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc
创建一个新文件主要有一下4个操作:
1. 存储属性
内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
2. 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。
3. 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
4. 添加文件名到目录
新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
重点
A: 文件 = 内容 + 属性(属性也是数据)
B:文件在磁盘存储的本质是:文件的内容 + 文件的属性数据。
C:Linux文件系统特定:文件内容 和 文件属性 分开存储。
D:Linux中文件的属性是一个大小固定的集合体(sysv_fs.h)。
E:我们这里讲的是inode,但是我们在日常操作的时候都是用的文件名?为什么?
目录(inode) = 文件属性 + 文件内容(文件名和inode的映射关系)
目录:
1:一个目录下不能建立同名文件。
2:查找文件的顺序:文件名 -> inode编号
3:目录的r权限标志位,本质是:允许我们读取目录的内容。文件名:inode的映射关系。
4:目录的w权限标志位,本质是:新建文件,要向目录内容中写入文件名和inode的一个映射关系。
5:如何理解一个文件的增删查改?
1. 增(Create)- 创建文件
- inode分配:当创建一个新文件时,文件系统会为该文件分配一个inode(索引节点),inode包含了文件的元数据,如权限、所有者、大小等。
- 目录项更新:文件名和inode之间的映射会被添加到目录中,目录项(dentry)是文件系统中用于快速查找文件inode的结构。
- 文件数据块分配:虽然新创建的文件可能没有数据,但文件系统可能会分配一些数据块用于将来写入数据。
2. 删(Delete)- 删除文件
- 目录项删除:删除文件首先会从目录中删除文件名和inode的映射,这使得文件名不再指向任何inode。
- 释放inode:如果没有任何硬链接指向该inode,文件系统会回收inode资源。
- 释放数据块:文件系统会回收文件占用的数据块,这些数据块可以被其他文件使用。
3. 查(Read/Query)- 读取文件
- 查找inode:通过文件名查找目录项,获取inode。
- 读取数据块:根据inode中的信息,操作系统读取文件的数据块。
- 文件系统缓存:为了提高性能,操作系统可能会将文件数据缓存在内存中,这样后续的读取操作可以直接从缓存中获取数据。
4. 改(Modify)- 修改文件
- 更新inode:修改文件可能会改变inode中的元数据,如修改时间。
- 数据块写入:如果修改涉及到文件内容的更改,操作系统会写入新的数据块,并更新inode中的数据块指针。
- 同步写入:为了保证数据的一致性,操作系统可能会使用缓冲区来暂存写入操作,然后在适当的时候将缓冲区的数据同步到磁盘。
6:找到指定的文件 -> 文件所在的目录 -> 打开 -> 根据文件名 : indie -> 目标文件的inode(逆向)
7:为什么任何一个文件任何时候都要有一个路径: 一个文件其实在访问前都是要有目录的!
8:找到指定inode的前提:
-
文件系统挂载:文件所在的分区必须已经挂载到操作系统的文件系统上,这样操作系统才能访问该分区上的文件。
-
目录结构:文件必须位于一个已知的目录路径中。文件系统通过目录树来组织文件,每个文件都有一个从根目录开始的路径。
-
文件名:需要知道要访问的文件的确切文件名,包括其扩展名(如果有的话)。
-
目录项(dentry):操作系统使用目录项来快速查找文件的inode。目录项是文件系统中的一个缓存结构,它存储了文件名到inode的映射。
-
文件路径:需要提供文件的完整路径或相对于当前工作目录的相对路径。
-
访问权限:用户或进程需要有足够的权限来访问该文件。这包括读取文件的权限,以及访问包含文件的目录的权限。
-
文件存在:要查找的文件必须实际存在于文件系统中。如果文件已被删除或路径错误,将无法找到inode。
理解硬链接
我们看到,真正找到磁盘上文件的并不是文件名,而是inode。 其实在linux中可以让多个文件名对应于同一个inode。
A:abc和def的链接状态完全相同,他们被称为指向文件的硬链接。内核记录了这个连接数,inode 263466 的硬连接数为2。
B:我们在删除文件时干了两件事情:1.在目录中将对应的记录删除,2.将硬连接数-1,如果为0,则将对应的磁盘释放。
硬链接的特点:
-
指向相同数据:硬链接共享相同的文件数据,因此对任何一个硬链接的修改都会反映在其他硬链接上。
-
文件类型:硬链接可以链接普通文件和目录,但要注意,硬链接不能跨文件系统创建,也不能链接到符号链接。
-
硬链接数量:文件的硬链接数量表示有多少个文件名指向该文件数据。删除硬链接不会删除原始文件数据,只有当所有硬链接都被删除后,文件数据才会被删除。
-
文件名无关:硬链接与文件名无关,即使原始文件名被重命名或移动,硬链接仍然有效。
注意事项:
-
不要链接目录:虽然技术上可以创建指向目录的硬链接,但这可能会导致文件系统损坏或不一致,因此通常不建议这样做。
-
文件系统限制:硬链接不能跨越不同的文件系统。如果尝试在不同的文件系统之间创建硬链接,将会导致错误。
-
权限问题:硬链接的权限与原始文件相同,即使更改硬链接的权限,也不会影响原始文件的权限。
-
删除操作:删除硬链接不会删除文件数据,只有当所有指向同一数据的硬链接都被删除后,文件数据才会被系统回收。
-
文件名更改:更改硬链接的文件名不会影响其他硬链接,因为它们指向的是相同的文件数据。
-
符号链接与硬链接的区别:符号链接(Symbolic Link)是指向另一个文件或目录的快捷方式,它有自己的文件数据,而硬链接则直接指向原始文件数据。
-
文件系统支持:所有现代的Linux文件系统都支持硬链接,但在某些特殊情况下,如网络文件系统(NFS)或某些特定的文件系统配置中,硬链接的行为可能会有所不同。
软链接
硬链接是通过inode引用另外一个文件,软链接是通过名字引用另外一个文件,在shell中的做法。在Linux系统中,软链接(也称为符号链接,Symbolic Link)是一种特殊的文件,它指向另一个文件或目录的路径。软链接类似于Windows系统中的快捷方式。
软链接的特点:
-
路径引用:软链接包含指向目标文件或目录的路径,它是一个独立的文件,有自己的权限和属性。
-
跨文件系统:软链接可以跨越不同的文件系统,指向其他文件系统上的文件或目录。
-
删除独立性:删除软链接不会影响它所指向的原始文件或目录。
-
更新灵活性:如果软链接指向的原始文件或目录被移动或重命名,软链接将变得无效,需要手动更新。
-
目录支持:软链接可以指向目录,而且使用起来相对安全,不会引起文件系统损坏。
-
文件类型:软链接可以指向普通文件或目录,但它本身是一个特殊的文件类型。
注意事项:
-
失效链接:如果软链接指向的原始文件或目录被删除或移动,软链接将变成一个失效链接(也称为悬挂链接或断链)。
-
绝对路径与相对路径:软链接可以是绝对路径或相对路径。绝对路径的软链接在任何目录下都能正确解析,而相对路径的软链接则依赖于当前工作目录。
-
权限问题:软链接的权限通常允许用户读取链接内容(即目标文件的路径),但不一定允许用户访问目标文件。执行权限允许用户通过软链接执行目标文件。
-
创建限制:不能为目录创建硬链接的规则不适用于软链接,可以安全地为目录创建软链接。
-
网络文件系统:在使用网络文件系统(如NFS)时,软链接的行为可能会受到限制或表现不同,具体取决于NFS的配置。
-
备份和同步:在备份或同步文件时,软链接可能会被复制为实际的文件或目录,这取决于使用的备份或同步工具的配置。
-
安全性:软链接可以用于隐藏文件的真实路径或创建复杂的文件结构,但这也可能导致安全问题,如路径遍历攻击。
-
文件系统支持:大多数现代文件系统都支持软链接,但在某些特殊情况下,软链接的行为可能会有所不同。
ACM时间
在Linux系统中,文件的三个时间戳(Access Time, Modify Time, Change Time)是文件属性的一部分,它们分别表示:
-
Access Time (最后访问时间) (
atime
): 这个时间戳记录了文件最后一次被访问的时间。当文件被读取时,这个时间会被更新。有些系统默认情况下会更新这个时间戳,但出于性能考虑,有些系统配置可能不会更新它。 -
Modify Time (文件内容最后修改时间) (
mtime
): 这个时间戳记录了文件内容最后一次被修改的时间。每当文件的内容发生变化时,这个时间戳就会被更新。这包括写入文件、修改文件内容或执行某些命令(如touch
)。 -
Change Time (属性最后修改时间) (
ctime
): 这个时间戳记录了文件的元数据最后一次被修改的时间。元数据包括文件的权限、所有者、组、以及文件的inode信息等。当这些属性发生改变时,ctime
会被更新。需要注意的是,ctime
并不总是反映文件内容的修改时间,而是任何导致文件状态改变的操作。