Linuxの最新カーネル 『バニラカーネル』をコンパイルする

  • このエントリーをはてなブックマークに追加
  • Pocket

こんにちは、S.Tです。

過ごしやすい秋も終わり、木枯らしが吹く季節になってしまいました。

早いもので今年も残す所あとわずかです。年越し前に出来ることはやっておきましょう。 

 

さて、今回は最新Linuxカーネル(バニラ)を体験すべく、自マシーンに導入してみます。

バニラと言っても食べ物ではありません。オリジナルのLinuxカーネルのことを、”バニラカーネル”と言います。

語源はアイスクリームのバニラから来てるみたいです。Androidのバージョンみたいですね。

ちなみにAndoridは、

  • Android 1.5 Cupcake
  • Android 1.6 Donut
  • Android 2.0/2.1 Eclair
  • Android 2.2 Froyo
  • Android 2.3 Gingerbread
  • Android 3.x Honeycomb
  • Android 4.0 Ice Cream Sandwich
  • Android 4.1/4.2/4.3 Jelly Bean
  • Android 4.4 KitKat
  • Android 5.0 Lollipop

 

となっています。あたなのAndroidは美味しいですか?

 

 

Linuxカーネルとは?

Linuxのカーネルとは、アプリケーションをコンピュータ上で円滑に動かす為に手助けしてくれるコアなプログラム部分を指します。

代表的な機能として以下のようなものがあります。

  • タスクスケジューラー
  • 物理メモリー管理
  • 仮想メモリー管理機構
  • 時間管理機構
  • ブロック入出力
  • ファイルシステム
  • 省電力
  • 仮想化

 

紹介したのはほんの一部で、たくさんの機能を提供しています。

では、最新カーネルを体験してみます。

 

前提条件

 

本記事は、以下の環境で行っていきます。

環境

  • virtualBox4.3
  • ubuntu12.04

 

現在のカーネルバージョン確認する

 

以下のコマンドで、現在利用しているカーネルバージョンを確認します。

 

# uname -r
3.2.0-24-generic-pae

 

開発ツールをインストールする

 

カーネルの構築にはコンパイラなどの開発ツールが必要です。

以下のコマンドでインストールします。

# apt-get update
# apt-get install build-essential bc kernel-package libncurses5-dev

 

 バニラカーネルアーカイブを入手する

 

Linuxカーネルは「kernel.org」で開発・公開されています。

カーネルには「3.16.3」のようにバージョン番号がついています。

3.16・・・メジャーバージョン。新機能を取り込んだり、内部構造が変わったりした際にはメジャーバージョンが更新されます。

3・・・サブバージョン。基本的には新機能は搭載されず、もっぱら安定性向上のための変更が行われます。

アーカイブされて公式のFTPサイトにアップロードされます。

この公式FTPサイトにアップロードされたカーネルソースは「バニラカーネル」などと呼ばれます。

現時点では、「3.16.3」が最新バージョンになりますので下記URLから入手します。

ftp://ftp.kddlabs.co.jp/011/Linux/kernel.org/linux/kernel/v3.x/linux-3.16.3.tar.gz

kernel_version_list

 

 

次のコマンドでダウンロードします。

# cd /usr/src
# wget ftp://ftp.kddlabs.co.jp/011/Linux/kernel.org/linux/kernel/v3.x/linux-3.16.3.tar.gz

入手したアーカイブを解凍します。

# tar xvf linux-3.16.3.tar.gz

これで「/usr/src/linux-3.16.3」ディレクトリ以下に展開されました。

 

カーネルのコンフィグレーション

 

カーネルの設定を実施します。多くの設定項目があるので、今使っているカーネルの設定ファイルを流用することにします。

次のようにして設定をコピーします。

# cd /usr/src/linux-3.16.3
# cat /boot/config-uname -r > ./.config

コピーした設定は、古いカーネルのものなので、そのまま適用はできません。
以下のようにアップデートします。

# make oldconfig

基にしたファイルは、古いカーネルの設定なので、最新カーネルで追加された設定項目(「New」と表示されているもの)の箇所で止まります。

基本的に新しい設定項目はデフォルトを選択すれば問題ないので、そのまま「Enter」キーを押して進めます。

oldconfig_1

 

「Kernel compression mode」の圧縮モードの設定については必ず「1」を選択します。

 

カーネルパッケージの作成

 

コンフィグレーションを終えたらカーネルパッケージを作成します。

パッケージの作成には「make-kpkg」スクリプトを使います。

make-kpkgスクリプトを実行する前にビルド作業の効率を高めるように環境変数「CONCURRENCY_LEVEL」に値を設定します。

複数のCPUコアを持っている場合

# export CONCURRENCY_LEVEL=5

と「5」を設定します。

以上の設定を終えたらスクリプトを実行します。

# make-kpkg –initrd –append-to-version custom –revision 1.0 kernel_image kernel_headers

「–initrd」はDebianやUbuntuが起動時に使うファイルイメージシステム「initramfs」のイメージを作成する指定です。

現在のDebianやUbuntuではカーネルパッケージのインストール時にinitramfsが作られる仕組みになっているようです。

「–append-to-version」には、カーネルバージョンの末尾につけられる文字を指定します。

「–revision」でリビジョン番号を付与できます。

「kernel_image」を指定すると、カーネルのパッケージを「linux-image-バージョン番号_リビジョン番号_アーキテクチャ名.deb」のファイル名で作成します。

「kernel_headers」はヘッダーファイルのパッケージを「linux-headers-バージョン番号_リビジョン番号_アーキテクチャ名.deb」のファイルで作成します。

virtualBox環境で約1時間くらいかかりました。

 

新しいカーネルの導入をする

 

次のコマンドでパッケージをインストールします。

# dpkg -i /usr/src/linux-image-3.16.3custom_1.0_i386.deb
# dpkg -i /usr/src/linux-headers-3.16.3custom_1.0_i386.deb

これでインストールは完了です。

再起動して新しいカーネルで起動します。

# reboot

起動したら下記コマンドでカーネルバージョンを確認します。

# uname -r
3.16.3.costom

ちゃんと新カーネルで起動できているのが確認できました!

 

新機能の紹介

 

利用可能なメモリー量がすぐ確認できる

カーネル3.14で追加された機能で、「/proc/meminfo」ファイルで表示する情報を拡充したものです。

memory_available

 

 

サスペンドからの高速復帰

一定時間操作がない場合などに、主メモリー以外への電源供給を可能な限りカットした省電力モードへ移行します。

サスペンド状態から操作可能になるまでの時間(レジューム)が短くなりました。

 

圧縮RAMディスクの強化

メモリー圧縮機能zramが従来LZO(Lempel-Ziv-Oberhumer)だけの対応だった圧縮アルゴリズムが拡充され、「LZ4」の利用が可能になりました。圧縮・伸長処理を高速実行できるのが大きな特徴です。

 

kASLR機能でカーネルの安全性向上

カーネル3.14でkASLRというセキュリティ機能が追加されました。カーネル空間内のプログラムやデータの配置をカーネル起動のたびにランダムに変えることで、カーネルのセキュリティを破る攻撃を困難にする機能です。

 

まとめ

 

カーネルは様々な機器に対応できるように抽象化されています。モジュールというプログラムで機器を動的に認識できる仕組みになっています。

導入するのは以外と簡単なものでしたが、各機能を細かく見ていくと知らない単語が出てきたり難しいイメージがありました。

しかし、Linuxがどのように動いているのか、どのような機能を提供しているのかが理解できたような気がします。

 

  • このエントリーをはてなブックマークに追加
  • Pocket

SNSでもご購読できます。

コメントを残す

*