首页 > 代码库 > linux读书摘要--linux磁盘与文件系统管理
linux读书摘要--linux磁盘与文件系统管理
磁盘基础知识点整理
整颗磁盘的组成主要有:圆形的磁盘盘(主要记录数据的部分);机械手臂,与在机械手臂上的磁盘读取头(可擦写磁盘盘上的数据);主轴马达,可以转动磁盘盘,让机械手臂的读取头在磁盘盘上读写数据。
扇区(Sector)为最小的物理储存单位,且依据磁盘设计的不同,目前主要有 512bytes 与 4K 两种格式;将扇区组成一个圆,那就是磁柱(Cylinder);早期的分区主要以磁柱为最小分区单位,现在的分区通常使用扇区为最小分区单位; 磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。MBR 分区表中,第一个扇区最重要,里面有: (1)主要开机区(Master boot record, MBR)及分区表(partition table), 其中 MBR 占有 446bytes,而 partition table 则占有 64 bytes。GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。
Linux 的正统文件系统为 Ext2 (Linux second extended file system, ext2fs)
一个可被挂载的数据为一个文件系统而不是一个分区槽。Linux 操作系统的文件系统包括文件数据、文件权限(rwx)与文件属性(拥有者、群组、时间参数等)。文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到 data block 区块中。另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括inode与block的总量、使用量、剩余量等。
superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
block:实际记录文件的内容,若文件太大时,会占用多个 block 。
FAT系统需要经常进行碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起,这样数据的读取会比较容易。
启动扇区
在整体的规划当中,文件系统最前面有一个启动扇区(boot sector),这个启动扇区可以安装开机管理程序, 这是个非常重要的设计,因为如此一来我们就能够将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗磁盘唯一的 MBR,这样也才能够制作出多重引导的环境。
inode table (inode表格)
inode 记录的文件数据至少包括:该文件的存取模式(read/write/excute);该文件的拥有者与群组(owner/group);该文件的容量;该文件建立或状态改变的时间(ctime);最近一次的读取时间(atime);最近修改的时间(mtime);定义文件特性的旗标(flag),如 SetUID...;该文件真正内容指箱(pointer);
inode 的数量与大小也是在格式化时就已经固定,除此之外还有其它特色:每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);每个文件都仅会占用一个 inode 而已;承上,因此文件系统能够建立的文件数量与 inode 的数量有关;系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取block的内容。
inode 要记录的数据非常多,但偏偏又只有 128bytes 而已, 而 inode 记录一个 block 号码要花掉 4byte ,假设我一个文件有400MB 且每个 block 为 4K 时, 那么至少也要十万笔 block 号码的记录呢! inode 哪有这么多可记录的信息?为此我们的系统很聪明的将 inode 记录 block 号码的区域定义为 12 个直接,一个间接,一个双间接与一个三间接记录区。如下所示。根据以上信息可以计算出当block为1k时,最大文件为2G的由来。但是不可以此来计算block为2k和4k的情况。
Superblock (超级区块)
Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:block 与 inode 的总量;未使用与已使用的 inode / block 数量;block 与 inode 的大小 (block 为 1, 2, 4K, inode 为 128bytes 或 256bytes);filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;一个valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则valid bit为1 。
Superblock是非常重要的,因为我们这个文件系统的基本信息都写在这里,因此,如果superblock死掉了,你的文件系统可能就需要花费很多时间去挽救。一般来说,superblock的大小为1024bytes。此外,。每个block group都可能含有 superblock事实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份咯,这样可以进行 superblock 的救援。
Filesystem Description (文件系统描述说明)
这个区段可以描述每个block group的开始与结束的block号码,以及说明每个区段(superblock,bitmap,inodemap,data block)分别介于哪一个block号码之间。这部份也能够用dumpe2fs来观察的。
block bitmap (区块对照表)
从 block bitmap 当中可以知道哪些block是空的,因此我们的系统就能够很快速的找到可使用的空间来处置文件啰。同样的,如果你删除某些文件时,那么那些文件原本占用的block号码就得要释放出来,此时在block bitmap当中相对应到该block号码的标志就得要修改成为『未使用中』啰!这就是 bitmap 的功能。
这个其实与 block bitmap 是类似的功能,只是 block bitmap 记录的是使用与未使用的 block 号码,至于inode bitmap 则是记录使用与未使用的inode号码!
目录
目录的内容在记录文件名,一般文件才是实际记录数据内容的地方。当我们在 Linux 下的文件系统建立一个目录时,文件系统会分配一个 inode 与至少一块 block 给该目录。其中,inode 记录该目录的相关权限与属性,并可记录分配到的那块 block 码;而 block 则是记录在这个目录下的文件名与该文件名占用的 inode 号码数据。也就是说目录所占用的 block 内容在记录如下的信息:
文件
当我们在 Linux 下的 ext2 建立一个一般文件时, ext2 会分配一个 inode 与相对于该文件大小的block 数量给该文件。例如:假设我的一个 block 为 4 Kbytes ,而我要建立一个 100 KBytes 的文件,那么 linux 将分配一个 inode 与 25 个 block 来储存该文件! 但同时请注意,由于 inode 仅有 12 个直接指向,因此还要多一个 block 来作为区块号码的记录。
透过挂载点的信息找到 inode 号码为 128 的根目录 inode,且 inode 规范的权限让我们可以读取该 block的内容(有r与x) ;
2./的block:
经过上个步骤取得 block 的号码,并找到该内容有 etc/ 目录的 inode 号码 (33595521);
3.etc/的inode:
读取 33595521 号 inode 得知 dmtsai 具有 r 与 x 的权限,因此可以读取 etc/ 的 block 内容;
4.etc/的block:
经过上个步骤取得 block 号码,并找到该内容有 passwd 文件的 inode 号码 (36628004);
5.passwd的inode:
读取 36628004 号 inode 得知 dmtsai 具有 r 的权限,因此可以读取 passwd 的 block 内容;
6.passwd的block:
最后将该 block 内容的数据读出来。
如果我想要新建一个文件或目录时,系统是如何读取的呢?
1.先确定用户对于欲新增文件的目录是否具有w与x的权限,若有的话才能新增;
2.根据 inode bitmap 找到没有使用的 inode号码,并将新文件的权限/属性写入;
3.根据 block bitmap 找到没有使用中的 block号码,并将实际的数据写入block中,且更新inode的 block指向数据;
4.将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新c superblock的内容。
为防止因数据不一致状态的产生,导致文件检查过慢,日志式文件系统兴起
1. 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
2. 实际写入:开始写入文件的权限与数据;开始更新metadata的数据;
3. 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。
ext2可达到这样的功能:透过ext3/ext4即可。 ext3/ext4是ext2的升级版本,并且可向下兼容ext2版本呢
linux系统上的文件系统与内存之间的关系
系统会将常用的文件数据放置到主存储器的缓冲区,以加速文件系统的读/写;
承上,因此 Linux 的物理内存最后都会被用光!这是正常的情况!可加速系统效能;
你可以手动使用 sync 来强迫内存中设定为 Dirty 的文件回写到磁盘中;
若正常关机时,关机指令会主动呼叫 sync来将内存的数据回写入磁盘内;
但若不正常关机(如跳电、当机或其他不明原因),由于数据尚未回写到磁盘内, 因此重新启动后可能会花很多时间在进行磁盘检验,甚至可能导致文件系统的损毁(非磁盘损毁)。
将文件系统与目录树结合的动作我们称为『挂载』 。挂载点一定是目录,该目录为进入该文件系统的入口。因此并不是你有任何文件系统都能使用,必须要『挂载』到目录树的某个目录后,才能够使用该文件系统的
linux支持的文件系统与VFS
传统文件系统:ext2 / minix / MS-DOS / FAT (用vfat模块) / iso9660 (光盘)等等;
日志式文件系统: ext3 /ext4 / ReiserFS / Windows‘ NTFS / IBM‘s JFS / SGI‘s XFS / ZFS
网络文件系统: NFS / SMBFS
整个Linux的系统都是透过一个名为Virtual Filesystem Switch的核心功能去读取filesystem的。 也就是说,整个Linux认识的filesystem其实都是VFS在进行管理,我们使用者并不需要知道每个partition上头的filesystem是什么~VFS会主动的帮我们做好读取的动作。
XFS文件系统介绍
EXT家族当前较伤脑筋的地方: 支持度最广,但格式化超慢
文件系统活动登录区 (log section)
登录区这个区域主要被用来纪录文件系统的变化,其实有点像是日志区。
当有文件要被建立时, xfs 会在这个区段里面找一个到数个的extent区块,将文件放置在这个区块内,等到分配完毕后,再写入到data section的inode与block去! 这个extent区块的大小得要在格式化的时候就先指定,最小值是4K最大可到1G。
第5行里面的sunit与swidth与磁盘阵列的stripe相关性较高。这部份我们底下格式化的时候会举一个例子来说明。
第7行里面的internal指的是这个登录区的位置在文件系统内,而不是外部设备的意思。且占用了4K *2560个block,总共约10M的容量。
第9行里面的realtime区域,里面的extent容量为 4K。不过目前没有使用。
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
实体链接与符号链接:ln
每个文件都会占用一个 inode , 文件内容由 inode 的记录来指向;想要读取该文件,必须要经过目录记录的文件名来指向到正确的inode号码才能读取。hard link 只是在某个目录下新增一笔档名链接到某inode号码的关连记录而已。
Symbolic Link (符号链接,亦即是快捷方式)
Symbolic link 就是在建立一个独立的文件,而这个文件会让数据的读取指向他link的那个文件的档名!由于只是利用文件来做为指向的动作, 所以,当来源档被删除之后,symbolic link的文件会『开不了』
连结档的重要内容就是他会写上目标文件的『文件名』, 你可以发现为什么上表中连结档的大小为12Bytes呢? 因为箭头(-->)右边的档名『/etc/crontab』总共有12个英文,每个英文占用1个bytes,所以文件大小就是12bytes
由1号inode读取到连结档的内容仅有档名,根据档名链接到正确的目录去取得目标文件的inode,最终就能够读取到正确的数据了。你可以发现的是,如果目标文件(/etc/crontab)被删除了,那么整个环节就会无法继续进行下去, 所以就会发生无法透过连结档读取的问题 .这里还是得特别留意,这个Symbolic Link与Windows的快捷方式可以给他划上等号,由Symboliclink所建立的文件为一个独立的新的文件,所以会占用掉inode与block。
磁盘的分区、格式化、检验与挂载
lsblk 列出系统上的所有磁盘列表。lsblk可以看成『list block device』的缩写,就是列出所有储存装置的意思
blkid列出装置的UUID等参数
UUID是全局单一标识符(universally unique identifier),Linux会将系统内所有的装置都给予一个独一无二的标识符, 这个标识符就可以拿来作为挂载或者是使用这个装置/文件系统之用。
gdisk、fdisk和parted
分区时,应使用parted检查分区表格式,再判断使用fdisk/gdisk来分区,或直接使用parted分区。MBR分区表请使用fdisk分区,GPT分区表请使用gdisk分区 。
只要离开gdisk时按下『q』,那么所有的动作『都不会生效!』相反的, 按下『w』就是动作生效的意思。
Start (sector):每一个分区槽的开始扇区号码位置
End (sector):每一个分区的结束扇区号码位置,与start之间可以算出分区槽的总容量
Size:就是分区槽的容量了
Code:在分区槽内的可能的文件系统类型。Linux为8300,swap为8200。不过这个项目只是一个提示而已,不见得真的代表此分区槽内的文件系统喔!
Name:文件系统的名称等等。
从上表我们可以发现几件事情:
整部磁盘还可以进行额外的分区,因为最大扇区为 83886080,但只使用到65026047号而已;
分区槽的设计中,新分区通常选用上一个分区的结束扇区号码数加1作为起始扇区号码!
这个 gdisk只有root才能执行,此外,请注意,使用的『装置文件名』请不要加上数字,因为partition是针对『整个磁盘装置』而不是某个partition
新建一个G的xfs分区
发现没有变成vda4,是因为核心没有更新,通过partprobe更新Linux核心的分区表信息
fdisk用于MBR中,方法与gdisk类似
parted可以同时支持MBR和GPT的分区行为,
磁盘的格式化
XFS文件系统mkfs.xfs
『格式化』其实应该称为『建置文件系统(make filesystem)』
如果想要格式化为ext4的传统Linux文件系统的话,可以使用mkfs.ext4这个指令即可
文件系统检验
单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
单一目录不应该重复挂载多个文件系统;
要作为挂载点的目录,理论上应该都是空目录才是。
/etc/filesystems:系统指定的测试挂载文件系统类型的优先级;
/proc/filesystems:Linux系统已经加载的文件系统类型。
Linux支持的文件系统之驱动程序都写在如下的目录中:
/lib/modules/$(uname -r)/kernel/fs/
挂载xfs/ext4/vfat等文件系统(挂载文件一般使用UUID挂载因为,这个标志是独一无二的)
光驱一挂载之后就无法退出光盘片了!除非你将他卸除才能够退出!
挂载vfat中文随身碟(USB 磁盘)
umount (将装置文件卸除)
磁盘/文件系统参数修订
Linux 底下所有的装置都以文件来代表!但是那个文件如何代表该装置呢?就是透过文件的major与minor数值来替代的 。
如果你当初格式化的时候忘记加上标头名称,后来想要再次加入时,不需要重复格式化!直接使用这个 xfs_admin即可
设定开机挂载
开机挂载 /etc/fstab及/etc/mtab
根目录 /是必须挂载的﹐而且一定要先于其它mount point被挂载进来。
其它 mount point必须为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则(FHS)
所有 mount point在同一时间之内﹐只能挂载一次。
所有 partition在同一时间之内﹐只能挂载一次。
如若进行卸除﹐您必须先将工作目录移到 mount point(及其子目录)之外。
Device:磁盘装置文件名/UUID/LABEL name
这个字段可以填写的数据主要有三个项目:
文件系统或磁盘的装置文件名,如/dev/vda2等
文件系统的UUID 名称,如UUID=xxx
文件系统的LABEL 名称,例如LABEL=xxx
mount point:挂载点 ,即为目录
在手动挂载时可以让系统自动测试挂载,但在这个文件当中我们必须要手动写入文件系统才行!包括xfs, ext4, vfat, reiserfs, nfs等等。
parameters:文件系统参数
dump :是一个用来做为备份的指令,不过现在有太多的备份方案了,所以这个项目可以不要理会,直接输入0就好了!
fsck:早期开机的流程中,会有一段时间去检验本机的文件系统,看看文件系统是否完整(clean)。
/etc/fstab是开机时的配置文件,不过,实际 filesystem 的挂载是记录到 /etc/mtab 与 /proc/mounts这两个文件当中的。
挂载光盘/DVD 映象文件
建立一个空的文件在/srv/loopdev
预设xfs不能够格式化文件的,所以要格式化文件得要加入特别的参数才行
利用mount的特殊参数,那个 -o loop 的参数来 挂载
关于内存置换空间swap
一般来说,如果硬件的配备资源足够的话,那么swap应该不会被我们的系统所使用到,swap会被利用到的时刻通常就是物理内存不足的情况了。虽然目前(2015)主机的内存都很大,至少都有4GB以上啰!因此在个人使用上,你不要设定swap在你的 Linux应该也没有什么太大的问题。 不过服务器可就不这么想了~由于你不会知道何时会有大量来自网络的要求,因此最好还是能够预留一些swap 来缓冲一下系统的内存用量 。
linux读书摘要--linux磁盘与文件系统管理