Skip to content

Commit

Permalink
openeuler: 修复无法安装 24.03 arm
Browse files Browse the repository at this point in the history
openeuler 24.03 arm 的 efi 在 boot 分区里面
因此脚本没识别到 efi 分区
旧方法是先复制 /boot,再挂载 /boot/efi
/boot/efi 本来有文件,但挂载 efi 后,文件被屏蔽了
导致 grubby 报错安装中断

现在修改为先挂载 efi 分区,再复制 /boot
因此 boot 分区的 /boot/efi 的文件可以复制到 efi 分区
  • Loading branch information
bin456789 committed Oct 23, 2024
1 parent 60e056d commit 3f12bfd
Showing 1 changed file with 49 additions and 34 deletions.
83 changes: 49 additions & 34 deletions trans.sh
Original file line number Diff line number Diff line change
Expand Up @@ -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格式化xfs,grub2-mkconfig和grub2里面都无法识别xfs分区
Expand All @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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 配置,防止歧义
Expand Down Expand Up @@ -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分区复制了文件
Expand All @@ -3397,22 +3415,23 @@ 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 应该生成文件的位置
# openeuler 24.03 x64 aa64 指向的文件不同
if is_efi; then
# oracle linux 文件夹是 redhat
# shellcheck disable=SC2010
distro_efi=$(cd /os/boot/efi/EFI/ && ls -d -- * | grep -Eiv BOOT)
grub_o_cfg=$(chroot /os readlink -f /etc/grub2-efi.cfg)
else
grub_o_cfg=/boot/grub2/grub.cfg
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
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)
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
Expand All @@ -3422,12 +3441,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
Expand Down

0 comments on commit 3f12bfd

Please sign in to comment.