8.1 认识 ET2文件系统
8.1.1硬盘组成与分区的复习
- 磁盘的物理组成 (3个物理组成 3个盘片组成 两种磁盘文件名)
Review p#12 - 分区(5 个点)
Review p#67
8.1.2 文件系统特性
Linux ->Ext2
Windows -> NTFS使用LVM (Logical Volume Manager)和 软磁盘阵列 Softdisk RAID 将一个分区格式化为多个文件系统, 也能将多个分区合成一个文件系统。
Review RAID 和 LVM-
文件系统如何运行?
Inode
文件权限和属性放 inode
一个文件占用一个inode,同时记录此文件的数据所在的block号码Block
而文件实际数据放data block 块中
若文件太大,会占用多个blockSuperblock
用于存放整体信息,包括inode和block的总量、使用量、剩余量、以及文件系统的格式。
索引式文件系统 indexed allocation
根据inode查找所有block读取
-FAT U盘
没有inode存在,只能先将上一个block读取出来才知道下一个block号码。
- 碎片整理 (对于FAT文件系统经常使用)
将同一个文件所属的的block再汇合到一起,提高读取速度。
8.1.3 Linux的 Ext2 文件系统
- 为什么硬盘只有一个MBR却可以安装双系统 ?
- Ext2 文件系统为了便于管理 固定的 inode 和block 区分出 多个块组(block group),每个 块组 都拥有自己独立的inode block superblock 系统。
- 在整体的规划中,文件系统在最前面有一个 启动扇区 BootSector 用于安装引导装载文件,不用覆盖硬盘唯一个MBR
BootSection 在文件系统的 最前端
data block (数据块)
三种size 1KB 2KB 4KB
对应最大单一文件限制 16GB 256GB 2TB
对应对大文件系统总容量 2TB 8TB 16TB原则上 block 的数量和大小在格式化完成后就固定了, 除非重新格式化
每个block 最多放一个文件的数据
如果文件大于block大小,则一个文件会占用多个block
若小于 block 大小,则剩余空间也不能被使用
产生两个问题
如果采用了较大size的block,会造成资源的浪费
如果采用较小的,会使读写速度变慢
估计文件的大小选择block的size
inodetable(inode 表格)
1.inode 记录了哪些文件数据?
rwx;owner/group;size;ctime/atime/mtime;SetID;pointer
2.inode的其他特点
inode 固定大小为128bytes
每个文件只能占用一个inode
文件系统能创建文件的数量和inode的数量有关
系统读取文件需要先找到inode, 并分析 inode所记录的权限与用户是否符合,符合了才开始读取block里面的内容-
inode 结构
12个直接、一个间接、一个双间接、一个三间接记录区
Superblock (超级块)
block 与inode的总量
未使用与已使用b&i总量
b&i的大小
文件系统挂载时间、最近一次写入数据时间、最近一次检测磁盘fsck的时间等文件系统相关信息
一个validbit数值,0->已挂载 1->未被挂载
每个block group都可能含有superblock 作为唯一的superblock的备份File System Descripition (文件系统描述说明)
用于描述:
每个block group 的开始与结束的 block号码
说明每个区段分别介于哪个block号码之间
(superblock,bitmap,inodemap,data block)block bitmap
哪些block号码用着,哪些block号码未使用,删除文件时释放block号码
-inode bitmap
如上,替换成 inode
Tips:可以使用dumpe2fs 查看Superblock和File Syetem Descripition
- df 查看目前挂载的设备
- dumpe2fs /dev/hdc2
稍后问萱萱
8.1.4 与目录树的关系
-
目录
当我们mkdir时,ext2会分配一个inode和至少一块block给该目录
inode记录目录相关权限和属性,并可记录分配到的那块block号码
block记录该目录下的文件名与该文件名占用的inode号码数据。- 使用 ls -i 查看目录文件所占用的inode号码
- 查看 /bin /boot /proc /lost+found /sbin 这五个目录的ls -l
ll -d / /bin /boot /proc /lost+found /sbin
Review 目录树 p#156 (proc为什么不占用硬盘容量)
文件
当我们在 ext2 下新建一个文件时, ext2会分配一个indoe和相对于该文件大小的的block数量给该文件。超过12个block,会多一个block作为块号码的记录-
目录树读取
文件名实际上是存在目录文件的block里,所以文件名的新增、删除、重命名都是需要 读取 目录文件的inode和block,才能找到文件名占用的inode,再找到文件的block。- 目录树读取的过程
1 通过挂载点信息找到/dev/hdc2 的inode 号码为2的根目录 inode ,且inode 具有的权限让我们可以读取该block的内容
2 取得的block号码, 并找到etc/下的inode内容
3 读取inode号码得知vbird具有r和x的权限 ,因此可以读取etc/的block内容
4 取得的block号码,找到block内容中的passwd文件的inode号码
5 读取inode号码得知vbird具有r的权限,因此可以读取passwd的block内容
- 目录树读取的过程
文件大小的磁盘读取性能
分区的规划不是越大越好,大的文件系统存在文件数据离散的问题,造成数据读取性能低。
8.1.5 Ext2/Ext3 文件的访问与日志文件系统的功能
新增文件时,系统的行为?
1 用户在该目录下,是否有w 和x 的权限?有,继续。
2 根据inode bitmap找到没有使用的inode号码,并将新文件的权限和属性写入
3 根据 block bitmap 找到没有使用的block 号码,并将实际数据写入block,且更新 inode 的block指向数据
4 将刚才写入的inode 与block 数据同步更新inode bitmap 与block bitmap,并更新superblock的内容-
数据的不一致状态 (Inconsistent)
- 数据存放区域 -> inode 和 data block
- metadata (中间数据) -> super block , inode bitmap, block bitmap:因为这数据都是经常变动的,每次添加、删除、编辑都可能会影响到这三个部分的数据。
1 文件在写入文件系统时,系统中断,inode table 和 data block 被写入,但metadata还未更新,metadata和数据存放区不一致
2 Ext2 会在系统重新启动时,强制比对metadata 和数据存放区,数量多,时间慢,系统繁忙
-
出现日志文件系统 (Journaling file system)
专门在文件系统中规划出一个块,该块专门记录写入或修订文件时的步骤:
1 预备:当系统写入文件时,会先在Journal 块中记录某个文件准备要写入的信息
2 实际写入: 写入文件的权限与数据; 开始更新meta data
3 结束:完成数据与meta data 的更新后,在journal块当中完成该文件的记录- 只要检查journal块就可以知道是哪些文件出现了inconsistent的状态,针对文件修复
- dumpe2fs 中的 superblock 有Journal inode/backup/size 的信息
- 为什么 从Ext2 转换到Ext3 ?可利用性 数据完整性 速度 和 易于转换(不用格式化)
8.1.6 Linux 文件系统的操作
Review #p
所有数据都得加载到内存后cpu才能够对数据进行处理。当编辑很大的文件时,频繁的要系统写入磁盘中,由于磁盘写入速度要比内存慢很多,耗在等待硬盘的写入和读取中,没效率。
- Asynchronously 异步处理
1 当系统加载一个文件到内存后,若没被改动,则内存区段的文件数据会被设置为clean
2 如若被改动,内存中数据会被改成dirty
3 改动被保存在内存里,未被保存到磁盘中
4 系统会不定时将 dirty 的数据写回磁盘,保持磁盘和内存数据的一致性。(sync命令强制同步) - 内存 与 文件系统的关系
1 系统将常用文件放置在主储存器的缓冲区,以提高文件系统的读写速度
2 Linux的物理内存会被用光,正常。可加速系统性能
3 sync 手动同步
4 正常关机,关机命令会调用sync同步
5 非正常关机会导致长时间的磁盘校验,甚至导致文件系统损毁
8.1.7 挂载点(mount point)的意义
文件系统链接到某个目录 -> 挂载
一定是目录,该目录为挂载点
?#p208 难道不是挂载到root下?
8.1.8 其他Linux支持的文件系统与VFS
传统文件系统
日志文件系统
网络文件系统:NFS SMBFS
- 查看Linux支持的文件系统
ls -l /lib/modules/$ (uname -r)/kernel/fs - 查看系统目前已经加载的内存支持的文件系统
cat /proc/filesystems - VFS Virtual Filesystem System
Linux 通过VFS的内核功能读取文件系统
(文件系统略)
8.2 文件系统的简单操作
8.2.1 磁盘与目录的容量
-
df [-hiTa] display free disk space列出文件系统的整体磁盘使用量
-h human readable
-i 不用硬盘容量,用inode数量显示
-T 列出该分区的文件系统名称Output
Filesystem 代表文件系统是在哪个分区
1K-block 说明下面单位为1kb
Used 使用掉的硬盘空间
Available剩下
Use% 使用率
mountedon 挂载点df 针对整个文件系统 ,需特别关注 根目录 的剩余容量
特殊的 /proc 和 /dev/shm(虚拟的,下次开机就没了)
du display disk usage statistics
不使用任何参数时,会列出当前目录下的目录文件容量
-a 列出目录和文件的容量
-s 只列出总量 -S 去除子目录
使用通配符 查看 每个目录所占用容量
du -sm /*
8.2.2 连接文件 ln
softlink 快捷方式
hardlink 通过文件系统的inode连接产生新文件名,而非新文件
- Hard Link
ls -al link字段下的数字,实际是多少文件link到了这个inode号码
为什么?
安全。
1 任意的文件名被删除,文件内容仍然实际存在。
2 任意的文件名进入编辑,文件内容都可以被修改。
3 就是多在block里写入一个关联信息而已
缺点
1 不能跨文件系统 2 不能连接到目录 ?#p214
- symbolic link
创建一个独立的文件(新的inode号码,新的block),让这个文件数据读取指向它连接的文件名。
当源文件被删除后,slink文件无法打开,实际就是找不到连接的文件名。
ln link 源文件 目标文件
-s 创建symbolic link
-f 如果目标文件存在,则先将其删除再创建Tips
ln -s /bin /root/bin
此时/root/bin(为符号连接文件) 下内容进入/bin下内容,如果被删除了,block中就没有这份数据了(软连接文件)
挽救:赶紧删除/root/bin 这个符号链接文件
原本hardlink,/root/bin下删除,与/bin下内容无关。关于目录的链接数量
新目录底下存在 . 和 .. 目录
该目录本身 链接数量为2 (自身+.)
上级目录 链接数量+1 (原有 + ..)
8.3 磁盘的分区、格式化、检验与挂载
加磁盘怎么做?
1 对磁盘分区
2 对分区format创建可用文件系统
3 对文件系统检验
4 Linux,需要创建挂载点,并挂载。
8.3.1 磁盘分区
fdisk DOS partition maintenance program
按m显示所有操作 离开q所有操作不会生效
w操作生效 p 输出目前磁盘状态
Device 设备文件名
Boot 是否为开机引导模块
Start End 哪个柱面号码之间 决定分区的大小
Blocks 以1k为单位的容量
ID system 提示文件系统
最后dev的End柱面号码为多少 与最大柱面号码5005差距多少 即剩余可分区的大小
Start End 判断拓展分区和逻辑分区
fdisk -l 查阅系统内所有分区
设备文件名不要加上数字 (数字就是分区)删除分区
fdisk /dev/hdc
p
d 选择
w or q新增分区
后略,实操
8.3.2 磁盘格式化
mkfs -t 文件系统格式 /dev/hdc6
mke2fs 指定格式化 创建文件系统
8.3.3 磁盘检验 fsck badblocks
- fsck filesystem consistency check and interactive repair
8.3.4 磁盘挂载与卸载
单一文件系统不应该被重复挂载在不同的挂载点
单一目录不应该重复挂载多个文件系统
作为挂载点的目录应该是空目录
挂载:
mount 刚才创建的文件系统/dev/hdc6 目录/mnt/hdc6
Linux有驱动程序和分析superblock可以自动识别出挂载的文件系统类型
依靠 两个文件
/etc/filesystems
/proc/filesystems
驱动程序目录
/lib/modules/$ (uname -r )/kernel/fs/
查看 mount -l
光驱一旦挂载之后就无法退出光盘
- 格式化(mksf)与挂载软盘
略 - 挂载U盘
- 重新挂载
mount -o remount,rw,auto/ - 挂载不特定目录
mount --bind /hom /mnt/home - 将设备文件卸载
umount - 使用Label name 进行挂载的方法
查看Label name (dumpe2fs -h /dev/hdc6)
挂载(mount -L “vibird_logical” /mnt/hdc6)
8.3.5 磁盘参数修改
mknod(略)
修改Lable name (e2label)
tune2fs & hdparm 命令(略)
8.4 设置开机挂载
8.4.1 开机挂载文件/etc/fstab 及/etc/mtab
系统挂载的一些限制
1 根目录是必须挂载的,而且一定要先于其他mount point被挂载出来
2 其他挂载点必须为已新建的目录,可任意指定,但一定要遵守必需的系统目录架构原则。
3 所有挂载点在同一时间之内,只能挂载一次
4 所有分区在同一时间之内,只能被挂载一次
5 若进行卸载,你必须将工作目录移到挂载点外(以及子目录)之外Lable 或设备文件名
mount point
磁盘分区的文件系统
-
文件系统的参数
能否被 dump 备份命令作用
dump 是一个用来做为备份的命令, 我们可以透过 fstab 指定哪个文件系统必须要进行 dump 备份! 0 代表不要做 dump 备份, 1 代表要每天进行 dump 的动作。 2 也代表其他不定日期的 dump 备份动作, 通常这个数值不是 0 就是 1 啦!是否以 fsck 检验扇区:
启动的过程中,系统默认会以fsck检验我们的 filesystem 是否完整 (clean)。 不过,某些 filesystem 是不需要检验的,例如内存置换空间 (swap) ,或者是特殊文件系统例如 /proc 与 /sys 等等。所以,在这个字段中,我们可以配置是否要以 fsck 检验该 filesystem 喔。 0 是不要检验, 1 表示最早检验(一般只有根目录会配置为 1), 2 也是要检验,不过 1 会比较早被检验啦! 一般来说,根目录配置为 1 ,其他的要检验的 filesystem 都配置为 2 就好了。