Linux中的链接 ln

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节点和文件内容的关系示意图如下:

Linux中的链接 ln_第1张图片
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的软链接。

你可能感兴趣的:(Linux中的链接 ln)