7.28_Linux_ext数据结构inode的原理浅析、软硬链接的区别

inode表结构浅析

下图以ext文件系统为参考,以4k块大小分区,简单描述一下ext文件系统的数据结构原理,如果有任何错误,烦请各位指出

wKioL1ea9qKwMA88AAQ0CV5awjQ474.png

inode 索引节点

硬盘上的每个磁道被等分为若干个弧段,这些弧段便是磁盘的扇区。硬盘的读写以扇区为基本单位。

扇区的大小,是2的N次方倍。分区的大小可以有多样,1k、2k、4k…以4k块大小来说明。4k块大小分为8个扇区,每个扇区对应512字节。每一块也称为block,文件以block为单位进行存储,并且每一个bolck只能属于一个文件,若文件大小不足4k,也按照4k大小的块来存储。inode的数量是格式化的时候指定的,理论上来说,inode的数量和block的数量是越接近越好,但是在实际过程中一一对应是很难的,所以一般格式化的时候会按照服务器的用途来指定一定比例的inode数量。

#df 查看系统每个分区bolck的数量

#df -i 查看系统每个分区inode的数量

wKiom1ebAPKCPrmpAABYTLiUKfk558.png

每个分区都有一个独立的inode table

元数据也是在inode里面,元数据也是会占用磁盘空间的。

指针:数据块的路径


直接指针:有12个指针,一个4k, 可以存储4*12=48K的数据块。

间接指针:第十三个指针,指向下一个文件块的指针,也是4k块大小,4k块来说,可以划分1024个指针,里面的指针才是指向真正的数据块。一共可以存储1024*4k=4M的数据块,那么文件在4M左右范围里面,可以用间接指针就可以完成。

两重指针:第十四个指针。也是指向一个4k指针数据块,4k指针块再指向1024个指针数据块,

每个指针可以存放1024个4k数据,所以可以存储1024*1024*4k=4G的数据块。

三重指针:跟两重指针工作原理类似,最后可以存放1024*1024*1024*4k=4t的数据块。


inode table是缓存在内存里面的,所以查询速度还是很快的。一般来说,在系统里面删掉文件的操作并不是删掉数据块,而是删掉inode table里面的元数据,这里解释一下元数据,元数据就是数据块的属性,例如:名字,身高等这些就可以理解为元数据。所以,这个就是为什么删掉了文件以后,只要没有新的文件覆盖掉原有的数据块,数据一般都可以恢复的原因。很多文件系统,例如windows下面的fat和ntfs也是同样的原理。一般来说,在磁盘里面的数据都是连续写入,由于有时候会删除掉部分数据,使得磁道里面有些空位置并不能一下子连续的存储下一个文件,一般这样都是分散存储在不同的磁道里面,当读取这一部分的数据,磁盘的指针要来回转多几个圈,造成性能下降,这就是文件碎片的由来。所以隔一段时间进行碎片整理是必须的。但是现在一些新的硬盘,如SSD固态硬盘,就没有磁道这些说法,所以就并不需要像传统的机械硬盘一样进行碎片整理。


磁盘里的数据块有文件和目录,这两者的inode的存储方式也是不同的。

在inode table里面文件是直接引用一个inode的号码,而目录则是在inode table里面的目录项下面存储文件名和文件inode之间的映射。


复制、删除、移动对inode的影响

cp 复制:新的文件会分配一个空闲的inode号,在inode表中生成新条目

         在目录中创建一个目录项,将名称与inode编号关联

         拷贝数据生成新的文件,是两个完全不相同的数据块。


rm 删除:链接数递减,从而释放的inode号可以被重用

         把数据块放在空闲列表中

         删除目录项

         数据实际上不会马上被删除,但当另一个文件使用数据块时将被覆盖,如果恢复inode的元数据的时候文件就会马上链接恢复。


mv 移动:如果mv命令的目标和源在相同的同一个分区下面,作为mv命令

         用新的文件名创建对应新的目录项

         删除旧目录条目对应的旧的文件名

         不影响inode表(除时间戳)或磁盘上的数据位置:没有数据被移动!所以在同一个分区里面移动文件的速度是非常的快的原因。

         如果目标和源在一个不同的文件系统,mv相当于cp和rm


硬链接和软链接的区别


什么是硬链接?

硬链接:指向同一个inode的多个文件路径。(简单理解的意思就是一个人有两个名字,例如张三,他的外号叫老张,又叫小三,其实都是同一个人)

特性:

1 目录不支持硬链接

2 硬链接不能跨文件系统(不能跨分区)

3 创建硬链接会增加inode引用计数;


创建硬链接文件命令

ln 源文件 硬链接文件…

1
2
ln [OPTION]... [-T] TARGET LINK_NAME   (1st form)
ln make links between files

删掉其中一个硬链接文件,其他硬链接文件不受影响


什么是软链接(符号链接)

软链接:指向同一个文件路径的另一个文件路径;

特性:

1 符号链接于文件是两人各自独立的文件,各有自己的inode;对原文件创建符号链接

 不回增加引用计数;

2 支持对目录创建符号链接,可以跨文件系统;

3 删除符号链接文件不影响原文件;但删除原文件,符号指定的路径即使不存在,此时会

 变成无效链接。


注意:符号链接文件的大小是其指定的文件的路径字符串的字节数


创建软链接文件命令

1
2
3
4
#ln -s 原始文件路径文件1 软链接文件1..2..创建软链接 
 
-s, --symbolic
              make symbolic links instead of hard links

创建软链接的时候,必须要用绝对路径!

原始文件相对于软链接文件路径,而不是相对于当前工作目录。


两者区别:

这里以个人理解做了一个小表格

wKiom1edagqDeu7mAAB4bq3JH9s031.png




练习题


1、显示/var目录下所有以l开头,以一个小写字母结尾,且中间出现至少一位数字的文件或目录

1
# ls -ld /var/l*[0-9]*[[:lower:]]

2、显示/etc目录下以任意一位数字开头,且以非数字结尾的文件或目录

1
# ls -ld /etc/[0-9]*[^0-9]

3、显示/etc/目录下以非字母开头,后面跟了一个字母及其它任意长度任意字符的文件或目录

1
# ls -ld /etc/[^[:alpha:]][[:alpha:]]*

4、显示/etc目录下所有以m开头以非数字结尾的文件或目录

1
# ls -ld /m*[^0-9]

5、显示/etc目录下,所有以.d结尾的文件或目录

1
# ls -ld /etc/*.d

6、显示/etc目录下,所有.conf结尾,且以m,n,r,p开头的文件或目录

1
# ls -ld /etc/[mnrp]*.conf

7、使用别名命令,每日将/etc/目录下所有文件,备份到/testdir/下独立的新目录下,并要求新目录格式为backupYYYY-mm-dd,备份过程可见

1
2
# alias bkday='cp -av /etc/ /testdir/backup`date +%F`'
# bkday

8、先创建/testdir/rootdir目录,再复制/root所有下文件到该目录内,并要求保留原有权限

1
#cp -av /root /testdir/rootdir

9、如何创建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b

1
# mkdir -p /testdir/dir1/{x,y}/{a,b}

10、如何创建/testdir/dir2/x,/testdir/dir2/y,/testdir/dir2/x/a,/testdir/dir2/x/b

1
# mkdir -pv /testdir/dir2/{x/{a,b},y}

11、如何创建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7

1
# mkdir -p /testdir/dir{3,4,5/dir{6,7}}

原创文章,作者:~微风~,如若转载,请注明出处:http://www.178linux.com/28244

(0)
~微风~~微风~
上一篇 2016-08-03
下一篇 2016-08-03

相关推荐

  • bash脚本之练习

    1、编写服务脚本/root/bin/testsrv.sh,完成如下要求  (1) 脚本可接受参数:start, stop, restart, status  (2) 如果参数非此四者之一,提示使用格式后报错退出 (3) 如是start:则创建/var/lock/subsys/SCRIPTNAME, 并显示“启动成功” 考虑:如果事先已经启…

    Linux干货 2016-08-24
  • shell 脚本基础作业

    1、编写脚本/root/bin/systeminfo.sh,显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 #!/bin/bash :<<EOF 显示当前主机系统信息,包括主机名,IPv4地址,操作系统版本,内核版本,CPU型号,内存大小,硬盘大小 EOF Host_name=`hostna…

    Linux干货 2016-08-15
  • redis主从复制(3)— 复制超时

    1、repl-timeout前两篇[1]关于redis主从复制的文章解释了一些因为slave replication buffer或者replication backlog参数的错误配置(或者默认参数值)导致主从复制中断的现象。redis里面的repl-timeout参数值也太小也将会导致复制不成功。top redis headaches for devop…

    Linux干货 2016-04-05
  • 第六周博客作业

    请详细总结vim编辑器的使用并完成以下练习题 1、复制/etc/rc.d/rc.sysinit文件至/tmp目录,将/tmp/rc.sysinit文件中的以至少一个空白字符开头的行的行首加#; cp /etc/rc.d/rc.sysinit /tmp vim /tmp/rc.sysinit :%s@^[[:space:]]\+[^[:space:]]@#&a…

    Linux干货 2017-02-26
  • centos启动流程

    1、加电自检(power on system test POST) 加电,就是按下电源键使电脑主机通电,在诸多硬件设备中有一个被称为CMOS设备在计算机启动的过程中起到了至关重要的作用,CMOS在加电之后会启动保存在它上面的BIOS程序,即基本输入输出系统(Basic Input Output System)。自检,主要是检测各…

    Linux干货 2016-09-11
  • redis主从复制(2)— replication buffer与replication backlog

    1、redis主从复制过程先不解释replication buffer和replication backlog,而先看看redis主从复制的过程。 redis的主从复制分为两个阶段: 1)同步(sync rdb snapshot):slave复制master的某时间点(t)的全量数据,t为master接收到slave的sync命令后执行rdb bgsave的…

    Linux干货 2016-04-05