diff --git a/reinstall.sh b/reinstall.sh index 8c1b748..d32a4ee 100644 --- a/reinstall.sh +++ b/reinstall.sh @@ -1363,12 +1363,29 @@ Continue? fi file=openSUSE-Tumbleweed-Minimal-VM.$basearch-Cloud.qcow2 else - # 常规版本 + # leap dir=distribution/leap/$releasever/appliances - file=openSUSE-Leap-$releasever-Minimal-VM.$basearch-Cloud.qcow2 - fi + if [ "$releasever" = 15.6 ]; then + file=openSUSE-Leap-$releasever-Minimal-VM.$basearch-Cloud.qcow2 + # https://build.opensuse.org/projects/Virtualization:Appliances:Images:openSUSE-Leap-15.6/packages/kiwi-templates-Minimal/files/Minimal.kiwi + # https://build.opensuse.org/projects/Virtualization:Appliances:Images:openSUSE-Tumbleweed/packages/kiwi-templates-Minimal/files/Minimal.kiwi + # 有专门的kvm镜像,openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2,里面没有cloud-init + # file=openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2 + else + # https://src.opensuse.org/openSUSE/Leap/raw/branch/16.0/Leap/Leap.kiwi + # Default 比 Base 多了以下组件 + # + # + # + # + # + # + # - # 有专门的kvm镜像,openSUSE-Leap-15.5-Minimal-VM.x86_64-kvm-and-xen.qcow2,但里面没有cloud-init + # file=Leap.x86_64-Default.raw.xz + file=Leap.x86_64-Base.raw.xz + fi + fi eval ${step}_img=$mirror/$dir/$file } @@ -1713,7 +1730,7 @@ Continue with DD? # 集中测试云镜像格式 if is_use_cloud_image && [ "$step" = finalos ]; then # shellcheck disable=SC2154 - test_url $finalos_img 'qemu qemu.gzip qemu.xz qemu.zstd' finalos_img_type + test_url $finalos_img 'qemu qemu.gzip qemu.xz qemu.zstd raw.xz' finalos_img_type fi } @@ -1753,7 +1770,7 @@ verify_os_name() { 'fedora 40|41' \ 'nixos 24.11' \ 'debian 9|10|11|12' \ - 'opensuse 15.6|tumbleweed' \ + 'opensuse 15.6|16.0|tumbleweed' \ 'alpine 3.18|3.19|3.20|3.21' \ 'openeuler 20.03|22.03|24.03|25.03' \ 'ubuntu 16.04|18.04|20.04|22.04|24.04|24.10' \ diff --git a/trans.sh b/trans.sh index 22078b9..229d038 100644 --- a/trans.sh +++ b/trans.sh @@ -3152,7 +3152,8 @@ EOF remove_cloud_init $os_dir - disable_selinux_kdump $os_dir + disable_selinux $os_dir + disable_kdump $os_dir if fw_pkgs=$(get_ucode_firmware_pkgs) && [ -n "$fw_pkgs" ]; then is_have_cmd_on_disk $os_dir dnf && mgr=dnf || mgr=yum @@ -3344,9 +3345,17 @@ EOF disable_jeos_firstboot $os_dir - # opensuse leap - if grep opensuse-leap $os_dir/etc/os-release; then + # 16.0 需要安装 openssh + if ! chroot $os_dir rpm -qi openssh-server; then + chroot $os_dir zypper install -y openssh-server + fi + # 禁用 selinux + disable_selinux $os_dir + + # opensuse leap 15.6 用 wicked + # opensuse leap 16.0 / tumbleweed 用 NetworkManager + if chroot $os_dir rpm -qi wicked; then # sysconfig ifcfg create_cloud_init_network_config $os_dir/net.cfg chroot $os_dir cloud-init devel net-convert \ @@ -3388,11 +3397,8 @@ EOF # 清理 rm -rf $os_dir/net.cfg $os_dir/out - fi - # opensuse tumbleweed - # network-manager - if grep opensuse-tumbleweed $os_dir/etc/os-release; then + else # 如果使用 cloud-init 则需要 touch NetworkManager.conf # 更新到 cloud-init 24.1 后删除 # touch $os_dir/etc/NetworkManager/NetworkManager.conf @@ -3403,34 +3409,45 @@ EOF rm /net.cfg fi + # 选择新内核 + # 只有 leap 有 kernel-azure + if grep -iq leap $os_dir/etc/os-release && [ "$(get_cloud_vendor)" = azure ]; then + target_kernel='kernel-azure' + else + target_kernel='kernel-default' + fi + + # rpm -qi 不支持通配符 + installed_kernel=$(chroot $os_dir rpm -qa 'kernel-*' --qf '%{NAME}\n' | grep -v firmware) + if ! [ "$(echo "$installed_kernel" | wc -l)" -eq 1 ]; then + error_and_exit "Unexpected kernel installed: $installed_kernel" + fi + + # 15.6 / tumbleweed 自带的是 kernel-default-base + # 16.0 自带的是 kernel-default # 不能同时装 kernel-default-base 和 kernel-default - chroot $os_dir zypper remove -y -u kernel-default-base + + if ! [ "$installed_kernel" = "$target_kernel" ]; then + chroot $os_dir zypper remove -y -u $installed_kernel + + # x86 必须设置一个密码,否则报错,arm 没有这个问题 + # Failed to get root password hash + # Failed to import /etc/uefi/certs/76B6A6A0.crt + # warning: %post(kernel-default-5.14.21-150500.55.83.1.x86_64) scriptlet failed, exit status 255 + if grep -q '^root:[:!*]' $os_dir/etc/shadow; then + echo "root:$(mkpasswd '')" | chroot $os_dir chpasswd -e + chroot $os_dir zypper install -y $target_kernel + chroot $os_dir passwd -d root + else + chroot $os_dir zypper install -y $target_kernel + fi + fi # 固件+微码 if fw_pkgs=$(get_ucode_firmware_pkgs) && [ -n "$fw_pkgs" ]; then chroot $os_dir zypper install -y $fw_pkgs fi - # 选择新内核 - # 只有 leap 有 kernel-azure - if grep -q opensuse-leap $os_dir/etc/os-release && [ "$(get_cloud_vendor)" = azure ]; then - kernel='kernel-azure' - else - kernel='kernel-default' - fi - - # x86 必须设置一个密码,否则报错,arm 没有这个问题 - # Failed to get root password hash - # Failed to import /etc/uefi/certs/76B6A6A0.crt - # warning: %post(kernel-default-5.14.21-150500.55.83.1.x86_64) scriptlet failed, exit status 255 - if grep -q '^root:[:!*]' $os_dir/etc/shadow; then - echo "root:$(mkpasswd '')" | chroot $os_dir chpasswd -e - chroot $os_dir zypper install -y $kernel - chroot $os_dir passwd -d root - else - chroot $os_dir zypper install -y $kernel - fi - # 最后才删除 cloud-init # 因为生成 sysconfig 网络配置要用目标系统的 cloud-init remove_cloud_init $os_dir @@ -3707,10 +3724,9 @@ change_root_password() { fi } -disable_selinux_kdump() { +disable_selinux() { os_dir=$1 - # selinux # https://access.redhat.com/solutions/3176 # centos7 也建议将 selinux 开关写在 cmdline # grep selinux=0 /usr/lib/dracut/modules.d/98selinux/selinux-loadpolicy.sh @@ -3718,9 +3734,28 @@ disable_selinux_kdump() { if [ -f $os_dir/etc/selinux/config ]; then sed -i 's/^SELINUX=enforcing/SELINUX=disabled/g' $os_dir/etc/selinux/config fi - chroot $os_dir grubby --update-kernel ALL --args selinux=0 - # kdump + # opensuse 没有安装 grubby + if is_have_cmd_on_disk $os_dir grubby; then + # grubby 只处理 GRUB_CMDLINE_LINUX,不会处理 GRUB_CMDLINE_LINUX_DEFAULT + # rocky 的 GRUB_CMDLINE_LINUX_DEFAULT 有 crashkernel=auto + chroot $os_dir grubby --update-kernel ALL --args selinux=0 + + # el7 上面那条 grubby 命令不能设置 /etc/default/grub + sed -i 's/selinux=1/selinux=0/' $os_dir/etc/default/grub + else + # 有可能没有 selinux 参数,但现在的镜像没有这个问题 + # sed -Ei 's/[[:space:]]?(security|selinux|enforcing)=[^ ]*//g' $os_dir/etc/default/grub + sed -i 's/selinux=1/selinux=0/' $os_dir/etc/default/grub + + # 如果需要用 snapshot 可以用 transactional-update grub.cfg + chroot $os_dir grub2-mkconfig -o /boot/grub2/grub.cfg + fi +} + +disable_kdump() { + os_dir=$1 + # grubby 只处理 GRUB_CMDLINE_LINUX,不会处理 GRUB_CMDLINE_LINUX_DEFAULT # rocky 的 GRUB_CMDLINE_LINUX_DEFAULT 有 crashkernel=auto @@ -4111,7 +4146,8 @@ install_qcow_by_copy() { del_default_user /os # selinux kdump - disable_selinux_kdump /os + disable_selinux /os + disable_kdump /os # el7 删除 machine-id 后不会自动重建 clear_machine_id /os @@ -4877,6 +4913,7 @@ fix_gpt_backup_partition_table_by_sgdisk() { # 适用于 DD 后修复 gpt 备份分区表 fix_gpt_backup_partition_table_by_parted() { + apk add parted parted /dev/$xda -f -s print update_part }