要准备一个目标系统,或者至少要live cd
- 执行btrfs send 和 btrfs rec
- 挂子卷,挂efi
- /etc/fstab (删subvolid,改uuid, 加swap space)
- /etc底下:hostname hosts resolv.conf
- 挂子卷
for i in /dev /dev/pts /proc /sys /run; do mount -B $i /mnt/LINUXNAME$i; done
- chroot进去
- Arch Linux直接用arch-chroot, Manjaro用manjaro-chroot
- 换machine-id
注:不推荐
rm /etc/machine-id dbus-uuidgen >| /etc/machine-id
systemd-machine-id-setup
因为有些发行版会生成相同的machine-id,比如Ubuntu
- 修改/etc/kernelstub/configuration,在user小节的数组里加入:rootflags=subvol=@popOS-root
- 执行
apt install --reinstall linux-generic linux-headers-generic update-initramfs -c -k all bootctl --path=/mnt/popOS/boot/efi install
- 添加引导记录
bootctl --path=/boot/efi install
-
重构启动镜像
- ArchLinux
mkinitcpio -p linux
- Fedora
dracut --regenerate-all --force
-
将位于
/boot
下的文件拷贝到EFI分区。例如/EFI/arch/
。这些文件包括vmlinuz-linux(-lts,bla-bla-bla)
initramfs-linux(-lts,bla-bla-bla).img
- 如果有microcode,也需要拷贝。
-
修改
/boot/efi/loader/entries/xxx.conf
.linux
小节指定vmlinuz
的路径(例如:/EFI/arch/vmlinuz-linux
)initrd
一节指定initramfs
的路径(例如:/EFI/arch/initramfs-linux-lts.img
)- 如果有microcode,需要再加个initramfs到第一行并且指定相应路径
options
小节为options root=UUID=[btrfs分区的UUID] rootflags=subvol=[子卷名称] rw
-
运行
bootctl list
,确保没有错误 -
Refs:
- Archlinux Example:
/usr/share/systemd/bootctl/arch.conf
- section "Mounting subvolume as root" of https://wiki.archlinux.org/index.php/Btrfs
- https://wiki.archlinux.org/index.php/Systemd-boot
- Archlinux Example:
- ubuntu debian: 可以直接重装:
apt install --reinstall grub-efi-amd64
-
Deepin 20: 按照底下一般linux来,但除了bootloader-id=deepin外还要再运行bootloader-id=UOS、ubuntu和boot,一共运行4次
-
Fedora 27 - 32, CentOS 7
- 重新安装grub2-efi-modules
- 注意cpu架构: https://rpmfind.net/linux/rpm2html/search.php?query=grub2-efi-modules)
- 重新安装一次grub2-efi和shim来代替grub2-install
grub2-mkconfig -o /boot/efi/EFI/fedora(或centos)/grub.cfg
- Fedora 32: 还需要把
/boot/loader/entries
底下每个文件打开,更改linux和initrd项的第一段路径,确保与子卷名称一致
- 重构启动镜像。见“其他Linux. 以ArchLinux为例”小节
- 重新安装grub2-efi-modules
-
一般linux
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=[linux名字]
grub-mkconfig -o /boot/grub/grub.cfg
- 新的efi分区,需要拷贝bootx64.efi
- 按照发行版说明进行安装。有些发行版已经自带。
- (systemd-boot) entries 最前面一行initrd指定microcode的路径
- 或
- (GRUB) 再运行一次grub-mkconfig
- Fedora:
dnf groupinstall base-x
- hyperV 补装 xf86-video-fbdev (Arch Linux)
按照发行版的文档安装自己喜欢的桌面
cp -r /etc/skel/* /home/myuser123
chmod -R 755 /home/myuser123 && chown -R myuser123:myuser123 /home/myuser123