Amazon Elastic Compute Cloud
Linux 实例用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

扩展 Linux 分区

某些 Amazon EC2 根卷和从快照还原的卷包含实际保存文件系统和数据的分区。如果您将卷视为容器,则分区是卷中的另一个容器,并且数据位于分区上。增大卷大小并不会增大分区;要利用较大卷,分区必须扩展为新大小。

注意

并非所有从快照还原的卷都进行分区,此过程可能不适用于您的卷。您可能只需对卷上的文件系统调整大小,即可使所有空间可用。如果您不确定卷是否具有需要调整大小的分区,请参阅检查您的卷分区是否需要调整大小了解更多信息。

如果要扩展的分区不是根分区,只需卸载它并通过实例本身调整分区大小。如果要调整大小的分区是实例的根分区,则过程更复杂,因为您无法卸载正在运行的实例的根分区。您必须对其他实例 (这称为辅助实例) 执行以下过程。

重要

以下过程是针对 Amazon Linux 编写的并在其上进行了测试。具有不同工具集和工具版本的其他分发版的行为方式可能不同。

为进行扩展准备 Linux 根分区

要扩展实例的根分区,需要执行几个步骤。如果要扩展的分区不是根分区,则此过程不是必需的。

为进行扩展准备 Linux 根分区

  1. 如果您的主实例正在运行,请停止它。您无法对正在运行的实例执行此过程的其余部分。有关更多信息,请参阅 停止和启动您的实例

  2. 检查卷的完整性。如果快照选取损坏的文件系统,会导致恢复后的根卷无法引导。

  3. 拍摄卷的快照。在以下过程中,可能容易损坏或丢失数据。如果您具有最新快照,则随时可以在出现错误时重新开始,数据仍是安全的。有关更多信息,请参阅 创建 Amazon EBS 快照

  4. 记录卷附加到的设备名称。您可以在实例详细信息窗格的 Root device (根设备) 字段中找到此信息。该值可能为 /dev/sda1/dev/xvda

  5. 从主实例分离卷。有关更多信息,请参阅 将 Amazon EBS 卷与实例分离

  6. 将卷附加到同一个可用区中的其他 (辅助) 实例。有关更多信息,请参阅 将 Amazon EBS 卷附加到实例。如果您的 EBS 卷已加密,则必须使用支持 Amazon EBS 加密 的辅助实例;否则,您可以在此过程使用 t2.micro 实例。有关更多信息,请参阅 支持的实例类型。如果您还没有辅助实例,则必须启动一个。有关更多信息,请参阅 使用启动实例向导启动实例

    重要

    在附加卷时,辅助实例必须在运行,并且您不应在附加了多个根卷时重新启动辅助实例;启动附加了多个根卷的实例可能会造成该实例启动至错误的卷。

  7. 使用 SSH 登录辅助实例。有关更多信息,请参阅 连接到您的 Linux 实例。继续执行下一个过程。

使用 parted 扩展 Linux 分区

parted 实用工具是一款分区编辑工具,大多数 Linux 分发版均会提供。它可以创建和编辑 MBR 分区表和 GPT 分区表。某些版本的 parted (高于版本 2.1) 对 GPT 分区表的支持有限,如果使用这些版本的 parted 修改启动卷,则可能会导致启动问题。可以使用 命令查看 partedparted --version 的版本。

如果要扩展的分区位于采用 GPT 分区设备上,则应选用 gdisk 实用工具。如果您不确定自己的卷所用的磁盘标签类型,可以使用 sudo fdisk -l 命令查看。有关更多信息,请参阅 使用 gdisk 扩展 Linux 分区

使用 parted 扩展 Linux 分区

如果要扩展的分区是根分区,请务必先执行为进行扩展准备 Linux 根分区中的步骤。

  1. 确定包含要扩展的分区的设备。使用 lsblk 命令列出附加到实例的所有设备和分区。

    [ec2-user ~]$ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT xvdf 202:80 0 100G 0 disk └─xvdf1 202:81 0 8G 0 part /mnt xvda1 202:1 0 30G 0 disk /

    在该示例中,xvdf 设备有 100 GiB 可用存储,包含一个 8 GiB 分区。

  2. 如果该分区已装载,请卸载它。使用来自 lsblk 命令的 MOUNTPOINT 值运行 umount 命令。在此示例中,分区的 MOUNTPOINT 值是 /mnt

    [ec2-user ~]$ sudo umount /mnt
  3. 拍摄卷的快照 (除非您刚才在上一个过程中拍摄了一个快照)。在以下过程中,可能容易损坏或丢失数据。如果您具有最新快照,则随时可以在出现错误时重新开始,数据仍是安全的。有关更多信息,请参阅 创建 Amazon EBS 快照

  4. 对设备 (而不是设备上的分区) 运行 parted 命令。请注意将 /dev/ 前缀添加到 lsblk 输出的名称。

    [ec2-user ~]$ sudo parted /dev/xvdf GNU Parted 2.1 Using /dev/xvdf Welcome to GNU Parted! Type 'help' to view a list of commands.
  5. parted 度量单位更改为扇区。

    (parted) unit s
  6. 运行 print 命令,列出设备上的分区。对于某些分区表类型,系统可能会提示您针对较大卷大小修复分区表。对所有关于是否修复现有分区表的问题回答“Ignore”;之后开始创建新表。

    (parted) print
    1. 如果收到以下消息,请输入“Ignore”以防止备份 GPT 位置更改。

      Error: The backup GPT table is not at the end of the disk, as it should be. This might mean that another operating system believes the disk is smaller. Fix, by moving the backup to the end (and removing the old backup)? Fix/Ignore/Cancel? Ignore
    2. 如果收到以下消息,请再次输入“Ignore”使驱动器上的空间保持不变。

      Warning: Not all of the space available to /dev/xvdf appears to be used, you can fix the GPT to use all of the space (an extra 46137344 blocks) or continue with the current setting? Fix/Ignore? Ignore
  7. 检查输出以了解磁盘总大小、分区表类型、分区编号、分区起点和任何标志 (如 boot)。对于 gpt 分区表,记下分区名称;对于 msdos 分区表,记下 Type 字段 (primaryextended)。这些值将在后面的步骤中使用。

    以下是 gpt 分区表示例。

    Model: Xen Virtual Block Device (xvd) Disk /dev/xvdf: 209715200s Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 128 2048s 4095s 2048s BIOS Boot Partition bios_grub 1 4096s 16777182s 16773087s ext4 Linux

    以下是 msdos 分区表示例。

    Model: Xen Virtual Block Device (xvd) Disk /dev/xvdg: 104857600s Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 2048s 35649535s 35647488s primary ext3
  8. 使用来自上一步的编号 (1) 删除分区的分区条目。

    (parted) rm 1
  9. 创建扩展到卷末尾的新分区。

    (对于 gpt 分区表示例) 记下上面的分区 1 的起点和名称。对于 gpt 示例,起点为 4096s,名称为 Linux。使用分区 1 的起点、名称和 100% 运行 mkpart 命令,以使用所有可用空间。

    (parted) mkpart Linux 4096s 100%

    (对于 msdos 分区表示例) 记下上面的分区 1 的起点和分区类型。对于 msdos 示例,起点为 2048s,分区类型为 primary。使用主分区类型、分区 1 的起点和 100% 运行 mkpart 命令,以使用所有可用空间。

    (parted) mkpart primary 2048s 100%
  10. 再次运行 print 命令以验证分区。

    (对于 gpt 分区表示例)

    (parted) print Model: Xen Virtual Block Device (xvd) Disk /dev/xvdf: 209715200s Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 128 2048s 4095s 2048s BIOS Boot Partition bios_grub 1 4096s 209713151s 209709056s ext4 Linux

    (对于 msdos 分区表示例)

    (parted) print Model: Xen Virtual Block Device (xvd) Disk /dev/xvdg: 104857600s Sector size (logical/physical): 512B/512B Partition Table: msdos Number Start End Size Type File system Flags 1 2048s 104857599s 104855552s primary ext3
  11. 对于扩展的分区,检查以前存在的任何标志是否仍存在。有时 boot 标志可能会丢失。如果在扩展时分区丢弃了标志,请使用以下命令添加标志 (替换为您的分区编号和标志名称)。例如,以下命令将 boot 标志添加到分区 1。

    (parted) set 1 boot on

    可以再次运行 print 命令以验证更改。

  12. 运行 quit 命令,退出 parted

    (parted) quit

    注意

    由于您删除了一个分区并添加了一个分区,因此 parted 会警告您需要更新 /etc/fstab。仅当分区编号更改时,才需要此操作。

  13. 检查文件系统以确保没有错误 (需要先执行此操作,然后才能扩展文件系统)。记录上一个 print 命令中的文件系统类型。根据您的文件系统类型选择以下命令之一;如果使用其他文件系统,请参阅该文件系统的文档以确定正确的检查命令。

    (对于 ext3ext4 文件系统)

    [ec2-user ~]$ sudo e2fsck -f /dev/xvdf1 e2fsck 1.42.3 (14-May-2012) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /: 31568/524288 files (0.4% non-contiguous), 266685/2096635 blocks

    (对于 xfs 文件系统)

    [ec2-user ~]$ sudo xfs_repair /dev/xvdf1 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done
  14. 后续步骤因扩展的分区是否属于当前实例或是否为另一个实例的根分区而异。

使用 gdisk 扩展 Linux 分区

gdisk 实用工具 (有时称为 GPT fdisk) 是用于创建和编辑分区表的文本界面菜单驱动型工具,在某些分发版中对 GPT 分区表的支持比 parted 更好。许多常用 Linux 分发版 (例如 Amazon Linux 和 Ubuntu) 默认提供 gdisk。如果您的分发版不提供 gdisk 命令,则可以通过访问获取 GPT fdisk 来了解如何获取它;在许多情况下,启动一个 Amazon Linux 实例并将其用作辅助实例要简单得多,因为已提供了 gdisk 命令。

使用 gdisk 扩展 Linux 分区

如果要扩展的分区是根分区,请务必先执行为进行扩展准备 Linux 根分区中的步骤。

  1. 确定包含要扩展的分区的设备。使用 lsblk 命令列出附加到实例的所有设备和分区。

    [ec2-user ~]$ lsblk NAME MAJ:MIN RM SIZE RO MOUNTPOINT xvdf 202:80 0 100G 0 xvdf1 202:81 0 9.9G 0 /mnt xvda1 202:1 0 30G 0 /

    在此示例中,xvdf 设备有 100 GiB 可用存储,包含一个 9.9 GiB 分区。

  2. 如果该分区已装载,请卸载它。使用来自 lsblk 命令的 MOUNTPOINT 值运行 umount 命令。在此示例中,分区的 MOUNTPOINT 值是 /mnt

    [ec2-user ~]$ sudo umount /mnt
  3. 拍摄卷的快照 (除非您刚才在上一个过程中拍摄了一个快照)。在以下过程中,可能容易损坏或丢失数据。如果您具有最新快照,则随时可以在出现错误时重新开始,数据仍是安全的。有关更多信息,请参阅 创建 Amazon EBS 快照

  4. 对设备 (而不是设备上的分区) 运行 gdisk 命令。请注意将 /dev/ 前缀添加到 lsblk 输出的名称。

    [ec2-user ~]$ sudo gdisk /dev/xvdf gdisk /dev/xvdf GPT fdisk (gdisk) version 0.8.10 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT.
  5. 运行 p 命令以打印设备的分区表。

  6. 查看磁盘标识符、分区编号、起始扇区、分区代码和分区名称的输出。如果您的卷有多个分区,请记录所有分区。

    Command (? for help): p Disk /dev/xvdf: 209715200 sectors, 100.0 GiB Logical sector size: 512 bytes Disk identifier (GUID): 947F4655-F3BF-4A1F-8203-000000000000 Partition table holds up to 128 entries First usable sector is 34, last usable sector is 20705246 Partitions will be aligned on 2048-sector boundaries Total free space is 2108 sectors (1.0 MiB) Number Start (sector) End (sector) Size Code Name 1 2048 20705152 9.9 GiB EF00 lxroot

    在以上示例中,磁盘标识符是 947F4655-F3BF-4A1F-8203-000000000000,分区编号是 1,起始扇区是 2048,代码是 EF00,名称是 lxroot。您的值将有所区别。

  7. 因为现有分区表最初是为较小卷创建的,所以您需要为较大卷创建新分区表。运行 o 命令以创建新的空分区表。

    Command (? for help): o This option deletes all partitions and creates a new protective MBR. Proceed? (Y/N): Y
  8. 使用 n 命令在设备上为各个分区创建新的分区条目。

    • 如果您的卷只有一个分区,请在每次出现提示时输入您之前记录的值。对于最后扇区值,使用默认值扩展为整个卷大小。

      Command (? for help): n Partition number (1-128, default 1): 1 First sector (34-209715166, default = 2048) or {+-}size{KMGTP}: 2048 Last sector (2048-209715166, default = 209715166) or {+-}size{KMGTP}: 209715166 Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): EF00 Changed type of partition to 'EFI System'
    • 如果您的卷有不止一个分区,可能是一个 BIOS 引导分区和一个主要数据分区。使用您之前记录的值为 BIOS 引导分区创建新的分区条目。使用您之前记录的值为主要数据分区创建另一个新分区条目。对于最后一个扇区值,请使用默认值扩展为整个卷大小。

      Command (? for help): n Partition number (1-128, default 1): 1 First sector (34-209715166, default = 2048) or {+-}size{KMGTP}: 2048 Last sector (2048-209715166, default = 209715166) or {+-}size{KMGTP}: 4095 Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): EF02 Changed type of partition to 'BIOS boot partition' Command (? for help): n Partition number (2-128, default 2): 2 First sector (34-209715166, default = 4096) or {+-}size{KMGTP}: 4096 Last sector (4096-209715166, default = 209715166) or {+-}size{KMGTP}: 209715166 Current type is 'Linux filesystem' Hex code or GUID (L to show codes, Enter = 8300): 0700 Changed type of partition to 'Microsoft basic data'
  9. 使用 c 命令将各个分区的名称更改为前一个分区的名称。如果您的分区没有名称,按 Enter 即可。

    Command (? for help): c Using 1 Enter name: lxroot
  10. 使用 x 命令进入专家命令菜单。

  11. 使用 g 命令将磁盘标识符更改为原始值。

    Expert command (? for help): g Enter the disk's unique GUID ('R' to randomize): 947F4655-F3BF-4A1F-8203-A7B30C2A4425 The new disk GUID is 947F4655-F3BF-4A1F-8203-A7B30C2A4425
  12. 使用 w 命令将更改写入设备并退出。

    Expert command (? for help): w Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING PARTITIONS!! Do you want to proceed? (Y/N): Y OK; writing new GUID partition table (GPT) to /dev/xvdf. The operation has completed successfully.
  13. 检查文件系统以确保没有错误 (需要先执行此操作,然后才能扩展文件系统)。

    1. 替换您刚刚扩展的分区 (如果卷有多个分区,这可能是 /dev/xvdf2),使用以下命令查找文件系统类型。

      [ec2-user ~]$ sudo file -sL /dev/xvdf1
    2. 根据您的文件系统类型选择以下命令之一。如果使用其他文件系统,请参阅该文件系统的文档以确定正确的检查命令。

      (对于 ext3ext4 文件系统)

      [ec2-user ~]$ sudo e2fsck -f /dev/xvdf1 e2fsck 1.42.3 (14-May-2012) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /: 31568/524288 files (0.4% non-contiguous), 266685/2096635 blocks

      (对于 xfs 文件系统)

      注意

      您可能需要安装 xfsprogs 包以便使用 XFS 文件系统。使用以下命令向 Amazon Linux 实例中添加 XFS 支持。

      [ec2-user ~]$ sudo yum install -y xfsprogs
      [ec2-user ~]$ sudo xfs_repair /dev/xvdf1 Phase 1 - find and verify superblock... Phase 2 - using internal log - zero log... - scan filesystem freespace and inode maps... - found root inode chunk Phase 3 - for each AG... - scan and clear agi unlinked lists... - process known inodes and perform inode discovery... - agno = 0 - agno = 1 - agno = 2 - agno = 3 - process newly discovered inodes... Phase 4 - check for duplicate blocks... - setting up duplicate extent list... - check for inodes claiming duplicate blocks... - agno = 0 - agno = 1 - agno = 2 - agno = 3 Phase 5 - rebuild AG headers and trees... - reset superblock... Phase 6 - check inode connectivity... - resetting contents of realtime bitmap and summary inodes - traversing filesystem ... - traversal finished ... - moving disconnected inodes to lost+found ... Phase 7 - verify and correct link counts... done
  14. 后续步骤因扩展的分区是否属于当前实例或是否为另一个实例的根分区而异。

将扩展的分区恢复到其原始实例

如果您扩展另一个实例中的根分区,请按照本过程将卷恢复到其原始实例。

将扩展的根分区恢复到其原始实例

  1. 将扩展的分区与其辅助实例分离。有关更多信息,请参阅 将 Amazon EBS 卷与实例分离

  2. 使用步骤 4准备过程中标识的设备名称,将卷重新附加到主实例。有关更多信息,请参阅 将 Amazon EBS 卷附加到实例

  3. 启动主实例。有关更多信息,请参阅 停止和启动您的实例

  4. (可选) 如果您只是为了扩展分区而启动了辅助实例,则可以终止该实例以停止产生费用。有关更多信息,请参阅 终止您的实例

  5. 按照调整卷大小后扩展 Linux 文件系统 中的过程连接到主实例并扩展文件系统以使用新提供的空间。

完成此文件系统扩展过程之后,您可以从可用于启动具有所需分区大小的新实例的实例创建 AMI。有关更多信息,请参阅 Amazon 系统映像 (AMI)