1. 程式人生 > 其它 >解決LicheePi zero啟動ssh後系統無反應

解決LicheePi zero啟動ssh後系統無反應

在為zero配置python3時,一些包需要更高的版本,因此需要升級buildroot

一口氣更新到最新版,啟動沒問題。

但是在開啟openssh時,發現啟動後系統會阻塞很長時間

[    1.810100] EXT4-fs (mmcblk0p2): re-mounted. Opts: (null)
Starting syslogd: OK
Starting klogd: OK
Running sysctl: OK
Saving random seed: [    2.176386] random: dd: uninitialized urandom read (512 bytes read)
OK
Starting network: OK
[    4.606975] random: fast init done
[  213.609597] random: crng init done
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 
Starting sshd: OK

可以看到,在random:fast init 與 crng init 之間,相差了接近三分鐘。

換回舊版,對比啟動資訊

Initializing random number generator... [    2.081098] random: dd: uninitialized urandom read (512 bytes read)
done.
Starting network: OK
[    2.283275] random: ssh-keygen: uninitialized urandom read (32 bytes read)
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 
Starting sshd: [    4.880638] random: sshd: uninitialized urandom read (32 bytes read)
OK 

可以看到啟動時間不到5s,相差還是很多的,並且沒有

[    4.606975] random: fast init done
[  213.609597] random: crng init done

這兩行提示。

開始以為新版openssh多了什麼功能造成的,

在折騰一番buildroot無果後,感覺問題應該出在這裡random: crng init 這裡。

百度一下,果然問題很多

在博主uninitialized urandom read_xiaofeng_yan的專欄-CSDN部落格

的部落格中,提到了

。通過dmesg | grep -I randdom 發現需要400多秒才能初始化完成。
dmesg | grep -i random
[ 0.051406] random: get_random_bytes called from setup_net+0x33/0x120 with crng_init=0
[ 0.637733] random: hwclock: uninitialized urandom read (8 bytes read)
[ 0.821425] random: sh: uninitialized urandom read (8 bytes read)
[ 11.923501] random: fast init done
[ 13.111697] random: modprobe: uninitialized urandom read (8 bytes read)
[ 20.464349] random: modprobe: uninitialized urandom read (8 bytes read)
[ 20.475650] random: head: uninitialized urandom read (8192 bytes read)
[ 23.335865] random: modprobe: uninitialized urandom read (8 bytes read)
[ 28.286856] random: modprobe: uninitialized urandom read (8 bytes read)
[ 28.747431] random: modprobe: uninitialized urandom read (8 bytes read)
[ 33.718262] random: modprobe: uninitialized urandom read (8 bytes read)
[ 33.736726] random: modprobe: uninitialized urandom read (8 bytes read)
[ 429.269251] random: crng init done

所以一些應用程式在呼叫random的函式可能會阻塞。

同時給出了兩個方案

方案一:打入以下核心patch
核心的patch:https://lkml.org/lkml/2018/7/17/1279
增加了config RANDOM_TRUST_CPU這個選項,預設此選擇沒有開啟。
使用者態的方案:
Haveged使用HAVEGE(HArdware Volatile Entropy Gathering and Expansion)來維護一個1M的隨機位元組池,
當/dev/random中的隨機位供應低於裝置的低水位時(/proc/sys/kernel/random/entropy_avail),這個隨機位元組池用於填充/dev/random。

實際上在2017年,就有人給linux核心提交了該補丁[LKML: Theodore Ts'o: PATCH] random: add a config option to trust the CPU's hwrng

但是RANDOM_TRUST_CPU不支援armv7,並且荔枝派不能使用yum等包管理器安裝haveged,因此不太好解決。

又找了找,在文章隨機子系統初始化慢,導致依賴其的服務啟動慢問題修復方法 - Mic_chen - 部落格園 (cnblogs.com)種提到了,buildroot中有haveged。

Symbol: BR2_PACKAGE_HAVEGED [=n]
Type  : bool 
Prompt: haveged
Location:
	-> Target packages
(1)   -> Miscellaneous

開啟即可

Saving random seed: [    2.177285] random: dd: uninitialized urandom read (512 bytes read)
OK
Starting haveged: haveged: command socket is listening at fd 3
OK
Starting network: OK
[    2.829545] random: crng init done
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519 
Starting sshd: OK

可以看到,開啟haveged後,啟動時間和之前基本一致了。