管理 RHEL 存储分区与交换空间

红帽企业 LinuxBeginner
立即练习

简介

在本实验中,你将获得在红帽企业级 Linux (RHEL) 系统上管理存储分区和交换空间的实践经验。你将学习如何创建并持久化挂载 XFS 分区,以及如何配置和激活具有不同优先级的交换分区。本实验使用 LabEx 虚拟机环境及可用的存储设备,让你能够练习这些核心的系统管理技能。

你将首先检查可用的磁盘,然后进行分区的创建与管理,包括在必要时设置 GPT 分区表。本实验重点在于确保挂载的持久性和交换空间的激活,从而让你全面理解 RHEL 环境下的磁盘管理。

检查可用的练习磁盘

在此步骤中,你将检查 LabEx 虚拟机上可用的存储设备。LabEx 环境提供了一个额外的存储设备用于分区练习,但其设备名称在不同的虚拟机实例中可能会有所不同。

首先,切换到 root 用户以执行磁盘管理操作。你当前以具有 sudo 权限的 labex 用户身份登录。

sudo su -

现在,使用 lsblk 命令查看系统上可用的块设备:

lsblk

你应该会看到类似以下的输出,显示了系统磁盘和一个额外的磁盘:

NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
vda         253:0    0   40G  0 disk
├─vda1      253:1    0    1M  0 part
├─vda2      253:2    0  100M  0 part /boot/efi
└─vda3      253:3    0 39.9G  0 part /
nvme1n1     259:0    0   40G  0 disk

接下来,识别额外的练习磁盘并为后续步骤定义可重用的 Shell 变量。PRACTICE_DISK 变量存储磁盘设备名称,PART_PREFIX 则用于处理不同设备(如 /dev/vdb1/dev/nvme1n1p1)之间的分区命名差异。

export ROOT_PARTITION="$(findmnt -n -o SOURCE /)"
export ROOT_DISK="/dev/$(lsblk -no PKNAME "$ROOT_PARTITION")"
export PRACTICE_DISK="$(lsblk -dpno NAME,TYPE | awk -v root="$ROOT_DISK" '$2=="disk" && $1 != root {print $1; exit}')"
if [[ "$PRACTICE_DISK" =~ [0-9]$ ]]; then
  export PART_PREFIX="${PRACTICE_DISK}p"
else
  export PART_PREFIX="${PRACTICE_DISK}"
fi
echo "Practice disk: $PRACTICE_DISK"
echo "Partition prefix: $PART_PREFIX"

你应该会看到类似以下的输出。你的设备名称可能是 /dev/vdb/dev/nvme0n1/dev/nvme1n1

Practice disk: /dev/nvme1n1
Partition prefix: /dev/nvme1n1p

使用带有 -f 选项的 lsblk 命令显示练习磁盘的文件系统信息:

lsblk -f "$PRACTICE_DISK"

你应该会看到类似以下的输出,表明该练习磁盘是一个未格式化的新磁盘:

NAME     FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
nvme1n1

接下来,使用 parted 命令获取关于磁盘的更详细信息,包括其分区表:

parted "$PRACTICE_DISK" print

输出应显示练习磁盘上尚无分区表。模型和设备名称将与你的虚拟机实例匹配:

Error: /dev/nvme1n1: unrecognised disk label
Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: unknown
Disk Flags:

这确认了额外的练习磁盘已准备好进行分区。对于尚未初始化分区表的磁盘,出现此错误消息是正常的。

在练习磁盘上创建 XFS 分区并持久化挂载

在此步骤中,你将在练习磁盘上创建一个新分区,使用 XFS 文件系统对其进行格式化,并配置其持久化挂载。

以下命令假设你仍处于步骤 1 中的 root shell 环境,因此 PRACTICE_DISKPART_PREFIX 变量仍然可用。你将在该磁盘上创建一个 1 GB 的主分区,并将文件系统类型指定为 XFS。从 2048s 扇区开始是常见的对齐选择。

首先,在未初始化的磁盘上创建分区表。 使用交互模式下的 parted 来创建分区表和分区:

parted "$PRACTICE_DISK"
GNU Parted 3.5
Using /dev/nvme1n1
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel msdos
(parted) mkpart
Partition type?  primary/extended? primary
File system type?  [ext2]? xfs
Start? 2048s
End? 1001MB
(parted) quit
Information: You may need to update /etc/fstab.

注意: mklabel msdos 命令会在磁盘上创建一个 MBR (Master Boot Record) 分区表。在创建任何分区之前,这是必需的。创建分区表后,你可以继续使用 mkpart 创建实际的分区。由于分区从 2048s 扇区开始,将结束位置设置为 1001MB 会得到一个大约 1 GB 的分区。当你退出 parted 时,会看到关于更新 /etc/fstab 的提示信息,这是正常的。

要验证分区是否已创建,请打印练习磁盘的分区表:

parted "$PRACTICE_DISK" print

你应该会看到类似以下的输出,显示你刚创建的主分区:

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1001MB  1000MB  primary

创建新分区后,运行 udevadm settle 以便内核注册新的分区设备,例如 /dev/vdb1/dev/nvme1n1p1

udevadm settle

分区创建完成后,使用 XFS 文件系统对其进行格式化:

mkfs.xfs "${PART_PREFIX}1"

输出将显示有关 XFS 文件系统创建的详细信息:

meta-data=/dev/nvme1n1p1         isize=512    agcount=4, agsize=61056 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1 nrext64=0
data     =                       bsize=4096   blocks=244224, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=16384, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

为了使文件系统可访问,请创建一个挂载点目录。你将把此分区挂载到 /archive

mkdir -p /archive

为了实现持久化挂载,请在 /etc/fstab 中添加一个条目。请使用分区的 UUID,因为设备名称(如 /dev/vdb1/dev/nvme1n1p1)在不同环境中可能会发生变化。

查看第一个分区的 UUID:

lsblk --fs "${PART_PREFIX}1"

记下输出中的 UUID。它看起来类似于 881e856c-37b1-41e3-b009-ad526e46d987

NAME        FSTYPE FSVER LABEL UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
nvme1n1p1   xfs                2ee03827-6acf-4543-9a21-0fd031250b45

现在,使用 nano 打开 /etc/fstab 文件,并为你的分区添加一行。将 YOUR_UUID_HERE 替换为你刚才找到的实际 UUID。

nano /etc/fstab

在文件末尾添加以下行:

UUID=YOUR_UUID_HERE /archive xfs defaults 0 0

Ctrl+X 保存文件,然后按 Y 确认,最后按 Enter 写入文件。

修改 /etc/fstab 后,通知 systemd 重新加载配置,以便它识别新条目。

systemctl daemon-reload

最后,使用 /etc/fstab 中的条目挂载新文件系统。

mount /archive

验证新文件系统是否已正确挂载:

mount | grep /archive

你应该会看到类似以下的输出,确认挂载成功:

/dev/nvme1n1p1 on /archive type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

在练习磁盘上创建并激活交换分区

在此步骤中,你将在练习磁盘上创建一个交换分区。交换空间是硬盘驱动器 (HDD) 或固态驱动器 (SSD) 的一部分,当系统物理内存 (RAM) 不足时,它会被用作临时存储。它充当 RAM 的溢出空间,允许系统在内存稀缺时继续运行,尽管速度会较慢。

首先,检查练习磁盘上当前的分区表,以确定在哪里创建新的交换分区。

parted "$PRACTICE_DISK" print

你应该会看到你在上一步中创建的现有 XFS 分区 (${PART_PREFIX}1):

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 5369MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1001MB  1000MB  primary  xfs

现在,添加一个 500 MB 的新主分区用作交换空间。新分区紧接在现有第一个分区之后,因此它从 1001MB 开始,到 1501MB 结束。

使用非交互模式下的 parted 创建此分区:

parted "$PRACTICE_DISK" mkpart primary linux-swap 1001MB 1501MB

你可能会再次看到 Information: You may need to update /etc/fstab. 的提示信息。

通过列出练习磁盘上的分区来验证你的工作:

parted "$PRACTICE_DISK" print

你现在应该看到两个分区,第二个分区就是你的新交换分区:

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1001MB  1000MB  primary  xfs
 2      1001MB  1501MB  499MB   primary               swap

和之前一样,运行 udevadm settle 以确保系统注册新分区并创建其设备文件,例如 /dev/vdb2/dev/nvme1n1p2

udevadm settle

现在,使用 mkswap 命令将第二个分区格式化为交换空间:

mkswap "${PART_PREFIX}2"

输出将显示有关交换空间创建的详细信息,包括其大小和生成的 UUID:

Setting up swapspace version 1, size = 476 MiB (499118080 bytes)
no label, UUID=4379b167-ab39-4c83-bf7c-b28fbdb38725

为了配置新交换空间以实现持久化激活,请在 /etc/fstab 中添加一个条目。首先,查看第二个分区的 UUID:

lsblk -o UUID "${PART_PREFIX}2"

记下输出中的 UUID。它类似于 4379b167-ab39-4c83-bf7c-b28fbdb38725

UUID
4379b167-ab39-4c83-bf7c-b28fbdb38725

使用 nano 打开 /etc/fstab,并为你的交换分区添加一行。将 YOUR_SWAP_UUID_HERE 替换为你刚才找到的实际 UUID。

nano /etc/fstab

在文件末尾添加以下行:

UUID=YOUR_SWAP_UUID_HERE swap swap defaults 0 0

Ctrl+X 保存文件,然后按 Y 确认,最后按 Enter 写入文件。

修改 /etc/fstab 后,重新加载 systemd 守护进程以识别新条目:

systemctl daemon-reload

最后,使用 swapon -a 启用交换空间:

swapon -a

验证新交换空间是否已启用:

swapon --show

你应该会看到类似以下的输出,确认你的新交换分区已激活:

NAME            TYPE      SIZE USED PRIO
/dev/nvme1n1p2  partition 476M   0B   -2

输出显示你刚创建的交换分区已激活并可供使用。

在练习磁盘上创建更多分区

在此步骤中,你将在练习磁盘上创建更多分区。由于你已经使用 MBR (msdos) 分区表创建了一个 XFS 分区和一个交换分区,你仍然有空间可以创建更多分区。现在你将创建第三个分区,以演示如何管理更大的分区。

首先,检查练习磁盘上当前的分区表和可用空间:

parted "$PRACTICE_DISK" print

你应该会看到你之前创建的两个分区:

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1001MB  1000MB  primary  xfs
 2      1001MB  1501MB  500MB   primary  linux-swap

现在,你将创建一个 2 GB 的第三分区用于额外存储。此分区将从 1501MB(交换分区的末尾)开始,到 3501MB(1501MB + 2000MB)结束。

parted "$PRACTICE_DISK" mkpart primary xfs 1501MB 3501MB

你可能会看到 Information: You may need to update /etc/fstab. 的提示信息。

验证第三分区的创建:

parted "$PRACTICE_DISK" print

你现在应该看到三个分区:

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1001MB  1000MB  primary  xfs
 2      1001MB  1501MB  500MB   primary  linux-swap
 3      1501MB  3501MB  2000MB  primary

运行 udevadm settle 以确保系统检测到新分区:

udevadm settle

格式化第三分区并持久化挂载

在此步骤中,你将使用 XFS 文件系统格式化第三分区 (${PART_PREFIX}3),并将其配置为持久化挂载到 /backup

首先,使用 XFS 文件系统格式化第三分区:

mkfs.xfs "${PART_PREFIX}3"

输出将显示有关 XFS 文件系统创建的详细信息:

meta-data=/dev/nvme1n1p3         isize=512    agcount=4, agsize=122880 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1    bigtime=1 inobtcount=1
data     =                       bsize=4096   blocks=491520, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=2560, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

现在,为该分区创建一个挂载点目录。你将把它挂载到 /backup

mkdir -p /backup

为了确保文件系统自动挂载,请在 /etc/fstab 中添加一个条目。首先,找到第三分区的 UUID。

lsblk -o UUID "${PART_PREFIX}3"

记下输出中的 UUID。它将是一个唯一的标识符,例如 f74ed805-b1fc-401a-a5ee-140f97c6757d

UUID
f74ed805-b1fc-401a-a5ee-140f97c6757d

使用 nano 打开 /etc/fstab 文件并添加新条目。将 YOUR_UUID_HERE 替换为你找到的实际 UUID。

nano /etc/fstab

在文件末尾添加以下行:

UUID=YOUR_UUID_HERE /backup xfs defaults 0 0

保存文件 (Ctrl+X, Y, Enter)。

修改 /etc/fstab 后,重新加载 systemd 守护进程以应用更改。

systemctl daemon-reload

最后,手动挂载 /backup 目录以验证配置是否正确。

mount /backup

通过检查 mount 命令的输出来确认挂载成功:

mount | grep /backup

你应该会看到类似以下的输出:

/dev/nvme1n1p3 on /backup type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

在练习磁盘上创建具有优先级的额外交换分区

在此步骤中,你将在练习磁盘上创建一个额外的交换分区,并了解分区表的限制。你还将学习如何为交换分区分配优先级。当多个交换分区处于活动状态时,系统会优先使用优先级最高的那个。

了解分区表限制:

当前的设置使用 MBR (msdos) 分区表,它限制最多只能有 4 个主分区。在此步骤中创建第四个分区后,如果不转换为 GPT 或使用扩展分区,你将无法创建更多的主分区。

首先,检查练习磁盘上当前的分区表:

parted "$PRACTICE_DISK" print

你应该会看到你目前创建的四个分区:

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1001MB  1000MB  primary  xfs
 2      1001MB  1501MB  500MB   primary  linux-swap
 3      1501MB  3501MB  2000MB  primary  xfs

现在,创建第四个分区作为 512 MB 的交换分区。它将从 3501MB(第三分区的末尾)开始,到 4013MB(3501MB + 512MB)结束。

parted "$PRACTICE_DISK" mkpart primary linux-swap 3501MB 4013MB

你可能会看到 Information: You may need to update /etc/fstab. 的提示信息。

关于 MBR 限制的说明: 此时,你已经达到了 MBR 分区表 4 个分区的限制。尝试创建第五个主分区会导致错误:Error: Can't create any more partitions.

显示分区表以验证你的工作:

parted "$PRACTICE_DISK" print

你现在应该看到四个分区:

Model: Amazon Elastic Block Store (nvme)
Disk /dev/nvme1n1: 42.9GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags:

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  1001MB  1000MB  primary  xfs
 2      1001MB  1501MB  500MB   primary  linux-swap
 3      1501MB  3501MB  2000MB  primary  xfs
 4      3501MB  4013MB  512MB   primary  linux-swap

运行 udevadm settle 以确保系统注册新分区并创建其设备文件,例如 /dev/vdb4/dev/nvme1n1p4

udevadm settle

现在,使用 mkswap 命令将新分区初始化为交换空间。记下第四分区的 UUID,因为你在 /etc/fstab 中会用到它。

mkswap "${PART_PREFIX}4"

第四分区的输出示例:

Setting up swapspace version 1, size = 488 MiB (511705088 bytes)
no label, UUID=87976166-4697-47b7-86d1-73a02f0fc803

要配置此交换空间以特定优先级激活,你需要向 /etc/fstab 文件添加一个条目。pri(优先级)值越高,表示偏好程度越高。你将为新的交换分区设置更高的优先级。

使用 nano 打开 /etc/fstab

nano /etc/fstab

在文件末尾添加以下行,将 UUID 替换为你记下的那个:

UUID=UUID_OF_PARTITION4 swap swap pri=10 0 0

pri 选项说明:

  • pri=10:为第四个分区分配优先级 10。这高于第二个分区的默认优先级 (-2),因此系统将优先使用第四个分区。

保存文件 (Ctrl+X, Y, Enter)。

重新加载 systemd 守护进程以识别新的 /etc/fstab 条目。

systemctl daemon-reload

使用 swapon -a 激活新的交换空间。

swapon -a

使用 swapon --show 验证交换空间的正确激活和优先级:

swapon --show

你应该会看到显示所有活动交换分区及其优先级的输出。第二个分区将具有默认优先级 -2,而第四个分区将具有你分配的优先级 (10)。

NAME            TYPE      SIZE USED PRIO
/dev/nvme1n1p2  partition 476M   0B   -2
/dev/nvme1n1p4  partition 488M   0B   10

学习笔记: 在生产环境中,如果你需要超过 4 个分区,你可以:

  1. 转换为 GPT 分区表(支持多达 128 个分区)
  2. 使用扩展分区,并在其中创建逻辑分区
  3. 使用 LVM(逻辑卷管理器)以实现更灵活的存储管理

在不重启的情况下验证持久化挂载配置

在最后一步中,你将测试持久化挂载配置,而无需实际重启系统,因为重启会断开你与 LabEx 环境的连接。相反,你将使用各种命令来模拟并验证你的配置在重启后是否能正常工作。

首先,让我们验证所有挂载条目是否已在 /etc/fstab 中正确配置。显示 /etc/fstab 的内容以检查你的条目:

cat /etc/fstab

你应该会看到类似以下的 XFS 分区和交换空间条目:

## ... existing system entries ...
UUID=your-archive-uuid /archive xfs defaults 0 0
UUID=your-swap-low-uuid swap swap defaults 0 0
UUID=your-backup-uuid /backup xfs defaults 0 0
UUID=your-swap-high-uuid swap swap pri=10 0 0

现在,让我们通过卸载并重新挂载文件系统来测试挂载配置,以确保它们工作正常:

首先,卸载 /archive 目录:

umount /archive

验证它已卸载:

mount | grep /archive

这应该不会返回任何输出。

现在使用 /etc/fstab 条目重新挂载它:

mount /archive

验证它已再次挂载:

mount | grep /archive

你应该看到:

/dev/nvme1n1p1 on /archive type xfs (rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,noquota)

/backup 重复相同的过程:

umount /backup
mount /backup
mount | grep /backup

你应该看到:

/dev/nvme1n1p3 on /backup type xfs (rw,relatime,seclabel,attr2,inode64,noquota)

对于交换空间,让我们通过关闭并重新开启它们来进行测试。首先,关闭所有交换空间:

swapoff -a

验证没有交换空间处于活动状态:

swapon --show

这应该只显示可能存在的任何系统交换空间,而不显示你的自定义交换分区。

现在使用 /etc/fstab 开启所有交换空间:

swapon -a

验证所有交换空间是否已激活且优先级正确:

swapon --show

你应该会看到类似以下的输出,其中你的自定义交换分区已激活,且优先级较高的那个被优先使用:

NAME            TYPE      SIZE USED PRIO
/dev/nvme1n1p2  partition 476M   0B   -2
/dev/nvme1n1p4  partition 488M   0B   10

最后,让我们测试 systemd 是否可以在没有错误的情况下处理你所有的 /etc/fstab 条目:

systemctl daemon-reload

这应该在没有任何错误消息的情况下完成。

你还可以使用 findmnt 命令来验证内核是否能够挂载 /etc/fstab 中定义的所有文件系统:

findmnt --verify

此命令会检查 /etc/fstab 是否存在潜在问题。由于本实验有意定义了两个 swap 条目,findmnt --verify 可能会打印出 swap 目标出现多次的警告。该警告在本实验中是预期的,但该命令不应报告解析错误或严重错误。

显示你所有工作的最终总结:

echo "=== Final Storage Configuration Summary ==="
echo "Partition tables:"
parted "$PRACTICE_DISK" print
echo ""
echo "Mounted filesystems:"
mount | grep -E "/archive|/backup"
echo ""
echo "Active swap spaces:"
swapon --show
echo ""
echo "fstab entries for persistence:"
grep -E "archive|backup|swap" /etc/fstab
echo ""
echo "UUID verification:"
echo "Device UUIDs:"
lsblk -f "${PART_PREFIX}"{1,2,3,4}

至此,关于管理存储分区和交换空间的实验结束。你已经成功创建并配置了多个具有不同文件系统的分区,设置了持久化挂载,并配置了具有优先级的交换空间,所有这些操作都无需重启系统。

总结

在本实验中,参与者学习了如何在 LabEx 虚拟机环境下的 RHEL 9 系统中管理存储分区和交换空间。实验从识别当前虚拟机中的额外练习磁盘并了解其当前状态开始,然后进行分区任务。

参与者使用该练习磁盘创建了 MBR 分区表,随后创建了多个分区:一个用于挂载到 /archive 的 XFS 分区、一个交换分区、另一个用于挂载到 /backup 的 XFS 分区,以及一个带有优先级配置的额外交换分区。实验还演示了 MBR 分区表的限制(4 个主分区限制),并提供了针对需要更多分区场景的替代方案(如 GPT)的见解。

实验的一个关键方面是通过正确的 /etc/fstab 条目确保配置的持久性,并在无需重启系统(重启会断开 LabEx 环境)的情况下测试配置。实验最后通过全面的验证程序确认所有挂载和交换空间都能正确激活,从而在实用的云端学习环境中提供了 RHEL 存储管理核心技能的实践经验。