core: 为腾讯云设置 max_sectors_kb

fixes #500
This commit is contained in:
bin456789
2026-09-23 21:44:30 +08:00
parent 892e159df7
commit 77eef72c0e
2 changed files with 124 additions and 1 deletions
+19 -1
View File
@@ -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
+105
View File
@@ -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 <<EOF
services.udev.extraRules = ''
KERNEL=="vd*[a-z]", ACTION=="add|change", SUBSYSTEM=="block", ATTR{queue/max_sectors_kb}="512"
'';
boot.initrd.services.udev.rules = ''
KERNEL=="vd*[a-z]", ACTION=="add|change", SUBSYSTEM=="block", ATTR{queue/max_sectors_kb}="512"
'';
EOF
)
fi
# TODO: 准确匹配网卡,添加 udev 或者直接配置 networkd 匹配 mac
create_nixos_network_config /tmp/nixos_network_config.nix
@@ -2085,6 +2100,7 @@ boot.kernelParams = [ $(get_ttys console= | quote_word) ];
$nix_users
$nix_openssh
$nix_frpc
$nix_udev_rules
$(cat /tmp/nixos_network_config.nix)
###################################################
EOF
@@ -8377,6 +8393,87 @@ get_ubuntu_kernel_flavor() {
esac
}
is_tencent_cloud() {
[ "$(cat /sys/devices/virtual/dmi/id/sys_vendor 2>/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 <<EOF >$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