学习 Linux,101: 硬盘布局

概述

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

  • 为各分区或磁盘分配文件系统和交换空间
  • 为系统的目标用途定制设计
  • 确保系统能够引导

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

注意: 本文主要介绍布局的规划。如需了解实现 步骤,请参见针对主题 104 的文章(参见 学习 Linux,101:LPIC-1 路线图)。

先决条件

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

文件系统概述

联系 Ian

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

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

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

通常情况下,内核通过将文件系统以 / 的形式挂载到某些硬盘驱动器分区上来启动这个挂载过程。您可以挂载其他硬盘驱动器分区,如 /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 的更多信息,请参见 参考资料)。


表 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 驱动器,使用 /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 权限,如本清单所示。


清单 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)

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


清单 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 是磁盘上的第一个扇区,因而分区表在其中所占空间不大。这限制了一个磁盘上的主分区数量,最多为 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 命令,避免使用交互模式。


清单 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

分配磁盘空间

如前所述,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 等其他文件系统可能位于独立的分区上,也可能是通过网络挂载的,具体取决于您的安装需求和偏好。


参考资料

学习

  • 使用 学习 Linux,101:LPIC-1 路线图 找到可以帮助您准备基于 2009 年 4 月的目标的 LPIC-1 认证的 developerWorks 文章。

  • 在 LPIC Program 站点中,可以找到 Linux Professional Institute 的 Linux 系统管理认证的三个级别的具体目标、任务列表、样例问题。具体请参见 2009 年 4 月的 LPI 考试 101 和 LPI 考试 102 目标。 请随时关注 LPIC Program 站点,以便了解最新目标。

  • 回顾 developerWorks 上的整个 LPI 考试准备系列,学习 Linux 基础知识,并为参加基于 2009 年 4 月之前的早期 LPI 考试目标的系统管理员认证考试准备。

  • 在 Filesystem Hierarchy Standard 主页 中进一步了解 FHS。

  • 在 “Linux 开发新手基本任务”(developerWorks,2005 年 3 月)中,了解如何打开一个终端窗口或 shell 提示以及更多内容。

  • Linux 文档项目 提供了大量有用的文档,特别是 HOWTO 文档。 

  • 在 developerWorks Linux 专区 寻找为 Linux 开发人员(包括 Linux 新手入门)准备的更多参考资料,查阅我们 最受欢迎的文章和教程。 

  • 随时关注 developerWorks 技术活动和网络广播。 

获得产品和技术

  • 下载 系统急救光盘,这是能帮助您在系统崩溃后恢复系统的一种在线工具。

  • 使用可直接从 developerWorks 下载的 IBM 产品评估试用版软件 构建您的下一个 Linux 开发项目。 

讨论

  • 参与论坛讨论。

  • 加入 My developerWorks 社区。与其他 developerWorks用户交流,查看开发人员推动的博客、论坛、讨论组和 wiki。 

  • from: http://www.ibm.com/developerworks/cn/linux/l-lpic1-v3-102-1/index.html

你可能感兴趣的:(linux,服务器,ext,扩展,hierarchy,磁盘)