読者です 読者をやめる 読者になる 読者になる

kernelのbootメッセージにHello World!

linux

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

プロのための Linuxシステム・10年効く技術 (Software Design plus)

プロのための Linuxシステム・10年効く技術 (Software Design plus)

今回の手順自体はほぼ本に書かれている通り。一部うまく行かなかったところや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