Linux 分区 HOWTO

Anthony Lissot

修订历史
修订 3.52005 年 12 月 26 日
重新组织了文档页面顺序。添加了关于设置交换空间的页面。添加了分区标签页面。更新了第 4 节中的最大交换空间值。添加了关于创建 ext2/3 文件系统的说明。修复了 Richard Calmbach 识别的断开链接。创建了 XML 版本。
修订 3.4.42004 年 3 月 8 日
同步了 SGML 版本和 HTML 版本。更新了 lilo 的位置和交换空间讨论。
修订 3.32003 年 4 月 4 日
同步了 SGML 和 HTML 版本
修订 3.32001 年 7 月 10 日
更正了第 6 节,柱面号的计算
修订 3.22000 年 9 月 1 日
Dan Scott 于 2000 年 10 月 2 日提供 sgml 转换。重写了简介。重写了逻辑设备中关于设备名称的讨论。重新组织了分区类型。编辑了分区要求。添加了恢复已删除分区表的内容。
修订 3.12000 年 6 月 12 日
更正了分区要求中的交换空间限制,更新了简介中的各种链接,在如何使用 fdisk 分区中添加了提交的示例,在分区要求中添加了文件系统讨论。
修订 3.02000 年 5 月 1 日
Anthony Lissot 基于 Kristian Koehntopp 的 Linux 分区 HOWTO 进行了首次修订。
修订 2.41997 年 11 月 3 日
Kristian Koehntopp 的最后一次修订。

这个 Linux Mini-HOWTO 教你如何在 IDE 和 SCSI 硬盘驱动器上规划和创建分区。它讨论了分区术语,并考虑了大小和位置问题。涵盖了使用 fdisk 分区实用程序创建和恢复分区表。本文档的最新版本在此。土耳其语翻译在此


目录
1. 简介
1.1. 什么是分区?
1.2. 其他分区软件:
1.3. 相关 HOWTO
1.4. 关于您系统的其他信息:
2. 设备
2.1. 设备名称
2.2. 设备号
3. 分区类型
3.1. 分区类型
3.2. 外部分区类型
3.3. 主分区
3.4. 逻辑分区
3.5. 交换分区
4. 分区要求
4.1. 我需要什么分区?
4.2. 讨论:
4.3. 文件系统
4.4. 交换分区大小
5. 使用 fdisk 分区
5.1. fdisk 用法
5.2. 四个主分区
5.3. 混合主分区和逻辑分区
5.4. 提交的示例
6. 标签
6.1. 卷标
6.2. 设备标签
7. 格式化 ext2/3 分区
.1. 简单调用
.2. 保留块
8. 恢复已删除的分区表
9. 设置交换空间
9.1. 交换分区
9.2. 交换文件
9.3. 多个交换区
10. 附录
10.1. 格式化分区
10.2. 激活交换空间
10.3. 挂载分区
10.4. 关于文件系统和碎片的一些事实

1. 简介

1.1. 什么是分区?

分区是将单个硬盘驱动器划分为多个逻辑驱动器的一种手段。分区是驱动器上的一组连续的块,被视为独立的磁盘。分区表(这是本 HOWTO 的主题)是一个索引,它将硬盘驱动器的各个部分与分区关联起来。

为什么要使用多个分区?

  • 封装您的数据。由于文件系统损坏是分区本地的,如果发生意外,您只会丢失部分数据。

  • 提高磁盘空间效率。您可以根据您的使用情况,使用不同块大小格式化分区。如果您的数据由大量小文件(小于 1k)组成,而您的分区使用 4k 大小的块,那么您将为每个文件浪费 3k 空间。一般来说,对于每个文件,您平均浪费半个块的空间,因此如果您有很多文件,将块大小与文件的平均大小相匹配非常重要。

  • 限制数据增长。失控的进程或疯狂的用户可能会消耗大量磁盘空间,以至于操作系统在硬盘驱动器上不再有空间进行簿记操作。这将导致灾难。通过隔离空间,您可以确保在分配的磁盘空间耗尽时,除了操作系统之外的其他东西会崩溃。


1.2. 其他分区软件

  • sfdisk:fdisk 的命令行版本

  • cfdisk:fdisk 的基于 curses 的版本

  • parted:Gnu 分区编辑器

  • Partition Magic:一个商业实用程序,用于创建、调整大小、合并和转换分区,而不会破坏数据。

  • Disk Drake:一个 Perl/Gtk 程序,用于创建、调整大小和删除分区


1.3. 相关 HOWTO

表 1. 相关 HOWTO

标题作者描述
双启动安装策略 Gjoen Stein 如何估计文件系统不同部分的不同大小和速度要求。
Linux 多磁盘系统调优Gjoen Stein如何估计文件系统不同部分的不同大小和速度要求。
Linux 大磁盘 Andries Brouwer 关于超过 1024 个柱面的磁盘的说明和注意事项
Linux 磁盘配额 Ralf van Dooren 关于限制每个用户磁盘空间使用量(配额)的说明
Partition-Rescue mini-HOWTO Jean-Daniel Dodin 如何在 Windows 安装后恢复已删除的 linux 分区。似乎不保留数据。
Linux ADSM 备份 Thomas Koenig 关于将 Linux 集成到 IBM ADSM 备份环境中的说明。
使用 MSDOS 进行 Linux 备份 Christopher Neufeld 关于 MS-DOS 驱动的 Linux 备份的信息。
Linux HOWTO 索引Tim Bynum关于编写和提交 HOWTO 文档的说明


1.4. 关于您系统的其他信息


2. 设备

Linux 使用特殊的命名法来指代硬盘驱动器分区,为了理解后续页面的讨论,必须理解这种命名法。

在 Linux 中,分区由设备文件表示。这些是位于/dev中的虚拟文件。以下是一些条目

brw-rw----    1 root     disk       3,   0 May  5  1998 hda
brw-rw----    1 root     disk       8,   0 May  5  1998 sda
crw-------    1 root     tty        4,  64 May  5  1998 ttyS0
设备文件是类型为 c(对于“字符”设备,不使用缓冲区缓存的设备)或 b(对于“块”设备,通过缓冲区缓存的设备)的文件。在 Linux 中,所有磁盘都只表示为块设备。


2.1. 设备名称

2.1.1. 命名约定

按照惯例,IDE 驱动器将被赋予设备名称/dev/hda/dev/hdd动器 A (/dev/hda) 是第一个驱动器,动器 C (/dev/hdc) 是第三个。

表 2. IDE 控制器命名约定

驱动器名称驱动器控制器驱动器编号
/dev/hda11
/dev/hdb12
/dev/hdc21
/dev/hdd22

典型的 PC 有两个 IDE 控制器,每个控制器可以连接两个驱动器。例如,/dev/hda是第一个 IDE 控制器上的第一个驱动器(主盘),/dev/hdd是第二个控制器(从盘)上的第二个驱动器(计算机中的第四个 IDE 驱动器)。

您可以直接写入这些设备(使用 catdd)。但是,由于这些设备代表整个磁盘,从第一个块开始,您可能会错误地覆盖主引导记录和分区表,这将使驱动器无法使用。

表 3. 分区名称

驱动器名称驱动器控制器驱动器编号分区类型分区号
/dev/hda111主分区1
/dev/hda211主分区2
/dev/hda311主分区3
/dev/hda411交换分区NA
/dev/hdb112主分区1
/dev/hdb212主分区2
/dev/hdb312主分区3
/dev/hdb412主分区4

一旦驱动器被分区,分区将以名称末尾的数字表示。例如,第二个驱动器上的第二个分区将是/dev/hdb2。上表列出了分区类型(主分区)以求清晰,尽管该概念直到第 3.3 节才解释。

表 4. SCSI 驱动器

驱动器名称驱动器控制器驱动器编号分区类型分区号
/dev/sda116主分区1
/dev/sda216主分区2
/dev/sda316主分区3

SCSI 驱动器遵循类似的模式;它们用 'sd' 而不是 'hd' 表示。因此,第二个 SCSI 驱动器的第一个分区将是/dev/sdb1。在上表中,驱动器编号被任意选择为 6,以介绍 SCSI ID 号在 linux 下不映射到设备名称的想法。


2.1.2. 名称分配

在 (Sun) Solaris 和 (SGI) IRIX 下,赋予 SCSI 驱动器的设备名称与其插入位置有关。在 linux 下,只有哀号和咬牙切齿。

之前

SCSI ID #2        SCSI ID #5       SCSI ID #7        SCSI ID #8
 /dev/sda          /dev/sdb         /dev/sdc          /dev/sdd

之后

SCSI ID #2                         SCSI ID #7        SCSI ID #8
 /dev/sda                           /dev/sdb          /dev/sdc

SCSI 驱动器具有从 1 到 15 的 ID 号。较低的 SCSI ID 号被分配较低的字母顺序。例如,如果您有两个编号为 2 和 5 的驱动器,则 #2 将是/dev/sda,#5 将是/dev/sdb。如果您移除其中任何一个,所有编号较高的驱动器将在您下次启动时被重命名。

如果您的 linux 机器中有两个 SCSI 控制器,您需要检查 /bin/dmesg 的输出,以查看每个驱动器被分配了什么名称。如果您移除两个控制器中的一个,剩余的控制器可能会将其所有驱动器重命名。可恶...

有两种解决方法;都涉及使用程序在每个分区上放置标签(请参阅第 6 节)。即使设备物理移动,标签也是持久的。然后,您可以直接或间接地通过标签引用分区。


2.1.3. 逻辑分区

表 5. 逻辑分区

驱动器名称驱动器控制器驱动器编号分区类型分区号
/dev/hdb112主分区1
/dev/hdb212扩展分区NA
/dev/hda512逻辑分区2
/dev/hdb612逻辑分区3

上表说明了名称分配中一个神秘的跳跃。这是由于使用了逻辑分区(请参阅第 3.4 节),逻辑分区总是从 5 开始,原因稍后解释。

这就是您处理 linux 磁盘设备所需要知道的一切。为了完整起见,请参阅 Kristian 在下面对设备号的讨论。


2.2. 设备号

设备文件唯一重要的是其主设备号和次设备号,它们显示为代替文件大小

$ ls -l /dev/hda

表 6. 设备文件属性

brw-rw----1rootdisk3,0Jul 18 1994/dev/hda
权限 所有者主设备号次设备号日期设备名称

当访问设备文件时,主设备号选择哪个设备驱动程序被调用来执行输入/输出操作。此调用使用次设备号作为参数完成,次设备号如何被解释完全取决于驱动程序。驱动程序文档通常描述驱动程序如何使用次设备号。对于 IDE 磁盘,此文档位于 /usr/src/linux/Documentation/ide.txt。对于 SCSI 磁盘,人们会期望在 /usr/src/linux/Documentation/scsi.txt中找到此类文档,但实际上没有。必须查看驱动程序源代码才能确定( /usr/src/linux/driver/scsi/sd.c:184-196)。幸运的是,Peter Anvin 在 /usr/src/linux/Documentation/devices.txt中有一个设备号和名称列表;请参阅块设备、主设备号 3、22、33、34(用于 IDE)和主设备号 8(用于 SCSI 磁盘)的条目。主设备号和次设备号各占一个字节,这就是为什么每个磁盘的分区数量受到限制的原因。


3. 分区类型

3.1. 分区类型

分区被标记为托管某种类型的文件系统(不要与卷标混淆(请参阅第 6 节))。这样的文件系统可以是 linux 标准 ext2 文件系统或 linux 交换空间,甚至可以是外部文件系统,如 (Microsoft) NTFS 或 (Sun) UFS。每个分区类型都关联一个数字代码。例如,ext2 的代码是0x83,linux 交换空间的代码是0x82。要查看分区类型及其代码的列表,请执行/sbin/sfdisk -T


3.2. 外部分区类型

分区类型代码是任意选择的(您无法弄清楚它们应该是什么),并且它们特定于给定的操作系统。因此,理论上,如果您使用两个操作系统使用相同的硬盘驱动器,则相同的代码可能用于指定两种不同的分区类型。OS/2 使用 0x07 类型标记其分区,Windows NT 的 NTFS 也是如此。MS-DOS 为其各种 FAT 文件系统分配了多个类型代码:0x01、0x04 和 0x06 是已知的。DR-DOS 使用 0x81 来指示受保护的 FAT 分区,从而在当时与 Linux/Minix 发生类型冲突,但 Linux/Minix 和 DR-DOS 都不再被广泛使用。

OS/2 使用0x07类型标记其分区,Windows NT 的 NTFS 也是如此。MS-DOS 为其各种 FAT 文件系统分配了多个类型代码:0x01、0x040x06是已知的。DR-DOS 使用0x81来指示受保护的 FAT 分区,从而在当时与 Linux/Minix 发生类型冲突,但 Linux/Minix 和 DR-DOS 都不再被广泛使用。


3.3. 主分区

基于 Intel 的系统上的分区数量从一开始就受到限制:原始分区表作为引导扇区的一部分安装,并且只为四个分区条目保留了空间。这些分区现在称为主分区。


3.4. 逻辑分区

硬盘驱动器的一个主分区可以被再分区。这些是逻辑分区。这有效地允许我们绕过历史性的四个分区限制。

用于容纳逻辑分区的主分区称为扩展分区,它有自己的文件系统类型 (0x05)。与主分区不同,逻辑分区必须是连续的。每个逻辑分区都包含指向下一个逻辑分区的指针,这意味着逻辑分区的数量是无限的。但是,linux 对驱动器上任何类型分区的总数施加了限制,因此这有效地限制了逻辑分区的数量。在 SCSI 磁盘上最多为 15 个分区,在 IDE 磁盘上最多为 63 个分区。


3.5. 交换分区

计算机上运行的每个进程都分配了许多 RAM 块。这些块称为页。在不久的将来将被处理器引用的内存页集合称为“工作集”。Linux 尝试预测这些内存访问(假设最近使用的页面将在不久的将来再次使用),并在可能的情况下将这些页面保留在 RAM 中。

如果机器上运行的进程过多,内核将尝试通过将页面写入磁盘来释放 RAM。这就是交换空间的用途。它有效地增加了您可以使用的内存量。但是,磁盘 I/O 比从 RAM 读取和写入 RAM 慢大约一百倍。将此视为紧急内存,而不是额外的内存。

如果内存变得如此稀缺,以至于内核从一个进程的工作集中分页出去,以便为另一个进程分页进来,则称该机器正在抖动。一些读者可能不经意地经历过这种情况:硬盘驱动器疯狂地运转,但计算机速度慢到无法使用。交换空间是您需要拥有的东西,但它不能替代足够的 RAM。有关确定您需要的交换空间大小的提示,请参阅第 4.4 节中的讨论。


4. 分区要求

4.1. 我需要什么分区?

对于引导驱动器:如果您想从您即将分区的驱动器引导您的操作系统,您将需要

  • 一个主分区

  • 一个或多个交换分区

  • 零个或多个主/逻辑分区

对于任何其他驱动器

  • 一个或多个主/逻辑分区

  • 零个或多个交换分区


4.2. 讨论

引导分区

您的引导分区应该是主分区,而不是逻辑分区。这将简化灾难发生时的恢复,但这在技术上不是必需的。它必须是类型0x83“Linux native”。如果您使用的是 21-3 之前的 lilo 版本(即,来自 1990 年代),您的引导分区必须包含在驱动器的前 1024 个柱面内。(通常,引导分区只需要包含内核映像。)

如果您有多个引导分区(例如来自其他操作系统),请将它们全部保留在前 1024 个柱面内(所有 DOS 分区都必须在前 1024 个柱面内)。如果您使用的是现代版本的 lilo,或除了 lilo 以外的其他方式来加载您的内核(例如,引导盘或基于 MS-DOS 的 Linux 加载器 LOADLIN.EXE),则分区可以位于任何位置。有关详细信息,请参阅 Large-disk HOWTO。

交换分区

除非您交换到文件(请参阅第 9.2 节),否则您将需要一个专用的交换分区。它必须是类型0x82“Linux swap”。它可以放置在磁盘上的任何位置(但请参阅第 4.4.3 节)。主分区或逻辑分区都可以用作交换分区。一个驱动器上可以存在多个交换分区。总共允许 8 个(跨驱动器)。请参阅下面关于交换空间大小的注释(第 4.4 节)。

逻辑分区

必须使用单个主分区作为逻辑分区的容器(扩展分区)。扩展分区可以放置在磁盘上的任何位置。逻辑分区必须是连续的,但不必填充扩展分区。


4.3. 文件系统

4.3.1. 哪些文件系统需要自己的分区?

您的 linux 文件系统中的所有内容都可以放在同一个(单个)分区中。但是,在某些情况下,您可能希望限制某些文件系统的增长。例如,如果您的邮件假脱机目录与您的根文件系统在同一个分区中,并且它填满了分区中的剩余空间,您的计算机基本上会挂起。

/var

此文件系统包含假脱机目录,例如邮件和打印的假脱机目录。此外,它还包含错误日志目录。如果您的机器是服务器并且出现长期错误,这些消息可能会填满分区。服务器计算机应该将 /var 放在与 / 不同的分区中。

/usr

这是大多数可执行二进制文件所在的位置。此外,内核源代码树也在这里,还有大量文档。

/tmp

一些程序在此处写入临时数据文件。通常,它们很小。但是,如果您运行计算密集型作业,例如科学或工程应用程序,则在短时间内可能需要数百兆字节。在这种情况下,将 /tmp 保留在与 / 不同的分区中。

/home

这是用户主目录所在的位置。如果您不对用户施加配额,则应将其放在自己的分区中。

/boot

这是您的内核映像所在的位置。有关旧系统上的放置位置,请参见上面的讨论。


4.3.2. 文件生命周期和备份周期作为分区标准

对于 ext2,分区决策应受备份考虑因素的约束,并避免来自不同文件生命周期的外部碎片第 10.4 节

文件有生命周期。创建文件后,它将在系统上保留一段时间,然后被删除。文件生命周期在整个系统中差异很大,并且部分取决于文件的路径名。例如,在/bin, /sbin, /usr/sbin, /usr/bin和类似目录中的文件可能具有很长的生命周期:数月及以上。在/home中的文件可能具有中等的生命周期:几周左右。在/var中的文件通常是短寿命的:/var/spool/news中几乎没有文件会保留超过几天,/var/spool/lpd中的文件以分钟或更短的时间来衡量其生命周期。

对于备份,如果每日备份量小于单个备份介质的容量,则很有用。每日备份可以是完整备份或增量备份。

您可以决定使您的分区大小足够小,以便它们完全适合一个备份介质(选择每日完整备份)。在任何情况下,分区都应该足够小,使其每日增量(所有修改的文件)适合一个备份介质(选择增量备份,并期望为每周/每月完整转储更换备份介质 - 无法进行无人值守操作)。

您的备份策略取决于该决定。

在规划和购买磁盘空间时,请记住留出足够的资金用于备份!未备份的数据毫无价值!几乎对于每个人来说,数据复制成本都远高于备份成本!

为了性能,将不同生命周期的文件保存在不同的分区上很有用。这样,新闻分区上的短寿命文件可能会被严重碎片化。这对//home分区的性能没有影响。


4.4. 交换分区

4.4.1. 我的交换空间应该有多大?

传统观点是创建与 RAM 大小相等的交换空间。

但请记住,这只是一种经验法则。很容易创建程序具有极大或极小工作集的情况(请参阅第 3.5 节)。例如,具有以非常随机的方式访问的大型数据集的模拟程序在其数据段中几乎没有明显的局部引用,因此其工作集将非常大。

另一方面,一个图形程序同时打开了许多 JPEG,除了一个图标化之外的所有 JPEG,将有一个非常大的数据段。但是图像变换都是在一个图像上完成的,程序占用的大部分内存都没有被访问。对于具有许多编辑器窗口的编辑器也是如此,其中一次只修改一个窗口。这些程序 - 如果它们设计得当 - 具有非常高的局部引用,并且它们的大部分可以保持交换出去,而不会对性能造成太大的影响。一个一旦启动程序就永远不会退出的用户会想要大量的交换空间,原因相同。

服务器通常配置的交换空间比其桌面对应物更多。即使给定的交换量足以满足其操作,服务器也可能承受瞬时重负载,这会导致它以高速率分页输出。一些管理员更喜欢这样而不是服务器完全崩溃。在这些情况下,交换空间可能是 ram 大小的数倍。


4.4.2. 我的交换空间可以有多大?

目前,交换分区的最大大小取决于架构。对于 i386、m68k、ARM 和 PowerPC,它“官方”为 2Gb。在 alpha 上为 128Gb,在 sparc 上为 1Gb,在 sparc64 上为 3Tb。2.6 内核上的 opteron 可以写入 16 Tb 的交换分区。对于 linux 内核 2.1 及更早版本,限制为 128Mb。分区可能大于 128 MB,但从未使用过超出部分的空间。如果您想要超过 128 MB 的交换空间用于 2.1 及更早版本的内核,则必须创建多个交换分区(最多 8 个)。在 2.4 之后,“官方”上可能存在 32 个交换区。有关详细信息,请参阅设置交换空间。

脚注: “官方”最大交换空间大小:对于内核 2.4,限制为 64 个交换空间,每个交换空间最大为 64Gb,尽管这并未反映在 mkswap 的手册页中。对于 2.6 内核上的 64 位 opteron,允许 128 个交换区,每个交换区高达 16 Tb!(感谢 Peter Chubb 的计算)


4.4.3. 我应该把我的交换空间放在哪里?

简短的答案是任何地方都可以。但是,如果您有兴趣尽可能地提高速度,则有两种基本策略(除了购买更多 RAM)。

  • 将交换空间分布在多个驱动器上,或者至少分布在您写入最少的驱动器上。

  • 将每个交换分区放在外磁道上。

以下是注意事项

  • 如果您有一个具有多个磁头的磁盘和一个具有较少磁头的磁盘,并且两者在其他参数上相同,则具有多个磁头的磁盘将更快。从不同的磁头读取数据速度很快,因为它是纯电子的。从不同的磁道读取数据速度很慢,因为它涉及物理移动磁头。

    因此,在单独的驱动器上写入交换空间将比在单个驱动器上来回移动磁头更快。

  • 放置:较旧的磁盘在所有磁道上都具有相同数量的扇区。对于这些磁盘,假设您的磁盘磁头将从随机磁道向交换区移动,将交换空间放在磁盘中间将是最快的。

  • 较新的磁盘使用 ZBR(区域位记录)。它们在外磁道上具有更多扇区。在恒定的 rpm 数下,这在外磁道上产生的性能远高于内磁道。将您的交换空间放在快速磁道上。(一般来说,编号较低的柱面与较低的分区号相关联。但是,请参阅 Kristian 最近关于此问题的评论。-Tony)

  • 用法:当然,您的磁盘磁头不会随机移动。如果您的交换空间位于磁盘中间,位于 постоянно 繁忙的 home 分区和几乎未使用的 archive 分区之间,那么如果您的交换空间靠近 home 分区,则可以获得更短的磁头移动时间,这将更好。但是,如果您将交换空间放在另一个原本未使用的磁盘上,则会更好。

  • 条带化:可以通过同时写入多个交换区来提高速度。具有相同优先级的交换空间将像 RAID 一样写入。请参阅第 9.3 节

总结: 将您的交换空间放在快速磁盘上,该磁盘具有多个磁头,并且不忙于做其他事情。如果您有多个磁盘:分割交换空间并将其分散在所有磁盘甚至不同的控制器上。


5. 使用 fdisk 分区

本节向您展示如何使用 fdisk 实用程序实际对硬盘驱动器进行分区。Linux 只允许 4 个主分区。您可以通过细分其中一个主分区来拥有更多的逻辑分区。只有一个主分区可以被细分。

示例

  1. 四个主分区(请参阅第 5.2 节

  2. 混合主分区和逻辑分区(请参阅第 5.3 节


5.1. fdisk 用法

通过键入(以 root 身份)启动 fdiskfdisk 设备在命令提示符下。设备可能是类似/dev/hda/dev/sda的内容(请参阅第 2.1.1 节)。您需要的基本 fdisk 命令是

p打印分区表

n创建新分区

d删除分区

q退出而不保存更改

w写入新分区表并退出

您对分区表所做的更改在您发出写入 (w) 命令之前不会生效。这是一个示例分区表

Disk /dev/hdb: 64 heads, 63 sectors, 621 cylinders
Units = cylinders of 4032 * 512 bytes
 
   Device Boot    Start       End    Blocks   Id  System
/dev/hdb1   *         1       184    370912+  83  Linux
/dev/hdb2           185       368    370944   83  Linux
/dev/hdb3           369       552    370944   83  Linux
/dev/hdb4           553       621    139104   82  Linux swap
第一行显示了硬盘驱动器的几何结构。它可能在物理上不准确,但您可以接受它,就好像它是准确的一样。此示例中的硬盘驱动器由 32 个双面盘片组成,每面有一个磁头(可能不是真的)。每个盘片有 621 个同心磁道。3 维磁道(所有磁盘上的同一磁道)称为柱面。每个磁道分为 63 个扇区。每个扇区包含 512 字节的数据。因此,分区表中的块大小为 64 个磁头 * 63 个扇区 * 512 字节 ... 除以 1024。(有关此计算问题的讨论,请参阅4。)起始值和结束值是柱面。


5.2. 四个主分区

概述

确定您的交换空间大小(请参阅第 4.4 节)以及它应该放在哪里(请参阅第 4.4.3 节)。将剩余空间划分为其他三个分区。

示例

我从 shell 提示符启动 fdisk

# fdisk /dev/hdb 
这表明我正在使用 IDE 控制器上的第二个驱动器。(参见 第 2.1 节。)当我打印(空的)分区表时,我只得到配置信息。
Command (m for help): p

Disk /dev/hdb: 64 heads, 63 sectors, 621 cylinders
Units = cylinders of 4032 * 512 bytes
我知道我有一个 1.2Gb 的驱动器,但现在我真的知道了:64 * 63 * 512 * 621 = 1281982464 字节。我决定为交换空间保留 128Mb 的空间,剩下 1153982464。如果我使用主分区之一作为交换空间,这意味着我剩下三个用于 ext2 分区。平均分配,每个分区为 384Mb。现在我开始工作了。
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-621, default 1):<RETURN>
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-621, default 621): +384M
接下来,我设置想要用于交换空间的分区
Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (197-621, default 197):<RETURN>
Using default value 197
Last cylinder or +size or +sizeM or +sizeK (197-621, default 621): +128M
现在分区表看起来像这样
   Device Boot    Start       End    Blocks   Id  System
/dev/hdb1             1       196    395104   83  Linux
/dev/hdb2           197       262    133056   83  Linux
我以与第一个分区相同的方式设置了剩余的两个分区。最后,我使第一个分区可引导
Command (m for help): a
Partition number (1-4): 1
我将第二个分区设置为交换类型
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)      
Command (m for help): p
最终结果
Disk /dev/hdb: 64 heads, 63 sectors, 621 cylinders
Units = cylinders of 4032 * 512 bytes
 
   Device Boot    Start       End    Blocks   Id  System
/dev/hdb1   *         1       196    395104+  83  Linux
/dev/hdb2           197       262    133056   82  Linux swap
/dev/hdb3           263       458    395136   83  Linux
/dev/hdb4           459       621    328608   83  Linux          
最后,我发出写入命令 (w) 将表写入磁盘。

侧面主题


5.3. 混合主分区和逻辑分区

概述: 创建一个主分区,用它来容纳所有额外的分区。然后在其中创建逻辑分区。在创建逻辑分区之前或之后创建其他主分区。

示例

我从 shell 提示符启动 fdisk

# fdisk /dev/sda
这表明我正在使用 SCSI 链上的第一个驱动器。(参见 第 2.1 节。)

首先我弄清楚我想要多少个分区。我知道我的驱动器有 183Gb 的容量,我想要 26Gb 的分区(因为我碰巧有大约这个大小的备份磁带)。

183Gb / 26Gb = 大约 7

所以我需要 7 个分区。即使 fdisk 接受以 Mb 和 Kb 表示的分区大小,我还是决定计算每个分区最终将占用的柱面数,因为 fdisk 报告的起始点和停止点是以柱面为单位的。当我输入 fdisk 时,我看到我有 22800 个柱面。

> The number of cylinders for this disk is set to 22800.  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., LILO) 2) booting and partitioning software from other
> OSs  (e.g., DOS FDISK, OS/2 FDISK)
因此,22800 个总柱面除以七个分区,每个分区为 3258 个柱面。每个分区大约长 3258 个柱面。我忽略了警告消息,因为这不是我的引导驱动器(第 4 节)。

由于我有 4 个主分区,其中 3 个可以长 3258 个柱面。扩展分区必须长 (4 * 3258) 或 13032 个柱面才能容纳 4 个逻辑分区。

我输入以下命令来设置 3 个主分区中的第一个(我键入的内容以粗体显示)

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-22800, default 1): <RETURN>
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-22800, default 22800): 3258
最后一个分区是扩展分区
Partition number (1-4): 4
First cylinder (9775-22800, default 9775): <RETURN>
Using default value 9775
Last cylinder or +size or +sizeM or +sizeK (9775-22800, default 22800): <RETURN>
Using default value 22800
当我发出打印表命令时,结果是
/dev/sda1             1      3258  26169853+  83  Linux
/dev/sda2          3259      6516  26169885   83  Linux
/dev/sda3          6517      9774  26169885   83  Linux
/dev/sda4          9775     22800 104631345    5  Extended
接下来,我将扩展分区分割成 4 个逻辑分区,从第一个逻辑分区开始,分成 3258 柱面的段。逻辑分区自动从 /dev/sda5 开始。
Command (m for help):  n
First cylinder (9775-22800, default 9775): <RETURN>
Using default value 9775
Last cylinder or +size or +sizeM or +sizeK (9775-22800, default 22800): 13032
最终结果是
   Device Boot    Start       End    Blocks   Id  System
/dev/sda1             1      3258  26169853+  83  Linux
/dev/sda2          3259      6516  26169885   83  Linux
/dev/sda3          6517      9774  26169885   83  Linux
/dev/sda4          9775     22800 104631345    5  Extended
/dev/sda5          9775     13032  26169853+  83  Linux
/dev/sda6         13033     16290  26169853+  83  Linux
/dev/sda7         16291     19584  26459023+  83  Linux
/dev/sda8         19585     22800  25832488+  83  Linux
最后,我发出写入命令 (w) 将表写入磁盘。为了使分区可用,我将必须格式化(第 10.1 节)每个分区,然后挂载(第 10.3 节)它。


5.4. 提交的示例

我想提交我的分区布局,因为它适用于任何 Linux 发行版(即使是大型基于 RPM 的发行版)。我有一个硬盘驱动器... 恰好是 10 GB。 Windows 看不到超过 9.3 GB 的容量,但 Linux 可以看到所有容量并使用所有容量。它也具有远超过 1024 个柱面。

表 7. 分区布局示例

分区挂载点大小
/dev/hda1/boot(15 兆字节)
/dev/hda2Windows 98 分区(2 千兆字节)
/dev/hda3扩展分区(不适用)
/dev/hda5交换空间(64 兆字节)
/dev/hda6/tmp(50 兆字节)
/dev/hda7/(150 兆字节)
/dev/hda8/usr(1.5 千兆字节)
/dev/hda9/home(驱动器的剩余空间)
我测试用于 USB 大容量存储的新内核,这就是为什么 /boot 分区很大的原因。我将 LILO 安装到 MBR 中,默认情况下我启动 Windows(我不是唯一使用这台电脑的人)。

我还注意到您没有任何真正的分区表示例,对于新手,我强烈建议放上一些。我刚刚脱离新手阶段,分区是我最困惑的地方。

Valkor


6. 标签

在 Linux 中,硬盘驱动器被称为设备,设备是 /dev 中的伪文件/dev。例如,编号第二小的 SCSI 驱动器的第一个分区是 /dev/sdb1/dev/sdb1。如果被称为 /dev/sda 的驱动器/dev/sda从链中移除,那么后一个分区会在重启时自动重命名为 /dev/sdb1/dev/sda1


6.1. 卷标

卷标使分区能够保留一致的名称,而无需考虑它们连接的位置,也无需考虑连接的其他设备。标签对于 Linux 卷不是强制性的。每个标签最多可以包含 16 个字符。

有三个工具可以创建卷标:mke2fs、tune2fs 和 e2label。


6.1.1. 简单调用

e2label /dev/hdb1 pubsw

tune2fs -Lpubsw /dev/hdb1

这两个命令中的任何一个都会将第二个驱动器的第一个分区标记为 "pubsw"。该标签会与该特定分区保持关联,即使驱动器被移动到另一个控制器甚至另一台计算机。

mke2fs pubsw /dev/hdb1

mke2fs -Lpubsw /dev/hdb1

将执行与前两个命令相同的操作 - 在它们创建文件系统之后。这意味着这两个命令中的任何一个都将删除分区中的任何现有数据。


6.1.2. 如何使用

这是一个 fstab 示例。这是一个位于 /etc 中的文本文件,通常在操作系统安装期间设置。它描述了每个分区将挂载在哪里,以及它将如何挂载。当您添加/删除设备时,您可以通过实用程序或手动修改它。

LABEL=/        /                    ext3    defaults        1 1
LABEL=/boot    /boot                ext2    defaults        1 2
none           /dev/pts             devpts  gid=5,mode=620  0 0
none           /dev/shm             tmpfs   defaults        0 0
LABEL=HOME     /home                ext3    defaults        1 2
none           /proc                proc    defaults        0 0
none           /sys                 sysfs   defaults        0 0
LABEL=/usr     /usr                 ext3    defaults        1 2
/dev/hdc1      /k-space             ext3    defaults        1 2
/dev/hda6      swap                 swap    defaults        0 0
/dev/hdd       /media/cdrecorder    auto    pamconsole,ro,exec,noauto,managed 0 0
/dev/fd0       /media/floppy        auto    pamconsole,exec,noauto,managed 0 0

最左边的列列出了设备,第二列列出了挂载点。此示例包含设备和标签的混合。第二个控制器的主驱动器始终挂载在 /k-space/k-space。标记为 "HOME" 的分区始终挂载在 /home/home,无论它在哪个驱动器上或具有哪个分区号。请注意,允许将挂载点用作标签,例如 "/usr"


6.2. 设备标签

devlabel 是一个创建指向设备的符号链接的脚本。例如,

devlabel -d/dev/hdb1-s/dev/home

将创建一个从 /dev/hda1/dev/home 的链接/dev/hdb1/dev/home。至关重要的是,它存储了 /dev/hda1 上硬件的唯一标识符/dev/hdb1,并将该标识符与您在 /etc/sysconfig/devlabel 中指定的链接名称一起存储。如果硬件稍后移动到 /dev/hdc1/dev/hdc1,将查询其唯一标识符(使用 /usr/bin/partition_uuid),将其与其在 /etc/sysconfig/devlabel 中的条目匹配,并再次链接到 /dev/home/dev/home.


7. 格式化 ext2/3 分区

当硬盘驱动器被分区时,它被映射到各个部分,但这些部分是空的。就像新建的图书馆一样;在存放书籍之前,必须先放置书架、标牌和卡片目录系统。

分区内的组织结构称为文件系统。在 Linux 中,标准文件系统是 ext2 和 ext3。 ext3 文件系统是 ext2,加上磁盘写入日志,称为日志。日志允许系统从意外断电等事故中快速恢复。

在分区中创建 ext2/3 文件系统的主要工具是 mke2fs。它通常位于 /sbin/sbin中。 mkfs.ext2mkfs.ext3 是前端,它们将特定选项传递给 mke2fs


.1. 简单调用

mke2fs /dev/hdb1

mkfs.ext2 /dev/sdb1 /dev/hdb1

两者都在第二个驱动器的第一个分区上创建 ext2 文件系统,以及

mke2fs -j /dev/sdb1/dev/hdb1

mkfs.ext3 /dev/sdb1 /dev/hdb1

创建 ext3 文件系统。


.2. 保留块

-m 选项可能是对非专家最有用的选项之一。如果文件系统被填满并且没有更多空间可写,则基本上无法使用,因为操作系统不断写入磁盘。默认情况下,分区百分之五的空间保留供 root 用户使用。这允许 root 在分区上执行管理活动,并可能从中移出一些数据。但是,当分区包含 / 或 home 目录时,这最为关键。对于纯数据分区,这只是丢失的空间。 250Gb 分区的百分之五是 12.5 Gb。特别是在大型分区的情况下,将保留空间设置为最小值(即百分之一)是安全的。

mkfs.ext3 -m 1 /dev/sdb1/dev/hdb1

创建一个文件系统,其中只有 1% 的空间保留给 root 用户。 tune2fs -m 可用于在将数据加载到分区后调整保留块。


8. 恢复已删除的分区表

以下是手动恢复已删除分区表的说明。有一些实用程序,例如 gpartTestDisk ,可以使此任务变得容易得多。但是,如果您正在阅读本文是因为您已经运气不佳,那么这就是您必须做的

  1. 创建一个至少与您的第一个分区一样大的分区。您可以使其大于原始分区任意数量。如果您低估了,将会哭天喊地。

    Command (m for help): n
    Command action
       e   extended
       p   primary partition (1-4)
    p
    Partition number (1-4): 1
    First cylinder (1-23361, default 1): <RETURN>
    Using default value 1
    Last cylinder or +size or +sizeM or +sizeK (1-22800, default 22800): 13032
    
    Command (m for help): w
    

  2. 在第一个分区上运行 dumpe2fs 并 grep 输出块计数。

    示例

               % dumpe2fs /dev/sda1 | grep "Block count:"
               Block count:              41270953
          
    如果您不确定此值,请使用更大的分区大小重复步骤 1。如果块计数发生变化,则说明您低估了原始分区的大小。重复步骤 1,直到获得稳定的块计数。

  3. 删除您刚刚创建的分区

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

  4. 创建一个大小与您从块计数中获得的大小完全相同的新分区。由于您无法在 fdisk 中输入块大小,因此您需要计算出需要请求多少个柱面。以下是公式

      (number of needed cylinders) = (number of blocks) / (block size)
    
      (block size) = (unit size) / 1024
    
      (unit size) = (number of heads) * (number of sectors/cylinder) * (number of bytes/sector)
    

    考虑以下示例,其中硬盘驱动器已分区为四个主分区,分别为 1、2、4 和 8 个柱面。

    disk /dev/sda: 16 heads, 63 sectors, 23361 cylinders
    Units = cylinders of 1008 * 512 bytes
    
       Device Boot    Start       End    Blocks   Id  System
    /dev/sda1             1         2       976+  83  Linux
    /dev/sda2             3         5      1512   83  Linux
    /dev/sda3             6        10      2520   83  Linux
    /dev/sda4            11        19      4536   83  Linux
    
    fdisk 提供了我需要的配置信息,位于输出的头部。单位大小是516096 ( 16磁头数 *63扇区数/柱面 *512字节数/扇区)。块大小是 1024 字节(504 ( 516096 / 1024)。因此,第二个分区所需的柱面数为3 ( 1512块数/ 504)。分区表显示情况确实如此:第一个柱面是 1(3),第二个柱面是 2(4),最后一个是 3(5),总共三个柱面。第三个分区所需的柱面数以类似的方式计算2520块数/ 504 = 5,对应于 4096 个块(6,7,8,9,10)。请注意,此计算不适用于第一个分区,因为块计数是错误的(976而不是 20481008)。加号表示并非所有块都包含在 fdisk 值中。当您尝试计算(976 / 504)时,您会得到 3.0003。考虑到柱面数必须是整数,您可以简单地向上取整。1.937。考虑到柱面数必须是整数,您可以简单地向上取整。

  5. 在其上运行 e2fsck 以验证您是否可以读取新分区。

  6. 在剩余分区上重复步骤 1-5。

重新挂载您的分区。令人惊讶的是,您的所有数据都将在那里。

感谢:Mike Vevea,jedi 系统管理员,提供基本策略。


9. 设置交换空间

9.1. 交换分区

通常,设置交换空间只有两个步骤:创建分区并将其添加到 /etc/fstab。 /dev/hda6 上交换分区的典型 fstab 条目如下所示

/dev/hda6	swap	swap	defaults	0	0

下次重启时,初始化脚本将自动激活它,无需执行任何其他操作。

但是,如果您想立即使用它,则需要手动激活它。以 root 身份,键入 swapon /dev/hda6

mkswap -f /dev/hda6
swapon /dev/hda6

9.2. 交换文件

有时您可能会用完交换空间,并且重新分区驱动器或添加新驱动器是不切实际的。在这种情况下,您可以使用普通分区中的常规文件。您所要做的就是创建一个所需大小的文件

dd if=/dev/zero of=/var/my_swap bs=1024 count=131072

并激活它 mkswap /var/my_swap; swapon /var/my_swap

	mkswap -f /var/my_swap
	swapon /var/my_swap

此调用创建一个名为 my_swapmy_swap的文件,位于 /var/var中。它的长度为 128 Mb (128 x 1024 = 131072)。最初,它填充了零。但是,mkswap 将其标记为交换空间,swapon 告诉内核开始将其用作交换空间。当您完成操作后,swapoff /var/my_swap

swapoff /var/my_swap
rm /var/my_swap

9.3. 多个交换区

同一系统上可以使用多个交换分区。考虑一个 fstab 示例,其中有一个单独的交换分区

/dev/hda5   /        ext3   defaults        1	1
/dev/hda1   /boot    ext2   defaults        1	2
none        /dev/pts devpts gid=5,mode=620  0	0
none        /proc    proc   defaults        0	0
/dev/hda7   /usr     ext3   defaults        1	2
/dev/hda6   swap     swap   defaults        0	0

想象一下用这三行替换交换分区的条目

/dev/hda6   none    swap    sw,pri=3    0	0
/dev/hdb2   none    swap    sw,pri=2    0	0
/dev/hdc2   none    swap    sw,pri=1    0	0

此配置将导致内核首先使用 /dev/hda6。它被分配了最高的优先级(pri=3)。最大优先级可以是 32767,最低优先级为 0。如果该空间已用完,内核将开始使用 /dev/hdb2,然后使用 /dev/hdc2。为什么要这样配置?假设最新的(最快的)驱动器被赋予最高的优先级。这将最大限度地减少交换空间使用量增长时的速度损失。

可以同时写入所有三个分区。如果每个分区都具有相同的优先级,则内核将像 RAID 一样写入它们,从而提高相应的速度。

/dev/hda6   none   swap   sw,pri=3   0   0
/dev/hdb2   none   swap   sw,pri=3   0   0
/dev/hdc2   none   swap   sw,pri=3   0   0

请注意,这三个分区位于不同的驱动器上,这在速度提升方面是理想的。


10. 附录

10.1. 格式化分区

在 shell 提示符下,我开始在我的分区上创建文件系统。继续(参见 第 5.3 节)中的示例,这是 mkfs.ext2 /dev/sda1

# mke2fs /dev/sda1

我需要为我的每个分区执行此操作,但不包括 /dev/sda4/dev/sda4(我的扩展分区)。 Linux 支持除 ext2 之外的文件系统类型。您可以通过查看 /usr/src/linux/include/linux/fs.h/usr/src/linux/include/linux/fs.h

来了解您的内核支持的类型。最常见的文件系统可以使用 /sbin/sbin中以 "mk" 开头的程序创建,例如 mkfs.msdosmke2fs


10.2. 激活交换空间

要设置交换分区 mkswap /dev/hda6

# mkswap -f /dev/hda5
要激活交换区 swapon /dev/hda6
# swapon  /dev/hda5
通常,交换区在启动时由初始化脚本激活。


10.3. 挂载分区

挂载分区意味着将其附加到 Linux 文件系统。要挂载 Linux 分区 mount -t 文件系统类型 设备名称 挂载点

# mount -t ext2 /dev/sda1 /opt

-t ext2

文件系统类型。您可能要使用的其他类型是

  • ext3(基于 ext2 的日志文件系统)

  • msdos (DOS)

  • hfs (mac)

  • iso9660 (CDROM)

  • nfs(网络文件系统)

/dev/sda1

设备名称。您可能要使用的其他设备名称

  • /dev/hdb2/dev/hdc2(第二个 IDE 驱动器中的第二个分区)

  • /dev/fd0(软盘驱动器 A)

  • /dev/cdrom(CDROM)

/opt

挂载点。这是您想要“看到”分区的位置。当您键入 ls /optls /opt时,您可以看到 /dev/sda1/dev/sda1中的内容。如果 /opt/opt下已经有一些目录和/或文件,则在此挂载命令之后它们将不可见。


10.4. 关于文件系统和碎片的一些事实

磁盘空间由操作系统以块和块片段为单位进行管理。在 ext2 中,片段和块的大小必须相同,因此我们可以将讨论限制在块上。

文件大小不一。它们不会在块边界处结束。因此,对于每个文件,每个文件的最后一个块的一部分都会被浪费。假设文件大小是随机的,则磁盘上每个文件大约浪费半个块。 Tanenbaum 在他的著作《操作系统》中称之为“内部碎片”。

您可以通过磁盘上分配的 inode 数量来猜测磁盘上的文件数量。在我的磁盘 /dev/hda3

# df -i
Filesystem           Inodes   IUsed   IFree  %IUsed Mounted on
/dev/hda3              64256   12234   52022    19%  /
/dev/hda5              96000   43058   52942    45%  /var
上,/usr 上大约有 12000 个文件//home 上大约有 44000 个文件/var。在 1 KB 的块大小下,大约 6+22 = 28 MB 的磁盘空间在文件的尾块中丢失。如果我选择 4 KB 的块大小,我将丢失 4 倍的空间。

但是,对于大型连续的数据块,数据传输速度更快。这就是为什么 ext2 尝试以 8 个连续块为单位预先分配空间给增长的文件。当文件关闭时,未使用的预分配空间将被释放,因此不会浪费空间。

文件中块的非连续放置对性能不利,因为文件通常以顺序方式访问。它迫使操作系统拆分磁盘访问并使磁盘移动磁头。这称为“外部碎片”或简称为“碎片”,是 MS-DOS 文件系统的常见问题。结合 MS-DOS 使用的糟糕的缓冲区缓存,文件碎片对性能的影响非常明显。 DOS 用户习惯于每隔几周对磁盘进行碎片整理,有些人甚至对碎片整理产生了一些仪式性的信念。

这些习惯都不应延续到 Linux 和 ext2。 Linux 原生文件系统在正常使用情况下不需要碎片整理,这包括磁盘上至少有 5% 的可用空间的任何情况。 ext2 有一个名为 defrag 的碎片整理工具,但告诫用户不要随意使用。在此操作期间断电可能会损坏您的文件系统。由于无论如何您都需要备份数据,因此只需从您的副本写回即可完成工作。

MS-DOS 文件系统也因内部碎片而丢失大量磁盘空间而闻名。对于大于 256 MB 的分区,DOS 块大小会变得太大,以至于不再有用(这在一定程度上已通过 FAT32 得到纠正)。 Ext2 不会强制您为大型文件系统选择大型块,除非对于 0.5 TB 范围(这是 TB,其中 1 TB 等于 1024 GB)及以上的超大型文件系统,在这些文件系统中,小块大小会变得效率低下。因此,与 DOS 不同,无需将大型磁盘拆分为多个分区以减小块大小。

如果您有很多小文件,请使用 1Kb 的块大小。对于大型分区,4Kb 的块大小就足够了。