文章目录
系列博文
文章目录
硬链接
当前minix文件系统目录结构
在上一章中,我们创建了minix如下的目录结构,并且进行了二进制的分析,本篇将在上一篇文章的基础上,继续对文件系统的硬链接和软链接进行二进制分析。
创建filelevel2.txt的硬链接文件
ln dirdemo/filelevel2.txt hardlink2filelevel2.txt
创建filelevel2.txt的软链接文件
ln dirdemo/filelevel2.txt -s softlink2filelevel2.txt
当前minix文件系统目录结构
hexdump文件系统
hexdump -C /dev/sdb > chapter3.hex
chapter3.hex内容如下
00000000 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000400 60 15 00 40 01 00 02 00 b0 00 00 00 00 1c 08 10 |`..@............|
00000410 8f 13 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00000420 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000800 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |?...............|
00000810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
00000aa0 00 00 00 00 00 00 00 00 00 00 00 00 fe ff ff ff |................|
00000ab0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000c00 3f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |?...............|
00000c10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
000013e0 00 00 00 00 00 00 00 00 00 00 fe ff ff ff ff ff |................|
000013f0 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
00001400 ed 41 00 00 c0 00 00 00 7f 18 b0 61 00 03 b0 00 |.A.........a....|
00001410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001420 ed 41 00 00 60 00 00 00 9d 1c a1 61 00 02 b1 00 |.A..`......a....|
00001430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001440 a4 81 00 00 0c 00 00 00 77 1c a1 61 00 01 b2 00 |........w..a....|
00001450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001460 a4 81 00 00 08 00 00 00 9d 1c a1 61 00 02 b3 00 |...........a....|
00001470 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00001480 ff a1 00 00 16 00 00 00 7f 18 b0 61 00 01 b4 00 |...........a....|
00001490 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002c000 01 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c010 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c020 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c030 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c040 02 00 64 69 72 64 65 6d 6f 00 00 00 00 00 00 00 |..dirdemo.......|
0002c050 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c060 03 00 66 69 6c 65 2e 74 78 74 00 00 00 00 00 00 |..file.txt......|
0002c070 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c080 04 00 68 61 72 64 6c 69 6e 6b 32 66 69 6c 65 6c |..hardlink2filel|
0002c090 65 76 65 6c 32 2e 74 78 74 00 00 00 00 00 00 00 |evel2.txt.......|
0002c0a0 05 00 73 6f 66 74 6c 69 6e 6b 32 66 69 6c 65 6c |..softlink2filel|
0002c0b0 65 76 65 6c 32 2e 74 78 74 00 00 00 00 00 00 00 |evel2.txt.......|
0002c0c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002c400 02 00 2e 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c410 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c420 01 00 2e 2e 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c430 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0002c440 04 00 66 69 6c 65 6c 65 76 65 6c 32 2e 74 78 74 |..filelevel2.txt|
0002c450 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002c800 68 65 6c 6c 6f 20 6d 69 6e 69 78 0a 00 00 00 00 |hello minix.....|
0002c810 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002cc00 6c 65 76 65 6c 20 32 0a 00 00 00 00 00 00 00 00 |level 2.........|
0002cc10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
0002d000 64 69 72 64 65 6d 6f 2f 66 69 6c 65 6c 65 76 65 |dirdemo/fileleve|
0002d010 6c 32 2e 74 78 74 00 00 00 00 00 00 00 00 00 00 |l2.txt..........|
0002d020 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
01000000
将创建软硬链接文件之前和之后的minix文件系统二进制数据进行比较,如下图所示,可以看到第一个inode节点(根目录)的数据区多了hardlink2filelevel2.txt和softlink2filelevel2.txt文件
二进制分析硬链接文件
根节点的data区,关于硬链接文件hardlink2filelevel2.txt的二进制描述如下,从前两个字节我们可以知道,hardlink2filelevel2.txt文件指向了第4个inode节点。
0002c080 04 00 68 61 72 64 6c 69 6e 6b 32 66 69 6c 65 6c |..hardlink2filel|
0002c090 65 76 65 6c 32 2e 74 78 74 00 00 00 00 00 00 00 |evel2.txt.......|
如下图所示,我们从创建软硬链接之前和之后的二进制数据中看出:第14个字节i_nlinks由01变成了02,而第14字节的含义就是引用计数i_nlinks,在创建硬链接之前,该inode节点仅被filelevel2.txt文件所引用,所以第14字节i_nlinks为1。
如下图所示,hardlink2filelevel2.txt和filelevel2.txt文件均指向第4个inode节点,所以i_nlinks变为2。所以硬链接相当于给一个文件取了个别名,它们都指向同一个inode节点,inode中的i_nlinks属性即为硬链接计数,既然是指向了同一个inode节点,那么他们数据区也指向的是存储介质中同一个位置,如下图所示。
所以硬链接只能指向本文件系统里的文件,不能跨越文件系统创建硬链接。
软链接
根节点的data区,关于硬链接文件softlink2filelevel2.txt的二进制描述如下,从前两个字节我们可以知道,softlink2filelevel2.txt文件指向了第5个inode节点。
0002c0a0 05 00 73 6f 66 74 6c 69 6e 6b 32 66 69 6c 65 6c |..softlink2filel|
0002c0b0 65 76 65 6c 32 2e 74 78 74 00 00 00 00 00 00 00 |evel2.txt.......|
可以看到,第5个inode节点指向的数据区内容为“dirdemo/filelevel2.txt”,和硬连接指向inode节点不同,软链接指向的是其链接文件的相对路径,所以软链接是可以跨越文件系统的。
其实,从inode的bitmap我们也可以看出,文件系统并未给软链接分配一个inode节点,如下图inode bitmap对比图所示。
在创建了软硬链接各一个文件后,inode bitmap仅置位了1个bit,根据我们前面对软硬链接的二进制分析可知,软链接文件是不占用inode节点的。