磁盘分区表
磁盘分区表主要有两种格式,一种是限制较多的 MBR 分区表,一种是较新且限制较少的 GPT 分区表。
- MBR 分区表中,第一个扇区最重要,里面有:(1)主要开机区(Master boot record, MBR)及分区表(partition table), 其中 MBR 占有 446 bytes,而 partition table 则占有 64 bytes。
- GPT 分区表除了分区数量扩充较多之外,支持的磁盘容量也可以超过 2TB。
MBR与GPT的区别:
内存支持:MBR最多支持2T,GPT理论上无限制。
分区:MBR最多支持四个主分区,GPT无限制
文件系统通常会将这两部份的数据分别存放在不同的区块,权限与属性放置到inode 中,至于实际数据则放置到 data block 区块中,另外,还有一个超级区块 (superblock) 会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等。
superblock,inode,block:
- superblock:记录此 filesystem 的整体信息,包括 inode/block 的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block 号码;
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
Ext2 文件系统的 block 限制:
- 原则上,block 的大小与数量在格式化完就不能够再改变了(除非重新格式化);
- 每个 block 内最多只能够放置一个文件的数据;
- 承上,如果文件大于 block 的大小,则一个文件会占用多个 block 数量;
- 承上,若文件小于 block ,则该 block 的剩余容量就不能够再被使用了(磁盘空间会浪费)。
inode记录的文件数据
- 该文件的存取模式(read/write/excute);
- 该文件的拥有者与群组(owner/group);
- 该文件的容量;
- 该文件建立或状态改变的时间(ctime);
- 最近一次的读取时间(atime);
- 最近修改的时间(mtime);
- 定义文件特性的旗标(flag),如 SetUID…;
- 该文件真正内容的指向 (pointer);
inode 的数量与大小也是在格式化时就已经固定了。
inode 特色
- 每个 inode 大小均固定为 128 bytes (新的 ext4 与 xfs 可设定到 256 bytes);
- 每个文件都仅会占用一个 inode 而已;
- 承上,因此文件系统能够建立的文件数量与 inode 的数量有关;
- 系统读取文件时需要先找到 inode,并分析 inode 所记录的权限与用户是否符合,若符合才能够开始实际读取 block 的内容。
以为每个文件只有一个inode,且inode的大小只有128bytes,当文件很大时inode采取了12 个直接,一个间接,一个双间接与一个三间接记录区。
inode 本身 (128 bytes),里面有 12 个直接指向 block 号码的对照,这 12 笔记录就能够直接取得 block 号码所谓的间接就是再拿一个 block 来当作记录 block 号码的记录区,如果文件太大时, 就会使用间接的 block 来记录编号。当中间接只是拿一个 block来记录额外的号码而已。 同理,如果文件持续长大,那么就会利用所谓的双间接,第一个 block 仅再指出下一个记录编号的 block 在哪里, 实际记录的在第二个 block 当中。依此类推,三间接就是利用第三层 block 来记录编号。
以1kblock为例,计算最大文件
- 12 个直接指向: 12*1K=12K
- 间接: 256*1K=256K 每笔 block 号码的记录会花去 4bytes,因此 1K 的大小能够记录 256 笔记录,因此一个间接可以记录的
- 双间接: 2562561K=256 2 K第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个号码;
- 三间接: 256256256*1K=256 3 K第一层 block 会指定 256 个第二层,每个第二层可以指定 256 个第三层,每个第三层可以指定 256 个号码,因此总额大小如上;
总额:将直接、间接、双间接、三间接加总,得到 12 + 256 + 256256 + 256256*256 (K) = 16GB。
这个方法不能用在 2K 及 4K block 大小的计算中, 因
为大于 2K 的 block 将会受到 Ext2 文件系统本身的限制,所以计算的结果会不太符合
Ext4 文件系统的 inode 容量已经可以扩大到 256bytes 了,更大的 inode 容量,可以纪录更多的文件系统信息,包括新的 ACL 以及 SELinux 类型等, 当然,可以纪录的单一文件容量达 16TB 且单一文件系统总容量可达1EB。
Superblock (超级区块)
Superblock 是记录整个 filesystem 相关信息的地方, 没有 Superblock ,就没有这个 filesystem 了。他记录的信息主要有:
- block 与 inode 的总量;
- 未使用与已使用的 inode / block 数量;
- block 与 inode 的大小 (block 为 1, 2, 4K,inode 为 128bytes 256bytes);
- filesystem 的挂载时间、最近一次写入数据的时间、最近一次检验磁盘(fsck) 的时间等文件系统的相关信息;
- 一个 valid bit 数值,若此文件系统已被挂载,则 valid bit 为 0 ,若未被挂载,则 valid bit 为 1 。
superblock 的大小为 1024bytes,每个 block group 都可能含有superblock,一个文件系统应该仅有一个superblock 而已事实上除了第一个 block group 内会含有 superblock 之外,后续的 block group 不一定含有 superblock , 而若含有 superblock 则该 superblock 主要是做为第一个 block group 内 superblock 的备份,这样可以进行 superblock 的救援
1 | ls -i 显示文件的所占用的inode号码 |
EXT2/EXT3/EXT4 文件的存取与日志式文件系统的功能
- 先确定用户对于欲新增文件的目录是否具有 w 与 x 的权限,若有的话才能新增;
- 根据 inode bitmap 找到没有使用的 inode 号码,并将新文件的权限/属性写入;
- 根据 block bitmap 找到没有使用中的 block 号码,并将实际的数据写入 block 中,且更新 inode 的 block指向数据;
- 将刚刚写入的 inode 与 block 数据同步更新 inode bitmap 与 block bitmap,并更新 superblock 的内容。
日志式文件系统 (Journaling filesystem)
为了避免文件系统不一致的情况发生,filesystem 当中规划出一个区块,该区块专门在记录写入或修订文件时的步骤。
- 预备:当系统要写入一个文件时,会先在日志记录区块中纪录某个文件准备要写入的信息;
- 实际写入:开始写入文件的权限与数据;开始更新 metadata 的数据;
- 结束:完成数据与 metadata 的更新后,在日志记录区块当中完成该文件的纪录。
linux支持的文件系统
- 传统文件系统:ext2 / minix / MS-DOS / FAT (用 vfat 模块) / iso9660 (光盘)等等;
- 日志式文件系统: ext3 /ext4 / ReiserFS / Windows’ NTFS / IBM’s JFS / SGI’s XFS / ZFS
- 网络文件系统: NFS / SMBFS
1 | ls -l /lib/modules/$(uname -r)/kernel/fs |
系统目前已加载到内存中支持的文件系统则有:
1 | cat /proc/filesystems |
文件系统的命令操作
df:列出文件系统的整体磁盘使用量
du:评估文件系统的磁盘使用量(常用在推估目录所占容量)
1 | df [-ahikHTm] [目录或文件名] |
1 | du [-ahskm] 文件或目录名称 |
链接:
符号链接只想文件名,源文件名被删无法使用,实体链接只想inode,与其他文件无关
磁盘分区,格式化,校验及挂载
lsblk 列出系统上的所有磁盘列表
1 | lsblk [-dfimpt] [device] |
blkid 列出装置的 UUID 等参数
1 | 每一行代表一个文件系统,主要列出装置名称、 UUID 名称以及文件系统的类型 (TYPE) |
parted 列出磁盘的分区表类型与分区信息
1 | 列出 /dev/vda 磁盘的相关数据 |
磁盘分区: gdisk/fdisk
MBR 分区表请使用 fdisk 分区, GPT 分区表请使用 gdisk 分区
lsblk 或 blkid 先找到磁盘,再用 parted /dev/xxx print 来找出内部的分区表类型,之后才用 gdisk 或 fdisk 来操作系统。 上表中可以发现 gdisk 会扫描 MBR 与 GPT 分区表,不过这个软件还是单纯使用在 GPT 分区表比较好
partprobe 更新 Linux 核心的分区表信息
mkfs磁盘格式化
XFS 文件系统 mkfs.xfs
1 | [root@study ~]# mkfs.xfs [-b bsize] [-d parms] [-i parms] [-l parms] [-L label] [-f] \ |
1 | 找出你系统的 CPU 数,并据以设定你的 agcount 数值 |
EXT4 文件系统 mkfs.ext4
1 | [root@study ~]# mkfs.ext4 [-b size] [-L label] 装置名称 |
其他文件系统 mkfs
1 | root@study ~]# mkfs[tab][tab] //按两下tab键 |
文件系统检验
xfs_repair 处理 XFS 文件系统
当有 xfs 文件系统错乱才需要使用这个指令
1 | xfs_repair [-fnd] 装置名称 |
fsck.ext4 处理 EXT4 文件系统
1 | fsck.ext4 [-pf] [-b superblock] 装置名称 |
文件系统挂载与卸除
- 单一文件系统不应该被重复挂载在不同的挂载点(目录)中;
- 单一目录不应该重复挂载多个文件系统;
- 要作为挂载点的目录,理论上应该都是空目录才是。
如果你要用来挂载的目录里面并不是空的,那么挂载了文件系统之后,原目录下的东西就会暂时的消失。 举个例子来说,假设你的 /home 原本与根目录 (/) 在同一个文件系统中,底下原本就有 /home/test 与 /home/vbird 两个目录。然后你想要加入新的磁盘,并且直接挂载 /home底下,那么当你挂载上新的分区槽时,则 /home 目录显示的是新分区槽内的资料,至于原先的 test 与vbird 这两个目录就会暂时的被隐藏掉了!注意喔!并不是被覆盖掉, 而是暂时的隐藏了起来,等到新分区槽被卸除之后,则 /home 原本的内容就会再次的跑出来啦!
1 | [root@study ~]# mount -a |
Linux 支持的文件系统之驱动程序都写在如下的目录中:
1 | /lib/modules/$(uname -r)/kernel/fs/ |
umount (将装置文件卸除)
1 | umount [-fn] 装置文件名或挂载点 |
磁盘/文件系统参数修订
1 | xfs_admin 修改 XFS 文件系统的 UUID 与 Label name |
tune2fs 修改 ext4 的 label name 与 UUID
1 | tune2fs [-l] [-L Label] [-U uuid] 装置文件名 |
开机挂载 /etc/fstab 及 /etc/mtab
挂载的一些限制:
- 根目录 / 是必须挂载的,而且一定要先于其它 mount point 被挂载进来。
- 其它 mount point 必须为已建立的目录,可任意指定,但一定要遵守必须的系统目录架构原则 (FHS)
- 所有 mount point 在同一时间之内,只能挂载一次。
- 所有 partition 在同一时间之内,只能挂载一次。
- 如若进行卸除,您必须先将工作目录移到 mount point(及其子目录) 之外。
