Gentoo Logo

1.  块设备介绍

块设备

我们要好好了解下Gentoo Linux以及普通Linux中有关磁盘方面的知识,包括Linux文件系统、分区和块设备。然后,一旦你熟悉了磁盘和文件的方方面面,我们将会指导你设置分区和文件系统,为你安装Gentoo Linux做好准备。

一开始我们先介绍块设备。最有名的块设备可能就是Linux系统中表示第一个IDE硬盘的/dev/sda。SCSI硬盘和Serial ATA硬盘都是/dev/sda。如果你正在使用内核里新的libata架构,即便IDE硬盘也会是/dev/sd*。如果你用的是旧的设备架构,你的第一个IDE硬盘将是/dev/hda

上面介绍的块设备代表磁盘的抽象接口。用户程序可以使用这些块设备来与你的磁盘进行交互,而不用理会你的驱动器到底是IDE、SCSI还是其他的。程序可以把磁盘当作一系列连续的、可随机访问的512字节大小的块来访问。

分片

尽管在理论上可以使用一整块磁盘来安装你的Linux系统,但是在实际中几乎从不这样做。相反,整个磁盘块设备被分割成更小、更容易管理的块设备。在Aplha系统中,这些小块设备称为分片

1.  设计分区方案

默认分区方案

我们使用以下分片布局作为例子:

分片 说明
/dev/sda1 Swap分片
/dev/sda2 Root分片
/dev/sda3 整个磁盘(必需)

如果你想知道一个分区应该多大,或者你需要多少个分区,继续阅读。否则请阅读使用fdisk来为你的磁盘分区(SRM)使用fdisk来为你的磁盘分区(ARC/AlphaBIOS)

多少和多大?

分区的数目主要根据你的系统环境来决定。例如,如果你有很多用户,你可能更希望把你的/home目录独立出来,因为这样做可以增加安全性,备份起来也更容易。如果你安装Gentoo用来做邮件服务器,你的/var目录应该独立出来,因为邮件都存储在/var目录中。选择一个好的文件系统将最大限度地提高你的系统性能。游戏服务器应该把/opt目录独立出来,因为大多数游戏服务端软件都安装在那。理由也与/home目录类似:安全与备份。你一定要使/usr目录保持足够大:因为它将不仅包含大部分应用程序,而且Portage树本身就需要大约500M空间,这还不包括存储在其中的各种源代码包。

正如你所看到的,这完全取决于你想要达到什么目的。独立的分区或卷有以下优点:

  • 你可以为每一个分区或卷选择最佳性能的文件系统
  • 如果一个有问题的工具不停地向一个分区或卷写文件,也不会把你整个系统的可用空间都用完
  • 如果需要,可以减少文件系统检测的时间,因为多个检测可以并行的进行(尽管这个优势在多磁盘系统上比多分区系统上更为明显)
  • 通过对一些分区进行只读、nosuid(忽略setuid位)、noexec(忽略可执行位)等方式的挂载,安全性会大大增强

然而,多分区系统有一大缺点:如果配置得不合理,可能导致系统中一个分区有很大的空闲空间,而另一个没有空闲空间了。SCSI和SATA还有15个分区的限制。

1.  使用fdisk来为你的磁盘分区(SRM)

下面来解释如何创建前面说明的那个示例分片布局,即:

分片 说明
/dev/sda1 Swap分片
/dev/sda2 Root分片
/dev/sda3 整个磁盘(必须)

根据你自己的喜好来改变分片布局。

识别可用的磁盘

使用以下命令来查看哪些磁盘正在运行:

代码 1.1: 识别可用的磁盘

# dmesg | grep 'drive$'        (IDE磁盘)
# dmesg | grep 'scsi'          (SCSI磁盘)

你可以从这个命令的输出中看出检测到了哪些磁盘以及它们对应的/dev条目。在接下来的部分中我们假定这是一个/dev/sda上的SCSI磁盘。

现在启动fdisk

代码 1.1: 启动fdisk

# fdisk /dev/sda

删除所有分片

如果是个完全空白的硬盘,那么你必须首先创建一个BSD磁盘标签。

代码 1.1: 创建一个BSD磁盘标签

Command (m for help): b
/dev/sda contains no disklabel.
Do you want to create a disklabel? (y/n) y
这里将列出一组驱动器相关信息
3 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]                                    
  c:        1      5290*     5289*    unused        0     0

一开始我们先删除除了‘c’分片(使用BSD磁盘标签时必须的)之外的所有分片。接下来的命令显示如何删除一个分片(我们用‘a’作为例子)。重复这个步骤以删除所有其它分片(再次提醒,除了‘c’分片)。

使用p查看现有的全部分片。d用来删除一个分片。

代码 1.1: 删除一个分片

BSD disklabel command (m for help): p

8 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]                                    
  a:        1       235*      234*    4.2BSD     1024  8192    16
  b:      235*      469*      234*      swap
  c:        1      5290*     5289*    unused        0     0
  d:      469*     2076*     1607*    unused        0     0
  e:     2076*     3683*     1607*    unused        0     0
  f:     3683*     5290*     1607*    unused        0     0
  g:      469*     1749*     1280     4.2BSD     1024  8192    16
  h:     1749*     5290*     3541*    unused        0     0

BSD disklabel command (m for help): d
Partition (a-h): a

完成所有分片的删除步骤之后,显示的列表将类似下面这样:

代码 1.1: 查看一个空的模式

BSD disklabel command (m for help): p

3 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]                                    
  c:        1      5290*     5289*    unused        0     0

创建Swap分片

基于Alpha的系统不需要单独的启动分片。不过,不能使用第一个柱面,因为aboot镜像文件要装在那里。

我们从第三个柱面开始创建swap分片,总大小为1GB。使用n来创建一个新的分片。创建好之后,将它的类型改为1(一),代表swap

代码 1.1: 创建swap分片

BSD disklabel command (m for help): n
Partition (a-p): a
First cylinder (1-5290, default 1): 3
Last cylinder or +size or +sizeM or +sizeK (3-5290, default 5290): +1024M

BSD disklabel command (m for help): t
Partition (a-c): a
Hex code (type L to list codes): 1

完成这些步骤之后,你将看到一个类似下面的布局:

代码 1.1: 创建swap分片之后的布局

BSD disklabel command (m for help): p

3 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]                                    
  a:        3      1003      1001       swap
  c:        1      5290*     5289*    unused        0     0

创建Root分片

现在我们将从swap分片之后的第一个柱面开始创建root分片。使用p命令查看swap分片结束的位置。我们的示例中是在1003,因此root分片从1004开始。

还有一个问题是当前版本的fdisk存在一个bug,它认为的可用柱面数比实际的柱面数大一。换言之,你要将最后一个柱面的数值(本例中为:5290)减一。

创建好root分片后,将它的类型改为8,代表ext2

代码 1.1: 创建root分片

D disklabel command (m for help): n
Partition (a-p): b
First cylinder (1-5290, default 1): 1004
Last cylinder or +size or +sizeM or +sizeK (1004-5290, default 5290): 5289

BSD disklabel command (m for help): t
Partition (a-c): b
Hex code (type L to list codes): 8

现在你的分片布局应该类似下面这样:

代码 1.1: 查看分片布局

BSD disklabel command (m for help): p

3 partitions:
#       start       end      size     fstype   [fsize bsize   cpg]                                    
  a:        3      1003      1001       swap
  b:     1004      5289      4286       ext2
  c:        1      5290*     5289*    unused        0     0

保存分片布局并退出

输入w,保存fdisk操作。这同时也保存了分片布局。

代码 1.1: 保存并退出fdisk

Command (m for help): w

现在分片已经创建完毕,你可以继续创建文件系统

1.  使用fdisk来为你的磁盘分区(ARC/AlphaBIOS)

下面解释如何使用前面说明的那个布局来给磁盘分区,即:

分区 说明
/dev/sda1 启动分区
/dev/sda2 交换分区
/dev/sda3 根分区

根据你自己的喜好来改变分区布局。

识别可用的磁盘

使用以下命令来查看哪些磁盘正在运行:

代码 1.1: 识别可用的磁盘

# dmesg | grep 'drive$'        (IDE磁盘)
# dmesg | grep 'scsi'          (SCSI磁盘)

你可以从这个命令的输出中看出检测到了哪些磁盘以及它们对应的/dev条目。在接下来的部分中我们假定这是一个/dev/sda上的SCSI磁盘。

现在启动fdisk

代码 1.1: 启动fdisk

# fdisk /dev/sda

删除所有分区

如果是个完全空白的硬盘,那么你必须首先创建一个DOS磁盘标签。

代码 1.1: 创建一个DOS磁盘标签

Command (m for help): o
Building a new DOS disklabel.

一开始我们先删除所有分区。接下来的命令显示如何删除一个分区(我们用‘1’作为例子)。重复这个步骤以删除所有其它分区。

使用p查看现有的全部分区。d用来删除一个分区。

代码 1.1: 删除一个分区

command (m for help): p

Disk /dev/sda: 9150 MB, 9150996480 bytes
64 heads, 32 sectors/track, 8727 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1         478      489456   83  Linux
/dev/sda2             479        8727     8446976    5  Extended
/dev/sda5             479        1433      977904   83  Linux Swap
/dev/sda6            1434        8727     7469040   83  Linux

command (m for help): d
Partition number (1-6): 1

创建启动分区

使用MILO引导的Alpha系统必须创建一个较小的vfat格式的启动分区。

代码 1.1: 创建启动分区

Command (m for help): n
Command action
  e   extended
  p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-8727, default 1): 1
Last cylinder or +size or +sizeM or +sizeK (1-8727, default 8727): +16M

Command (m for help): t
Selected partition 1
Hex code (type L to list codes): 6
Changed system type of partition 1 to 6 (FAT16)

创建交换分区

我们将创建大小为1GB的交换分区。使用n来创建一个新的分区。

代码 1.1: 创建交换分区

Command (m for help): n
Command action
  e   extended
  p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (17-8727, default 17): 17
Last cylinder or +size or +sizeM or +sizeK (17-8727, default 8727): +1000M

Command (m for help): t
Partition number (1-4): 2
Hex code (type L to list codes): 82
Changed system type of partition 2 to 82 (Linux swap)

完成这些步骤之后,你将看到一个类似下面的布局:

代码 1.1: 创建交换分区后的分区列表

Command (m for help): p

Disk /dev/sda: 9150 MB, 9150996480 bytes
64 heads, 32 sectors/track, 8727 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          16       16368    6  FAT16
/dev/sda2              17         971      977920   82  Linux swap

创建根分区

现在我们创建根分区。同样,使用n命令即可。

代码 1.1: 创建根分区

Command (m for help): n
Command action
  e   extended
  p   primary partition (1-4)
p
Partition number (1-4): 3
First cylinder (972-8727, default 972): 972
Last cylinder or +size or +sizeM or +sizeK (972-8727, default 8727): 8727

完成这些步骤之后,你将看到一个类似下面的布局:

代码 1.1: 创建根分区后的分区列表

Command (m for help): p

Disk /dev/sda: 9150 MB, 9150996480 bytes
64 heads, 32 sectors/track, 8727 cylinders
Units = cylinders of 2048 * 512 = 1048576 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          16       16368    6  FAT16
/dev/sda2              17         971      977920   82  Linux swap
/dev/sda3             972        8727     7942144   83  Linux

保存分区布局并退出

输入w,保存fdisk操作。这同时也保存了分区布局。

代码 1.1: 保存并退出fdisk

Command (m for help): w

现在分区已经创建完毕,你可以继续创建文件系统

1.  创建文件系统

介绍

你的分区已经创建完了,现在可以在上面安装文件系统了。如果你并不介意选择何种文件系统,而且乐意使用本手册中所使用的默认设置,请阅读在分区上应用文件系统。否则,继续阅读本文来了解可用的文件系统……

文件系统

Linux内核支持各种各样的文件系统。我们将介绍ext2、ext3、ReiserFS、XFS和JFS,因为它们是Linux系统中使用最普遍的文件系统。

ext2是经考验证明可靠的Linux文件系统,但是没有元数据日志,这意味这在启动系统时的ext2文件系统的日常检查相当耗时。现在相当一部分的新一代的日志文件系统都可以非常迅速检查一致性,因此比那些非日志文件系统更受欢迎。当你启动系统碰巧遇到文件系统状态不一致时,日志文件系统不会在那里耽搁很长时间。如果你要在一个很小的硬盘(小于4G)上装Gentoo,那么你需要在创建ext2文件系统时预留足够的inode,执行此命令mke2fs -T small /dev/<device>.

ext3是ext2文件系统的带日志版本,提供了元数据日志模式以快速恢复数据。此外还提供了其他增强的日志模式,如完整数据日志模式和有序数据日志模式。它使用了HTree索引,在几乎所有的情况下都能保持高性能。简而言之,ext3是非常好及可靠的文件系统。如果你要在一个很小的硬盘(小于4G)上装Gentoo,那么你需要在创建ext2文件系统时预留足够的inode,执行此命令mke2fs -T small /dev/<device>

JFS是IBM的高性能日志文件系统。JFS是一个轻量级的、快速的和稳定的基于B+树的文件系统,在很多情况下都有很好的表现。

ReiserFS是基于B+树的文件系统,它有着非常全面的性能,特别时在处理很多小文件的时候,虽然会占用多一点CPU。ReiserFS相比其他文件系统显得受维护的不够。

XFS是一种带元数据日志的文件系统,它有一个健壮的特性集,并且对可伸缩性进行了优化。XFS似乎对各种各样的硬件问题显得不够宽容。

在分区上应用文件系统

要在分区或卷上创建文件系统,对于每种可能的文件系统都有专门的工具。

文件系统 创建命令
ext2 mke2fs
ext3 mke2fs -j
reiserfs mkreiserfs
xfs mkfs.xfs
jfs mkfs.jfs

例如,要使根分区(本例中的/dev/sda2)为ext3,应该这样做:

代码 1.1: 在分区上应用文件系统

# mke2fs -j /dev/sda2

现在在你新建的分区(或逻辑卷)上创建文件系统。

激活交换分区

mkswap是初始化交换分区的命令:

代码 1.1: 创建交换分区标志

# mkswap /dev/sda1

使用swapon命令来激活交换分区:

代码 1.1: 激活交换分区

# swapon /dev/sda1

使用上面提到的命令来创建和激活交换分区。

1.  挂载

现在你的分区都已经初始化了,并且安装了文件系统,是时候来挂载这些分区了。使用mount命令进行挂载。别忘记为每个你创建的分区建立所需的挂载目录。作为例子,我们来挂载根分区:

代码 1.1: 挂载分区

# mount /dev/sda2 /mnt/gentoo

注意: 如果你希望/tmp目录在一个独立的分区上,确保在挂载之后修改它的权限:chmod 1777 /mnt/gentoo/tmp。这同样适用于/var/tmp目录。

我们还需要在/proc目录上挂载proc文件系统(内核的虚拟接口)。但是,我们首先需要把我们的文件放到分区上。

请继续阅读(安装Gentoo安装文件)

更新于2009年 2月 21日

本文档的原始版本最后更新于2011年 10月 17日

Donate to support our development efforts.

Copyright 2001-2012 Gentoo Foundation, Inc. Questions, Comments? Contact us.