NOTE⚠️ 重要安全提示
本文记录的操作基于以下特定环境,仅供参考:发行版:Arch Linux
硬盘类型:NVMe 协议 SSD
引导方式:GRUB + UEFI
文件系统:Btrfs (带子卷)
前情提要
安装linux-zen内核时没有空间,EFI配的只给了256M,本文为扩容过程 。
术前情况
> sudo fdisk -lDisk /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 -fNAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTSnvme0n1├─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盘启动盘
re0.格式化EFI,SWAP
进入u盘内的arch系统之后这里使用笨蛋cfdisk工具来分区,界面大致长这样(这里是已经完成之后的配置 仅供页面展示)
分别选中你的EFI和SWAP分区删除 然后根据你的需求重新新建EFI分区和SWAP分区 最后Write并输入yes来确认操作
使用lsblk命令来确认你的格式化是否成功
re1.挂载EFI,SWAP,FILESYSTEM
# 注意挂载顺序 先从根目录开始挂载# 挂载Linux文件系统 这里笔者使用的是btrfs+子卷 请根据你的实际文件系统来挂载mount -t btrfs -o subvol=/@,compress=zstd /dev/nvme0n1p3 /mntmount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p3 /mnt/home
# 挂载efi和swapmount /dev/nvme0n1p1 /mnt/bootswapon /dev/nvme0n1p2
df -h
查看磁盘挂载情况
free -h
查看swap挂载情况
re2.重新生成fstab文件
这里fstab文件是linux定义磁盘分区的文件,使用uuid来为磁盘做唯一命名
genfstab -U /mnt > /mnt/etc/fstab
# 生成出来的文件大致应该长这样 (如果你也是nvme协议的硬盘的话)# /dev/nvme0n1p3 LABEL=evoarchUUID=320f8b3c-8f1a-4cf1-966c-0c3204577737 / btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@ 0 0
# /dev/nvme0n1p3 LABEL=evoarchUUID=320f8b3c-8f1a-4cf1-966c-0c3204577737 /home btrfs rw,relatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvol=/@home 0 0
# /dev/nvme0n1p1UUID=0A49-C1E8 /boot vfat rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro 0 2
# /dev/nvme0n1p2UUID=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进入之后没有网络的情况。
pacstrap /mnt base linux linux-firmware
arch-chroot后安装
此方法将进入/mnt挂载的系统内再进行下载
arch-chroot /mntpacman -Syu linux linux-firmware
re4. 重新安装GRUB并生成配置文件
⚠️注意 在此步骤需要你使用arch-chroot进入而非chroot进入,否则可能会引发引导加载失败的问题 原因是arch-chroot封装了一系列挂载命令,在切换根目录时会自动挂载如 /dev /proc 等重要的运行时分区
进入/mnt内挂载的系统
# 当然如果你在前面已经进入这里就可以不用进了arch-chroot /mnt
执行以下命令重新配置UEFI引导
grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=ARCH
最后生成引导菜单:
grub-mkconfig -o /boot/grub/grub.cfg
该命令会:
- 扫描
/boot/
下的内核镜像- 自动检测其他操作系统
- 生成包含所有启动项的配置文件
re6.验证并重启
完成所有操作后,建议检查:
# 确认引导文件存在ls /boot/{vmlinuz*,initramfs*,grub/grub.cfg}
# 查看 UEFI 启动项efibootmgr -v | grep ARCH
# 检查文件系统挂载配置cat /etc/fstab
# 卸载并重启umount -R /mntreboot
术后和碎碎念
4G还能不够用了,塞100个vmlinuz
> sudo fdisk -lDisk /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