• Linux 硬链接与软链接


    1.Linux链接概念

    Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link)。默认情况下,ln命令产生硬链接。

    【硬连接】

    硬连接指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。

    【软连接】

    另外一种连接称之为符号连接(Symbolic Link),也叫软连接。软链接文件有类似于Windows的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。

    2.通过实验加深理解

    [oracle@Linux]$ touch f1          #创建一个测试文件f1
    [oracle@Linux]$ ln f1 f2          #创建f1的一个硬连接文件f2
    [oracle@Linux]$ ln -s f1 f3       #创建f1的一个符号连接文件f3
    [oracle@Linux]$ ls -li            # -i参数显示文件的inode节点信息
    total 0
    9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f1
    9797648 -rw-r--r--  2 oracle oinstall 0 Apr 21 08:11 f2
    9797649 lrwxrwxrwx  1 oracle oinstall 2 Apr 21 08:11 f3 -> f1

    从上面的结果中可以看出,硬连接文件f2与原文件f1的inode节点相同,均为9797648,然而符号连接文件的inode节点不同。

    [oracle@Linux]$ echo "I am f1 file" >>f1
    [oracle@Linux]$ cat f1
    I am f1 file
    [oracle@Linux]$ cat f2
    I am f1 file
    [oracle@Linux]$ cat f3
    I am f1 file
    [oracle@Linux]$ rm -f f1
    [oracle@Linux]$ cat f2
    I am f1 file
    [oracle@Linux]$ cat f3
    cat: f3: No such file or directory

    通过上面的测试可以看出:当删除原始文件f1后,硬连接f2不受影响,但是符号连接f1文件无效

    3.总结

    依此您可以做一些相关的测试,可以得到以下全部结论:
    1).删除符号连接f3,对f1,f2无影响;
    2).删除硬连接f2,对f1,f3也无影响;
    3).删除原文件f1,对硬连接f2没有影响,导致符号连接f3失效;
    4).同时删除原文件f1,硬连接f2,整个文件会真正的被删除。

    出处:https://www.runoob.com/note/29134

    =======================================================================================

    Linux软连接和硬链接

    创建链接

    命令:ln
    原义:link
    语法: ln 【-s】 【源文件】 【目标文件】
    若加上 - s选项则是创建软链接,不加是创建硬链接

    /* 创建软连接 */
    ln -s ./pip3.6 ./pip
    /* 创建硬链接 */ ln ./pip3.6 ./pip

    查看文件有没有链接

    • whereis pip :查看文件所在位置
    • 进入所在目录
    • ls -l |grep pip :查看文件有没有链接
      -在这里插入图片描述

    二、删除

    rm -rf 【软链接地址】
    上述指令中,软链接地址最后不能含有“/”,当含有“/”时,删除的是软链接目标目录下的资源,而不是软链接本身。
    示例:


    三、修改

    ln -snf 【新目标目录】 【软链接地址】
    这里修改是指修改软链接的目标目录
    示例:

    软链接和硬链接的区别

    硬链接

      硬链接的作用类似于原始文件的镜像副本。这些链接共享相同的 inode。对原始文件或硬链接文件所做的更改将反映在不同的文件中。删除硬链接时,其他文件不会发生任何变化。硬链接不能跨文件系统。

    软链接

      其中软链接是指向原始文件的实际链接,也称为符号链接。这些链接将具有不同的Inodes值。软链接指向原始文件,因此如果原始文件被删除,则软链接将失败。如果删除软链接,文件将不会发生任何变化。这样做的原因是,实际文件或目录的inode与"软链接"创建的文件的inode不同。软链接可以跨文件系统。 

    出处:https://blog.csdn.net/qq_34799070/article/details/123940331

    https://blog.csdn.net/zhanglixin999/article/details/122507328

    =======================================================================================

    Linux 中软链接设置方法详解

    一、软链接的设置方法

    • 首先我们分别在根目录下的home目录中建立一个新目录check,并在目录check中建立best.txt文件,并写入“You are the best”。再在根目录下的opt目录中建立新目录text。
    • 要求将/home/check/best.txt通过软链接,链接到/opt/text中,且通过软连接可在/opt/text中查看到check目录中的best.txt文件及文件中的内容。
      【前期准备】 [目录文件的设置]
    [root@localhost /]# mkdir /home/check
    [root@localhost /]# mkdir /opt/text
    [root@localhost /]# touch /home/check/best.txt
    [root@localhost /]# echo "You are the best" > home/check/best.txt 

    在这里插入图片描述
    【前期准备】 [ 查看best.txt文件 ]

    [root@localhost /]# cat /home/check/best.txt

    在这里插入图片描述
    【设置软连接】[源及链接的确定]
    根据将/home/check/best.txt通过软链接,链接到/opt/text的要求,可以得知/home/check/best.txt为源,/opt/text为链接。
    *注意创建的语法:ln -s是命令,后面跟源,再后面跟一个当前目录的软链接名

    [root@localhost /]# ln -s /home/check/best.txt /opt/text

    查看是否链接成功

    [root@localhost /]# cd /opt/text
    [root@localhost text]# ls
    best.txt
    [root@localhost text]# cat best.txt
    You are the best

    在这里插入图片描述
    此时在/opt/text中可以看到一个绿色的best.txt(注意我们看到的best.txt并不是一个文件,而是一个链接),证明软链接设置成功,我们可以在text目录中查看/home/check/best.txt文件中的内容。

    二、课后练习

    在根目录下创建目录/webdev,并且将论坛内容放置在目录内容。将/webdev通过软链接,链接到/var/www/html中。修改目录权限为777,并添加sgid权限。最终结果,论坛可以通过web访问。
    (论坛创建及安装方法可参考上一篇博客,内有详细的论坛搭建、安装的步骤。)
    部分命令提示截图如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    出处:https://blog.csdn.net/weixin_44728499/article/details/110233298

    =======================================================================================

    Linux硬链接和软链接详解(深度剖析)

    通过学习《Linux ln 命令》一节可以看到,使用 ln 命令建立硬链接和软链接非常简单,那这两种链接有什么区别,它们各自的作用和特点又是什么?为了解开这些疑问,本节将对硬链接和软链接做深度剖析。

    对硬链接的深度剖析

    首先,我们再来建立一个硬链接文件,然后看看这两个文件的特点。

    [root@localhost ~]# touch test
    #建立源文件
    [root@localhost ~]# ln /root/test /tmp/test-hard
    #给源文件建立硬链接文件 /tmp/test-hard
    [root@localhost ~]# ll -i /root/test /tmp/test-hard
    262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /root/test
    hard
    262147 -rw-r--r-- 2 root root 0 6月 19 10:06 /tmp/test-hard
    #查看两个文件的详细信息,可以发现这两个文件的 inode 号是一样的,"ll"等同于"ls -l"。

    这里有一件很奇怪的事情,我们之前在讲 inode 号的时候说过,每个文件的 inode 号都应该是不一样的。inode 号就相当于文件 ID,我们在查找文件的时候,要先查找 inode 号,才能读取到文件的内容。

    但是这里源文件和硬链接文件的 inode 号居然是一样的,那我们在查找文件的时候,到底找到的是哪一个文件呢?我们来画一张示意图,如图 2 所示。



    图 2 硬链接示意图

    在 inode 信息中,是不会记录文件名称的,而是把文件名记录在上级目录的 block 中。也就是说,目录的 block 中记录的是这个目录下所有一级子文件和子目录的文件名及 inode 的对应;而文件的 block 中记录的才是文件实际的数据。

    当我们查找一个文件,比如 /root/test 时,要经过以下流程步骤:
    1. 首先找到根目录的 inode(根目录的 inode 是系统已知的,inode 号是 2),然后判断用户是否有权限访问根目录的 block。
    2. 如果有权限,则可以在根目录的 block 中访问到 /root 的文件名及对应的 inode 号。
    3. 通过 /root/ 目录的 inode 号,可以查找到 /root/ 目录的 inode 信息,接着判断用户是否有权限访问 /root/ 目录的 block。
    4. 如果有权限,则可以从 /root/ 目录的 block 中读取到 test 文件的文件名及对应的 inode 号。
    5. 通过 test 文件的 inode 号,就可以找到 test 文件的 inode 信息,接着判断用户是否有权限访问 test 文件的 block。
    6. 如果有权限,则可以读取 block 中的数据,这样就完成了 /root/test 文件的读取与访问。

    按照这个步骤,在给源文件 /root/test 建立了硬链接文件 /tmp/test-hard 之后,在 /root/ 目录和 /tmp/ 目录的 block 中就会建立 test 和 test-hard 的信息,这个信息主要就是文件名和对应的 inode 号。但是我们会发现 test 和 test-hard 的 inode 信息居然是一样的,那么,我们无论访问哪个文件,最终都会访问 inode 号是 262147 的文件信息。

    这就是硬链接的原理。硬链接的特点如下:
    • 不论是修改源文件(test 文件),还是修改硬链接文件(test-hard 文件),另一个文件中的数据都会发生改变。
    • 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode 号是 262147 的文件)都可以被访问。
    • 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
    • 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。
    • 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。

    硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,没有其他明显的特征。这些特征都使得硬链接并不常用,大家有所了解就好。

    我们通过实验来测试一下。

    [root@localhost ~]# echo 1111 >>/root/test
    #向源文件中写入数据
    [root@localhost ~]# cat /root/test
    1111
    [root@localhost ~]# cat /tmp/test-hard
    1111
    #源文件和硬链接文件都会发生改变
    [root@localhost ~]# echo 2222 >> /tmp/test-hard
    #向硬链接文件中写入数据
    [root@localhost ~]# cat /root/test
    1111
    2222
    [root@localhost ~】# cat /tmp/test-hard
    1111
    2222
    #源文件和硬链接文件也都会发生改变
    [root@localhost ~]# rm -rf/root/test
    #删除源文件
    [root@localhost ~]# cat /tmp/test-hard
    1111
    2222
    #硬链接文件依然可常读取

    对软链接的深度剖析

    软链接也称作符号链接,相比硬链接来讲,软链接就要常用多了。我们先建立一个软链接,再来看看软链接的特点。

    [root@localhost ~]# touch check
    #建立源文件
    [root@localhost ~]# ln -s /root/check /tmp/check-soft
    #建立软链接文件
    [root@localhost ~]# ll -id /root/check /tmp/check-soft
    262154 -rw-r--r-- 1 root root 0 6月 19 11:30 /root/check
    917507 lrwxrwxrwx 1 root root 11 6月 19 11:31 /tmp/ check-soft -> /root/check
    #软链接和源文件的 inode 号不一致,软链接通过 -> 明显地标识出源文件的位置
    #在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接文件

    再强调一下,软链接的源文件必须写绝对路径,否则建立的软链接文件就会报错,无法正常使用。

    软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;其次,在文件的后面通过 "->" 显示出源文件的完整名字。所以软链接比硬链接的标志要明显得多,而且软链接也不像硬链接的限制那样多,比如软链接可以链接目录,也可以跨分区来建立软链接。

    软链接完全可以当作 Windows 的快捷方式来对待,它的特点和快捷方式一样,我们更推荐大家使用软链接,而不是硬链接。

    大家在学习软链接的时候会有一些疑问:Windows 的快捷方式是由于源文件放置的位置过深,不容易找到,建立一个快捷方式放在桌面,方便查找,那 Linux 的软链接的作用是什么呢?

    笔者个人觉得,软链接主要是为了照顾管理员的使用习惯。比如,有些系统的自启动文件 /etc/rc.local 放置在 /etc 目录中,而有些系统却将其放置在 /etc/rc.d/rc.local 中,那么干脆对这两个文件建立软链接,不论你习惯操作哪一个文件,结果都是一样的。

    如果你比较细心,则应该已经发现软链接和源文件的 inode 号是不一致的,我们也画一张示意图来看看软链接的原理,如图 3 所示。



    图 3 软链接示意图

    软链接和硬链接在原理上最主要的不同在于:硬链接不会建立自己的 inode 索引和 block(数据块),而是直接指向源文件的 inode 信息和 block,所以硬链接和源文件的 inode 号是一致的;而软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode 号是不一致的,而且在软链接的 block 中,写的不是真正的数据,而仅仅是源文件的文件名及 inode 号。

    我们来看看访问软链接的步骤和访问硬链接的流程步骤有什么不同。
    1. 首先找到根目录的 inode 索引信息,然后判断用户是否有权限访问根目录的 block。
    2. 如果有权限访问根目录的 block,就会在 block 中查找到 /tmp/ 目录的 inode 号。
    3. 接着访问 /tmp/ 目录的 inode 信息,判断用户是否有权限访问 /tmp/ 目录的 block。
    4. 如果有权限,就会在 block 中读取到软链接文件 check-soft 的 inode 号。因为软链接文件会真正建立自己的 inode 索引和 block,所以软链接文件和源文件的 inode 号是不一样的。
    5. 通过软链接文件的 inode 号,找到了 check-soft 文件 inode 信息,判断用户是否有权限访问 block。
    6. 如果有权限,就会发现 check-soft 文件的 block 中没有实际数据,仅有源文件 check 的 inode 号。
    7. 接着通过源文件的 inode 号,访问到源文件 check 的 inode 信息,判断用户是否有权限访问 block。
    8. 如果有权限,就会在 check 文件的 block 中读取到真正的数据,从而完成数据访问。

    通过这个过程,我们就可以总结出软链接的特点(软链接的特点和 Windows 中的快捷方式完全一致)。
    • 不论是修改源文件(check),还是修改硬链接文件(check-soft),另一个文件中的数据都会发生改变。
    • 删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。
    • 软链接会新建自己的 inode 信息和 block,只是在 block 中不存储实际文件数据,而存储的是源文件的文件名及 inode 号。
    • 软链接可以链接目录。
    • 软链接可以跨分区。

    我们测试一下软链接的特性。

    [root@localhost ~]# echo 111>>/root/check
    #修改源文件
    [root@localhost ~]# cat /root/check
    111
    [root@localhost ~]# cat /tmp/check-soft
    111
    #不论是源文件还是软链接文件,数据都发生改变
    [root@localhost ~]# echo 2222 >>/tmp/check-soft
    #修改软链接文件
    [root@localhost ~]# cat /tmp/check-soft
    111
    2222
    [root@localhost ~]# cat /root/check
    111
    2222
    #不论是源文件还是软链接文件,数据也都会发生改变
    [root@localhost ~]# rm -rf/root/check
    #删除源文件
    [root@localhost ~]# cat /tmp/check-soft
    cat: /tmp/check-soft:没有那个文件或目录
    #软链接无法正常使用

    软链接是可以链接目录的,例如:

    [root@localhost ~]# mkdir test
    #建立源目录
    [root@localhost ~]# ln -s /root/test/ /tmp/
    [root@localhost ~]# ll -d /tmp/test
    lrwxrwxrwx 1 root root 11 6月 19 12:43 /tmp/test->/root/test/
    #软链接可以链接目录

    出处:http://c.biancheng.net/view/6314.html

    =======================================================================================

    Linux命令详解----ln

    ln命令

    ln命令为文件或文件夹创建连接,连接类型有硬链接和符号连接两种,符号连接需要使用“-s”选项

    ln语法

    ln [选项] 参数
    

    使用 ln --help查看可用选项

    [root@node1 ~]# ln --help
    Usage: ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
      or:  ln [OPTION]... TARGET                  (2nd form)
      or:  ln [OPTION]... TARGET... DIRECTORY     (3rd form)
      or:  ln [OPTION]... -t DIRECTORY TARGET...  (4th form)
    In the 1st form, create a link to TARGET with the name LINK_NAME.
    In the 2nd form, create a link to TARGET in the current directory.
    In the 3rd and 4th forms, create links to each TARGET in DIRECTORY.
    Create hard links by default, symbolic links with --symbolic.
    When creating hard links, each TARGET must exist.  Symbolic links
    can hold arbitrary text; if later resolved, a relative link is
    interpreted in relation to its parent directory.
    
    Mandatory arguments to long options are mandatory for short options too.
          --backup[=CONTROL]      make a backup of each existing destination file
      -b                          like --backup but does not accept an argument
      -d, -F, --directory         allow the superuser to attempt to hard link
                                    directories (note: will probably fail due to
                                    system restrictions, even for the superuser)
      -f, --force                 remove existing destination files
      -i, --interactive           prompt whether to remove destinations
      -L, --logical               make hard links to symbolic link references
      -n, --no-dereference        treat destination that is a symlink to a
                                    directory as if it were a normal file
      -P, --physical              make hard links directly to symbolic links
      -s, --symbolic              make symbolic links instead of hard links
      -S, --suffix=SUFFIX         override the usual backup suffix
      -t, --target-directory=DIRECTORY  specify the DIRECTORY in which to create
                                    the links
      -T, --no-target-directory   treat LINK_NAME as a normal file
      -v, --verbose               print name of each linked file
          --help     display this help and exit
          --version  output version information and exit
    
    The backup suffix is `~', unless set with --suffix or SIMPLE_BACKUP_SUFFIX.
    The version control method may be selected via the --backup option or through
    the VERSION_CONTROL environment variable.  Here are the values:
    
    Using -s ignores -L and -P.  Otherwise, the last option specified controls
    behavior when the source is a symbolic link, defaulting to -P.
    
      none, off       never make backups (even if --backup is given)
      numbered, t     make numbered backups
      existing, nil   numbered if numbered backups exist, simple otherwise
      simple, never   always make simple backups
    
    Report ln bugs to bug-coreutils@gnu.org
    GNU coreutils home page: <http://www.gnu.org/software/coreutils/>
    General help using GNU software: <http://www.gnu.org/gethelp/>
    For complete documentation, run: info coreutils 'ln invocation'
    

    选项参数说明

    -b或--backup:删除,覆盖目标文件之前的备份;
    -d或-F或——directory:建立目录的硬连接; 
    -f或——force:强行建立文件或目录的连接,不论文件或目录是否存在; 
    -i或——interactive:覆盖既有文件之前先询问用户; 
    -n或--no-dereference:把符号连接的目的目录视为一般文件; 
    -s或——symbolic:对源文件建立符号连接,而非硬连接; 
    -S<字尾备份字符串>或--suffix=<字尾备份字符串>:用"-b"参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,预设的备份字符串是符号“~”,用户可通过“-S”参数来改变它; 
    -v或——verbose:显示指令执行过程; 
    -V<备份方式>或--version-control=<备份方式>:用“-b”参数备份目标文件后,备份文件的字尾会被加上一个备份字符串,这个字符串不仅可用“-S”参数变更,当使用“-V”参数<备份方式>指定不同备份方式时,也会产生不同字尾的备份字符串; 
    --help:在线帮助; 
    --version:显示版本信息。
    

    参数

    1. 源文件:指定连接的源文件。如果使用-s选项创建符号连接,则“源文件”可以是文件或者目录。创建硬连接时,则“源文件”参数只能是文件; 目标文件:指定源文件的目标连接文件。
    2. 目标文件:指定源文件的目标连接文件

    实例

    先使用硬链接连接一个文件夹实验一下效果

    [root@node1 data]# pwd
    /data
    [root@node1 data]# ll
    total 16
    drwxr-xr-x. 2 root root 4096 Jun 27 02:54 test
    drwxr-xr-x. 3 1001 root 4096 Jun 26 18:34 webbench-1.5
    -rw-r--r--. 1 root root 7675 May 19  2009 webbench-1.5.tar.gz
    #/data 目录下有两个目录一个文件,就在此基础上进行操作查看效果
    [root@node1 data]# ln /data/webbench-1.5 /data/test
    ln: `webbench-1.5': hard link not allowed for directory
    [root@node1 data]# ln /data/webbench-1.5 /data/test/
    ln: `webbench-1.5': hard link not allowed for directory
    [root@node1 data]# ln /data/webbench-1.5/ /data/test/
    ln: `webbench-1.5/': hard link not allowed for directory
    #怎么操作文件夹是不能连接的
    [root@node1 data]# ln /data/webbench-1.5.tar.gz /data/test
    [root@node1 data]# ls
    test  webbench-1.5  webbench-1.5.tar.gz
    [root@node1 data]# cd /data/test/
    [root@node1 test]# ls
    webbench-1.5.tar.gz
    [root@node1 test]# ls -l
    total 8
    -rw-r--r--. 2 root root 7675 May 19  2009 webbench-1.5.tar.gz
    #硬链接连接文件操作成功,相当复制文件到指定目录
    

    下边看软件连操作

    [root@node1 data]# ln -s /data/webbench-1.5 /data/test/
    [root@node1 data]# ls test
    webbench-1.5  webbench-1.5.tar.gz
    [root@node1 data]# ln -s /data/webbench-1.5 /data/test/webbench-bak
    [root@node1 data]# ls test
    webbench-1.5  webbench-1.5.tar.gz  webbench-bak
    [root@node1 data]# mkdir test/webbench-bak-2
    [root@node1 data]# ln -s /data/webbench-1.5 /data/test/webbench-bak-2
    [root@node1 data]# ls test/
    webbench-1.5  webbench-1.5.tar.gz  webbench-bak  webbench-bak-2
    [root@node1 data]# ls test/webbench-bak-2/
    webbench-1.5
    #如果目标文件夹已存在,会把当前文件夹连接到目标文件夹下生成和源文件夹同名的文件夹
    #如果目标文件夹不存在,直接连接源文件到目标文件夹,同时生成目标文件夹
    [root@node1 test]# ll
    total 12
    lrwxrwxrwx. 1 root root   18 Jun 27 03:22 webbench-1.5 -> /data/webbench-1.5
    -rw-r--r--. 2 root root 7675 May 19  2009 webbench-1.5.tar.gz
    lrwxrwxrwx. 1 root root   18 Jun 27 03:23 webbench-bak -> /data/webbench-1.5
    drwxr-xr-x. 2 root root 4096 Jun 27 03:23 webbench-bak-2
    

    备注

    以上信息本人操作实验数据,操作过程强自己记忆,想查看更过linux命令,请到http://man.linuxde.net/查看

    在进行连接的时候一定要使用全路径,否则会出现Too many levels of symbolic links错误,连接文件或文件夹不能用

    出处:https://www.cnblogs.com/xiuluo--angel/p/7086643.html

    =======================================================================================

    linux每日命令(3):ln命令 

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

    1.命令格式:

    ln [参数][源文件或目录][目标文件或目录]
    

    2.命令功能:

    Linux文件系统中,有所谓的链接(link),我们可以将其视为档案的别名,而链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link),硬链接的意思是一个档案可以有多个名称,而软链接的方式则是产生一个特殊的档案,该档案的内容是指向另一个档案的位置。硬链接是存在同一个文件系统中,而软链接却可以跨越不同的文件系统。

    软链接:

    • 软链接,以路径的形式存在。类似于Windows操作系统中的快捷方式
    • 软链接可以 跨文件系统 ,硬链接不可以
    • 软链接可以对一个不存在的文件名进行链接
    • 软链接可以对目录进行链接

    软链接就相当于windows的的快捷方式,使用场景:
    1.在文件系统中多处共享同一个较大文件时,使用软链接就可以避免创建多个副本。
    2.维护动态库文件的版本时,使用软链接,在升级库文件后,只需修改软链接的源文件,而使用该库的程序则不需要修改。

    使用原文件的绝对路径创建的软链接,不会随着软链接路径改动而失效!所以建议使用原文件绝对路径创建软链接。这时候的软链接才算得上是真正意义上相当于Windows的快捷方式,一旦生成处处可用

    硬链接:

    • 硬链接,以文件副本的形式存在。但不占用实际空间。
    • 不允许给目录创建硬链接
    • 硬链接只有在同一个文件系统中才能创建

    硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。源文件和硬链接文件都是指向同一块磁盘空间的!通过使用硬链接可达到备份数据(实际是备份节点)的效果!

    注意:

    第一,ln命令会保持每一处链接文件的同步性,也就是说,不论你改动了哪一处,其它的文件都会发生相同的变化;

    第二,ln的链接又分软链接和硬链接两种,软链接就是ln –s 源文件 目标文件,它只会在你选定的位置上生成一个文件的镜像,不会占用磁盘空间,硬链接 ln 源文件 目标文件,没有参数-s, 它会在你选定的位置上生成一个和源文件大小相同的文件,无论是软链接还是硬链接,文件都保持同步变化。

    ln指令用在链接文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则会把前面指定的所有文件或目录复制到该目录。若同时指定多个文件或目录,且最后的目的地并非是一个已存在的目录,则会出现错误信息。

    3. 命令参数:

    必要参数描述
    -b 删除,覆盖以前建立的链接
    -d 允许超级用户制作目录的硬链接
    -f 强制执行
    -i 交互模式,文件存在则提示用户是否覆盖
    -n 把符号链接视为一般目录
    -s 软链接(符号链接)
    -v 显示详细的处理过程
    选择参数描述
    -S “-S<字尾备份字符串> ”或 “--suffix=<字尾备份字符串>”
    -V “-V<备份方式>”或“--version-control=<备份方式>”
    --help 显示帮助信息
    --version 显示版本信息

    4. 常用示例

    1. 给2018.log创建一个名为link2018的软链接

    命令:

    ln -s 2018.log  link2018
    

    输出:

    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ln -s 2018.log  link2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ll
    总用量 12
    drwxrwxr-x 3 hc hc 4096 1023 11:53 ./
    drwxrwxr-x 6 hc hc 4096 1019 18:22 ../
    -rw-r--r-- 1 hc hc    0 1023 11:53 2018.log
    drwxrwxr-x 2 hc hc 4096 1018 17:42 .idea/
    lrwxrwxrwx 1 hc hc    8 1023 11:53 link2018 -> 2018.log
    

    修改源文件2018.log内容,其软链接内容会同步修改

    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat 2018.log 
    我是log日志
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat link2018
    我是log日志
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ vim 2018.log 
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat 2018.log 
    我是log
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat link2018.log 
    我是log
    
    

    说明:

    cat 命令是查看文件内容
    为2018.log文件创建软链接link2018,如果2018.log丢失,link2018将失效

    2. 为2018.log 创建一个硬链接ln2018

    命令:

    ln 2018.log  ln2018
    

    输出:

    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ln 2018.log  ln2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018  ln2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ll
    总用量 20
    drwxrwxr-x 3 hc hc 4096 1023 12:02 ./
    drwxrwxr-x 6 hc hc 4096 1019 18:22 ../
    -rw-r--r-- 2 hc hc   10 1023 11:57 2018.log
    drwxrwxr-x 2 hc hc 4096 1018 17:42 .idea/
    lrwxrwxrwx 1 hc hc    8 1023 12:00 link2018 -> 2018.log
    -rw-r--r-- 2 hc hc   10 1023 11:57 ln2018
    

    说明:

    为2018.log创建硬链接ln2018,2018.log与ln2018的各项属性相同

    修改源文件2018.log内容,其软硬链接内容均会同步修改

    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat ln2018 
    我是log
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat 2018.log 
    我是log
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ vim 2018.log 
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat 2018.log 
    我是log1
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat ln2018 
    我是log1
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat link2018 
    我是log1
    

    3. 接上面两实例,链接完毕后,删除和重建链接原文件

    演示如下:

    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018  ln2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ll
    总用量 20
    drwxrwxr-x 3 hc hc 4096 1023 12:04 ./
    drwxrwxr-x 6 hc hc 4096 1019 18:22 ../
    -rw-r--r-- 2 hc hc   11 1023 12:04 2018.log
    drwxrwxr-x 2 hc hc 4096 1018 17:42 .idea/
    lrwxrwxrwx 1 hc hc    8 1023 12:00 link2018 -> 2018.log
    -rw-r--r-- 2 hc hc   11 1023 12:04 ln2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ rm -rf 2018.log 
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ll
    总用量 16
    drwxrwxr-x 3 hc hc 4096 1023 12:57 ./
    drwxrwxr-x 6 hc hc 4096 1019 18:22 ../
    drwxrwxr-x 2 hc hc 4096 1018 17:42 .idea/
    lrwxrwxrwx 1 hc hc    8 1023 12:00 link2018 -> 2018.log
    -rw-r--r-- 1 hc hc   11 1023 12:04 ln2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ touch 2018.log
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ll
    总用量 16
    drwxrwxr-x 3 hc hc 4096 1023 12:57 ./
    drwxrwxr-x 6 hc hc 4096 1019 18:22 ../
    -rw-r--r-- 1 hc hc    0 1023 12:57 2018.log
    drwxrwxr-x 2 hc hc 4096 1018 17:42 .idea/
    lrwxrwxrwx 1 hc hc    8 1023 12:00 link2018 -> 2018.log
    -rw-r--r-- 1 hc hc   11 1023 12:04 ln2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ vim 2018.log 
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat 2018.log 
    2018log日志
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat link2018 
    2018log日志
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat ln2018 
    我是log1
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ 
    

    说明:

    1. 源文件被删除后,并没有影响硬链接文件;软链接文件在centos系统下不断的闪烁,提示源文件已经不存在
    2. 重建源文件后,软链接不在闪烁提示,说明已经链接成功,找到了链接文件系统;重建后,硬链接文件并没有受到源文件影响,硬链接文件的内容还是保留了删除前源文件的内容,说明硬链接已经失效

    4. 将文件链接到目录中

    演示如下:

    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018  ln2018
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ mkdir test
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018  ln2018  test
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ln 2018.log test
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018  ln2018  test
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cd test/
    hc@hc-virtual-machine:~/PycharmProjects/my_test/test$ ls
    2018.log
    hc@hc-virtual-machine:~/PycharmProjects/my_test/test$ vi 2018.log 
    hc@hc-virtual-machine:~/PycharmProjects/my_test/test$ cat 2018.log 
    2018log日志,加1
    hc@hc-virtual-machine:~/PycharmProjects/my_test/test$ cd ..
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018  ln2018  test
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cat 2018.log 
    2018log日志,加1
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ll
    总用量 24
    drwxrwxr-x 4 hc hc 4096 1023 13:31 ./
    drwxrwxr-x 7 hc hc 4096 1023 13:30 ../
    -rw-r--r-- 2 hc hc   19 1023 13:32 2018.log
    drwxrwxr-x 2 hc hc 4096 1018 17:42 .idea/
    lrwxrwxrwx 1 hc hc    8 1023 12:00 link2018 -> 2018.log
    -rw-r--r-- 1 hc hc   11 1023 12:04 ln2018
    drwxr-xr-x 2 hc hc 4096 1023 13:32 test/
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ 
    

    说明:

    在test目录中创建了2018.log的硬链接,修改test目录中的2018.log文件,同时也会同步到源文件

    5:给目录创建软链接

    命令:

    ln -sv 源目录 目标目录
    

    演示如下:

    hc@hc-virtual-machine:~/PycharmProjects$ ll
    总用量 28
    drwxrwxr-x  7 hc hc 4096 1023 13:30 ./
    drwxr-xr-x 23 hc hc 4096 1023 13:32 ../
    drwxr-xr-x  9 hc hc 4096 1022 15:25 FreshOnline/
    drwxrwxr-x  6 hc hc 4096 1019 19:07 FreshOnline_env/
    drwxrwxr-x  4 hc hc 4096 1023 13:31 my_test/
    drwxrwxr-x  4 hc hc 4096 1023 11:52 py3_test/
    drwxr-xr-x  2 hc hc 4096 1023 13:30 test/
    hc@hc-virtual-machine:~/PycharmProjects$ ln -sv /home/hc/PycharmProjects/my_test  /home/hc/PycharmProjects/test
    '/home/hc/PycharmProjects/test/my_test' -> '/home/hc/PycharmProjects/my_test'
    hc@hc-virtual-machine:~/PycharmProjects$ ll
    总用量 28
    drwxrwxr-x  7 hc hc 4096 1023 13:30 ./
    drwxr-xr-x 23 hc hc 4096 1023 13:32 ../
    drwxr-xr-x  9 hc hc 4096 1022 15:25 FreshOnline/
    drwxrwxr-x  6 hc hc 4096 1019 19:07 FreshOnline_env/
    drwxrwxr-x  4 hc hc 4096 1023 13:31 my_test/
    drwxrwxr-x  4 hc hc 4096 1023 11:52 py3_test/
    drwxr-xr-x  2 hc hc 4096 1023 13:38 test/
    hc@hc-virtual-machine:~/PycharmProjects$ cd my_test/
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ ls
    2018.log  link2018  ln2018  test
    hc@hc-virtual-machine:~/PycharmProjects/my_test$ cd ..
    hc@hc-virtual-machine:~/PycharmProjects$ ls
    FreshOnline  FreshOnline_env  my_test  py3_test  test
    hc@hc-virtual-machine:~/PycharmProjects$ cd test/
    hc@hc-virtual-machine:~/PycharmProjects/test$ ls
    my_test
    hc@hc-virtual-machine:~/PycharmProjects/test$ cd my_test
    hc@hc-virtual-machine:~/PycharmProjects/test/my_test$ ls
    2018.log  link2018  ln2018  test
    hc@hc-virtual-machine:~/PycharmProjects/test/my_test$ cd ..
    hc@hc-virtual-machine:~/PycharmProjects/test$ ls
    my_test
    hc@hc-virtual-machine:~/PycharmProjects/test$ ll
    总用量 8
    drwxr-xr-x 2 hc hc 4096 1023 13:38 ./
    drwxrwxr-x 7 hc hc 4096 1023 13:30 ../
    lrwxrwxrwx 1 hc hc   32 1023 13:38 my_test -> /home/hc/PycharmProjects/my_test/
    

    说明:

    1. 目录只能创建软链接
    2. 目录创建链接必须用绝对路径,相对路径创建会不成功,会提示:符号连接的层数过多 这样的错误
    3. 使用原文件的绝对路径创建的软链接,不会随着软链接路径改动而失效!所以建议使用原文件绝对路径创建软链接。这时候的软链接才算得上是真正意义上相当于Windows的快捷方式,一旦生成处处可用
    4. 在链接目标目录中修改文件都会在源文件目录中同步变化

    出处:https://www.cnblogs.com/huchong/p/9836325.html

  • 相关阅读:
    Android学习八---OpenCV JAVA API
    Android学习七---Hello OpenCV samples
    Android学习六---OpenCV for android samples
    android学习五---OpenCV for android环境搭建
    android学习四---Activity和Intent
    Servlet总结(Zpoor,你还说你不会Servlet?)
    Eclipse使用小技巧
    Java-List(冷静分析,稍加思索,识破)
    JDBC——setting useSSL=false, or set useSSL=true
    Java-foreach分析总结
  • 原文地址:https://www.cnblogs.com/mq0036/p/16352026.html
Copyright © 2020-2023  润新知