第4节. 文件系统管理实战

文件系统的格式化咯

img

img

img

img

img

这是centos6和7上的分区,sdb1和sda6\7,都还没有创建文件系统,而创建文件系统就是所谓的格式化了。

img

一般就是ext4或者xfs,其实还是看系统默认支持什么(centos6默认ext4,centos7默认是xfs),就用什么。

管理工具就是mkfs这个工具

注意,文件系统本身是属于操作系统的功能,由内核来完成的。内核支持这些个文件系统,就是说内核提供了(内核级的)关于这些个文件系统的驱动模块。这点可以通过locate确认

locate xfs.ko,文件系统都是ko文件,查看有没有xfs文件系统的内核驱动。

img

查看ext4文件系统的驱动:xz就是压缩格式

img

这些都是属于内核级的功能。

那么问题来了ls,cat这些命令,对于用户来讲他访问文件,ls、cat去访问这些文件的时候,其实是通过文件系统来存放到硬盘上的。

那么这些命令是怎么和文件系统交互的呢?要知道底层用的文件系统有很多种,这些命令又是如何对应N个文件系统的呢?是不是意味着针对xfs有个ls.xfs子模块,针对ext4有一个ls.ext4子功能呢?显然不是这么干的!不可能让一个软件开发者考虑这么多种文件系统的。

所以为了让用户更专心的访问磁盘文件而不是考虑文件系统的差异,让开发或使用人员更透明的使用各种文件系统,就提出了VFS概念。

img

什么是VFS虚拟文件系统呢

img

题外话,其实从上图可以看出来一点点,就是cache缓存偏向于VFS,buffer偏向于硬件了;

还有一个简单得说法--缓存是读,缓冲是写磁盘得时候。其实这种说法里得缓冲也是说得磁盘,这就和上图不谋而合了,冲 更多是针对硬盘或是针对硬盘驱动得,缓存更多是偏向于VFS文件系统得。至于读还是写,这个我暂时人为是不分得。

img

对于用户cat ls cp mv等命令不会直接跑到磁盘上去操作磁盘文件。用户空间的程序是没有权限没有能力直接访问硬件的(而文件就是放在磁盘硬件上的)。

所以要用系统调用,让操作系统内核帮其完成访问磁盘上的文件

img

对于fat、ntfs、xfs、ext4

img

而VFS就是一个集大成者:把各种各样的文件系统通用功能收集起来,对外让用户来访问,用户就无需关心下面各种文件系统的区别,因为统一都是用VFS这个文件系统来访问。

这样用户开发的软件都是和VFS打交道的(比如ls、cat、mv等都是和VFS打交道的),而这个VFS文件系统再和底层的不同文件系统打交道就不用我们关心了,这是有内核来完成的,是操作系统本身来完成的。

img

这样就开发一个诸如ls for vfs就行了

img

如图可见当前不支持NTFS这种windows的文件系统,因为用的少,内核就没有内置添加这个功能,你要用自己编译到内核里。

源码编译见上文http的操作。

img

正常用不到这么大,用到了性能就不行了,虽然支持这么大。

创建文件系统

img

img

img

mkfs.ext4=可能还不等价于=mke2fs好像是默认格式化ext2的!!

img

还可以这么写,mkfs -t xfs 、mkfs -t ext4

img

mkfs 格式化后怎么知道具体是什么文件类型

img

img

mke2fs /dev/sbd1 默认是ext2

img

img

上图的

img

因为本质上ext2和ext3是相同的,就是3多了日志,所以这两个是兼容的。

img

硬盘分区的空间可以理解成两大块内容,一个是metadata元数据-节点表(存放文件的大小、权限、时间、所有者、还有一个指针指向数据存放的位置),一个是数据。

实际上还要更加复杂,分区划分成多个组group,每个组是由多少个块组成。

img

而每块多大?

img

不同地方的blocks意义不同

img

文件系统的blocks意思和磁盘分区里的blocks的意思不同

img

存放文件的时候,必须以block的整数倍来计算。哪怕一个字节的文件,你也要给我4K字节的空间。

分区里的block就是1个block就是1k。

img

如果磁盘里都是大量的1k,2k的小文件。此时4k块大小,空间就浪费了很多。如果文件都小,那么文件系统的block最小单元就别默认4KB了。

而目前文件系统,块大小支持:1K\2K\4K这3个单位。

4K是系统根据硬盘分区自动分的。如果分区偏大,自动给你4K的block,如果硬盘小自动给你1K\2K的block。比如你分区就100M,默认肯定不会4K的、

也可以手动指定,-b 1k ,就是手工指定block大小了。

img

在磁盘上组织空间的时候,是把若干个连续的块blocks组织成一个group

img

img

这样把磁盘划分完。分出来后,每一组group里面在有自己的节点表。

img

img

superBlock:①分组的描述 从第几个块到第几块是一个分组,算是一个分组的起始位描述。②自身的元数据,比如块大小比如4K,这是文件系统的属性也要放在超级块里。

img

还可以手动去查超级快superblock:

img

img

这个就是最早提到的元数据

磁盘上每个文件都有元数据。这一条记录就是存放的一个文件的元数据信息。也是节点表的一条记录。

这一条占的空间就叫节点的大小。

img

256B,就是这一行占256个字节。

当然256B不是固定的,可以再添加属性,比如ACL这种扩展属性,这样一行的空间就变大了。

img

与此对应的就是节点表inodetable空间占用大了,后面真正存放数据的空间就少了。

DateBlocks数据块,一块4KB;然后inode table里的一行也就是一个节点信息占256B大小的空间。

img

img

每个文件分配一个节点号,这里66384个节点号,就代表了该分区一共可以放66384个文件。

img

所以上图可以反推出磁盘空间大小:所以4096单位是B字节,一般block size就是4KB的大小。

image-20220225113912862

image-20220225113900464

话说回来,虽然块很多,但不代表所有的空间都能真正用起来。

img

img

如果你也分100G的空间,那么5G是保留下来的。这个5%是默认的行为。

5G是干嘛用的呢?是给root用的,留给0 ID的人用,防止非root用户把磁盘空间占满导致root没有空间了,改个文件,加个字节都加不进去。保证了运维人员的可维护空间。

img

5%的预留不一定合理,如果10T的空间,500G的预留就很夸张了。可以调节百分比,支持0.1%。

superBlock超级块还记录了分组情况,只是上面的tune2fs -l /dev/sda1命令还看不出来。

换个命令可以

img

img

0 - 8 共9个groups

如果superBlocks坏了,文件系统就完了(因为分组分到哪都不知道了,属性也没了!)。

所以superBlocks需要备份,实际上也有备份

img

superBlocks备份了好几个地方:32768\98304\163840\229376这四个地方都有备份。

所以利用超级块是可以修复出故障的文件系统的。

比如掉电、软件故障造成文件系统的元数据破坏,实际上是可以修复的,因为有备份的。

img

img

img

img

貌似是奇数有超级块的备份,偶数没有。但是这不是统一的规律,去看看别的。

img

img

dumpe2fs /dev/sda3 |less 分页看下

img

img

img

img

到group9,后面就没了。就是备份那么多就够了,不需要太多。

-------------------------------

块位图blockBitmap

就是blocks,一个group里有32768个blocks,总共也有很多个块。

将来使用的时候 存放文件的时候 就需要挑出空闲块出来给到文件存放用。

所谓位图就是1bit1bit的图,0表示对应的block为空,1表示对应的block已使用。将来文件用的时候,就找出位图为0的block给它用就行了

img

img

这就是整个ext2为例的文件结构,其他相同的,差不多。

img

xfs的结构不太一样

img

meta-data 元数据区

data 数据区

naming 是啥?

log 日志区

realtime 实时区

isize=512是节点inode size,和上面ext4不一样(ext4是256B),这里大小是512B。

img

sectsz 扇区512B

bsize块大小也是4KB

log 也有日志功能,日志也有块大小

数据的realtime实时空间,每创建文件的时候,先把数据放到实时空间,等写完了,再放到真正空间中。

xfs查看的方法

image-20220225120041007

xfs_info: /dev/sda is not a mounted XFS filesystem  👈需要挂载后才能查看
[root@centos7 ~]# xfs_info /dev/sda1
meta-data=/dev/sda1              isize=512    agcount=4, agsize=65536 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0 spinodes=0
data     =                       bsize=4096   blocks=262144, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal               bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@centos7 ~]#

image-20220225120533629

-j 等价于-O has_journal等价于直接-t ext3。-O ^has_journal 是删除日志功能

-i,inode和磁盘空间有对应关系,多大空间对应一个inode。一个文件是要消耗一个inode的,而一个文件有要消耗至少一个块,一个块如果是4K,也就是说以一个文件要消耗至少4K空间,同时消耗一个inode,而inode又被你对应成了1K,也就是说,此时一个文件要消耗可能4个inode才能对应上,而inode本身又是占空间的,inode之前说了一行一个inode信息消耗256B,所以就造成了空间的浪费,积少成多也是可观的浪费了。

-N 指定分区中创建多少个inode,同样也是摆脱不了-i的默认值的,也就是说你指定的一个值,系统并不会精确到你指定的-N的,而是考虑到-i的大小的。

-I 一个inode占用多少磁盘空间,默认256B

-O FEATURE :ext文件系统了除了2,3和4都是由日志功能的,

image-20220228193416358

tune2fs只能看ext系列的superBlock信息,xfs的看不了

image-20220228193645395

一般直接创建ext4就好了,不要创建ext2然后-O FEAUTRE没事找事,除非是已经有一个ext2了,然后再追加一下。注意mke2fs是创建的命令,对于已经格式化成为ext2的硬盘分区,需要使用tune2fs命令来追加。

例子:创建ext2 块大小1024B、预留0.1%、inode大小128B、卷标/mnt/sda6

image-20220228194356700

👆上图bolck size是1024B字节,一共是1048576个块,所以这个sda6大小只有1MB。

这个ext2是没有日志的,所以查看下

image-20220228195429593

image-20220228195621584

image-20220228195443838

image-20220228195855101

image-20220228195928749

👇此时sda6的ext2后面就追加了ext3字段。其实ext3就是比ext2多了一个日志功能,此时就是ext3了。

image-20220228200056939

image-20220228203711833

关于acl的功能来源-挂载选项

centos6系统(7除外)后面分的区--不是安装操作系统时分的区,是没有这个Defeault mount options选项的。

某人看到这 就要怼了,“你的沟通有问题,不是没有这个选项,是这个选项的值为none”,所以跟这些人讲话,要小心些,唉~不要碰枪口,除非你比他牛,他就不怼你了,他会反过来将就你,这其实是有问题,客观来讲有一说一,但怼人是不对的(你Y的沟通才有问题,逮着机会怼人你牛逼~操),这些人的态度两极分化的厉害所以不喜欢他们。不过反过来,你自己要是凶一点(不是让你怼人哦,就是态度明确硬朗、正),工作上可能会轻松点这倒是事实,一些喜欢借力、甩锅的人就不太愿意和你怼,因为你凶啊,哈哈~。

image-20220228200407218

image-20220228200513811

没有的,可以通过-o acl添加该功能

image-20220228201129269

再查看就有了,此时就可以用FACL了

会加也要会删

image-20220228201350844

image-20220228201425507

补充说明,这里既然是挂载选项,那么就有这个mount -o acl,不过就是centos 6需要这里的两种方式来处理(上面的一种tune2fs,还有这里的mount -o),现在都是7不需要的。

image-20220302111248186

image-20220228203325402

一个分区可以用三个名字来表示它

image-20220228201553871

UUID具有固定唯一性,其他不具备唯一性。

早期都是些卷标,从centos6开始推荐开始写UUID了。

根据UUID查分区名、根据卷标查分区

image-20220228202124530

blkid -U 等价命令

image-20220228203525427

image-20220228202340948

给ext系统加卷标

image-20220228203211979

image-20220228203225797

xfs系统的卷标使用xfs_admin,不过需要先卸载

image-20230109152433351

image-20230109152538823

image-20220228203932790

image-20220228204227232

image-20220228204405684

不带-h就是超级快和group分组全看

dumpe2fs -h /dev/sda7 等价与tune2fs -l /dev/sda7

image-20220228204624527

xfs_info必须要挂载才能看,上文应该有说过了。 # 这个具体看了,centos8和rhel8不同,

image-20230109153626753

image-20230109153720638

image-20220228205107085

fsck 可以修复ext和xfs。

image-20220228205238686

[20:41:23 root@localhost ~]#fsck.         👈两下tab补全
fsck.cramfs  fsck.ext3    fsck.fat     fsck.msdos   fsck.xfs
fsck.ext2    fsck.ext4    fsck.minix   fsck.vfat
[20:41:23 root@localhost ~]#
提示可以看到支持修复的文件系统类型,但实际上直接fsck不带后缀更好,因为万一敲错了,反而坏事,不加会自动判断对应的什么系统。

修复xfs文件系统举例

image-20220228205549149

image-20220228205631597

image-20220228205527899

image-20220228205758340

image-20220228205912498

超级块一般多大,在一个分区上都是些描述信息,应该很小,但是具体多少不清楚。

image-20220228210327956

image-20220228210531358

上图的三个选项一个都不用,-f 是修复文件、-d是修复根。

直接xfs_repair /dev/sda3,一定不要挂载的时候修复。

image-20220228210829058

修复后就可以挂载了

image-20220228210955106

但是数据确实丢掉了,看来dd前10M破坏比较严重的,修复估计也就是修复超级块吧,因为有备份,可能也能修复些其他的,具体还需要研究下。

image-20220228211049592

例子2,修复ext文件系统

image-20220228211342053

image-20220228211355072

image-20220228211604755

bad magic number, 超级块没了已经

取消挂载

image-20220228211737706

修复

image-20220228211940322

image-20220228212053663

image-20220228212112077

image-20220228212215144

输入 -y就行了,自动帮你输入yes

image-20220228212303013

image-20220228212249118

修复后挂载,看下空间大小

image-20220228212327770

如果破坏的不是太严重,可以修复一些数据回来的,备份的都是元数据、分区信息、超级块之类的,用户数据是不会备份的。

image-20220228212353190

这是二次破坏!👇

image-20220228212511653

使用一个磁盘空间的3步骤:

以上就讲解了 1、分区;2、创建文件系统、3下面就要讲挂载了。

Copyright 🌹 © oneyearice@126.com 2022 all right reserved,powered by Gitbook文档更新时间: 2024-07-28 14:47:35

results matching ""

    No results matching ""