自作OSもくもく会の二回目に参加した。 前回は昔写経していたはりぼてOSを再び動かせるようにして自作OSの仕方を思い出すということをしていたが、今回は趣向を変えてLinuxをビルドするというのをしてみた。
Linuxのビルドの仕方とか全然わかってなかったので、「絶対わかる! Linuxカーネル完全入門」という本の中の、「スクラッチから作る自分だけのOS」という、Linuxのソースをビルドしてディストリビューションを作るという節を参考に作業してみた。
開発環境構築
記事ではFedora 18(32ビット版)を開発環境としているので、同じ環境を用意するためVagrantでセットアップ:
$ vagrant init fedora-18 http://static.stasiak.at/fedora-18-x86-2.box |
再起動が必要とのことなのでその通りにする。
Fedoraに以降のビルドで使う開発ツールをいくつか入れる必要がある:
$ sudo yum install bzip2 gcc perl ncurses-devel libxslt |
作業用ディレクトリ作成
以降は開発環境で、rootユーザに移って行う。
作業用のディレクトリ/usr/local/source
と、生成先ディレクトリ/usr/local/mylinux
を作成する:
# mkdir -p /usr/local/source |
ソースのダウンロード
カーネルのソースとして、glibc(Cライブラリ)、BusyBox(コマンド集)、kmod(モジュールローダーツール)、Kernelをビルドする。それぞれのtarをダウンロードするんだけど、本に書いてあるURLから変わってhttpsに置くようになったみたい:
- glibc: http://ftp.gnu.org/gnu/glibc/glibc-2.16.0.tar.bz2
- busybox: https://busybox.net/downloads/busybox-1.21.0.tar.bz2
- kmod: https://www.kernel.org/pub/linux/utils/kernel/kmod/kmod-12.tar.bz2
- linux-3.8.5: http://www.kernel.org/pub/linux/kernel/v3.x/linux-3.8.5.tar.bz2
wgetで取得するなりブラウザ上で取得してVagrantにぶち込むなり、好きなように。
/usr/local/source
にtar.bz2を配置する。
ソースファイルの展開
# cd /usr/local/source |
glibcのコンパイル
本によると、「展開したソースをそのままコンパイルすると途中でエラーが発生する」とのことでパッチを当てる必要があるらしいんだけど、ウェブで公開していたというパッチファイルが消えていたのでそのままビルドさせる。
ソースを展開したディレクトリとは別に作業用のディレクトリを作成し、その中でビルドする:
# mkdir -p /usr/local/source/glibc-work |
特に何もエラーは出ずに、コンパイルが成功した。
コンパイルできたら/usr/local/mylinux
にインストール:
# mkdir -p /usr/local/mylinux/etc |
BusyBoxのコンパイル
# cd /usr/local/source/busybox-1.21.0 |
インストール:
# make CONFIG_PREFIX=/usr/local/mylinux install |
kmodのコンパイル
# mkdir -p /usr/local/source/kmod-work |
# make install |
kmod内のコマンドがBusyBoxにリンクされているので、リンクを修正する必要がある:
# cd /usr/local/mylinux/sbin |
Kernelのコンパイル
いよいよLinuxカーネルのコンパイルを行う。 その前にビルドの設定をする必要があって、それを現在動かしている開発環境から持ってきてやる:
# cd /usr/local/source/linux-3.8.5 |
カーネルのバージョンに、自分でビルドしたという目印を入れる:Makefile
のEXTRAVERSION =
の行を書き換えて、EXTRAVERSION = -mylinux
などとする。
設定を反映させ、メニューで設定する:
# make oldconfig # 問い合わせには「Enter」 |
メニューでは、Device Drivers > USB support > USB Mass Storage Supportを*
にする。
makeとインストール:
# make |
デバッグシンボルの削除:
# cd /usr/local/mylinux/lib/modules/3.8.5-mylinux/kernel |
作成したカーネルファイル(bzImage
)とSystem.map
ファイルをコピー:
# mkdir -p /usr/local/mylinux/boot |
以上でテキストベースのLinuxのコンパイルが終了。本ではこの後USBに焼いて起動、Xウィンドウの導入、と続くんだけど、それらはまた後ほど…。
Tips
- もくもく会で今日の作業内容ということでLTした。そして「VirtualBoxでコアを複数割り当てて並列コンパイルしたら速い」と聞いた:
make -j4