[Internal testing communication] 折腾一下DeepinV25无磐石镜像
Tofloor
poster avatar
Tent
deepin
7 hours ago
Author

1. 相关说明

1.1 方案介绍

本次采用的方案:https://github.com/chenchongbiao/iso-build-deepin

已构建镜像参考(目前仅在amd64架构虚拟机测试):

链接: https://yun.139.com/shareweb/#/w/i/2ur4korvmJGsu

提取码: a6vm

1.2 存在问题

之前刚提供此方案的时候,calamares是3.2.61-1版本,目前仓库源已更新至3.3.14-5.1deepin1版本。

calamares的处理机制有变化,导致构建镜像后,在amd64架构虚拟机中安装测试发现如下两个问题:

(1)无法正常bind挂载/dev和/run/udev,导致安装efi引导阶段报错。

(2)解决了上述bind挂载问题并安装系统成功后,重启后有无法找到efi引导项的情况。

此外,关于下面所说的mount.conf中的挂载参数格式问题,希望deepin官方能修改一下calamares-settings-deepin(目前是1.0.2版本),重新打个包。

1.3 问题原因

(1)bind挂载问题:对于挂载参数,calamares3.2版本使用字符串格式,3.3版本需改用列表格式。

(2)无法添加引导项问题:原因未知。本次修改安装器脚本,手工创建引导项。

1.4 其他说明

本次尝试解决上述两个问题,以达到构建镜像后可以正常安装的目的。

按本文档操作后,仍存在至少两个局限性:

(1)本次仅考虑了amd64架构的情况。

(2)本次仅考虑了efi分区为标准分区的情况。

2. 操作步骤

2.1 先构建一次镜像

按方案的正常流程操作,操作细节略。

在iso-build-deepin-master下执行构建命令:

export LOCALES=zh_CN.UTF-8
./build amd64

2.2 修改mount.conf

说明:解决无法正常bind挂载/dev和/run/udev的问题。

修改iso-build-deepin-master下的 cache/rootfs/deepin-crimson-amd64/etc/calamares/modules/mount.conf 文件。

options: bind 修改为 options: [ bind ] ,共修改2处,分别对应/dev和/run/udev。

(可选)可以针对文件系统的挂载参数做指定,在mount.conf中追加配置项的示例如下:

mountOptions:
    - filesystem: btrfs
      options: [ compress=zstd:3, defaults, noatime ]

2.3 修改bootloader-fix

说明1:解决无法添加efi引导项的问题

说明2:本次片段依赖原 bootloader-fix 中已定义的 CHROOT 变量

修改iso-build-deepin-master下的 cache/rootfs/deepin-crimson-amd64/usr/sbin/bootloader-fix 文件。

在原文件的基础上,追加如下内容:

 --- 强制添加 UEFI 引导项---
# 1. 仅 UEFI 系统执行
if [ ! -d /sys/firmware/efi ]; then
  echo "Not an EFI system, skipping UEFI boot entry fix."
  exit 0
fi

# 2. 查找 EFI 分区在宿主系统中的实际挂载点(CHROOT已在原bootloader-fix中定义)
if findmnt --target "${CHROOT}/boot/efi" >/dev/null 2>&1; then
  efi_mount="${CHROOT}/boot/efi"
elif findmnt --target "${CHROOT}/efi" >/dev/null 2>&1; then
  efi_mount="${CHROOT}/efi"
elif findmnt --target "${CHROOT}/boot" >/dev/null 2>&1; then
  efi_mount="${CHROOT}/boot"
else
  echo "ERROR: Cannot find EFI system partition mount point."
  exit 1
fi

# 3. 检查 deepin 引导目录及 shimx64.efi 是否存在
bootloader_id="deepin"
efi_dir="${efi_mount}/EFI/${bootloader_id}"
if [ ! -d "${efi_dir}" ] || [ ! -f "${efi_dir}/shimx64.efi" ]; then
  echo "ERROR: ${efi_dir} or shimx64.efi not found."
  exit 1
fi

# 4. 获取 EFI 分区对应的块设备
efi_part_dev="$(findmnt -n -o SOURCE --target "${efi_mount}" 2>/dev/null)"
if [ -z "${efi_part_dev}" ]; then
  echo "ERROR: Cannot determine EFI partition device."
  exit 1
fi

# 5. 获取磁盘设备和分区号
case "${efi_part_dev}" in
  /dev/nvme[0-9]*n[0-9]*p[0-9]*)
    efi_disk="$(echo "${efi_part_dev}" | sed 's/p[0-9]*$//')"
    efi_part_num="$(echo "${efi_part_dev}" | sed 's/.*p\([0-9]*\)$/\1/')"
    ;;
  /dev/[sv]da[0-9]*)
    efi_disk="$(echo "${efi_part_dev}" | sed 's/[0-9]*$//')"
    efi_part_num="$(echo "${efi_part_dev}" | sed 's/.*[a-z]\([0-9]*\)$/\1/')"
    ;;
  *)
    echo "ERROR: Unsupported EFI partition device: ${efi_part_dev}"
    exit 1
    ;;
esac

# 6. 删除可能存在的旧引导项(仅删除当前安装磁盘上的同名条目)
efi_part_uuid="$(blkid -s PARTUUID -o value "${efi_part_dev}" 2>/dev/null)" || {
  echo "ERROR: Get PARTUUID failed: ${efi_part_dev}"
  exit 1
}

if efibootmgr -v | grep -F "${efi_part_uuid}" | awk -v id="${bootloader_id}" '$2 == id {found=1; exit} END {exit !found}'; then
  echo "Existing UEFI boot entries for '${bootloader_id}' found. Removing them..."
  efibootmgr -v | grep -F "${efi_part_uuid}" | awk -v id="${bootloader_id}" '$2 == id {print $1}' | while read -r boot_col; do
    bootnum="$(echo "${boot_col}" | sed -n 's/^Boot\([0-9A-Fa-f]*\)\*\{0,1\}$/\1/p')"
    if [ -n "${bootnum}" ]; then
      efibootmgr -b "${bootnum}" -B >/dev/null 2>&1 && echo "Removed Boot${bootnum}: ${bootloader_id}"
    fi
  done
  sync
fi

# 7. 创建引导项
efi_file="\\EFI\\${bootloader_id}\\shimx64.efi"
echo "Creating UEFI boot entry: disk=${efi_disk}, part=${efi_part_num}, label=${bootloader_id}"
if efibootmgr -c -d "${efi_disk}" -p "${efi_part_num}" -L "${bootloader_id}" -l "${efi_file}"; then
  sync
  echo "UEFI boot entry added successfully."
else
  echo "ERROR: Failed to create UEFI boot entry."
  exit 1
fi

2.4 重新执行镜像构建命令

在iso-build-deepin-master下,再次执行构建命令:

export LOCALES=zh_CN.UTF-8
./build amd64

2.5 获取输出镜像

输出镜像在iso-build-deepin-master下的 output/deepin-crimson-amd64.iso

Reply Favorite View the author
All Replies

No replies yet