4. 预备硬盘分区
4.a. 块设备 (Block Device) 简介
各色块设备
We'll take a good look at disk-oriented aspects of Gentoo Linux and Linux in general, 包括 Linux 的文件系统, 分区, 以及块设备. 随后, 一旦您已经里里外外明白了磁盘与文件系统这些东西, 您就可以开始跟随我们的向导开始为您的 Gentoo Linux 的安装进行磁盘分区和文件系统的建立.
我们下面从块设备 (block devices) 开始, 大家都可能会听说过的一个块设备就是在 Linux 系统中代表第一块硬盘的 /dev/hda. 如果您的系统用的是 SCSI 驱动器, 那么您的第一个硬件驱动器则是 /dev/sda
上述块设备提供了对实际磁盘的一个抽象接口 (interface). 用户程序可通过这些块设备与您的磁盘交互而不需关心实际磁盘到底是 IDE 的, SCSI 的抑或是其他. 用户程序可以简单直接地从磁盘中定位 (address) 存储空间 as a bunch of contiguous, randomly-accessible 512-byte blocks.
各色分区
理论上而言, 把硬盘铁板一块地用来装 Linux 并非不可能, 而实际上很少有这么做的. 我们通常会把整块硬盘分割成更小的, 更容易管理的多个块设备. 在 x86 体系中, 我们把它们 (更小的这些块设备) 称之为分区.
分区有三种类型: 主分区 (primary), 扩展分区 (extended)和逻辑分区 (logical).
主分区是这样一个分区: 它的信息被存储在 MBR 区 (master boot record. Cure: MBR - 主引导记录区. 硬盘中最特别的一个地方, 它位于硬盘最前面的一个大小为 512 个字节的地方, 系统启动时, 这个地方首先会被读取. 操作系统的引导信息会被记录在这里, 比如 grub 和 lilo 都会把自己的一部分记录于此.) 由于 MBR 只有这么大 (512 bytes), 因此只能最多定义并记录四个主分区 (如, /dev/hda1 到 /dev/hda4) (break: 16:01 - 16:15 = 14 min)
扩展分区是一个记录了多个分区的特殊主分区 (这意味着这个主分区必须是四个可能的主分区中的一个). 最初并没有这样一个分区的, 但仅有四个分区实在太少了, 于是扩展分区就出现了, 它在扩展了原有分区格式方案的基础上同时保留了向后兼容性. (Cure: 即主分区仍然只有四个)
逻辑分区是位于扩展分区中的分区. 它们的分区信息不再记录到 MBR 中, 而是记录在扩展分区中.
高级存储方式
我们的 x86 LiveCDs 提供了对 EVMS 和 LVM2 的支持. EVMS 和 LVM2 提升了您的分区设置的灵活性. 在安装过程中, 我们将专注于 '普通的' 分区, 但是呢, 知道我们提供了对 EVMS 和 LVM2 的支持也是不错的一件事.4.b. 设计分区方案
默认分区方案
如果您实在没兴趣折腾自己的分区方案, 您完全可以原封不动地照搬我们下述的通篇使用的分区策略:
分区 | 文件系统 | 大小 | 描述 |
/dev/hda1 | ext2 | 32M | 启动分区 |
/dev/hda2 | (swap) | 512M | 交换分区 |
/dev/hda3 | ext3 | 硬盘中余下的空间 | 根分区 |
如果您有兴趣知道一个分区到底应该分配多大的空间, 以至您到底需要几个分区, 那么请继续读下去. 否则, 请跳到下一部分以 fdisk 分区以对您的硬盘进行分区.
多少? 多大?
分区的数量完全取决于您的工作环境. 比如, 要是您的系统有很多用户, 您就有必要把 /home 划为一个单独的分区以提高安全性以及让备份工作更容易 (Cure: 当 /home 在一个独立分区上时, 我们就可以很轻松地把备份工作分成两部分进行: 系统备份和用户数据备份, 各自独立, 互不影响). 如果您是把您的 Gentoo 作为邮件服务器, 由于所有的邮件会被存储在 /var, 您将很有必要把 /var 作为一个单独分区. 选择合适的文件系统将极大化您系统的性能表现. 游戏服务器通常会划出一个单独的 /opt 分区, 因为大部分的游戏服务器软件都会安装到这儿. 这样安排的理由很简单, 和 /home 一样为了: 安全与备份.
如您所见, 分区方案完全取决于您的目的. 单独划出来的分区或卷 (volumns) 将拥有如下好处:
- 您可以专门为该分区或卷按需选择最合适的文件系统
- 您的系统不会因为某些僵尸程序 (defunct tools) 不断地往空闲空间写数据而导致最终空间不足 (Cure: 空间不足能让您系统崩溃完蛋, 哈哈)
- 必要时可以减少文件系统的检测时间. 因为多个文件系统的检测可以同步进行 (尽管这一好处在多块磁盘的情况下会比多个分区更明显)
- 我们可以把某些分区或卷以只读方式 (read-only), 禁用超级用户模式 (nosuid) 以及禁止执行 (noexec) (可执行程序的可执行位 (executable bit) 将被忽略) 方式挂载以提高其安全性.
不过呢, 多个分区的一大短处是: 如果分配不合理, 您可能最终得到一个这样的系统 - 某些分区空闲极多而某些分区空间严重不足.
下面为您提供一个分区例子, 该例子基于一个用于演示的手提电脑 (包含有 web 服务器, 邮件服务器, gnome 桌面系统...), 硬盘大小为 20G:
代码清单 1: 文件系统使用状况例 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(为日后使用而预留的未分配空间: 2 Gb) |
/usr 在这里看起来相当满 (使用百分比高达 83%), 不过呢, 一旦所有软件安装完毕, /usr 区的空间占用通常是没什么变化的. 而 /var 区, 大家会想是不是给它分配太多空间了? 实际上呢 Gentoo 将在 /var/tmp/portage 中编译所有的程序, 因此, 即便您不打算编译大块头的程序您也需要给它至少 1G 的空闲空间, 如果要同时编译 KDE 和 OpenOffice.org 这样的庞然大物, 3G 的空闲空间都未必足够. (up to 3G free if compiling KDE and OpenOffice.org at the same time is no big deal for you)
4.c. 以 fdisk 分区
下面这一部分将向您介绍如何根据前面所描述的分区方案来创建它们:
分区 | 描述 |
/dev/hda1 | 启动分区 |
/dev/hda2 | 交换分区 |
/dev/hda3 | 根分区 |
请根据您自己的需要设定分区布局.
查看当前分区布局
fdisk 是一个既流行又好用的分区工具. 对您的硬盘启动 fdisk 这一工具 (在我们的例子中, 使用 /dev/hda):
代码清单 2: 启动 fdisk |
# fdisk /dev/hda |
一旦进入 fdisk 这个程序, 您会看到如下的提示语:
代码清单 3: fdisk 的提示语 |
Command (m for help): |
输入 p 将显示您的硬盘的当前分区情况:
代码清单 4: 分区情况例 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Command (m for help): p Disk /dev/hda: 240 heads, 63 sectors, 2184 cylinders Units = cylinders of 15120 * 512 bytes
Command (m for help): |
该硬盘上有七个 Linux 的文件系统 (每个都对应着一个 "Linux" 分区) 以及一个交换分区 (列表中标为 "Linux Swap").
清除所有分区
我们将首先从该硬盘中删除现存的所有分区. 我们输入 d 来删除一个分区. 例如, 要删除现有的 /dev/hda1:
代码清单 5: 删除一个分区 |
Command (m for help): d Partition Number (1-4): 1 |
于是, 该分区就被列入计划删除的清单中. 当我们输入 p 时, 它不会显示, 同时呢, 它也不会被立即地真正地删除, 直到我们保存所有变更时, 所有的操作才会真正起效. 如果您犯了小错误, 希望不保存变更并退出, 那就输入 p 并回车, 分区不会被删除一切将安然无恙. (Cure: 也就是说, 在 fdisk 命令环境中, 我们可以随便地, 甚至乱搞我们硬盘上的分区, 但只要保证一点, 最后退出之前不保存我们乱搞的 '成果', 一切将安然无恙... !!! 警告 !!! 没经验没胆子没细心操作习惯然后硬盘中有大量重要数据的朋友千万别听我瞎说, 这几句就假装没看到, 赶紧忘掉吧! :)
现在呢, 假设您真的想清除掉硬盘上的所有分区, 那么我们就重复地按 p 显示当前分区情况, 按 d 删除各个分区. 最终, 您会得到一个空的分区表 (partition table):
代码清单 6: 空分区表 | |||||||
Disk /dev/hda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes
Command (m for help): |
现在, 内存中 (in-memory) 的分区表已经空了, 我们可以开始创建新的分区了. 我们将使用先前讨论过的分区方案. 当然, 如果您想要自己的分区方案, 可就不能再跟着我们的方案照猫画虎了哦.
创建启动分区 (boot partition)
我们首先创建一个小小的启动分区. 输入 n 以创建一个新分区, 然后 p 以选择一个主分区, 接着输入 1 以选择第一个主分区. 当提示输入首柱面 (first cylindar) 时, 按回车取其默认值. 当提示输入尾柱面 (last cylindar) 时, 输入 +32M 以创建一个大小为 32 Mbyte 的分区:
代码清单 7: 创建启动分区 |
Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 1 First cylinder (1-3876, default 1): (回车) Using default value 1 Last cylinder or +size or +sizeM or +sizeK (1-3876, default 3876): +32M |
现在, 当您输入 p, 您应该能看到如下的分区情况:
代码清单 8: 已创建的启动分区 | ||||||||||||||
Command (m for help): p Disk /dev/hda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes
|
我们要让它变成可启动 (bootable) 分区, 则可以输入 a 以将该分区标记成可启动. 如果您这时再按 p, 您就会发现在分区表的 Boot 一栏中多了一个小星星 *.
创建交换分区 (swap partition)
我们下面来创建交换分区. 输入 n 以创建新分区, 输入 p 以告诉 fdisk 我们要一个主分区. 然后输入 2 以创建第二个主分区, 在本例中即是 /dev/hda2. 在提示输入首柱面时我们回车. 在提示输入尾柱面时, 我们输入 +512M 以创建一个大小为 512 MB 的分区. 完成这些之后, 我们输入 t 来设定这个分区的类型, 输入 2 来指定我们刚刚创建的这个分区, 输入 82 来把这个分区的类型设置成 "Linux Swap". 这些步骤都完成之后, 输入 p 我们应该能看到如下的分区表:
代码清单 9: 交换分区创建完毕后的分区表状态 | |||||||||||||||||||||
Command (m for help): p Disk /dev/hda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes
|
创建根分区 (root partition)
最后, 让我们来创建根分区. 输入 n 以创建新分区, 输入 p 以告诉 fdisk 我们要一个主分区. 然后输入 3 以创建第二个主分区, 在本例中即是 /dev/hda3. 在提示输入首柱面时我们回车. 在提示输入尾柱面时, 我们同样回车以使用剩下的所有空间来创建这个分区. 这些步骤都完成之后, 输入 p 我们应该能看到如下的分区表:
代码清单 10: 根分区创建完毕后的分区表状态 | ||||||||||||||||||||||||||||
Command (m for help): p Disk /dev/hda: 30.0 GB, 30005821440 bytes 240 heads, 63 sectors/track, 3876 cylinders Units = cylinders of 15120 * 512 = 7741440 bytes
|
保存分区布局
这时我们可以输入 w 以保存当前的分区布局并退出 fdisk:
代码清单 11: 保存并退出 fdisk |
Command (m for help): w |
这样您的分区就创建完毕了, 您可以继续下一部分之创建文件系统.
4.d. 创建文件系统 (Filesystems)
简介
分区创建完毕, 下一步就是在它们上面创建文件系统. 如果您不在乎到底该选择何种文件系统并且乐于使用我们在本手册中使用的默认文件系统, 那么请跳到这一部分在分区上创建文件系统. 否则, 继续下面的内容, 让我们一起看看都有那些文件系统...
都有那些文件系统?
Linux 内核支持诸多文件系统. 我们下面将介绍在 Linux 系统上最常用的几种文件系统如 ext2, ext3, ReiserFS, XFS 以及 JFS.
ext2 是久经考验的名副其实的 Linux 的文件系统, 只是它不支持源数据日志 (metadata journaling), 这意味着系统启动期间执行的 ext2 文件系统例行检查过程会非常耗时 (time-consuming). (break: 17:32 - 17:49) 目前已经有许多新一代 (newer-generation) 的日志式文件系统 (journaled filesystems) 以供选择, 它们可以非常快速地检查文件系统的一致性 (consistency), 因此人们也普遍喜欢采用它们以替代非日志式的文件系统 (non-journaled filesystem). 在您的系统启动并且不巧地处于非一致性状态 (inconsistent state) 时 (Cure: 如一次非正常关机就会让您的系统在下一次启动时被认为处于非一致性状态, 这时文件系统的一致性例行检查就会自动启动, 检查完毕之后, 系统将重新恢复一致性状态, 直到下一次非正常关机之类的倒霉情况出现. 日志式文件系统可以迅速完成该 '例行检查' 并恢复一致性状态), 日志式文件系统可以有效地减少启动延迟.
ext3 是 ext2 的日志式版本, 它提供源数据日志 (metadata journaling) 功能以供系统快速恢复, 还提供了增强的日志 模式如全数据日志模式 (full data journaling) 以及有序数据日志模式 (ordered data journaling). ext3 是一个非常棒非常可靠的文件系统. 它还有一个额外的哈希 b-树 索引功能 (hashed b-tree indexing option)以保证各种应用情况下的高性能发挥. 简而言之, ext3 是一个非常优秀的文件系统.
ReiserFS 是一个基于 B*-树 (B*-tree) 的文件系统. 它整体性能非常好, 尤其在处理大量小文件 (个头小于 4K 的文件) 的时候比 ext2 和 ext3 都有有过之而无不及的优异表现 -- 性能通常是这两个文件系统的 10 - 15 倍. ReiserFS also scales extremely 并且支持源数据日志 (metadata journaling). 在 2.4.18 以上的内核中, ReiserFS 已经是坚实又好用的文件系统, 足以应付普通 (general-purpose) 应用乃至一些极端的应用如创建庞大 (large) 的文件系统, 处理大量的小文件, 庞大的文件以及包含成百上千文件的目录.
XFS 是支持源数据日志的文件系统, 它还包含一堆健壮的特性集合, 并且为 scalbility 特地优化过. 我们仅于这样的条件下推荐使用该文件系统: 使用高端 SCSI 与/或 fibre channel 存储设备的, 以及不间断供电的 Linux 系统. 因为 XFS 会将 in-transit 数据侵略性 (强制性? aggressively) 地缓存到内存 (RAM) 中. 一旦系统意外地非正常停机, 一些设计不合理的程序 (那些在往硬盘中写数据时不够注意的程序, 这些程序还为数不少) 将会引起相当数量的数据丢失.
JFS IBM 的高性能日志式文件系统. 它最近才刚刚达到产品级可用 (production-ready) 水平, 因此目前并没有足够的数据以评价它整体稳定性之好坏.
在分区上创建文件系统
要在一个分区或卷 (volumn) 上创建文件系统, 我们有不少对应特定文件系统的工具可以使用:
文件系统 | 创建命令 |
ext2 | mke2fs |
ext3 | mke2fs -j |
reiserfs | mkreiserfs |
xfs | mkfs.xfs |
jfs | mkfs.jfs |
举例而言, 如果我们想让启动分区 (我们的例子中是 /dev/hda1) 是 ext2 格式的而根分区 (我们的例子中是 /dev/hda3) 是 ext3 (如该例) 格式的, 则:
代码清单 12: 在分区上创建文件系统 |
# mke2fs /dev/hda1 # mke2fs -j /dev/hda3 |
好了, 开始在您自己的分区 (或逻辑卷 (logical volumns)) 上创建文件系统吧!
启用交换分区 (Swap Partition)
mkswap 是一个用来初始化交换分区的命令:
代码清单 13: 创建交换分区标识 (signature) |
# mkswap /dev/hda2 |
swapon 以启动交换分区:
代码清单 14: 启用交换分区 |
# swapon /dev/hda2 |
开始创建并启用您的交换分区吧.
4.e. 挂载
现在呢, 您的各个分区已经初始化完毕并且有了文件系统, 是时候把它们挂载到系统中来. 我们将使用 mount 命令. 可要记得先给每个您要挂载的分区创建必要的挂载目录. 下面给出挂载根分区 (root partition) 和启动分区 (boot partition) 的例子:
代码清单 15: 挂载分区 |
# mount /dev/hda3 /mnt/gentoo # mkdir /mnt/gentoo/boot # mount /dev/hda1 /mnt/gentoo/boot |
注: 如果您想把 /tmp 放在一个独立的分区, 在挂载完之后记得改变它的权限: chmod 1777 /mnt/gentoo/ tmp. This also holds for /var/tmp. (?) |
我们还需要把进程文件系统 (proc filesystem) (内核的一个虚拟接口) 挂载到 /proc. 我们首先创建 /mnt/gentoo/proc 这一挂载点然后挂载之:
代码清单 16: 创建挂载点 /mnt/gentoo/proc |
# mkdir /mnt/gentoo/proc # mount -t proc none /mnt/gentoo/proc |
下面我们继续下一章安装 Gentoo 的安装文件 (Installation Files)