GNU_UNIX命令(九) -- ln知识扩展

104 阅读3分钟

ln


描述

Linux命令之GNU_UNIX(九) -- ln一文仅对命令做了参数的介绍。其中还有相关知识点和一些技巧在这里补充。


为何要使用链接文件?

比如在init.d/目录下有许多用于启动、停止系统服务的脚本,像httpdcron,syslog等。这些脚本可接受一个自变量,start(代表启动服务)或者stop(代表停止服务)。但是另外Linux系统设计了一个额外的目录机制,就是我们看到的rc0.d到rc6.d等7个目录,每个目录相应于一个运行级。对于某个级别的启动的系统服务,就要在对应的rcX.d目录下设置相应的链接,指向init.d/目录下的启动脚本。链接所占用的磁盘空间更小,也更容易管理,每次变更只需要修改init.d目录下的本尊就好。


知识扩展

  • Linux提供了两种类型的链接方式:软链接和硬链接
    • 软链接(soft link 或者被称为 symbolic link, 有时看到symlink也是它)。这种链接的方式其实只是一个文件名的指针而已,更具体的说,软链接本生也是文件,其内容是另一个文件的名称!当Linux开启软链接时,他会循着指针找出含有实际数据的目标文件。它可以指向另一个文件系统(本机或者远程都可以),也可以指向目录。在ls -l查看时,列表中第一个字段标识“l”字样的就是软链接。软链本身的权限没有任何保护措施,所有权都是开放的,但是目标文件的权限仍不变。

      zzw:temp zzw$ file file1_link1
      file1_link1: ASCII text
      zzw:temp zzw$ ls -l file1_link1
      lrwxr-xr-x  1 zzw  staff  5  3 15 23:20 file1_link1 -> file1
      ^
      |
      这个“l”就是软链接的标识符
      
    • 硬链接(hard link)。硬链接其实根本不是“链接”,只是现有文件存于另一个目录下的“入口”而已,也就是说,硬链接与源文件只是以不同名称分居于不同目录下的目录项而已,它们指向同一个innode,具有相同的文件内容、拥有权、访问权限、属性,准确的说是磁盘上的同一块数据罢了。当硬链接被删除时,原文件依然存在;反之亦然,原文件被删除后,硬链接依然存在。对于你而言,除了文件名与目录路径可能不一样之外,根本无法区别硬链接和原文件之间的差异。

      zzw:temp zzw$ stat -x file1*
        File: "file1"
        Size: 10           FileType: Regular File
        Mode: (0644/-rw-r--r--)         Uid: (  501/     zzw)  Gid: (   20/   staff)
      Device: 1,5   Inode: 69581342    Links: 2
      Access: Thu Mar 19 01:08:30 2020
      Modify: Wed Mar 18 01:50:05 2020
      Change: Thu Mar 19 01:08:28 2020
        File: "file1_hard_link"
        Size: 10           FileType: Regular File
        Mode: (0644/-rw-r--r--)         Uid: (  501/     zzw)  Gid: (   20/   staff)
      Device: 1,5   Inode: 69581342    Links: 2
      Access: Thu Mar 19 01:08:30 2020
      Modify: Wed Mar 18 01:50:05 2020
      Change: Thu Mar 19 01:08:28 2020
      
      file1  file1_hard_link的inode值相同,说明指向同一个磁盘数据。
      
      zzw:temp zzw$ stat -x file1*
        File: "file1_hard_link"
        Size: 10           FileType: Regular File
        Mode: (0644/-rw-r--r--)         Uid: (  501/     zzw)  Gid: (   20/   staff)
      Device: 1,5   Inode: 69581342    Links: 1
      Access: Thu Mar 19 01:08:30 2020
      Modify: Wed Mar 18 01:50:05 2020
      Change: Thu Mar 19 01:10:50 2020
      
      当删除file1文件时,这个硬链接还存在,并且Links的值变为了1,表示没有链接的文件了。
      

技巧

  • 创建多个文件链接到目录下

    zzw:temp zzw$ ls -al
    total 24
    drwxr-xr-x   6 zzw  staff  192  3 19 01:26 .
    drwxr-xr-x  31 zzw  staff  992  3 18 17:07 ..
    -rw-r--r--   1 zzw  staff    6  3 19 01:25 file1
    -rw-r--r--   1 zzw  staff    6  3 19 01:25 file2
    -rw-r--r--   1 zzw  staff    6  3 19 01:26 file3
    drwxr-xr-x   2 zzw  staff   64  3 19 01:26 src
    

    若要想在src目录下创建file1,file2,file3文件的链接文件,一般可能会这样ln -s file1 file2 file3 src/, 这样出现了下面的问题。

    zzw:temp zzw$ ln -s file1 file2 file3 src/
    zzw:temp zzw$ ls src
    file1 file2 file3
    zzw:temp zzw$ ls -al src
    total 0
    drwxr-xr-x  5 zzw  staff  160  3 19 01:29 .
    drwxr-xr-x  6 zzw  staff  192  3 19 01:26 ..
    lrwxr-xr-x  1 zzw  staff    5  3 19 01:29 file1 -> file1
    lrwxr-xr-x  1 zzw  staff    5  3 19 01:29 file2 -> file2
    lrwxr-xr-x  1 zzw  staff    5  3 19 01:29 file3 -> file3
    zzw:temp zzw$ cat src/file1
    cat: src/file1: Too many levels of symbolic links
    

    问题就在于当多个文件创建的时候需要使用绝对路径。

    zzw:temp zzw$ ln -s "$PWD"/file1 "$PWD"/file2 "$PWD"/file3 src/
    zzw:temp zzw$ ls -al src
    total 0
    drwxr-xr-x  5 zzw  staff  160  3 19 01:35 .
    drwxr-xr-x  6 zzw  staff  192  3 19 01:32 ..
    lrwxr-xr-x  1 zzw  staff   46  3 19 01:35 file1 -> /Users/zzw/Develop/workspace/github/temp/file1
    lrwxr-xr-x  1 zzw  staff   46  3 19 01:35 file2 -> /Users/zzw/Develop/workspace/github/temp/file2
    lrwxr-xr-x  1 zzw  staff   46  3 19 01:35 file3 -> /Users/zzw/Develop/workspace/github/temp/file3
    zzw:temp zzw$ cat src/file1
    file1
    zzw:temp zzw$