Linux下硬链接和软链接

本文详细介绍了Linux系统中硬链接(HardLink)与软链接(SymbolicLink)的概念及使用方法。通过具体实例展示了如何创建这两种类型的链接,以及它们在安全性、使用场景等方面的差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

连结档的介绍: ln
什么是连结档呢?其实连结档有点类似 Windows 底下的『快捷方式』!也就是很多的连结档案( link file )其实都指向同一个来源档案( source file )!不过,在所有的文件类型当中, 连结档算是比较难理解的一部份了!因为连结档还分成 Hard link 与 symbolic link 两种,这两种连结档在架构上是完全不一样的咚咚,底下就来好好的谈一谈先!


  • Hard Link (硬式连结或实际连结)
    在前一节当中,我们提到档案的读取方式为:
    1. 先由一层一层的目录取得档案相关的关连数据,
    2. 再到对应的 inode 取得档案的属性,以及档案内容数据所在的 Block ,
    3. 最后到 Block area 取得档案的数据。
    那么 hard link 怎么制作档案的连结呢?!很简单, Hard Link 只是在某个目录下新增一个该档案的关连数据而已!

    举个例子来说,假设我的 /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 与磁盘空间的大小喔!
    鸟哥的图示
    由于 hard link 是在同一个 partition 上面进行数据关连的建立,所以 hard link 是有限制的:
    • 不能跨 Filesystem;
    • 不能 link 目录。
    不能跨 Filesystem 还好理解,因为 hard link 本来就是在一个 partition 内建立关连性的, 那不能 hard link 到目录又是怎么回事呢?这是因为如果使用 hard link 链接到目录时, 链接的数据被需要连同被链接目录底下的所有数据都建立链接,举例来说,如果你要将 /etc 使用硬式链接建立一个 /etc_hd 的目录时,那么在 /etc_hd 底下的所有数据同时都与 /etc 底下的数据要建立 hard link 的,而不能仅是连结到 /etc_hd 与 /etc 而已。 并且,未来如果需要在 /etc_hd 底下建立新档案时,连带的, /etc 底下的数据又得要建立一次 hard link ,因此造成环境相当大的复杂度。 所以啰,目前 hard 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 如果不加任何参数的话,那么就是 Hard Link 啰!如同上面的情况,增加了 hard link 之后,可以发现使用 ls -l 时,显示的 link 那一栏属性增加了!而如果这个时候砍掉 passwd 会发生什么事情呢?呵呵! passwd-hd 的内容还是会跟原来 passwd 相同,但是 passwd-so 就会找不到该档案啦!就是这样!了解了吗?!

    而如果 ln 使用 -s 的参数时,就做成差不多是 Windows 底下的『快捷方式』的意思( Symbolic Link,较常用! )。当你修改 Linux 下的 link 档案时,则更动的其实是『原始档』,呵呵, 所以不论你的这个原始档被连结到哪里去,只要你修改了连结档,呵呵!原始档就跟着变啰! 以上面为例,由于你使用 -s 的参数建立一个名为 passwd-so 的档案,则你修改 passwd-so 时,其内容与 passwd 完全相同,并且,当你按下储存之后,被改变的将是 passwd 这个档案!

    此外,如果你做了底下这样的连结:
    • ln -s /bin /root/bin
    那么如果你进入 /root/bin 这个目录下,『请注意呦!该目录其实是 /bin 这个目录,因为你做了连结档了!』所以,如果你进入 /root/bin 这个刚刚建立的链接目录, 并且将其中的数据杀掉时,嗯! /bin 里面的数据就通通不见了!这点请千万注意!并不是 /root 底下的资料都是 root 的!还需要注意一下该属性才行!(其实可以透过 pwd -P 去观察!)

    基本上, Symbolic link 的用途比较广,所以您要特别留意 symbolic link 的用法呢!未来一定还会常常用到的啦!


  • 关于目录的 link 数量:
    或许您已经发现了,那就是,当我们以 hard link 进行『档案的连结』时,可以发现,在 ls -l 所显示的第二字段会增加一才对,那么请教,如果建立目录时,他默认的 link 数量会是多少? 让我们来想一想,一个『空目录』里面至少会存在些什么?呵呵!就是存在 . 与 .. 这两个目录啊! 那么,当我们建立一个新目录名称为 /tmp/testing 时,基本上会有三个东西,那就是:
    • /tmp/testing
    • /tmp/testing/.
    • /tmp/testing/..
    而其中 /tmp/testing 与 /tmp/testing/. 其实是一样的!都代表该目录啊~而 /tmp/testing/.. 则代表 /tmp 这个目录,所以说,当我们建立一个新的目录时, 『新的目录的 link 数为 2 ,而上层目录的 link 数则会增加 1 』 不信的话,我们来作个测试看看:
    [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
    
    瞧!原本的所谓上层目录 /tmp 的 link 数量由 5 增加为 6 ,至于新目录 /tmp/testing 则为 2 ,这样可以理解目录的 link 数量的意义了吗?! ^_^
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值