背景故事
今天偶然打开深度操作系统的终端查看系统的挂载情况,发现没有/home
,但我明明记得家目录是做了单独分区的。就在这时,我发现有一个分区的大小和家目录一样,就是 /data
。
可是在家里pwd明明就是在/home
呀~~~~~
猜想1:软链接
第一个猜想就是软链接:毕竟软链接是最常用的文件链接方式。
- 软链接的创建:
ln -s 源 目标
- 软链接的查看:
ls -l 目标
,会在行末显示一个箭头,如下图所示。
因此,我立刻ls -ld /home
,然而,并没有看到那个箭头。
猜想2:硬链接
既然不是软链接,那么很有可能就是硬链接了。
- 硬链接的创建:
ln 源 目标
- 硬链接的查看:硬链接无法直接查看,只能获取inode编号然后遍历。一些线索:
- inode引用计数(
ls -l
第二列查看):这个文件有多少入口。对于普通文件,有多少引用计数就表示了有多少硬链接。目录就比较复杂,包含这四类情况:1) 绝对路径;2)从自身通过./
进入;3)从子目录通过../
进入;4)其他通过ln
建立的硬链接 - 查看inode:
ls -i
第一列就是inode编号。
- inode引用计数(
ls -i
查看这两处,果然同样的inode。但是,硬链接是不能跨分区建立的!那么还有什么可能情况呢?查阅资料得知,还有一种可能是挂载。
猜想3:挂载
mount 通常是用来挂载设备,但也可以用来挂载文件。
- 挂载一个文件夹到另一个文件夹:
sudo mount --bind dir1/ dir2
,将挂载信息写入到/etc/fstab
,则可以在系统加载时就进行挂载。 - 查看挂载
vim /proc/self/mountinfo
,该文件可以查看到挂载信息
因此,我使用 vim /etc/fstab
查看,果然,/data/home是挂载在/home的。
三者区别
我们把硬盘分区比作一座山,文件比作山洞,那么这三者可以这么理解:软链接是个路标,硬链接是一个山洞的几个洞口,挂载则是虫洞,能够在不同山之间穿梭。软链接是最简单,最方便的,但很多软件并不识别:例如git,dockerfile,是不会把软链接的文件纳入管理的。硬链接可以避免这个问题,但它仅限于同一个分区才能做硬链接(一个山洞的洞口不会出现在两座山上),挂载则可以跨分区,但缺点是需要root权限
链接方式 | 优点 | 缺点 |
---|---|---|
软链接 | 简单、灵活 | 不被git、dockerfile识别 |
硬链接 | “看不出“是链接(几处入口是等效的),可被软件识别 | 不能跨分区 |
挂载 | 可以跨分区,可以被软件识别 | 需要root权限 |