zoukankan      html  css  js  c++  java
  • 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 参数

    总结

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

    参考文章

  • 相关阅读:
    动态类型
    unlink与close关系
    Google 历年笔试面试30题
    UNIX网络编程 卷2 源代码使用
    centos安装telnet
    python中安装第三方模块
    Linux平台 Oracle 18c RAC安装Part1:准备工作
    RHEL7 配置iSCSI模拟环境
    Solaris 10主机名和IP地址步骤
    设置sqlplus不显示除查询结果外的信息
  • 原文地址:https://www.cnblogs.com/jojo-feed/p/10171157.html
Copyright © 2011-2022 走看看