Linux 中文件名存在哪里?

面试中被问到Linux系统下文件的文件名放在了哪里,没答出来。:-(这里总结下:

我们可以把一个磁盘分成一个或多个分区。每个分区可以包含一个文件系统。
i节点是固定长度的记录项,它包含了有关文件的大部分信息。可是就是不包含文件名!

inode包含文件的元信息,具体来说有以下内容:
  * 文件的字节数
  * 文件拥有者的User ID
  * 文件的Group ID
  * 文件的读、写、执行权限
  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  * 链接数,即有多少文件名指向这个inode
  * 文件数据block的位置

可以用stat命令,查看某个文件的inode信息:

stat example.txt**

总之,除了文件名以外的所有文件信息,都存在inode之中。
Linux 中文件名存在哪里?_第1张图片
如果仔细得观察硬盘中一个柱面组的i节点和数据块部分,可以看到上图的情况。
1. 在图中有两个目录项指向同一个i节点。每个i节点中都有一个链接计数,其值是指向该i节点的目录项数。只有当链接计数减少至0时。才可以删除该文件(也就是说可以释放该文件所占用的硬盘空间了)。这就是为什么“解除对一个文件的链接”操作并不总是意味着“释放该文件占用的磁盘块”的原因。在stat结构中,链接计数包含在st_nlink成员中,其基本系统数据类型是nlink_t。这种链接类型称为硬链接。
2. 另外一种链接类型称为符号类型,对于这种链接,该文件的实际内容(在数据块中)包含了该符号链接所指向的文件的名字。在下例中:

lrwxrwxrwx 1 root 7 Sep 1 12:33 lib -> usr/lib

该目录项中的文件名是3字符的字符串lib,而在该文件中包含了7个数据字节usr/lib。该i节点的文件类型是S_IFLNK,于是系统知道这是个符号链接。
引入符号链接的原因是为了避开硬链接的一些限制:
(1)硬链接通常要求链接和文件位于同一文件系统中。
(2)只有root用户才能创建目录的硬链接
3. i节点包含了大多数与文件有关的信息:文件系统、文件访问权限位、文件长度等等信息。stat结构中的大多数信息都取自i节点。只有两项数据存放在目录项中:文件名和i节点编号。
4. 每个文件系统各自对他们的i节点进行编号,因此目录项中的i节点编号数指向同一文件系统中的相应i节点,不能使一个目录项指向另一个文件系统的i节点。这就是为什么ln命令不能跨文件系统的原因。

你可能感兴趣的:(APUE)