プログラミング言語 Rust で書かれたマイクロカーネル OS である Redox を、インテル版 macOS 11 Big Sur 上で動かしてみたくなって、ビルドを試みました。ドキュメントを見ると macOS でも簡単にビルドできそうだったのですが…、私の力量ではちょっと手こずるしかありませんでした。また、現時点では起動時にエラーになってしまいます。。
残念ながら、私は Rust も Redox も autotools も門外漢なので、ここから先に進むには時間が必要です。そこで、とりあえず現時点までの作業内容をメモとして残しておこうと思います。
(1—1)macOS での準備
まず、macOS Big Sur でのビルドを試みました。その際、ドキュメントに書かれていること以外に、下記の作業が必要でした。(下記を行わないと、ビルドの途中でエラーが発生します)
Homebrew を利用している場合は、下記が必要となりました。
% brew install bison
% brew install coreutils
% brew install findutils
% brew install ninja
% brew install po4a
% brew install wget
このうちの bison, coreutils, findutils を使うためには、PATH の先頭に下記を追記する必要がありました。
/usr/local/opt/coreutils/libexec/gnubin
/usr/local/opt/findutils/libexec/gnubin
/usr/local/opt/bison/bin
また、CPAN から下記をインストールする必要がありました。
% cpan HTML::Entities
最後に、書くまでもないことかもしれませんが、Xcode の Command line tools は必須です。
(1—2)macOS でのビルド
いざ、macOS Big Sur でビルドを始めると、ソースコードに対して若干の修正が必要になりました。
ひとつめは、Rust で書かれた redoxer というツールです。条件付きコンパイル部分が Linux 用の関数しか用意されてないので、macOS でビルドするためには若干の修正が必要でした。
src/lib.rs には Linux 専用の関数が2つありました(installed と running です)。とりあえず、macOS でも同じコードを使うようにしました。
src/redoxfs.rs には Linux 専用の関数が3つありました。とりあえず、最初の2つは macOS でも同じコードを使うようにしました(mount と unmount です)。3つめの関数については、どのように修正すればよいかわからなかったので、仮に Ok(true) を常に返すようにしました。これは明らかに正しくないので、proc_mounts の使い方を調べた上で、後で正く書き直す必要があります(mounted です)。
ちなみに、redoxer のソースは下記にダウンロードされてました。
~/.cargo/registry/src/github.com-*/redoxer-0.2.20
上記の作業で、Linux 専用のコードを macOS と共用する場合は、条件付きコンパイルの条件を1行目から2行目に書き換えました。
#[cfg(target_os = "linux")]
#[cfg(any(target_os = "linux", target_os = "macos"))]
ふたつめは、tryredox/redox/filesystem.toml です。vim がクロス・コンパイルできなかったので、とりあえずコメントアウトしました。(Redox 用にクロス・コンパイルするはずが、一部を macOS 用にコンパイルしようとするため、矛盾が生じてました)
いずれについても、最終的には正く書き直す必要があります。宿題です。
(1—3)macOS の parted
ビルドの最後の最後に、parted というコマンドが必要になります。パーティション情報を書き換えるためのようです。
残念ながら parted は Homebrew にはないので、自分で make する必要があります。ところが、autotools のバージョンが合わないのか、私の力量ではすぐには make できそうにありませんでした。これも宿題です。
そのため、macOS Big Sur で Redox のビルドを完了することができませんでした。
(2—1)multipass でビルド
そこで、Redox を Ubuntu でビルドしてみました。Redox の開発者は Pop!_OS を使っている人が多いそうです。Pop!_OS は Ubuntu から派生しているので、Ubuntu なら簡単にビルドできるのではないかと思ったからです。実際には multipass を Homebrew でインストールして利用しました。
multipass launch -d 64G -m 2G -n tryredox 21.10
ビルドするためには、メモリはデフォルトの 1G では足りなかったので、2G にしました。
また、ビルドが終わった時点でのディスク使用量は、OS やツール込みで約 20G でした(Redox のファイルシステムのサイズはデフォルト値の 256MB のままで行いました)。ビルド前にはディスク使用量がわからなかったので、念の為にかなり大きめの 64G としました。今後、Redox のファイルシステムを大きくしたくなる可能性はありますが、それでももう少し小さくてもよかったかもしれません。
ドキュメントによると、Redox の bootstrap.sh を実行すれば必要な作業を全部してくれるように書いてあります。しかし実際には、bootstrap.sh 実行前に C コンパイラをインストールしておく必要がありました。(私は clang をインストールしましたが、gcc の方がよかったかもしれません)
それ以降は、ドキュメントに書かれている通りに作業すると、簡単にビルドすることができました。
以上により、tryredox/redox/build/harddrive.bin を得ることができました。
(2—2)macOS 上で実行
そこで、tryredox/redox/build/harddrive.bin を multipass 環境から macOS 環境の同じ場所にコピーしました。
そして、下記の方法で起動してみました。
make qemu vga=no
すると、起動直後に下記のメッセージが表示されて停止しました。
Required CPU features are not present
調べてみると、下記ファイルの27行目に同じメッセージか見つかりました。
tryredox/redox/bootloader/x86_64/cpuid.asm
どうやら CPUID の結果をチェックしている部分のようでした。私の Mac の CPU は、Redox が必要とする機能の一部をサポートしてないと判断されたようです。そのため上記メッセージを表示して停止したものと思われます。どの機能が不足しているかの調査は宿題です。
(3)これから
前述の通り、私は Rust も Redox も autotools も門外漢なので、ここから先に進むのは時間がかかると思います。そこで、これまでの作業内容を忘れないように、とりあえずメモにまとめました。
まずは、multipass 上でビルドしたものを、macOS 上で起動できるようにしたいと思っています。その過程で Rust や Redox について勉強したいと思います。macOS 上でのビルドを成功させるのは、その次になると思います。