Ubuntu Weekly Recipe

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

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

カーネルとの健全なお付き合い

Ubuntuが動いているということは,つまりカーネルが動いているということです。よってユーザはUbuntuと同じ時間,カーネルとも付き合うことになります。⁠より良いお付き合い」をするためにも,日々の作業で何かあったときに役に立ちそうな情報を把握しておきましょう。

カーネルのアップグレード

カーネルに限らずパッケージのアップグレードは重要です。デスクトップユーザーであれば「ソフトウェアの更新」が表示されたら,できるだけ早い段階で更新を適用しましょう。カーネルがアップグレードされる場合も,同じ手順で問題ありません。カーネルが更新されたときは再起動も促されるので,その指示に従ってください注9⁠。

図1 再起動が必要な場合は,更新後にこのようなダイアログが表示される

図1 再起動が必要な場合は,更新後にこのようなダイアログが表示される

CUIからアップグレードするユーザの場合は注意が必要です。カーネルのABIが変更されたときは,よく使う「apt-get upgrade」ではカーネルのアップグレードをできないのです。これは「upgrade」コマンドがパッケージの更新を行うのに対して,ABIの変更時は前述のとおりパッケージ名が変わることから,⁠新しいパッケージの追加」が必要になるためです。

コマンドラインからカーネルのABIの変更を伴うアップグレードを行う場合は,次のように「dist-upgrade」コマンドを実行します。

$ sudo apt-get update
$ sudo apt-get dist-upgrade

アップグレードが完了したら,やはり再起動を行ってください注10⁠。

注9)
アップグレードを実行する「前に」再起動が必要かどうかを通知してくれる手段は今のところ存在しません。再起動が必要なパッケージに対しては,パッケージのメタデータにその旨を記述して,⁠ソフトウェアの更新」から再起動が必要かどうかを事前に判断する仕組みを作る話は存在しますので,将来的には実装されるかもしれません。
注10)
カーネルに限らずアップグレードすることで再起動が必要になるパッケージは,インストール後の処理によって,/var/run/reboot-requiredに「システムの再起動が必要です」というメッセージが,/var/run/reboot-required.pkgsに再起動を要求するパッケージのリストが追記されます。Ubuntuの場合は,MOTDに/var/run/reboot-requiredを出力しますし,byobuを使っているとステータスラインの右下に再起動要求アイコンが表示されます。

古いカーネルの削除

dist-upgradeで新しくカーネルパッケージを追加し,起動も問題なく行えることを確認できたら,古いカーネルパッケージは不要になります。個別にパッケージ名を指定してアンインストールすることも可能ですが,⁠autoremove」コマンドを使うことで,不要になったカーネルパッケージを一括削除できます。

$ sudo apt-get autoremove
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下のパッケージは「削除」されます:
  linux-headers-3.2.0-41 linux-headers-3.2.0-41-generic linux-image-3.2.0-41-generic
アップグレード: 0 個,新規インストール: 0 個,削除: 3 個,保留: 0 個。
この操作後に 217.2 MB のディスク容量が解放されます。
続行しますか [Y/n]?

autoremoveで削除されるのは,原則としてアップグレード時点で使用中ではなく,最新でもないカーネルです。少なくとも,2つのバージョンは削除せずにそのまま残すようになっています。autoremoveされないカーネルのバージョンは,/etc/apt/apt.conf.d/01autoremove-kernelsファイルで確認できます。このファイルはカーネルのインストールやアップグレードごとに,自動的に生成されます。

カーネルの削除は,とくにUbuntu ServerでLVMを使用する場合は注意が必要です。標準のパーティションレイアウトだと/bootが256Mバイト程度の別パーティションとして設定されます。カーネルはデータサイズが大きく,古いカーネルが残ったままだと10回ぐらいのアップグレードで/bootを使いきってしまいます。不要なカーネルを定期的に削除する習慣を付けておきましょう。

ちなみに,自動的なアップグレードUnattended Upgradeを有効にしている場合,自動的にアップグレードされたカーネルはautoremoveによる自動削除の対象にならない不具合が存在します注11⁠。自動的なアップグレードを使っている場合は,面倒ではありますが手動で不要になったカーネルパッケージを削除してください。

注11)
autoremoveは,apt-getコマンドでインストールしたとき,依存関係に従って間接的にインストールされたパッケージ(autoマークが付いているパッケージ)のうち,依存関係上必要なくなったパッケージのみを削除します。インストールする対象に直接指定したパッケージ(manualマークが付いているパッケージ)は削除の対象としません。言い換えると,autoremoveで削除されたくないパッケージがあるなら,インストール後であっても明示的に「sudo apt-get install パッケージ名」を実行することで,autoからmanualへマークを変更することができます。今回の不具合は,自動的なアップグレードでインストールされたパッケージは,常にmanualマークが付いたままになるというものです。ちなみにautoマークが付いているパッケージ一覧は「apt-mark showauto」で,manualマークが付いているパッケージ一覧は「apt-mark showmanual」で確認できます。

カーネルモジュールの更新

ハードウェアの種類によっては,デバイスドライバとして別途カーネルモジュールを要求することがあります。Linuxカーネル付属のモジュールであればカーネルパッケージと一緒にインストールされますし,プロプライエタリなグラフィックスドライバのようなサードパーティのモジュールであれば別途パッケージが用意されるか,自分でビルドしてインストールする必要があります。

これらのカーネルモジュールは,カーネルの更新によってABIが変更されたときは,その変更に追随するようリビルドする必要があります。Linuxカーネル付属のモジュールなら,カーネルの更新に合わせて,ビルド済みモジュール一式も提供されるので注意する必要はないでしょう。

サードパーティのモジュールについてはカーネルの更新後にリビルドを行う必要があります。といっても,アップグレードがあるたびに逐一「make; sudo make install」とするのは不便ですし,数が増えると作業漏れも発生するかもしれません。そこでこの作業を自動化するために「DKMS(Dynamic Kernel Module Support⁠⁠」システム用意されています。DKMSに対応すると,カーネルパッケージが更新されるたび,その直後にDKMS対応のモジュールを一通りリビルドしてくれます。

リポジトリにあるグラフィックスドライバパッケージなどはDKMSに対応済みです。パッケージがDKMSに対応しているかどうかは,dkmsパッケージに依存しているかどうかで判断すると良いでしょう。もし自分が使っているカーネルモジュールをDKMSに対応させたい場合は,DKMSのドキュメントを参照してください。

無線LANデバイスのような,入れ替わりの激しいデバイスについては,⁠新しいLinuxカーネルのソースツリーに含まれるモジュール」をより古いカーネルでもビルドして使いたい場合があるでしょう。そのような要望のために,LTSにはLBM(Linux Backports Modules)と呼ばれるモジュールパッケージが存在します注12⁠。

Ubuntu 12.04 LTS上で「apt-cache search linux-backports-modules」で検索すると大量のパッケージが引っかかるかと思います。おもな命名規則は次のとおりです。

linux-backports-modules-(モジュール名)-(ベースカーネル)-(LTSカーネル)-(フレーバー)

モジュール名は「cw(compat-wireless,無線LAN⁠⁠」や「net(Ethernetカード⁠⁠」などが存在します。ベースカーネルが新しいカーネル側のバージョンで,LTSカーネルとフレーバーが現在使っているカーネルのバージョンとフレーバーになります。ベースカーネルについては,モジュールによっては省略されます。たとえば,⁠linux-backports-modules-cw-3.8-3.2.0-43-generic」「3.8カーネルの無線LANモジュールを,3.2.0-43パッケージのgenericフレーバー用にビルドしたもの」と解釈できます。

ただし,LTSカーネル部分はカーネルの更新によって値が変わるので,LBMを使う場合は上記のパッケージではなく,最新のLTSカーネルを指している「linux-backports-modules-cw-3.8-precise-generic」などをインストールするようにしてください。

注12)
12.10までは通常のリリースにもLBMが用意されていましたが,サポート期間やメンテナンスとメリットを考慮したうえで,13.10からはLTSのみLBMを提供することになりました。

著者プロフィール

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

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