ん?もしかして原因は、外付けHDD/SSDケースの謎は実は仕様!?
サーバとしてv1.2じゃないmicroSDブートのRaspberry Pi Model 2 Bで使っていたシステム用USBメモリにブートパーティションを追加してRaspberry Pi Model 3 B+で使ったらハマった、いや、ハマり過ぎて一からUSBメモリ仕立てることになっちゃったけどディスクもデータも生きていて、むしろ、ラッキーだったんじゃないかという話。
Raspberry Pi/スマホにSoftEther/OpenVPN互換でVPNしてみたらCPU使用率が100%を超え、Raspberry Pi 2Bには荷が重そうだったため、まず使わないサブパソコン用途としていた3B+をサーバにしてみようかと。
今回、やってみたらできなかったからだけど、Raspberry Pi 2 Model BとRaspberry Pi 3 Model B/B+ 4 B(4Bだけか?今のところ32bitでもカーネルバージョンがv7lだから?)などでは、何かが違うらしく、Raspberry Pi 2 Bでシステム用に使っていたUSBメモリは、ブートパーティション云々以前に、そのまま接続してもダメなの?ダメじゃないの?というのが、ハマりポイント1。
そこにもってきて、どうやら、コピーミス(rpi-updateに起因か?)もしくは、USBメモリ上の一部のセクタ異常で、何やらおかしくなっていたらしいというのが、ハマりポイント2。
ほか少々...。
ラズパイ2Bは、初期モデルということもあり、microSDにブートパーティション、USBメモリにシステムパーティションとして、ラズパイ3B+は、両方共USBメモリに仕込んで運用するようにしていますが、その辺に起因するのか...。
件のUSBメモリやLVMに追加してあるHDD等をRaspberry Pi 3B+に接続してみると起動からしてネットワークインタフェースBluetoothが起動できないとか、LVMマップエラーが。
念の為、ラズパイパソコンにしていたSSDとラズパイ2Bで使っていた件のUSBメモリを入れ替え、モニタがあったから余計な詮索をせずに済んだようなものの、最初は、セーフモード?レスキューモード?なんだっけ?rootログインで修復しないと先に進めない状態。
LVMで追加したHDDをここにはつないでいないので/etc/fstabで当該マウント行をコメントしただけだったかな?他に何か必要だったか失念しましたが、通常のログインプロンプトまでたどり着き、ログインするとエラーの通り、eth0とloはあるも、IPアドレスも割り当てられていないので、そのままだとsshもできない。
VPNを動かしていたのでbr0とeth0の設定はしてあり、従前は、IPアドレスもDHCPで自動配布されていましたが、br0はなく、あるのは、eth0とloのみ、LANケーブルを接続しておいてもIPは割り当てられず。
そこで(dhcpcdやdhcpcd5ではダメで)dhclient eth0してみるとIPが割り当てられ、他パソコンからsshはできました。
ラズパイ2Bには無線LANやBluetoothはないので3B+で起動しているとは言え、今時点では、Wi−FiやBluetoothの件は置いておくことにします。
初期のRaspberry Pi 2 BのCPUがCortex-A7でカーネルバージョンがv7(32bit)、Raspberry Pi 2 B v1.2/Raspberry Pi 3 A+/B/B+が、Cortex-A53でカーネルバージョンがv7(32bit)/v8(64bit)、Raspberry Pi 4 Bは、Cortex-A72でカーネルバージョンがv7l(32bit)/v8(64bit)、インストール時にハードによって良きに計らってくれるとのこと。
確かにv1.2ではない初期のRaspberry Pi 2 Bは、どうやるにしてもブートにはmicroSDカードを使う必要があるという点は異なります。
よって今回は、USBメモリにブートパーティション及びシステムパーティションをddしておき、2Bで起動させる時は、microSD上の、3B+で起動させる時は、USBメモリ上のブートパーティションから起動させるようにして動作確認することにしました。
が、本件のハード初期のRaspberry Pi 2 BもRaspberry Pi 3 B+も32bitならカーネルバージョンv7と共通なはずでカーネル自体に問題はないはずですが、ビルドオプションに違いでもあるのでしょうか...?
uname -rしてみると[4.19.75-v7+]となっており、2台の3B+(用で使っていたUSBメモリやSSD)を見ると何れも[5.10.11-v7+]。
やはり、カーネルが古い...(といってもDebianのStable版と同程度です)が、いつから、そうだったのかは記憶になし...。
/lib/modulesには、4.4.36系というより古いのもあるものの、2Bにも3B+にも5.10.11系はあるんですよね。
ちなみに自分でLinuxカーネルをダウンロードしたり、ビルドしたことはないのに2Bの方にだけ、/usr/srcに5.10.11系があるのは、wireguard-1.0.20210124を入れた時に一緒に入ったってことかも?
それか、wireguardを入れるに当たり、とあるリポジトリを追加してあったのは、あれは、Debianのだったと思われ、関係ないか...。
apt upgrade中、途中で止めざるを得ない状況になり、apt --configure -aすることになった時に...ってこともない...か?
何れにせよカーネルが[4.19.75-v7+]な2Bの場合、/lib/modulesに5.10.11系があるのも同じ理由?
とある情報から/usr/srcや/lib/modulesにあるバージョンで/boot/config.txtに[kernel=vmlinuz-5.10.11-v7+]や[initramfs initrd.img-5.10.11-v7+ followkernel]のように追記すると当該カーネルから起動してくれそうな情報を見つけたのですが、カーネルをダウンロード、インストールしたわけではないからか、ダメでした。
尚、sudo apt update && sudo apt upgrade -yでは、ちなみにfull-upgradeでもdist-upgradeでも既に最新だと言われてしまいアップデートされませんでした。
rpi-updateは、ほぼ冒頭のバックアップするところで/boot関連で自分自身にコピーできないよエラーで完了できず。
さっぱりわからない中、LVMはどうしたことかなと思い、いろいろやってみると、また、カーネルに関するエラーが。
/dev/mapper/control自体は存在しますが、どうやらカーネルのdevice-mapperドライバとの通信に失敗したようです。
そんな中、ファームウェアが足りないのか?ということでdpkg -l firmware*してRaspberry Pi 2BとRaspberry Pi 3B+(のUSBメモリやSSD)を比較してみると[firmware-misc-nonfree]がなかったのでインストールしてみると...。
[needrestart]コマンド実行時と同じエラーっぽいメッセージが表示されつつもインストールされたので再起動してみるも変わらず。
システム用にしているUSBメモリ、何度か、ddして数本のUSBメモリを移行している、今回は、訳あって一度ファイルにddしてから、USBメモリを一掃、パーティション割り当て後、ファイルからddしたのですが、ファイルにddした時にエラーを吐きつつ、完了していたことに後から気づき、不良セクタがある可能性も...。
そこでmicroSDのcmdline.txtのrootを書き換え、当該USBメモリのシステムパーティションを呼ぶ恰好で元のRaspberry Pi 2 Bに接続してみると、すんなり、あっさり何事もなく起動、br0/eth0は、/etc/dhcpcd.confで固定したIPアドレスが割り当てられており、他のマシンからもsshできました。
ん!あ!?/bootの中に/がある...、本来の/bootも/boot/bootに...、やはり、一部、セクタが壊れているのか、まさか、ポカやらかしてコピったか!?
先のrpi-updateのエラーにあった「自分自身にコピーできない」エラーは、確か、/boot関連だったが、あの時か!?
ともあれ、/boot/binなんて要らないだろと削除してみたら、コマンドがきかなくなった!
仕方ないので強制終了させて、他のパソコンにUSBメモリを接続、他からコピーして/binを戻して、改めて起動してみたらコマンドが使えるようになった...、ってことは、そこにあるように見せかけて実は違う蜃気楼みたいなこの状態...、もしや、セクタ破損か...。
GPartedで[パーティション(P)] => [チェック(H)]として修復してみたら、完了し、マウントしてみたら、/boot配下が正常になってる...、いや、待てよ、ブートしたときだけおかしくなる説もあるのか?と試してみると...、ダメだ...、やっぱり、/boot下に/や/bootがある...。
USBメモリに不良セクタがあるのか、カーネル[4.19.75]系のバグがあるのか、その他か、この複合なのか...。
はたまた、apt upgrade中になにかして落ちたことがあって再起動後にapt --configure -aなどをした時にカーネルも入れ替わった!?なんてことはないか...。
一方で、どうしてカーネル[5.10.11]系にアップデートできないのか...?
Raspberry Pi 2Bでは必定?、それとも他に理由が?
/usr/srcや/lib/modulesの中身からカーネルのアップデートってできないのかな...?
となると一見、2Bでの使用は問題ないようにも見えるも、どっちにせよ、USBメモリを仕込み直さないといけないこと確定か...。
が、既存データもあるわけでLVMのことだけ考えても一からUSBメモリを仕立てるのは、避けたいなー。
とは言え、ディスク・セクタ破損に起因するとなると他にも壊れている可能性もあるわけで中身を丸々rsyncするわけにもいかなさそう...。
ユーザーデータだけバックアップ、最新イメージをdd、パッケージはインストールからやって設定も最初からやり直すか。。。
案ずるより生むが易し。
結局、Raspbian(Raspberry Pi OS)最新イメージをddし、一からインストール、raspi-config、ユーザー追加、piと同一のグループに追加、切り替え、ユーザーpiを削除。
プリンタとスキャナの共有はやめることにし、lvm2、samba、fluxbox、xfe、idesk、firefox、firefox-i18n-ja、leafpad、claws-mail、claws-mail-i18n、tightvncserver、minidlnaをインストール。
/etc/fstabを編集、LVMパス(/dev/VGNAME/LVNAME)を/mnt/samba_mountpointにマウントする行を追記。
幸いなことにlvm2は入れただけ、sambaはインストール、従前同様にsambaユーザー追加、smb.conf編集してみたところ、LVM領域やデータも全て生きていて、NASも従前通り、使えることがわかりました。
UPnP/DLNAメディアサーバminidlna(ReadyMedia)も/etc/minidlna.conf内でメディアのパスを設定するだけでLAN内の他の端末から自動検出、再生させることができました。
メールボックスは、ちょっと古いバックアップをあてがったのですが、複数件メールサーバがあり、複数件アカウント登録してあるメールサーバ側を自動削除しない設定にしておいたおかげで大量に受信、振り分けに多少時間がかかったのとアカウント再登録、ブロックフィルタの移行方法がわからず、今後、迷惑メールが来る都度、改めて振り分ける必要があるということはあるものの、欠損はない模様。
結果、USBメモリも新調、サーバ機能をRapsberry Pi 2BからRaspberry Pi 3B+に移行でき、microSDも不要になり、VPNのCPU使用率も1%前後、RAM使用率も1.5%前後で安定、2TBのストレージ用HDDディスクも安泰っぽく、データも保持できていて、最新イメージをdd、初期設定と必要なパッケージのインストールだけで設定はほぼほぼ不要と手間なし、ちょっとした復習にもなって、今回の一件があって、かえってよかったかもしれません。
あれ?Raspberry Pi 2 Bを3B+で使っていた19インチモニタ、SSD構成でブートをmicroSDにしてSSDのシステムパーティションの/dev/sda2やPARTUUIDにしてもみても起動できない...CPU stopとかになる...なんで?やっぱり、2Bと3B+って何か違うの!?
19インチモニタにRaspberry Pi 2 Bで使っていた新調する前のUSBメモリのPARTUUIDを呼ぶ恰好でmicroSDブート+当該USBメモリなら通常のログインまでいきました。(LVM対象のHDDがないので、/etc/fstabでマウントを無効化する必要はありましたが。)
ということは、電源は、SSD構成で3B+では使えていたので容量不足はないでしょうから、Raspberry Pi 2 B、もしくはそのカーネル?だとSSDは無理なのか...。
ちなみに、このUSBメモリには、当然ながら、/boot配下に/や/bootはありません。
が、そのUSBメモリを挿して起動、作業していたら、今度は、apt upgradeだか、何かのインストールか、apt purge中かなにかに「ちゃんとアンマウントされなかったっぽい痕跡があるぞ」的なエラーが。
他のパソコンのGPartedで[チェック]しても問題なかったのですが、改めて起動しても同様、今度は、他のパソコンでfsckしたら、良きに計らったという結果報告、起動してみると、エラーを吐かなくなったと思ったのは、一時的なもので、また同じ状態に...。
このUSBメモリから新調したUSBメモリにddしたものの、ちょっと不調を感じたからこそ交換したのですが、これが、いかれていた可能性が高くなってきました。
どっちにしても2Bは、デスクトップパソコンとしては、特に一般的なGUIブラウザを使うには、厳しいと思っているので、その用途に使う気はないですが、はてさて、Raspberry Pi 2 Bとラズパイパソコン用に買って使っていたSSDは何に使おうかな...。
あれから数日経って今時点Raspberry Pi 2Bに戻したラズパイサーバを起動しようと思ったら、また、冒頭同様となり、/etc/fstabでLVMのマウントをコメントアウトして起動することに...。
やっぱり、ディスクがいかれたかとも思いましたが、[could not open directory /lib/modules/ No such file or director raspberry pi]に遭遇し、uname -rと/lib/modules(や/usr/lib/modules)でカーネルバージョンが異なることに気づき、Raspberry Pi Fourumにたどり着き、最終的な解決策としてブートローダとカーネルの再インストール。
また、Linux modules mismatch versionで触れられているようにmicroSDカードからブートしている場合、/bootのマウント元が違うかもしれない為、/dev/mmcblk0p1にマウントし直した方がよいという情報もあり、2Bと3B+であれこれやっていた自身の場合、今起動している2Bは、microSDブート必須ということもあり、併せてこれもやりました。
更に同じくリンク先で触れられていますが、確かにrpi-updateは、その公式文書の説明の中でさえ、安易に・積極的に使わない方がよいとあった気がしますが、これに起因していたとは...。
というか、2Bと3B+間でUSBメモリを入れ替えなければ、こうしたことは、起きなかったわけですが(逆に言うと勉強になった)。
4Bでも同じことは起きるでしょうし、microSDを使わないにしてもラズパイ自体がボードによって良きに計らってくれるとはいえ、Raspberry Pi 4Bは、2B/3B/3B+の32bit v7+とは違い、32bit v7l+/64bit v8+と32bitでもカーネルが異なるとのことなので、3B/3B+との間でもUSBメモリやHDD、SSDなどを検証含め、これらの間で使い回す場合は要注意、できれば避けた方が無難かもしれませんね。
しばらく何事もなく利用できていたラズパイ2Bサーバ、rpikernelhackで時間がかかることもあり、避けていたapt update && apt upgradeをした直後、再発。
ssh接続できない、モニタで確認すべく、ラズパイサブパソコンと入れ替えて、レスキューモード?に入るべく、パスワードを入れてrootログイン、systemctl --failedしてみるとlvm2、networking、ufwが落ちてる、IPアドレスが配布されないなど摩訶不思議な状態に。
uname -rと/lib/modulesを確認すると、またもやバージョンが不一致であることが判明。
dhclient eth0してIPを割り当て後、今回は、前回も確認したLinux modules mismatch versionの回答にあるraspberrypi-bootloaderとraspberrypi-kernelの再インストールだけで解決しました。
画面眺めてると、ちゃんと書いてありますね、なんかエラーがあって、これを解決するためには、linux-headers-5.10.52-*をインストールしてねと。
結果、新しいバージョンに合わせた恰好になりました。
やはり、rpikernelhackで多少の時間はかかりましたが。
尚、raspi-configの[Advanced Options]の[Network Interface Names]で[Would you like to enable predictable network interface names?]に対して[Yes]にしてしまうとネットワークインタフェース名がeth0など期待したものと全く違うものになってしまうことがあるので注意、これでハマった場合は、Noにする。
というか、今回、rpi-updateはしていないのですが、このミスマッチが起きたのは、apt update、apt upgrade時っぽいが、なぜ?
rpi-updateをremove/purgeしとけばよいのか?何かの時にraspbian.raspbian.org以外にarchive.raspbian.orgをリポジトリに追加した状態になってるけど、これを外せばよいのか?
というわけで、apt purge -y rpi-updateしてから、apt update && apt upgrade -yしてみると、またraspberrypi-bootloaderやraspberrypi-kernelをアップグレードしつつ、rpikernelhackで時間かかってる...。
が、再起動してみてもミスマッチが起きることもなく、rpikernelhack分だけ無駄な感じなのでリポジトリからarchive.raspbian.orgを外して、apt update && apt upgrade -yしたら、超あっさり、スペシャル短時間で完了...なんだなんだ、そういうことか、ホッ...。
安易な行動は慎もう...。
結果、事なきを得ましたが、ほんの数日前、SSD化していたサーバとしているRaspberry Pi 2Bの共有メーラーでメール送受信ができないという原因不明の症状に見舞われ、急遽、サブパソコン化後、やはり、HDDからSSDに換装していたラズパイ3B+とラズパイとACアダプタのみ交代させることにしました。
2Bでシステムディスクとして使っていたSSDにもブートパーティションは焼いてあったので/etc/fstabでmicroSDからSSDのブートパーティションに代えるべく、partuuidを変更したのみでサーバを素直に3B+に交代させることができました。
他方、2Bに入れ替えたサブパソコンの方は、SSDの変更に伴い、microSDカード内の/boot/cmdline.txtのroot=PARTUUID=...でシステムパーティションのpartuuidに書き換えることでmicroSDブートさせることができました。
本来は、こんなに簡単なことなんですけどね、2Bと3B+のディスク交代。