2018年12月2日日曜日

Chrome OS用の efibootmgr をコンパイルした

CxOSはLinuxカーネルなので、EFIへのインタフェースも兼ね備えていますが、これをいじる手段としての efibootmgr コマンドがありません。なので作りましたという話です。

端的には、以下の efibootmgr (16) のソースをコンパイルしたものです。

依存関係として、efivar (36) もコンパイルしました。

CxOSはミニマムに構成されていて、必要なヘッダやライブラリなどが揃っていないので、コンパイルオプションをああだこうだといじったのですが、たぶん環境によっても違うので、適度に苦戦してください。

手元の環境では Make.defaults ファイルの以下のオプションをいじりました。Chromebrewから popt を入れる必要があると思います。

LD_LIBRARY_PATH=/usr/lib64/:/usr/local/lib64/:$LD_LIBRARY_PATH
LDLIBS=$(foreach lib,$(LIBS),-l$(lib))
LDFLAGS = -L/usr/lib64/:/usr/local/lib64/ -lefiboot -lefivar -lpopt

パッチというほどのものではないので、このオプションでコンパイルしたバイナリ(x86_64用)を転がしておきます。

両方を /usr/sbin に入れる必要があるので、開発者モードへの移行と rootfs verification を切る必要があるはずです。

これによって、例えばMacBook Airのように(Windows以外の)他OSをデュアルブートで起動した際にmacOSのことを忘れてしまうクソEFIへの対処や、一部ChromebookのようにセキュアブートでEFIからChrome OSを起こしているような場合に他のOSを起動させることができるチャンスが産まれるかもしれません。あるいは何も産み出さないかもしれません。生かすも殺すもあなた次第です。

なお、過去に efibootmgr を使う事例を掲載しているので、参考まで。