i节点
在Linux中创建文件时,Linux会做两件事情,第一是在设备上保留一块空间存储数据,第二是创建一个i节点(i-node)存放该文件的基本信息。
i节点存放文件所需的全部文件系统信息,它通常包含:
- 以字节为单位的文件长度
- 包含该文件的设备名称
- 拥有者的用户标识及id
- 所属组的用户标识及id
- 文件权限
- 上一次修改时间
- 上一次访问时间
- i节点的上一次修改时间
- 指向该文件的链接数
- 文件的类型
- 分配给该文件的块数
- ……
用户不必了解i节点的内容,但是也可以很方便的查看,使用stat FILENAME
查看你文件的i节点的信息:
$ stat name
File: 'name'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 1709368 Links: 3
Access: (0775/drwxrwxr-x) Uid: ( 1001/ tom) Gid: ( 1001/ tom)
Access: 2018-06-05 16:47:54.643771585 +0800
Modify: 2018-05-12 10:37:53.792094043 +0800
Change: 2018-06-05 16:48:35.487772167 +0800
Birth: -
文件系统将i节点存放在一个大表中,这个表叫i节点表。
目录其实是一张表,这个表的每一项都记录着目录下的一个文件的文件名和i节点号。当访问文件时,虽然用户输入的是文件名,但是系统会通过文件名后面记录的i节点号找到i节点,再通过i节点中的内容找到文件的存储位置,读出文件。
使用ls -i FILENAME
即可查看文件的i节点号。下面的例子首先创建了文件now.txt
,其内容是Hello, World!
,之后查看了其i节点号和i节点的内容,最后查看了文件内容:
$ echo "Hello, World!" > now.txt
$ ls -i now.txt
1709370 now.txt
$ stat now.txt
File: 'now.txt'
Size: 14 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 1709370 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1001/ tom) Gid: ( 1001/ tom)
Access: 2018-06-05 17:06:49.791782004 +0800
Modify: 2018-06-05 17:06:49.791782004 +0800
Change: 2018-06-05 17:06:49.791782004 +0800
Birth: -
$ cat now.txt
Hello, World!
文件名、i节点和文件内容的关系示意图如下:
硬链接
可以使用ln
命令创建一个硬链接(或者叫链接),它的特点是会有多个目录项指向同一个i节点。从用户的角度来看,用户的文件具有多个文件名,这些文件名都指向同一个文件。
通过下面的命令创建新链接:
ln TARGET LINK_NAME
其中TARGET
是一个已经存在的普通文件,而LINK_NAME
是新链接的名称。
例如,下面的命令为now.txt
创建一个在homework
目录下的名为newNow.txt
的链接:
$ ln now.txt homework/newNow.txt
$ ls -i now.txt homework/newNow.txt
1709370 homework/newNow.txt 1709370 now.txt
查看二者的i节点号:
$ ls -i now.txt homework/newNow.txt
1709370 homework/newNow.txt 1709370 now.txt
可以看到,它们确实指向了同一个i节点。
软链接
软链接也叫做符号链接,这种链接的特点是会新建一个全新的文件,在该文件中记录目标文件的路径。
使用ln
命令的-s
选项即可创建软链接,下面为now.txt
创建一个名为newSNow.txt
的软链接:
$ ln -s now.txt newSNow.txt
查看其i节点号,二者并不相同:
$ ls -il now.txt newSNow.txt
1710866 lrwxrwxrwx 1 tom tom 7 Jun 5 17:35 newSNow.txt -> now.txt
1709370 -rw-rw-r-- 2 tom tom 14 Jun 5 17:06 now.txt
newSNow.txt -> now.txt
表示newSNow.txt
是指向now.txt
的软链接。