random: crng init 延迟的 rng-tools 服务启动顺序调整

发布时间 - 2026-01-29 00:00:00    点击率:
rng-tools 启动延迟因过早尝试向未就绪的 /dev/random 注入熵所致,应通过 systemd 依赖 systemd-random-seed-load.service 确保等待 crng init done 信号后再启动。

为什么 rng-tools 启动时总报 crng init done 延迟?

Linux 内核在完成 CSPRNG(crng)初始化前,会阻塞对 /dev/random 的阻塞式读取。而 rng-tools 默认启动时立即尝试向 /dev/random 注入熵,若此时内核尚未输出 random: crng init done,服务就会卡住或反复重试,表现为启动超时、Failed to start rng-tools.service 或日志里持续出现 failed to read from entropy source

如何让 rng-tools 等到 crng init done 再启动?

关键不是“延迟几秒”,而是等待内核明确就绪信号。推荐用 systemd 的 After=systemd-random-seed-load.service + Wants=systemd-random-seed-load.service,因为该 service 本身已定义了 ExecStartPost=/bin/sh -c 'while ! grep -q "crng init done" /proc/sys/kernel/random/entropy_avail 2>/dev/null; do sleep 0.1; done' 类似逻辑(实际由内核导出的 /proc/sys/kernel/random/crng_readyent

ropy_avail 判断)。

实操建议:

  • 编辑 /etc/systemd/system/rng-tools.service.d/wait-for-crng.conf(新建目录和文件)
  • 写入以下内容:
[Unit]
After=systemd-random-seed-load.service
Wants=systemd-random-seed-load.service

然后执行 systemctl daemon-reload && systemctl restart rng-tools

rng-tools 启动失败时该查哪些日志和状态?

不要只看 journalctl -u rng-tools,容易漏掉前置依赖。必须组合检查:

  • journalctl -b | grep -i "random\|crng" —— 找最早一条 random: crng init done 出现时间
  • cat /proc/sys/kernel/random/crng_ready —— 返回 1 表示就绪,0 表示未就绪(比 entropy_avail 更直接)
  • systemctl list-dependencies --reverse rng-tools.service —— 确认是否真依赖了 systemd-random-seed-load
  • 如果用了 rngd -f -r /dev/hwrng 手动运行,注意加 -q(quiet)避免干扰判断,且 -r 指定的设备必须真实存在(ls /dev/hwrng* 验证)

ARM 平台或无硬件 RNG 的机器要特别注意什么?

这类机器往往熵池填充慢,crng init done 可能晚于所有用户空间服务启动完成。单纯靠 After= 不够,还需补充熵源:

  • 确认内核编译启用了 CONFIG_RANDOM_TRUST_CPU=y(Intel/AMD)或 CONFIG_RANDOM_TRUST_BOOTLOADER=y(ARM),否则即使有 CPU RNG 也不会被信任
  • 安装 haveged 作为软件熵源:它不依赖 crng 就能工作,且会主动唤醒内核熵池;但注意不能和 rng-tools 同时喂同一个设备(如都往 /dev/random 写),否则可能冲突
  • rng-tools/etc/default/rng-tools 中,RNGDOPTIONS="--hrng-device=/dev/hwrng --fill-watermark=90%" 这类配置在无硬件设备时会导致启动失败,务必注释或删掉 --hrng-device

最常被忽略的是:crng init done 不代表熵值高,只代表密钥已生成、可安全阻塞读取。低熵环境仍需持续喂入,但服务启动那一刻,等这个信号就够了。


# linux  # ai  # amd  # 为什么  # NULL  # for  # while  # default  # 这类  # 启动时  # 的是  # 就会  # 就能  # 不代表  # 只代表  # 用了  # 那一刻  # 只看 


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


相关推荐: IOS倒计时设置UIButton标题title的抖动问题  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  Laravel怎么自定义错误页面_Laravel修改404和500页面模板  Laravel如何发送系统通知?(Notification渠道示例)  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】  Laravel如何处理和验证JSON类型的数据库字段  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Laravel怎么导出Excel文件_Laravel Excel插件使用教程  黑客入侵网站服务器的常见手法有哪些?  Laravel如何使用模型观察者?(Observer代码示例)  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  网站制作大概要多少钱一个,做一个平台网站大概多少钱?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  在线制作视频的网站有哪些,电脑如何制作视频短片?  手机网站制作与建设方案,手机网站如何建设?  Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置  香港服务器建站指南:外贸独立站搭建与跨境电商配置流程  Laravel如何创建自定义中间件?(Middleware代码示例)  在线ppt制作网站有哪些软件,如何把网页的内容做成ppt?  制作电商网页,电商供应链怎么做?  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Linux安全能力提升路径_长期防护思维说明【指导】  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  javascript日期怎么处理_如何格式化输出  JS经典正则表达式笔试题汇总  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel怎么使用Intervention Image库处理图片上传和缩放  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  nodejs redis 发布订阅机制封装实现方法及实例代码  企业在线网站设计制作流程,想建设一个属于自己的企业网站,该如何去做?  如何在服务器上配置二级域名建站?  iOS中将个别页面强制横屏其他页面竖屏  香港服务器WordPress建站指南:SEO优化与高效部署策略  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  深圳网站制作设计招聘,关于服装设计的流行趋势,哪里的资料比较全面?  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  浅谈javascript alert和confirm的美化  Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】  如何在IIS中新建站点并配置端口与IP地址?  Laravel API资源(Resource)怎么用_格式化Laravel API响应的最佳实践  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】