问题遇到的现象和发生背景
在嵌入式设备中,使用 dropbear 提供 ssh 服务,但是发现 ssh 服务需要设备开机 10min 之后才能连通。能连通的时候,会有如下内核打印
[ 7043.317660] random: crng init done
同时跟进 dropbear 代码,发现获取随机数时,返回失败,并且 errno 置为 EAGAIN,对应获取随机数的语句如下
ret = getrandom(buf, sizeof(buf), GRND_NONBLOCK);
查看 getrandom 函数的 man page,发现这个函数默认相当于从 /dev/urandom 读取数据,但是我通过 cat 命令直接读取这个设备,发现设备工作正常
/tmp # cat /dev/urandom | od -x
0000000 1072 7e85 03dc bbd9 30cc 1951 a39e 2f82
0000020 7163 5640 77c3 4bdb cd29 f4a6 8ff1 af7d
0000040 255c 1abb 4da8 d809 94eb 2d65 589e 52ab
0000060 1f9f 7471 da45 0664 c43d 753e 11cc ee37
我想要达到的结果
有没有熟悉这部分的朋友帮忙分析一下,为什么 getrandom 需要系统启动十多分钟之后才能获取成功呢?有没有办法缩短这个时间呢