概述
在这篇文章中学习为 Linux 系统设计磁盘分区布局。您将学到:
本文将帮助您准备 Linux Professional Institute's Junior Level Administration (LPIC-1) 考试 101 中主题 102 下的目标 102.1。该目标的权值为 2。
注意: 本文主要介绍布局的规划。如需了解实现 步骤,请参见针对主题 104 的文章(参见 学习 Linux,101:LPIC-1 路线图)。
先决条件
要充分地利用本系列文章,您应当对 Linux 以及在其中运行本文介绍的命令的 Linux 系统有一个基本的了解。在某些情况下,程序的不同版本可能使用不同的方式格式化输出,因此您的结果可能并不总是与本文所示的清单和图形完全一样。
文件系统概述
您可能会疑惑,如果文件系统只是一个庞大的树形结构,那么磁盘布局为什么如此重要。实际上,每一个区块设备(如硬盘驱动器分区、CD-ROM 或者软盘) 上都有一个文件系统。通过在称为挂载点 的点将文件系统 挂载 到不同的设备上来创建文件系统的单一树形视图。Linux 文件系统包含排列在磁盘或其他区块存储设备 的目录 中的文件。与其他许多系统相同,Linux 系统中的目录也包含其他目录,即子目录。Microsoft® Windows® 等系统的概念是在不同的驱动器盘符上(A:、C: 等)使用不同的文件系统,而 Linux 文件系统则截然不同,它是一个树形结构,以 / 目录作为根 目录。
通常情况下,内核通过将文件系统以 / 的形式挂载到某些硬盘驱动器分区上来启动这个挂载过程。您可以挂载其他硬盘驱动器分区,如 /boot、/tmp 或 /home。例如,您可以使用 /mnt/floppy 的形式挂载软盘驱动器上的文件系统,使用 /media/cdrom1 挂载 CD-ROM 上的文件系统。您还可以使用 NFS 等联网文件系统挂载来自其他系统中的文件。此外也有其他类型的文件挂载,但这几个例子能帮助您简单了解这个过程。尽管挂载过程实际上是指挂载某些设备上的文件系统,但人们通常会称之为 “挂载设备”,其真正的含义是 “挂载设备上的文件系统”。
现在,假设您已经挂载了根文件系统(/),您希望在挂载点 /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 驱动器,使用 /devsda 表示第一个 SATA 驱动器。在较新的系统上,所有 IDE 驱动器都命名为 /dev/sda、/dev/sdb 等。IDE 驱动器名称的更改是热插拔 系统造成的,最初支持的是 USB 驱动器。热插拔允许您在插入新设备后立即开始使用新设备,而现在这种命名用于所有设备,无论是内置于系统之中的设备,还是随后使用 USB 或 Firewire(IEEE 1394)或其他类型的连接插入正在运行的系统的设备。
传统上,硬盘驱动器会格式化为 512 字节的扇区。磁盘盘片在无需移动磁头的前提下即可读取的所有扇区组成一个磁道。磁盘通常具有多个盘片。各盘片上在无需移动磁头的前提下即可读取的磁道的集合称为柱面。硬盘驱动器的设定参数 使用柱面、每个柱面的磁道(或磁头)数以及扇区/磁道表示。在本文撰写之时,驱动器制造商开始生产具有 4K 扇区的磁盘。如果文件系统仍然假定使用 512 字节的扇区,而某个分区并非从位于 4K 边界的扇区开始,则将导致性能降低。
PC 系统上 DOS 操作系统中对于柱面、磁头和扇区大小的限制带来了 BIOS 转换的设定参数,以支持更大的硬盘驱动器。最终,即便这样的方法也不足以解决问题。磁盘驱动器技术的最新发展带来了逻辑块寻址(LBA),因而 CHS 设定参数指标的重要性有所降低,现代磁盘上报告的设定参数可能与物理扇区布局关系不大或者完全无关。如今,我们使用的磁盘更大,这迫使 LBA 推出了称为 LBA48 的扩展,最多可保留 48 个位供扇区号使用。
硬盘驱动器上的空间划分(或者说分区)为多个分区。分区不能重叠,未分配给分区的空间称为剩余空间。分区名的形式类似于 /dev/hda1、/dev/hda2、/dev/hda3、/dev/sda1 等。在未使用 IDE 驱动器热插拔支持的系统上,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 是磁盘上的第一个扇区,因而分区表在其中所占空间不大。这限制了一个磁盘上的主分区数量,最多为 4 个。如果需要 4 个以上的主分区(往往需要 4 个以上的主分区),其中一个主分区就必须以扩展分区的形式出现。
扩展分区 就是一个或多个逻辑分区的容器。这种分区模式最初是由 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 |
分配磁盘空间
如前所述,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 等其他文件系统可能位于独立的分区上,也可能是通过网络挂载的,具体取决于您的安装需求和偏好。