• 随机数生成过慢导致系统阻塞怎么办?


    /dev/random和/dev/urandom是linux上的随机数生成器,是个字符设备,为系统提供随机数。随机数主要应用在加密方面,没有加密的操作都是可预测且不安全的。

    linux上随机数的生成原理

    linux上随机数的生成原理是将系统的中断信息收集起来放入熵池中,通过算法生成更多无序的数据,有了大量的无序数据之后,每次获取随机数,就会从池子中读取指定的字节序列,而这些字节序列就是生成器生成的随机数。

    linux开机时就会伴随着random设备的初始化,一般我们经常会遇见这两条log:

    random: crng init done,

    random: 7 urandom warning(s) missed due to ratelimiting,

    这说明随机数已经初始化完成,可以随时请求使用。但是在某些时候会卡在这个log很长时间,这是因为在开机时系统中断不够或程序运行时熵不足,生成随机数非常缓慢,导致阻塞,进而导致无法开机、app无法正常运行等一系列bug。

    为了解决这个问题,我们可以移植一个工具对熵池进行补熵,这样随机数生成器就会快速生成随机数,解决阻塞导致的一系列问题。

    解决方案

    解决这个问题的工具有很多,这里我们选用移植haveged工具,并使用启扬IAC-IMX8MM-kit开发板展示具体操作过程。

    移植haveged-1.9.3

    首先source我们的sdk开发环境,然后进入到源码内,通过configure配置makfile文件,命令如下:

    ./configure --host=aarch64-poky-linux --prefix=/home/ylook/haveged

    配置完成后执行make && make install命令,会在/home/ylook/haveged目录下生成编译完成后的二进制文件以及相关库文件,如下图所示:

    (注:笔者路径有所不同,根据环境自行更改即可)

    注意:为防止错误,可以使用file命令检查二进制文件架构,保证为aarch64架构即可。

    将编译出来的二进制文件拷贝到板子的/usr/bin/目录,库文件拷贝到/usr/lib/目录,执行haveged --h命令,如下图所示:

    这里就相当于我们已经把板子里的环境配置好了,为了能够开机就使用该工具生成熵,所以我们需要在开机进程中将该工具设置为自动运行。

    因为启扬i.MX8M Mini开发板上使用systemed工具配置相关服务,所以我们需要写一个service,然后让它开机运行,具体service如下:

    使用systemctl enable haveged之后重启就会生效,可从开机log中看出,如图所示,在很早之前初始化就已经完成了。

     

    也可以使用命令cat /proc/sys/kernel/random/entropy_avail,查看当前熵值,在没有haveged之前该值只有几十几百,而开启之后有几千。

    这样,就完美解决了随机数生成过慢导致系统阻塞的问题。

  • 相关阅读:
    前端工程化知识系列(10)
    jdk11新特性——移除的一些其他内容
    如何保障物联网平台的安全性与健壮性
    【unity笔记】八、Unity人物动画介绍
    Python+PyCharm+Selenium框架环境搭建及问题
    Springboot毕设项目供应链平台网站1f0ei(java+VUE+Mybatis+Maven+Mysql)
    OPENCV简单阈值中的参数详解
    Spring/IoC、DI、Bean
    单元测试与Mockito
    [开源]传统实体产业提供进销存管理解决方案,助传统企业降本增效
  • 原文地址:https://blog.csdn.net/vickycheung3/article/details/126342470