random: crng init 卡死几分钟的 haveged / rng-tools / virtio-rng 加速

发布时间 - 2026-01-28 00:00:00    点击率:
Linux内核启动时crng init卡住是因等待足够熵,属主动保护机制;推荐优先使用rng-tools5配合virtio-rng硬件透传,haveged在虚拟机中熵质量不可靠。

为什么 crng init 卡住几分钟?

Linux 内核在启动时会等待足够的熵(entropy)来初始化密码学随机数生成器(CRNG),表现为 dmesg 中卡在 random: crng init done 之前,且系统响应迟缓。这不是 bug,而是内核的主动保护机制:没有足够熵时,/dev/random 会阻塞,连带影响 sshdsystemd、容器拉起等依赖随机源的服务。

haveged 和 rng-tools 哪个更靠谱?

两者都试图向内核熵池注入熵,但原理和稳定性差异明显:

  • haveged 基于 CPU 时间戳抖动提取熵,无需硬件支持,但在虚拟机(尤其是 KVM/QEMU)中可能因定时器虚拟化失真导致熵质量低,甚至被内核拒绝(haveged: getrusage() failed 或静默不注入)
  • rng-tools 是传统方案,需配合硬件 RNG 设备(如 /dev/hwrng);在无硬件时可启用 --fill-watermark 模式轮询注入,但若底层没可用 RNG,它会空转或报错 Failed to open entropy source /dev/hwrng
  • 现代推荐优先用 rng-tools5(Debian/Ubuntu)或 rng-tools(RHEL/CentOS 8+),并确保配置指向真实熵源

virtio-rng 在 KVM 虚拟机里怎么配才生效?

这是最干净的解法——把宿主机的硬件 RNG 透传给客户机。但常见失效点不在客户机配置,而在宿主机和 QEMU 启动参数:

  • 宿主机必须有可用 RNG 设备(ls -l /dev/hwrng 存在且可读),常见于 Intel RDRAND(rdrand 模块已加载)或 AMD rng_core + tpm-rng
  • QEMU 启动时需显式添加:-device virtio-rng-pci,rng=rng0,max-bytes=1024,period=1000 -object rng-random,filename=/dev/hwrng,id=rng0
  • 客户机内核需启用:CONFIG_HW_RANDOM_VIRTIO=y(通常默认开启),启动后应看到 dmesg | grep -i rng 输出 virtio_rng virtio0: registered as random source
  • 验证是否生效:c

    at /sys/devices/virtual/misc/hwrng/rng_current
    应返回 virtio_rngwatch -n1 'cat /proc/sys/kernel/random/entropy_avail' 启动后应快速升至 2000+,而非长期卡在 100–200

绕过 crng init 卡顿的临时手段(慎用)

仅限调试或嵌入式受限环境,生产系统不建议:

  • 加内核启动参数:random.trust_cpu=on(告诉内核信任 RDRAND/AMD X86_RDRAND 指令产出的熵),适用于较新 CPU 且 BIOS 开启了相关特性
  • 强制提前初始化:echo 1 > /proc/sys/kernel/random/urandom_min_reseed_secs(无效);真正起效的是在 initramfs 阶段注入熵,例如在 dracut 配置中加入 rd.random=1 并确保 rng-tools 已打包进 initramfs
  • 绝对不要用 rngd -r /dev/urandom —— 这是用伪随机数充熵,违反密码学前提,crng init 可能跳过但后续密钥极可能被预测

真正卡住时,先看 dmesg | grep -i -E 'random|rng|entropy',再确认 /dev/hwrng 是否存在、virtio-rng 设备是否被识别、rngd 进程是否在跑且没报 open 失败——多数问题出在链路断在第一环,而不是工具选错。


# linux  # centos  # 虚拟机  # ubuntu  # 工具  # ai  # amd  # ios  # bios  # 虚拟化  # 为什么  # red  # echo  # Object  # misc  # bug  # debian  # 这是  # 随机数  # 卡在  # 后应  # 是在  # 尤其是  # 但在  # 而在  # 适用于  # 这不是 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  JS经典正则表达式笔试题汇总  Laravel如何使用withoutEvents方法临时禁用模型事件  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何快速查询网址的建站时间与历史轨迹?  nodejs redis 发布订阅机制封装实现方法及实例代码  三星、SK海力士获美批准:可向中国出口芯片制造设备  历史网站制作软件,华为如何找回被删除的网站?  Laravel如何自定义错误页面(404, 500)?(代码示例)  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel如何实现用户密码重置功能?(完整流程代码)  Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】  Laravel Fortify是什么,和Jetstream有什么关系  浅谈Javascript中的Label语句  EditPlus中的正则表达式 实战(1)  C语言设计一个闪闪的圣诞树  Laravel如何保护应用免受CSRF攻击?(原理和示例)  猎豹浏览器开发者工具怎么打开 猎豹浏览器F12调试工具使用【前端必备】  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  今日头条微视频如何找选题 今日头条微视频找选题技巧【指南】  微信小程序 五星评分(包括半颗星评分)实例代码  北京网站制作的公司有哪些,北京白云观官方网站?  在线制作视频网站免费,都有哪些好的动漫网站?  Laravel如何实现API版本控制_Laravel版本化API设计方案  免费视频制作网站,更新又快又好的免费电影网站?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  jquery插件bootstrapValidator表单验证详解  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  Laravel如何创建自定义Artisan命令?(代码示例)  Laravel中的withCount方法怎么高效统计关联模型数量  如何在腾讯云服务器快速搭建个人网站?  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  如何用花生壳三步快速搭建专属网站?  Laravel用户密码怎么加密_Laravel Hash门面使用教程  米侠浏览器网页背景异常怎么办 米侠显示修复  Linux系统运维自动化项目教程_Ansible批量管理实战  Laravel如何使用Eloquent进行子查询  如何快速启动建站代理加盟业务?  Laravel如何配置.env文件管理环境变量_Laravel环境变量使用与安全管理  Laravel如何实现事件和监听器?(Event & Listener实战)  详解Huffman编码算法之Java实现  HTML 中动态设置元素 name 属性的正确语法详解  油猴 教程,油猴搜脚本为什么会网页无法显示?  Laravel如何使用Vite进行前端资源打包?(配置示例)  如何快速搭建高效WAP手机网站?  图册素材网站设计制作软件,图册的导出方式有几种?  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  Laravel怎么实现API接口鉴权_Laravel Sanctum令牌生成与请求验证【教程】