core: 精确地按编号选择分区

避免同时有 mmcblk0p1 和 mmcblk0boot1 时导致错误
fixes #581
This commit is contained in:
bin456789
2026-03-24 13:16:38 +08:00
parent e104735538
commit 07d8018db3
2 changed files with 76 additions and 60 deletions

View File

@ -3912,7 +3912,6 @@ remove_useless_initrd_files() {
net/wireless \ net/wireless \
net/bluetooth \ net/bluetooth \
drivers/hid \ drivers/hid \
drivers/mmc \
drivers/mtd \ drivers/mtd \
drivers/usb \ drivers/usb \
drivers/ssb \ drivers/ssb \

121
trans.sh
View File

@ -1,6 +1,6 @@
#!/bin/ash #!/bin/ash
# shellcheck shell=dash # shellcheck shell=dash
# shellcheck disable=SC2086,SC3047,SC3036,SC3010,SC3001,SC3060 # shellcheck disable=SC2086,SC3047,SC3036,SC3010,SC3001,SC3060,SC3015
# alpine 默认使用 busybox ash # alpine 默认使用 busybox ash
# 注意 bash 和 ash 以下语句结果不同 # 注意 bash 和 ash 以下语句结果不同
# [[ a = '*a' ]] && echo 1 # [[ a = '*a' ]] && echo 1
@ -2535,6 +2535,22 @@ is_xda_gt_2t() {
[ "$disk_size" -gt "$disk_2t" ] [ "$disk_size" -gt "$disk_2t" ]
} }
is_ends_with_digit() {
[[ "$1" =~ [0-9]$ ]]
}
xda() {
if [ -n "$1" ]; then
if is_ends_with_digit "$xda"; then
echo "${xda}p$1"
else
echo "${xda}$1"
fi
else
echo "$xda"
fi
}
create_part() { create_part() {
# 除了 dd 都会用到 # 除了 dd 都会用到
info "Create Part" info "Create Part"
@ -2549,7 +2565,6 @@ create_part() {
# TODO: 先检测iso链接/各种链接 # TODO: 先检测iso链接/各种链接
# wipefs -a /dev/$xda # wipefs -a /dev/$xda
# xda*1 星号用于 nvme0n1p1 的字母 p
# shellcheck disable=SC2154 # shellcheck disable=SC2154
if [ "$distro" = windows ]; then if [ "$distro" = windows ]; then
if ! size_bytes=$(get_link_file_size "$iso"); then if ! size_bytes=$(get_link_file_size "$iso"); then
@ -2582,10 +2597,10 @@ create_part() {
set 3 msftdata on set 3 msftdata on
update_part update_part
mkfs.fat -n efi /dev/$xda*1 #1 efi mkfs.fat -n efi "/dev/$(xda 1)" #1 efi
dd if=/dev/zero of="$(ls /dev/$xda*2)" bs=1M count=16 #2 msr dd if=/dev/zero of="/dev/$(xda 2)" bs=1M count=16 #2 msr
mkfs.ntfs -f -F -L os /dev/$xda*3 #3 os mkfs.ntfs -f -F -L os "/dev/$(xda 3)" #3 os
mkfs.ntfs -f -F -L installer /dev/$xda*4 #4 installer mkfs.ntfs -f -F -L installer "/dev/$(xda 4)" #4 installer
else else
# bios + mbr 启动盘最大可用 2t # bios + mbr 启动盘最大可用 2t
if is_xda_gt_2t; then if is_xda_gt_2t; then
@ -2602,8 +2617,8 @@ create_part() {
set 1 boot on set 1 boot on
update_part update_part
mkfs.ntfs -f -F -L os /dev/$xda*1 #1 os mkfs.ntfs -f -F -L os "/dev/$(xda 1)" #1 os
mkfs.ntfs -f -F -L installer /dev/$xda*2 #2 installer mkfs.ntfs -f -F -L installer "/dev/$(xda 2)" #2 installer
fi fi
elif [ "$distro" = fnos ]; then elif [ "$distro" = fnos ]; then
# 先用 100% 分区安装后再缩小没意义,因为小硬盘用 100% 还是装不了 # 先用 100% 分区安装后再缩小没意义,因为小硬盘用 100% 还是装不了
@ -2656,8 +2671,8 @@ create_part() {
set 1 esp on set 1 esp on
update_part update_part
mkfs.fat /dev/$xda*1 #1 efi mkfs.fat "/dev/$(xda 1)" #1 efi
mkfs.ext4 -F $ext4_opts /dev/$xda*2 #2 os + installer mkfs.ext4 -F $ext4_opts "/dev/$(xda 2)" #2 os + installer
elif is_xda_gt_2t; then elif is_xda_gt_2t; then
# bios > 2t # bios > 2t
# 官方安装器是 mkpart BOOT 1M 100M无论 esp 或者 bios_grub 都用这个分区和大小 # 官方安装器是 mkpart BOOT 1M 100M无论 esp 或者 bios_grub 都用这个分区和大小
@ -2669,7 +2684,7 @@ create_part() {
update_part update_part
echo #1 bios_boot echo #1 bios_boot
mkfs.ext4 -F $ext4_opts /dev/$xda*2 #2 os + installer mkfs.ext4 -F $ext4_opts "/dev/$(xda 2)" #2 os + installer
else else
# bios # bios
parted /dev/$xda -s -- \ parted /dev/$xda -s -- \
@ -2680,7 +2695,7 @@ create_part() {
update_part update_part
echo #1 官方安装有这个分区 echo #1 官方安装有这个分区
mkfs.ext4 -F $ext4_opts /dev/$xda*2 #2 os + installer mkfs.ext4 -F $ext4_opts "/dev/$(xda 2)" #2 os + installer
fi fi
elif is_use_cloud_image; then elif is_use_cloud_image; then
installer_part_size="$(get_cloud_image_part_size)" installer_part_size="$(get_cloud_image_part_size)"
@ -2700,9 +2715,9 @@ create_part() {
set 1 esp on set 1 esp on
update_part update_part
mkfs.fat -n efi /dev/$xda*1 #1 efi mkfs.fat -n efi "/dev/$(xda 1)" #1 efi
echo #2 os 用目标系统的格式化工具 echo #2 os 用目标系统的格式化工具
mkfs.ext4 -F -L installer /dev/$xda*3 #3 installer mkfs.ext4 -F -L installer "/dev/$(xda 3)" #3 installer
else else
parted /dev/$xda -s -- \ parted /dev/$xda -s -- \
mklabel gpt \ mklabel gpt \
@ -2714,7 +2729,7 @@ create_part() {
echo #1 bios_boot echo #1 bios_boot
echo #2 os 用目标系统的格式化工具 echo #2 os 用目标系统的格式化工具
mkfs.ext4 -F -L installer /dev/$xda*3 #3 installer mkfs.ext4 -F -L installer "/dev/$(xda 3)" #3 installer
fi fi
else else
# 使用 dd qcow2 # 使用 dd qcow2
@ -2725,8 +2740,8 @@ create_part() {
mkpart '" "' ext4 -$installer_part_size 100% mkpart '" "' ext4 -$installer_part_size 100%
update_part update_part
mkfs.ext4 -F -L os /dev/$xda*1 #1 os mkfs.ext4 -F -L os "/dev/$(xda 1)" #1 os
mkfs.ext4 -F -L installer /dev/$xda*2 #2 installer mkfs.ext4 -F -L installer "/dev/$(xda 2)" #2 installer
fi fi
elif [ "$distro" = alpine ] || [ "$distro" = arch ] || [ "$distro" = gentoo ] || elif [ "$distro" = alpine ] || [ "$distro" = arch ] || [ "$distro" = gentoo ] ||
[ "$distro" = nixos ] || [ "$distro" = aosc ]; then [ "$distro" = nixos ] || [ "$distro" = aosc ]; then
@ -2743,8 +2758,8 @@ create_part() {
set 1 boot on set 1 boot on
update_part update_part
mkfs.fat /dev/$xda*1 #1 efi mkfs.fat "/dev/$(xda 1)" #1 efi
mkfs.ext4 -F $ext4_opts /dev/$xda*2 #2 os mkfs.ext4 -F $ext4_opts "/dev/$(xda 2)" #2 os
elif is_xda_gt_2t; then elif is_xda_gt_2t; then
# bios > 2t # bios > 2t
parted /dev/$xda -s -- \ parted /dev/$xda -s -- \
@ -2755,7 +2770,7 @@ create_part() {
update_part update_part
echo #1 bios_boot echo #1 bios_boot
mkfs.ext4 -F $ext4_opts /dev/$xda*2 #2 os mkfs.ext4 -F $ext4_opts "/dev/$(xda 2)" #2 os
else else
# bios # bios
parted /dev/$xda -s -- \ parted /dev/$xda -s -- \
@ -2764,7 +2779,7 @@ create_part() {
set 1 boot on set 1 boot on
update_part update_part
mkfs.ext4 -F $ext4_opts /dev/$xda*1 #1 os mkfs.ext4 -F $ext4_opts "/dev/$(xda 1)" #1 os
fi fi
else else
# 安装红帽系或ubuntu # 安装红帽系或ubuntu
@ -2797,9 +2812,9 @@ create_part() {
set 1 boot on set 1 boot on
update_part update_part
mkfs.fat -n efi /dev/$xda*1 #1 efi mkfs.fat -n efi "/dev/$(xda 1)" #1 efi
mkfs.ext4 -F -L os /dev/$xda*2 #2 os mkfs.ext4 -F -L os "/dev/$(xda 2)" #2 os
mkfs.ext4 -F -L installer $ext4_opts /dev/$xda*3 #2 installer mkfs.ext4 -F -L installer $ext4_opts "/dev/$(xda 3)" #2 installer
elif is_xda_gt_2t; then elif is_xda_gt_2t; then
# bios > 2t # bios > 2t
parted /dev/$xda -s -- \ parted /dev/$xda -s -- \
@ -2811,8 +2826,8 @@ create_part() {
update_part update_part
echo #1 bios_boot echo #1 bios_boot
mkfs.ext4 -F -L os /dev/$xda*2 #2 os mkfs.ext4 -F -L os "/dev/$(xda 2)" #2 os
mkfs.ext4 -F -L installer $ext4_opts /dev/$xda*3 #3 installer mkfs.ext4 -F -L installer $ext4_opts "/dev/$(xda 3)" #3 installer
else else
# bios # bios
parted /dev/$xda -s -- \ parted /dev/$xda -s -- \
@ -2822,8 +2837,8 @@ create_part() {
set 1 boot on set 1 boot on
update_part update_part
mkfs.ext4 -F -L os /dev/$xda*1 #1 os mkfs.ext4 -F -L os "/dev/$(xda 1)" #1 os
mkfs.ext4 -F -L installer $ext4_opts /dev/$xda*2 #2 installer mkfs.ext4 -F -L installer $ext4_opts "/dev/$(xda 2)" #2 installer
fi fi
update_part update_part
fi fi
@ -3918,7 +3933,9 @@ modify_os_on_disk() {
mkdir -p /os mkdir -p /os
# 按分区容量大到小,依次寻找系统分区 # 按分区容量大到小,依次寻找系统分区
for part in $(lsblk /dev/$xda*[0-9] --sort SIZE -no NAME | tac); do # lsblk /dev/mmcblk0* 会列出 mmcblk0boot0 mmcblk0boot1
# lsblk /dev/mmcblk0 不会列出 mmcblk0boot0 mmcblk0boot1
for part in $(lsblk /dev/$xda --filter 'TYPE == "part"' --sort SIZE -no NAME | tac); do
# btrfs挂载的是默认子卷如果没有默认子卷挂载的是根目录 # btrfs挂载的是默认子卷如果没有默认子卷挂载的是根目录
# fedora 云镜像没有默认子卷且系统在root子卷中 # fedora 云镜像没有默认子卷且系统在root子卷中
if mount -o ro /dev/$part /os; then if mount -o ro /dev/$part /os; then
@ -4448,7 +4465,7 @@ install_fnos() {
# 挂载 /os # 挂载 /os
mkdir -p /os mkdir -p /os
mount /dev/$xda*2 /os mount "/dev/$(xda 2)" /os
# 下载并挂载 iso # 下载并挂载 iso
mkdir -p /os/installer /iso mkdir -p /os/installer /iso
@ -4489,7 +4506,7 @@ install_fnos() {
# 挂载 /os/boot/efi # 挂载 /os/boot/efi
if is_efi; then if is_efi; then
mkdir -p /os/boot/efi mkdir -p /os/boot/efi
mount -o "$(echo "$fstab_line_efi" | awk '{print $4}')" /dev/$xda*1 /os/boot/efi mount -o "$(echo "$fstab_line_efi" | awk '{print $4}')" "/dev/$(xda 1)" /os/boot/efi
fi fi
# 复制系统 # 复制系统
@ -4520,7 +4537,7 @@ install_fnos() {
# fstab # fstab
{ {
# / # /
uuid=$(lsblk /dev/$xda*2 -no UUID) uuid=$(lsblk "/dev/$(xda 2)" -no UUID)
echo "$fstab_line_os" | sed "s/%s/$uuid/" echo "$fstab_line_os" | sed "s/%s/$uuid/"
# swapfile # swapfile
@ -4529,7 +4546,7 @@ install_fnos() {
# /boot/efi # /boot/efi
if is_efi; then if is_efi; then
uuid=$(lsblk /dev/$xda*1 -no UUID) uuid=$(lsblk "/dev/$(xda 1)" -no UUID)
echo "$fstab_line_efi" | sed "s/%s/$uuid/" echo "$fstab_line_efi" | sed "s/%s/$uuid/"
fi fi
} >$os_dir/etc/fstab } >$os_dir/etc/fstab
@ -4655,7 +4672,7 @@ install_qcow_by_copy() {
if is_efi; then if is_efi; then
# centos/oracle 要创建efi条目 # centos/oracle 要创建efi条目
if ! grep /boot/efi /os/etc/fstab; then if ! grep /boot/efi /os/etc/fstab; then
efi_part_uuid=$(lsblk /dev/$xda*1 -no UUID) efi_part_uuid=$(lsblk "/dev/$(xda 1)" -no UUID)
echo "UUID=$efi_part_uuid /boot/efi vfat $efi_mount_opts 0 0" >>/os/etc/fstab echo "UUID=$efi_part_uuid /boot/efi vfat $efi_mount_opts 0 0" >>/os/etc/fstab
fi fi
else else
@ -4990,7 +5007,7 @@ EOF
# 因为 24.04 fsuuid 对应 boot 分区 # 因为 24.04 fsuuid 对应 boot 分区
efi_grub_cfg=$os_dir/boot/efi/EFI/ubuntu/grub.cfg efi_grub_cfg=$os_dir/boot/efi/EFI/ubuntu/grub.cfg
if is_efi; then if is_efi; then
os_uuid=$(lsblk -rno UUID /dev/$xda*2) os_uuid=$(lsblk -rno UUID "/dev/$(xda 2)")
sed -Ei "s|[0-9a-f-]{36}|$os_uuid|i" $efi_grub_cfg sed -Ei "s|[0-9a-f-]{36}|$os_uuid|i" $efi_grub_cfg
# 24.04 移除 boot 分区后,需要添加 /boot 路径 # 24.04 移除 boot 分区后,需要添加 /boot 路径
@ -5004,7 +5021,7 @@ EOF
if [ -e $force_partuuid_cfg ]; then if [ -e $force_partuuid_cfg ]; then
if is_virt; then if is_virt; then
# 更改写死的 partuuid # 更改写死的 partuuid
os_part_uuid=$(lsblk -rno PARTUUID /dev/$xda*2) os_part_uuid=$(lsblk -rno PARTUUID "/dev/$(xda 2)")
sed -i "s/^GRUB_FORCE_PARTUUID=.*/GRUB_FORCE_PARTUUID=$os_part_uuid/" $force_partuuid_cfg sed -i "s/^GRUB_FORCE_PARTUUID=.*/GRUB_FORCE_PARTUUID=$os_part_uuid/" $force_partuuid_cfg
else else
# 独服不应该使用 initrdless boot # 独服不应该使用 initrdless boot
@ -5155,8 +5172,8 @@ EOF
mount_nouuid /dev/$os_part /nbd/ mount_nouuid /dev/$os_part /nbd/
mount_pseudo_fs /nbd/ mount_pseudo_fs /nbd/
case "$os_part_fstype" in case "$os_part_fstype" in
ext4) chroot /nbd mkfs.ext4 -F -L "$os_part_label" -U "$os_part_uuid" /dev/$xda*2 ;; ext4) chroot /nbd mkfs.ext4 -F -L "$os_part_label" -U "$os_part_uuid" "/dev/$(xda 2)" ;;
xfs) chroot /nbd mkfs.xfs -f -L "$os_part_label" -m uuid=$os_part_uuid /dev/$xda*2 ;; xfs) chroot /nbd mkfs.xfs -f -L "$os_part_label" -m uuid=$os_part_uuid "/dev/$(xda 2)" ;;
esac esac
umount -R /nbd/ umount -R /nbd/
@ -5164,7 +5181,7 @@ EOF
# 创建并挂载 /os # 创建并挂载 /os
mkdir -p /os mkdir -p /os
mount -o noatime /dev/$xda*2 /os/ mount -o noatime "/dev/$(xda 2)" /os/
# 如果是 efi 则创建 /os/boot/efi # 如果是 efi 则创建 /os/boot/efi
# 如果镜像有 efi 分区也创建 /os/boot/efi用于复制 efi 分区的文件 # 如果镜像有 efi 分区也创建 /os/boot/efi用于复制 efi 分区的文件
@ -5175,7 +5192,7 @@ EOF
# 预先挂载 /os/boot/efi 因为可能 boot 和 efi 在同一个分区openeuler 24.03 arm # 预先挂载 /os/boot/efi 因为可能 boot 和 efi 在同一个分区openeuler 24.03 arm
# 复制 boot 时可以会复制 efi 的文件 # 复制 boot 时可以会复制 efi 的文件
if is_efi; then if is_efi; then
mount -o $efi_mount_opts /dev/$xda*1 /os/boot/efi/ mount -o $efi_mount_opts "/dev/$(xda 1)" /os/boot/efi/
fi fi
fi fi
@ -5226,7 +5243,7 @@ EOF
if is_efi && [ -n "$efi_part_uuid" ] && ! [ "$efi_part" = "$os_part" ]; then if is_efi && [ -n "$efi_part_uuid" ] && ! [ "$efi_part" = "$os_part" ]; then
info "Copy efi partition uuid" info "Copy efi partition uuid"
apk add mtools apk add mtools
mlabel -N "$(echo $efi_part_uuid | sed 's/-//')" -i /dev/$xda*1 ::$efi_part_label mlabel -N "$(echo $efi_part_uuid | sed 's/-//')" -i "/dev/$(xda 1)" ::$efi_part_label
apk del mtools apk del mtools
update_part update_part
fi fi
@ -5240,9 +5257,9 @@ EOF
# 重新挂载 /os /boot/efi # 重新挂载 /os /boot/efi
info "Re-mount disk" info "Re-mount disk"
mount -o noatime /dev/$xda*2 /os/ mount -o noatime "/dev/$(xda 2)" /os/
if is_efi; then if is_efi; then
mount -o $efi_mount_opts /dev/$xda*1 /os/boot/efi/ mount -o $efi_mount_opts "/dev/$(xda 1)" /os/boot/efi/
fi fi
# 创建 swap # 创建 swap
@ -5462,22 +5479,22 @@ resize_after_install_cloud_image() {
ext4) ext4)
# debian ci # debian ci
apk add e2fsprogs-extra apk add e2fsprogs-extra
e2fsck -p -f /dev/$xda*$last_part_num e2fsck -p -f "/dev/$(xda $last_part_num)"
resize2fs /dev/$xda*$last_part_num resize2fs "/dev/$(xda $last_part_num)"
apk del e2fsprogs-extra apk del e2fsprogs-extra
;; ;;
xfs) xfs)
# opensuse ci # opensuse ci
apk add xfsprogs-extra apk add xfsprogs-extra
mount /dev/$xda*$last_part_num /os mount "/dev/$(xda $last_part_num)" /os
xfs_growfs /dev/$xda*$last_part_num xfs_growfs "/dev/$(xda $last_part_num)"
umount /os umount /os
apk del xfsprogs-extra apk del xfsprogs-extra
;; ;;
btrfs) btrfs)
# fedora ci # fedora ci
apk add btrfs-progs apk add btrfs-progs
mount /dev/$xda*$last_part_num /os mount "/dev/$(xda $last_part_num)" /os
btrfs filesystem resize max /os btrfs filesystem resize max /os
umount /os umount /os
apk del btrfs-progs apk del btrfs-progs
@ -5485,8 +5502,8 @@ resize_after_install_cloud_image() {
ntfs) ntfs)
# windows dd # windows dd
apk add ntfs-3g-progs apk add ntfs-3g-progs
echo y | ntfsresize /dev/$xda*$last_part_num echo y | ntfsresize "/dev/$(xda $last_part_num)"
ntfsfix -d /dev/$xda*$last_part_num ntfsfix -d "/dev/$(xda $last_part_num)"
apk del ntfs-3g-progs apk del ntfs-3g-progs
;; ;;
esac esac
@ -5507,12 +5524,12 @@ mount_part_basic_layout() {
# 挂载系统分区 # 挂载系统分区
mkdir -p $os_dir mkdir -p $os_dir
mount -t ext4 /dev/${xda}*${os_part_num} $os_dir mount -t ext4 "/dev/$(xda $os_part_num)" $os_dir
# 挂载 efi 分区 # 挂载 efi 分区
if is_efi; then if is_efi; then
mkdir -p $efi_dir mkdir -p $efi_dir
mount -t vfat -o umask=077 /dev/${xda}*1 $efi_dir mount -t vfat -o umask=077 "/dev/$(xda 1)" $efi_dir
fi fi
} }