• Linux 软链接和硬链接


    在Linux 系统中,链接是一种文件共享的方式,它分为软链接和硬链接,对应的命令是ln

    什么是软连接

    软链接又叫符号链接, 它类似于 windows系统中的快捷方式,常用于将目录层次较深的文件链接到比较容易访问的目录中

    创建软链接

    使用 ln -s 源文件 软链接 命令就可以创建一个软链接,软链接可以对文件、目录、跨文件系统的文件或目录

    • 创建文件的软链接
    [root@ecs-centos-7 tt]# stat a.txt | grep Links
    Device: fd01h/64769d    Inode: 131096      Links: 1
    
    [root@ecs-centos-7 tt]# ln -s a.txt sa.txt
    [root@ecs-centos-7 tt]# ls -il
    total 4
    131096 -rw-r--r-- 1 root root 15 Aug 25 20:19 a.txt
    131100 lrwxrwxrwx 1 root root  5 Aug 25 20:22 sa.txt -> a.txt
    
    [root@ecs-centos-7 tt]# stat a.txt | grep Links
    Device: fd01h/64769d    Inode: 131096      Links: 1
    

    上面的例子中,创建了 a.txt 的软链接 sa.txt ,创建成功之后,软链接文件名后面会有一个 -> 符号指向原始文件

    创建软链接前后的 stat a.txt | grep Links 命令是查看原始文件 a.txt 的链接数量,从例子中可以看出,创建软链接之后,文件链接数保持不变

    • 创建目录的软链接
    [root@ecs-centos-7 tt]# mkdir tmp
    [root@ecs-centos-7 tt]# ln -s tmp/ stmp
    [root@ecs-centos-7 tt]# ll
    total 4
    lrwxrwxrwx 1 root root    4 Aug 26 00:38 stmp -> tmp/
    drwxr-xr-x 2 root root 4096 Aug 26 00:38 tmp
    [root@ecs-centos-7 tt]# echo "1234" > stmp/a.txt
    [root@ecs-centos-7 tt]# cat tmp/a.txt 
    1234
    
    • 创建跨文件系统的软连接

    首先查看所有的文件系统,结果如下:

    [root@ecs-centos-7 tt]# df -h
    Filesystem      Size  Used Avail Use% Mounted on
    devtmpfs        909M     0  909M   0% /dev
    tmpfs           919M     0  919M   0% /dev/shm
    tmpfs           919M  8.7M  911M   1% /run
    tmpfs           919M     0  919M   0% /sys/fs/cgroup
    /dev/vda1        40G   20G   18G  53% /
    tmpfs           184M     0  184M   0% /run/user/0
    

    从上面的例子可以看到,目前有 devtmpfs, tmpfs, /dev/vda1 三种文件系统,我们选取 tmpfs/dev/vda1来测试跨文件系统的软链接,具体测试如下:

    [root@ecs-centos-7 tt]# touch /run/test.txt
    [root@ecs-centos-7 tt]# cat /run/test.txt 
    [root@ecs-centos-7 tt]# ln -s /run/test.txt /st.txt
    [root@ecs-centos-7 tt]# echo "haha" > /st.txt 
    [root@ecs-centos-7 tt]# cat /run/test.txt 
    haha
    

    上面的测试中,首先在 tmpfs 文件系统的/run目录中创建 test.txt 文件,此时文件是没有内容的

    然后,在/dev/vda1文件系统的/ 目录创建 /run/test.txt 的软链接 st.txt, 同时往 st.txt 中写入字符串 haha

    最后,查看原始文件 /run/test.txt, 内容和软链接文件是相同的

    修改、删除软链接

    软链接也是文件的一种,只要有权限,自然是可以修改的

    • 修改软链接

    软链接是原始文件的快捷方式,所以修改软链接文件实际上修改的是原始文件,具体的请看以下实例

    [root@ecs-centos-7 tt]# cat sa.txt 
    this is a file
    [root@ecs-centos-7 tt]# cat a.txt 
    this is a file
    [root@ecs-centos-7 tt]# echo "111" >> sa.txt 
    [root@ecs-centos-7 tt]# cat sa.txt 
    this is a file
    111
    [root@ecs-centos-7 tt]# cat a.txt 
    this is a file
    111
    

    例子中,对软链接 sa.txt 进行了修改,原始文件 a.txt 的内容也跟着同步改变了

    • 删除原始文件

    软链接文件是原始文件的快捷方式,上面的例子中可以看到,删除原始文件之后,软链接文件后面的箭头指向的原始文件 a.txt 在不停机的闪动,表示链接指向的原始文件已经失效了

    通过cat sa.txt 命令查看链接内容时会提示文件不存在

    什么是硬链接

    硬链接可以看成文件的别名, 它和原始文件拥有相同的索引节点(关于索引节点的知识请查看 理解Linux中inodes)

    删除任何一处的文件,都不影响另一处文件的正常访问,只有删除最后一个文件之后,文件内容的数据块才会被删除

    熟悉 c/c++ 指针的朋友可以把硬链接看成指向同一块内存的多个指针变量,文件内容存储在指针变量指向的内存块中

    指针变量超出其作用域时会被系统回收,此时不会回收它所指向的内存的,当所有的指针变量都被回收时,才会回收它们所指向的内存(这里假设应用程序能正确的处理堆内存的回收)

    创建、修改、删除硬链接

    • 创建硬链接

    创建硬链接命令: ln 源文件 硬链接

    [root@ecs-centos-7 tt]# stat b.txt | grep Links
    Device: fd01h/64769d    Inode: 131096      Links: 1
    
    root@ecs-centos-7 tt]# ln b.txt hb.txt
    [root@ecs-centos-7 tt]# ls -li
    total 8
    131096 -rw-r--r-- 2 root root 17 Aug 25 23:40 b.txt
    131096 -rw-r--r-- 2 root root 17 Aug 25 23:40 hb.txt
    
    [root@ecs-centos-7 tt]# stat b.txt | grep Links
    Device: fd01h/64769d    Inode: 131096      Links: 2
    

    上面的例子中,创建了 b.txt 的硬链接 hb.txt

    创硬链接前后的 stat b.txt | grep Links 命令是查看 b.txt 的链接数量,从例子中可以看出,创建硬链接后文件链接数增加了

    • 修改硬链接,删除原始文件

    从以上例子中可以看出,修改硬链接文件内容,原始文件也会同步修改,而删除原始文件时,硬链接文件内容没有任何变化

    硬链接注意事项

    • 无法跨文件系统创建硬链接
    [root@ecs-centos-7 /]# ln /run/test.txt /htest.txt
    ln: failed to create hard link ‘/htest.txt’ => ‘/run/test.txt’: Invalid cross-device link
    
    • 不允许创建目录的硬链接
    [root@ecs-centos-7 tt]# ln tmp/ htmp
    ln: ‘tmp/’: hard link not allowed for directory
    

    总结

    以上分别介绍了软链接和硬链接,下面以图表的形式总结下两者的异同

    链接 索引节点号 权限 大小 创建目录链接 跨文件系统 原始文件的链接计数
    软链接 新的索引节点 有自己的文件属性和权限 和原始文件不同 不会增加
    硬链接 和原始文件相同 和原始文件相同 和原始文件相同 不能 不能 会增加
    推荐阅读

    理解Linux中inodes

  • 相关阅读:
    process crashed and the client did not handle it, not reloading the page because we reached the maximum number of attempts
    mac 查看ip
    axios和vue-axios的关系
    export default 和 export 区别
    Mac 编辑hosts文件
    npm --save-dev --save 的区别
    CommonHelper 公共类
    2.06StuModify.aspx(修改姓名,性别,所在班级)
    linux网桥浅析
    Bridge的数据在内核处理流程
  • 原文地址:https://www.cnblogs.com/wanng/p/13861951.html
Copyright © 2020-2023  润新知