boot分区满了,导致无法更新系统,怎么办?

如题。安装的是windows+arch双系统,安装arch时直接把windows的efi分区挂载到/boot分区了。查阅wiki得知有两种方案:

  1. 挂载 EFI系统分区到/efi
  2. 挂载 EFI系统分区到/efi, 然后再挂载一个“拓展引导加载器分区”(XBOOTLDR)分区到 /boot

但是说得好简略,我又怕不小心把引导搞崩导致进不了系统。所以,请问具体该怎么做啊?
具体情况:Arch的EFI系统分区挂载到了/boot,根目录使用btrf文件系统,配置了全盘加密,没有加密/boot

你的/boot分了多大呀?能不能删点文件,比如fallback initramfs?

260MiB,好像没看到fallback initramfs之类的文件

你的initramfs好大啊——nvidia?

bootloader 是 systemd-boot 的話,我就是這麼用的。

分區表:

❯ LANG=C.UTF-8 sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 931.51 GiB, 1000204886016 bytes, 1953525168 sectors
Disk model: WDS100T1X0E-00AFY0
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: B633440A-D45A-446C-BEB4-2FDBB873A774

Device              Start        End    Sectors   Size Type
/dev/nvme0n1p1       2048     206847     204800   100M EFI System
/dev/nvme0n1p2     206848     239615      32768    16M Microsoft reserved
/dev/nvme0n1p3     239616  841564159  841324544 401.2G Microsoft basic data
/dev/nvme0n1p4  841564160  845758463    4194304     2G Linux extended boot
/dev/nvme0n1p5  845758464 1919500287 1073741824   512G Linux filesystem
/dev/nvme0n1p6 1919500288 1951475711   31975424  15.2G Linux swap
/dev/nvme0n1p8 1951475712 1953523711    2048000  1000M Windows recovery environment

p1是 ESP ,p2 p3 p8 是 win 的分區,p4 是 XBOOTLDR ,p5 (和 nvme1n1 一起加在一個 btrfs 裏面) 是 Linux 根分區,p6 是 Linux swap 。

❯ findmnt --real
TARGET                                 SOURCE                           FSTYPE OPTIONS
/                                      /dev/nvme1n1[/current/root]      btrfs  rw,noatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=257,subvol=/current/root
├─/home                                /dev/nvme1n1[/current/home]      btrfs  rw,noatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=258,subvol=/current/home
│ └─/home/farseerfc/.local/share/Steam /dev/nvme1n1[/current/steam]     btrfs  rw,noatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=1243,subvol=/current/steam
├─/var/lib/archbuild                   /dev/nvme1n1[/current/archbuild] btrfs  rw,noatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=260,subvol=/current/archbuild
├─/var/cache/pacman/pkg                /dev/nvme1n1[/current/pkg]       btrfs  rw,noatime,compress=zstd:3,ssd,discard=async,space_cache=v2,subvolid=259,subvol=/current/pkg
├─/efi                                 /dev/nvme0n1p1                   vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro
└─/boot                                /dev/nvme0n1p4                   vfat   rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,utf8,errors=remount-ro

然後p1 (ESP) 掛 /efi ,p4(XBOOTLDR) 掛 /boot

ESP 裏面放 bootloader:

❯ tree -L3 /efi
/efi
├── EFI
│   ├── Boot
│   │   └── bootx64.efi
│   ├── Linux
│   ├── Microsoft
│   │   ├── Boot
│   │   └── Recovery
│   └── systemd
│       └── systemd-bootx64.efi
├── loader
│   ├── entries
│   ├── loader.conf
│   └── random-seed
└── System Volume Information
    ├── AadRecoveryPasswordDelete
    └── ClientRecoveryPasswordRotation

systemd-boot 的 efi 可執行文件和 loader.conf 在裏面。

/boot 就放別的啥的和 systemd-boot 的 entries

❯ tree /boot
/boot
├── amd-ucode.img
├── initramfs-linux-fallback.img
├── initramfs-linux.img
├── initramfs-linux-lts-fallback.img
├── initramfs-linux-lts.img
├── initramfs-linux-zen-fallback.img
├── initramfs-linux-zen.img
├── loader
│   ├── entries
│   │   ├── arch-linux.conf
│   │   ├── arch-linux-fallback.conf
│   │   ├── arch-linux-lts.conf
│   │   ├── arch-linux-lts-fallback.conf
│   │   ├── arch-linux-zen.conf
│   │   └── arch-linux-zen-fallback.conf
│   ├── entries.srel
│   └── random-seed
├── vmlinuz-linux
├── vmlinuz-linux-lts
└── vmlinuz-linux-zen
1 Like

电脑里有一张nvidia的显卡,刚装完arch时EFI分区就是几乎爆满的状态

只需要这样挂载的话,引导程序就会自动识别到吗?

systemd-boot 是會把 XBOOTLDR 的東西當作是 ESP 裏的東西解析的。grub 好像也支持但是我不太清楚 grub 那邊的細節

我直接给/boot分了2G 文件系统ext4 我没有Windows

折腾了一中午,总算解决了。我先新建了/efi目录,然后把旧/boot分区原有的文件复制到了那里,在修改了一下fstab文件,使引导分区挂载到/efi目录。接着,我给硬盘划了500MiB的空间,然后把它挂载到了/boot目录。
接着要格式化/boot目录,grub好像支持很多格式,btrfs,ext4都可以,不过保险起见,我就直接格式化为FAT32了,再用genfstab重新生成了fstab文件;然后,我把/efi目录下的内核镜像、微码等文件转移到了/boot目录,再用grub-mkconfig重新生成了配置文件,grub成功识别到了/boot目录下的内核镜像。
最后重启系统来验证,我成功进入了系统,与之前唯一的不同是启动时会显示各种参数和警示了(就是显示很多绿色的OK字样),此前并不会显示这些,而只是提示加载内存盘什么的。
刚刚成功更新了系统
:face_exhaling:
很多指令都是找Gemini现学的,AI挺好用的

不过用grub-mkconfig -o /efi/grub/grub.cfg的时候会提示这个,但配置还是能正常生成

/usr/bin/grub-editenv: 错误: 获取 "//boot/grub" 的规范路径失败.

这是什么意思

那些绿色的「OK」之类的是系统启动过程中systemd显示的。「加载内存盘」是grub在引导的时候显示的。你可能是弄丢了内核命令行上的quiet选项。

grub-mkconfig尝试在/boot/grub下找grub的文件,但是没找到吧。