如何在Ubuntu云配置自动安装过程中阻止内核自动更新并固定内核版本
如何在Ubuntu云配置自动安装过程中阻止内核自动更新并固定内核版本
我完全懂你这个痛点——用Packer做Ubuntu自动安装时,明明安装镜像里是5.15.0-25的内核,重启后却自动跳到最新版,害得你每次都要重新编译应用,太折腾了。咱们来一步步调整你的cloud-config配置,把内核版本牢牢固定住。
问题出在哪?
你之前尝试的方法没生效,主要是这几个原因:
- 没彻底禁用Ubuntu默认的
unattended-upgrades自动更新服务,哪怕安装过程没升级,系统启动后它还是会偷偷更内核; apt-mark hold的时机不对,先锁定了generic包却没先安装指定内核版本,导致后续逻辑混乱;- 禁用源的配置太激进,反而让apt找不到你要的内核包。
调整后的完整配置方案
下面是修改后的cloud-config,我会标注关键改动点:
#cloud-config # 关键:在顶层设置,阻止安装过程中的包更新/升级 package_update: false package_upgrade: false autoinstall: version: 1 early-commands: # 保留你原有的ssh workaround - sudo systemctl stop ssh # 关键:提前禁用自动更新服务,从源头阻止内核升级 - sudo systemctl disable --now unattended-upgrades packages: [open-vm-tools, openssh-server, curl, wget] network: network: version: 2 ethernets: ens160: dhcp4: true identity: hostname: ubuntu-appliance username: ubuntu password: "$6$rounds=4096$ntlX/dlo6b$HXaLN4RcLIGaEDdQdR2VTYi9pslSeXWL131MqaakqE285Nv0kW9KRontQYivCbycZerUMcjVsuLl2V8bbdadI1" ssh: install-server: true allow-pw: true authorized-keys: - ssh-rsa <key> user-data: disable_root: false late-commands: # 保留你原有的sudo权限配置 - echo 'ubuntu ALL=(ALL) NOPASSWD:ALL' > /target/etc/sudoers.d/ubuntu - curtin in-target --target=/target -- chmod 440 /etc/sudoers.d/ubuntu # 关键步骤1:先更新源(只更一次,找得到指定内核包就行) - curtin in-target --target=/target -- apt-get update -y # 关键步骤2:安装你指定的内核版本及配套headers - curtin in-target --target=/target -- apt-get install -y linux-image-5.15.0-89-generic linux-headers-5.15.0-89-generic linux-image-generic linux-headers-generic # 关键步骤3:把相关内核包全部标记为锁定,彻底阻止升级 - curtin in-target --target=/target -- apt-mark hold linux-image-5.15.0-89-generic linux-headers-5.15.0-89-generic linux-image-generic linux-headers-generic linux-image-unsigned-5.15.0-89-generic
配置说明
- 顶层的package设置:
package_update: false和package_upgrade: false要放在cloud-config的最外层,这样autoinstall过程中不会触发全局包升级。 - 禁用unattended-upgrades:在early-commands里提前关掉这个服务,避免系统启动后自动拉取安全更新(内核更新属于安全更新范畴)。
- 安装并锁定指定内核:先安装你要的5.15.0-89版本内核及配套的headers,再把所有相关包标记为hold——包括具体版本包和generic元包,这样apt就不会再升级它们了。
验证方法
部署完VM后,登录执行以下命令确认:
uname -r:查看当前运行的内核版本是否为5.15.0-89-genericapt-mark showhold:查看被锁定的包列表,确认所有内核相关包都在里面
备注:内容来源于stack exchange,提问作者hustler_singh
相关产品推荐
相关产品推荐

