前回はお名前.com VPSにインストールしたDebianのパッケージ関係を整理しました。
今回は準備の総仕上げに最新のカーネルをビルドして入れ替えてみます。
スナップショットの作成
万が一を考えてスナップショット(バックアップ)を作成してカーネルの更新に失敗した場合に備えます。
スナップショットを作成するにはVPSを停止する必要があるので
sudo shutdown -h now
でVPSを停止させます。
続いてお名前.com VPSのコントロールパネルに接続して「スナップショット」のタブから、「スナップショットの取得」を選択します。
まだディスクの使用量が少ないのでスナップショット取得はすぐに終わります。完了してコントロールパネルに戻ると、次のようにスナップショットの履歴が残っているはずです。
履歴をクリックすると詳細が表示されて、編集ボタンを選択するとラベルが変更できます。
わかりやすいラベルとすることをお勧めします。私は「最少セットアップ完了」というラベルにしておきました。
カーネルビルドに必要なパッケージのインストール
スナップショットの取得が終わったらVPSを再び立ち上げ、カーネルのビルドに必要なパッケージをインストールします。
これはkernel-packageというパッケージをインストールすると自動的にまとめてインストールされます。私がkernel-packageをインストールしたときは次のようになりました。
sudo apt-get install kernel-package
パッケージリストを読み込んでいます... 完了 依存関係ツリーを作成しています 状態情報を読み取っています... 完了 以下の特別パッケージがインストールされます: autopoint binutils build-essential cpp cpp-4.7 dpkg-dev fakeroot g++ g++-4.7 gcc gcc-4.7 gettext git git-man intltool-debian libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libc-dev-bin libc6-dev libcroco3 libcurl3-gnutls libdpkg-perl liberror-perl libffi5 libfile-fcntllock-perl libgettextpo0 libglib2.0-0 libglib2.0-data libgmp10 libgomp1 libitm1 libmail-sendmail-perl libmpc2 libmpfr4 libquadmath0 librtmp0 libssh2-1 libstdc++6-4.7-dev libsys-hostname-long-perl libtimedate-perl libunistring0 linux-libc-dev make manpages-dev po-debconf rsync shared-mime-info 提案パッケージ: binutils-doc cpp-doc gcc-4.7-locales debian-keyring g++-multilib g++-4.7-multilib gcc-4.7-doc libstdc++6-4.7-dbg gcc-multilib autoconf automake1.9 libtool flex bison gdb gcc-doc gcc-4.7-multilib libmudflap0-4.7-dev libgcc1-dbg libgomp1-dbg libitm1-dbg libquadmath0-dbg libmudflap0-dbg libcloog-ppl0 libppl-c2 libppl7 binutils-gold gettext-doc git-daemon-run git-daemon-sysvinit git-doc git-el git-arch git-cvs git-svn git-email git-gui gitk gitweb linux-source kernel-source libncurses-dev docbook-utils xmlto grub grub2 jfsutils mcelog oprofile pcmciautils ppp reiserfsprogs squashfs-tools xfsprogs quota btrfs-tools glibc-doc libstdc++6-4.7-doc make-doc libmail-box-perl 以下のパッケージが新たにインストールされます: autopoint binutils build-essential cpp cpp-4.7 dpkg-dev fakeroot g++ g++-4.7 gcc gcc-4.7 gettext git git-man intltool-debian kernel-package libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl libc-dev-bin libc6-dev libcroco3 libcurl3-gnutls libdpkg-perl liberror-perl libffi5 libfile-fcntllock-perl libgettextpo0 libglib2.0-0 libglib2.0-data libgmp10 libgomp1 libitm1 libmail-sendmail-perl libmpc2 libmpfr4 libquadmath0 librtmp0 libssh2-1 libstdc++6-4.7-dev libsys-hostname-long-perl libtimedate-perl libunistring0 linux-libc-dev make manpages-dev po-debconf rsync shared-mime-info アップグレード: 0 個、新規インストール: 49 個、削除: 0 個、保留: 6 個。 54.6 MB のアーカイブを取得する必要があります。 この操作後に追加で 142 MB のディスク容量が消費されます。 続行しますか [Y/n]?
さらに後述のカーネルコンフィグレーションにlibcursesが必要になるので、インストールしておきます
sudo apt-get install libncurses5-dev'
インストールが終わったらダウンロードしたパッケージは削除しておきます。
sudo apt-get clean
カーネルソースの取得
カーネルのソースファイルはhttps://www.kernel.org/か適当なミラーサイトから取得します。
お名前.com VPSでDebian 7をインストールするとカーネルのバージョンは3.2.0です。ですので無難なのは3.2系列の最新番(この時点では3.2.68)です。
ただそれでは面白くないので、Linux 4.0で進めてみます。適当な作業ディレクトに移動して、wgetコマンドで取得すればよいでしょう。
wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.0.tar.xz
ダウンロードが完了したら展開しておきます。
tar xfvJ linux-4.0.tar.xz
カーネルのコンフィグレーション
最大の難所はコンフィグレーションです。
Linuxのカーネルをコンパイルする際にどの機能を組み込むのか取捨選択することです。この選択肢がかなりの数あるうえに内容が難解なこともしばしばです。運が悪いと起動しないLinuxカーネルができたりしてしまいます。
ここでちゃんとコンフィグレーションすると、無駄のないスリムなLinuxカーネルになってメモリの消費量が減ったり、余分なコンパイルが発生しないためコンパイル時間を短縮することができます。
しかし、今回は手を抜いて現在動いているカーネルのコンフィグレーションをベースとすることにします。このためには/bootにあるconfigファイルをカーネルソースのディレクトリに.configという名前でコピーします。
cd linux-4.0 cp /boot/config-3.2.0-4-amd64 .config
そしておもむろにコンフィグレーションを開始します。
make menuconfig
次のようなコンフィグレーション画面で表示されるはずです。そしてあらかじめ「.config」を用意しておくとそれをベースに新しい設定項目は適当に選択していい感じに選んでおいてくれます(Loadで再度.configをロードする必要はなかったと記憶しています)。
これでSaveしてからExitすれば一応コンフィグレーション終了なのですが、せっかくなので明らかにいらない設定項目については除外しておきます。また、「Network packet filter framework」については、一度カーネルを作って動かしたら一部モジュールが不足したので、とりあえず全部「M」としてモジュール化しておくこととしました。
操作は上下キーとスペースキーで行います。上下キーで変更したい項目を選んでスペースで設定を変更するという感じです。「M」がモジュールとしてその機能を用意することを示し、「*」はその機能をカーネル内に組み込みます。また、タブキーを使うと画面下部のメニュー項目間を移動できるので(Select, Exit, Helo・・・)行いたい操作を選択してスペースキーで決定です。
私が変更したのは次の通りです。
- 「Processor type and features」→
- 「Linux guest support」を選択→
- 「KVM Guest support」を選択
- 「Memtest」を除外
- 「Processor family」を「Core 2/newer Xeon」に変更
- 「Preemption Model」を「No Forced Preemption (Server)」に変更
- 「Linux guest support」を選択→
- 「Bus options」→
- 「PCCard (PCMCIA/CardBus) support」を除外
- 「Support for PCI Hotplug」を除外
- 「Networking support」→
- 「Networking options」→
- 「Network packet filtering framework (Netfilter) 」→
- 「Core Netfilter Configuration」内をすべて「M」か「*」にする
- 「IP set support」内をすべて「M」にする
- 「IP virtual server support」内をすべて「M」にする
- 「IP: Netfilter Configuration」内をすべて「M」にする
- 「IPv6: Netfilter Configuration」内をすべて「M」にする
- 「The DCCP Protocol 以下すべて」を除外(除外できないものは「M」とする)
- 「Network packet filtering framework (Netfilter) 」→
- 「Amateur Radio support以下すべて」を除外(除外できないものは「M」とする)
- 「Wireless」に関しては除外できないので、Wireslessの中に入ってすべて選択肢を除外する
- 「Networking options」→
- 「Device Drivers」→
- 「Memory Technology Device (MTD) support」を除外
- 「Parallel port support」を除外
- 「Generic Target Core Mod (TCM) and ConfigFS Infrastructure」を除外
- 「Fusion MPT device support」を除外
- 「IEEE 1394 (FireWire) support」を除外(中に入ってすべての選択肢を除外する)
- 「Macintosh device drivers」を除外
- 「SPI support」を除外
- 「GPIO Support」を除外
- 「Dallas’s 1-wire support]を除外
- 「Sonics Silicon Backplane」を除外(中に入ってできるだけ選択肢を除外する)
- 「Broadcom specific AMBA 」を除外(中に入ってすべての選択肢を除外する)
- 「Voltage and Current Regulator Support」を除外
- 「Multimedia support」を除外
- 「Ultra Wideband devices」を除外
- 「MMC/SD/SDIO card support」を除外
- 「Sony MemoryStick card support」を除外
- 「LED Support」を除外(中に入ってできるだけ選択肢を除外する)
- 「Accessibility support」を除外
- 「InfiniBand support」を除外
- 「EDAC (Error Detection And Correction) reporting」を除外
- 「Virtualization drivers」を選択
- 「Virtio drivers」を選択(中に入ってすべての選択肢を選択するか「M」にする)
- 「Staging drivers」を除外
- 「Firmware Drivers」→
- 「BIOS update support for DELL systems via sysfs 」を除外
- 「Dell Systems Management Base Driver」を除外
- 「iSCSI Boot Firmware Table Attributes」を除外
もっと無駄なものは削除できそうでしたが、大変だったのでこの辺でやめておきました。
設定が終わったらタブキーで<Save>を選んでコンフィグレーション結果を.configに書き出した後に、<Exit>で終了します。
カーネルのコンパイル
コンフィグレーションが完了したらカーネルのコンパイルです。Debianではmake-kpkgというコマンドを使ってカーネルをコンパイルします。入力するコマンドは次の通りです。
cd linux-4.0 sudo make-kpkg --revision=20150424.1 --initrd kernel_image linux_headers -j 3
通常はfakerootコマンドでmake-kpkgを指定するのですが、なぜか途中でエラーとなってしまったので、今回はsudoコマンドを利用しました。
「–revision」の後はこのコンパイルによってできるカーネル関係のパッケージのリビジョン番号です。なんでもよいのですが数字で始める必要があります。
「-j 3」は最大3並列でコンパイルすることを指示しています。これは利用しているお名前.com VPSが3コアのCPUを提供しているので、こうすることでコンパイル時間の短縮が期待できるからです。
私の環境ではコンパイルに30分ほどかかりました。無事にコンパイルが終わると一つ上のディレクトリにlinux-kernelとlinux-headersのパッケージができているはずです。
cd .. ls *.deb
linux-headers-4.0.0_20150424.1_amd64.deb linux-image-4.0.0_20150424.1_amd64.deb
作成したパッケージのインストール
パッケージができたらdpkgコマンドでインストールします。2つのパッケージを両方同時にインストールしてしまって大丈夫です。
sudo dpkg -i linux-image-4.0.0_20150424.1_amd64.deb linux-headers-4.0.0_20150424.1_amd64.deb 以前に未選択のパッケージ linux-image-4.0.0 を選択しています。 (データベースを読み込んでいます ... 現在 34771 個のファイルとディレクトリがインストールされています。) (linux-image-4.0.0_20150424.1_amd64.deb から) linux-image-4.0.0 を展開しています... Done. 以前に未選択のパッケージ linux-headers-4.0.0 を選択しています。 (linux-headers-4.0.0_20150424.1_amd64.deb から) linux-headers-4.0.0 を展開しています... linux-image-4.0.0 (20150424.1) を設定しています ... Running depmod. Examining /etc/kernel/postinst.d. run-parts: executing /etc/kernel/postinst.d/initramfs-tools 4.0.0 /boot/vmlinuz-4.0.0 run-parts: executing /etc/kernel/postinst.d/zz-update-grub 4.0.0 /boot/vmlinuz-4.0.0 Generating grub.cfg ... Found linux image: /boot/vmlinuz-4.0.0 Found initrd image: /boot/initrd.img-4.0.0 Found linux image: /boot/vmlinuz-3.2.0-4-amd64 Found initrd image: /boot/initrd.img-3.2.0-4-amd64 done linux-headers-4.0.0 (20150424.1) を設定しています ... Examining /etc/kernel/header_postinst.d.
無事にインストールすることができました。
再起動と動作確認
あとはVPSを再起動して無事に動くことを祈るだけです。
無事に起動したらカーネルのバージョンを確認してみます。
cat /proc/version
Linux version 4.0.0 (root@vNNN-NNN-NNN-NNN) (gcc version 4.7.2 (Debian 4.7.2-5) ) #1 SMP Fri Apr 24 02:35:15 JST 2015
うまく新しいカーネルになったことを確認したらVPSをいったん終了して再度スナップショットを取得しておきましょう。
まとめ
今回はお名前.com VPSにインストールしたDebianで最新のLinuxカーネルをビルドしてインストールしてみました。
カーネルのビルドはコンフィグレーションが大変ですが、自分で不要な機能を取り除くことでLinuxカーネルのサイズを小さくしたり、使用メモリを節約することができます。ぜひチャレンジしたいところです。
次回はカーネル4.0.0と以前のカーネルを比較したいと思います。
コメント