第八章、Linux 磁盘与文件系统管理
最近升级日期:2009/08/30

大标题的图示文件系统的特殊观察与操作

文件系统实在是非常有趣的东西,鸟哥学了好几年还是很多东西不很懂呢! 在学习的过程中很多朋友在讨论区都有提供一些想法!这些想法将他归纳起来有底下几点可以参考的数据呢!


小标题的图示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 的大小拿出来讨论讨论喔!


  • block 为 1024 bytes (1K) 时:

如果 block 大小刚好是 1024 的话,那么 boot sector 与 superblock 各会占用掉一个 block , 所以整个文件系统图示就会如同图 1.3.1 所显示的那样,boot sector 是独立于 superblock 外面的! 由于鸟哥在基础篇安装的环境中有个 /boot 的独立文件系统在 /dev/hdc1 中,使用 dumpe2fs 观察的结果有点像底下这样(如果你是按照鸟哥的教学安装你的 CentOS 时,可以发现相同的情况喔!):

[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 用的啰! 所以整个分割槽的文件系统分区有点像底下这样的图示:

1K block 的 boot sector 示意图
图 6.1.1、1K block 的 boot sector 示意图

  • block 大于 1024 bytes (2K, 4K) 时:

如果 block 大于 1024 的话,那么 superblock 将会在 0 号!我们撷取本章一开始介绍 dumpe2fs 时的内容来说明一下好了!

[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 来使用。

4K block 的 boot sector 示意图
图 6.1.2、4K block 的 boot sector 示意图

因为上述的情况,如果在比较大的 block 尺寸(size)中,我们可能可以说你能够将启动管理程序安装到 superblock 所在的 block 号码中!就是上表的 0 号啰!但事实上还是安装到 boot sector 的保留区域中啦!所以说, 以前的文章说启动管理程序可以安装到 superblock 内也不能算全错~但比较正确的说法,应该是安装到该 filesystem 最前面的 1024 bytes 内的区域,就是 boot sector 这样比较好!


小标题的图示磁盘空间之浪费问题

我们在前面的 block 介绍中谈到了一个 block 只能放置一个文件, 因此太多小文件将会浪费非常多的磁盘容量。但你有没有注意到,整个文件系统中包括 superblock, inode table 与其他中介数据等其实都会浪费磁盘容量喔!所以当我们在 /dev/hdc6 创建起 ext3 文件系统时, 一挂载就立刻有很多容量被用掉了!

另外,不知道你有没有发现到,当你使用 ls -l 去查询某个目录下的数据时,第一行都会出现一个『total』的字样! 那是啥东西?其实那就是该目录下的所有数据所耗用的实际 block 数量 * block 大小的值。 我们可以透过 ll -s 来观察看看上述的意义:

[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/ 这个目录的容量状态吧!

[root@www ~]# du -sb /etc
108360494       /etc   <==单位是 bytes 喔!

[root@www ~]# du -sm /etc
118     /etc           <==单位是 Mbytes 喔!

使用 bytes 去分析时,发现到实际的数据占用约 103.3Mbytes,但是使用 block 去测试,就发现其实耗用了 118Mbytes, 此时文件系统就耗费了约 15Mbytes 啰!这样看的懂我们在讲的数据了吧?


小标题的图示利用 GNU 的 parted 进行分割行为

虽然你可以使用 fdisk 很快速的将你的分割槽切割妥当,不过 fdisk 却无法支持到高于 2TB 以上的分割槽! 此时就得需要 parted 来处理了。不要觉得 2TB 你用不着! 2009 年的现在已经有单颗硬盘高达 2TB 的容量了! 如果再搭配主机系统有内建磁盘阵列装置,要使用数个 TB 的单一磁盘装置也不是不可能的! 所以,还是得要学一下这个重要的工具! parted !

parted 可以直接在一行命令列就完成分割,是一个非常好用的命令!他的语法有点像这样:

[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 』去查询更详细的数据。比较有趣的地方在于分割表的输出。我们将上述的分割表示意拆成六部分来说明:

  1. Number:这个就是分割槽的号码啦!举例来说,1号代表的是 /dev/hdc1 的意思;
  2. Start:起始的磁柱位置在这颗磁盘的多少 MB 处?有趣吧!他以容量作为单位喔!
  3. End:结束的磁柱位置在这颗磁盘的多少 MB 处?
  4. Size:由上述两者的分析,得到这个分割槽有多少容量;
  5. Type:就是分割槽的类型,有primary, extended, logical等类型;
  6. File system:就如同 fdisk 的 System ID 之意。

接下来我们尝试来创建一个全新的分割槽吧!因为我们仅剩下逻辑分割槽可用,所以等一下底下我们选择的会是 logical 的分割类型喔!

范例二:创建一个约为 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  <==就是刚刚创建的啦!
范例三:将刚刚创建的第八号磁盘分区槽删除掉吧!
[root@www ~]# parted /dev/hdc rm 8
# 这样就删除了!实在很厉害!所以这个命令的下达要特别注意!
# 因为...命令一下去就立即生效了~如果写错的话,会哭死~

关于 parted 的介绍我们就到这里啦!除非你有使用到大于 2TB 以上的磁盘, 否则请爱用 fdisk 这个程序来进行分割喔!拜托拜托!


 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室