#はじめに
Raspberry Pi Zero WのPython3を更新しようと、Python3.9をビルドしてインストールしました。
すると、pip list
でインストール済みパッケージ一覧を確認する際に、リストもエラーも表示されずに止まってしまう症状に遭遇しました。Zeroだから時間がかかるのかな?と思い数時間放置してみましたが、変化ありませんでした。
ネットで検索してもズバリの回答が見当たらなかったため、ここに解決法を記します。
最後に追記あります。
この症状は、システムをバックアップを作成して複製後のSDカードで起動したり、host名を変更したことにより、乱数生成機の乱数が枯渇していたことが根本原因でした。
##症状
pip list
でインストール済みパッケージ一覧を確認すると、何も表示されません。
^Cで止めると、デバッグ情報がズラズラと出てきて、self._config = {'authkey': AuthenticationString(os.urandom(32))...
が含まれるあたりでTerminateした事がわかります。
##確認
python3
で対話モードを起動して、以下のように入力して、エラーが帰ってきたら同様の症状です。(エラーは記録忘れました。Resource temporarily unavailable
みたいな感じだったような)
>>> import os
>>> os.getrandom(1, flags=os.GRND_NONBLOCK)
b'\xf9'(これは、問題ない場合。問題があると、ここにエラーが出る)
##対策
sudo mv /dev/random /dev/random.orig
sudo ln -s /dev/urandom /dev/random
pythonやpipとは無関係の、こちらの対策方法が参考になりました。
https://codz.me/2017/06/10/can-not-read-from-dev-random/
##追記:なぜ起こったのか。対策は妥当なのか
Python3.9のインストールの直前、起動用SDカードをバックアップして複製したSDカードで起動、さらにhost名を変更しました。
どうやら、その過程で擬似乱数が枯渇した(または初期化された)ようです。
そのため、Blockingなrandomだと、乱数が溜まるまでリトライを繰り返していました。
上記の対策はunlockedな乱数生成機を強制的に使うようにする操作でした。副作用として、偏りのある乱数が使われる可能性があります。
しばらく運用して充分に乱数が溜まっていれば、もとのBlockingな乱数生成機に戻したほうが、あるべき姿になりそうです。
参考:https://ja.wikipedia.org/wiki//dev/random