From 77eef72c0ed4d3b5ddc8b661767628df320f23cc Mon Sep 17 00:00:00 2001 From: bin456789 Date: Wed, 23 Sep 2026 21:44:30 +0800 Subject: [PATCH] =?UTF-8?q?core:=20=E4=B8=BA=E8=85=BE=E8=AE=AF=E4=BA=91?= =?UTF-8?q?=E8=AE=BE=E7=BD=AE=20max=5Fsectors=5Fkb?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit fixes #500 --- debian.cfg | 20 +++++++++- trans.sh | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) diff --git a/debian.cfg b/debian.cfg index de5cffd..ea2124c 100644 --- a/debian.cfg +++ b/debian.cfg @@ -339,6 +339,19 @@ d-i partman/early_command string true; \ debconf-set base-installer/kernel/image "$(debconf-get base-installer/kernel/image | sed 's/-cloud//')"; \ fi; \ + if [ "$(cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null)" = 'Tencent Cloud' ]; then \ + for block in /sys/class/block/vd[a-z]; do \ + if [ -d "$block" ]; then \ + echo 512 >"$block/queue/max_sectors_kb"; \ + fi; \ + done; \ + echo 'KERNEL=="vd*[a-z]", ACTION=="add|change", SUBSYSTEM=="block", RUN+="/bin/sh -c '\''/bin/echo 512 > /sys/%p/queue/max_sectors_kb'\''"' >/etc/udev/rules.d/80-max-sectors-blk.rules; \ + udevadm control --reload; \ + udevadm trigger --subsystem-match=block; \ + udevadm settle; \ + sleep 1; \ + fi; \ + if [ -d /sys/firmware/efi ]; then \ debconf-set partman-auto/expert_recipe "$(debconf-get partman-auto/expert_recipe_efi)"; \ else \ @@ -433,4 +446,9 @@ d-i preseed/late_command string true; \ cp /fix-eth-name.sh /target/; \ cp /fix-eth-name.service /target/etc/systemd/system/; \ - in-target systemctl enable fix-eth-name + in-target systemctl enable fix-eth-name; \ + + if [ "$(cat /sys/devices/virtual/dmi/id/sys_vendor 2>/dev/null)" = 'Tencent Cloud' ]; then \ + echo 'KERNEL=="vd*[a-z]", ACTION=="add|change", SUBSYSTEM=="block", RUN+="/bin/sh -c '\''/bin/echo 512 > /sys/%p/queue/max_sectors_kb'\''"' >/target/etc/udev/rules.d/80-max-sectors-blk.rules; \ + in-target update-initramfs -u -k all; \ + fi diff --git a/trans.sh b/trans.sh index 8faedec..4b8301e 100644 --- a/trans.sh +++ b/trans.sh @@ -2073,6 +2073,21 @@ EOF ) fi + if is_tencent_cloud; then + # 不能用 /bin/sh 和 /bin/echo + # /nix/store/84akrjvm0clyjkwx3agr03j2iz1w4kxi-initrd-udev-rules/99-local.rules (origin unknown) contains references to /bin/sh and /bin/echo. + nix_udev_rules=$( + cat </dev/null)" = 'Tencent Cloud' ] +} + +add_max_sectors_kb_rule() { + local os_dir=$1 + + # 普通发行版 + if [ -d $os_dir/etc/udev/rules.d/ ]; then + # 取自腾讯云 ubuntu 26.04 镜像 + cat <$os_dir/etc/udev/rules.d/80-max-sectors-blk.rules +KERNEL=="vd*[a-z]", ACTION=="add|change", SUBSYSTEM=="block", RUN+="/bin/sh -c '/bin/echo 512 > /sys/%p/queue/max_sectors_kb'" +EOF + + # alpine + elif [ -f $os_dir/etc/mdev.conf ]; then + if ! grep -Eq '^vd.*max_sectors_kb' "$os_dir/etc/mdev.conf"; then + # shellcheck disable=SC2016 + sed -Ei \ + '/^vd\[a-z\]/s,$,; case "$ACTION" in add|change) if [[ "$MDEV" =~ [a-z]$ ]]; then echo 512 >/sys/class/block/$MDEV/queue/max_sectors_kb; fi;; esac,' \ + "$os_dir/etc/mdev.conf" + fi + fi + +} + +set_max_sectors_kb_for_tencent_cloud_liveos() { + if is_tencent_cloud; then + local block + for block in /sys/class/block/vd[a-z]; do + if [ -d "$block" ]; then + echo 512 >"$block/queue/max_sectors_kb" + fi + done + add_max_sectors_kb_rule / + rc-service mdev restart + sleep 1 + # update_part + fi +} + +set_max_sectors_kb_for_tencent_cloud_persist() { + local os_dir etc_dir + if is_tencent_cloud && etc_dir=$({ ls -d /os/etc/ || ls -d /os/*/etc/; } 2>/dev/null); then + os_dir=$(dirname $etc_dir) + # 重新挂载为读写 + mount -o remount,rw /os + + # rule + add_max_sectors_kb_rule "$os_dir" + + # swap on + # dracut 需要大量内存 + # 防止之前有 swap + swapoff -a + rm -f $os_dir/swapfile + create_swap_if_ram_less_than 2048 $os_dir/swapfile + + # 重新生成 initramfs + # el + if is_have_cmd_on_disk $os_dir dracut; then + chroot $os_dir dracut -f --regenerate-all + # debian/ubuntu + elif is_have_cmd_on_disk $os_dir update-initramfs; then + chroot $os_dir update-initramfs -u -k all + # arch + elif is_have_cmd_on_disk $os_dir mkinitcpio; then + echo 'FILES+=(/etc/udev/rules.d/80-max-sectors-blk.rules)' \ + >$os_dir/etc/mkinitcpio.conf.d/80-max-sectors-blk.conf + chroot $os_dir mkinitcpio -P + # alpine + elif is_have_cmd_on_disk $os_dir mkinitfs; then + chroot $os_dir mkinitfs + fi + + # swap off + swapoff -a + rm -f $os_dir/swapfile + fi +} + install_redhat_ubuntu() { info "Download iso installer" @@ -8493,6 +8590,9 @@ trans() { find_xda fi + # 腾讯云特殊处理 + set_max_sectors_kb_for_tencent_cloud_liveos + if [ "$distro" != "alpine" ]; then setup_web_if_enough_ram # util-linux 包含 lsblk @@ -8584,6 +8684,11 @@ trans() { esac fi + # 腾讯云特殊处理 + if ! { [ "$distro" = dd ] || [ "$distro" = nixos ]; }; then + set_max_sectors_kb_for_tencent_cloud_persist + fi + # 需要用到 lsblk efibootmgr ,只要 1M 左右容量 # 因此 alpine 不单独处理 if is_efi; then