NingG +

Linux下symbolic link 和 hard link

Linux下一切皆文件,设备也被映射为文件;(依据在哪?)

初步几点:

两种link文件

linux下link文件:为已经存在的文件,创建另一个名字(别名),而不复制文件的内容。 link文件有两种:hard link(硬链接)和symbolic link(符号链接,软链接)。

文件系统基本知识

文件系统中,几点:

这就有一种可能,即:多个文件对应同一个inode;这种情况就称为链接;

思考:文件和文件夹,在文件系统中存储是否有差异?(inode层级)

下图为创建hard link和symbolic link时,文件系统中具体的结构:

指向同一个inode的两个不同名字,hard link是相互的,只有指向同一文件inode的所有hard link都删除,文件内容才会删除;不同hard link之间互不影响,相互对立。

(附一张图片:文件系统中hard link、原文件、inode、物理存储位置,之间的关系)

hard link只能在单一文件系统中进行,不能跨文件系统,hard link只存在一个partition内建立的关联关系;hard link也不能链接到目录,本质上在文件系统层面是可以的,但操作系统层面上,可能会限制针对目录建立hard link,避免子目录通过hard link指向父目录,这样整个树状文件目录内,会产生环结构。(如果不是必须,不用纠结这一问题,记下即可,否则,可查看源码来解决)

增加hard link,本质上,只是在文件夹(硬链接所属文件夹)的block中增加一条关联到原文件inode的记录;疑问:一个文件夹下包含的文件名列表,存储在文件夹inode对应的block中?

When to use Hard Link:

中文表述一下:

指向其他link的link文件,不指向真正的inode,当源链接文件删除之后,symbolic link文件即失效;

(附一张图片:文件系统中symbolic link、源文件、inode、物理存储位置,之间的关系)

When to use Soft Link:

中文表述一下:

疑问:

查看Inode信息

指定文件的Inode信息

命令stat [file]和命令ls -dil [file]可查看文件的inode信息:

[ningg@localhost ~]$ stat .
  File: '.'
  Size: 4096      	Blocks: 8          IO Block: 4096   directory
Device: 805h/2053d	Inode: 10330113    Links: 15
Access: (0700/drwx------)  Uid: (  500/   storm)   Gid: (  500/   storm)
Access: 2015-01-28 16:58:00.000000000 +0800
Modify: 2015-01-28 16:46:52.000000000 +0800
Change: 2015-01-28 16:46:52.000000000 +0800

[ningg@localhost ~]$ ls -dil .
10330113 drwx------. 15 storm storm 4096 Jan 28 16:46 .

上述的Inode表示文件对应的inode位置,Links表示inode上对应的hard link数,仅当Links为0时,才能删除当前文件;补充一个问题:如何计算一个文件/文件夹,对应的Links数?

文件系统的Inode信息

查询当前文件系统的inode信息:

[ningg@localhost ~]$ df -i
Filesystem            Inodes   IUsed   IFree IUse% Mounted on
/dev/sda1            1875968  293264 1582704   16% /
none                  210613     764  209849    1% /dev
none                  213415       9  213406    1% /dev/shm
none                  213415      63  213352    1% /var/run
none                  213415       1  213414    1% /var/lock
/dev/sda2            7643136  156663 7486473    3% /home

创建Link文件

利用命令ln来创建link文件:

# 默认为 TARGET 文件创建一个hard link文件,并命名为LINK_NAME
ln [TARGET] [LINK_NAME]

# 为 TARGET 文件创建一个symbolic link文件,并命名为LINK_NAME
ln -s [TARGET] [LINK_NAME]

备注ln命令下,-f-n选项,当前无法弄清楚其用途,仅做标记。

参考来源

Top