hardlink vs symlink

372 阅读2分钟

前言

在文件系统的底层中,有一个叫inode的数据集来描述文件的元信息,包括在磁盘上的物理位置、读写权限等。


                               .---------------> ! data ! ! data ! etc
                              /                  +------+ !------+
        ! permbits, etc ! data addresses !
        +------------inode---------------+

而我们日常看到的文件名 其实就是指向其inode信息的指针

                         .--------------> ! permbits, etc ! addresses !
                        /                 +---------inode-------------+
        ! filename ! inode # !
        +--------------------+

我们也可以通过命令进行查看,前面的就是inode number

hardlink

可以有多个文件名指向同一个inode number, 那么这些文件就是被hard link 在一起的。 而且删除、移动、重命名其中一个文件 对其他hardlink的文件没有一点影响。 当你删除了一个文件的时候其实就是删除了指向底层inode的其中一个指针,只有当所有指向该inode的指针全部被删除之后,该inode才会被移除

 ! filename ! inode # !
        +--------------------+
                        \
                         >--------------> ! permbits, etc ! addresses !
                        /                 +---------inode-------------+
        ! othername ! inode # !
        +---------------------+

symlink

俗称软链,是一种特殊的文件类型,包含一个字符串,操作系统会将其解析成指向某个文件/文件夹的绝对/相对路径,在打开的时候就会重定向到源文件。

  • 当软链被移除的时候,源文件不会受影响
  • 源文件被移除、更名、移动 也不会移除相应软链,只不过该软链会指向一个不复存在的文件
   ! filename ! inode # !
        +--------------------+
                        \
                         .-------> ! permbits, etc ! addresses !
                                   +---------inode-------------+
                                                      /
                                                     /
                                                    /
    .----------------------------------------------'
   ( 
    '-->  !"/path/to/some/other/file"! 
          +---------data-------------+
                  /                      }
    .~ ~ ~ ~ ~ ~ ~                       }-- (redirected at open() time)
   (                                     }
    '~~> ! filename ! inode # !
         +--------------------+
                         \
                          '------------> ! permbits, etc ! addresses !
                                         +---------inode-------------+
                                                            /
                                                           /
     .----------------------------------------------------'
    (
     '->  ! data !  ! data ! etc.
          +------+  +------+ 

实战操作

hardlink 可以看到hardlink.txt的inode值 和test.txt的完全一致

而且当你修改其中一个文件的内容的时候,其它的文件也会相应改变,因为他们引用的文件内容(inode)相同

symlink 我们可以看到symlink出来的文件虽然和test.txt拥有相同的内容,但是inode number不同,而且文件权限也不同

当我们删除了test.txt文件之后,symlink的文件就会找不到对应的文件

参考文章

stackoverflow.com/questions/1…

linuxgazette.net/105/pitcher…

en.wikipedia.org/wiki/Symbol…