磁盘与文件系统管理

superblock:记录file system的整体信息,包括inode/block的总量、使用量、剩余量以及文件系统的格式与相关信息

inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的block号码

block:实际记录档案的内容,档案较大时会占用多个block. 每个block内只能放置一个档案的数据,如果档案小于block,该block剩余的空间不能被继续使用

磁盘与文件系统管理_第1张图片

以上为索引式文件系统。文件系统一开始就将inode与block规划好了,除非重新格式化(或使用resize2fs等指令变更文件系统大小),否则inode和block固定后就不再变动

当文件系统较大时,将所有的inode与block放置在一起会因为数量太大而不便管理,因此Ext2文件系统在格式化时是区分为多个block group的,每个group中都有独立的inode/block/superblock

一般将inode table(就是一堆inode)与data block称为数据存放区,其他例如superblock、block bitmap与inode bitmap等称为metadata(中介资料)


inode记录的内容:

档案的存取模式(rwx),档案的拥有者与group,档案的容量,atime,ctime,mtime,档案真正的指向,SUID等

inode特点:

每个inode大小均为128B,每个档案只占有一个inode,系统读取档案时先找到inode并分析inode所记录的权限与用户是否符合,若符合才能开始读取block内容

inode记录block号码的区域分为12个直接,1个间接,1个双间接,1个三间接


superblock记录的信息:

inode与block的总量,已使用与未使用的inode/block数量,block与inode的大小,file system的挂载时间、最近一次写入数据的时间等文件系统的相关信息,valid bit,若此文件系统已被挂载则为1,否则为0

一个文件系统应该只有一个superblock,除了第一个block group内会含有superblock之外,后续的block group不一定有superblock,若有则是为第一个block group中的superblock做备份


Filesystem Description:描述每个block group开始与结束的号码,说明每个区段(superblock, bitmap, inodemap, data block)分别介于哪一个block号码之间

block bitmap:记录哪些block是空的

inode bitmap:记录使用与未使用的inode号码


对目录来说,inode记录该目录的相关权限、属性以及分配到的block号码,而block则记录这个目录下的文件名与该文件名所占用的inode号码(hard link就是在这个block中增加了一个文件名与inode对应关系的记录)


日志式文件系统:

在filesystem中划出一个区域专门记录写入或修改档案的步骤

1 当系统要写入一个档案时,会先在日志记录区块中记录某个档案准备要写入的信息

2 开始写入档案,更新metadata数据

3 完成数据与metadata的更新后,在日志记录区块中完成该档案的记录

在数据的记录过程中如果发生了问题,系统只要检查日志记录区块,就可以知道哪个档案发生了问题,再针对该问题进行一致性检查即可


为了解决CPU 与硬盘的读写速度差,Linux使用异步处理方式,不定期将内存中的Dirty数据写回硬盘


将文件系统与目录树结合的动作成为挂载,挂载点是目录,该目录为进入文件系统的入口


Linux通过Virtual Filesystem Switch的核心功能去读取filesystem,因此使用者不需要知道每个partition上的filesystem是什么


dumpe2fs:列出文件系统的详细信息

df:列出文件系统的整体磁盘使用量(读取的主要是superblock中的信息,所以显示结果的速度很快)

-h:以易阅读的GB,MB,KB等格式显示

-i:以inode的数量来显示

du:评估文件系统的磁盘使用量(直接到文件系统中搜寻数据)

-h:以易阅读的GB,MB,KB等格式显示

-s:列出总量,不列出每个目录的占用量


hard link:

在某个目录下新增一笔档名链接到inode号码的记录,所以磁盘空间与inode数目都不变。ls指令显示结果中权限后的数字为“连接”,表示有多少个档名链接到这个inode号码

hard link最大的好处是安全,即使将任何一个档名删除,inode和block还在,此时可以通过另一个档名读取正确的档案数据

但是hard link不能跨Filesystem,也不能link目录。

磁盘与文件系统管理_第2张图片


symbolic link:

建立一个新的档案,这个档案会让数据读向link到的档案的档名(类似windows中的快捷方式),会用掉inode与block。当修改symbolic link时,更改的是原始档案



ln [-sf] 源文件 目标文件

-s:symbolic link,若没有参数则为hard link

-f:如果目标文件存在则将目标文件移除后再建立


建立新目录时,新目录的link数为2(本身+./),上层目录的link数会加1(.. /)


fdisk [-l] 装置名称

-l:输出后面装置所有的partition内容,若仅有fdisk -l时,则系统会把所有能找到的装置的partition列出来

fdisk /dev/sdb:对/dev/sdb进行分区修改。fdisk无法处理大于2TB的磁盘分割槽

修改完成后,用partprobe让核心强制重新捕捉partition table


分割完成后要用mkfs对文件系统进行格式化

mkfs [-t 文件系统格式] 装置文件名

格式化详细信息的设置:mke2fs

mke2fs [-b block大小] [-i block大小] [-L 标头] [-cj] 装置

-b:设定block大小

-i:每多少byte分配一个inode

-c:检查磁盘错误,下达一次-c时会进行快速读取测试,下达两次-c -c时会测试读写

-L:后接标头名称(label)

-j:加入journal成为ext3格式,若没有该参数则为ext2格式


fsck:进行文件系统检查,只有档文件系统有问题时才使用,正常情况下使用可能会对系统造成伤害。执行该指令时,被检查的partition不能挂载在系统上,必须卸载

fsck [-t 文件系统] [-ACay] 装置名称

-t:后接文件系统,不过Linux可以通过superblock自动分辨文件系统,通常不需要使用该选项

-A:根据/etc/fstab的内容对需要的装置进行扫描

-a:自动修复检查有问题的扇区

-y:与-a类似,但某些filesystem仅支持-y

-C:显示检查进度

ext2/ext3的额外选项:

-f:强制进入细部检查(一般fsck没有发现unclean的flag时是不会进行细部检查的)

-D:针对文件系统下的目录进行优化配置


磁盘挂载与卸载:

1. 单一文件系统不应该被重复挂载在不同的挂载点(目录)中

2. 单一目录不应该重复挂载多个文件系统

3. 作为挂载点的目录理论上应该是空目录(若目录非空,挂载后目录中的文件会被暂时隐藏)

mount -a:一站配置文件/etc/fstab的数据将所有未挂载的磁盘进行挂载

mount -l:只输入mount会显示目前挂载的信息,加上-l可增列label名称

mount [-t 文件系统] [-L label名] [-o 额外选项] [-n] 装置文件名 挂载点

-t:类似mkfs,可加上文件系统种类来制定欲挂载的类定

-n:通常系统会将实际挂载的情况写入/etc/mtab中,但在某些情况下(如单人维护模式)为了避免问题会不写入,需要加上参数-n

-L:除了使用装置文件名(如/dev/sdb9)外,还可以利用文件系统的标头名称(label)进行挂载(可以用dumpe2fs查询标头名称)

-o:后接挂载时的额外参数

 ro, rw:挂载文件系统成为只读(ro)或可擦写(rw)

 sync, sync:使用同步写入或异步写入内存机制

 auto, noauto:是否允许该partition被mount -a自动挂载

 dev, nodev:是否允许在此partition上建立装置档案

 suid, nosuid:是否允许此partition上含有SUID/SGID的文件格式

 exec, noexec:是否允许此partition上拥有可执行的二进制档案

 user, nouser:是否允许此partition让任何使用者进行mount(一般只有root可以进行)

 defaults:默认值为:rw, suid, dev, exec, auto, nouser, async

 remount:重新挂载


mount --bind 目录1 目录2:可将目录1挂载到目录2下


umount [-fn] 装置文件名或挂载点:卸载装置档案(注意卸载目录的挂载时一定要用挂载点,即目录)

-f:强制卸载

-n:不更新/etc/mtab的情况下卸载


mknod 装置文件名 [bcp] [major] [minor]:

装置种类:

b:设定装置为周边存储设备档案,如硬盘

c:设定装置为周边输入设备档案,如键盘、鼠标

p:设定装置成为FIFO档案

major:主要装置代码

minor:次要装置代码(二者可以通过ll设备得到,major为group后第一个数据,minor为第二个)


e2label 装置名称 新的label名称:修改标头

优点:无论磁盘文件名怎么变动,无论磁盘插在哪个IDE/SATA接口都不受影响

缺点:硬盘的label不能重复


tune2fs [-jlL] 装置名

-l:类似dumpe2fs -h,将superblock中的数据读取出来

-j:将ext2的filesystem转换为ext3

-L:类似e2label,修改filesystem的label


可以通过修改/etc/fstab进行开机挂载。系统挂载的限制:

1. 根目录/必须是挂载的,并且一定要先于其他mount point进行挂载

2. mount point必须是已建立的目录

3. 所有mount point在同一时间内只能挂载一次

4. 所有partition在统一时间内只能挂载一次

5. 如果进行卸载,必须先将工作目录移动到mount point及其子目录之外


/etc/fstab的内容:

1. UUID:系统为存储设备提供唯一的标识字符串。无论一个存储设备插在哪个槽,装置或label名变成什么,该装置的UUID是固定不变的

2. mount point:挂载点(目录)

3. type:文件系统的类型,如ext2/ext3,vfat等

4. mount option:file system的挂载选项,参考mount -o的选项


5. dump:0代表不进行dump备份,1代表每天进行dump备份,2代表不定日期进行dump备份操作

6. pass:开机过程中fsck会检查file system是否clean。0代表不需要检查,1代表最先检查(一般只有根目录),2代表在1之后检查


如果在分割时只分割出了一个根目录,没有多余的容量进行分割,根目录又很大,这时候可以制作一个大档案,然后将其挂载,作为一个新的分割槽使用。在建立档案并格式化以后,可利用【mount -o loop 档案 挂载目录】将新建立的档案挂载到制定目录


使用实体分割槽建立swap:(可以参考上面建立“新分割槽”的方法建立swap)

1. 使用fidsk分割出一个分割槽作为swap

2. 格式化 [mkswap 装置文件名]

3. 启动swap [swapon 装置文件名]

成功之后可以用free来观察内存用量,也可以用swapoff关掉swap file


boot sector和superblock的关系:

开机管理程序一般安装到superblock中,但boot sector也可以独立出来而不放到superblock中。superblock的大小为1024B,并且需要在最前面保留出1024B来安装开机管理程序。所以,

1. block为1024B时,boot sector和superblock各占一个block(boot sector占据0号block,superblock从1号block开始)

磁盘与文件系统管理_第3张图片

2. block大于1024B(2K,4K)时,superblock会在0号block,并且0号block除去boot sector和superblock的信息后剩余的空间将会被保留(更好的选择)



当磁盘容量大于2TB时,fdisk便无法支持,只能用parted进行分割

parted [装置] [指令 [参数]]

指令:

新增分割:mkpart [primary/logic/extended] [ext3/vfat] 开始 结束

显示分割表:print

删除分割:rm [partition]


你可能感兴趣的:(磁盘与文件系统管理)