Gentoo Logo

[ << ] [ < ] [ 主页 ] [ > ] [ >> ]


4. 预备磁盘

内容:

4.a. 块设备介绍

块设备

我们要好好了解下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系统,但是在实际中几乎从不这样做。相反,整个磁盘块设备被分割成更小、更容易管理的块设备。它们被称为分区

4.b. 设计分区方案

多少和多大?

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

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

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

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

4.c. 使用MIPS上的fdisk来为你的磁盘分区

SGI机器:创建一个SGI盘标

SGI系统里的所有磁盘都需要一个SGI盘标,它和Sun和MS-DOS盘标的功能类似——保存有关磁盘分区的信息。创建一个新的SGI盘标将会在磁盘上创建两个特殊的分区:

  • SGI卷头(第9分区):这个分区很重要。这是引导程序保存的地方,某些情况下还保存内核镜像。
  • SGI卷(第11分区):这个分区的目的类似于Sun盘标的第三个分区“Whole disk”。这个分区跨越整个磁盘,不要碰它。除了以某种未知方式帮助PROM(或者IRIX会以某些方式用到它)之外,它没有其他什么特殊用途。

警告: SGI卷头必须从柱面0开始。否则,你将不能从这个磁盘启动。

下面是从fdisk里截取出来的片段。请阅读它并修改它以适应你的需要……

代码 3.1: 创建SGI盘标

# fdisk /dev/sda

Command (m for help): x

Expert command (m for help): m
Command action
   b   move beginning of data in a partition
   c   change number of cylinders
   d   print the raw data in the partition table
   e   list extended partitions
   f   fix partition order
   g   create an IRIX (SGI) partition table
   h   change number of heads
   m   print this menu
   p   print the partition table
   q   quit without saving changes
   r   return to main menu
   s   change number of sectors/track
   v   verify the partition table
   w   write table to disk and exit

Expert command (m for help): g
Building a new SGI disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content will be irrecoverably lost.

Expert command (m for help): r

Command (m for help): p

Disk /dev/sda (SGI disk label): 64 heads, 32 sectors, 17482 cylinders
Units = cylinders of 2048 * 512 bytes

----- partitions -----
Pt#     Device  Info     Start       End   Sectors  Id  System
 9:  /dev/sda1               0         4     10240   0  SGI volhdr
11:  /dev/sda2               0     17481  35803136   6  SGI volume
----- Bootinfo -----
Bootfile: /unix
----- Directory Entries -----

Command (m for help):

注意: 如果你的磁盘已经有了一个SGI盘标,那么fdisk不将允许再创建一个新的盘标。有两个方法可以解决这个问题。一个是创建一个Sun或者MS-DOS盘标,把改动写入磁盘,然后重启fdisk。第二个是用空数据覆盖分区表,用这个命令:dd if=/dev/zero of=/dev/sda bs=512 count=1

把SGI卷头调整到正好的大小

重要: 这一步通常是需要的,因为fdisk里的一个bug。由于某些原因,卷头不能被正确的创建,结果是它开始和结束都是在柱面0。这将导致不能创建多个分区。为了解决这个问题……请接着读。

既然SGI盘标已经建立了,下面就可以定义分区了。上面的例子为你定义了两个分区。这两个是特殊分区,一般不要改动它。不过,为了安装Gentoo,我们将需要加载引导程序,可能还有多个内核镜像(取决于系统类型)直接到卷头里。卷头本身可以保存最多八个任意大小的镜像,每个镜像的名字八个字符。

把卷头变大的过程不是很简单;需要一点小技巧。因为fdisk的奇怪行为,我们不能简单的删除并重新添加卷头。在下面提供的例子里,我们将创建一个50MB的卷头,以及一个50MB的/boot分区。你的磁盘的实际布局可能与此不同,下面这个只是一个示例。

代码 3.2: 正确的改变SGI卷头的大小

Command (m for help): n
Partition number (1-16): 1
First cylinder (5-8682, default 5): 51
 Last cylinder (51-8682, default 8682): 101

(注意到fdisk是怎样允许第一个分区最小只能从柱面5开始创建?你是否也这样尝试删除和重新)
(创建SGI卷头?你应该遇到过一模一样的情况。在我们的例子里,我们希望/boot分区为50MB,)
(所以我们让它从柱面51开始(卷头需要从柱面0开始,记得么?),并让它在柱面101结束,这样)
(大小约为50MB(误差在1-5MB上下)。)

Command (m for help): d
Partition number (1-16): 9

(删除第9分区(SGI卷头))

Command (m for help): n
Partition number (1-16): 9
First cylinder (0-50, default 0): 0
 Last cylinder (0-50, default 50): 50

(重新创建第9分区,正好在第1分区前结束)

如果你不确定怎样使用fdisk,看一看下面Cobalts的分区指令。概念是完全一样的——只是要记得不要动卷头和whole disk分区。

这些完成后,你就可以任意创建其他的分区了。当所有的分区划分完毕后,记得把交换分区的ID改为82,也就是Linux Swap。如果不改,ID将为83,Linux Native。

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

Cobalt机器:为你的磁盘分区

在Cobalt机器上,BOOTROM期望看到一个MS-DOS主引导扇区,所以分区是相对简单的——实际上,这和在Inter x86机器上分区是一样的。不过你要记得一些事情。

  • Cobalt固件要求/dev/sda1是一个格式化为EXT2 Revision 0的Linux分区。不可以是EXT2 Revision 1!(Cobalt BOOTROM只能理解EXT2r0)
  • 前面说到的分区的根目录里必须有一个gzip压缩的ELF镜像,vmlinux.gz,它将会作为内核被加载

因为这个原因,我建议创建一个大约20MB的/boot分区,格式化为EXT2r0,以供你在里面安装CoLo和你的内核。这样你就能在你的根文件系统上运行一个现代文件系统(EXT3或者ReiserFS)。

我下面将假设你已经创建了/dev/sda1以便后来加载作为/boot分区。如果你希望把它作为/,你需要记得PROM的要求。

好了,我们继续……要创建分区,你在命令行提示符处键入fdisk /dev/sda。你需要知道的主要命令有这些:

  • o:清除旧的分区表,开启一个新的空MS-DOS分区表
  • n:新分区
  • t:改变分区类型
    • 欲改为Linux Swap键入82,改为Linux FS键入83
  • d:删除分区
  • p:显示分区表
  • q:退出——不改动旧分区表。
  • w:退出——把当前分区表写入磁盘。

代码 3.3: 为磁盘分区

# fdisk /dev/sda

The number of cylinders for this disk is set to 19870.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

(开始先清除所有已有的分区)
Command (m for help): o
Building a new DOS disklabel. Changes will remain in memory only,
until you decide to write them. After that, of course, the previous
content won't be recoverable.


The number of cylinders for this disk is set to 19870.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

(现在你可以用'p'命令来检验分区表已经空了)

Command (m for help): p

Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

   Device Boot      Start         End      Blocks   Id  System

(创建/boot分区)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1

(这里只需要按回车来接受默认值)

First cylinder (1-19870, default 1):
Last cylinder or +size or +sizeM or +sizeK (1-19870, default 19870): +20M

(现在如果我们再打'p',我们应该看到新分的区)
Command (m for help): p

Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1               1          40       20128+  83  Linux

(剩余的,我喜欢放到扩展分区里,所以我创建扩展分区)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
e
Partition number (1-4): 2

(一样,默认值就可以了,只需按回车。)

First cylinder (41-19870, default 41):
Using default value 41

(这里我们希望用整个磁盘,所以只需再次按回车)
Last cylinder or +size or +sizeM or +sizeK (41-19870, default 19870):
Using default value 19870

(现在,/分区——我使用独立分区挂载/usr、/var等……所以/可以很小。根据你自己的喜好来调节。)

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (41-19870, default 41):<Press ENTER>
Using default value 41
Last cylinder or +size or +sizeM or +sizeK (41-19870, default 19870): +500M

(……所有其他分区创建方法类似……)

(最后,交换分区。我推荐至少250MB的交换分区,最好是1GB)

Command (m for help): n
Command action
   l   logical (5 or over)
   p   primary partition (1-4)
l
First cylinder (17294-19870, default 17294): <Press ENTER>
Using default value 17294
Last cylinder or +size or +sizeM or +sizeK (1011-19870, default 19870): <Press ENTER>
Using default value 19870

(如果我们现在检查我们的分区表,所有的分区已经就绪了,除了一件事……

Command (m for help): p

Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Device Boot      Start         End      Blocks      ID  System
/dev/sda1               1          21       10552+  83  Linux
/dev/sda2              22       19870    10003896    5  Extended
/dev/sda5              22        1037      512032+  83  Linux
/dev/sda6            1038        5101     2048224+  83  Linux
/dev/sda7            5102        9165     2048224+  83  Linux
/dev/sda8            9166       13229     2048224+  83  Linux
/dev/sda9           13230       17293     2048224+  83  Linux
/dev/sda10          17294       19870     1298776+  83  Linux

(注意第10分区,我们的交换分区仍然是类型83?)

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

(这样就可以修正了……为了验证,我们再看一下……)

Command (m for help): p

Disk /dev/sda: 10.2 GB, 10254827520 bytes
16 heads, 63 sectors/track, 19870 cylinders
Units = cylinders of 1008 * 512 = 516096 bytes

Device Boot      Start         End      Blocks      ID  System
/dev/sda1               1          21       10552+  83  Linux
/dev/sda2              22       19870    10003896    5  Extended
/dev/sda5              22        1037      512032+  83  Linux
/dev/sda6            1038        5101     2048224+  83  Linux
/dev/sda7            5102        9165     2048224+  83  Linux
/dev/sda8            9166       13229     2048224+  83  Linux
/dev/sda9           13230       17293     2048224+  83  Linux
/dev/sda10          17294       19870     1298776+  82  Linux Swap

(现在,我们写入新的分区表。)

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

#

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

4.d. 创建文件系统

文件系统

有几种文件系统是可以使用的。ReiserFS、Ext2和Ext3在MIPS架构上是稳定的。其他的文件系统都是实验性质的。

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/sda1)为ext2和根分区(本例中的/dev/sda3)为ext3,应该这样做:

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

# mke2fs /dev/sda1
# mke2fs -j /dev/sda3

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

警告: 如果你在Cobalt服务器上安装,记得/dev/sda1必须是EXT2 revision 0;所有其他文件系统(比如EXT2 revision 1、EXT3、ReiserFS、XFS、JFS还有其他的)都不行!你可以用这个命令来格式化:mke2fs -r 0 /dev/sda1

激活交换分区

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

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

# mkswap /dev/sda2

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

代码 4.3: 激活交换分区

# swapon /dev/sda2

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

4.e. 挂载

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

代码 5.1: 挂载分区

# mount /dev/sda3 /mnt/gentoo
# mkdir /mnt/gentoo/boot
# mount /dev/sda1 /mnt/gentoo/boot

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

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

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


[ << ] [ < ] [ 主页 ] [ > ] [ >> ]


打印

查看全部

更新于2009年 7月 11日

总结: 为了能够安装Gentoo,你必须创建必要的分区。本章解释了怎样将磁盘分区,以便以后使用。

Sven Vermeulen
作者

Grant Goodyear
作者

Roy Marples
作者

Daniel Robbins
作者

Chris Houser
作者

Jerry Alexandratos
作者

Seemant Kulleen
Gentoo x86开发人员

Tavis Ormandy
Gentoo Alpha开发人员

Jason Huebel
Gentoo AMD64开发人员

Guy Martin
Gentoo HPPA开发人员

Pieter Van den Abeele
Gentoo PPC开发人员

Joe Kallar
Gentoo SPARC开发人员

John P. Davis
编辑

Pierre-Henri Jondot
编辑

Eric Stockbridge
编辑

Rajiv Manglani
编辑

Jungmin Seo
编辑

Stoyan Zhekov
编辑

Jared Hudson
编辑

Colin Morey
编辑

Jorge Paulo
编辑

Carl Anderson
编辑

Jon Portnoy
编辑

Zack Gilburd
编辑

Jack Morgan
编辑

Benny Chuang
编辑

Erwin
编辑

Joshua Kinard
编辑

Stuart Longland
编辑

Tobias Scherbaum
编辑

Xavier Neys
编辑

Joshua Saddler
编辑

Gerald J. Normandin Jr.
审校

Donnie Berkholz
审校

Ken Nowack
审校

Lars Weiler
投稿

张乐
译者

杨珂
译者

叶宝泰
译者

杨小广
译者

vivian.ye
译者

余雷
译者

陈永骥
译者

王国辉
译者

娄东斌
译者

贾震
译者

余鈺炜
译者

陈代焱
译者

范华
译者

沈辰俊
译者

Donate to support our development efforts.

Support OSL
Gentoo Centric Hosting: vr.org
Tek Alchemy
SevenL.net
Global Netoptex Inc.
Bytemark
Edurium
Copyright 2001-2010 Gentoo Foundation, Inc. Questions, Comments? Contact us.