惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
人人都是产品经理
人人都是产品经理
Engineering at Meta
Engineering at Meta
小众软件
小众软件
I
InfoQ
有赞技术团队
有赞技术团队
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Martin Fowler
Martin Fowler
月光博客
月光博客
雷峰网
雷峰网
aimingoo的专栏
aimingoo的专栏
云风的 BLOG
云风的 BLOG
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
S
SegmentFault 最新的问题
The GitHub Blog
The GitHub Blog
Y
Y Combinator Blog
V
Visual Studio Blog
博客园 - 叶小钗
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
GbyAI
GbyAI
P
Proofpoint News Feed
Apple Machine Learning Research
Apple Machine Learning Research

博客园 - 人艰不拆_zmc

15000mAh 到底是什么概念?一篇看懂电池容量 go2_ros2_sdk 到底是干什么的?从 Go2、官方 SDK、ROS2 一路讲到 SLAM 和 Nav2 买了宇树 Go2 以后怎么二次开发?写给第一次做机器狗项目的人 买了一块 NVIDIA Jetson,怎么在上面安装 ROS2?从 JetPack 到 ROS2 的完整入门指南 NVIDIA Jetson 到底是什么?写给第一次接触机器人和边缘 AI 的人 ROS / ROS2 到底是什么?写给第一次接触机器人开发的人 大模型到底能同时多少人用?一篇看懂并发、排队与容量估算 大模型为什么有快有慢?一篇看懂响应速度背后的关键因素 技术小白也能看懂:大模型里的量化、蒸馏到底是什么意思? Codex 使用技巧:从“会聊天”到“真正能干活” 我终于搞懂了:Codex 对话中插件和 Skill 到底怎么用 我终于搞懂了 Agent Spec:它其实就是 Agent 的“标准设计图” 我终于搞懂了 Tool:原来不只是 Function Calling 里的函数 Skill 里的 Python 脚本,到底是不是 Tool? 我终于搞懂了 Codex 的 Plugin 和 Skill:顺便把 App、MCP 一次理清 我终于搞懂了 Codex 的“应用”:App 到底是什么,怎么添加和维护? 我终于搞懂了 Tool、Function Calling 和 MCP:大模型到底怎么知道该调哪个接口? 我终于搞懂了 MCP:从 HTTP API 到 ERP MCP Server 的完整入门 我终于搞懂了 Codex 的“记忆”是怎么回事 Codex 用久了越来越慢?我的上下文管理小技巧 我终于搞懂了 Codex 里的 Thread、Turn 和 Session 从 Qwen3.8-27B 到 FP8、NVFP4、MoE:一次搞懂几个常见大模型概念 FPS 是什么意思?简单理解 60 FPS、25 FPS 和视频帧率 DeepSeek Harness 明明像 AI Coding 工具,为什么又能用来构建各种 Agent? 使用 Codex 开发项目,怎么才能节约 Token? 模型里的 32K、128K、256K 是什么意思?简单聊聊上下文限制 Codex 一次对话到底会给模型发送什么?以 Spring Boot 项目为例讲清 Context、代码读取与 Token 消耗 AI Agent 中的 Rule 是什么?以 Codex 为例,小白也能看懂 我终于搞懂了 Harness:它不是论文,也不是标准,更不是 Codex 独有 小白也能看懂:RTSP 到底是什么?
理解 Linux 系统中的熵(Entropy)
人艰不拆_zmc · 2025-09-16 · via 博客园 - 人艰不拆_zmc

1、概述

在 Linux 的世界里,熵(Entropy)是一个关乎系统安全性与性能的核心概念。它并非一个晦涩的物理术语,而是系统高质量随机数的生命线,是加密通信、安全登录等关键操作的基石。简单来说,你可以将 Linux 的熵池想象成一个不断收集外界“混乱噪音”的随机数原料库,库中原料的多少(熵值)直接决定了系统生成随机数的能力和效率。

2、什么是熵?为何它如此重要?

在信息论和密码学中,熵是衡量系统不确定性或随机性的指标。一个系统的熵值越高,其产生的数据就越难以预测,随机性也越好。

计算机本身是确定性系统,仅靠算法无法产生真正的随机数。然而,机器运行环境中充满了各种不可预测的硬件噪声,如键盘敲击的时间间隔、鼠标移动的轨迹、磁盘 I/O 的响应时间、网络数据包到达的瞬间,乃至硬件中断的精确时序等。Linux 内核的随机数生成器(RNG)正是巧妙地将这些“环境噪音”转化为生成高质量随机数的原料。

内核会维护一个称为熵池(Entropy Pool)的数据结构,用以收集和存储这些随机噪声。当程序(如加密软件、SSL/TLS 库)需要随机数时,内核便从熵池中提取并处理这些噪音,输出几乎无法预测的随机数序列。这些随机数对于生成加密密钥、初始化向量(IV)、会话令牌等至关重要,直接关系到系统的安全根基。

3、Linux 熵池的工作原理

Linux 内核通过一系列接口函数主动从系统各处收集噪声数据,例如 add_interrupt_randomness(利用设备中断间隔)、add_keyboard_randomness(捕获键盘输入)、add_mouse_randomness(利用鼠标动作)以及 add_disk_randomness(使用磁盘操作时序)等。

这些函数最终会估算其所收集数据的随机性(即熵值),并将其添加到熵池中。为了不影响系统性能,添加操作可能由后台内核线程异步完成。

当需要输出随机数时(例如通过 /dev/random 读取),内核会使用 SHA 或 MD5 等加密散列算法处理熵池中的数据,生成最终的随机数。这种方式即使攻击者知晓熵池的部分内容,也难以反推或预测输出的随机数序列,安全性很高。

4、/dev/random 与 /dev/urandom 的抉择

Linux 提供了两个字符设备接口供用户态程序获取随机数,它们的行为直接关联熵池的状态。

4.1 /dev/random

阻塞(Blocking):严格依赖于当前熵池的熵估算值。当熵值耗尽时,任何从 /dev/random 读取的操作会被阻塞,直到系统重新收集到足够的环境噪声。这种“宁缺毋滥”的特性使其能提供非常高质量的随机数。

适用场景:非常适合生成长期使用的加密密钥、根证书、一次性密码本等对随机性质量要求极高的情况。

4.2 /dev/urandom

非阻塞(Non-blocking):即使熵池初始熵值很低,它也会利用内部的密码学安全伪随机数生成器(CSPRNG)持续生成随机数,不会阻塞读取请求。

适用场景:适用于绝大多数应用场景,如生成会话 ID、SSL/TLS 握手、随机化算法、模拟测试等。这些场景需要大量且快速的随机数,但对绝对不可预测性的要求稍低于长期密钥。现代观点认为,一旦熵池完成初始化(即已有足够熵“播种”),/dev/urandom 的输出在密码学上是安全的。

4.3 如何选择?

追求极致安全,愿意等待:生成长期加密密钥、数字证书时,优先考虑 /dev/random。

要效率,要速度:日常应用加密、Web 会话、科学模拟等,使用 /dev/urandom 是更常见且推荐的选择,能有效避免应用性能瓶颈。例如,Java程序启动时若遇到因熵不足导致的缓慢,可通过配置JVM参数 -Djava.security.egd=file:/dev/./urandom来指定使用非阻塞的 /dev/urandom作为随机源,从而显著提升启动速度。

5、熵值不足:虚拟化环境中的常见病

在虚拟机(VM)或容器(如 Docker)环境中,熵值不足是一个尤为普遍的问题。这是因为它们通常缺乏丰富的物理硬件(如真实的鼠标、键盘)来生成熵,导致熵值积累缓慢。

影响:当熵值持续偏低(如低于 100)时,依赖 /dev/random 的应用程序可能会被阻塞。一个典型的例子是 Java 应用(如 Tomcat)使用 SecureRandom 类时,若熵不足可能导致应用启动极其缓慢或运行时卡顿。

6、如何检查与优化熵值

6.1 检查当前熵值

通过一个简单的命令即可查看系统当前的熵值:

cat /proc/sys/kernel/random/entropy_avail

此命令会返回一个 0~4096 之间的数值,数值越高代表可用的随机性资源越丰富。

6.2 补充熵值的常用方法

安装 haveged:这是一个简单易用的软件熵生成器,它利用处理器的时间差异来持续为熵池“注入”随机性。

# 在 Debian/Ubuntu 上
sudo apt install haveged -y
sudo systemctl start haveged

# 在 CentOS/RHEL 上
sudo yum install haveged -y
sudo systemctl start haveged

7、总结

Linux 系统中的熵是无声的守护者,是安全操作的随机性基石。理解熵池、/dev/random 和 /dev/urandom 的区别,能帮助我们更好地管理和优化系统,在安全与性能之间做出明智的权衡。

记住以下几点:

  • 熵是随机性的度量,源于硬件环境噪声。
  • /dev/random 阻塞,适用于高安全场景。
  • /dev/urandom 非阻塞,适用于大多数对性能敏感的场景。
  • 虚拟机/容器需特别注意熵值,常用 haveged 来补充。
  • 定期使用 cat /proc/sys/kernel/random/entropy_avail 检查熵值健康状况。