解決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後,啟動時間和之前基本一致了。