连结档的介绍: ln
什么是连结档呢?其实连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!不过,在所有的文件类型当中, 连结档算是比较难理解的一部份了!因为连结档还分成 Hard link 与 symbolic link 两种,这两种连结档在架构上是完全不一样的咚咚,底下就来好好的谈一谈先!
- Hard Link (硬式连结或实际连结)
在前一节当中,我们提到档案的读取方式为:
- 先由一层一层的目录取得档案相关的关连数据,
- 再到对应的 inode 取得档案的属性,以及档案内容数据所在的 Block ,
- 最后到 Block area 取得档案的数据。
举个例子来说,假设我的 /root/crontab 为一个 hard link 的档案,他连结到 /etc/crontab 这个档案,也就是说,其实 /root/crontab 与 /etc/crontab 是同一个档案,只是有两个目录( /etc 与 /root )记录了 crontab 这个档案的关连数据罢了!也就是说,我由 /etc 这个目录所记录的关连数据可知道 crontab 的 inode 放置在 A 处,而由 /root 这个目录下的关连数据, crontab 同样也指到 A 处的 inode !所以啰, crontab 这个档案的 inode 与 block 都没有改变, 有的只是有两个目录记录了关连数据。
那这样有什么好处呢?最大的好处就是『安全!』如同上面提到的 /root/crontab 与 /etc/crontab 中, 不管哪一个档案被删除了,其实仅是移除一笔目录底下的档案关连性数据,并没有更动到原本档案的 inode 与 block 资料呢!而且,不论由那个目录链接到正确的 crontab 的 inode 与 block , 都可以正确无误的进行数据的修改喔! ^_^
一般来说,使用 hard link 设定链接文件时,磁盘的空间与 inode 的数目都不会改变! 由上面的说明来看,我们可以知道, hard link 只是在某个目录下的 block 多写入一个关连数据,所以当然不会用掉 inode 与磁盘空间啰!
Tips:
其实可能会改变的,那就是当目录的 Block 被用完时,就可能会新加一个 block 来记录,而导致磁盘空间的变化!不过,一般 hard link 所用掉的关连数据量很小,所以通常不会改变 inode 与磁盘空间的大小喔!- 不能跨 Filesystem;
- 不能 link 目录。
- Symbolic Link (符号链接或软链接,亦即是快捷方式)
相对于 hard link , Symbolic link 可就好理解多了,基本上, Symbolic link 就是在建立一个独立的档案, 而这个档案会让数据的读取指向他 link 的那个档案内容!由于只是利用档案来做为指向的动作, 所以,当来源档被删除之后,symbolic link 的档案会『开不了』, 会一直说『无法开启某档案!』。这里还是得特别留意,这个 Symbolic Link 与 Windows 的快捷方式可以给他划上等号,由 Symbolic link 所建立的档案为一个独立的新的档案,所以会占用掉 inode 与 block 喔!由上面的说明来看,似乎 hard link 比较安全,因为即使某一个目录下的关连数据被杀掉了, 也没有关系,只要有任何一个目录下存在着关连数据,那么该档案就不会不见!举上面的例子来说,我的 /etc/crontab 与 /root/crontab 指向同一个档案,如果我删除了 /etc/crontab 这个档案,该删除的动作其实只是将 /etc 目录下关于 crontab 的关连数据拿掉而已, crontab 所在的 inode 与 block 其实都没有被变动喔!
不过,不幸的是,由于 Hard Link 的限制太多了,包括无法做『目录』的 link , 所以在用途上面是比较受限的!反而是 Symbolic Link 的使用方面较广喔!好了, 说的天花乱坠,看您也差不多快要昏倒了!没关系,实作一下就知道怎么回事了!要制作连结档就必须要使用 ln 这个指令呢!
[root@linux ~]# ln [-sf] 来源文件 目标文件 参数: -s :如果 ln 不加任何参数就进行连结,那就是hard link,至于 -s 就是symbolic link -f :如果 目标文件 存在时,就主动的将目标文件直接移除后再建立! 范例: 范例一:将 /etc/passwd 复制到 /tmp 底下,并且观察 inode 与 block [root@linux ~]# cd /tmp [root@linux tmp]# cp -a /etc/passwd . [root@linux tmp]# du -sb ; df -i . 26948 . <== 先注意一下,这里的容量是多少! Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hda1 1537088 144016 1393072 10% / # 利用 du 与 df 来检查一下目前的参数~那个 du -sb # 是计算整个 /tmp 底下有多少 bytes 的容量啦! 范例二:将 /tmp/passwd 制作 hard link 成为 passwd-hd 档案 [root@linux tmp]# ln passwd passwd-hd [root@linux tmp]# du -sb ; df -i . 26948 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hda1 1537088 144016 1393072 10% / # 仔细看,即使多了一个档案在 /tmp 底下,整个 inode 与 block 的容量并没有改变! [root@linux tmp]# ls -il passwd* 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd-hd # 原来是指向同一个 inode 啊!这是个重点啊!另外,那个第二栏的连结数也会增加! 范例三:将 /tmp/passwd 建立一个符号链接 [root@linux tmp]# ln -s passwd passwd-so [root@linux tmp]# ls -li passwd* 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd 1242760 -rw-r--r-- 2 root root 1746 Jun 29 01:03 passwd-hd 1242806 lrwxrwxrwx 1 root root 6 Jul 23 20:02 passwd-so -> passwd # 仔细看喔,这个 passwd-so 指向的 inode number 不同了!这是一个新的档案~ # 这个档案的内容是指向 passwd 的,你可以看到这个档案的大小,是 6bytes , # 怎么来的?因为 passwd 共有六个字符啊!哈哈!没错~这个连结档的内容只是填写 # 链接的目标档案文件名而已!所以,你的连结档档名 (有时候含路径) 有多长,档案就多大! [root@linux tmp]# du -sb ; df -i . 26954 . Filesystem Inodes IUsed IFree IUse% Mounted on /dev/hda1 1537088 144017 1393071 10% / # 呼呼!整个容量与 inode 使用数都改变啰~确实如此啊! 范例四:删除源文件 passwd ,其他两个档案是否能够开启? [root@linux tmp]# rm passwd [root@linux tmp]# cat passwd-hd ......正常显示完毕! [root@linux tmp]# cat passwd-so cat: passwd-so: No such file or directory # 怕了吧?!竟然无法正常的开启这个档案呢~
Tips:
还记得上一章当中,我们提到的 /tmp 这个目录是干嘛用的吗?是给大家作为暂存盘用的啊! 所以,您会发现,过去我们在进行测试时,都会将数据移动到 /tmp 底下去练习~ 嘿嘿!因此,有事没事,记得将 /tmp 底下的一些怪异的数据清一清先!
而如果 ln 使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思( Symbolic Link,较常用! )。当你修改 Linux 下的 link 档案时,则更动的其实是『原始档』,呵呵, 所以不论你的这个原始档被连结到哪里去,只要你修改了连结档,呵呵!原始档就跟着变啰! 以上面为例,由于你使用 -s 的参数建立一个名为 passwd-so 的档案,则你修改 passwd-so 时,其内容与 passwd 完全相同,并且,当你按下储存之后,被改变的将是 passwd 这个档案!
此外,如果你做了底下这样的连结:- ln -s /bin /root/bin
基本上, Symbolic link 的用途比较广,所以您要特别留意 symbolic link 的用法呢!未来一定还会常常用到的啦!
- 关于目录的 link 数量:
或许您已经发现了,那就是,当我们以 hard link 进行『档案的连结』时,可以发现,在 ls -l 所显示的第二字段会增加一才对,那么请教,如果建立目录时,他默认的 link 数量会是多少? 让我们来想一想,一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们建立一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
- /tmp/testing
- /tmp/testing/.
- /tmp/testing/..
瞧!原本的所谓上层目录 /tmp 的 link 数量由 5 增加为 6 ,至于新目录 /tmp/testing 则为 2 ,这样可以理解目录的 link 数量的意义了吗?! ^_^[root@linux ~]# ls -ld /tmp drwxrwxrwt 5 root root 4096 Oct 11 05:15 /tmp [root@linux ~]# mkdir /tmp/testing1 [root@linux ~]# ls -ld /tmp drwxrwxrwt 6 root root 4096 Oct 11 13:58 /tmp [root@linux ~]# ls -ld /tmp/testing1 drwxr-xr-x 2 root root 4096 Oct 11 13:58 /tmp/testing1