From c21bf52d41d95842599c9e936dec222c5125cd87 Mon Sep 17 00:00:00 2001 From: bin456789 Date: Tue, 20 Aug 2024 00:27:51 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E4=BC=98=E5=8C=96=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- reinstall.sh | 20 +++- trans.sh | 255 +++++++++++++++++++++++++++------------------------ 2 files changed, 150 insertions(+), 125 deletions(-) diff --git a/reinstall.sh b/reinstall.sh index b7ec455..662237f 100644 --- a/reinstall.sh +++ b/reinstall.sh @@ -1061,6 +1061,10 @@ setos() { if is_efi; then install_pkg hexdump $img_type + # openwrt 镜像 efi part type 不是 esp + # 因此改成检测 fat? + # https://downloads.openwrt.org/releases/23.05.3/targets/x86/64/openwrt-23.05.3-x86-64-generic-ext4-combined-efi.img.gz + # od 在 coreutils 里面,好像要配合 tr 才能删除空格 # hexdump 在 util-linux / bsdmainutils 里面 # xxd 要单独安装,el 在 vim-common 里面 @@ -2186,7 +2190,14 @@ build_extra_cmdline() { } echo_tmp_ttys() { - curl -L $confhome/ttys.sh | sh -s "console=" + if false; then + curl -L $confhome/ttys.sh | sh -s "console=" + else + case "$basearch" in + x86_64) echo "console=ttyS0,115200n8 console=tty0" ;; + aarch64) echo "console=ttyS0,115200n8 console=ttyAMA0,115200n8 console=tty0" ;; + esac + fi } get_entry_name() { @@ -2229,11 +2240,10 @@ build_nextos_cmdline() { else # debian arm 在没有ttyAMA0的机器上(aws t4g),最少要设置一个tty才能启动 # 只设置tty0也行,但安装过程ttyS0没有显示 - nextos_cmdline+=" console=ttyAMA0,115200 console=ttyS0,115200 console=tty0" + nextos_cmdline+=" $(echo_tmp_ttys)" fi else - # nextos_cmdline+=" $(echo_tmp_ttys)" - nextos_cmdline+=" console=ttyAMA0,115200 console=ttyS0,115200 console=tty0" + nextos_cmdline+=" $(echo_tmp_ttys)" fi # nextos_cmdline+=" mem=256M" # nextos_cmdline+=" lowmem=+1" @@ -2279,9 +2289,9 @@ mod_initrd_debian_kali() { # hack 2 # 修改 /var/lib/dpkg/info/netcfg.postinst 运行我们的脚本 - # shellcheck disable=SC1091,SC2317 netcfg() { #!/bin/sh + # shellcheck source=/dev/null . /usr/share/debconf/confmodule db_progress START 0 5 debian-installer/netcfg/title diff --git a/trans.sh b/trans.sh index 53fa327..2fb51a2 100644 --- a/trans.sh +++ b/trans.sh @@ -3,7 +3,7 @@ # shellcheck disable=SC2086,SC3047,SC3036,SC3010,SC3001 # alpine 默认使用 busybox ash -# 命令出错终止运行,将进入到登录界面,防止失联 +# 出错后停止运行,将进入到登录界面,防止失联 set -eE # debian 安装版、ubuntu 安装版、el/ol 安装版不使用该密码 @@ -35,12 +35,7 @@ trap_err() { } is_run_from_locald() { - [[ "$0" = /etc/local.d/* ]] -} - -should_hold_after_boot() { - # shellcheck disable=SC2154 - [ "$hold" = 1 ] # && is_run_from_locald + [[ "$0" = "/etc/local.d/*" ]] } add_community_repo() { @@ -301,13 +296,6 @@ get_all_disks() { ls /sys/block/ | grep -Ev '^(loop|sr|nbd)' } -setup_tty_and_log() { - # 显示输出到前台 - # script -f /dev/tty0 - dev_ttys=$(get_ttys /dev/) - exec > >(tee -a $dev_ttys /reinstall.log) 2>&1 -} - extract_env_from_cmdline() { # 提取 finalos/extra 到变量 for prefix in finalos extra; do @@ -3980,26 +3968,129 @@ EOF cat "$grub_cfg" } +trans() { + mod_motd + cat /proc/cmdline + clear_previous + add_community_repo + + # 需要在重新分区之前,找到主硬盘 + # 重新运行脚本时,可指定 xda + # xda=sda ash trans.start + if [ -z "$xda" ]; then + find_xda + fi + + if [ "$distro" != "alpine" ]; then + setup_nginx_if_enough_ram + setup_udev_util_linux + fi + + # dd qemu 切换成云镜像模式,暂时没用到 + if [ "$distro" = "dd" ] && [ "$img_type" = "qemu" ]; then + # 移到 reinstall.sh ? + distro=any + cloud_image=1 + fi + + if is_use_cloud_image; then + case "$img_type" in + qemu) + create_part + download_qcow + case "$distro" in + centos | alma | rocky | oracle | redhat | anolis | opencloudos | openeuler) + # 这几个系统云镜像系统盘是8~9g xfs,而我们的目标是能在5g硬盘上运行,因此改成复制系统文件 + install_qcow_by_copy + ;; + ubuntu) + # 24.04 云镜像有 boot 分区(在系统分区之前),因此不直接 dd 云镜像 + install_qcow_by_copy + ;; + *) + # debian fedora opensuse arch gentoo any + dd_qcow + resize_after_install_cloud_image + modify_os_on_disk linux + ;; + esac + ;; + gzip | xz) + # 暂时没用到 gzip xz 格式的云镜像 + dd_gzip_xz + resize_after_install_cloud_image + modify_os_on_disk linux + ;; + esac + elif [ "$distro" = "dd" ]; then + case "$img_type" in + gzip | xz) + dd_gzip_xz + modify_os_on_disk windows + ;; + qemu) # dd qemu 不可能到这里,因为上面已处理 + ;; + esac + else + # 安装模式 + case "$distro" in + alpine) + install_alpine + ;; + arch | gentoo) + create_part + install_arch_gentoo + ;; + nixos) + create_part + install_nixos + ;; + *) + create_part + mount_part_for_iso_installer + case "$distro" in + centos | alma | rocky | fedora | ubuntu | redhat) install_redhat_ubuntu ;; + windows) install_windows ;; + esac + ;; + esac + fi + + # 需要用到 lsblk efibootmgr ,只要 1M 左右容量 + # 因此 alpine 不单独处理 + if is_efi; then + del_invalid_efi_entry + add_fallback_efi_to_nvram + fi + + echo 'done' + # 让 web 输出全部内容 + sleep 5 +} + # 脚本入口 # debian initrd 会寻找 main # 并调用本文件的 create_ifupdown_config 方法 : main -# 无参数运行 -# 复制本脚本到 /trans.sh,除非路径相同 +# 复制脚本 # 用于打印错误或者再次运行 +# 路径相同则不用复制 +# 重点:要在删除脚本之前复制 if ! [ "$(readlink -f "$0")" = /trans.sh ]; then cp -f "$0" /trans.sh fi +trap 'trap_err $LINENO $?' ERR -# 还原改动,不然本脚本会被复制到新系统 +# 删除本脚本,不然会被复制到新系统 rm -f /etc/local.d/trans.start rm -f /etc/runlevels/default/local -trap 'trap_err $LINENO $?' ERR +# 提取变量 extract_env_from_cmdline -# 带参数运行,则重新下载脚本 +# 带参数运行部分 +# 重新下载并 exec 运行新脚本 if [ "$1" = "update" ]; then # shellcheck disable=SC2154 wget -O /trans.sh "$confhome/trans.sh" @@ -4007,6 +4098,7 @@ if [ "$1" = "update" ]; then exec /trans.sh fi +# 无参数运行部分 # 允许 ramdisk 使用所有内存,默认是 50% mount / -o remount,size=100% @@ -4018,112 +4110,35 @@ hwclock -s || true echo "root:$PASSWORD" | chpasswd printf '\nyes' | setup-sshd -if should_hold_after_boot; then - exit +# shellcheck disable=SC2154 +if [ "$hold" = 1 ]; then + if is_run_from_locald; then + exit + fi fi -mod_motd -setup_tty_and_log -cat /proc/cmdline -clear_previous -add_community_repo +# 正式运行重装 +# shellcheck disable=SC2046,SC2194 +case 1 in +1) + # ChatGPT 说这种性能最高 + exec > >(exec tee -a $(get_ttys /dev/) /reinstall.log) 2>&1 + trans + ;; +2) + exec > >(tee -a $(get_ttys /dev/) /reinstall.log) 2>&1 + trans + ;; +3) + trans 2>&1 | tee -a $(get_ttys /dev/) /reinstall.log + ;; +esac -# 需要在重新分区之前,找到主硬盘 -# 重新运行脚本时,可指定 xda -# xda=sda ash trans.start -if [ -z "$xda" ]; then - find_xda -fi - -if [ "$distro" != "alpine" ]; then - setup_nginx_if_enough_ram - setup_udev_util_linux -fi - -# dd qemu 切换成云镜像模式,暂时没用到 -if [ "$distro" = "dd" ] && [ "$img_type" = "qemu" ]; then - # 移到 reinstall.sh ? - distro=any - cloud_image=1 -fi - -if is_use_cloud_image; then - case "$img_type" in - qemu) - create_part - download_qcow - case "$distro" in - centos | alma | rocky | oracle | redhat | anolis | opencloudos | openeuler) - # 这几个系统云镜像系统盘是8~9g xfs,而我们的目标是能在5g硬盘上运行,因此改成复制系统文件 - install_qcow_by_copy - ;; - ubuntu) - # 24.04 云镜像有 boot 分区(在系统分区之前),因此不直接 dd 云镜像 - install_qcow_by_copy - ;; - *) - # debian fedora opensuse arch gentoo any - dd_qcow - resize_after_install_cloud_image - modify_os_on_disk linux - ;; - esac - ;; - gzip | xz) - # 暂时没用到 gzip xz 格式的云镜像 - dd_gzip_xz - resize_after_install_cloud_image - modify_os_on_disk linux - ;; - esac -elif [ "$distro" = "dd" ]; then - case "$img_type" in - gzip | xz) - dd_gzip_xz - modify_os_on_disk windows - ;; - qemu) # dd qemu 不可能到这里,因为上面已处理 - ;; - esac -else - # 安装模式 - case "$distro" in - alpine) - install_alpine - ;; - arch | gentoo) - create_part - install_arch_gentoo - ;; - nixos) - create_part - install_nixos - ;; - *) - create_part - mount_part_for_iso_installer - case "$distro" in - centos | alma | rocky | fedora | ubuntu | redhat) install_redhat_ubuntu ;; - windows) install_windows ;; - esac - ;; - esac -fi - -# 需要用到 lsblk efibootmgr ,只要 1M 左右容量 -# 因此 alpine 不单独处理 -if is_efi; then - del_invalid_efi_entry - add_fallback_efi_to_nvram -fi - -sync -echo 'done' if [ "$hold" = 2 ]; then exit fi -cd / -# 让 web 输出全部内容 -sleep 5 +# swapoff -a +# umount ? +sync reboot