openeuler: 修复无法安装 24.03 arm

openeuler 24.03 arm 的 efi 在 boot 分区里面
因此脚本没识别到 efi 分区
旧方法是先复制 /boot,再挂载 /boot/efi
/boot/efi 本来有文件,但挂载 efi 后,文件被屏蔽了
导致 grubby 报错安装中断

现在修改为先挂载 efi 分区,再复制 /boot
因此 boot 分区的 /boot/efi 的文件可以复制到 efi 分区
This commit is contained in:
bin456789 2024-10-23 21:57:14 +08:00
parent 60e056d0e1
commit 5e020cebd4
No known key found for this signature in database
GPG Key ID: EE301B386DE6C11B

View File

@ -3199,7 +3199,7 @@ install_qcow_by_copy() {
efi_part_label=$(lsblk /dev/$efi_part -no LABEL)
fi
mkdir -p /nbd /nbd-boot /nbd-efi /os
mkdir -p /nbd /nbd-boot /nbd-efi
# 使用目标系统的格式化程序
# centos8 如果用alpine格式化xfsgrub2-mkconfig和grub2里面都无法识别xfs分区
@ -3213,35 +3213,46 @@ install_qcow_by_copy() {
# TODO: ubuntu 镜像缺少 mkfs.fat/vfat/dosfstools? initrd 不需要检查fs完整性
# 复制系统
# 创建并挂载 /os
mkdir -p /os
mount -o noatime /dev/$xda*2 /os/
# 如果是 efi 则创建 /os/boot/efi
# 如果镜像有 efi 分区也创建 /os/boot/efi用于复制 efi 分区的文件
if is_efi || [ -n "$efi_part" ]; then
mkdir -p /os/boot/efi/
# 挂载 /os/boot/efi
# 预先挂载 /os/boot/efi 因为可能 boot 和 efi 在同一个分区openeuler 24.03 arm
# 复制 boot 时可以会复制 efi 的文件
if is_efi; then
mount -o $efi_mount_opts /dev/$xda*1 /os/boot/efi/
fi
fi
# 复制系统分区
echo Copying os partition...
mount_nouuid -o ro /dev/$os_part /nbd/
mount -o noatime /dev/$xda*2 /os/
cp -a /nbd/* /os/
umount /nbd/
# 复制boot分区如果有
if [ -n "$boot_part" ]; then
echo Copying boot partition...
mount_nouuid -o ro /dev/$boot_part /nbd-boot/
cp -a /nbd-boot/* /os/boot/
umount /nbd-boot/
fi
# efi 分区
if is_efi; then
# 挂载 efi
mkdir -p /os/boot/efi/
mount -o $efi_mount_opts /dev/$xda*1 /os/boot/efi/
# 复制文件
if [ -n "$efi_part" ]; then
echo Copying efi partition...
mount -o ro /dev/$efi_part /nbd-efi/
cp -a /nbd-efi/* /os/boot/efi/
fi
# 复制efi分区如果有
if [ -n "$efi_part" ]; then
echo Copying efi partition...
mount -o ro /dev/$efi_part /nbd-efi/
cp -a /nbd-efi/* /os/boot/efi/
umount /nbd-efi/
fi
# 取消挂载 nbd
umount /nbd/ /nbd-boot/ /nbd-efi/ || true
# 断开 qcow
if is_have_cmd vgchange; then
vgchange -an
fi
@ -3301,7 +3312,6 @@ install_qcow_by_copy() {
fi
sed -Ei -e 's,(mirrorlist=),#\1,' \
-e "s,#(baseurl=http://)mirror.centos.org,\1$mirror," /os/etc/yum.repos.d/CentOS-Base.repo
chroot_dnf install NetworkManager
fi
# firmware + microcode
@ -3310,6 +3320,10 @@ install_qcow_by_copy() {
chroot_dnf install $(get_ucode_firmware_pkgs)
fi
# centos 7 安装 NetworkManager
if [ "$releasever" = 7 ]; then
chroot_dnf install NetworkManager
fi
# anolis 7 镜像自带 nm
# 删除云镜像自带的 dhcp 配置,防止歧义
@ -3373,6 +3387,10 @@ EOF
rm -rf /os/boot/grub2/grubenv /os/boot/grub2/grub.cfg
}
# openeuler arm 镜像 grub.cfg 在 /os/grub.cfg可能给外部的 grub 读取,我们用不到
# centos7 有 grub1 的配置
rm -rf /os/grub.cfg /os/boot/grub/grub.conf /os/boot/grub/menu.lst
# 安装引导
if is_efi; then
# 只有centos 和 oracle x86_64 镜像没有efi其他系统镜像已经从efi分区复制了文件
@ -3397,22 +3415,24 @@ EOF
sed -i -E 's,((linux|initrd) /),\1boot/,g' /os/boot/loader/entries/*.conf
fi
# grub-efi-x64 包里面有 /etc/grub2-efi.cfg
# 指向 /boot/efi/EFI/xxx/grub.cfg 或 /boot/grub2/grub.cfg
# 指向哪里哪里就是 grub2-mkconfig 应该生成文件的位置
# grubby 也是靠 /etc/grub2-efi.cfg 定位 grub.cfg 的位置
# openeuler 24.03 x64 aa64 指向的文件不同
if is_efi; then
grub_o_cfg=$(chroot /os readlink -f /etc/grub2-efi.cfg)
else
grub_o_cfg=/boot/grub2/grub.cfg
fi
# efi 分区 grub.cfg
# https://github.com/rhinstaller/anaconda/blob/346b932a26a19b339e9073c049b08bdef7f166c3/pyanaconda/modules/storage/bootloader/efi.py#L198
# https://github.com/rhinstaller/anaconda/commit/15c3b2044367d375db6739e8b8f419ef3e17cae7
if is_efi && ! echo "$grub_o_cfg" | grep -q '/boot/efi/EFI'; then
# oracle linux 文件夹是 redhat
# shellcheck disable=SC2010
distro_efi=$(cd /os/boot/efi/EFI/ && ls -d -- * | grep -Eiv BOOT)
fi
is_grub_efi_load_config_from_os() {
{ [ "$distro" = openeuler ] && ! [ "$releasever" = 20.03 ]; } ||
[ "$releasever" -ge 9 ]
}
# efi 分区 grub.cfg
# >=34.24
# https://github.com/rhinstaller/anaconda/blob/346b932a26a19b339e9073c049b08bdef7f166c3/pyanaconda/modules/storage/bootloader/efi.py#L198
# https://github.com/rhinstaller/anaconda/commit/15c3b2044367d375db6739e8b8f419ef3e17cae7
if is_efi && is_grub_efi_load_config_from_os; then
cat <<EOF >/os/boot/efi/EFI/$distro_efi/grub.cfg
search --no-floppy --fs-uuid --set=dev $os_part_uuid
set prefix=(\$dev)/boot/grub2
@ -3422,12 +3442,8 @@ EOF
fi
# 主 grub.cfg
if is_efi && ! is_grub_efi_load_config_from_os; then
chroot /os/ grub2-mkconfig -o /boot/efi/EFI/$distro_efi/grub.cfg
else
# --update-bls-cmdline
chroot /os/ grub2-mkconfig -o /boot/grub2/grub.cfg
fi
# --update-bls-cmdline
chroot /os/ grub2-mkconfig -o "$grub_o_cfg"
# 不删除可能网络管理器不会写入dns
rm_resolv_conf /os