• Linux


    在 Linux 的文件系统中,磁盘块分成了 3 个部分。一部分称为数据区,用来存放文件内容。另一部分称为 inode 表,用来存放文件属性。第三部分称为超级块,用来存放文件系统本身的属性。文件的内容和属性分开存放,文件的属性存储在一个称为 inode 的数据结构中,inode 存放在 inode 表里,每个 inode 有一个唯一的编号对应其在 inode 表中的位置。

    Linux 中有两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接也称为符号链接(Symbolic Link)。

    硬链接

    硬链接其实是已存在文件的另一个名字,链接与原来的文件并没有什么区别,它们共享一个 inode,而 inode 包含了一个文件的所有属性。当为一个文件创建硬链时,内核不会分配新的 inode。

    huey@huey-K42JE:~/huey/linux/cmdline$ touch f1
    huey@huey-K42JE:~/huey/linux/cmdline$ ln f1 f1-hard
    huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
    total 0
    10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f1
    10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:28 f1-hard

    系统并没有为 f1-hard 分配新的 inode,f1-hard 的 inode 与 f1 一致,这说明了它们是同一个文件的两个名字。创建链接后,f1 和 f1-hard 的链接数也由 1 增加到 2。再看看使用 rm 命令的过程:

    huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
    total 0
    10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f1
    10272788 -rw-rw-r-- 2 ng ng 0 Apr 20 15:33 f1-hard
    huey@huey-K42JE:~/huey/linux/cmdline$ rm f1
    huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
    total 0
    10272788 -rw-rw-r-- 1 ng ng 0 Apr 20 15:33 f1-hard
    huey@huey-K42JE:~/huey/linux/cmdline$ rm f1-hard
    huey@huey-K42JE:~/huey/linux/cmdline$ ls -li
    total 0

    当删除文件的时候,系统只是将文件的链接数减 1,直到文件的链接数为 0 时,系统才会将磁盘的文件内容删除。

    硬链接有两个重要的限制:
    1) 硬链接不能引用自身文件系统之外的文件。即链接不能引用与该链接不在同一磁盘分区的文件。
    2) 硬链接不能引用目录(有些 Linux 版本允许超级用户使用 -d 选项创建引用目录的链接)。

    符号链接

    符号链接是为了克服硬链接的局限性而创建的。符号链接是通过创建一个特殊类型的文件来起作用的,该文件包含了指向引用文件或目录的文本指针。从这点来看,符号链接与 Windows 的快捷方式很相似。符号链接指向的文件与符号链接自身几乎没有区别。例如,将一些内容写进符号链接里,那么这些内容同样也写进了引用文件。而当删除一个符号链接时,删除的只是符号链接而没有删除引用文件。如果先于符号链接之前删除引用文件,那么这个链接依然存在,但是不指向任何文件。此时,这个链接就称为坏链接。ls 命令一般会用不同的颜色来显示坏链接,比如红色。

    软链接相比硬链接有个不足的地方是:由于软链接包含引用文件的路径信息,所以如果引用文件移动到其他目录,链接则变成一个坏链接。

    ln 命令格式

    ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
    ln [OPTION]... TARGET (2nd form)
    ln [OPTION]... TARGET... DIRECTORY (3rd form)
    ln [OPTION]... -t DIRECTORY TARGET... (4th form)

    ln 命令参数

    --backup[=CONTROL]
      如果指定的链接名已经存在,为该同名文件创建备份文件

    -b
      类似 --backup 选项,但不接受参数。

    -d, -F, --directory
      允许超级用户创建目录的硬链接(注:由于系统限制很有可能会失败,即使是超级用户)

    -f, --force
      如果指定的链接名已经存在,则覆盖该同名文件

    -n, --no-dereference
      如果指定的链接名是一个引用目录的符号链接,则将其当作是普通文件

    -i, --interactive
      如果指定的链接名已经存在,提示是否覆盖该同名文件

    -s, --symbolic
      创建符号链接而非硬链接

    -S, --suffix=SUFFIX
      使用 SUFFIX 作为备份文件的后缀

    -v, --verbose
      显示链接过程的信息

    --help display this help and exit
      打印帮助信息

    --version
      打印版本信息

    ln 实例

    a) 创建硬链接

    huey@huey-K42JE:~/huey/linux/cmdline$ ln testfile testfile-hard

    b) 创建符号链接

    huey@huey-K42JE:~/huey/linux/cmdline$ ln -s testfile testfile-sym

    c) 强制创建链接,如果指定的链接名已经存在,则覆盖该同名文件

    huey@huey-K42JE:~/huey/linux/cmdline$ ln -f testfile testfile-hard

    d) 为被覆盖的文件创建备份

    huey@huey-K42JE:~/huey/linux/cmdline$ ln -bf testfile testfile-hard

    e) 为被覆盖的文件创建备份,并以 ".~[num]~" 作为后缀

    huey@huey-K42JE:~/huey/linux/cmdline$ ln -f --backup=numbered testfile testfile-hard

    f) 为被覆盖的文件创建备份,并指定备份文件的后缀为 ".bak"

    huey@huey-K42JE:~/huey/linux/cmdline$ ln -bf -S '.bak' testfile testfile-hard

    ln 的 -n 选项

    使用 man ln 命令,-n 选项的释义是 "treat destination that is a symlink to a directory as if it were a normal file",如何理解?

    假设有 a、b 两个目录,还有一个指向 a 目录的软链接 c:

    huey@huey-K42JE:~/huey/linux/cmdline$ mkdir a b
    huey@huey-K42JE:~/huey/linux/cmdline$ ln -s a c

    现在如果要使软链接 c 改为指向 b 目录而执行下面这条命令:

    huey@huey-K42JE:~/huey/linux/cmdline$ ln -sf b c

    这并不能达到预期的效果,而是会在 c 的引用目录(即 a 目录)里创建 b 目录的软链接。这种情况下, -n 选项会将软链接 c 当作一个普通文件而被覆盖:

    huey@huey-K42JE:~/huey/linux/cmdline$ ln -sfn b c
  • 相关阅读:
    2017/08/02 工作日志
    2017/08/01 工作日志
    http随笔
    window open() 方法
    asp.net中gridview控件的一些基本使用方法
    《java.util.concurrent 包源码阅读》04 ConcurrentMap
    《java.util.concurrent 包源码阅读》03 锁
    《java.util.concurrent 包源码阅读》02 关于java.util.concurrent.atomic包
    __stdcall 与 __cdecl
    iebugs产生的原因,zoom:1的作用
  • 原文地址:https://www.cnblogs.com/huey/p/4441719.html
Copyright © 2020-2023  润新知