文件系统简介
1.Linux的正统文件系统为ext2(Linux second Extended file System,ext2fs)
2.一个可被挂载的数据为一个文件系统(而不是一个硬盘分区)。
传统磁盘与文件系统中,一个分区只能被格式化为一个文件系统,所以之前说一个文件系统就是一个硬盘分区。
新的磁盘与LVM中,一个分区可以格式化为多个文件系统,多个分区也可以合并为一个文件系统。
3.索引式文件系统
通过索引来找寻文件,与之相反的是,如U盘常使用FAT格式的文件系统。
其中主要包含三种数据:
i)索引是inode,用来存取权限、属性和数据区块号(实际数据的地址)。
ii)数据区块,记录文件的实际内容,大文件可能占用多个区块。
iii)超级区块,记录此文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量以及文件系统的格式等等。
Linux的ext2文件系统
文件系统一开始就将inode与数据区块规划好,除非重新格式化,否则inode与数据区块固定不动。
每一个文件系统有多个区块群组,在文件系统最前方有一个启动扇区(Boot sector),便于进行多重引导。
每一个区块群组主要有六部分:超级区块,文件系统描述,区块对照表,inode对照表,inode table和数据区块。
数据区块
用来存放文件数据的地方,ext2文件系统所支持的区块大小有1K,2K以及4K三种。在格式化的时候固定区块大小以及编号。
区块的大小会导致文件系统能够支持的最大磁盘容量与最大单一文件容量不同。
其他限制:
1.区块的大小与数量在格式化后不能再修改,除非重新格式化;
2.每个区块最多只能存放一个文件的数据;
3.文件大于区块大小,则一个文件会占用多个区块;
4.文件小于区块则该区块的剩余容量就不能够再使用,从而造成磁盘空间的浪费。
inode table
inode table主要记录文件的读写属性,拥有者与用户组,文件大小,建立与状态改变的时间,最近一次的读取时间,最近修改的时间,定义文件特性的标识(如SUID,SGID,SBIT),文件真正内容的指向。
1)每个inode大小固定为128B(ext4与xfs可设置到256B)
2)每个文件占用一个inode
3)文件系统能建立的文件数量与inode的数量有关
4)系统读取文件的时候需要先对于inode所记录的权限与用户进行分析,若符合才能读取区块的内容。
inode记录区块号码的区域定义为12个直接,1个间接,1个双间接与一个三间接记录区。
直接记录区时直接取得区块号码,
间接记录区是指向一个区块,这个区块用来记录区块号码。
双间接记录区是指向一个区块,这个区块再指向区块,第二层的区块才是用来记载实际的区块号码。
三间接同理。
以最小的1K的区块为例:
12 个直接指向: 12*1K=12K
由于是直接指向,所以总共可记录 12 笔记录,因此总额大小为如上所示;
间接: 256*1K=256K(这里的256为一个间接区块所能记载的block号码数,1K为区块大小)
每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的
文件大小如上;
双间接: 256*256*1K=256 2 K
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码,因此总额大小如上;
三间接: 256*256*256*1K=256 3 K
第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定 256 个号
码,因此总额大小如上;
总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256*256 + 256*256*256 (K) = 16GB
Superblock(超级区块)
记录整个文件系统相关信息的地方。记录的主要信息:
数据区块与inode的总量;
未使用和已使用的inode与数据区块数量;
数据区块与inode的大小(block为1、2、4K,inode为128B或256B);
文件系统的挂载时间、最近一次写入数据的时间、最近一次检验磁盘的时间(fsck)等文件系统的相关信息;
一个有效为数值,若此文件系统已经被挂载,则有效位为0,否则为1。
除了第一个区块群组内含有超级区块之外,后续的区块群组不一定含有超级区块,若含有超级区块主要作为第一个区块群组内超级区块的备份。
文件系统描述
描述每个区块群组的开始与结束的区块,以及说明每个区段分别介于哪一个区块之间。
区块对照表
记录哪些区块是空的,哪些区块是已经被使用的。
inode对照表
记录使用与未被使用的inode号码
与目录树的关系
目录
文件系统会分配一个inode与一个数据区块给一个目录
该inode记录的是该目录的相关属性与权限,以及分配得到的那块区块号码。
该数据区块记录的是在这个目录下的文件名与该文件占用的inode号码。
使用ls -li显示的inode号为每个文件或目录对应的inode号码。
其中显示的目录大小都是1024的整数倍;因为每个区块的大小都是1K,2K,4K的
文件
目录树
文件名的记录是在目录的区块中,所以对文件的增删改都需要对目录具有W的权限。
所以只要对目录具有RWX的权限,即使对目录中的文件没有任何权限也可以删除其中的文件。
对目录没有r的权限的时候,不能使用ls和tab补全的功能,但是假若知道其中的文件名是可以直接运行的。
修改Desktop的权限为-wx
文件系统的简单操作
列出文件系统的整体磁盘使用量
df [-hTi] 目录或文件名
-h:以人们较易理解的单位进行显示
-T:连同硬盘分区的文件系统的名称都列出来(例如ext4)
-i:不用磁盘容量,而以inode的数量进行显示。
查看文件系统的磁盘使用量
du [-sS] 目录或文件名
-s:仅列出总量
-S:记录所有子目录(子目录下的子目录直到无目录)的总计与剩下的总计
PS:使用touch test_1可以建立一个空文件。
观察磁盘分区状态
lsblk [-ip] [device]
-i:使用ASCII的字符输出
-p:列出该设备的完整文件名,而不是仅仅列出最后的名字
blkid
列出设备的UUID(universally unique identifer)等参数。
需要root权限才能能够显示。
磁盘分区
MBR分区表使用fdisk,GPT分区使用fdisk。
gdisk 设备名称
?查看可用命令
d 删除分区
n增加一个分区
p打印分区表
q不保存分区直接离开gdisk
w保存分区后离开gdisk
该命令也是需要root权限,针对整个磁盘,而不是某个分区,所以执行gdisk /dev/sda1就会报错,应该使用gdisk /dev/sda
在进行增加扇区的时候,需要注意选择开始开始扇区First sector之后要选择的Last sector一定不要选择默认,因为默认是将所有空间都用掉。
注:
i)增加或者删除扇区都需要更新Linux内核的分区表信息。
partprobe -s 更新内核的分区表信息并输出显示
ii)删除扇区的话必须先将该扇区卸载。umount
磁盘格式化
mkfs.ext4
-b:设置区块的大小,有1K,2K,4K的容量
-L:后面接这个设备的标头名称
格式化为ext4的系统,若没有添加自定义的参数,则默认参数由/etc/mke2fs.conf控制。
mkfs.vfat
mkfs -t vfat 设备名称
格式化之后可以使用dumpe2fs来查看超级区块信息。
文件系统检验
fsck.ext4
-f:强制检查
-b:利用超级区块进行恢复
在进行检查之前一定要确认被检查的分区不挂载在系统上,需要确保该分区处于被卸载的状态。
正常情况下不要执行此命令,可能对系统造成伤害。
文件系统挂载与卸载
mount -l 显示目前挂载的信息,可增列Label的名称
mount -t 加指定欲挂载的类型,如xfs,ext4等。
在进行挂载之前需要确定:
1.单一文件系统不应该被重复挂载在不同的挂载点
2.单一目录不应该重复挂载多个文件系统
3.作为挂载点的目录,理论上应该是空目录才行
当目录不为空的时候,挂载了文件系统之后,原有的文件就会被隐藏,等到新分区被卸载之后,则原有的内容就会再次出现。
mount -a依照配置文件/etc/fstab的数据将所有未挂载的磁盘都挂载上来
mount -o remount表示重新挂载 在系统出错或者重新设置参数的时候
光盘的挂载之后无法退出,只有卸载之后才能退出。
将设备文件卸载umount
-f:强制卸载
-l:立刻卸载文件系统,比-f还强
-n:不更新/etc/mtab的情况下卸载
设置启动挂载
挂载的限制
1.根目录一定要挂载,而且要优先于其他挂载点
2.其他挂载点必须为已建立的目录,可任意指定,但一定要遵守系统目录架构原则FHS
3.所有挂载点在同一时间内只能挂载一次
4.所有硬盘分区在同一时间内只能挂载一次
5.若进行卸载,必须先将工作目录移动到挂载点及其子目录之外。
自动挂载
我们进行mount命令的时候,就是在将各种选项和参数填写在/etc/fstab中
在修改/etc/fstab之后,一定要使用df来看一下挂载是否正确。若/etc/fstab错误可能会导致系统无法顺利启动。
内存交换分区(swap)
当物理内存不足的时候,内存交换分区可以将内存中的数据拿到硬盘中暂时存放。
目前的主机一般都较大,不需要使用swap,但是对于服务器来说,不确定何时会有大量的网络请求,最好还是预留一些内存交换分区。
1.使用gdisk划分一个分区,
2.mkswap 设备文件名 来进行格式化
3.swapon 设备文件名 将swap设备启动
4.通过free或swapon -s来观察内存的使用量
free display free and memory in the system
parted
parted命令也可以进行分区操作,后来推出GPT的gdisk之后,用的较少。
parted device print会显示分区表信息。
可以确定是GPT分区表。在不能确定是何种分区从而不能确定使用fdisk与gdisk时,使用parted来确定。
参考鸟哥的Linux私房菜第四版