zoukankan      html  css  js  c++  java
  • Linux系统编程10_硬链接与软链接

    理解硬链接和软链接概念前,需要先了解文件和iNode相关背景知识:

    Linux系统编程5_文件描述符:https://www.cnblogs.com/grooovvve/p/14076856.html

    Linux系统编程9_iNode机制:https://www.cnblogs.com/grooovvve/p/14214029.html

    索引节点(inode)
    要了解链接,我们首先得了解一个概念,叫索引节点(inode)。

    在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号,我们可以将inode简单理解成一个指针,它永远指向本文件的具体存储位置。

    文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。系统是通过索引节点(而不是文件名)来定位每一个文件。

    硬链接:

    保存在系统的每一个文件,系统会对该文件创建一个索引节点。
    在Linux中,多个文件指向同一个索引节点是允许的,像这样的链接就是硬链接。
    硬链接是指通过索引节点对文件的链接。
    硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。

    对于硬链接的读写和修改等操作和软链接是一样的。
    在硬链接中如果删除原文件会引起“引用计数”减1的变化,只要“引用计数”不为零,则硬链接文件仍然存在,而且保留了原有的内容 ,这样就可以防止误操作删除源文件。但是硬链接文件只能在同一个文件系统中。

    软链接:

    符号链接又称为软链接,和windows的快捷方式相似,符号链接文件中并不包括实际的文件数据,而只是包括了它指向文件的路径。

    它可以链接到任意文件和目录,包括处于不同文件系统的文件以及目录。当用户对链接文件操作时,系统会自动的转到对源文件的操作,但是删除链接文件时,并不会删除源文件。

    软链接会真正建立自己的 inode 索引和 block,所以软链接和源文件的 inode 号是不一致的,

    而且在软链接的 block 中,写的不是真正的数据,而仅仅是指向文件的文件名及 inode 号。



    硬链接的特点:

    硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。

    硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,

    目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。

    硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。

    硬链接的限制比较多,既不能跨文件系统,也不能链接目录,而且源文件和硬链接文件之间除 inode 号是一样的之外,

    没有其他明显的特征。这些特征都使得硬链接并不常用,大家有所了解就好。



    相关操作:

    ln命令来建立硬链接。

    //源文件是被链接的文件,注意:软链接的文件必须写成绝对路径

    ln 源文件 目标文件 

    ln -s 源文件 目标文件

    ls -i     //可以查看inode号码,inode 号就相当于文件 ID

    软链接的标志非常明显,首先,权限位中"l"表示这是一个软链接文件;

    其次,在文件的后面通过 "->" 显示出源文件的完整名字。所以软链接比硬链接的标志要明显得多;

    而且软链接也不像硬链接的限制那样多,比如软链接可以链接目录,也可以跨分区来建立软链接



    查找文件的步骤:

    当我们查找一个文件,比如 /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 文件的读取与访问。



    参考链接:

    Linux ln命令:在文件之间建立链接(硬链接和软链接)详解版:http://c.biancheng.net/view/740.html

  • 相关阅读:
    Hibernate框架做数据库操作
    Spring AOP几个相关术语复习梳理
    Unknown initial character set index '255' received from server...
    使用IDEA的activiti时报错:发现了以元素 'process' 开头的无效内容...
    获取Class实例的4种方式
    maven设置全局和局部jdk版本
    JSP的9大内置对象和4大域对象(作用域)
    oracle中NVL,NVL2,NULLIF,COALESCE等函数
    MIME类型
    Eclipse集成Tomcat,并发布Web工程
  • 原文地址:https://www.cnblogs.com/grooovvve/p/14214098.html
Copyright © 2011-2022 走看看