1) 每种操作系统所设定的文件属性/权限并不相同, 为了存放这些档案所需的数据,因此就需要将分割槽进行格式化,以成为操作系统能够利用的『文件系统格式(filesystem)』。
2) Linux的正统文件系统则为Ext2 (Linux second extended file system, ext2fs)。
3) 每个 inode 与 block 都有编号,意义如下:
a) superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
b) inode:记录档案的属性,一个档案占用一个inode,同时记录此档案的数据所在的 block 号码;
c) block:实际记录档案的内容,若档案太大时,会占用多个block 。
d) 这种数据存取的方法我们称为索引式文件系统(indexed allocation)。
e)
4) EXT2文件系统
a) 文件系统一开始就将inode和block规划好了,不会变动,除非重新格式化。
b) 因此 Ext2 文件系统在格式化的时候基本上是区分为多个区块群组(block group)的,每个区块群组都有独立的 inode/block/superblock 系统。
c)
d) 文件系统最前面有一个启动扇区(boot sector),可以安装开机管理程序,如此一来,可以将不同的开机管理程序安装到个别的文件系统最前端,而不用覆盖整颗硬盘的MBR,来实现多重引导。
5) datablock (资料区块)
用来存放档案内容,etx2支持的block大小有1K,2K,4K三种。格式化时block大小已经确定,并且编号。
基本限制如下:
a) 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
b) 每个 block 内最多只能够放置一个档案的数据;
c) 档案大于block 的大小,则一个档案占用多个 block 数量;
d) 若档案小于block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
6) inodetable (inode 表格)
记录档案的属性以及内容存放于哪一个block。
记录的档案数据至少如下:
a) 该档案的存取模式(read/write/excute);
b) 该档案的所有者与群组(owner/group);
c) 该档案的容量;
d) 该档案建立或状忞改变的时间(ctime);
e) 最近一次的读取时间(atime);
f) 最近修改的时间(mtime);
g) 定义档案特性的旗标(flag),如 SetUID...;
h) 该档案真正内容的指向 (pointer);
inode的特征:
a) 每个 inode 大小均固定为 128 bytes;
b) 每个档案都仅会占用一个 inode 而已;
c) 承上,因此文件系统能够建立的档案数量与 inode 的数量有关;
d) 系统读取档案时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
node记录block号码的区域定义为12个直接,一个间接, 一个双间接与一个三间接记录区。
7) Superblock(超级区块)
Superblock 记录整个 filesystem 相关信息,如下:
a) block与 inode 的总量;
b) 未使用与已使用的 inode / block 数量;
c) block与inode大小(block为 1, 2, 4K,inode为 128 bytes);
d) filesystem的挂载时间、最近一次写入数据的时间、最近一次检验磁盘 (fsck) 的时间等文件系统的相关信息;
e) 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。
8) 与目录树关系
a) 在ext2文件系统中创建一个目录时,ext2会分配一个inode和至少一个block块给该目录。其中inode记录该目录的相关权限和属性,以及block号,而block则是记录该目录下的文件名和该文件名对应的inode号。
b) 在ext2文件系统中创建一个档案时,ext2会分配一个inode与相对于该档案大小的block的数量给该档案。
c) 目录树读取:读取档案→经过目录的inode和block→权限检测→从block中读出档案的inode号→……→读取该档案。
d)
e) #df #查询目录树与装置的对应关系及相关信息
9) ext2中新增档案
新增档案或目录需要block bitmap和inode bitmap。
a) 先确定用户对新增的档案的目录是否具有w和x权限,若有的话才能新增。
b) 根据inode bitmap找到没有使用的inode号,并将档案的权限和属性写入。
c) 根据block bitmap找到没有使用的block号,并将实际的数据写入block中,且更新inode的block指向数据。
d) 将刚刚写入的inode和block数据同步到inodebitmap和block bitmap中,并更新superblock的内容。
inode table和data block称为数据存放区域,superblock、inode bitmap、block bitmap称为中介数据,因为每次增删改都会影响这三部分的数据。
10) 日志式文件系统 (Journaling filesystem)
从ext2升级到ext3之后,可以获得一个强有力的日志式文件系统,意味着从系统中止到快速重新复原而不是持续的等e2fsck执行长时间的修复。
11) Linux文件系统的运作
当系统加载一个档案到内存之后,如果这个档案没有被变动过,则在内存区段的档案数据会被设定为干净的(clean)。但如果有变动(例如用vi编辑过)此时该内存中的数据会被设定为脏的(dirty),此时所有的动作还在内存中进行,并没有写入磁盘中,系统会不定时的将内存中设定为dirty的数据写回磁盘,以保持磁盘与内存数据的一致性。
每个 filesystem 都有独立的 inode / block / superblock 等信息,这个文件系统要能够链接到目录树才能被我们使用。 将文件系统与目录树结合的动作我们称为『挂载』。
挂载点一定是目录,该目录为进入该文件系统的入口。
3个挂在点/ /boot /home,分别对应3个装置文件名/dev/sda2,/dev/sda1,/dev/sda3, 由于 filesystem 最顶层的目录inode 一般为 2 号,因此可以发现/, /boot, /home 为三个不同的 filesystem。
Linux系统由VFS(Virtual Filesystem Switch)来管理filesystem。
12) 文件系统简单操作
a) #df 列出整个文件系统的磁盘使用情况
b) #du 评估文件系统的磁盘使用量(常用来评估目录)
c) Linux下的连接挡有两种,一种是类似windows的快捷方式功能的档案,可以让你快速的链接到目标档案或目录。另一种是透过文件系统的inode连接来产生新档名,而不是新档案,这种称为实体链接(hard link)。
d) #ln源文件 目标文件
两个文件的所有信息都一样,inode都是1912701,第二个字段由1变为了2,说明有2个档案名链接到了这个inode。
不论使用哪个【档案】来编辑,最终的结果都会写入相同的inode与block中,因此均能进行数据的修改。
使用 hard link 设定链接文件时,磁盘的空间与 inode 的数目都不会改变!
e) hardlink不能跨filesystem,也不能link目录。
f) SymbolicLink (符号链接,亦即是快捷方式)
由上图我们发现,两个档案指向不同的inode号码,当然就是两个独立的档案存在了,而且链接挡的重要内容就是写上目标档的【文件名】。
由 Symboliclink 所建立的档案为一个独立的新档案,所以会占用掉 inode 与block 的空间。
g) 创建链接档
#ln [-sf] 源文件 目标文件
h) 目录link数量
当我们建立新的目录时,新的目录link为2,而上层目录的link树则会增加1。
13) 磁盘分区:fdisk
#fdisk [-l] 装置名称(注意不要有数字)
建立分割槽会有如下几种情况:
a) 1-4号尚有剩余,且系统未有extended: 此时会出现让你选择 Primary / Extended 的项目,且你可以指定 1~4 号间的号码;
b) 1-4号尚有剩余,且系统有extended: 此时会出现让你选择 Primary / Logical 的项目;若选择 p 则你还需要指定 1~4 号间的号码; 若选择 l(L的小写) 则不需要设定号码,因为系统会自动指定逻辑分割槽的文件名号码;
c) 1-4没有剩余,且系统有extended: 此时不会让你选择分割槽类型,直接会进入 logical 的分割槽形式。
磁盘格式化: #mkfs [–t 系统文件格式] 装置名
磁盘检查:#fsck 装置名称
磁盘挂载前,先确定如下几点:
a) 单一的文件系统不应该被重复的挂载在不同的挂载点(目录)中;
b) 单一目录不应该重复挂载多个文件系统;
c) 要作为挂载点的目录,理论上应该是空目录;
#mount 装置文件名挂载点
#mount –l 查看[已挂载]的文件系统
#mount –o remount,rw,auto / 重新挂载根目录
#umount [-fn] 装置文件名或挂载点 卸除装置档案
#dumpe2fs –h /dev/sda2 查询文件系统标头(label)
开机即挂载文件系统,要修改/etc/fstab,但是有如下限制:
a) 根目录/是必项挂载的﹐而且要先于其它mount point 被挂载。
b) 其它 mount point 必项为已建立的目录﹐可任意指定﹐但一定要遵守必须的系统目录架构原则
c) 所有 mount point 在同一时间只内﹐只能挂载一次。
d) 所有 partition 在同一时间之内﹐只能挂载一次。
e) 若卸除﹐必项先将工作目录移到mount point(及其子目录)之外。
f) 设定完毕后,务必用mount –a 测试语法正确与否。
建立大档案以制作 loop 装置档案,然后将此档案挂载,可以在无法再建立实体分割槽时使用。
fdisk无法支持2TB以上的分割槽,需要parted来处理。
#parted [装置] [指令[参数]]
14) 总结
a) 需要碎片整理的原因就是档案写入的 block 太过于离散了,此时档案读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个档案所属的 blocks 汇整在一起。
b) 磁盘的使用必须要进过:分割、格式化、挂载,惯用的指令为:fdisk,mkfs,mount
c) 删除分割槽时需要注意以下4点
d) 1.用[df]查看分割槽是否被挂载,若被挂载,需先卸载[umount]
e) 2.如果是swap分割槽,需要先以[swapon -s]找出被使用的分割槽,然后用[swapoff]关掉,然后再删除分割槽。
f) 3.[fdisk]存在[-l]参数时只有展示功能,无法增删改分割槽。
g) 4.由于逻辑分割槽是从5开始连续编号的,故删除的时候应该从最大编号的分割槽开始删除。
------以上整理总结自鸟哥的Linux私房菜