Linux学习笔记 软链接和硬链接

Linux 中,“everything is file”。接下来给大家介绍 linux 如何通过链接,达到节省磁盘空间、共享文件等目的。链接文件有两种方式,软链接(soft link)和硬链接(hard link)。

考虑这几个场景。

  1. 假如你在 Linux 系统中有一堆媒体文件,你想将他们分类,但一部电影或者一首歌往往能打上几个标签,比如说陈奕迅的《不良嗜好》,我想把这歌,放到 音乐/歌手/陈奕迅/U-87/ 的文件夹中,又想把它放到 音乐/作词/黄伟文/2005/ 文件夹中,更想把它放到 曲风/R&B 文件中。。。但我不想使用复制,因为一首无损都 30M 左右大小了,U-87 一专辑都几百M 了,我有数十个专辑的歌想要这样处理。如果要复制的话,磁盘容量很快就满了。

  2. 有一堆重要的日志要备份,不想被系统的定时任务删除(比如只保留30天的日志)。比如我想备份的 8月份的日志,比如 是 /var/log/nginx/access.log-201808 开头的所有文件。大概有几百G的。但不想复制黏贴占用过多的磁盘空间。同时系统备份,系统不停写日志文件(比如现在是 8月31号),我的备份文件也能同时修改。不用重复备份。

  3. 我用 golang 的两个版本。一个是用于开发的,和生产环境的一样。另外一个就比较新的,有很多的新特性。我想在开发的时候用生产环境的 sdk,而平时自己的小玩具用最新版本。要如何弄呢?

答曰: 1,2 场景可以用 硬链接(hard link)。3 可以用软连接(soft link 或者 symbolic link)。这是些什么东西? 简单地解释就是,硬链接相当于一个指针,指向同一个文件结点(node)。就是原文件删除,并不会真正地删除,当没有指针指向这个结点的时候,文件才会真正地被删除。而软连接就相当于 windows 的快捷方式,指向的是文件的路径。下面再详细解释吧

硬链接

Linux 中的文件的表示分成两部分,一部分是元数据(metadata),用于描述文件的名字、大小、更新时间、权限,Inode号之类的,另一部分才是文件的数据。Linux 中文件的唯一标识是 Inode 号,系统查找文件就是通过 Inode 的索引找到 Inode号从而找到文件。

linux 中文件表示

接下来看一个例子,比如我现在创建一个文件 file1,里面的内容是Hello World

    echo "Hello World" >> file1

查看该文件的 Inode 号

    ls -il | grep "file1"
81940 -rw-rw-r-- 1 zgj zgj 24 Aug 30 21:10 file1

或者

    stat file1
    File: ‘file1’
      Size: 24          Blocks: 8          IO Block: 4096   regular file
    Device: fd01h/64769d    Inode: 81940       Links: 1
    Access: (0664/-rw-rw-r--)  Uid: ( 1001/     zgj)   Gid: ( 1001/     zgj)
    Access: 2018-08-30 21:10:01.204598497 +0800
    Modify: 2018-08-30 21:10:44.753614034 +0800
    Change: 2018-08-30 21:10:44.753614034 +0800

可以看到file1Inode号是: 81940

给文件创建一个硬链接

    ln file1 file2

再来看看变化

    ls -il | grep "file"
    81940 -rw-rw-r-- 2 zgj zgj 24 Aug 30 21:10 file1
    81940 -rw-rw-r-- 2 zgj zgj 24 Aug 30 21:10 file2

有什么变化呢?

  1. file1 和 file2 共享同一个 Inode,都是 81940
  2. 就是权限后面那个数字(那个数字是指向文件的链接数),1->2,+1s了。 不同与复制黏贴,硬链接相当于一个指向文件的指针,文件里面的内容改变了,硬链接的文件也会跟着改变。如果链接数是0,这个文件就相当于不存在了。

再操作一下

我将 file2 的内容再添加一条 ”Hello Linux“

    echo "Hello Linux" >> file2
    cat file1
    Hello World
    Hello Linux

为何如此,因为 file1 和 file2 就是同一个文件。 而查找系统中 file1 的所有硬链接可以这样

    find ~ -inum 81940
    #或者
    find ~ -samefile file1

总结

使用硬链接的好处是

  • 文件的内容可以同步修改(本来就是同一个文件)
  • 文件不怕被删除了,只要还有一个硬链接在文件就会存在
  • 节省空间

so,使用硬链接可以很好地满足 场景1 和 场景2 的问题了。 但 硬链接当然也有相对不太好的地方:

  • 不能对目录进行创建,只可对文件创建
  • 不能交叉文件系统进行硬链接的创建(不同文件系统,Inode 可能是一样的)
  • 硬链接文件没有自己的权限
  • 不存在的文件不能创建硬链接

而软链接就没有上述的这些问题了,接下来我们来看看软链接

软链接

软链接真的和 windows 的快捷链接差不多

  • 它自己就是一个文件,有自己的 inode 号,有自己的数据块,有自己的文件权限(软链接的权限是没啥意义的,都是 777,改软链接的权限会变成改原文件的权限)
  • 数据块的内容是文件路径
  • 软链接可以在不同的文件系统中使用
  • 可以对不存在的文件或目录创建软链接。如果原文件不在,它会找不到的
  • 创建软链接时,链接计数 link 不会增加,当然删除软连接对原文件也没有影响

与之相关的命令如下

创建

    ln -s file1 file3
ls -il | egrep "file[0-9]"
81940 -rw-rw-r-- 2 zgj zgj 36 Aug 30 21:31 file1
81940 -rw-rw-r-- 2 zgj zgj 36 Aug 30 21:31 file2
81941 lrwxrwxrwx 1 zgj zgj  5 Aug 30 22:43 file3 -> file1

查询

# 查找在主目录下的文件 file1 的软链接
find ~ -lname file1
# 查找在主目录下的文件的所有软链接
find ~ -type l -ls 

修改

在原来的基础上再添加个 -f 参数强制修改

    ln –sf file2 file3

如果是用来链接文件夹还要加个 -n 参数

总结

软链接可以在场景三中表现良好吧。而软链接相对来讲不太好的地方是,如果文件重命令或者移动路径不会跟着改,就会变成死链了。硬链接和软链接有好有坏吧,还得看场景。

参考文章

原文地址:https://www.cnblogs.com/jojo-feed/p/10171157.html