• 透过inode来理解硬链接和软链接


    什么是inode?

    每个文件都对应一个唯一的inode,inode用来存储文件的元信息,包括:

    • 对应的文件
    • 文件字节数
    • 文件数据块的位置
    • 文件的inode号码
    • 文件的硬链接数
    • 文件的读写权限
    • 文件的时间戳

    在Linux系统下,创建一个文件hello.txt

    echo 'hello world' -> 'hello.txt'
    

    接着使用stat命令查看hello.txt的inode信息:

    stat hello.txt
    
    文件:hello.txt
    大小:14        	块:8          IO 块:4096   普通文件
    设备:fd00h/64768d	Inode:34025713    硬链接:1
    权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
    环境:unconfined_u:object_r:admin_home_t:s0
    最近访问:2022-08-18 15:44:56.158501724 +0800
    最近更改:2022-08-18 15:44:56.158501724 +0800
    最近改动:2022-08-18 15:44:56.158501724 +0800
    创建时间:2022-08-18 15:44:56.158501724 +0800
    

    inode和文件名

    操作系统使用inode号码来识别文件,而人使用文件名来识别文件

    人在打开文件的时候,实际上系统是先通过文件名找到对应的inode号码,然后根据inode号码找到文件inode信息,根据inode信息找到文件内容所在的数据块,最后读取数据。

    硬链接

    文件和inode的关系是一对一,而文件名和inode的关系则是一对多,系统允许多个文件名对应一个inode

    inode_relation

    inode信息中的硬链接(Links)数,就表示当前有几个文件名对应着该inode,换句话说,每个文件名就是文件的一个硬链接

    增加硬链接

    使用ln命令为hello.txt生成一个硬链接,格式:ln 源文件名 硬链接文件名

    ln hello.txt hello-hard-link.txt
    

    再用stat hello.txt查看源文件的硬链接数,值变为2

    删除硬链接

    rm -f hello-hard-link.txt
    

    再次查看硬链接数,值为1

    当一个文件的硬链接大于1时,删除一个硬链接(也就是文件名),不会影响源文件,只有当硬链接数等于0,系统才会删除源文件

    修改源文件

    修改源文件内容,会影响所有硬链接,因为硬链接都是指向同一个源文件的数据块

    软链接

    软链接也叫符号链接,很好理解,可以理解为window系统里的快捷方式

    先创建一个硬链接:

    ln hello.txt hello_hard_link.txt
    

    然后,创建一个软链接:

    ln -s hello.txt hello_s.txt
    

    此时,文件hello.txt有2个硬链接,1个软链接,接下来,删除刚刚用来创建软链接的文件名:

    rm -f hello.txt
    

    这个时候,打开文件hello_s.txt就会报错“No such file or directory”。

    刚才只是删除了一个文件名,并没有影响到源文件,但是通过软链接打开文件却报错了,并不是因为源文件不存在了,而是因为软链接指向的硬链接被删除了。

    这就是软链接和硬链接的区别,软链接指向的是文件名(也就是硬链接),硬链接指向的是文件的inode号码。

    ln

    本文永久地址GitHub

  • 相关阅读:
    什么是P = NP?问题
    跨域的几种解决方案
    【JAVA-Day49】Java LinkedList集合详解
    蓝桥杯单片机快速开发笔记——矩阵键盘
    Utilizing Transformer Representations Efficiently
    计算机毕业设计Java计算机专业招聘网站(源码+系统+mysql数据库+lw文档)
    javaweb医院门诊管理系统
    快速幂
    Channel
    【C++】标准库类型String
  • 原文地址:https://www.cnblogs.com/wangmeijian/p/16599711.html