背景

之前学习过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号,所以不同于直接拷贝文件,不会占用多余的存储空间

参考

文章目录