文件系统实在是非常有趣的东西,鸟哥学了好几年还是很多东西不很懂呢! 在学习的过程中很多朋友在讨论区都有提供一些想法!这些想法将他归纳起来有底下几点可以参考的数据呢!
1、boot sector 与 superblock 的关系
在过去非常多的文章都写到启动管理程序是安装到 superblock 内的,但是我们由官方的 How to 文件知道,图解(图 1.3.1)的结果是将可安装启动信息的 boot sector (启动扇区) 独立出来,并非放置到 superblock 当中的! 那么也就是说过去的文章写错了?这其实还是可以讨论讨论的!
经过一些搜寻,鸟哥找到几篇文章(非官方文件)的说明,大多是网友分析的结果啦!如下所示:(注10)
这几篇文章有几个重点,归纳一下如下:
- superblock 的大小为 1024 bytes;
- superblock 前面需要保留 1024 bytes 下来,以让启动管理程序可以安装。
分析上述两点我们知道 boot sector 应该会占有 1024 bytes 的大小吧!但是整个文件系统主要是依据 block 大小来决定的啊! 因此要讨论 boot sector 与 superblock 的关系时,不得不将 block 的大小拿出来讨论讨论喔!
(1)block 为 1024 bytes (1K) 时:
如果 block 大小刚好是 1024 的话,那么 boot sector 与 superblock 各会占用掉一个 block , 所以整个文件系统图示就会如同图 1.3.1 所显示的那样,boot sector 是独立于 superblock 外面的! 由于鸟哥在基础篇安装的环境中有个 /boot 的独立文件系统在 /dev/hdc1 中,使用 dumpe2fs 观察的结果有点像底下这样(如果你是按照鸟哥的教学安装你的 CentOS 时,可以发现相同的情况喔!):
[AppleScript] ı鿴 ƴ [root@www ~]# dumpe2fs /dev/hdc1
dumpe2fs 1.39 (29-May-2006)
Filesystem volume name: /boot
....(中间省略)....
First block: 1
Block size: 1024
....(中间省略)....
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-2
Reserved GDT blocks at 3-258
Block bitmap at 259 (+258), Inode bitmap at 260 (+259)
Inode table at 261-511 (+260)
511 free blocks, 1991 free inodes, 2 directories
Free blocks: 5619-6129
Free inodes: 18-2008
# 看到最后一个特殊字体的地方吗? Group0 的 superblock 是由 1 号 block 开始喔!
由上表我们可以确实的发现 0 号 block 是保留下来的,那就是留给 boot sector 用的啰! 所以整个分割槽的文件系统分区有点像底下这样的图示:
图 6.1.1、1K block 的 boot sector 示意图
(2)block 大于 1024 bytes (2K, 4K) 时:
如果 block 大于 1024 的话,那么 superblock 将会在 0 号!我们撷取本章一开始介绍 dumpe2fs 时的内容来说明一下好了!
[AppleScript] ı鿴 ƴ [root@www ~]# dumpe2fs /dev/hdc2
dumpe2fs 1.39 (29-May-2006)
....(中间省略)....
Filesystem volume name: /1
....(中间省略)....
Block size: 4096
....(中间省略)....
Group 0: (Blocks 0-32767)
Primary superblock at 0, Group descriptors at 1-1
Reserved GDT blocks at 2-626
Block bitmap at 627 (+627), Inode bitmap at 628 (+628)
Inode table at 629-1641 (+629)
0 free blocks, 32405 free inodes, 2 directories
Free blocks:
Free inodes: 12-32416
我们可以发现 superblock 就在第一个 block (第 0 号) 上头!但是 superblock 其实就只有 1024bytes 嘛! 为了怕浪费更多空间,因此第一个 block 内就含有 boot sector 与 superblock 两者 !举上头的表格来说,因为每个 block 占有 4K ,因此在第一个 block 内 superblock 仅占有 1024-2047 ( 由 0 号起算的话)之间的咚咚,至于 2048bytes 以后的空间就真的是保留啦!而 0-1023 就保留给 boot sector 来使用。
图 6.1.2、4K block 的 boot sector 示意图
因为上述的情况,如果在比较大的 block 尺寸(size)中,我们可能可以说你能够将启动管理程序安装到 superblock 所在的 block 号码中!就是上表的 0 号啰!但事实上还是安装到 boot sector 的保留区域中啦!所以说, 以前的文章说启动管理程序可以安装到 superblock 内也不能算全错~但比较正确的说法,应该是安装到该 filesystem 最前面的 1024 bytes 内的区域,就是 boot sector 这样比较好!
2、磁盘空间之浪费问题
我们在前面的 block 介绍中谈到了一个 block 只能放置一个文件, 因此太多小文件将会浪费非常多的磁盘容量。但你有没有注意到,整个文件系统中包括 superblock, inode table 与其他中介数据等其实都会浪费磁盘容量喔!所以当我们在 /dev/hdc6 创建起 ext3 文件系统时, 一挂载就立刻有很多容量被用掉了!
另外,不知道你有没有发现到,当你使用 ls -l 去查询某个目录下的数据时,第一行都会出现一个『total』的字样! 那是啥东西?其实那就是该目录下的所有数据所耗用的实际 block 数量 * block 大小的值。 我们可以透过 ll -s 来观察看看上述的意义:
[AppleScript] ı鿴 ƴ [root@www ~]# ll -s
total 104
8 -rw------- 1 root root 1474 Sep 4 18:27 anaconda-ks.cfg
8 -rw-r--r-- 2 root root 255 Jan 6 2007 crontab
4 lrwxrwxrwx 1 root root 12 Oct 22 13:58 crontab2 -> /etc/crontab
48 -rw-r--r-- 1 root root 42304 Sep 4 18:26 install.log
12 -rw-r--r-- 1 root root 5661 Sep 4 18:25 install.log.syslog
4 -rw-r--r-- 1 root root 0 Sep 27 00:25 test1
8 drwxr-xr-x 2 root root 4096 Sep 27 00:25 test2
4 -rw-rw-r-- 1 root root 0 Sep 27 00:36 test3
8 drwxrwxr-x 2 root root 4096 Sep 27 00:36 test4
从上面的特殊字体部分,那就是每个文件所使用掉 block 的容量!举例来说,那个 crontab 虽然仅有 255bytes , 不过他却占用了两个 block (每个 block 为 4K),将所有的 block 加总就得到 104Kbytes 那个数值了。 如果计算每个文件实际容量的加总结果,其实只有 56.5K 而已~所以啰,这样就耗费掉好多容量了!
如果想要查询某个目录所耗用的所有容量时,那就使用 du 吧!不过 du 如果加上 -s 这个选项时, 还可以依据不同的规范去找出文件系统所消耗的容量喔!举例来说,我们就来看看 /etc/ 这个目录的容量状态吧!
[AppleScript] ı鿴 ƴ [root@www ~]# du -sb /etc
108360494 /etc <==单位是 bytes 喔!
[root@www ~]# du -sm /etc
118 /etc <==单位是 Mbytes 喔!
使用 bytes 去分析时,发现到实际的数据占用约 103.3Mbytes,但是使用 block 去测试,就发现其实耗用了 118Mbytes, 此时文件系统就耗费了约 15Mbytes 啰!这样看的懂我们在讲的数据了吧?
3、利用 GNU 的 parted 进行分割行为
虽然你可以使用 fdisk 很快速的将你的分割槽切割妥当,不过 fdisk 却无法支持到高于 2TB 以上的分割槽! 此时就得需要 parted 来处理了。不要觉得 2TB 你用不着! 2009 年的现在已经有单颗硬盘高达 2TB 的容量了! 如果再搭配主机系统有内建磁盘阵列装置,要使用数个 TB 的单一磁盘装置也不是不可能的! 所以,还是得要学一下这个重要的工具! parted !
parted 可以直接在一行命令列就完成分割,是一个非常好用的命令!他的语法有点像这样:
[AppleScript] ı鿴 ƴ [root@www ~]# parted [装置] [命令 [参数]]
选项与参数:
命令功能:
新增分割:mkpart [primary|logical|extended] [ext3|vfat] 开始 结束
分割表 :print
删除分割:rm [partition]
范例一:以 parted 列出目前本机的分割表数据
[root@www ~]# parted /dev/hdc print
Model: IC35L040AVER07-0 (ide) <==硬盘接口与型号
Disk /dev/hdc: 41.2GB <==磁盘文件名与容量
Sector size (logical/physical): 512B/512B <==每个扇区的大小
Partition Table: msdos <==分割表形式
Number Start End Size Type File system Flags
1 32.3kB 107MB 107MB primary ext3 boot
2 107MB 10.6GB 10.5GB primary ext3
3 10.6GB 15.8GB 5240MB primary ext3
4 15.8GB 41.2GB 25.3GB extended
5 15.8GB 16.9GB 1045MB logical linux-swap
6 16.9GB 18.9GB 2056MB logical ext3
7 18.9GB 19.2GB 263MB logical linux-swap
[ 1 ] [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
上面是最简单的 parted 命令功能简介,你可以使用『 man parted 』,或者是『 parted /dev/hdc help mkpart 』去查询更详细的数据。比较有趣的地方在于分割表的输出。我们将上述的分割表示意拆成六部分来说明:
- Number:这个就是分割槽的号码啦!举例来说,1号代表的是 /dev/hdc1 的意思;
- Start:起始的磁柱位置在这颗磁盘的多少 MB 处?有趣吧!他以容量作为单位喔!
- End:结束的磁柱位置在这颗磁盘的多少 MB 处?
- Size:由上述两者的分析,得到这个分割槽有多少容量;
- Type:就是分割槽的类型,有primary, extended, logical等类型;
- File system:就如同 fdisk 的 System ID 之意。
接下来我们尝试来创建一个全新的分割槽吧!因为我们仅剩下逻辑分割槽可用,所以等一下底下我们选择的会是 logical 的分割类型喔!
[AppleScript] ı鿴 ƴ 范例二:创建一个约为 512MB 容量的逻辑分割槽
[root@www ~]# parted /dev/hdc mkpart logical ext3 19.2GB 19.7GB
# 请参考前一表格的命令介绍,因为我们的 /dev/hdc7 在 19.2GB 位置结束,
# 所以我们当然要由 19.2GB 位置处继续下一个分割,这样懂了吧?
[root@www ~]# parted /dev/hdc print
.....前面省略.....
7 18.9GB 19.2GB 263MB logical linux-swap
8 19.2GB 19.7GB 502MB logical <==就是刚刚创建的啦!
[AppleScript] ı鿴 ƴ 范例三:将刚刚创建的第八号磁盘分区槽删除掉吧!
[root@www ~]# parted /dev/hdc rm 8
# 这样就删除了!实在很厉害!所以这个命令的下达要特别注意!
# 因为...命令一下去就立即生效了~如果写错的话,会哭死~
关于 parted 的介绍我们就到这里啦!除非你有使用到大于 2TB 以上的磁盘, 否则请爱用 fdisk 这个程序来进行分割喔!拜托拜托!
重点回顾
- 基本上 Linux 的正统文件系统为 Ext2 ,该文件系统内的信息主要有:
- superblock:记录此 filesystem 的整体信息,包括inode/block的总量、使用量、剩余量, 以及文件系统的格式与相关信息等;
- inode:记录文件的属性,一个文件占用一个inode,同时记录此文件的数据所在的 block 号码;
- block:实际记录文件的内容,若文件太大时,会占用多个 block 。
- Ext2 文件系统的数据存取为索引式文件系统(indexed allocation)
- 需要碎片整理的原因就是文件写入的 block 太过于离散了,此时文件读取的效能将会变的很差所致。 这个时候可以透过碎片整理将同一个文件所属的 blocks 汇整在一起。
- Ext2文件系统主要有:boot sector, superblock, inode bitmap, block bitmap, inode table, data block 等六大部分。
- data block 是用来放置文件内容数据地方,在 Ext2 文件系统中所支持的 block 大小有 1K, 2K 及 4K 三种而已
- inode 记录文件的属性/权限等数据,其他重要项目为: 每个 inode 大小均固定为 128 bytes; 每个文件都仅会占用一个 inode 而已; 因此文件系统能够创建的文件数量与 inode 的数量有关;
- 文件的 block 在记录文件的实际数据,目录的 block 则在记录该目录底下文件名与其 inode 号码的对照表;
- 日志式文件系统 (journal) 会多出一块记录区,随时记载文件系统的主要活动,可加快系统复原时间;
- Linux 文件系统为添加效能,会让主存储器作为大量的磁盘高速缓存;
- 实体链接只是多了一个文件名对该 inode 号码的链接而已;
- 符号链接就类似Windows的快捷方式功能。
- 磁盘的使用必需要经过:分割、格式化与挂载,分别惯用的命令为:fdisk, mkfs, mount三个命令
- 启动自动挂载可参考/etc/fstab之配置,配置完毕务必使用 mount -a 测试语法正确否;
本章习题
( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )
情境模拟题一:复原本章的各例题练习,本章新增非常多 partition ,请将这些 partition 删除,恢复到原本刚安装好时的状态。
- 目标:了解到删除分割槽需要注意的各项信息;
- 前提:本章的各项范例练习你都必须要做过,才会拥有 /dev/hdc6, /dev/hdc7 出现;
- 需求:熟悉 fdisk, umount, swapoff 等命令。
由于本章处理完毕后,将会有 /dev/hdc6 与 /dev/hdc7 这两个新增的 partition ,所以请删除掉这两个 partition 。 删除的过程需要注意的是:
- 需先以 free / swapon -s / mount 等命令查阅, /dev/hdc6, /dev/hdc7 不可以被使用! 如果有被使用,则你必须要使用 umount 卸除文件系统。如果是内存置换空间,则需使用 swapon -s 找出被使用的分割槽, 再以 swapoff 去卸除他!
- 观察 /etc/fstab ,该文件不能存在这两个 partition;
- 使用『 fdisk /dev/hdc 』删除,注意,由于是逻辑分割槽,这些分割槽一定从 5 号开始连续编号,因此你最好不要从 6 号删除!否则原本的 7 号在你删除 6 号后,将会变成 6 号!因此,你应该由 7 号删除掉,再删除 6 号。
情境模拟题二:由于我的系统原本分割的不够好,我的用户希望能够独立一个 filesystem 附挂在 /srv/myproject 目录下。 那你该如何创建新的 filesystem ,并且让这个 filesystem 每次启动都能够自动的挂载到 /srv/myproject , 且该目录是给 project 这个群组共享的,其他人不可具有任何权限。且该 filesystem 具有 5GB 的容量。
- 目标:理解文件系统的建置、自动挂载文件系统与项目开发必须要的权限;
- 前提:你需要进行过第七章的情境模拟才可以继续本章;
- 需求:本章的所有概念必须要清楚!
那就让我们开始来处理这个流程吧!
- 首先,我们必须要使用 fdisk /dev/hdc 来创建新的 partition ,由于本章之前范例的 partition 已经在上一个练习中删除, 因此你应该会多出一个 /dev/hdc6 才对:『fdisk /dev/hdc』,然后按下『 n 』,按下『Enter』选择默认的启始磁柱, 按下『+5000M』创建 5GB 的磁盘分区槽,可以多按一次『p 』看看是否正确,若无问题则按下『w』写入分割表;
- 避免重新启动,因此使用『 partprobe 』强制核心升级分割表;如果屏幕出现类似:『 end_request: I/O error dev fd0, sector 0 』的错误时,不要担心啊!这个说明的是『找不到软盘』,我们本来就没有软盘, 所以这个错误是可以忽略的。
- 创建完毕后,开始进行格式化的动作如下:『mkfs -t ext3 /dev/hdc6』,这样就 OK 了!
- 开始创建挂载点,利用:『 mkdir /srv/myproject 』来创建即可;
- 编写自动挂载的配置文件:『 nano /etc/fstab 』,这个文件最底下新增一行,内容如下:
- /dev/hdc6 /srv/myproject ext3 defaults 1 2
- 测试自动挂载:『 mount -a 』,然后使用『 df 』观察看看有无挂载即可!
- 配置最后的权限,使用:『 chgrp project /srv/myproject 』以及『 chmod 2770 /srv/myproject 』即可。
- 简答题部分:如果由于你的主机磁盘容量不够大,你想要添加一颗新磁盘,并将该磁盘全部分割成单一分割槽,且将该分割槽挂载到 /home 目录, 你该如何处置?
详细的流程可以分为硬件组装、磁盘分区、格式化、数据搬移与挂载等。安装硬盘:关掉 Linux 主机电源,若为 IDE 接口时,需要处理跳针 (jump) ,放入主机后插好硬盘的扁平电缆与电源线,重新启动电源;
磁盘分区:透过类似上述情境模拟二的动作,将整颗磁盘分区成单一主要分割槽,类似 /dev/sdb1 占有全部容量;
格式化:透过 mkfs -t ext3 来格式化;
数据搬移:由于原本的 /home 还会有数据存在,因此你可以 mount /dev/sdb1 /mnt ,再将 /home 的数据复制到 /mnt/ 中,例如:『 cp -a /home/* /mnt 』即可。复制完毕后卸除 /home 以及 /mnt
重新挂载:编辑 /etc/fstab ,将 /home 所在的 filesystem 装置改为 /dev/sdb1 之类的新分割槽,然后 mount -a 测试看看是否正确,如果正确的话,才是顺利结束了这次的动作。
- 如果扇区 /dev/hda3 有问题,偏偏他是被挂载上的,请问我要如何修理此一扇区?
umount /dev/hda3
fsck /dev/hda3
- 我们常常说,启动的时候,『发现硬盘有问题』,请问,这个问题的产生是『filesystem 的损毁』,还是『硬盘的损毁』?
特别需要注意的是,如果您某个 filesystem 里面,由于操作不当,可能会造成 Superblock 数据的损毁, 或者是 inode 的架构损毁,或者是 block area 的记录遗失等等,这些问题当中,其实您的『硬盘』还是好好的, 不过,在硬盘上面的『文件系统』则已经无法再利用!一般来说,我们的 Linux 很少会造成 filesystem 的损毁, 所以,发生问题时,很可能整个硬盘都损毁了。但是,如果您的主机常常不正常断电,那么, 很可能硬盘是没问题的,但是,文件系统则有损毁之虞。此时,重建文件系统 (reinstall) 即可! 不需要换掉硬盘啦!
- 当我有两个文件,分别是 file1 与 file2 ,这两个文件互为 hard link 的文件,请问, 若我将 file1 删除,然后再以类似 vi 的方式重新创建一个名为 file1 的文件, 则 file2 的内容是否会被更动?
这是来自网友的疑问。当我删除 file1 之后, file2 则为一个正规文件,并不会与他人共同分享同一个 inode 与 block ,因此,当我重新创建一个档名为 file1 时,他所利用的 inode 与 block 都是由我们的 filesystem 主动去搜寻 meta data ,找到空的 inode 与 block 来创建的, 与原本的 file1 并没有任何关连性喔!所以,新建的 file1 并不会影响 file2 呢!
参考数据与延伸阅读
- 注1:根据The Linux Document Project的文件所绘制的图示,详细的参考文献可以参考如下连结:
Filesystem How-To: http://tldp.org/HOWTO/Filesystems-HOWTO-6.html
条目: Ext2 介绍 http://en.wikipedia.org/wiki/Ext2
- 注3:PAVE为一套秀图软件,常应用于数值模式的输出文件之再处理:
PAVE 使用手册: http://www.ie.unc.edu/cempd/EDSS/pave_doc/index.shtml
- 注4:详细的 inode 表格所定义的旗标可以参考如下连结:
John's spec of the second extended filesystem: http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm
- 注5:参考 Ext2 官网提供的解说文件,这份文件非常值得参考的!
文章名称:『Design and Implementation of the Second Extended Filesystem 』
http://e2fsprogs.sourceforge.net/ext2intro.html
文章名称:Whitepaper: Red Hat's New Journaling File System: ext3
http://www.redhat.com/support/wpapers/redhat/ext3/
- 注7:其他值得参考的 Ext2 相关文件系统文章之连结如下:
The Second Extended File System - An introduction: http://www.freeos.com/articles/3912/
ext3 or ReiserFS? Hans Reiser Says Red Hat's Move Is Understandable
http://www.linuxplanet.com/linuxplanet/reports/3726/1/ 文件系统的比较:维基百科:http://en.wikipedia.org/wiki/Comparison_of_file_systems
http://www.kernel.org/pub/linux/docs/device-list/devices.txt
- 注10:与 Boot sector 及 Superblock 的探讨有关的讨论文章:
The Second Extended File System: http://www.nongnu.org/ext2-doc/ext2.html
Rob's ext2 documentation: http://www.landley.net/code/toybox/ext2.html
Life is different blog: ext2文件系统分析: http://www.qdhedu.com/blog/post/7.html
|