実験用に作ったUbuntu13.10の仮想マシン上で、Linuxカーネルの再構築を試しました。
まずカーネルのビルド環境を構築。
元がサーバー版Ubuntuだったので、ビルド環境なんてほぼ何も入っておらず。コマンド一発であれこれ一気にパッケージが入りました。
~>$ sudo apt-get build-dep linux-image-$(uname -r) Reading package lists… Done Building dependency tree Reading state information… Done Picking ‘linux’ as source package instead of ‘linux-image-3.11.0-17-generic’ The following NEW packages will be installed: apparmor-easyprof asciidoc binutils binutils-dev bison build-essential cpp cpp-4.8 debhelper dh-apparmor docbook-dsssl docbook-utils docbook-xml docbook-xsl dpkg-dev flex g++ g++-4.8 gcc gcc-4.8 gettext ghostscript gsfonts intltool-debian jadetex kernel-wedge libasan0 libasprintf-dev libatomic1 libaudit-dev libbison-dev libc-dev-bin libc6-dev libcloog-isl4 libcupsfilters1 libcupsimage2 libdpkg-perl libdw-dev libdw1 libelf-dev libexpat1-dev libfl-dev libgcc-4.8-dev libgettextpo-dev libgettextpo0 libgmp10 libgomp1 libgs9 libgs9-common libicu48 libijs-0.35 libisl10 libitm1 libjbig2dec0 libkpathsea6 liblcms2-2 libmpc3 libmpfr4 libnewt-dev libosp5 libostyle1c2 libpaper-utils libpaper1 libpci-dev libpng12-dev libpoppler43 libptexenc1 libpython-dev libpython2.7-dev libquadmath0 libsgmls-perl libslang2-dev libsp1c2 libstdc++-4.8-dev libtsan0 libunistring0 libunwind8 libunwind8-dev libxaw7 libxml2-utils libxmu6 libxslt1.1 linux-libc-dev luatex m4 make makedumpfile openjade pkg-config po-debconf poppler-data python-dev python2.7-dev sgml-data sgmlspl sharutils sp tex-common texlive-base texlive-binaries texlive-fonts-recommended texlive-generic-recommended texlive-latex-base texlive-latex-recommended tipa transfig ttf-marvosym xdg-utils xmlto xsltproc zlib1g-dev 0 upgraded, 111 newly installed, 0 to remove and 0 not upgraded. Need to get 143 MB of archives. After this operation, 399 MB of additional disk space will be used. Do you want to continue [Y/n]?
apt-get build-depは、指定したパッケージのビルドに必要とされているパッケージをまとめてインストールしてくれるコマンドです。便利ですが、何か今回はやけに一気にたくさん入った感じがします。texなんて他の用途では要らないのになと思いつつ。
続いてカーネルのソースを取得しました。
ソースを取得する方法は複数あるようですが、gitで最新のソースを取得する方法を選択しました。
どのgitリポジトリをgit cloneするかは、
を見て選択。
~>$ mkdir kernel ~>$ cd kernel ~/kernel>$ git clone git://kernel.ubuntu.com/ubuntu/ubuntu-saucy.git
ところが!これすごく時間がかかりました。
正確には測り損ねましたが、概ね2時間半かかってやっと完了。長かった…。
ここで試しにビルド。
ソースに変更を加えるなら本来ここですが、まずビルド環境ができているか確認するため、git cloneしたそのままビルドしてみました。
~/kernel>$ cd ubuntu-saucy/ ~/kernel/ubuntu-saucy>$ fakeroot debian/rules clean ~/kernel/ubuntu-saucy>$ fakeroot debian/rules binary-headers binary-generic
ビルド完了までまた長くて。
カーネルのビルドに延々待たされました。
しかしここで一つ疑問が!
ホストOS側でタスクマネージャー開いて見ていましたが、ビルド中のCPU使用率がほんの一桁%までしか上がらない。
仕事でARMのLinuxカーネルは何度もビルドしていますが、こんなにCPU使用率が低いことはありません。いつもmakeに-jつけてマルチスレッド処理させて、概ね80%前後までブン回してます。ARMとAMD64の違いはあるものの、それが原因でCPU使用率にこんなに差がつくとも思えない。
一桁%までしかCPU使用率が上がらないということは、CPUリソースを遊ばせているわけで、時間を損している気がします。まあ今はとりあえず進めるとして、いずれどうすればよいか調べねば。
結局、38分かかってビルド完了。
ビルドに成功してれば、一階層上のディレクトリに.debファイルができています。
~/kernel/ubuntu-saucy>$ cd .. ~/kernel>$ ls -l *.deb -rw-r–r– 1 nashi nashi 1173674 Feb 23 22:50 linux-headers-3.11.0-18-generic_3.11.0-18.32_amd64.deb -rw-r–r– 1 nashi nashi 12737546 Feb 23 22:12 linux-headers-3.11.0-18_3.11.0-18.32_all.deb -rw-r–r– 1 nashi nashi 14730844 Feb 23 22:49 linux-image-3.11.0-18-generic_3.11.0-18.32_amd64.deb -rw-r–r– 1 nashi nashi 33968350 Feb 23 22:50 linux-image-extra-3.11.0-18-generic_3.11.0-18.32_amd64.deb -rw-r–r– 1 nashi nashi 121016 Feb 23 22:50 linux-tools-3.11.0-18-generic_3.11.0-18.32_amd64.deb
さっそく正しくビルドできたかインストールしてみました。
ただ万一を考えてHyper-Vマネージャーからチェックポイントを作ってから試しました。こういう時VMで環境を作っていると便利。
~/kernel>$ sudo dpkg -i linux-headers-3.11.0-18-generic_3.11.0-18.32_amd64.deb linux-headers-3.11.0-18_3.11.0-18.32_all.deb linux-image-3.11.0-18-generic_3.11.0-18.32_amd64.deb ~/kernel>$ sudo reboot
再起動後にバージョンを確認してみると、
~>$ uname -r 3.11.0-18-generic
再構築前は 3.11.0-17-generic だったので、ちゃんと差し替わってる。dmesgもおかしなログは無いようだ。
あっさりビルドしたカーネルで起動してくれた。
ビルド時のCPU使用率に疑問はあるものの、これでカーネルに手を加えて実験してみる環境が手に入ったようだ。