首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

理解 Linux 的硬链接与软链接(2)

理解 Linux 的硬链接与软链接(2)

清单 5. 查找有相同 inode 号的文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# df -i --print-type
Filesystem     Type       Inodes  IUsed    IFree IUse% Mounted on
/dev/sda7      ext4      3147760 283483  2864277   10% /
udev           devtmpfs   496088    553   495535    1% /dev
tmpfs          tmpfs      499006    491   498515    1% /run
none           tmpfs      499006      3   499003    1% /run/lock
none           tmpfs      499006     15   498991    1% /run/shm
/dev/sda6      fuseblk  74383900   4786 74379114    1% /media/DiskE
/dev/sda8      fuseblk  29524592  19939 29504653    1% /media/DiskF

# find / -inum 1114
/media/DiskE/Pictures/t3.jpg
/media/DiskF/123.txt
/bin/sync




值得一提的是,Linux 系统存在 inode 号被用完但磁盘空间还有剩余的情况。我们创建一个 5M 大小的 ext4 类型的 mo.img 文件,并将其挂载至目录 /mnt。然后我们使用一个 shell 脚本将挂载在 /mnt 下 ext4 文件系统的 indoe 耗尽(见清单 6.)。
清单 6. 测试文件系统 inode 耗尽但仍有磁盘空间的情景
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# dd if=/dev/zero of=mo.img bs=5120k count=1
# ls -lh mo.img
-rw-r--r-- 1 root root 5.0M Sep  1 17:54 mo.img
# mkfs -t ext4  -F ./mo.img
...
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
1280 inodes, 5120 blocks
256 blocks (5.00%) reserved for the super user
...
...
Writing superblocks and filesystem accounting information: done

# mount -o loop ./mo.img /mnt
# cat /mnt/inode_test.sh
#!/bin/bash

for ((i = 1; ; i++))
do
   if [ $? -eq 0 ]; then
       echo  "This is file_$i" > file_$i
   else
       exit 0
   fi
done

# ./inode_test.sh
./inode_test.sh: line 6: file_1269: No space left on device

# df -iT /mnt/; du -sh /mnt/
Filesystem     Type Inodes IUsed IFree IUse% Mounted on
/dev/loop0     ext4   1280  1280     0  100% /mnt
1.3M    /mnt/




硬链接不能对目录创建是受限于文件系统的设计(见 对目录创建硬链接将失败)。现 Linux 文件系统中的目录均隐藏了两个个特殊的目录:当前目录(.)与父目录(..)。查看这两个特殊目录的 inode 号可知其实这两目录就是两个硬链接(注意目录 /mnt/lost+found/ 的 inode 号)。若系统允许对目录创建硬链接,则会产生目录环。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# ls -aliF /mnt/lost+found
total 44
11 drwx------ 2 root root 12288 Sep  1 17:54 ./
2 drwxr-xr-x 3 root root 31744 Sep  1 17:57 ../

# stat  /mnt/lost+found/
File: `/mnt/lost+found/'
Size: 12288        Blocks: 24         IO Block: 1024   directory
Device: 700h/1792d      Inode: 11          Links: 2
Access: (0700/drwx------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2012-09-01 17:57:17.000000000 +0800
Modify: 2012-09-01 17:54:49.000000000 +0800
Change: 2012-09-01 17:54:49.000000000 +0800
Birth: -




软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块(见 )。因此软链接的创建与使用没有类似硬链接的诸多限制:
  • 软链接有自己的文件属性及权限等;
  • 可对不存在的文件或目录创建软链接;
  • 软链接可交叉文件系统;
  • 软链接可对文件或目录创建;
  • 创建软链接时,链接计数 i_nlink 不会增加;
  • 删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。
图 2. 软链接的访问清单 7. 软链接特性展示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ls -li
total 0

// 可对不存在的文件创建软链接
# ln -s old.file soft.link
# ls -liF
total 0
789467 lrwxrwxrwx 1 root root 8 Sep  1 18:00 soft.link -> old.file

// 由于被指向的文件不存在,此时的软链接 soft.link 就是死链接
# cat soft.link
cat: soft.link: No such file or directory

// 创建被指向的文件 old.file,soft.link 恢复成正常的软链接
# echo "This is an original file_A" >> old.file
# cat soft.link
This is an original file_A

// 对不存在的目录创建软链接
# ln -s old.dir soft.link.dir
# mkdir -p old.dir/test
# tree . -F --inodes
.
├── [ 789497]  old.dir/
│   └── [ 789498]  test/
├── [ 789495]  old.file
├── [ 789495]  soft.link -> old.file
└── [ 789497]  soft.link.dir -> old.dir/




当然软链接的用户数据也可以是另一个软链接的路径,其解析过程是递归的。但需注意:软链接创建时原文件的路径指向使用绝对路径较好。使用相对路径创建的软链接被移动后该软链接文件将成为一个死链接(如下所示的软链接 a 使用了相对路径,因此不宜被移动),因为链接数据块中记录的亦是相对路径指向。
1
2
3
4
5
$ ls -li
total 2136
656627 lrwxrwxrwx 1 harris harris       8 Sep  1 14:37 a -> data.txt
656662 lrwxrwxrwx 1 harris harris       1 Sep  1 14:37 b -> a
656228 -rw------- 1 harris harris 2186738 Sep  1 14:37 data.txt 6

返回列表