软链接 硬链接
基于 ext2 文件系统的理解
# 1. 一些结构体
在 Linux 系统下,一切皆文件,目录也不例外。 目录文件中存储的内容,就是一个个 dir_entry
结构体。 每个结构体对应该目录下的一个文件,存储着文件的相关信息。在 ext2 文件系统中,它的结构入下:
struct ext2_dir_entry_2 {
__u32 inode; /* Inode number */
__u16 rec_len; /* Directory entry length */
__u8 name_len; /* Name length */
char name[255]; /* File name */
}
1
2
3
4
5
6
2
3
4
5
6
其中, 最重要的字段是 inode
, 文件数据的存储位置等其他重要信息都存储在里面。inode 结构体内容复杂,对于理解链接来讲,下面的部分足够 :
struct ext2_inode {
// ...
__u16 i_links_count; // 有多少个 dir_entry 结构体引用了它
// ...
__u32 i_block[EXT2_N_BLOCKS]; // 数据块指针数组,以此来找到文件的真正数据
}
1
2
3
4
5
6
2
3
4
5
6
# 2. 一个实验
在 Linux 下创建软链接和硬链接
> mkdir link
> cd link
> echo "hello" >> test.txt
> ln test.txt hardtest1
> ln test.txt hardtest2
> ln -s test.txt softtest
1
2
3
4
5
6
2
3
4
5
6
使用 ll -i
查看文件( -i 命令可以查看文件的 inode 编号)
[root@localhost link]# ll -i
总用量 12
18083458 -rw-r--r--. 3 root root 6 11月 29 02:20 hardtest1
18083458 -rw-r--r--. 3 root root 6 11月 29 02:20 hardtest2
18083459 lrwxrwxrwx. 1 root root 8 11月 29 02:20 softtest -> test.txt
18083458 -rw-r--r--. 3 root root 6 11月 29 02:20 test.txt
1
2
3
4
5
6
2
3
4
5
6
第一个字段是 inode 编号, 第三个字段是引用计数。
hardtest1、hardtest2、test.txt的 inode 编号都一样, 且引用计数刚好是3.说明硬链接和原文件共用了一个 inode。
软链接文件的内容是原文件的地址,可以通过 readlink
命令查看软链接的内容。
# 3. 一张图
# 4. 一些现象
在 Macos 上共享文件夹给虚拟机中的 CentOS, 即使 CentOS 在这个文件夹中有读写权限,也是无法创建硬链接的。反过来也一样,但是软链接是可以的。问题在于文件系统不一样。
上次更新: 2022/05/06, 18:09:58