一次使用linux硬链接的场景记录
背景
之前学习过linux的链接分为软链接和硬链接,软链接就像Windows下的快捷方式一样,很好理解也比较常用。
但是硬链接的使用场景至今从未亲自遇到过。今天遇到了必须用硬链接的一个场景,特地记录下来。
场景
在k8s pod中有一个容器,通过volume mount,把节点上的/usr/local/bin目录mount到容器中,以期能够直接使用node上的一些二进制工具,比如kubectl。
容器启动后发现遇到问题,虽然mount成功了,但是并不能找到kubectl。
于是进一步查看容器和node上这两个目录的情况:
# k8s node
root@node3:/usr/local/bin# ll
total 282360
-rwxr-xr-x 1 ubuntu 123 50597888 Aug 11 04:19 helm*
lrwxrwxrwx 1 root root 33 Dec 6 17:37 kubectl -> /var/lib/rancher/rke2/bin/kubectl*
-rwxr-xr-x 1 root root 173263640 Jan 27 2023 rke2*
-rwxr-xr-x 1 root root 2750 Jan 27 2023 rke2-killall.sh*
-rwxr-xr-x 1 root root 3434 Jan 27 2023 rke2-uninstall.sh*
-rwxr-xr-x 1 root root 65257357 Dec 6 17:40 virtctl*
看到这个软链接,就明白为什么容器里找不到kubectl了:当我们把这个目录mount到容器或pod里时,由于kubectl是软链接,保留着宿主机上的路径,而pod里又没有该文件,因此软链接失效。
解决
此时使用ln /var/lib/rancher/rke2/bin/kubectl
将软链接改为硬链接,mount到容器或pod中也能正常运行。
root@node3:/usr/local/bin# ll
total 330164
-rwxr-xr-x 1 ubuntu 123 50597888 Aug 11 04:19 helm*
-rwxr-xr-x 2 root root 48947888 Feb 23 2023 kubectl*
-rwxr-xr-x 1 root root 173263640 Jan 27 2023 rke2*
-rwxr-xr-x 1 root root 2750 Jan 27 2023 rke2-killall.sh*
-rwxr-xr-x 1 root root 3434 Jan 27 2023 rke2-uninstall.sh*
-rwxr-xr-x 1 root root 65257357 Dec 6 17:40 virtctl*
另外通过系统命令可以看到,该硬链接的文件和普通文件一样,完全看不出区别,但是由于硬链接和原文件共用底层数据和inode号,所以不同于直接拷贝文件,不会占用多余的存储空间
参考
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。