学习 Linux,101: 硬盘布局

规划您的硬盘分区

了解如何在 Linux® 系统中设计磁盘的分区布局。您可以使用本文中的资料来学习,备考 Linux 系统管理员认证的 LPI 101 考试,当然也可以是出于爱好而学习。

2012 年 11 月 27 本文做了一些更新,以包含适用于 LPI Exam 101: Objective Changes as of July 2, 2012 的一些资料。

主要更新包括 Logical Volume Manager、与传统 MBR 磁盘一起使用的分区表布局以及 GUID Partition Table (GPT) 相关信息,更新主要发生在以下小节:Logical Volume Manager (LVM)MBR、EBR、GPT 和 LVM 内部构件 以及 参考资料

Ian Shields, 高级程序员, IBM

Ian ShieldsIan Shields 参与 developerWorks Linux 专区的许多 Linux 项目。他是 IBM 北卡罗来纳州 Research Triangle Park 的一名高级程序员。他于 1973 年作为一名系统工程师加入 IBM 位于澳大利亚堪培拉的子公司。此后,在加拿大蒙特利尔和北卡罗来纳州 RTP 从事通信系统和普适计算。他拥有多项专利。他毕业于 Australian National University,本科学位是纯粹数学和哲学。他拥有北卡罗来纳州州立大学的计算机硕士和博士学位。



2013 年 1 月 07 日 (最初于 2010 年 2 月 24 日)

关于本系列

本系列文章帮助您了解 Linux 系统管理任务。您可以使用本系列文章中的资料准备 Linux Professional Institute Certification 级别 1 (LPIC-1) 考试

请参见我们的 学习 Linux,101: LPIC-1 路线图,查看本系列中各文章的介绍和链接。该路线图目前仍然在更新中,目前反映的最新内容是 LPIC-1 考试的最新目标(2009 年 4 月,在 2012 年 7 月做过少许更新):在完成文章之后,我们会将它们添加到路线图中。但是,与此同时,您可以在我们的 LPI 认证考试准备教程 中找到类似资料的早期版本,这些内容支持 2009 年 4 月以前发布的 LPIC-1 目标。

概述

在本文中学习为 Linux 系统设计磁盘分区布局。您将学到:

  • 为各分区或磁盘分配文件系统和交换空间
  • 根据系统的目标用途定制设计
  • 确保系统能够引导
  • 了解 Logical Volume Manager (LVM) 的基本特性

本文将帮助您准备 Linux Professional Institute's Junior Level Administration (LPIC-1) 考试 101 中主题 102 下的目标 102.1。该目标的权值为 2。

注意:本文主要介绍布局规划。如需了解实现步骤,请参阅针对主题 104 的文章(在我们的 系列线图路 中有详细介绍)。

注意:本文包含适用于 LPI Exam 101: Objective Changes as of July 2, 2012 的资料。我们添加了一些关于 Logical Volume Manager 的一些基本信息,还添加了更多关于与传统 MBR 磁盘一起使用的分区表布局的详细信息,以及一些关于 GUID Partition Table (GPT) 的基本信息。新代码清单和图都是在 64 位 Fedora 16 系统上完成的。

先决条件

要充分地学习本系列文章的内容,您应当对 Linux 以及在其中运行本文介绍的命令的 Linux 系统有一个基本的了解。在某些情况下,程序的不同版本可能使用不同的方式格式化输出,因此您的结果可能并不总是与本文所示的清单和图形完全一样。


文件系统概述

联系 Ian

Ian 是我们的一位最受欢迎、最高产的作者。查看 Ian 的个人信息,与 Ian、其他作者和 developerWorks 社区中的其他读者联系。

Linux 文件系统包含排列在磁盘或其他区块存储设备目录中的文件。与其他许多系统相同,Linux 系统中的目录也包含其他目录,即子目录。 Microsoft® Windows® 等系统的概念是在不同的驱动器盘符上(A:,C:,等)使用不同的文件系统,而 Linux 文件系统则截然不同,它是一个树形结构,以 / 目录作为 目录。

您可能会感到疑惑,如果文件系统只是一个庞大的树形结构,那么磁盘布局为什么如此重要。实际上,每一个区块设备(如硬盘驱动器分区、CD-ROM 或者软盘) 上都有一个文件系统。通过在称为挂载点的点将文件系统挂载到不同的设备上来创建文件系统的单一树形视图。

开发此方面的技能

本内容是一套渐进的学习路线图的一部分,用来帮助您提升自己的技能。请参考 Linux 系统管理基础:设置您的系统和软件

通常情况下,内核通过将某些硬盘驱动器分区上的文件系统以 / 的形式挂载来启动这个挂载过程。您可以挂载其他硬盘驱动器分区,如 /boot、/tmp 或 /home。例如,您可以采用 /mnt/floppy 的形式挂载软盘驱动器上的文件系统,使用 /media/cdrom1 挂载 CD-ROM 上的文件系统。您还可以使用 NFS 之类的网络文件系统挂载来自其他系统中的文件。此外也有其他类型的文件挂载,但这几个示例能帮助您简单了解挂载过程。尽管挂载过程实际上是指挂载某些设备上的文件系统,但人们通常会称之为 “挂载设备”,其真正的含义是 “挂载设备上的文件系统”。

现在,假设您已经挂载了 root 文件系统(/),您希望在挂载点 /media/cdrom 挂载 CD-ROM /dev/sr0。挂载点必须首先存在,之后才能通过它来挂载 CD-ROM。在您挂载 CD-ROM 时,CD-ROM 上的文件和子目录将成为 /media/cdrom 下的文件和子目录。/media/cdrom 中已有的所有文件或子目录都将不再可见,但它们仍然存在于包含挂载点 /media/cdrom 的区块设备之上。如果卸载了 CD-ROM,原始文件和子目录将再次可见。因此,请不要将其他文件置于将用作挂载点的目录中,以避免此问题。

表 1 展示了 Filesystem Hierarchy Standard 要求 / 中具有的目录(关于 FHS 的更多信息,请参见 参考资料)。

表 1. / 中的 FHS 目录
目录说明
bin基本命令二进制文件
boot引导加载器的静态文件
dev设备文件
etc特定于主机的系统配置
lib基本共享库和内核模块
media可插拔介质的挂载点
mnt临时挂载文件系统的挂载点
opt附加应用软件包
sbin基本系统二进制文件
srv该系统提供的服务的数据
tmp临时文件
usr次要层次结构
var变量数据

分区

第一个 SCSI 驱动器通常是 /dev/sda。在较早的 Linux 系统中,第一个 IDE 硬盘驱动器是 /dev/hda。随着串行 (SATA) IDE 驱动器的发明,混合 PATA/SATA 系统有时会使用 /dev/hda 作为第一个 PATA 驱动器,并使用 /dev/sda 作为第一个 SATA 驱动器。在较新的系统上,所有 IDE 驱动器都命名为 /dev/sda、/dev/sdb 等。IDE 驱动器名称的更改是热插拔系统造成的,最初支持的是 USB 驱动器。热插拔允许您在插入新设备后立即开始使用新设备,而现在这种命名适用于所有设备,无论是内置于系统之中的设备,还是随后使用 USB 或 Firewire(IEEE 1394)或其他类型的连接插入正在运行的系统的设备。

传统上,硬盘驱动器会被格式化为 512 字节的扇区。磁盘盘片在无需移动磁头的前提下即可读取的所有扇区组成了一个磁道。磁盘通常具有多个盘片。各盘片上在无需移动磁头的前提下即可读取的磁道的集合称为柱面。硬盘驱动器的设定参数使用柱面、每个柱面的磁道(或磁头)数以及扇区/磁道表示。在本文撰写之时,驱动器制造商开始生产具有 4K 扇区的磁盘。如果文件系统仍然假定使用 512 字节的扇区,而某个分区并非从位于 4K 边界的扇区开始,那么这会导致性能降低。

PC 系统上 DOS 操作系统中对于柱面、磁头和扇区大小的限制带来了 BIOS 转换的设定参数,以支持更大的硬盘驱动器。最终,即便这样的方法也不足以解决问题。 磁盘驱动器技术的最新发展带来了逻辑块寻址 (LBA),因而 CHS 设定参数指标的重要性有所降低,现代磁盘上报告的设定参数可能与物理扇区布局关系不大或者完全无关。如今,我们使用的磁盘更大,这迫使 LBA 推出了称为 LBA48 的扩展,最多可保留 48 个位供扇区号使用。一个新的名为 GUID Partition Table(或 GPT)的格式现在被用于大型驱动器,而不再使用 MBR 格式。GPT 驱动默认支持高达 128 个分区。

硬盘驱动器上的空间划分(或者说分区)为多个分区。分区不能重叠,未分配给分区的空间称为剩余空间。分区名的形式类似于 /dev/hda1、/dev/hda2、/dev/hda3、/dev/sda1 等。在未使用热插拔支持的系统上,IDE 驱动器最多支持 63 个分区。通过热插拔支持的 SCSI 驱动器、USB 驱动器和 IDE 驱动器最多可有 15 个分区。一个分区通常会分配为整数个柱面(柱面概念可能存在不准确之处)。

如果两种不同的分区程序对于指定的磁盘设定参数有着不同的理解,就有可能出现一种分区程序在遇到另一个分区程序创建的分区时报错或发生问题的情况。如果将磁盘从一个系统移动到另一个系统,也可能会出现此类问题,若两个系统的 BIOS 功能不同则更容易出现问题。

在 Linux 系统中,您可以使用 partedfdisk 工具查看指定设定参数。较早版本的 Linux 参数也会在 /proc 文件系统的一个类似于 /proc/ide/hda/geometry 的文件中报告设定参数,而在较新版本的系统中可能无法找到这个文件。 清单 1 展示了如何使用 fdisk 命令来显示附加 SATA 的 IDE 硬盘驱动器的分区和设定参数。fdisk-v 参数显示了版本。要显示或操纵分区表,您需要是 root 用户,或者通过 sudo 命令获得 root 权限,如本清单所示。

清单 1. 硬盘设定参数
ian@attic4:~$ fdisk -v
fdisk (util-linux-ng 2.16)
ian@attic4:~$ sudo fdisk /dev/sdb
[sudo] password for ian: 

The number of cylinders for this disk is set to 30401.
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): p

Disk /dev/sdb: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x000404d6

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1               1          25      200781   83  Linux
/dev/sdb2              26       12965   103940550   83  Linux
/dev/sdb3           12966       30401   140054670   83  Linux

Command (m for help):

清单 1 中,请注意 fdisk 将打印一条关于柱面 1024 末尾指定位置的警告。某些旧版系统的 BIOS 仅能引导位于磁盘的前 1024 个柱面内的分区,在这种情况下,柱面 1024 极为重要。这很可能出现在没有 LBA 支持的 BIOS 中或者某些旧版本的引导管理器中。在现代机器中,这通常不会造成问题,但您应该注意,可能存在这样的限制。

您可以使用 fdisk 显示扇区中的单元,使用 -u 选项即可,也可在交互模式中使用 u 子命令在扇区和柱面之间切换。parted 命令支持多种不同的单元。清单 2 展示了 清单 1 所示的同一个磁盘内的 parted 中不同单元的使用。

清单 2. 使用 parted 的不同单元
ian@attic4:~$ sudo parted /dev/sdb
[sudo] password for ian: 
GNU Parted 1.8.8.1.159-1e0e
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) help u                                                          
  unit UNIT                                set the default unit to UNIT

	UNIT is one of: s, B, kB, MB, GB, TB, compact, cyl, chs, %, kiB, MiB,
        GiB, TiB
(parted) p                                                                
Model: ATA HDT722525DLA380 (scsi)
Disk /dev/sdb: 250GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End    Size   Type     File system  Flags
 1      32.3kB  206MB  206MB  primary  ext3
 2      206MB   107GB  106GB  primary  ext4
 3      107GB   250GB  143GB  primary  ext3

(parted) u s                                                              
(parted) p                                                                
Model: ATA HDT722525DLA380 (scsi)
Disk /dev/sdb: 488397168s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start       End         Size        Type     File system  Flags
 1      63s         401624s     401562s     primary  ext3
 2      401625s     208282724s  207881100s  primary  ext4
 3      208282725s  488392064s  280109340s  primary  ext3

(parted) u chs                                                            
(parted) p                                                                
Model: ATA HDT722525DLA380 (scsi)
Disk /dev/sdb: 30401,80,62
Sector size (logical/physical): 512B/512B
BIOS cylinder,head,sector geometry: 30401,255,63.  Each cylinder is 8225kB.
Partition Table: msdos

Number  Start      End           Type     File system  Flags
 1      0,1,0      24,254,62     primary  ext3
 2      25,0,0     12964,254,62  primary  ext4
 3      12965,0,0  30400,254,62  primary  ext3

(parted)

请注意,partedfdisk 输出所显示的起始柱面和结束柱面截然不同,这是由于 parted 从零开始计算柱面,而 fdisk 从 1 开始计算。清单 3 表明,fdiskparted 的起始扇区和结束扇区实际上是完全相同的。

清单 3. 检查起始和结束扇区号
ian@attic4:~$ sudo fdisk -ul /dev/sdb

Disk /dev/sdb: 250.1 GB, 250059350016 bytes
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors
Units = sectors of 1 * 512 = 512 bytes
Disk identifier: 0x000404d6

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1              63      401624      200781   83  Linux
/dev/sdb2          401625   208282724   103940550   83  Linux
/dev/sdb3       208282725   488392064   140054670   83  Linux
ian@attic4:~$ echo $(( 208282725 / 255 / 63 ))
12965

分区类型

IDE 驱动器上有三种类型的分区:主分区逻辑分区扩展分区。分区表 位于磁盘主引导记录 (MBR) 之中。分区表 位于磁盘主引导记录 (MBR) 中。MBR 是磁盘上的第一个扇区,因而分区表在其中所占空间不大。这限制了一个磁盘上的主分区数量,最多为 4 个。如果需要 4 个以上的主分区(往往需要 4 个以上的主分区),其中一个主分区就必须以扩展分区的形式出现。扩展分区是一个或多个逻辑分区的容器。这样,在一个使用 MBR 布局的驱动器上就可以有4 个以上的分区。

MBR 布局也限制了磁盘的最大容量,支持大约 2TB 字节。新版 GUID Partition Table(或 GPT)布局解决了容量限制问题,对分区数量的限制也比较小。使用 GPT 格式格式化的磁盘默认支持高达 128 个主分区,而无需使用扩展分区或逻辑分区。关于 MRB 内部构件以及 GUID Partition Table (GPT) 如何工作的更多信息,请参见 MBR、EBR、GPT 和 LVM 内部构件

简单地说,扩展分区是一个或多个逻辑分区的容器。这种分区模式最初是由 MS DOS 和 PC DOS 采用的,允许 DOS、Windows 或 Linux 系统使用 PC 磁盘。一个磁盘可能仅包含一个扩展分区。数据存储在扩展分区内的逻辑分区中。必须首先在扩展分区内创建一个逻辑分区,之后才能将数据存储到扩展分区中。

Linux 将主分区或扩展分区编号为 1 至 4,因而 dev/sda 可能拥有四个主分区:/dev/sda1、/dev/sda2、/dev/sda3、/dev/sda4。也可以有一个主分区 /dev/sda1 和一个扩展分区 /dev/sda2。如果定义了逻辑分区,则逻辑分区的编号从 5 开始,/dev/sda 上的第一个逻辑分区将为 /dev/sda5,即便磁盘上不存在主分区,只有一个扩展分区也是如此(/dev/sda1)。因此,如果您希望一个 IDE 驱动器上有四个以上的分区,就需要给扩展分区分配一个分区号。尽管理论上支持热插拔的内核的 IDE 驱动器分区数量理论上最多为 15 个,但您也许能创建最后几个,也可能无法创建。如果您计划在一个驱动器上使用超过 12 个分区,应务必谨慎地检查所有方面。

上述示例中使用的磁盘具有三个主分区,均格式化以供 Linux 使用。其中两个使用 ext3 文件系统,另一个使用 ext4 文件系统。清单 4 展示了针对 Ubuntu 9.10 系统上带有主、扩展和逻辑分区的内部驱动器和附加到 Fedora 12 系统的 USB 驱动器的 parted 命令 p 的输出结果。请注意不同的文件系统类型。另外还要注意,您可以在命令行中指定一个或多个 parted 命令,避免使用交互模式。

清单 4. 使用 parted 命令显示分区表
ian@attic4:~$ sudo parted /dev/sda u s p
[sudo] password for ian: 
Model: ATA WDC WD6401AALS-0 (scsi)
Disk /dev/sda: 1250263728s
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start       End          Size         Type      File system     Flags
 1      63s         2040254s     2040192s     primary   ext3
 2      2040255s    22523129s    20482875s    primary   linux-swap(v1)
 4      22523130s   1250258624s  1227735495s  extended                  boot
 5      22523193s   167397299s   144874107s   logical   ext3
 6      167397363s  310761359s   143363997s   logical   ext3
 7      310761423s  455442749s   144681327s   logical   ext3
 8      455442813s  600092009s   144649197s   logical   ext3
[root@echidna ~]# parted /dev/sdc p
Model: WD My Book (scsi)
Disk /dev/sdc: 750GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End    Size    Type      File system  Flags
 1      32.3kB  135GB  135GB   primary   fat32        lba
 2      135GB   750GB  616GB   extended
 5      135GB   292GB  157GB   logical   ext3
 6      292GB   479GB  187GB   logical   ext3
 7      479GB   555GB  76.5GB  logical   ext3
 8      555GB   750GB  195GB   logical   ext3

fdisk 命令不能理解 GPT 格式化磁盘。相反,您可以使用 partedgpartedgdisk 命令。请参考 清单 14 中的 gdisk 输出示例。

警告:如果在使用 MBR 布局的磁盘上使用 gdisk,那么它将要求您将该磁盘转换成 GPT 格式,请注意!


Logical Volume Manager (LVM)

现在您已经了解了各种类型的分区,可能很想知道如果没有为各种分区规划合适的大小将会发生什么。如果对它们进行扩展或收缩?如果一个大型文件系统需要更多空间而不仅仅是单个磁盘容量会发生什么呢?这就交给 Logical Volume ManagerLVM)处理吧。

使用 LVM,您就可以抽象化磁盘空间管理了,这样单个文件系统就可以跨多个磁盘或分区,而且也易于向文件系统添加空间或从中删除空间。当前版本是 lvm2,向后兼容原版 LVM(现在有时候称为 lvm1)。

LVM 以以下抽象对象的方式管理磁盘空间:

  • 物理卷PVs
  • 卷组VGs
  • 逻辑卷LVs

物理卷既可以是整个驱动器也可以是驱动器上的一个分区。尽管 LVM 可以使用整个驱动器,不需要进行分区定义,但这并不是一个好主意,正如您将从 MBR、EBR、GPT 和 LVM 内部结构 中看到的那样。

卷组是一个或多个 PV 的集合,VG 中的空间管理和大磁盘一样,即使底层 PV 散布在多个分区或多个磁盘上。底层 PV 可以有不同的大小,可以分布在不同的磁盘上,很快将对其进行说明。

在某种意义上,逻辑卷类似于一个物理 GPT 或 MBR 分区,因为它是使用特定文件系统类型(比如,ext4 或 XFS)格式化的单元空间,然后作为您的 Linux 文件系统的一部进行挂载。一个 LV 完全驻留在 VG 中。

考虑一个 PV 作为物理空间单元,聚合到名为 VG 的抽象概念中,VG 就像是一个虚拟驱动器。VG 或虚拟驱动器然后被分区到 LV,供文件系统使用。

在一个 VG 中,您可以根据区段(extents)管理空间。默认区段大小是 4MB,通常是足够的。如果您使用较大的区段,务必要意识到一个 VG 中的所有 PV 区段大小都必须相同。分配 LV 或调整 LV 大小时,分配单位是区段大小。在 LV 中默认结果是 4MB 的倍数,必须以 4MB 的倍数递增或递减。

LVM 拼图的最后一块是设备映射器。这是一块 Linux 内核代码,为诸如 LVM 或软件 RAID 之类的虚拟设备提供一个通用基础。

LVM 中所用的命令通常是在 lvm2 软件包中。您可以从命令行运行命令,或者运行 lvm 命令,该命令将提供一个 shell 便于运行各种 LVM 命令。清单 5 显示 lvm 命令以及各种可在其中运行的命令。

清单 5. lvm 命令及其子命令
[root@echidna ~]# lvm
lvm> help
  Available lvm commands:
  Use 'lvm help <command>' for more information
   
  dumpconfig      Dump active configuration
  formats         List available metadata formats
  help            Display help for commands
  lvchange        Change the attributes of logical volume(s)
  lvconvert       Change logical volume layout
  lvcreate        Create a logical volume
  lvdisplay       Display information about a logical volume
  lvextend        Add space to a logical volume
  lvmchange       With the device mapper, this is obsolete and does nothing.
  lvmdiskscan     List devices that may be used as physical volumes
  lvmsadc         Collect activity data
  lvmsar          Create activity report
  lvreduce        Reduce the size of a logical volume
  lvremove        Remove logical volume(s) from the system
  lvrename        Rename a logical volume
  lvresize        Resize a logical volume
  lvs             Display information about logical volumes
  lvscan          List all logical volumes in all volume groups
  pvchange        Change attributes of physical volume(s)
  pvresize        Resize physical volume(s)
  pvck            Check the consistency of physical volume(s)
  pvcreate        Initialize physical volume(s) for use by LVM
  pvdata          Display the on-disk metadata for physical volume(s)
  pvdisplay       Display various attributes of physical volume(s)
  pvmove          Move extents from one physical volume to another
  pvremove        Remove LVM label(s) from physical volume(s)
  pvs             Display information about physical volumes
  pvscan          List all physical volumes
  segtypes        List available segment types
  vgcfgbackup     Backup volume group configuration(s)
  vgcfgrestore    Restore volume group configuration
  vgchange        Change volume group attributes
  vgck            Check the consistency of volume group(s)
  vgconvert       Change volume group metadata format
  vgcreate        Create a volume group
  vgdisplay       Display volume group information
  vgexport        Unregister volume group(s) from the system
  vgextend        Add physical volumes to a volume group
  vgimport        Register exported volume group with system
  vgmerge         Merge volume groups
  vgmknodes       Create the special files for volume group devices in /dev
  vgreduce        Remove physical volume(s) from a volume group
  vgremove        Remove volume group(s)
  vgrename        Rename a volume group
  vgs             Display information about volume groups
  vgscan          Search for all volume groups
  vgsplit         Move physical volumes into a new or existing volume group
  version         Display software and driver version information
lvm> quit
  Exiting.

为了向您提供一个运行的 LVM 的简洁样例,我在 /dev/sdc5 上为 LVM 创建了一个 GPT 分区(分区类型 0083),在 /dev/sdd1 上为 LVM 创建了一个 MBR 分区(分区类型 83)。您在这些分区上已经创建了 PV,如 清单 6 所示,可在其中使用 pvscan 显示系统上的 PV。

清单 6. 显示物理卷
[root@echidna ~]# pvscan
  PV /dev/sdc5                      lvm2 [146.43 GiB]
  PV /dev/sdd1                      lvm2 [232.88 GiB]
  Total: 2 [379.32 GiB] / in use: 0 [0   ] / in no VG: 2 [379.32 GiB]

现在,可以使用 vgcreate 命令从这两个 PV 上创建一个卷组,然后使用 lvcreate 命令创建一个比其中任何一个 PV 大的逻辑卷。最后,将您的新 LV 格式化为 ext4,挂载到 /mnt/lvdemo,如 清单 7 所示。

清单 7. 创建一个卷组和一个逻辑卷
[root@echidna ~]# vgcreate demo-vg /dev/sdc5 /dev/sdd1
  Volume group "demo-vg" successfully created
[root@echidna ~]# lvcreate -L 300G -n demo-lv demo-vg
  Logical volume "demo-lv" created
[root@echidna ~]# lvscan
  ACTIVE            '/dev/demo-vg/demo-lv' [300.00 GiB] inherit
[root@echidna ~]# mkfs -t ext4 /dev/demo-vg/demo-lv
mke2fs 1.41.14 (22-Dec-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
19660800 inodes, 78643200 blocks
3932160 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
2400 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
	4096000, 7962624, 11239424, 20480000, 23887872, 71663616

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.
[root@echidna ~]# mount /dev/demo-vg/demo-lv /mnt/lvdemo
[root@echidna ~]# df -h /mnt/lvdemo/
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/demo--vg-demo--lv  296G  191M  281G   1% /mnt/lvdemo

注意:

  1. 诸如 mkfsmount 文件系统命令使用 /dev/<vg-name>/<lv-name> 这样的名称访问 LV。
  2. 默认情况下,创建一个 LV 后,立即变成活动状态,如 清单 7 中的 vgscan 命令输出所示。如果 LV 是一个可移动的驱动器,那么从系统上删除之前,需要使用 lvchange 命令将其停用。

要了解比该概要简介更多的信息,参考 developerWorks 文章 “逻辑卷管理”(参见 参考资料)。


MBR、EBR、GPT 和 LVM 内部构件

学习配置磁盘空间之前,这里有一段小插曲,了解一下 MBR、EBR、GPT 和 LVM 分区表的内部构件以帮助巩固那些难以掌握的概念。注意:LPI 考试不需要详细了解这个级别的内容,如果您没有时间或对内部构件不感兴趣,可以随时跳到 分配磁盘空间 小节。

Master Boot Record (MBR)

Master Boot Record 是硬盘上的第一个扇区。MBR 包含引导程序代码,可能也有一些其他信息,紧接着是 64 字节分区表和一个两字节引导签名。64 字节分区表有 4 个 16 字节条目,从偏移量 446 (1BEh) 处开始。表 2 显示每个 16 字节词条的布局。

表 2. 分区表词条格式
偏移量(16 进制)长度描述
0h1状态。80h 表示活动(或可引导)分区
1h3分区中第一个独立扇区的 CHS (Cylinder-Head-Sector) 地址
4h1分区类型
5h3分区中最后一个独立扇区的 CHS (Cylinder-Head-Sector) 地址
8h4分区中第一个独立扇区的 Logical Block Address (LBA) 地址
Ch4分区中的扇区数

看一个真实示例。root 用户可以使用 dd 命令直接从磁盘上读取扇区。 清单 8 显示在 /dev/sda 上转储 MBR 第一个 510 字节的输出,然后使用 tail 命令选择该记录的最后一个 64 字节,然后以十六进制显示。

清单 8. 显示 /dev/sda 上的分区表
[root@echidna ~]# dd if=/dev/sda bs=510 count=1 2>/dev/null|tail -c 64 |hexdump -C
00000000  80 01 01 00 07 fe ff ff  3f 00 00 00 98 66 b9 08  |........?....f..|
00000010  00 fe ff ff 83 fe ff ff  61 5c 39 09 21 c7 17 00  |........a\9.!...|
00000020  00 fe ff ff 05 fe ff ff  82 23 51 09 85 ab 68 66  |.........#Q...hf|
00000030  00 fe ff ff 82 fe ff ff  d7 66 b9 08 8a f5 7f 00  |.........f......|
00000040

注意,第一条记录状态为 80h,表示一个可引导分区和一个 07h 类分区,表示一个 NTFS 分区。其余分区类型为 83h (Linux)、05h (Extended) 和 82h (Linux Swap),因此磁盘有 3 个主分区和一个扩展分区。所有 CHS 值均为 feffff,这是使用 LBA 的磁盘上的典型特征。LBA 开始扇区和扇区数均被解释为 32 位 little-endian 整数,因此 98 66 b9 08 表示 08b96698h。故第一个分区(NTFS)从扇区 63 (3fh) 开始,然后扩展为 146368152 (08b96698h) 扇区。fdisk 显示一个结束扇区为 63+146368152-1=146368214。

注意:

  1. MRB 中的分区表不包含任何关于逻辑分区的信息。不久您将会看到如何找到这些信息。
  2. 如果您的磁盘使用 CHS 值而并非 LBA 值,将需要进行一些附加运算来将 CHS 值转化到独立分区。而不需要使用不同算法寻找独立分区。与这里概述算法的原理是一样的,因此该简要介绍中不涉及 CHS 计算。
清单 9. /dev/sda 的 Fdisk 输出
[root@echidna ~]# fdisk -l /dev/sda

Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000de20f

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *          63   146368214    73184076    7  HPFS/NTFS/exFAT
/dev/sda2       154754145   156312449      779152+  83  Linux
/dev/sda3       156312450  1874448134   859067842+   5  Extended
/dev/sda4       146368215   154754144     4192965   82  Linux swap / Solaris
/dev/sda5       156312513   336031604    89859546   83  Linux
/dev/sda6       336031668   636880859   150424596   83  Linux
/dev/sda7       636880923   865983824   114551451   83  Linux
/dev/sda8       865983888   949891319    41953716   83  Linux
/dev/sda9       949891383   954003959     2056288+   b  W95 FAT32
/dev/sda10      954007552  1187801087   116896768   83  Linux
/dev/sda11     1187803136  1229760511    20978688   83  Linux
/dev/sda12     1229762560  1874446335   322341888   83  Linux

Partition table entries are not in disk order

事实上,/dev/sda1 以 146368214 结束。

注意,分区表条目无序的警告,这是因为使用了 /dev/sda4,之前使用 /dev/sda3 时 Linux 交换分区本身就是扩展分区。这不是一个错误,尽管 fdisk 程序和其他一些工具可以选择重写该分区表,以便使其整齐有序。

Extended Boot Record(EBR)

在进一步研究扩展分区之前,简单看一下 gparted 命令的图形化输出,因为这将为您提供一个分区布局的图形图像,显示容器的扩展分区本质。

图 1 显示了 /dev/sda 的 gparted 命令。如早先提到的,该磁盘已有三个主分区(/dev/sda1、/dev/sda4 和 /dev/sda2)和一个扩展分区(/dev/sda3)。扩展分区包括 /dev/sda5 到 /dev/sda12 的逻辑分区。 。图像顶部的图示以框架(浅蓝色)的形式显示逻辑分区周围的扩展分区。

图 1. 使用 gparted 显示有几个分区类型的磁盘
如何使用 gparted 显示有几个分区类型的磁盘的屏幕截图

如上所述,MBR 不包括逻辑分区的分区表条目;它定义一个容器查看系统其余部分,比如特定分区。 逻辑分区在该容器内定义。那这又如何运作呢?

扩展分区内的逻辑分区数量没有严格限制,所以非固定大小的分区表定义逻辑分区。而且,每个逻辑分区都有一个 Extended Boot Record(或 EBR)。像 MRB 一样,EBR 的长度是 512 字节,至于 MBR,可以使用偏移量为 446(1BEh)的分区表。在 EBR 分区表中仅使用两个条目。第一个定义当前分区的偏移量和大小,第二项定义偏移量并计算下一个逻辑分区的结束点。对于单链接链中的最后一个逻辑分区,第二项为零。

为了使将 little-endian 十六进制数转换为十进制数的工作变得轻松,创建一个小的 Bash 函数来显示 EBR 中的前两项。然后使用 hexdump 命令的格式化字符串功能来显示 LBA 的开始扇区,以及十进制数扇区数,而不是十六进制。清单 10 显示了 showebr 函数。

清单 10. 显示 EBR 的函数
showebr () 
{ 
    dd if=$1 skip=$2 bs=512 count=1 2> /dev/null | tail -c 66 | 
     hexdump -n 32 -e '"%07.7_ax  " 8/1 "%2.2x " 2/4 " %12d" "\n"'
}

第一个 EBR 是扩展分区的第一个扇区,因此通过使用 清单 9 中的偏移量使用新 showebr 函数对其进行显示。 清单 11 显示输出。

清单 11. /dev/sda 中的第一个 EBR
[root@echidna ~]# showebr /dev/sda 156312450
0000000  00 fe ff ff 83 fe ff ff           63    179719092
0000010  00 fe ff ff 05 fe ff ff    179719155    300849255

EBR 分区表的第一项表明该分区(/dev/sda5)从 EBR 的偏移量 63 开始,并且该分区包括 179719092 个扇区。第二项表明在扩展分区中下一个 EBR 从第一个 EBR 偏移量 179719155 开始,同时,计数是从下一个 EBR 开始到下一个逻辑分区结束的扇区数量。清单 12 显示/dev/sda 上的扩展和逻辑分区信息。/dev/sda6 的扇区数是 636880859-336031668+1=300849192。在 清单 11 第二项中给出扇区数 300849255,就可以推断出 /dev/sda6 从偏移量 300849255-300849192=63 开始。这是一个常见的系统(包括 Windows XP)偏移量。

清单 12. /dev/sda 上的扩展和逻辑分区
dev/sda3       156312450  1874448134   859067842+   5  Extended
/dev/sda5       156312513   336031604    89859546   83  Linux
/dev/sda6       336031668   636880859   150424596   83  Linux
/dev/sda7       636880923   865983824   114551451   83  Linux
/dev/sda8       865983888   949891319    41953716   83  Linux
/dev/sda9       949891383   954003959     2056288+   b  W95 FAT32
/dev/sda10      954007552  1187801087   116896768   83  Linux
/dev/sda11     1187803136  1229760511    20978688   83  Linux
/dev/sda12     1229762560  1874446335   322341888   83  Linux

使用前面所学内容以及 showebr 函数和一些 shell 算法,现在可以完成 /dev/sda 的整个 EBR 链,如 清单 13 所示。

清单 13. 完成 /dev/sda 上逻辑分区链
[root@echidna ~]# showebr /dev/sda 156312450
0000000  00 fe ff ff 83 fe ff ff           63    179719092
0000010  00 fe ff ff 05 fe ff ff    179719155    300849255
[root@echidna ~]# showebr /dev/sda $(( 156312450 + 179719155 ))
0000000  00 fe ff ff 83 fe ff ff           63    300849192
0000010  00 fe ff ff 05 fe ff ff    480568410    229102965
[root@echidna ~]# showebr /dev/sda $(( 156312450 + 480568410 ))
0000000  00 fe ff ff 83 fe ff ff           63    229102902
0000010  00 fe ff ff 05 fe ff ff    709671375     83907495
[root@echidna ~]# showebr /dev/sda $(( 156312450 + 709671375 ))
0000000  00 fe ff ff 83 fe ff ff           63     83907432
0000010  00 fe ff ff 05 fe ff ff    793578870      4112640
[root@echidna ~]# showebr /dev/sda $(( 156312450 + 793578870 ))
0000000  00 fe ff ff 0b fe ff ff           63      4112577
0000010  00 fe ff ff 05 fe ff ff    797691510    233797128
[root@echidna ~]# showebr /dev/sda $(( 156312450 + 797691510 ))
0000000  00 fe ff ff 83 fe ff ff         3592    233793536
0000010  00 fe ff ff 05 fe ff ff   1031488638     41959424
[root@echidna ~]# showebr /dev/sda $(( 156312450 + 1031488638 ))
0000000  00 fe ff ff 83 fe ff ff         2048     41957376
0000010  00 fe ff ff 05 fe ff ff   1073448062    644685824
[root@echidna ~]# showebr /dev/sda $(( 156312450 + 1073448062 ))
0000000  00 fe ff ff 83 fe ff ff         2048    644683776
0000010  00 00 00 00 00 00 00 00            0            0

注意,偏移量为 3592 的分区。这相当于在 /dev/sda9 和 /dev/sda10 之间有 1.75MB 的可用空间。还请注意,/dev/sda12 是从偏移量 2048 开始的,而不是从 63 开始。您可以在驱动器上找到使用 2048 字节的扇区或固态硬盘,在固态硬盘中,扇区对齐很重要。

GUID Partition Table (GPT)

我在前面已经提到过,MBR 分区将 512 字节扇区的磁盘限制到 2TB 大小。随着超过 2TB 的磁盘的出现,设计出了一个名为 GUID Partition Table 或(GPT)的新布局。该格式可用于较小的磁盘上,但大型磁盘必须使用它。磁盘格式化将一个名号称受保护的 MBR 放置在 MBR 通常所在的位置,这样,不了解 GPT 的操作系统和实用工具会将整个磁盘看作一个未知分区类型(EEh),根据 MBR 支持的整个磁盘大小或最大磁盘大小,磁盘大小被相应地进行裁切,以符合磁盘扇区大小。

最近发布的 Linux 版本包括用于格式化的工具以及从 GPT 磁盘引导的工具,包括 gdisk(类似于 fdisk)、partedgpartedgrub2 和最新版本 grub

新版 Linux 系统支持使用传统 PC BIOS 或新的可扩展固件接口(或 EFI)从 GPT 分区引导。新的 64 位版本 Windows 也支持使用 EFI 从 GPT 分区引导。

GPT 分区包含一个 GPT 头部和一个 GPT 分区阵列。GPT 分区阵列包含至少 128 项,因此 GPT 磁盘可支持至少 128 个主分区。GPT 头部在 GPT 分区的第一个扇区中,分区阵列位于下一个扇区。GPT 头部和分区阵列均可以被复制到分区尾端。对于其他保护,该头部也包含一个 32-bit CRC 的分区阵列。

清单 14 显示可移动磁盘的 gdisk 命令的输出,有 5 个主分区。

清单 14. /dev/sdc 的 gdisk 输出
[root@echidna ~]# gdisk -l /dev/sdc
GPT fdisk (gdisk) version 0.8.4

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/sdc: 3906963456 sectors, 1.8 TiB
Logical sector size: 512 bytes
Disk identifier (GUID): 7E637BAC-33FC-46D3-9860-6A300CDD0E5F
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 3906963422
Partitions will be aligned on 2048-sector boundaries
Total free space is 1361893309 sectors (649.4 GiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1            2048       773580799   368.9 GiB   0700  Ian's partition 1
   2       773580800      1387724799   292.8 GiB   0700  Ian's partition 2
   3      1387724800      1831110655   211.4 GiB   0700  
   4      1831110656      2237978623   194.0 GiB   0700  
   5      2237978624      2545072127   146.4 GiB   8E00

在文章 “充分利用 GPT 和 Linux 的大型驱动器” 中可以找到更多关于 GPT 的信息(参见 参考资料)。

物理和逻辑卷管理的分区

我们在上文中提到过 LVM 可以在不划分磁盘的情况下利用整个分区。因为同样的原因,GPT 使用了一个受保护的 MBR,您应该在磁盘上创建一个分区,然后再分区上创建一个 PV,而不是使用 LVM 功能将整个磁盘定义为一个 PV。那样的话,其他不理解 LVM 的操作系统会识别出该磁盘有一个未知分区,而不是认为该磁盘已被格式化。

LVM 的抽象层管理明显需要比原来的 MBR 分区表更多的信息。我们不再进一步研究 LVM 使用的磁盘数据结构,而是建议您为自己的 PV 创建一个分区。要了解关于 LVM 的更多信息,请参阅 developerWorks 的文章 “逻辑卷管理”(参见 参考资料)。


分配磁盘空间

如前所述,Linux 文件系统是一个以 / 为根的庞大树形结构。必须挂载软盘或 CD-ROM 上的数据的原因也是显而易见的,但分隔存储在硬盘驱动器上的数据的原因却不是那么明显。分隔文件系统的部分原因包括:

  • 引导文件。在引导时,BIOS 或引导加载器必须能够访问某些引导文件。
  • 多个硬盘驱动器。通常每个硬盘驱动器将划分为一个或多个分区,各有一个必须挂载到文件系统树某处的文件系统。
  • 共享文件。可能有多个系统镜像共享静态文件,比如可执行程序文件。用户主目录或邮件池文件也可能是共享的,使用户能够在登录到网络上的任何一台机器时使用相同的主目录和邮件系统。
  • 可能出现的溢出问题。如果一个文件系统占满了 100% 的容量,那么最好将其与运行系统所需的文件分隔开来。
  • 配额。配额限制着用户或组可以占用的文件系统空间数量。
  • 只读挂载。在日志文件系统出现之前,系统崩溃后恢复文件系统往往要花费大量的时间。因此,应该以只读方式挂载不常更改的文件系统(例如可执行程序的目录),从而避免在系统崩溃后浪费时间来检查系统。

除了上述的文件系统使用方法之外,还需要考虑在磁盘上分配交换空间。对于 Linux 系统来说,该空间通常是一个专用的分区,也可能是多个专用分区。


做出选择

假设您正在设置一个包含至少一个硬盘驱动器的系统,您希望通过硬盘驱动器引导。(通过 LAN 引导的无盘工作站的设置和使用 live CD 或 DVD Linux 系统的考虑事项不在本文讨论范围之内。)尽管可以在稍后更改分区大小,但通常比较麻烦,因此预先做出最好的选择是十分重要的。下面将介绍相关内容。

您要考虑的第一个问题是确保系统可以引导。 某些旧系统存在限制,BIOS 仅能通过全部位于磁盘的前 1024 个柱面中的分区引导。如果您的系统就是这样的,那么 必须创建一个能够挂载为包含引导系统所需的关键文件的 /boot 的分区。加载了这些文件之后,Linux 系统将接管磁盘的操作,1024 个柱面的限制将不再影响系统的后续操作。如果您需要为 /boot 创建一个分区,通常 100 MB 的空间足矣。

要考虑的下一个问题应该是所需交换空间的大小。考虑到目前内存的价格,交换空间是一种非常缓慢的辅助存储器。一种常见的经验法则是创建与实际 RAM 大小相同的交换空间。如今,您可能希望为一个工作站配置一倍或两倍的实际 RAM,以便在使用某些大型程序时不会出现 RAM 不足的情况。虽然切换会降低速度,但在给定时间您通常仅使用其中之一或其中之二。

建议为内存极小的系统使用较大的交换空间。对于服务器来说,除非需要运行建议不同值的应用程序,否则您可能希望使用大小约为 RAM 一半的交换空间。在任何情况下,您都应该监控服务器的内存使用情况,以便按需添加实际 RAM 或将工作负载分布到其他服务器上。在服务器上过多进行交换并非良好的实践。可以使用交换文件,但专用分区的效果更理想。

现在,我们遇到了一个有分歧的话题。个人工作站的使用的可预测性要低于服务器的使用。我的建议(特别是对于新用户)是将大多数标准目录(/usr、/opt、/varNow 等)分配到一个大分区中。不清楚机器中究竟安装了哪些东西的新用户会发现这种做法很有帮助。运行图形化桌面和一定数量的开发工具的工作站需要 5 GB 或 5 GB 以上的磁盘空间以及用户所需的空间。某些大型开发工具可能要占用数 GB 的空间。我通常会为每个操作系统分配 40 GB 到 60 GB 的空间,将剩余的磁盘空间留作装载其他内容。

服务器的工作负载要更加稳定,同时特定文件系统中空间不足也会造成更加灾难性的后果。因此,通常应为服务器创建多个分区,分散在多个磁盘上,可能还要使用硬件或软件 RAID 或逻辑卷组。

您还需要考虑特定文件系统的工作负载,以及该文件系统是否要在多个系统间共享,还是仅供一个系统使用。您可以结合使用体验、容量规划工具,并预测增长,以便确定适合您的系统的最佳分配方式。

无论您是在配置工作站,还是在配置服务器,都有某些各系统特有的文件位于本地驱动器上。通常,这其中包括用于系统参数的 /etc、用于引导过程中所需文件的 /boot、用于引导或系统恢复所需文件的 /sbin、用于 root 用户的主目录的 /root、用于锁定文件的 /var/lock、用于正在运行的系统的信息的 /var/run、用于此系统日志文件的 /var/log。表示用户主目录的 /home、/usr、/opt、/var/mail 或 /var/spool/news 等其他文件系统可能位于独立的分区上,也可能是通过网络挂载的,具体取决于您的安装需求和偏好。

参考资料

学习

获得产品和技术

  • 下载 系统急救光盘,这是能帮助您在系统崩溃后恢复系统的一种在线工具。
  • 使用可直接从 developerWorks 下载的 IBM 试用软件,构建您的下一个 Linux 开发项目。

讨论

  • 加入 developerWorks 社区。探索由开发人员推动的博客、论坛、讨论组和维基,并与其他 developerWorks 用户进行交流。

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Linux, Open source
ArticleID=474542
ArticleTitle=学习 Linux,101: 硬盘布局
publish-date=01072013