こんにちは、JWordのゲーム開発エンジニア カネテックです。
みなさんカーネルコンパイルしてますか?kernel.orgからソースコードをダウンロードしても
使い方がよくわからない、なんて思ったことはないですか?
今回は本家Linuxカーネル(kernel.orgで公開されているもの)をダウンロードして
仮想PC上で起動させる手順を共有いたします。
概要
- ソースコードの入手、展開
- カーネルコンパイル
- 仮想イメージの作成
- カーネルの設置
- ブートローダのインストール
- 起動
ソースコードの入手、展開
何はともあれ、ソースを入手して展開しないことには始まりません。
ちょうど執筆時点(2016/05/31現在)では4.7-rc1というリリース候補版がありますので、
これを仮想PCで動作させて動作確認する、というシナリオにします。
日付の右にある[tar.xz]というリンクをクリックしてソースコードをダウンロードします。
ダウンロードしたファイルはtarコマンドを使って展開しておきます。
1 2 |
$ cd [カーネルダウンロードディレクトリ] $ tar xvf linux-4.7-rc1.tar.xz |
カーネルコンパイル
x86の64bitアーキテクチャ向け(amd64)のカーネルを作ります。
コンパイルオプションをx86_64のデフォルトで設定
1 2 3 4 5 6 7 8 9 10 11 12 |
$ cd [カーネルソースディレクトリ] $ make x86_64_defconfig HOSTCC scripts/basic/fixdep HOSTCC scripts/kconfig/conf.o SHIPPED scripts/kconfig/zconf.tab.c SHIPPED scripts/kconfig/zconf.lex.c SHIPPED scripts/kconfig/zconf.hash.c HOSTCC scripts/kconfig/zconf.tab.o HOSTLD scripts/kconfig/conf # # configuration written to .config # |
カーネルイメージのタイプとしてbzImageを指定してコンパイル実行
1 2 3 4 5 |
$ make bzImage scripts/kconfig/conf --silentoldconfig Kconfig SYSTBL arch/x86/entry/syscalls/../../include/generated/asm/syscalls_32.h SYSHDR arch/x86/entry/syscalls/../../include/generated/asm/unistd_32_ia32.h (以下略) |
コンパイルがうまくいくと、以下のようにカーネルイメージファイルが得られます。
1 2 |
$ file arch/x86/boot/bzImage arch/x86/boot/bzImage: x86 boot sector |
仮想イメージの作成
今回はVirtualBoxで起動させることにします。
ただし、専用の形式であるVDIのファイルは編集しづらいので、rawイメージを作成して
データを全て置いてから、最後にVDIに変換する手順にします。
100MBのrawイメージの作成
1 2 |
$ cd [作業ディレクトリ] $ dd if=/dev/zero of=sda.raw bs=1M count=100 |
パーティショニング(プライマリパーティションに全領域を割り当てる)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ fdisk sda.raw コマンド (m でヘルプ): n⏎ Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): p⏎ パーティション番号 (1-4, 初期値 1):⏎ 初期値 1 を使います 開始 セクタ (63-204799, 初期値 63):⏎ 初期値 63 を使います Last セクタ, +セクタ数 or +size{K,M,G} (63-204799, 初期値 204799):⏎ 初期値 204799 を使います コマンド (m でヘルプ): w⏎ パーティションテーブルは変更されました! ディスクを同期しています。 |
ext3ファイルシステムの構築
1 2 3 4 5 6 7 |
$ sudo kpartx -a sda.raw $ sudo mkfs.ext3 /dev/mapper/loop0p1 mke2fs 1.42.9 (4-Feb-2014) Discarding device blocks: done Filesystem label= OS type: Linux (以下略) |
カーネルの設置
マウントしてカーネルを設置します。ついでに後で必要になるbootディレクトリも
ここで作っておきます。
1 2 3 4 5 6 |
$ mkdir sda1 $ sudo mount /dev/mapper/loop0p1 sda1 $ sudo mkdir sda1/boot $ sudo cp [カーネルディレクトリ]/bzImage sda1/ $ sudo umount sda1 $ sudo kpartx -d sda.raw |
ブートローダのインストール
続いて、作った仮想ディスクにブートローダをインストールしていきます。
これは既存のLinuxが動いている環境に接続した方が簡単なので、CentOSの
インストールディスクに収録されているレスキューモードをVirtualBoxで
動かして、その環境の中でsda.rawにGRUB2をインストールします。
まずはsda.rawをVirtualBoxで認識させるために、VDI形式にコンバートします。
1 |
$ VBoxManage convertdd sda.raw sda.vdi --format VDI |
続いて、VirtualBoxで新規仮想PCを作成し、CentOSのISOイメージとsda.vdiを
接続した状態で立ち上げます。
ストレージ設定
インストールディスクが起動したら、「Troubleshooting」を選択し「Rescure a CentOS system」
を選択します。(CentOS7の場合)
起動が完了すると以下のメニューが表示されるので、「3) Skip to shell」を選択してシェルを
起動します。
接続した仮想ディスク(sda.vdi)にGRUB2をインストールします。
1 2 3 4 |
# mkdir /mnt/sda1 # mount /dev/sda1 /mnt/sda1 # grub2-install --force --boot-directory=/mnt/sda1/boot /dev/sda # umount /mnt/sda1 |
ここまでできたら、いったん仮想PCはシャットダウンしておきます。
起動
VirtualBoxのストレージ設定を開き、CentOSのISOイメージを取り除きます。
仮想PCを再度起動します。うまくいくと、以下のようにGRUBのプロンプトが表示されます。
以下のようにカーネルの場所をGRUB2に教えて、起動してみます。
1 2 |
grub > linux /bzImage grub > boot |
長かったですね、お疲れ様でした。無事起動することができました。
起動に要した時間は0.98秒!速いですね!
カーネルは起動完了後に/sbin/initを実行しますが、まだ/sbin/initを用意していないため
カーネルパニックで停止しています。
もちろん、sda.rawの中にinitを置くことでこの先の動作をさせることも可能です。
余力がある人は是非チャレンジしてみてください!