认识Linux文件系统
磁盘组成与分区的复习
- 早期的磁盘分区以柱面为最小单位。现在的磁盘分区以扇面为最小单位。
- 磁盘分区表主要有两种格式,一种是限制较多的MBR分区表,一种是较新且限制较少的GBT分区表。
- MBR分区表中,第一个扇区最重要,里面有:主引导记录(MBR)及分区表,其中MBR占有446B,分区表占有64B。
- /dev/sd/[a-p][1-128]:为物理磁盘的文件名。
/dev/vd[a-p][1-128]:为虚拟磁盘的文件名。
文件系统的特性
通常我们称一个可被挂载的数据为为一个文件系统,而不是一个分区。
- 文件系统通常会将文件权限、属性与文件数据分别存放在不同的区块,权限与属性放置到inode中,至于实际数据则放置在数据区块中。
- 超级区块:记录此文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,以及文件系统的格式与相关信息等。
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的数据区块。
数据区块:实际记录文件的内容,若文件太大时,会占用多个区块。
Linux的ext2文件系统(inode)
文件系统一开始就将数据区块和inode规划好,除非重新格式化,否则inode与数据区块就不再变动,但是当文件系统高达数百G的时候,将所有的inode和数据区块放在一块很不明智,因此ext2文件系统格式化的时候基本上时区分为多个区块群组,每个区块群组有自己的inode,数据区块,超级区块系统。在整体的规划中,所有区块群组的最前面有一个启动扇区。这个启动扇区可以安装启动引导程序,这样,我们就可以将不同的启动引导程序安装在别的文件系统的最前端,而不用覆盖整个磁盘唯一的MBR,这样就可以制作出多重引导环境。每个群组的六个主要内容如下:
数据区块:用来放置文件数据,在ext2文件系统有1k,2k,4k区分,针对不同的用途,可以划分不同的区块大小。
- inode table(inode表)
- 记录了该文件的读写执行属性。
- 该文件的拥有者和用户组。
- 该文件的大小。
- 该文件的建立时间或状态改变时间,atime,mtime,ctime,定义文件特性的标识例如SUID。
- 该文件真正内容的指向。
- 每个inode大小都为128B,每个文件只会占用一个inode。
- 因此,文件系统能够建立的新文件的数量和inode的数量有关。
- 系统读取文件的时候,需要先找到inode,并分析inode所记录的权限和用户是否符合,若符合才能够读取文件的内容。
- Superblock(超级区块):
- 数据区块和inode的总量。
- 未使用和已使用的inode与数据区快的数量。
- 数据区块与inode的大小。
- 文件系统的挂载时间、最近一次写入数据的时间、最近一次校验磁盘的时间等文件系统相关的信息。
- 一个有效数值位,若此文件系统已经被挂载则为0,若未被挂载则为1。
- Filesystem Description(文件系统描述说明)
这个区段可以描述每个区块群组的开始与结束的区块,以及说明每个区段(超级区块,对照表,inode对照表,数据区块)分别介于哪一个区块之间。这部分文件也可以使用dumpe2fs来查看。 - 区块对照表(block bitmap)
从 block bitmap 当中可以知道哪些 block 是空的,因此我们的系统就能够很快速的找到可使用的空间来处理文件,同样的,如果删除某些文件时,那么那些文件原本占用的 block 号码就得要释放出来, 此时在 block bitmap 当中相对应到该 block 号码的标志就得要修改成为‘未使用中’。 - inode对照表(inode table)
和区块对照表类似,只不过是用来记录inode的使用过和未使用的号码。 dumpe2fs:查询ext系列超级区块信息的命令。在xfs文件系统中无法使用,这意味着在Centos7中就无法使用。
与目录树的关系
目录:当我们在linux下建立一个目录的时候,文件系统会分配一个inode与至少一个区块给该目录。其中,inode记录该目录的相关属性与权限,并记录分配到的那个区块号码,而区快是用来记录这个目录下的文件名与该文件名占用的inode号码数据。可以使用
ls -i来查看inode号码。ext2/ext3/ext4文件的存取与日志式文件系统的功能
对新增文件时发生数据不一致的处理方式,早期的ext2文件系统依靠超级区块进行检测,日志式的文件系统有个日志文件进行操作记录,可以更方便的进行操作。
Linux文件系统的运行
将内存中的数据分为dirty和clean两种,系统将不定时的将内存中的dirty数据存入磁盘,也可以手工通过执行sync命令来执行。dirty是修改过的数据。
挂载点的意义
将文件系统与目录树的结合称为挂载,挂载点一定是目录,该目录为进入该文件系统的入口。文件系统必须挂载在目录树的某个目录后,才能够使用该目录。
其他Linux支持的文件系统和VFS
Linux支持的文件系统可以通过
ls -l /lib/modules/$(uname -r)/kernel/fs来查看。
VFS(Virtual FileSystem Switch)是Linux帮我们管理文件系统的程序,让用户可以忽略文件系统的差异。XFS文件系统的介绍
xfs是日志式文件系统,主要规划为数据区,文件系统活动登陆区,实时运行区。使用
xfs_info来观察该文件系统的类似超级区块的部分。文件系统的简单操作
磁盘与目录的容量
df:列出文件系统的整体磁盘使用量
du:查看文件系统的磁盘使用量硬链接与符号链接
硬链接:
不能跨文件系统。
不能链接目录。(会出现一个目录两个父目录的情况,也会出现目录回路的情况。)符号链接:
总结
给test文件建立硬链接testhard和软链接testsoft之后,删除了test,testhard仍然可以使用,testsoft无法使用。
关于目录的链接数量,当一个文件夹建立的时候,他会有..和.两个文件链接出现。此时他的父目录就会多出一个硬链接数量(..),子目录天生就有两个硬链接(一个是目录本身,一个是.)。磁盘的分区,格式化,检验与挂载
- lsblk:列出系统上的所有磁盘列表。
- -f:列出其中的文件系统名称。
- blkid:列出设备的UUID等参数。
-
磁盘分区
gdisk:适用于GPT分区表。
- 应该先使用lsblk或者blkid找到磁盘,再用parted /dev/xxx print找到内部的分区表类型,再使用gdisk或者是fdisk来操作系统。
- 使用gdisk新增分区的时候,有一个Hex Code or GUID这里选择的是未来这个分区预计使用的文件系统。默认的是Linux文件系统的8300。Last Sector选项需要注意一下,使用+1G这种格式较方便。
- partprobe:使用gdisk创建硬盘之后并不能立刻看到硬盘分区,因为内核还没有更新,此时可以通过重启,或者这个命令来进行更新Linux内核的分区信息。
-
磁盘格式化(创建文件系统)
mkfs(make filesystem):这个命令是个综合命令,可以调用正确的文件格式化工具。例如mkfs.xfs,mkfs.vfat等创建正确的文件系统。
- -f:如果设备内已经有文件系统,就需要用这个-f来进行强制格式化。
- mkfs.xfs创建xfs的文件系统。
mkfs.ext4创建ext4的文件系统。默认值文件在/etc/mke2fs.conf文件中。
文件系统检验
xfs_repair当有xfs文件系统错乱时使用该命令。
fsck.ext4是个处理ext4文件系统。
以上两个命令是文件系统出错的时候才使用的命令,一般不要使用,会影响到文件系统的正确性。且被检查的文件系统必须处于卸载的状态。但是根目录无法卸载,如果根目录出现问题,就需要进入单人维护或者恢复模式使用-d选项来强制检验该设备。文件系统的挂载与卸载
单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
- 单一目录不应该重复挂载多个文件系统。
- 要作为挂载点的目录,理论上要是空目录,如果不是空目录就会覆盖里面的文件,但是将文件系统卸载之后又会重新恢复。
使用mount命令来进行文件系统的挂载。
- -a:依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来。
-
挂载xfs,ext4,vfat等文件系统
挂载USB磁盘
mount -o codepage=950,iocharset=utf8 UUID 挂载点
如果是中文文件名的vfat,那么可以在挂载制定挂载文件系统所使用的语系。在man mount找到vfat文件格式当中可以使用codepage来处理。中文的语系为950,如果想要指定中文编码是Unicode还是Big5就需要iocharset来制定了。重新挂载新目录与挂载不特定目录
根目录根本不能卸载,但是如果你的挂载参数要改变或是根目录出现只读的状态的时候,可以使用重新启动,或者使用
mount -o remount,rw,auto /。重点是-o remount,xx的选项和参数。也可以利用mount来将某个目录挂载到另外一个目录,这并不是挂载文件系统,而是额外挂载某个目录的方法。这个也可以通过软链接来完成这个操作。
磁盘/文件系统参数自定义
mknod
- xfs_admin修改XFS文件系统的UUID与Label name。
- 为什么使用UUID来作为挂载时写入的设备名称呢?因为当一个磁盘在所有的Linux系统上都是/dev/sda。例如在这个linux系统上时/dev/sda在另外一个linux系统上也有了/dev/sda就不能使用同一个命令了。
- 使用uuidgen可以使用新的uuid。
- 使用tune2fs修改ext4文件系统的lablename与UUID。
设置启动挂载
启动挂载/etc/fstab及/etc/matb

特殊设备Loop挂载(镜像文件不用刻录就挂载使用)
镜像文件的挂载
大文件制作Loop设备挂载


内存交换分区之创建
使用物理分区创建内存交换分区
使用文件创建内存交换文件




说明:
我们的 Linux 系统大概都用不到 swap这个玩意儿的。
不过, 如果是针对服务器或者是工作站这些常年上线的系统来说的话,那么,无论如何, swap 还是需要建立的。
另外,有某些程序在运作时,本来就会利用 swap 的特性来存放一些数据段, 所以, swap 来是需要建立的!只是不需要太大!
文件系统的特殊观察与操作
磁盘空间之浪费问题
一个区块只能存放一个文件,假设只有1k但是区块大小是4k。那么3k就被浪费了。
利用GNU的parted进行分区操作
重点回顾
- 一个可以被挂载的数据通常称为『文件系统, filesystem』而不是分区槽 (partition) 喔!
- 基本上 Linux 的传统文件系统为 Ext2 ,该文件系统内的信息主要有:
- superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
- Ext2 文件系统的数据存取为索引式文件系统(indexed allocation)
- 需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起。
- Ext2 文件系统主要有:boot sector, superblock, inode bitmap, block bitmap, inode table, data block 等六大部分。
- data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已
- inode 记录文件的属性/权限等数据,其他重要项目为: 每个 inode 大小均为固定,有 128/256bytes 两种基本容量。每个文件都仅会占用一个 inode 而已; 因此文件系统能够建立的文件数量与 inode 的数量有关;
- 文件的 block 在记录文件的实际数据,目录的 block 则在记录该目录底下文件名与其 inode 号码的对照表;
- 日志式文件系统 (journal) 会多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间;
- Linux 文件系统为增加效能,会让主存储器作为大量的磁盘高速缓存;
- 实体链接只是多了一个文件名对该 inode 号码的链接而已;
- 符号链接就类似 Windows 的快捷方式功能。
13 . 磁盘的使用必需要经过: 分区、格式化与挂载,分别惯用的指令为: gdisk, mkfs, mount 三个指令
- 分区时,应使用 parted 检查分区表格式,再判断使用 fdisk/gdisk 来分区,或直接使用 parted 分区
- 为了考虑效能, XFS 文件系统格式化时,可以考虑加上 agcount/su/sw/extsize 等参数较佳
16 . 如果磁盘已无未分区的容量,可以考虑使用大型文件取代磁盘装置的处理方式,通过 dd 与格式化功能。
- 开机自动挂载可参考/etc/fstab 之设定,设定完毕务必使用 mount -a 测试语法正确否;










