やっつけな日常(28) Raspberry Pi OS、32bit版から64bit版へ移行

Joseph Halfmoon

別シリーズでArmの64bitのアセンブリ言語命令を練習中。これにAndroidスマホ使ってました。でも最近スマホの電池の減りが速くて練習しずらいです(You tubeのせい。)そこで32ビットOSで引っ張っているRaspberry Pi 4を64ビットOSに移行しようと決断。簡単ではあるけれどいろいろあるんだ。

ラズパイのOSの入れ替えは、マイクロSDカードに所望のOSを書き込んで交換するだけなので、物理的には簡単です。今回も使用中の32bit OS “buster”のマイクロSDは取り外して保存し、新たに64bitOSを書き込んだマイクロSDに交換するだけ。そしてOSの書き込みツールも進化してました。

Raspberry Piの初代のころの、microSDへのOSイメージの書き込みと設定(細かいことは忘れましたがかなりメンドかった記憶のみあり)からすいると格段にお楽になってます。昔 Noobs というものが出てきて、ともかくNoobs入れて立ち上げてOS選択すればインストールOKなんだ、となったときはかなり嬉しかったです。しかし最近では、

Raspberry Pi Imager

というOSイメージのダウンロードからOSの初期設定、microSDへの書き込みまで皆やってくれるツールがあるので、もっともっと簡単。以前、インストール時にはキーボードとモニタ画面を物理接続しなければならなかったのがウソのようなお手軽さであります。Raspberry Pi Imagerは以下の公式からダウンロード可能。

Raspberry Pi OS

たまに Raspberry Pi Imager使ってはいますが、今回ダウンロードした最新版(1.7.2 Windows用)を走らせて気づいたのが、画面が最初から日本語化されていたことです。昔のImagerも日本語だったけ?

Imager

その上、右下の歯車アイコンで開く、設定画面からSSHを許可しておけば、OSインストール後即座にSSH接続できました。普段から「ヘッドレス」で使っているRaspberry Pi 4 機なので、わざわざキーボード、モニタを接続せずに最初からSSHできるのはありがたいです。

なお、VNCについては、SSHでログインした後、sudo raspi-configでVNCを許可する設定を行いました。またVNC画面の解像度設定のため、GUI画面のメニューから解像度を選択してリブートもしてます。

以下はmicroSDに書き込み中のImagerの様子です。

ImagerWriting

OSバージョンの確認

まずは、AArch64(ARM64)に本当になっているのだよね、という確認から。OKですな。LinuxVersion

ついでに、OSのコード名も確認。 bullseye とな。新しくなってます。よかった。osRelease

そして、つい反射的に以下走らせってしまってからVNC画面の上に見慣れぬアイコンがあることに気づきました。

sudo apt update
sudo apt upgrade

VNCのアイコンの右にある、まるに下向き矢印のアイコンです。Updateボタンみたいです。アップデートを行ってくれるボタンなのかな?不明です。こんど現れたらやってみるしかありません。

Update

VScodeのリモート接続でチト引っかかる

SSHつかった仮想端末の接続、VNCでのGUIの表示とほとんど問題なく出来たので、続いてWindowsPC上のVScodeから、SSHつかってリモード接続をしてみました。ここで問題発生。接続しようとすると拒否られます。なぜ?

結論から言うと、WindowsPCの .ssh フォルダ内の known_hostsファイルの問題でした。今回、ラズパイ4には、32ビットOS時も64ビットOS時も同じIPアドレスを割り当ててます。そのため、同じヤツの筈なのにフィンガープリントがknown_hostsに書いてあるものと違うぜ、と怒られたみたいです。とりあえずknown_hostsファイルをリネームして外してしまい。さらからフィンガープリント収集をやりなおしてもらいました。これでVScodeからのリモート接続もOKとなりました。

AArch64(ARM64)命令のアセンブルできるんだよね

他にもいろいろ移行しなければならないものが多々ある中で、今回の主題は今までAndroidスマホ上でアセンブル、コンパイルしていたコードがちゃんと走る確認です。Androidスマホ上では Termux というソフトウエアを使って Androidの奥底のLinuxシステムをユーザモードで使ってます。そのとき使うツールチェーンは clang/llvm でした。今回は同じArm64といっても、Raspberry Pi OS、ツールチェーンは gcc となります。clangとgccは「だいたい同じ」に使える筈、だけれども。。。

スマホ上のTermux環境ではOKであったソースをコンパイル、アセンブルしてみました。Cのソースのコンパイルで以下のようにエラーがでました。asmTrial

「uint32_tとか知らん」、と。これは

    • Termux環境の clang は stdint.h など#includeしないでも uint32_t使える
    • Raspberry Pi OS上のgccは、stdint.h の#include必要

という違いみたいです。

以下のように1行書き加えました。するとビルドOK、通りました。

cSourceFixed

生成された実行可能ファイルを走らせると以下のようです。問題なさそうですな。adcR_Result

Termux環境での実行可能ファイルもTARボールにくるまってRaspberry Pi側に来ているます。実行できるのかしら?やってみました。こんな感じ。adcError

ちゃんと実行ファイルそのものはリストできるのに、ファイルが無いなどとおっしゃります。file コマンドでオブジェクトファイルを調べてみるとなぜ実行できないのかが分かります。

こちらはRaspberry Pi OS上でビルドした実行ファイルのもの。ARM aarch64のELF64ですが、リンカが /lib/ld-linux-aarch64.so.1 指定です。adcRFile

一方、Androidスマホ上でビルドした実行ファイルを見てみると、ARM aarch64のELF64は同じですが、リンカは /system/bin/linker64 が指定されてました。多分、このリンカはラズパイ上には不在(そして動的にリンクされる筈のライブラリも指定のパスには不在。)知らんけど。

adcFile

まあ、実行するためには、もう一度ビルドしなおさないとダメね。

まだまだ他にも有りそうだけれども、Arm64の練習は出来そうかな。

やっつけな日常(27) Rustに入ればRustに従え、それにしても#deriveて何よ へ戻る

やっつけな日常(29) Rustに入ればRustに従え、「所有権」を「借用」できたのね へ進む