RaspberryPi Pico で UNIX!! (FUZIX動いた!)
RaspberryPi PicoにはLinuxが乗らない(OSが走らない)ので、RaspberryPi シリーズというにはちょっとナァ。なんておもっていた時期がワタシにもありましたw
しかし、世界は広くて狭く(?)て同じようなこと考えた方もおられたのか、RaspberryPi用のOSではないものの、簡易的なUNIX環境であるFUZIXをRaspberryPi Picoで動かしちゃったなんていう猛者がおられまして、その動かし方を丁寧に解説した記事がもう出てきちゃっていました。
参考ウォークスルー
↑の記事に従って進めれば、簡単に簡易UNIX(FUZIX)がRaspberryPi Picoで動いちゃうそう。
と、ゆーわけで、さっそく私もマネしてやってみましたよーん。というのがこの記事です。
※ただし、その通りではうまく動きませんでした。作業ログをせっかく書きながらやっていたのでそのまま載せますが、動いてるところだけをみたい方は目次からすっ飛ばしてくださいませ。
ウォークスルーに従ったけどうまくいかなかった作業ログ↓
githubソースからFUZIXを構築
$ git clone https://github.com/davidgiven/FUZIX.git
$ cd FUZIX
$ git checkout rpipico
でOK。
$ cd Kernel/platform-rpipico/
でディレクトリ移動して、ここにあるMakefileの最初の行に pico-sdkへのパスを設定します。通常のpico-sdk構築をしているようなら、
export PICO_SDK_PATH = /home/pi/pico/pico-sdk
でOK。
こんなかんじですね。
これで、FUZIX.UF2ファイルとルートファイルシステムの両方をビルドできます。
$ make world -j
$ ./update-flash.sh
これで、今のディレクトリに filesystem.imgイメージファイルが、buildディレクトリ内に fuzix.uf2 ファイルが、できているはずです。
こんなかんじですね。
SDカードの設定
Windows上でもfdiskコマンドが使えれば同様なことはできる筈ですが、環境が壊れちゃうとコワイので、説明通りラズパイ上でやります
手元にあったFAT32フォーマット済みの16GBのカードをRaspberryPi へ刺すと、自動的にマウントされちゃいます
$ lsblk
コマンドで確認すると
sda disk の sda1 パーティションが、 /media/pi/6E23-008D としてマウントされちゃってることが分かります。
マウントされちゃっている時は、
$ umount /dev/sda1
このようにしてアンマウントします
無事、アンマウント。sda1 には何もマウントされていない状態です。
ここでワザ
$ sudo dd if=/dev/zero of=/dev/sda bs=512 count=1
これで、/dev/sdaの戦闘ブロックに0を書きこみます。(fdisk して 「d」コマンドじゃダメなのかなー?)
そうしてからlsblkで確認すると
sda1が消えています。(パーティションがない状態になる)
この状態で、fdiskを使って新しいパーティションを作成します。
$ sudo fdisk /dev/sda
でじっこう。
参考サイトではここで「o」コマンドで、新しいDOSディスクラベルを作成すると言っていますが、既に Created a new DOS disklabel と自動で出ているので省略、
「n」を入力して、新しいパーティションを作成、つづけて、「p」→「1」→「2048」→「+2M」と入力します。
↑上の例ではdefaultの部分は無入力エンターで飛ばしています。
なお、ディスクの初期状態によっては、パーティションに「vfat署名が含まれている」というプロンプトが表示されて、署名を削除するかどうかを尋ねられる場合があるそう。求められたら、「Y」と入力してさくーじょ。
次に、「t」コマンドでパーティションのタイプを 7F にセットします。
続いて、FUZIXで使用する32MB分のパーティションも作成します。
「n」→「p」→「2」→「6144」→「+32M」 と入力。
↑入力不要部分はエンターで省略。
「p」でパーティション内容を確認をすると
このようになるはずです。
この状態で「w」コマンドでパーティションテーブルを書き込んで終了します。
では
$ sudo dd if=filesystem.img of=/dev/sda2
で、filesystem.img を sda2 に書きこみます。
でOK…のハズなんだけど、↑のログを見てわかるように、filesystem.imgのサイズが1.4MBになってますよね。お手本のブログによるとここは32MBあるはずなのに……。
あんれぇ?
実際、これで動かしてもうまく動かないんですよね。。
調べてくれた
matokenさんによると、update-flash.sh で作られるのは1.4Mで正しいみたい。。うーん? じゃあこの参考ブログの手順がおかしいのかなー?
不安を感じながらも、ここまでできたら先すすみましょう。
SDカードインターフェースをPicoへ接続します。
MicroSDカードインターフェースをPicoと接続
こんなのを用意して、
こんなふうにつなげばよい。のですが、これではどうもうまくいきませんでした。
なんでだろーとTwitterでつぶやいていたら
なんてぐっどアドバイスをいただき、その通りに接続を変更。
※RaspberryPi本体のpin1(3.3v)から、直接SDカードインターフェースの2番目(3v)へ接続するように変更。
詳しくは下のほうの解決編で書きますが、この変更でうまく動いたようです(∩´∀`)∩☆
OS本体を転送
普通のプログラムと同様、RaspberryPi PicoをBOOTボタンを押しながら接続して、~/FUZIX/Kernel/platform-rpipico/build/fuzix.uf2 を転送します。
これで起動しているはず? SDカードを母艦から外してPicoに接続されているボードに刺してシリアルterminalを立ち上げれば、UNIX環境がががが!
シリアル通信でコンソールに接続
minicomは前にいれてあるので
$ minicom -b 115200 -o -D /dev/serial0
で、OK。念願のUNIX環境がががが!
動き……ません><
↑terminalは立ち上がり、Unixらしいシステムが立ち上がってこようとはしているのですが、panic を起して no root ……、ファイルシステムが起動していない模様……。
やっぱりさっきの作成した1.4Mしかないファイルシステムではダメだったのでしょうか……?
解決編(∩´∀`)∩☆
と、このあともうだうだなんだかんだとやってみた結果、結局は
自分でコンパイルせずに公式が置いてくれているバイナリイメージを突っ込んだらうごいた!
というかんじです><
やっと起動!!(∩´∀`)∩☆
ポイントは、最初紹介ページのウォークスルーに従ってMicroSDカードのfdiskなどをやったうえで
①自分でコンパイルしないw
②MicroSDカードインターフェースへPicoが起動するよりも先に給電
の二点になります(`・ω・´)ゞ
①自分でコンパイルしない
紹介されているブログさんをよーく見ると
↑なんてことが最初のほうに書いてありました(最初、あわててすっ飛ばして読んでしまってました><)
ここで用意してくれているのバイナリイメージというのが
https://cowlark.com/2021-02-16-fuzix-pi-pico/fuzix.tar.xz
↑こちらです。
これをダウンロードしてきて解凍し、
中に入ってる fuzix.uf2 ファイルをPicoへ転送。
それと、MicroSDカードへも、この圧縮ファイル内にある filesystem.img を転送してあげます。
※32MBあるのがポイント!(∩´∀`)∩☆
転送は、RaspberryPi本体へUSB接続のSDカードインターフェースをつっこんで、
$ sudo dd if=filesystem.img of=/dev/sda2
これですね。
※この両者がちゃんとペアになっていないとダメみたいです。紹介されたビルド方法で作られたカーネルからは、この32MBのファイルシステムも入れてもうまく読み込んでくれませんでした。
②Picoより先にSDへ給電
Picoの電源が入るより先にSDカードモジュールに電源が行っていればいいので、RaspberryPi母艦から直接3.3vを引っ張ってきて接続するように変更。
↑こんなかんじですね。
これで、Picoの電源を入れると……
こんなかんじでがっつり動きました!(∩´∀`)∩☆
と、ゆーわけで、自分でやるんではなくて用意してくれたやつをそのまま利用したほうがよかったわね。。というちょっと残念な結果となりましたが、いちおうは動作するUNIX環境がこれで手に入ったので、いろいろと遊べてしまいそうです(∩´∀`)∩☆
さっそく付属のゲームを動かしてみたりしてw
スタートレックのゲームが入ってましたw
放送当時にもしRaspberryPi Picoがあったら、きっとウルトラスーパーコンピューターだったんでしょうねーw
―――
なお、今回は出来あいのイメージファイルを突っ込んで動かしてしまいましたが、ちゃんとコンパイルして立ち上げる方法(ですよね?)を
↑のように発表されるされる予定とのこと!
ご興味にあるかたは↑らへんをどーぞなのです(∩´∀`)∩☆
オマケ
このPico-Unix、シリアル通信でRaspberryPi本体と接続して、母艦側のターミナルソフト(minicom)で操作しているわけですが、ようはシリアル・ターミナルがあればよいので、こんなのを作ってみました。
見ての通り、M5StackとRaspberryPi Picoをシリアル通信で接続して、M5Stackの画面に通信内容を表示、M5Stackにくっつけたカードキーボードから打った内容をRaspberryPi Picoへ送るというやつですw
別にRaspberryPi本体を母艦にしてやってればいいだけの話なのですけどねw
こういう、自分の脳みそを使わないで単なる入出力に徹するのはダム端末
と呼ばれる奴で、大昔のコンピュータ端末っぽくてなんか憧れなのですw
本当はVT100ってベストセラー端末相当の機能とか入れたりしたかったですけど、そこまでは不要なので、単なる文字表示とスクロール、バックスペースとCR/LF変換のみの実装です。
それでもちゃんとゲームも遊べます☆
なんか昔っぽくていいでしょw
けっこう本気であそんじゃったりしてますw