目录
1.文件链接
1.1.符号链接/软连接(symbolic link /软链接)
软连接像快捷方式,可以对文件和目录做软连接;软连接记录的只是源文件的路径;软连接失去源文件不可用。
示例:
创建一个文件,并输入内容“
[root@localhost ~]# echo 111 > /file1
创建一个软连接:
[root@localhost ~]# ln -s /file1 /home/file11 //-s 软连接
观察软连接文件
[root@localhost ~]# ll /file1 /home/file11
-rw-r--r-- 1 root root 4 Dec 20 17:57 /file1
lrwxrwxrwx 1 root root 6 Dec 20 17:58 /home/file11 -> /file1
查看两个文件,内容一致。
[root@localhost ~]# cat /file1 //111
[root@localhost ~]# cat /home/file11 //111
删除源文件,软连接闪烁,不可用。
[root@localhost ~]# rm -rf /file1
[root@localhost ~]# ll /home/file11
lrwxrwxrwx 1 root root 6 Dec 20 17:58 /home/file11 -> /file1
1.2.硬链接
创建同分区硬链接成功,创建不同分区硬链接失败。
[root@localhost ~]# ln /file2 /file2-h1
[root@localhost ~]# ln /file2 /home/file2-h2
硬链接删除源文件,依然可以用
[root@localhost ~]#rm -rf /file2
[root@localhost ~]#cat /file2-h1
222
不允许将硬链接指向目录
[root@localhost ~]# ln /home/ /mnt
ln: “/home/”: 不允许将硬链接指向目录
1.3.软连接和硬链接的区别:
- 硬链接不会创建新的inode,只是给源文件多加了一个文件名;软链接创建新的inode,相当于重新创建了一个文件;
- 硬链接不能跨分区,软链接可以跨分区;
- 硬链接删除源文件后,另一个文件还能用;软链接删除源文件后,链接文件不能再使用;
- 硬链接不允许指向目录;软连接可以针对目录和文件
2.ext4文件系统
2.1.简介
EXT4:第四代扩展文件系统(Fourth extended filesystem)
XFS:一种高性能的日志文件系统
2.2.系统限制
Ext3: 文件系统最大16TB
Ext4: 文件系统最大16TB
XFS : 文件系统最大100TB
2.3.名词术语(以ext4文件系统为例介绍)
inode
:索引节点,记录文件的属性(文件的元数据metadata),一个文件占用一个inode,同时记录此文件数据所在的block numbber。
inode大小:128 bytes
元数据:文件的属性、大小、权限、属主、属组、连接数、块数量、块的编号
block
:存储文件的实际数据,存储文件的内容,若文件较大,会占用多个block。
block大小:默认为4K
superblock
:block 与 inode 的总量,未使用与已使用的 inode / block 数量。
block group
:块组
2.4.示例1:inode(index node 索引节点)
创造一个文件,观察inode信息:ll -i 文件名
[root@localhost ~]# ll -i anaconda-ks.cfg
33574981 -rw-------. 1 root root 1275 8月 1 16:24 anaconda-ks.cfg
2.5.示例2:block(块 文件内容)
观察某个分区中的inode节点数
[root@localhost ~]# df -i
创建一个文件:
[root@localhost ~]# touch 文件名
创造大量文件,观察inode使用情况
[root@localhost ~]# touch file{1..30000}
向目标分区写入大量数据,填满
[root@localhost ~]# dd if=/dev/zero of=/disk1/5.txt bs=1k count=1000
查看目标分区容量,已满
[root@localhost ~]# df -hT
尝试创造新文件
[root@localhost ~]# touch/mkdir 文件名
总结:
inode决定了文件系统中文件的数量;
block决定了文件存储的空间;
磁盘空间的限制根据inode和block两方面
2.6.EXT4特性
- 兼容性:
Ext3文件系统可以以ext4的形式挂载,且不需要改变磁盘的布局格式。但是可以通过在只读模式下运行一些命令让ext3文件系统具备ext4文件系统的一些优势。 - 子目录扩展:
在Ext3中,单个目录下的文件及其目录数目不超过32000个。EXT4将这个限制增大了倍数 - Extents:
传统的如ext3,管理一个文件的不同块使用的是block机制,这对于大文件来说是效率很低的,比如大文件的截断、删除操作。Extent就是一系列的连续的block。它的含义是说:数据在接下来连续的n个blocks中,这样就避免了一个一个block的描述。例如:一个100M的文件在传统ext3的方式下需要存放在256000个block中,terrible。现在ext4就可以由几个extents来管理。Extents不仅提高了性能,而且可以改善碎片的情况(extents优先考虑磁盘上连续的布局方式)。 - 多blocks 的分配(主要说malloc ):
当ext3需要将数据写入磁盘时,块分配器会决定分配那个空闲块给要写入的数据。当时ext3的块分配器一次性只会分配一个块,也就是说如果一个100M的文件要写入磁盘,那么快分配器要调用25600次。这不仅十分低效,更可怕的是,由于分配器无法知道一共要分配多少个块,而只是机械的一个个块的分配,所以说无法从磁盘的角度实现磁盘优化分配利用。EXT4使用multiblock allocator(malloc),这个功能能实现调用一次而分配多个块,从而减小了开销。这提高了性能。尤其是在结合extents和delay allocation策略。这个特性不会影响磁盘的格式特性。此外,ext4的block、inode分配器有其他的优化。 - 延迟分配:
延迟分配是在XFS,ZFS,btrfs、Reiser4文件系统中的特性。该策略就是尽可能晚地分配blocks,这点与传统的文件系统(如ext3)相反,ext3的策略是,尽可能早地分配blocks。举一个例子:调用write(),文件系统会立马分配好数据要写如磁盘的地点,即便数据当前在cache中,没有写入磁盘。这种方式有缺陷:比如说,一个进程连续写一个文件,文件缓慢增大,故系统会不断地的给数据分配空间,因为块分配器不知道到底多少够用,所以由于write函数催使而不断分配。而延迟分配机制会延时数据块的分配,在数据从cache被替换出来时,块分配器才会真正分配块写在磁盘中的位置。这样就在预置要分配块的总数的前提下,就能最优化地分配块,使磁盘空间得到最好的利用。延迟分配与前面两种机制结合使用有很好的效果,因为许多文件最终从cache写入磁盘时,会以extents方式,而该方式的blocks是通过malloc,即多blocks分配机制申请得到的。 - 快速的fsck:
Fsck是一个很慢的操作,尤其在第一步:检查文件系统中所有的节点。在ext4中,在每个group的inode 表后会存储一个未使用inode节点的清单(该清单为了保证安全,有校验信息),所以fsck操作不会去检查inodes,fsck的实验结果表明,根据inode使用数目的不同,fsck时间提高了2到20倍。这里不许注意的是,是fsck,而非ext4,建立的未使用inode节点清单。这就意味着必须运行fsck来建立未使用inode节点清单,下一次运行fsck才会变快(需要运行fsck完成ext3到ext4的转变)。“flexible block groups (灵活的块分组)”也与加速fsck有关系 - 日志校验:
日志是磁盘最常用的一部分,所以这一块更容易出现故障。而且一个从损坏日志的恢复行为会导致文件系统的更大损坏。Ext4为日志块的数据做了校验,从而可以知道日志块是否损坏。日志校验还有一个附加好处:它使得ext3这种两阶段的日志提交系统,变成了单阶段提交,在一些情况下加速了文件系统的操作,性能提高了20%,所以可靠性和性能都提升。(注意:提高性能的部分:异步log,在缺省默认状态下是关闭的,在稳定性改善后,之后的版本会支持该功能) - “无日志”模式:
日志模式虽然提高了文件系统的可靠性,但是存在开销。在ext4中,可以关闭日志模式,性能可以得到一定提升 - 在线碎片整理:(这个功能正在开发,之后的版本会支持该功能)
虽然延迟分配、extents、多块分配能减少碎片,但是碎片仍然会有。举一个例子:在一个目录里写 了三个文件,这三个文件连续的放在磁盘上。某天,你需要对中间的文件追加写,但中间文件空间不够了,这是,中间文件追加部分就只好碎片化地存在磁盘另一个位置了。(作实验)这样会引起一个seek操作,或者需要把中间文件全部内容再连续的存放在一个空间足够的磁盘位置(这样导致了若一个操作需要读取该目录下三个文件,就需要又一次seek操作)。另外,文件系统只关心特定的碎片,比如说boot相关的的需要连续 - Inode 相关特征:
更大的inode节点:ext3支持可配置的inode节点大小(通过mkfs的 -I 参数),但是inode大小的缺省值128bytes。Ext4文件系统inode大小的缺省值是256bytes。Inode扩展的空间用于存储一些额外的域,如纳秒级时间戳、inode版本等,剩下的空间用来存储ext4的一些扩展属性。这会使得对这些属性的访问变快,对于一些需要用到拓展属性的应用,访问速度会增大3至7倍。
当一个目录创建的时候,inode预留空间会预留几个inode,估计inode会在短时间内被用到,即在目录中创建文件时要用到。这个措施能提高性能,因为在目录中创建新文件时可以直接使用预留的inode。文件的创建、删除都会效率更高
纳秒级的时间戳意味着inode中记录“更改时间”的数据可以使用到纳米级别,而在ext3中问秒级别 - 持久预分配:
这个特征,在ext4最近的版本中实现,由glibc在不支持它的文件系统中仿真,她允许应用预分配磁盘的空间:应用告诉文件系统预分配空间,文件系统预分配必须的blocks以及相关数据结构,但是在应用真正写数据之前磁盘对应区域是没有数据的。对于P2P应用来说,他们需要有他们自己的“预分配机制”,分配的区域用于长达数小时甚至数天的下载,但是如果文件系统本身提供这个接口,那么预分配机制就会更加有效率。这个机制有几个用途:第一:避免P2P应用类程序自己进行低效的预分配,即用zeros来填充一个文件。第二:改善碎片问题,由于块一次性分配,所以会尽可能连续。第三:保证应用一直有其所需的空间,这点对应RT-ish类的应用很重要,若没有预分配,文件系统可能在操作的一般就使用完毕了(full)。这个特点在libc的posix_fallocage()中实现。 - 缺省状态有Barriers:
这是在保证文件系统健全性和提高文件系统性能的权衡(你可以通过mount –o barrier=0,如果你在做benchmarking建议你试试)。LWN的一篇文章所说:文件系统的代码必须保证在写操作提交前,所有事物的信息都被写到了日志中。只是有顺序地进行写操作是不够的。中间层的cache中会有一些驱动器为了提高性能,重新定向IO操作的顺序。所以,文件系统必须在写提交前明确地告诉磁盘拿到所有的日志数据。如果提交请求先写,日志崩溃了,内核的I/O子系统通过barriers使其能恢复正常。Barrier禁止barrie后的写,除非该barrier之前的操作已经提交了。通过barrier,文件系统可以确保磁盘上的结构保持一致性。
2.7.转化 ext3 文件系统到 ext4 形式
可以将ext3的文件系统mount为ext4的形式,使用ext4的文件系统驱动。这样文件系统就可以使用延时分配,多块分配等。
从ext2文件系统转化为ext3文件系统(支持日志了)
[root@localhost ~]# tune2fs –j /dev/DEV
使ext3文件系统支持ext4文件系统特征
[root@localhost ~]# tune2fs –O extents,uninit_bg,dir_index /dev/DEV
注意的是,该指令一旦运行,文件系统就不能再被mount为ext3的文件系统了
运行上述指令后,必须运行fsck来修整一下磁盘上的结构
[root@localhost ~]# e2fsck –Fdc0 /dev/DEV