From a1d1d613d4826392803ed3da3762913594685f10 Mon Sep 17 00:00:00 2001 From: bin456789 Date: Mon, 19 Aug 2024 00:33:59 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E9=87=8D=E6=9E=84=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- alpine-network.sh | 4 +- reinstall.sh | 13 ++- trans.sh | 233 +++++++++++++++++++++++++--------------------- ttys.sh | 10 +- 4 files changed, 144 insertions(+), 116 deletions(-) diff --git a/alpine-network.sh b/alpine-network.sh index a346d45..24536eb 100644 --- a/alpine-network.sh +++ b/alpine-network.sh @@ -288,11 +288,11 @@ elif ! $ipv4_has_internet && $ipv6_has_internet; then fi # 如果联网了,但没获取到默认 DNS,则添加我们的 DNS -if $ipv4_has_internet && ! grep '\.' /etc/resolv.conf; then +if $ipv4_has_internet && ! { [ -e /etc/resolv.conf ] && grep -F '.' /etc/resolv.conf; }; then echo "nameserver $ipv4_dns1" >>/etc/resolv.conf echo "nameserver $ipv4_dns2" >>/etc/resolv.conf fi -if $ipv6_has_internet && ! grep ':' /etc/resolv.conf; then +if $ipv4_has_internet && ! { [ -e /etc/resolv.conf ] && grep -F ':' /etc/resolv.conf; }; then echo "nameserver $ipv6_dns1" >>/etc/resolv.conf echo "nameserver $ipv6_dns2" >>/etc/resolv.conf fi diff --git a/reinstall.sh b/reinstall.sh index da3920f..51c5c02 100644 --- a/reinstall.sh +++ b/reinstall.sh @@ -1292,15 +1292,14 @@ verify_os_name() { 'windows' \ 'dd' \ 'netboot.xyz'; do - ds=$(awk '{print $1}' <<<"$os") - vers=$(awk '{print $2}' <<<"$os" | sed 's \. \\\. g') - finalos=$(echo "$@" | to_lower | sed -n -E "s,^($ds)[ :-]?(|$vers)$,\1:\2,p") + read -r ds vers <<<"$os" + vers_=${vers//\./\\\.} + finalos=$(echo "$@" | to_lower | sed -n -E "s,^($ds)[ :-]?(|$vers_)$,\1 \2,p") if [ -n "$finalos" ]; then - distro=$(echo $finalos | cut -d: -f1) - releasever=$(echo $finalos | cut -d: -f2) + read -r distro releasever <<<"$finalos" # 默认版本号 - if [ -z "$releasever" ] && grep -q '|' <<<$os; then - releasever=$(awk '{print $2}' <<<$os | awk -F'|' '{print $NF}') + if [ -z "$releasever" ] && [ -n "$vers" ]; then + releasever=$(awk -F '|' '{print $NF}' <<<"|$vers") fi return fi diff --git a/trans.sh b/trans.sh index 53d9726..e9ca934 100644 --- a/trans.sh +++ b/trans.sh @@ -6,35 +6,12 @@ # 命令出错终止运行,将进入到登录界面,防止失联 set -eE -# debian 安装版、ubuntu 安装版、redhat 安装版不使用该密码 +# debian 安装版、ubuntu 安装版、el/ol 安装版不使用该密码 PASSWORD=123@@@ -EFI_UUID=C12A7328-F81F-11D2-BA4B-00A0C93EC93B TRUE=0 FALSE=1 - -trap 'trap_err $LINENO $?' ERR - -# 复制本脚本到 /tmp/trans.sh,用于打印错误 -# 也有可能从管道运行,这时删除 /tmp/trans.sh -case "$0" in -*trans.*) cp -f "$0" /tmp/trans.sh ;; -*) rm -f /tmp/trans.sh ;; -esac - -# 还原改动,不然本脚本会被复制到新系统 -rm -f /etc/local.d/trans.start -rm -f /etc/runlevels/default/local - -trap_err() { - line_no=$1 - ret_no=$2 - - error "Line $line_no return $ret_no" - if [ -f "/tmp/trans.sh" ]; then - sed -n "$line_no"p /tmp/trans.sh - fi -} +EFI_UUID=C12A7328-F81F-11D2-BA4B-00A0C93EC93B error() { color='\e[31m' @@ -47,6 +24,25 @@ error_and_exit() { exit 1 } +trap_err() { + line_no=$1 + ret_no=$2 + + error "Line $line_no return $ret_no" + if [ -f "/trans.sh" ]; then + sed -n "$line_no"p /trans.sh + fi +} + +is_run_from_locald() { + [[ "$0" = /etc/local.d/* ]] +} + +should_hold_after_boot() { + # shellcheck disable=SC2154 + [ "$hold" = 1 ] # && is_run_from_locald +} + add_community_repo() { # 先检查原来的repo是不是egde if grep -q '^http.*/edge/main$' /etc/apk/repositories; then @@ -427,9 +423,7 @@ is_ipv4_has_internet() { } is_in_china() { - get_netconf_to is_in_china - # shellcheck disable=SC2154 - [ "$is_in_china" = 1 ] + grep -q 1 /dev/netconf/*/is_in_china } # 有 dhcpv4 不等于有网关,例如 vultr 纯 ipv6 @@ -544,23 +538,19 @@ is_need_manual_set_dnsv6() { { ! is_have_rdnss || { is_have_rdnss && is_windows && ! is_windows_support_rdnss; }; } } -get_current_dns_v4() { +get_current_dns() { + mark=$( + case "$1" in + 4) echo . ;; + 6) echo : ;; + esac + ) # debian 11 initrd 没有 xargs awk # debian 12 initrd 没有 xargs if false; then - grep '^nameserver' /etc/resolv.conf | awk '{print $2}' | grep '\.' + grep '^nameserver' /etc/resolv.conf | awk '{print $2}' | grep -F "$mark" else - grep '^nameserver' /etc/resolv.conf | cut -d' ' -f2 | grep '\.' - fi -} - -get_current_dns_v6() { - # debian 11 initrd 没有 xargs awk - # debian 12 initrd 没有 xargs - if false; then - grep '^nameserver' /etc/resolv.conf | awk '{print $2}' | grep ':' - else - grep '^nameserver' /etc/resolv.conf | cut -d' ' -f2 | grep ':' + grep '^nameserver' /etc/resolv.conf | cut -d' ' -f2 | grep -F "$mark" fi } @@ -679,13 +669,19 @@ insert_into_file() { file=$1 location=$2 regex_to_find=$3 + shift 3 + + # 默认 grep -E + if [ $# -eq 0 ]; then + set -- -E + fi if [ "$location" = head ]; then bak=$(mktemp) cp $file $bak cat - $bak >$file else - line_num=$(grep -E -n "$regex_to_find" "$file" | cut -d: -f1) + line_num=$(grep "$@" -n "$regex_to_find" "$file" | cut -d: -f1) found_count=$(echo "$line_num" | wc -l) if [ ! "$found_count" -eq 1 ]; then @@ -773,7 +769,7 @@ iface $ethx inet static gateway $ipv4_gateway EOF # dns - if list=$(get_current_dns_v4); then + if list=$(get_current_dns 4); then for dns in $list; do cat <>$conf_file dns-nameservers $dns @@ -801,8 +797,8 @@ EOF # dns # 有 ipv6 但需设置 dns 的情况 - if is_need_manual_set_dnsv6 && list=$(get_current_dns_v6); then - for dns in $list; do + if is_need_manual_set_dnsv6; then + for dns in $(get_current_dns 6); do cat <>$conf_file dns-nameserver $dns EOF @@ -848,21 +844,7 @@ install_alpine() { # bios机器用 setup-disk 自动分区会有 boot 分区 # 因此手动分区安装 create_part - - # 挂载系统分区 - if is_efi || is_xda_gt_2t; then - os_part_num=2 - else - os_part_num=1 - fi - mkdir -p /os - mount -t ext4 /dev/${xda}*${os_part_num} /os - - # 挂载 efi - if is_efi; then - mkdir -p /os/boot/efi - mount -t vfat /dev/${xda}*1 /os/boot/efi - fi + mount_part_basic_layout /os /os/boot/efi # 创建 swap if $hack_lowram_swap; then @@ -989,6 +971,21 @@ get_cpu_vendor() { esac } +min() { + printf "%d\n" "$@" | sort -n | head -n 1 +} + +# 设置线程 +# 根据 cpu 核数,每个线程的内存,取最小值 +get_build_threads() { + threads_per_mb=$1 + + threads_by_core=$(nproc --all) + threads_by_ram=$(($(get_approximate_ram_size) / threads_per_mb)) + [ $threads_by_ram -eq 0 ] && threads_by_ram=1 + min $threads_by_ram $threads_by_core +} + install_arch_gentoo() { set_locale() { echo "C.UTF-8 UTF-8" >>$os_dir/etc/locale.gen @@ -1106,17 +1103,8 @@ EOF ACCEPT_LICENSE="*" EOF - # 设置线程 - # 根据 cpu 核数,2G内存一个线程,取最小值 - threads_by_core=$(nproc --all) - phy_ram=$(get_approximate_ram_size) - threads_by_ram=$((phy_ram / 2048)) - if [ $threads_by_ram -eq 0 ]; then - threads_by_ram=1 - fi - threads=$(printf "%d\n" $threads_by_ram $threads_by_core | sort -n | head -1) cat <>$os_dir/etc/portage/make.conf -MAKEOPTS="-j$threads" +MAKEOPTS="-j$(get_build_threads 2048)" EOF # 设置 http repo + binpkg repo @@ -1204,20 +1192,9 @@ EOF os_dir=/os # 挂载分区 - if is_efi || is_xda_gt_2t; then - os_part_num=2 - else - os_part_num=1 - fi - - mkdir -p /os - mount -t ext4 /dev/${xda}*${os_part_num} /os - - if is_efi; then - mkdir -p /os/efi - mount -t vfat /dev/${xda}*1 /os/efi - fi + mount_part_basic_layout /os /os/efi + # 安装系统 install_$distro # 初始化 @@ -1621,11 +1598,9 @@ create_cloud_init_network_config() { # 旧版 cloud-init 有 bug # 有的版本会只从第一种配置中读取 dns,有的从第二种读取 # 因此写两种配置 - if dns4_list=$(get_current_dns_v4); then - for cur in $dns4_list; do - yq -i ".network.config[$config_id].subnets[$subnet_id].dns_nameservers += [\"$cur\"]" $ci_file - done - fi + for cur in $(get_current_dns 4); do + yq -i ".network.config[$config_id].subnets[$subnet_id].dns_nameservers += [\"$cur\"]" $ci_file + done subnet_id=$((subnet_id + 1)) fi @@ -1674,9 +1649,9 @@ create_cloud_init_network_config() { fi # 有 ipv6 但需设置 dns 的情况 - if is_need_manual_set_dnsv6 && dns6_list=$(get_current_dns_v6); then + if is_need_manual_set_dnsv6; then need_set_dns6=true - for cur in $dns6_list; do + for cur in $(get_current_dns 6); do yq -i ".network.config[$config_id].subnets[$subnet_id].dns_nameservers += [\"$cur\"]" $ci_file done fi @@ -1686,13 +1661,13 @@ create_cloud_init_network_config() { if $need_set_dns4 || $need_set_dns6; then yq -i ".network.config[$config_id].type=\"nameserver\"" $ci_file - if $need_set_dns4 && dns4_list=$(get_current_dns_v4); then - for cur in $dns4_list; do + if $need_set_dns4; then + for cur in $(get_current_dns 4); do yq -i ".network.config[$config_id].address += [\"$cur\"]" $ci_file done fi - if $need_set_dns6 && dns6_list=$(get_current_dns_v6); then - for cur in $dns6_list; do + if $need_set_dns6; then + for cur in $(get_current_dns 6); do yq -i ".network.config[$config_id].address += [\"$cur\"]" $ci_file done fi @@ -2083,12 +2058,18 @@ modify_os_on_disk() { error_and_exit "Can't find os partition." } +get_need_swap_size() { + need_ram=$1 + + phy_ram=$(get_approximate_ram_size) + echo $((need_ram - phy_ram)) +} + create_swap_if_ram_less_than() { need_ram=$1 swapfile=$2 - phy_ram=$(get_approximate_ram_size) - swapsize=$((need_ram - phy_ram)) + swapsize=$(get_need_swap_size $need_ram) if [ $swapsize -gt 0 ]; then create_swap $swapsize $swapfile fi @@ -2842,7 +2823,28 @@ resize_after_install_cloud_image() { fi } -mount_part_for_install_mode() { +mount_part_basic_layout() { + os_dir=$1 + efi_dir=$2 + + if is_efi || is_xda_gt_2t; then + os_part_num=2 + else + os_part_num=1 + fi + + # 挂载系统分区 + mkdir -p $os_dir + mount -t ext4 /dev/${xda}*${os_part_num} $os_dir + + # 挂载 efi 分区 + if is_efi; then + mkdir -p $efi_dir + mount -t vfat -o umask=077 /dev/${xda}*1 $efi_dir + fi +} + +mount_part_for_iso_installer() { # 挂载主分区 mkdir -p /os mount /dev/disk/by-label/os /os @@ -2860,7 +2862,7 @@ mount_part_for_install_mode() { } get_dns_list_for_win() { - if dns_list=$(get_current_dns_v$1); then + if dns_list=$(get_current_dns $1); then i=0 for dns in $dns_list; do i=$((i + 1)) @@ -2880,11 +2882,10 @@ create_win_set_netconf_script() { if is_staticv4; then get_netconf_to ipv4_addr get_netconf_to ipv4_gateway - ipv4_dns_list="$(get_dns_list_for_win 4)" cat <>$target set ipv4_addr=$ipv4_addr set ipv4_gateway=$ipv4_gateway -$ipv4_dns_list +$(get_dns_list_for_win 4) EOF fi @@ -2899,9 +2900,9 @@ EOF fi # 有 ipv6 但需设置 dns 的情况 - if is_need_manual_set_dnsv6 && ipv6_dns_list="$(get_dns_list_for_win 6)"; then + if is_need_manual_set_dnsv6; then cat <>$target -$ipv6_dns_list +$(get_dns_list_for_win 6) EOF fi @@ -3665,6 +3666,28 @@ EOF # 并调用本文件的 create_ifupdown_config 方法 : main +# 无参数运行 +# 复制本脚本到 /trans.sh,除非路径相同 +# 用于打印错误或者再次运行 +if ! [ "$(readlink -f "$0")" = /trans.sh ]; then + cp -f "$0" /trans.sh +fi + +# 还原改动,不然本脚本会被复制到新系统 +rm -f /etc/local.d/trans.start +rm -f /etc/runlevels/default/local + +trap 'trap_err $LINENO $?' ERR +extract_env_from_cmdline + +# 带参数运行,则重新下载脚本 +if [ "$1" = "update" ]; then + # shellcheck disable=SC2154 + wget -O /trans.sh "$confhome/trans.sh" + chmod +x /trans.sh + exec /trans.sh +fi + # 允许 ramdisk 使用所有内存,默认是 50% mount / -o remount,size=100% @@ -3676,9 +3699,7 @@ hwclock -s || true echo "root:$PASSWORD" | chpasswd printf '\nyes' | setup-sshd -extract_env_from_cmdline -# shellcheck disable=SC2154 -if [ "$hold" = 1 ]; then +if should_hold_after_boot; then exit fi @@ -3757,7 +3778,7 @@ else ;; *) create_part - mount_part_for_install_mode + mount_part_for_iso_installer case "$distro" in centos | alma | rocky | fedora | ubuntu | redhat) install_redhat_ubuntu ;; windows) install_windows ;; diff --git a/ttys.sh b/ttys.sh index a38c8d0..630873f 100644 --- a/ttys.sh +++ b/ttys.sh @@ -4,9 +4,17 @@ prefix=$1 # 不要在 windows 上使用,因为不准确 # 在原系统上使用,也可能不准确?例如安装了 cloud 内核的甲骨文? +# 注意 debian initrd 没有 xargs + # 最后一个 tty 是主 tty,显示的信息最全 is_first=true -for tty in ttyS0 ttyAMA0 tty0; do +if [ "$(uname -m)" = "aarch64" ]; then + ttys="ttyS0 ttyAMA0 tty0" +else + ttys="ttyS0 tty0" +fi + +for tty in $ttys; do # hytron 有ttyS0 但无法写入 if stty -g -F "/dev/$tty" >/dev/null 2>&1; then if $is_first; then