分类: LINUX
2014-01-26 14:19:44
概述
在本文中学习为 Linux 系统设计磁盘分区布局。您将学到:
本文将帮助您准备 Linux Professional Institute's Junior Level Administration (LPIC-1) 考试 101 中主题 102 下的目标 102.1。该目标的权值为 2。
注意:本文主要介绍布局规划。如需了解实现步骤,请参阅针对主题 104 的文章(在我们的 系列线图路 中有详细介绍)。
注意:本文包含适用于 LPI 的资料。我们添加了一些关于 Logical Volume Manager 的一些基本信息,还添加了更多关于与传统 MBR 磁盘一起使用的分区表布局的详细信息,以及一些关于 GUID Partition Table (GPT) 的基本信息。新代码清单和图都是在 64 位 Fedora 16 系统上完成的。
先决条件
要充分地学习本系列文章的内容,您应当对 Linux 以及在其中运行本文介绍的命令的 Linux 系统有一个基本的了解。在某些情况下,程序的不同版本可能使用不同的方式格式化输出,因此您的结果可能并不总是与本文所示的清单和图形完全一样。
文件系统概述
Linux 文件系统包含排列在磁盘或其他区块存储设备的目录中的文件。与其他许多系统相同,Linux 系统中的目录也包含其他目录,即子目录。 Microsoft? Windows? 等系统的概念是在不同的驱动器盘符上(A:,C:,等)使用不同的文件系统,而 Linux 文件系统则截然不同,它是一个树形结构,以 / 目录作为根 目录。
您可能会感到疑惑,如果文件系统只是一个庞大的树形结构,那么磁盘布局为什么如此重要。实际上,每一个区块设备(如硬盘驱动器分区、CD-ROM 或者软盘) 上都有一个文件系统。通过在称为挂载点的点将文件系统挂载到不同的设备上来创建文件系统的单一树形视图。
通常情况下,内核通过将某些硬盘驱动器分区上的文件系统以 / 的形式挂载来启动这个挂载过程。您可以挂载其他硬盘驱动器分区,如 /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 的更多信息,请参见 参考资料)。
目录 | 说明 |
---|---|
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 系统中,您可以使用 parted 或 fdisk 工具查看指定设定参数。较早版本的 Linux 参数也会在 /proc 文件系统的一个类似于 /proc/ide/hda/geometry 的文件中报告设定参数,而在较新版本的系统中可能无法找到这个文件。 清单 1 展示了如何使用 fdisk 命令来显示附加 SATA 的 IDE 硬盘驱动器的分区和设定参数。fdisk 的 -v 参数显示了版本。要显示或操纵分区表,您需要是 root 用户,或者通过 sudo 命令获得 root 权限,如本清单所示。
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 中不同单元的使用。
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) |
请注意,parted 和 fdisk 输出所显示的起始柱面和结束柱面截然不同,这是由于 parted 从零开始计算柱面,而 fdisk 从 1 开始计算。清单 3 表明,fdisk 与 parted 的起始扇区和结束扇区实际上是完全相同的。
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 命令,避免使用交互模式。
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 格式化磁盘。相反,您可以使用 parted、gparted 或 gdisk 命令。请参考 清单 14 中的 gdisk 输出示例。
警告:如果在使用 MBR 布局的磁盘上使用 gdisk,那么它将要求您将该磁盘转换成 GPT 格式,请注意!
Logical Volume Manager (LVM)
现在您已经了解了各种类型的分区,可能很想知道如果没有为各种分区规划合适的大小将会发生什么。如果对它们进行扩展或收缩?如果一个大型文件系统需要更多空间而不仅仅是单个磁盘容量会发生什么呢?这就交给 Logical Volume Manager(LVM)处理吧。
使用 LVM,您就可以抽象化磁盘空间管理了,这样单个文件系统就可以跨多个磁盘或分区,而且也易于向文件系统添加空间或从中删除空间。当前版本是 lvm2,向后兼容原版 LVM(现在有时候称为 lvm1)。
LVM 以以下抽象对象的方式管理磁盘空间:
物理卷既可以是整个驱动器也可以是驱动器上的一个分区。尽管 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 命令以及各种可在其中运行的命令。
[root@echidna ~]# lvm lvm> help Available lvm commands: Use 'lvm help |
为了向您提供一个运行的 LVM 的简洁样例,我在 /dev/sdc5 上为 LVM 创建了一个 GPT 分区(分区类型 0083),在 /dev/sdd1 上为 LVM 创建了一个 MBR 分区(分区类型 83)。您在这些分区上已经创建了 PV,如 清单 6 所示,可在其中使用 pvscan 显示系统上的 PV。
[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 所示。
[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 |
注意:
要了解比该概要简介更多的信息,参考 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 字节词条的布局。
偏移量(16 进制) | 长度 | 描述 |
0h | 1 | 状态。80h 表示活动(或可引导)分区 |
1h | 3 | 分区中第一个独立扇区的 CHS (Cylinder-Head-Sector) 地址 |
4h | 1 | 分区类型 |
5h | 3 | 分区中最后一个独立扇区的 CHS (Cylinder-Head-Sector) 地址 |
8h | 4 | 分区中第一个独立扇区的 Logical Block Address (LBA) 地址 |
Ch | 4 | 分区中的扇区数 |
看一个真实示例。root 用户可以使用 dd 命令直接从磁盘上读取扇区。 清单 8 显示在 /dev/sda 上转储 MBR 第一个 510 字节的输出,然后使用 tail 命令选择该记录的最后一个 64 字节,然后以十六进制显示。
[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。
注意:
[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 的逻辑分区。 。图像顶部的图示以框架(浅蓝色)的形式显示逻辑分区周围的扩展分区。
如上所述,MBR 不包括逻辑分区的分区表条目;它定义一个容器查看系统其余部分,比如特定分区。 逻辑分区在该容器内定义。那这又如何运作呢?
扩展分区内的逻辑分区数量没有严格限制,所以非固定大小的分区表定义逻辑分区。而且,每个逻辑分区都有一个 Extended Boot Record(或 EBR)。像 MRB 一样,EBR 的长度是 512 字节,至于 MBR,可以使用偏移量为 446(1BEh)的分区表。在 EBR 分区表中仅使用两个条目。第一个定义当前分区的偏移量和大小,第二项定义偏移量并计算下一个逻辑分区的结束点。对于单链接链中的最后一个逻辑分区,第二项为零。
为了使将 little-endian 十六进制数转换为十进制数的工作变得轻松,创建一个小的 Bash 函数来显示 EBR 中的前两项。然后使用 hexdump 命令的格式化字符串功能来显示 LBA 的开始扇区,以及十进制数扇区数,而不是十六进制。清单 10 显示了 showebr 函数。
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 显示输出。
[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)偏移量。
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 所示。
[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)、parted、gparted、grub2 和最新版本 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 个主分区。
[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 上的数据的原因也是显而易见的,但分隔存储在硬盘驱动器上的数据的原因却不是那么明显。分隔文件系统的部分原因包括:
除了上述的文件系统使用方法之外,还需要考虑在磁盘上分配交换空间。对于 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 等其他文件系统可能位于独立的分区上,也可能是通过网络挂载的,具体取决于您的安装需求和偏好。