Ubuntu Weekly Recipe

第278回 Ubuntuカーネルとの付き合い方

この記事を読むのに必要な時間:およそ 7.5 分

コンピューター上でUbuntuを動かすために必要になるLinuxカーネルは,Ubuntuにおいてもっとも重要なコンポーネントです。今回はそんなLinuxカーネルとUbuntuの関係について説明します。

Ubuntuカーネルのことを知ろう

UbuntuはLinuxカーネルを使ったLinuxディストリビューションの1つです。どのようなマシンのうえでUbuntuが動作するか,どのようなデバイスをUbuntuで使えるかは,ひとえにカーネルに懸かっているために,Ubuntuではサポート期間やサポート対象,導入する新機能などを考慮したうえで,LinuxカーネルにUbuntu独自の変更を加えてリリースしています。

たとえば,現在Ubuntuで使われているカーネルのバージョンは,次のコマンドで確認できます。

$ uname -rv
3.8.0-25-generic #37-Ubuntu SMP Thu Jun 6 20:47:07 UTC 2013

カーネルとパッケージのバージョン

「半年ごと」というUbuntuのリリーススケジュールの関係で,Ubuntuの最新版で使われるカーネルのバージョンは「リリースの2ヵ月前ぐらいの最新版」になります。たとえば,2013年4月にリリースされたUbuntu 13.04で採用しているLinuxカーネルは,2013年2月にリリースされた3.8です注1)。

unameコマンドの結果を見ると「3.8.0-25-generic」と表示されていることがわかります。さらに実際にインストールされているパッケージ名は次のコマンドで確認できます。

$ dpkg -l | grep linux-image
ii  linux-image-3.8.0-19-generic          3.8.0-19.30    amd64    Linux kernel image for version 3.8.0 on 64 bit x86 SMP
ii  linux-image-3.8.0-23-generic          3.8.0-23.34    amd64    Linux kernel image for version 3.8.0 on 64 bit x86 SMP
ii  linux-image-3.8.0-25-generic          3.8.0-25.37    amd64    Linux kernel image for version 3.8.0 on 64 bit x86 SMP
ii  linux-image-extra-3.8.0-19-generic    3.8.0-19.30    amd64    Linux kernel image for version 3.8.0 on 64 bit x86 SMP
ii  linux-image-extra-3.8.0-23-generic    3.8.0-23.34    amd64    Linux kernel image for version 3.8.0 on 64 bit x86 SMP
ii  linux-image-extra-3.8.0-25-generic    3.8.0-25.37    amd64    Linux kernel image for version 3.8.0 on 64 bit x86 SMP
ii  linux-image-generic                   3.8.0.25.43    amd64    Generic Linux kernel image

カーネルバージョン「3.8.0-25-generic」に該当するパッケージの名前は「linux-image-3.8.0-25-generic」で,パッケージ自体のバージョンは「3.8.0-25.37」です。ここからカーネルのバージョンが「3.8.0」であるように見えますが,実際に使われているカーネルのバージョンと一致するのは「3.8」の部分だけです。安定版のリリース番号に相当する数字はここにはあらわれません注2)。

バージョンの「25.37」のうち,最初の数字は3.8ベースのカーネルパッケージをリリースしてから,「ABI(Application Binary Interface)が変更された回数」をあらわします。また,後ろの数字は「アップロード回数」をあらわします。「25.37」であれば,3.8ベースのカーネルパッケージを最初にリリースしてから,「25回のABIの変更が発生し,37回アップロードされた」ことを意味します。アップロード後にビルドされたあと,テストの段階で問題が見つかり,結局リリースされずにさらにABIの変更が発生するというケースもありますので,リポジトリにあるパッケージの数字が連続になるとは限りません。

Ubuntuの場合,一度リリースされると基本的に同じバージョンのカーネルを使い続けます。たとえば13.04で使用しているLinux 3.8は「3.8.13」のリリースによって,End Of Lifeを迎えました。しかし13.04は2014年1月までサポートを続ける必要があります注3)。そこでUbuntuでは,リリース後の安定版のアップデートに追随するとともに,その後EOLを迎えたカーネルであっても,Ubuntuのサポート期間の間はメインラインカーネルのセキュリティパッチや変更を取り込む形で対応しています。

そのため,Ubuntuのカーネルパッケージの更新回数と安定版のリリース回数は一致しません。現在のカーネルが,どの安定版のリリースまでの変更を取り込んでいるかは,次のコマンドで確認できます。

$ cat /proc/version_signature
Ubuntu 3.8.0-25.37-generic 3.8.13

さらに特筆すべきは,ABI番号が「パッケージ名」に含まれているために,ABIの変更を伴うカーネルは「新しいバージョン」ではなく「別パッケージ」として提供されているということです。これにより,アップデート後であっても古いカーネルをローカルストレージに残しておくことができます。たとえば,ABIの変更によって起動できなくなったとしても,ブートローダーで古いカーネルを選択すればとりあえず起動させることができるのです。

注1)
6ヵ月にわたる開発の初期段階で,Linuxカーネルのリリース時期をある程度予想したうえで,どのバージョンを使うかが仮決定されます。開発期間中はそのバージョンのRC版(存在しなければその1つ前の版)を使いつつ,不具合を洗い出して対応していくことになりますので,だいたいUbuntuのリリースより数ヵ月前にリリースされたものを使うことになります。ただし新機能の内容や次がLTSかどうかによって,多少の差はあります。
注2)
カーネル2.6の頃は「2.6.x」までがカーネルのバージョンで,その後ろに安定版のリリース番号がついて「2.6.x.y」という形になっており,Ubuntuは「2.6.x」ベースのカーネルを使っていることを示すために最初の3桁をパッケージ名とバージョンに含んでいました。「3.x.y」という表記になっても,「パッケージバージョンの場合はyの部分は常に0」という形でこの書式が残っているようです。
注3)
Ubuntu 13.04から,LTS以外のリリースのサポート期間が18ヵ月から9ヵ月に変更されました。

カーネルフレーバー

パッケージ名やカーネルバージョン「3.8.0-25-generic」にあらわれる「generic」をUbuntuでは「フレーバー(Flavour)」と呼びます。

カーネルには多種多様なConfigオプションがあり,コンピュータの用途によってオプションを変えたほうが利便性が高くなります。そのため,Configオプションを含めた用途の違うカーネルを「フレーバー」としてUbuntuは提供しているのです。たとえば以前は用意されていたPAEカーネルも,フレーバーの一種です。

既存のフレーバー一覧はWikiで確認することができます。ただし,Ubuntu 13.04の場合,x86 CPUでメインで使えるフレーバーは「generic」だけです。過去にはサーバ用の「server」や,仮想マシン上やクラウド環境上で使う「virtual」もありましたが,メンテナンスコストの問題から徐々に統合されていきました注4)。

唯一残っているのが,Ubuntu Studioで使われている「lowlatency」フレーバーです。しかしながらこのカーネルはUniverseであり,genericと比べると更新は遅れがちです。日常的な用途には使えないでしょう。リアルタイム性も含めたlowlatencyフレーバーについての詳しいことは,Wikiを参照してください

ARMカーネルの場合は,SoCによってベースとすべきカーネルツリーが異なることから,SoCごとにフレーバーがある状態です。ただし,13.04になってhighbankフレーバーがgenericに統合されるなど,少しずつ状況は変わってきています。

注4)
Ubuntu 12.04 LTSのサーバ版の場合は,インストールするとserverメタパッケージが選択されるかもしれません。しかしこれは,genericカーネルパッケージに依存している状態ですので,実際に使われるのはgenericフレーバーです。

Hardware Enablement(HWE)

Ubunutu 12.04 LTSは5年間のサポートが行われる長期サポート版です。より新しいハードウェアでもLTSを使えるように,もしくは既存のカーネルを使い続けられるように,HWEと後述のLBMという特殊な仕組みが用意されています。

HWE(Hardware Enablement)カーネルは,より新しいハードウェアでもLTSを使えるように用意されているLTS Enablement Stacksのカーネルです。簡単に言うと,LTS以降にリリースされたUbuntuで使われるカーネルを,LTSでも使えるようにしたものです。たとえば,Ubuntu 12.04 LTS以降では,現時点でLinuxカーネル3.5を使っている12.10(quantal)とLinuxカーネル3.8を使っている13.04(raring)がリリースされています。これらのバージョンのカーネルをLTSでも使えるようにしたのがHWEカーネルです注5)。

利用可能なHWEカーネルは次のコマンドで確認できます。

$ apt-cache search linux-generic-lts
linux-generic-lts-quantal - Generic Linux kernel image and headers
linux-generic-lts-quantal-eol-upgrade - Complete Generic Linux kernel and headers
linux-generic-lts-raring - Generic Linux kernel image and headers
linux-generic-lts-raring-eol-upgrade - Complete Generic Linux kernel and headers

ただし,HWEカーネルを使いたいだけであれば,上記をインストールするのではなく,「linux-hwe-generic」パッケージをインストールしてください注6)。このメタパッケージをインストールしておけば,適切なバージョンのパッケージを選択してインストールしてくれます。

LTSのポイントリリース注7であるUbuntu 12.04.2がリリースされた時点での「linux-hwe-generic」は,12.10のカーネルをインストールします。将来的にUbuntu 12.04.3がリリースされるころには「linux-hwe-generic」は13.04のカーネルをインストールするようになる予定です注8)。

HWEカーネルはUbuntu 12.04 LTSのポイントリリース時のインストールCDイメージの標準カーネルにもなります。Ubuntu 12.04リリース直後のCDイメージを使ってインストールした環境は,手動でHWEカーネルへの移行を行わなければポイントリリースを経たあともLinuxカーネル3.2を使い続けます。それに対して,12.10のHWEカーネルが用意された12.04.2のインストールCDを使った場合は「linux-hwe-generic」が指定する「linux-generic-lts-quantal」を標準のカーネルとして使うのです。

注5)
ちなみにHWEカーネルに対して,LTSリリース時のカーネルをGA(General Availability)カーネルと呼ぶことがあります。
注6)
linux-hwe-genericはカーネルイメージだけでなく,たとえば後述のDKMSなどで使用するカーネルヘッダーも一緒にインストールします。HWEカーネルのイメージだけインストールしたい場合は,「linux-image-hwe-generic」を直接指定すると良いでしょう。
注7)
LTSは約半年毎に,アップデートを適用済みのインストールCDをポイントリリースとして提供しています。2013年8月には次のポイントリリースである12.04.3が公開される予定です。
注8)
HWEとは別に,ポイントリリースに関係なく常に最新のリリースカーネルを指す「linux-current-generic」パッケージも存在します。

著者プロフィール

柴田充也(しばたみつや)

Ubuntu Japanese Team Member。数年前にLaunchpad上でStellariumの翻訳をしたことがきっかけで,Ubuntuの翻訳にも関わるようになりました。

コメント

コメントの記入