You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

自建内核镜像搭配官方initrd时cloud-init无法设置用户密码

问题分析与解决方案

当使用QEMU启动Ubuntu虚拟机时,官方内核+initrd组合能正常运行且cloud-init工作正常,但替换为自编译内核后,系统虽能启动却无法通过cloud-init设置用户密码,导致无法登录,通常是以下原因导致:

核心原因

  • 内核缺少cloud-init依赖的关键配置:cloud-init运行依赖部分内核功能,比如密码哈希所需的加密算法(SHA256/SHA512)、文件系统支持(ext4、tmpfs)、串口控制台、proc/sysfs文件系统等,自编译内核若未开启这些配置,会导致cloud-init无法完成密码写入等操作。
  • 内核与initrd版本不兼容:自编译内核的主版本号与官方initrd对应的内核版本差异过大,会导致initrd中的内核模块无法加载,破坏cloud-init的运行环境。
  • 启动参数缺失:官方内核启动时携带了cloud-init必需的参数(如串口控制台、cloud-init启用标识),自编译内核启动时未添加这些参数,会导致cloud-init初始化失败。

排查步骤

  1. 查看cloud-init日志定位问题
    用官方内核重新启动虚拟机,挂载根分区后查看日志文件:

    cat /var/log/cloud-init.log | grep -i "password\|error\|fail"
    cat /var/log/cloud-init-output.log | grep -i "password\|error\|fail"
    

    日志会明确给出cloud-init设置密码失败的具体原因(如加密算法缺失、权限不足等)。

  2. 对比官方与自编译内核配置
    从官方内核的/boot/config-<kernel-version>导出配置,和自编译内核的.config文件对比,重点检查以下配置是否开启(设为y或m):

    • 加密算法:CONFIG_CRYPTO_SHA256、CONFIG_CRYPTO_SHA512
    • 文件系统:CONFIG_EXT4_FS、CONFIG_TMPFS、CONFIG_DEVTMPFS
    • 系统文件系统:CONFIG_PROC_FS、CONFIG_SYSFS
    • 串口控制台:CONFIG_SERIAL_8250、CONFIG_SERIAL_8250_CONSOLE
    • 网络支持(若用网络数据源):CONFIG_NET、CONFIG_INET、CONFIG_NETWORK_FILESYSTEMS
  3. 检查启动参数差异
    对比官方QEMU启动命令和你的启动命令,确保-append参数包含必要项,比如:

    -append "root=/dev/vda1 console=ttyS0 cloud-init=enabled"
    

    其中console=ttyS0是cloud-init常见的依赖项,缺失会导致初始化流程异常。

修复方案

  1. 补全内核配置并重新编译
    根据排查结果,在自编译内核的.config中添加缺失的配置项,然后重新编译内核及模块:

    make menuconfig  # 图形化补全配置
    make -j$(nproc)
    make modules_install
    make install
    

    生成新的内核镜像后替换原文件。

  2. 同步启动参数
    复制官方启动命令中的-append参数到你的QEMU启动命令中,确保cloud-init能识别并正常启动。

  3. 生成适配自编译内核的initrd(可选)
    如果内核版本与官方initrd差异较大,可基于自编译内核重新生成initrd:

    mkinitramfs -o initrd-custom.img <你的内核版本号>
    

    之后用这个自定义initrd搭配自编译内核启动虚拟机。

内容的提问来源于stack exchange,提问作者Myrfy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 06:16:26