软链接和硬链接

使用ln命令可以创建软链接和硬链接(默认是硬链接)

软链接: ln -s  源文件名  软链接文件名
硬链接: ln  源文件名  硬链接文件名

预备知识:
  inode
  在Linux的文件系统中,只要是保存在磁盘分区里的,不管是啥类型的文件都会分配到一个编号,称为索引节点(indoe index),在硬盘中最小存储单位叫做“扇区(sector)”,扇区是对硬盘而言的,是物理层,每个扇区存储512个字节(即512B),当操作系统读取硬盘时,是不会一个个扇区来读取的,而是一次性连续读取多个扇区(即一次性读取一个“块”),我们将其统称为“块”【block】,“块”是对文件系统而言的,是逻辑层的,这种由多个扇区所组成的“块”是文件系统存取的最小单位,“块”的大小最常见是4KB,即连续八个扇区组成一个块。

  inode号码
  Linux的文件是通过索引节点(inode)来识别文件的,而不是基于文件名来识别文件的, 对于系统来说,文件名只是inode号码便于识别的别称或者绰号。表面上,用户通过文件名,打开文件。
  实际上,系统内部这个过程分成三步:
    首先,系统找到这个文件名对应的inode号码;
    其次,通过inode号码,获取inode信息;
    最后,根据inode信息,找到文件数据所在的block,读出数据。

  inode存储的数据
  当系统创建文件时,文件的元信息会存储在inode里,通过inode即能查看元信息,又能找到文件数据。
inode包含文件的元信息,具体有以下内容:

  • 文件的字节数。
  • 文件拥有者的User ID。
  • 文件的Group ID。
  • 文件的读、写、执行权限。
  • 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  • 链接数,即有多少文件名指向这个inode。
  • 文件数据block的位置。

  使用ls -i命令,可以看到文件名对应的inode号码
    ls -i xxx.txt
  若想查看某个文件的inode信息,可以使用stat命令,该命令比ls更详细
    stat xxx.txt
  查看文件系统inode总量以及剩余量
    df -i
  查看磁盘的使用量
    df -h
  查看每个inode节点的大小
    sudo dumpe2fs -h /dev/hda | grep “Inode size”

  当查看某个文件时,会先从inode表中查出文件属性及数据存放点,再从数据块中读取数据。
在这里插入图片描述
  inode会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息, 由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

  目录项
  在Linux系统中,目录也是一种文件。打开目录,实际上就是打开目录文件。
目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

  ls命令只列出目录文件中的所有文件名:
    ls /etc
  ls -i命令列出整个目录文件,即文件名和inode号码:
    ls -i /etc
  如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。
    ls -l /etc

文件描述符:是内核为了高效管理已被打开的文件所创建的索引,其值是一个非负整数,打开现存文件或新建文件时,内核会返回一个文件描述符,所有执行I/O操作(读写文件)的系统调用都需要通过文件描述符来指定被操作的文件。

软链接:可以简单的理解为windows下的快捷方式,其包含的是目标文件的路径名(软链接文件包含的是实际文件的inode的记录),软链接可以用于任意的文件或目录,也可以链接不同文件系统的文件,当对软链接文件进行读写操作时,系统会自动将该操作转换为对源文件的操作,但删除链接文件时,系统只是删除的链接文件,而不会删除源文件本身。

硬链接:在Linux中可以有多个文件指向同一索引节点,而硬链接就是通过索引节点来进行连接的,即每一个硬链接都时一个指向对应区域(物理硬盘的一个区块)的文件,在文件系统中会维护一个引用计数,只要有文件指向该区块,那么该区块就不会从硬盘上消失。所以,硬链接的作用就是允许一个文件拥有多个有效的路径名,这样当用户误删除文件的时候,由于对应的区块的索引节点有一个或以上的连接,那么对应的文件内容会依然存在,只有当最后一个链接被删除后(即使删除的是源文件,只要有硬链接在,数据内容就都还在,若连硬链接也删了,那么就真正的删除了文件的数据),文件的数据块才会被释放。

那么拷贝cp与硬链接有什么不同的呢?
  cp是重新创建一个文件并复制相同的内容,会有新的indoe和占用新的磁盘空间,完完全全就是两个文件。而硬链接实际上只是增加了源文件的count计数,只有当count减到0的时候才会删除inode以及磁盘文件。

为什么目录不能硬链接呢?

Linux 文件系统中的目录均隐藏了两个个特殊的目录当前目录(.)和父目录(…),如果允许对目录进行硬链接,大家来看一下下面两种情况:
  情况A:
  存在一个/usr/local/myapp的目录, 我们将他hard link 链接到/root/目录
  ln /usr/local/myapp /root/myapp
  那么请问,myapp目录里的(…)访问父目录,是指的/usr/local呢,还是/root/呢?
  情况B:
  如果存在目录/root/test/a 和 目录/root/app/b
  如果a是app目录的hard link, b是test 的hard link, 这时就形成了循环引用,假设可以这样设定,那么/root/test/a 既然是/root/app/目录,里面肯定有b, 这时可以访问 /root/test/a/b ,此时你发现b又是/root/test/的hard link 那么b里肯定有a,这时你课可以访问/root/test/a/b/a,以此循环/root/test/a/b/a/b/a/b/a/b/… 难道你不觉得这样有问题吗?

链接数
  创建目录时,默认会生成两个目录项:".“和”…"。前者的inode号码就是当前目录的inode号码,等同于当前目录的"硬链接";后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的"硬链接"。所以,任何一个目录的"硬链接"总数,总是等于2加上它的子目录总数(含隐藏目录),这里的2是父目录对其的“硬链接”(可以理解为父目录cd到子的绝对路径)和当前目录下的".硬链接“。

软链接与硬链接最大的区别
  A:源文件
  B:软链接文件
  C:硬链接文件
  文件B指向文件A的文件名(就是B的内容是文件A的路径),而且文件B是新的inode号码,而不是跟文件A一样的inode号码,文件A的inode链接数不会因此发生改变。
文件C的inode号码和文件A一样,文件A的inode链接数会发生改变。

inode的特殊作用
  由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

  1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。
  2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。
  3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

  第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。
  因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收

实际问题
  在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df-h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。后来用df-i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。
查找原因
  /data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

解决方案

  1. 删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。
  2. 用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:
      ln-s/opt/newcache/data/cache
已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页