死在/dev/random上

FOTA差分升级的时候有个retouch_binaries操作,我这里到了这一句就卡住了,等待的圈圈能转几天也不见完。后来发觉乱捅几下居然完了。找到一个解决此问题的patch,发现是将/dev/random修改成了/dev/urandom

diff --git a/updater/install.c b/updater/install.c
index a1acdb9..2f2631a 100644
--- a/updater/install.c
+++ b/updater/install.c
@@ -450,7 +450,7 @@ Value* RetouchBinariesFn(const char* name, State* state,
     bool override_set = false;
     int32_t random_base = time(NULL) % 1024;
     // some more randomness from /dev/random
-    FILE *f_random = fopen("/dev/random", "rb");
+    FILE *f_random = fopen("/dev/urandom", "rb");
     uint16_t random_bits = 0;
     if (f_random != NULL) {
         fread(&random_bits, 2, 1, f_random);

遇到这样的事情,当然是先上网搜索/dev/random和/dev/urandom,找到一段话(http://www.linuxidc.com/Linux/2012-05/60476.htm)

Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random。他们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回。熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等。如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了。

这就是为什么会有/dev/urandom和/dev/random这两种不同的文件,后者在不能产生新的随机数时会阻塞程序,而前者不会(ublock),当然产生的随机数效果就不太好了,这对加密解密这样的应用来说就不是一种很好的选择。/dev/random会阻塞当前的程序,直到根据熵池产生新的随机字节之后才返回,所以使用/dev/random比使用/dev/urandom产生大量随机数的速度要慢。

好吧,上面那段熵什么的我们就先不深究了,我下来再学习。不过基本上可以解释我的两个疑问了:

  1. 为什么会这么慢?“/dev/random”就是慢啊,升级的时候,系统基本上动作很小的,拿来那么多的变化让它去生成随机数?即使我尝试在我电脑上执行“cat /dev/random|od -x”,然后什么也不动,就等它出字符,也是龟速。
  2. 为什么捅两下会快?不管是按键还是触屏,都会导致手机系统的变化,这个变化就是产生随机数的根源,动了就有随机数了,数出来了,更新也就能继续了。这也就是为什么放这一个晚上也没有完的原因了,放着就放着了,系统基本处于静止状态了。

这哪是慢啊,简直是要命了。

引申阅读 http://zh.wikipedia.org/wiki//dev/random

死在/dev/random上

时间: 2024-10-12 16:45:42

死在/dev/random上的相关文章

hostapd、/dev/random、/dev/urandom

在使用hostapd做软ap时,出现了random熵不够的问题,导致节点连接不上这个ap. 下面先解释一下/dev/random和/dev/urandom 先让我们从一个工程中遇到的实际问题开始,先上log: E/hostapd (  100): random: Cannot readfrom /dev/random: Try again I/hostapd (  100): random: Only 0/20bytes of strong random data available from

/dev/random和/dev/urandom的一点备忘

1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流. 这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用, /dev/random设备可以保证数据的随机

/dev/random 和 /dev/urandom的一点备忘

1.  基本介绍 /dev/random和/dev/urandom是Linux系统中提供的随机伪设备,这两个设备的任务,是提供永不为空的随机字节数据流.很多解密程序与安全应用程序(如SSH Keys,SSL Keys等)需要它们提供的随机数据流. 这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用, /dev/random设备可以保证数据的随机

Linux中的随机数文件 /dev/random /dev/urandom

Linux中的随机数可以从两个特殊的文件中产生,一个是/dev/urandom.另外一个是/dev/random.他们产生随机数的原理是利用当前系统的熵池来计算出固定一定数量的随机比特,然后将这些比特作为字节流返回.熵池就是当前系统的环境噪音,熵指的是一个系统的混乱程度,系统噪音可以通过很多参数来评估,如内存的使用,文件的使用量,不同类型的进程数量等等.如果当前环境噪音变化的不是很剧烈或者当前环境噪音很小,比如刚开机的时候,而当前需要大量的随机比特,这时产生的随机数的随机效果就不是很好了. 这就

/dev/random vs /dev/urandom

If you want random data in a Linux/Unix type OS, the standard way to do so is to use /dev/random or /dev/urandom. These devices are special files. They can be read like normal files and the read data is generated via multiple sources of entropy in th

docker+tomcat 启动时非常慢原因之JRE /dev/random阻塞

docker+tomcat 启动时非常慢,一般正常启动几十秒的,发现docker+tomcat启动竟需要几分钟,不可思议 根本原因是 SecureRandom 这个 jre 的工具类的问题.那为什么 SecureRandom generateSeed 这么慢,甚至挂在 Linux 操作系统呢? Tomcat 7/8 都使用 org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom 类产生安全随机类 SecureRando

git获取别人远程dev分支上的代码

我们在使用 git clone  xxx.git 下载代码的时候,获取到的只是 master上的代码 假入有个 dev 分支我们想获取上面的代码怎么办! #下载dev分支上的代码并切换到dev分支 git checkout -b dev origin/dev

使用git克隆项目、从dev分支上更新代码以及将代码提交到Coding(或GitHub)上面

本教程的目的: 这是个crm项目中,有两个分支一个是master 和 dev ,master主分支,不允许提交代码,我要拉去dev分支上最新的代码,并将修改后的项目,在推送到dev分支上. 一. 1.首先需要下载一个git,并安装. 2.关联本地和git网站(如果不是第一次使用git,已经配置过,请忽略) 这里是你github的不是coding的 命令: git config --global user.name "你的git名称" git config --global user.e

Hacking /dev/random: Pipe

1) 下载镜像,虚拟机启动 https://download.vulnhub.com/devrandom/pipe.ova 2) nmap 扫描探测 Nmap 扫描开路: ╰─ nmap -Pn -sV -p- 10.10.202.0/24 Nmap scan report for 10.10.202.247 Host is up (0.0068s latency). Not shown: 65531 filtered ports PORT      STATE SERVICE VERSION