硬链接到底占不占用磁盘空间?
查了很多资料都说 硬链接不占用磁盘空间,
于是乎,我做了如下实验,竟意外地发现有的硬链接也占用了磁盘空间!!!
文件系统是 ext4,centos虚拟机。
不多说,往下看吧。。。
新建了一个目录 inode_dir
[root@Gypsy_110 inode_dir]# du -sb ; df -i .
4096 .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 24 152280 1% /tmp
目录文件初始化大小为4096B,用了24个inode
拷贝一个文件过来
[root@Gypsy_110 inode_dir]# cp -a /etc/passwd .
[root@Gypsy_110 inode_dir]# ls -l
总用量 4 ----> 对应的当前目录所有文件大小总和,单位是k字节
-rw-r--r--. 1 root root 904 5月 3 00:31 passwd ----> passwd 实际大小904B
[root@Gypsy_110 inode_dir]# du -sb ; df -i .
5000 . ----> 4096B + 904B = 5000B
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 25 152279 1% /tmp ----> 用了1个inode
做个硬链接
[root@Gypsy_110 inode_dir]# ln passwd passwd.hd
[root@Gypsy_110 inode_dir]# du -sb ; df -i .
5000 . ----> 不占用磁盘空间
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 25 152279 1% /tmp ----> inode用掉的数还是25,所以未占用inode
[root@Gypsy_110 inode_dir]# ls -li passwd passwd.hd
25 -rw-r--r--. 2 root root 904 5月 3 00:31 passwd ----> 二者inode号一样
25 -rw-r--r--. 2 root root 904 5月 3 00:31 passwd.hd
鸟哥如是说:
因此,通常情况下,设置硬链接文件时,不会占用磁盘空间和inode。
新建一个硬链接只是在某个目录(硬链接所在的当前目录)下的block里多写入一条关联数据而已。
只有在当前目录的block刚好填满时,才有可能为当前目录新增一个block来记录文件名和inode的关联记录
因为硬链接所用掉的关联数据量很小,所以说硬链接通常不会改变inode和磁盘空间大小
软连接
[root@Gypsy_110 inode_dir]# ln -s passwd passwd.so
[root@Gypsy_110 inode_dir]# ls -li passwd passwd.hd passwd.so
25 -rw-r--r--. 2 root root 904 5月 3 00:31 passwd
25 -rw-r--r--. 2 root root 904 5月 3 00:31 passwd.hd
26 lrwxrwxrwx 1 root root 6 5月 3 19:03 passwd.so -> passwd ----> inode号为26
[root@Gypsy_110 inode_dir]# du -sb ; df -i .
5006 . ----> 磁盘空间增加了6B,说明这个软连接大小为6B
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 26 152278 1% /tmp ----> inode用掉的数变为26,所以占用1个inode
软连接是一个 独立的文件,拥有自己的inode和block
passwd.so 这个软连接的大小是 6B ,也就是他所连接的源文件的文件名的个数(每个字符占用1B)
为了验证这个想法又做了一个实验:
[root@Gypsy_110 test]# du -sb ; df -i .
69730 .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 26 152278 1% /tmp
[root@Gypsy_110 test]# ln -s /tmp/inode_dir/passwd passwd.so
[root@Gypsy_110 test]# du -sb ; df -i .
69751 .
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 27 152277 1% /tmp
[root@Gypsy_110 test]# echo "21+69730" |bc
69751
[root@Gypsy_110 test]#
这个软连接的目标文件是 /tmp/inode_dir/passwd 大小为 21B 证实了以上结论
软连接的block里记录的就是 目标文件的文件名,使用时是通过该文件名找到正确的目录,
然后找到该目录的block,然后从该block里找到文件名所对应的真正inode。
最后找到目标文件的block。
最后又做了个实验:
[root@Gypsy_110 inode_dir]# ll
总用量 4 ----> 当前目录总大小
-rw-r--r-- 1 root root 904 5月 3 21:02 passwd
[root@Gypsy_110 inode_dir]# du -sb; df -i .
5000 . ----> 原占用磁盘 5000B
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 24 152280 1% /tmp ----> 用掉了24个inode
[root@Gypsy_110 inode_dir]# ln passwd passwd.hd ----> 目标文件也在当前目录
[root@Gypsy_110 inode_dir]# ll
总用量 8 ----> 当前目录总大小增加4K
-rw-r--r-- 2 root root 904 5月 3 21:02 passwd
-rw-r--r-- 2 root root 904 5月 3 21:02 passwd.hd
[root@Gypsy_110 inode_dir]# du -sb; df -i .
5000 . ----> 不增加磁盘占用
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 24 152280 1% /tmp ----> 不占用inode
以上都很顺利,问题来了!!!!
[root@Gypsy_110 inode_dir]# ln /tmp/test/1.txt 1.txt.hd ----> 目标文件不在当前目录
[root@Gypsy_110 inode_dir]# ll
总用量 12 ----> 当前目录总大小增加4K
-rw-r--r-- 2 root root 24 5月 3 19:28 1.txt.hd
-rw-r--r-- 2 root root 904 5月 3 21:02 passwd
-rw-r--r-- 2 root root 904 5月 3 21:02 passwd.hd
[root@Gypsy_110 inode_dir]# du -sb; df -i .
5024 . ----> 增加了24B(即目标文件的大小)
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 152304 24 152280 1% /tmp ----> 不占用inode
[root@Gypsy_110 inode_dir]# ls -li 1.txt.hd /tmp/test/1.txt
27 -rw-r--r-- 2 root root 24 5月 3 19:28 1.txt.hd
27 -rw-r--r-- 2 root root 24 5月 3 19:28 /tmp/test/1.txt
[root@Gypsy_110 inode_dir]# ls -li passwd passwd.hd
17 -rw-r--r-- 2 root root 904 5月 3 21:02 passwd
17 -rw-r--r-- 2 root root 904 5月 3 21:02 passwd.hd
硬链接这块貌似矛盾啊,到底是怎么回事呢?
小弟愚钝,请读者不吝赐教!
阅读(4913) | 评论(1) | 转发(0) |