硬链接的一些疑问
09 Mar 2019
|
|
关于 软连接硬链接inode相关概念,这篇文章深入浅出的阐释了一下, 讲的很好。主要是inode和文件系统的概念不熟,这些概念以及linux的实现,对很多应用都有影响(比如文件分元数据和实际数据,这个设计很多编码方案都这么搞,linux相关设计概念可是个宝藏,读一遍显然是记不住的)
简单说,硬链接是复制inode,增加源文件引用计数,不改变数据域,软连接是增加一层,数据域维护整个文件。
找个对应的c++的概念来理解软硬链接,那就是硬链接就像shared_ptr 维护同一个数据,软连接就是raw pointer,或者说weak_ptr(但是没有提升能力) 硬链接总能保证数据是有效的 ,软链接只是数据的一个粗糙的引用语义,文件不存在软连接就无意义了。
查看软链接
ls -lR / 2> /dev/null | grep /etc/ | grep ^l
硬链接无法查看,只能通过inode判断。
ls -ilh
...
1194549 -rwxr-xr-x 4 root root 768608 May 2 2016 c++
1194549 -rwxr-xr-x 4 root root 768608 May 2 2016 g++
...
但是能查找,列出当前目录下所有硬链接文件
find . -type f -a \! -links 1
` 硬链接的缺陷?`
- 只能对已存在的文件进行创建
- 不能交叉文件系统进行硬链接的创建 ,inode会重复。
- 不能对目录进行创建,只可对文件创建 因为 . 和 ..也是硬链接,文件系统的一部分。如果对目录进行硬链接就环了。
为什么需要硬链接?
主要需求点是删除一个不会影响其他,又能复用文件
比如上面的例子,c++和g++实际上是同一个文件
再比如busybox命令工具箱,只有一个文件,所有的命令实现都是busybox文件的硬链接。删除文件不影响其他命令
再比如数据备份,直接硬链接,用在数据库备份上,十分迅速,这个文章可以阅读一下。http://www.mikerubel.org/computers/rsync_snapshots/#Incremental
还有文件锁应用, link unlink,pidfile?