本次采用的方案:https://github.com/chenchongbiao/iso-build-deepin
已构建镜像参考(目前仅在amd64架构虚拟机测试):
链接: https://yun.139.com/shareweb/#/w/i/2ur4korvmJGsu
提取码: a6vm
之前刚提供此方案的时候,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)bind挂载问题:对于挂载参数,calamares3.2版本使用字符串格式,3.3版本需改用列表格式。
(2)无法添加引导项问题:原因未知。本次修改安装器脚本,手工创建引导项。
本次尝试解决上述两个问题,以达到构建镜像后可以正常安装的目的。
按本文档操作后,仍存在至少两个局限性:
(1)本次仅考虑了amd64架构的情况。
(2)本次仅考虑了efi分区为标准分区的情况。
按方案的正常流程操作,操作细节略。
在iso-build-deepin-master下执行构建命令:
export LOCALES=zh_CN.UTF-8 ./build amd64
说明:解决无法正常bind挂载/dev和/run/udev的问题。
修改iso-build-deepin-master下的 cache/rootfs/deepin-crimson-amd64/etc/calamares/modules/mount.conf 文件。
cache/rootfs/deepin-crimson-amd64/etc/calamares/modules/mount.conf
将 options: bind 修改为 options: [ bind ] ,共修改2处,分别对应/dev和/run/udev。
options: bind
options: [ bind ]
(可选)可以针对文件系统的挂载参数做指定,在mount.conf中追加配置项的示例如下:
mountOptions: - filesystem: btrfs options: [ compress=zstd:3, defaults, noatime ]
说明1:解决无法添加efi引导项的问题 说明2:本次片段依赖原 bootloader-fix 中已定义的 CHROOT 变量
说明1:解决无法添加efi引导项的问题
说明2:本次片段依赖原 bootloader-fix 中已定义的 CHROOT 变量
修改iso-build-deepin-master下的 cache/rootfs/deepin-crimson-amd64/usr/sbin/bootloader-fix 文件。
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
在iso-build-deepin-master下,再次执行构建命令:
输出镜像在iso-build-deepin-master下的 output/deepin-crimson-amd64.iso 。
output/deepin-crimson-amd64.iso
No replies yet
Featured Collection
Popular Ranking
Popular Events
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下执行构建命令:
2.2 修改mount.conf
修改iso-build-deepin-master下的
cache/rootfs/deepin-crimson-amd64/etc/calamares/modules/mount.conf文件。将
options: bind修改为options: [ bind ],共修改2处,分别对应/dev和/run/udev。(可选)可以针对文件系统的挂载参数做指定,在mount.conf中追加配置项的示例如下:
2.3 修改bootloader-fix
修改iso-build-deepin-master下的
cache/rootfs/deepin-crimson-amd64/usr/sbin/bootloader-fix文件。在原文件的基础上,追加如下内容:
2.4 重新执行镜像构建命令
在iso-build-deepin-master下,再次执行构建命令:
2.5 获取输出镜像
输出镜像在iso-build-deepin-master下的
output/deepin-crimson-amd64.iso。