kernelのbootメッセージにHello World!
kernelをビルドしてみたのでその手順をメモ
もともとこちらの本を読んでいてやってみようと思ったもの
Linuxの内部構造の概要や運用管理する上でのシェルスクリプトの使い方、kernelソースの読み方導入までわかりやすく書いてありとても面白かった。

プロのための Linuxシステム・10年効く技術 (Software Design plus)
- 作者: 中井悦司
- 出版社/メーカー: 技術評論社
- 発売日: 2012/06/15
- メディア: 大型本
- 購入: 6人 クリック: 88回
- この商品を含むブログ (17件) を見る
今回の手順自体はほぼ本に書かれている通り。一部うまく行かなかったところやrpmを取得してくるところに関しては別のページを参照した
http://qiita.com/makocchi/items/17408551ba400a9f46ef
mac上でvirtualboxを用いて仮想マシンを作成しその上で作業した
仮想マシンのOSはcentos6.5
まずビルドに必要なツール類をインストール
$ yum groupinstall "Development Tools" $ yum install xmlto asciidoc elfutils-libelf-devel zlib-devel binutils-devel newt-devel python-devel hmaccalc
kernelのソース用rpmパッケージを取得
仮想マシンに入っているものと同じバージョンにしてみた
$rpm -ivh http://vault.centos.org/6.5/updates/Source/SPackages/kernel-2.6.32-431.11.2.el6.src.rpm
このパッケージはホームディレクトリに配置しておく
ソースコードの展開を行う
$ rpm -ivh kernel-2.6.32-431.11.2.el6.src.rpm $ cd ~/rpmbuild/SPECS $ rpmbuild -bp kernel.spec --target=$(uname -m)
最後のコマンドを実行したところで依存パッケージが足りないというエラーが出たので追加でインストール
$ yum install elfutils-devel $ yum install audit-libs-devel
再度ビルド
$ rpmbuild -bp kernel.spec --target=$(uname -m)
途中以下のメッセージで止まることがある
+ cat ### ### Now generating a PGP key pair to be used for signing modules. ### ### If this takes a long time, you might wish to run rngd in the background to ### keep the supply of entropy topped up. It needs to be run as root, and ### should use a hardware random number generator if one is available, eg: ### ### rngd -r /dev/hwrandom ### ### If one isn't available, the pseudo-random number generator can be used: ### ### rngd -r /dev/urandom ### + gpg --homedir . --batch --gen-key /home/y-kamiya/rpmbuild/SOURCES/genkey gpg: WARNING: unsafe permissions on homedir `.' gpg: keyring `./secring.gpg' created gpg: keyring `./pubring.gpg' created
コメントに書いてあるが、別のターミナルからログインして以下のコマンドを打つと処理が進む
rngd -r /dev/urandom
rpmbuildが終わったらrngdをkillしておく
これでソースコードが展開された
起動時のメッセージの中で固定文字列っぽい'Linux version'でgrepして追っていくとbootメッセージの出力はinit/main.cの598行目にあることがわかる
なのでその下にHello, worldを追加
# init/main.c 594 lock_kernel(); 595 tick_init(); 596 boot_cpu_init(); 597 page_address_init(); 598 printk(KERN_NOTICE "%s", linux_banner); 599 printk(KERN_NOTICE "Hello, World!!"); ←追加 600 setup_arch(&command_line); 601 mm_init_owner(&init_mm, &init_task);
これでビルド
$ cd ~/rpmbuild/BUILD/kernel-2.6.32-431.11.2.el6/linux-2.6.32-431.11.2.el6.x86_64 $ make -j 4 $ sudo make modules_install install
起動時のkernelを今回いれたものにするため、default=0を指定
# /boot/grub/grub.conf default=0
再起動
$ sudo shutdown -r now
起動後にbootメッセージを確認
$ dmesg | head Initializing cgroup subsys cpuset Initializing cgroup subsys cpu Linux version 2.6.32 (y-kamiya@localhost.localdomain) (gcc version 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) ) #1 SMP Sat Apr 19 05:51:47 JST 2014 Hello, World!! Command line: ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS rd_NO_MD rd_LVM_LV=VolGroup/lv_swap crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=jp106 rd_LVM_LV=VolGroup/lv_root LANG=ja_JP.UTF-8 rd_NO_DM rhgb quiet
4行目にHello, World!!が入っていることが確認できればOK