1352 words
7 minutes
EFI分区扩容
NOTE

⚠️ 重要安全提示
本文记录的操作基于以下特定环境,仅供参考:

发行版:Arch Linux
硬盘类型:NVMe 协议 SSD
引导方式:GRUB + UEFI
文件系统:Btrfs (带子卷)

前情提要#

安装linux-zen内核时没有空间,EFI配的只给了256M,本文为扩容过程 。

术前情况#

Terminal window
> sudo fdisk -l
Disk /dev/nvme0n1:931.51 GiB,1000204886016 字节,1953525168 个扇区
磁盘型号:CT1000PXXXXX8
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:7CDEXXXX-XXXX-XXXX-XXXX-XXXX2129279F
设备 起点 末尾 扇区 大小 类型
/dev/nvme0n1p1 2048 526335 524288 256M EFI 系统
/dev/nvme0n1p2 526336 67635199 67108864 32G Linux swap
/dev/nvme0n1p3 67635200 1953523711 1885888512 899.3G Linux 文件系统
> lsblk -f
NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS
nvme0n1
├─nvme0n1p1 vfat FAT32 0489-3BFE 72.5M 71% /boot
├─nvme0n1p2 swap 1 2ce18fce-1ef7-4d61-878a-1c577ae6ffff [SWAP]
└─nvme0n1p3 btrfs evoarch 320f8b3c-8f1a-4cf1-966c-0c3204577737 873.9G 3% /home

所幸之前swap空间给的比较多,所以这里的方案是删除EFI和SWAP分区再分别创建对应大小的分区,然后重建恢复EFI和相关grub配置。

大概步骤#

⚠️注意 在开始你的操作前 备份重要资料 在开始你的操作前 备份重要资料 在开始你的操作前 备份重要资料

u盘启动盘#

这里用的是当年装arch使用的Ventoy+arch镜像启动。具体制作方法可以参考文章

re0.格式化EFI,SWAP#

进入u盘内的arch系统之后这里使用笨蛋cfdisk工具来分区,界面大致长这样(这里是已经完成之后的配置 仅供页面展示) image.png

分别选中你的EFI和SWAP分区删除 然后根据你的需求重新新建EFI分区和SWAP分区 最后Write并输入yes来确认操作

使用lsblk命令来确认你的格式化是否成功

re1.挂载EFI,SWAP,FILESYSTEM#

Terminal window
# 注意挂载顺序 先从根目录开始挂载
# 挂载Linux文件系统 这里笔者使用的是btrfs+子卷 请根据你的实际文件系统来挂载
mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p3 /mnt
mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p3 /mnt/home
# 挂载efi和swap
mount /dev/nvme0n1p1 /mnt/boot
swapon /dev/nvme0n1p2

df -h查看磁盘挂载情况 free -h查看swap挂载情况

re2.重新生成fstab文件#

这里fstab文件是linux定义磁盘分区的文件,使用uuid来为磁盘做唯一命名

Terminal window
genfstab -U /mnt > /mnt/etc/fstab
# 生成出来的文件大致应该长这样 (如果你也是nvme协议的硬盘的话)
# /dev/nvme0n1p3 LABEL=evoarch
UUID=320f8b3c-8f1a-4cf1-966c-0c3204577737 / btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@ 0 0
# /dev/nvme0n1p3 LABEL=evoarch
UUID=320f8b3c-8f1a-4cf1-966c-0c3204577737 /home btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@home 0 0
# /dev/nvme0n1p1
UUID=0A49-C1E8 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
# /dev/nvme0n1p2
UUID=001db8bb-0aa9-4d8c-ba9b-6bd56af50e3e none swap defaults 0 0

re3.重新安装linux#

为什么要重新安装呢,因为我们重新格式化了/boot分区(即 EFI 分区),需要重新安装内核以生成必要的启动文件。

EFI(即/boot)内存放可启动的内核镜像(vmlinuz)、初始化内存盘(initramfs)、内核符号表(System.map)等好东西

安装内核包时会发生的事: 包管理器(如 pacman)将内核模块和符号链接安装到 /usr/lib/modules/。 同时,生成 vmlinuz 和 initramfs 并复制到 /boot/。

启动linux会发生的相关流程: 引导加载程序(如 GRUB)从 /boot/ 加载 vmlinuz 和 initramfs。 内核启动后,从 /usr/lib/modules/ 动态加载所需模块。

这里提供两种等效的操作方式:

使用pacstrap安装#

此方法将在你的live环境下载必要的包并安装到/mnt的系统内,适用于arch-chroot进入之后没有网络的情况。

Terminal window
pacstrap /mnt base linux linux-firmware

arch-chroot后安装#

此方法将进入/mnt挂载的系统内再进行下载

Terminal window
arch-chroot /mnt
pacman -Syu linux linux-firmware

re4. 重新安装GRUB并生成配置文件#

⚠️注意 在此步骤需要你使用arch-chroot进入而非chroot进入,否则可能会引发引导加载失败的问题 原因是arch-chroot封装了一系列挂载命令,在切换根目录时会自动挂载如 /dev /proc 等重要的运行时分区

进入/mnt内挂载的系统

Terminal window
# 当然如果你在前面已经进入这里就可以不用进了
arch-chroot /mnt

执行以下命令重新配置UEFI引导

Terminal window
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH

最后生成引导菜单:

Terminal window
grub-mkconfig -o /boot/grub/grub.cfg

该命令会:

  1. 扫描 /boot/ 下的内核镜像
  2. 自动检测其他操作系统
  3. 生成包含所有启动项的配置文件

re6.验证并重启#

完成所有操作后,建议检查:

Terminal window
# 确认引导文件存在
ls /boot/{vmlinuz*,initramfs*,grub/grub.cfg}
# 查看 UEFI 启动项
efibootmgr -v | grep ARCH
# 检查文件系统挂载配置
cat /etc/fstab
# 卸载并重启
umount -R /mnt
reboot

术后和碎碎念#

4G还能不够用了,塞100个vmlinuz

Terminal window
> sudo fdisk -l
Disk /dev/nvme0n1:931.51 GiB,1000204886016 字节,1953525168 个扇区
磁盘型号:CT1000PXXXXX8
单元:扇区 / 1 * 512 = 512 字节
扇区大小(逻辑/物理):512 字节 / 512 字节
I/O 大小(最小/最佳):512 字节 / 512 字节
磁盘标签类型:gpt
磁盘标识符:7CDEXXXX-XXXX-XXXX-XXXX-XXXX2129279F
设备 起点 末尾 扇区 大小 类型
/dev/nvme0n1p1 2048 8390655 8388608 4G EFI 系统
/dev/nvme0n1p2 8390656 67635199 59244544 28.3G Linux swap
/dev/nvme0n1p3 67635200 1953523711 1885888512 899.3G Linux 文件系统

一开始计划的是直接cp -a备份整个/boot和fsbat,在重新分区之后再复原再把新的uuid重新写进去,搞半天grub菜单干脆linux都不出来了,最后黑化干脆直接重新grub-install

EFI分区扩容
https://kmk.moe/posts/linux/efiexpand/
Author
DakoWang
Published at
2025-06-12
License
CC BY 4.0