Extx 文件系统原理
block group
每个分区(partition)的组成为 boot sector -> block group -> block group -> block group -> ...
而每个block group的组成为 super block -> 文件系统描述 -> 区块对应表(block bitmap) -> inode对应表(inode bitmap) -> inode Table -> Data Block
文件系统描述
描述每个block group开始和结束的block号码。以及每一个区段(superblock、bitmap、inodemap、datablock)分别介于哪一个block号码之间。
block bitmap
用于描述block的使用情况,哪些block为空,哪些block已经在使用。
inode bitmap
用于描述inode的使用情况,哪些inode没在用,哪些inode已经在使用。
通过dumpe2fs观察文件系统
dumpe2fs [-bh] 装置文件名
dumpe2fs -h 仅列出superblock的数据
superblock inode block
superblock 记录文件系统的整体信息,如inode/block的总量、使用量、剩余量、以及文件系统的格式和相关信息。
superblock记录着
- block和inode的总量。
- 未使用和已经使用的block和inode数量。
- block和inode的大小
- 文件系统的挂载时间,最近一个写入数据的时间,最近一个检查硬盘的时间。
- 文件系统是否被挂载的标志 valid bit。未挂载为0、挂载为1。
一般,superblock的大小为1024bytes。
除了第一个block goup具有superblock,其他不一定具有superblock。若其他blockgroup有,则只是**对superblock的备份。
- block
inode 记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的block号
inode 记录着
- 档案的权限 rwx
- 档案的拥有者和群组
- 档案的容量
- 档案的三个时间ctime,atime,mtime
- 档案的特殊权限 SUID、SGID、SBIT
- 档案真正的内容指向,指向block区
inode的大小和数量在格式化后就不能变。
每个inode的大小为128bytes。
每个档案占用一个inode。
文件系统能够建立的档案数量与inode的数量有关。
inode记录block号码的区域定义为12个直接、一个间接、一个双间接和一个三间接记录区。
block直接为 -> 数据block
block间接为 -> 间接block -> 数据block
block双间接为 -> 间接block -> 间接block -> 数据block
block三间接为 -> 间接block -> 间接block -> 间接block -> 数据block
block 实际记录档案的内容,若档案太大,会占用多个block
每个block的大小可以为1kB、2KB、4kB。
原则上,block的大小和数量格式化后就不能改变。
每个block只能放置一个档案的内容。
档案大会占用多个block,档案小会占用一个block,并浪费block其余空间。
文件与目录
目录
每个目录的block记录着目录下的文件名和对应的inode号
日志文件系统
例如,文档创建开始记录日志,文档创建结束记录日志,这种方式有利于数据一致性检查
挂载相关
将 硬盘的文件系统 与 目录树 结合的方式称为 挂载。文件系统必须挂载到目录树的某个目录后,才能被使用。
文件系统最顶层目录的inode号 一般为 2。
通过ls -l /lib/modules/$(uname -r)/kernel/fs 可以查看linux支持的文件系统
通过cat /proc/filesystems 可以查看linux目前加载的文件系统。
VFS(virtual filesystem switch) 会帮助我们管理文件系统。
iso的挂载和制作
iso的挂载
通过命令 mount -o loop /tmp/xx.iso /mnt 进行挂载。
制作大档案进行挂载(制作iso映像)
dd if=/dev/zero of=/home/loopdev bs=1M connt=512 制作/home/loopdev大小为512M的档案,内容为空。
if 指定 input file
of 指定 output file
bs 指定每个block的大小
count 指定有多少个block
然后进行格式化
mkfs -t ext3 /home/loopdev
然后进行挂载
mount -o loop /home/loop/dev /media/cdrom
查看过载情况
df 或 mount
建立 swap partition
通过fdisk分割磁盘块,并需要修改system id
通过 fdisk的 t 修改系统ID
通过mkswap进行格式化
mkswap /dev/hdc7
free通过swapon将swap启动
swapon /dev/hdc7
free- 通过free观察内存的用量
通过swapoff关掉swap file
知识点
数据更改后只会从clean变成dirty,数据从内存到硬盘是异步的。可通过sync命令同步写入到硬盘。
linux会将常用的档案或数据放在主存储器的缓冲区,以加快文件系统的读写,因此linux的物理内存最后都会别用光。
挂载注意:
单一文件系统不应该重复挂载到不同挂载点。
单一目录不应该重复挂载多个文件系统。
挂载点目录理论上应该为空目录。
挂载的一些限制:
根目录/必须挂载,而且必须先于其他挂载点挂载。
挂载点必须为已经建立的目录
挂载点同一时间只能挂载一次
partition同一时间只能挂载一次
不能再挂载点目录进行取消挂载
目录 /etc/fstab 和 /etc/mtab 是开机挂载相关的目录
/etc/fstab 后面的两个数字的意义
第一个数字 是否进行dump备份
0 不做dump备份
1 每天进行dump备份
2 不定日期进行dump备份
第二个数字 是否以fsck检查扇区
0 不检查
1 最早被检验
2 检验,不是最早,一般根目录设定为1最早进行检验。
通过 mount -a 对 /etc/fstab 进行测试,否则影响开机
通过 df 查看 挂载信息。
单人模式下根目录 是只读的。可通过 mount -n -o remount,rw / 重新挂载改成读写。
linux支持的文件系统在 /lib/modules/$(uname -r)/kernel/fs 下
/etc/filesystems 系统指定的测试挂载文件系统类型
/proc/filesystems 系统已经加载的文件系统类型 d
当通过ls /dev下面的装置时,group后面的是 major号 和 minor号。可以称为主装置号和次装置号。例如
/dev/hda major为 3 minor为 0~63。
/dev/hdb major为 3 minor为 64~127。
/dev/sda major为 8 minor为 0~15。
/dev/sdb major为 8 minor为 16~31。
基本上,linux2.6之后,硬件文件名都能被系统实时产生。要手动处理装置档案,可通过 mknod命令。
文件系统命令
- dumpe2fs (观察文件系统的各部分,superblock inode block等)
df (查看目前挂载的装置,查看整体磁盘使用量)
df -h 以GB、MB等方式显示
df -h /etc 查看/etc的可用磁盘容量。
df -ih 显示可用的inode数量。- e2fsck (进行数据一致性检查,inode bitmap、block bitmap、superblock等元数据的一致性)
- sync (在内存中dirty的数据同步写入硬盘)
du (查看文件系统磁盘使用量,默认以kB为单位)
du -a 档案的容量也列举出来
du -s /* 目录的容量ln (制作链接档)
ln srcfile dst_linkfile 创建硬链接
ln -s srcfile dst_linkfile 创建软链接
硬链接不占用inode和block,软链接占用inode和block
du -sd;df -i 查看当前目录的总大小和inode使用情况fdisk (进行磁盘分区,仅对装置起作用,只有root才能执行)
df / 找出根目录所在磁盘
fdisk /dev/sda 对/dev/sda进行操作
fdisk -l 列出所有装置的分区情况partprobe (强制让核心重新捕捉partition table)
在fdisk进行分区后使用
mkfs (格式化分区 make file system)
mkfs [-t 文件系统格式] 装置文件名
mke2fs (自定义格式户分区)
mke2fs -b [1024|2048|4096] 指定block大小
mke2fs -j 创建ext3文件系统,默认为ext2
mke2fs -L LABEL 设定文件系统的label
mke2fs -i size 设定每多少字节分配一个inodefsck (进行文件系统检测修复)
fsck -t type 指定文件系统类型
fsck -A 依据/etc/fstab的内容,对需要的装置扫描一遍。
fsck -a 自动修复,不需要老按y
fsck -C 扫描过程中使用直方图显示进度
fsck -f 强制检查clean的地方
最好在卸载情况下扫描mount (挂载命令)
mount -a 根据/etc/fstab对未挂载的文件系统进行挂载
mount -l 显示目前的挂载信息,及label
mount -t type 指定文件系统类型
mount -n 默认会将挂载信息写入/etc/mtab,-n则不写入
mount -L 通过label进行挂载
mount -o 后接挂载参数
mount 装置文件名 挂载点
mount /dev/sda5 /mnt
mount -t iso9660 /dev/cdrom /media 挂载光盘
mount -t vfat /dev/fd0 /media 挂载软盘
mount -p loop /root/xxx.iso /mnt 挂载iso映像文件。
fdisk -l 找出U盘的装置文件名
mount -t vfat -o iocharset=cp950 /dev/sda1 /mnt/flash 挂载U盘,不能是NTFS格式
mount -o remount,rw,auto / 重新挂载根目录,并加入参数rw,auto
mount --bind /home /mnt/home 将某个目录挂载到其他目录
mount -L "LABEL" /mnt 通过Label进行挂载
挂载参数 -o
async/sync 设定磁盘是否以异步方式运作,默认为async异步
auto/noauto 是否注定测试挂载
rw/ro 设定读写还是只读
exec/noexec 设定是否可执行
user/nouser 是否允许用户通过mount挂载
suid/nosuid 是否允许suid的存在
usrquota 启动文件系统支持磁盘配额
grpquota 启动文件系统支持群组磁盘配额
defaults 默认参数umount (取消挂载)
umount [-fn] 装置文件名或挂载点
umount -f 强制取消挂载
umount -n 不更新 /etc/mtabmknod (手动设置装置档案)
mknod 装置文件名 [bcp] [major] [minor]
参数 b 为设定装置名称成为一个周边存储设备档案,例如硬盘。
参数 c 为设定装置名称成为一个周边输入设备档案,例如鼠标、键盘。
参数 p 为设定装置名称成为一个FIFO档案。
mknod /dev/hdc10 b 22 10
mknod /tmp/testpipe pe2label (格式化之后修改文件系统的label)
e2label 装置文件名 newLabelName
e2label /dev/hdc10 "my_label" 修改/dev/hdc10的LABEL为my_label
dumpe2fs -h /dev/hdc10 可以查看文献系统的labeltune2fs ()
tune2fs [-jlL] 装置号
tune2fs -l 类似于 dumpe2fs -h
tune2fs -j 将ext2升级为ext3
tune2fs -L 修改文件系统的LABELhdparm (侦测和修改IDE接口的硬盘参数)
hdparm -Tt /dev/sda 可以测试SATA硬盘的读取效能
- mkswap (格式化swap分区)
- swapon (加载swap分区)
- swapoff (卸载swap分区)
parted
parted 装置 [指定[参数]]
parted /dev/sda print 列出分割表信息
parted /dev/sda mkpart logical ext3 19.2GB 19.7GB //创建逻辑分区
parted /dev/sda rm 8 删除8号分区
其他知识点
硬链接
硬链接不能跨文件系统
硬链接不能对目录进行
参考
鸟哥的Linux私房菜 第三版