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

From Gentoo Wiki
< Kernel
Jump to: navigation, search
This page is a translated version of the page Kernel/Upgrade and the translation is 50% complete.

Other languages:
Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎italiano • ‎português do Brasil • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

この記事は新しいバージョンのLinuxカーネルにアップグレードすることについて説明しています。

インストール

新しいカーネルのソースがインストールされたときは、カーネルを更新するといいかもしれません。新しいカーネルのソースは、次のコマンドでシステムを更新するときにインストールされることがあります。

root #emerge --ask --update --deep --with-bdeps=y --newuse @world

勿論、次のコマンドを使って直接インストールすることが可能です("gentoo-sources"を現在使用しているカーネルのパッケージに変えてください):

root #emerge --ask --update --deep --with-bdeps=y --newuse sys-kernel/gentoo-sources

新しいカーネルのソースをインストールしても、新しいカーネルが提供されるわけではありません。新しいソースから新しいカーネルを組み立てて、インストールして、実際に新しいカーネルを稼働させるためにシステムを再起動する必要があります。

新しいソースから新しいカーネルを作成する作業は、システムをインストールするときにカーネルを作成したときと基本的には同じ流れです。異なる点は、新しいカーネルのコンフィグを作るのに古いカーネルのコンフィグを利用できるという点です。古いコンフィグを利用すれば、ユーザは make menuconfig などを使ってすべてのカーネルオプションを再度設定しなおさずに済みます。

カーネルコンフィグは、カーネルソースがあるディレクトリの下の .config という名前のファイルに保存されています。新しいカーネルは、古いカーネルにはないオプションや機能を備えていることや、古いカーネルにあったオプションや機能がなくなっていることがあります。カーネルコンフィグは、カーネルの機能やオプションが、有効か無効か、カーネルに組み込まれるか、カーネルの稼働中に必要に応じてロードできるモジュールとして構築されるかを指定するものです。したがって、新しいカーネルのコンフィグファイルには、古いカーネルのコンフィグファイルには無い新しいエントリがあったり、古いカーネルのコンフィグファイルにあったエントリがなくなっていたりすることがあります。

こうしたコンフィグファイルの変更に対応するために、古いカーネルのコンフィグファイルを新しいカーネルで使えるコンフィグに変換する必要があります。この記事では、古いカーネルのコンフィグファイルを変換して、新しいカーネルソースから新しいカーネルを作成する方法について示します。

現在のカーネル設定のバックアップ

以前の設定ファイルをなくさないよう、カーネル設定のバックアップを取ることが賢明です。だって、多くのユーザーがシステムにとって最良な設定を探すのにかなりの時間を掛けていますし、設定情報を失うのは望んでいないですからね。

現在のカーネル設定のバックアップを取ることは簡単です:

root #cp /usr/src/linux/.config ~/kernel-config-`uname -r`

カーネルソースまでのシンボリックリンクが正しくセットされているとするならば、このコマンドは現在使用されているカーネルの設定ファイルをrootのホームディレクトリに、kernel-config-の後に現在のLinuxカーネルのバージョンが続く名前に変更してコピーします。

設定

新しいカーネルソースへのシンボリックリンク設定

/usr/src/linux のシンボリックリンクは常に、現在使用中のカーネルソースが入っているディレクトリへ張られるべきです。このシンボリックリンクを張るのは、以下の3つの方法のいずれかで可能です。

  1. USE="symlink"としてカーネルソースをインストールする
  2. eselectでリンクをセットする
  3. 手動でシンボリックリンクを更新する

symlinkのUSEフラグを有効にしてカーネルソースをインストール

これによって/usr/src/linuxのリンク先が、新しくインストールされるカーネルソースになります。

If necessary, it can still be modified later with one of the other two methods.

eselectを使った設定

eselectによるシンボリックリンクの設定

root #eselect kernel list
Available kernel symlink targets:
 [1] linux-3.14.14-gentoo *
 [2] linux-3.16.3-gentoo

利用可能なカーネルソースが出力されており、*が現在使われているソースを表しています。

カーネルソースを2番に変えるには次のようにします :

root #eselect kernel set 2

シンボリックリンクの手動更新

シンボリックリンクを手動で設定するならば、次のコマンドを実行してください:

root #ln -sf /usr/src/linux-3.16.3-gentoo /usr/src/linux
root #ls -l /usr/src/linux
lrwxrwxrwx 1 root root 19 Oct  4 10:21 /usr/src/linux -> linux-3.16.3-gentoo

新しいフォルダへ移動

シンボリックリンクが更新されたので、作業ディレクトリを新しいカーネルのフォルダに移動しましょう。

root #cd /usr/src/linux
Note
このコマンドはもしシンボリックリンクが変更された時、作業ディレクトリが既に/usr/src/linuxであっても必要です。新しいシンボリックリンクに実際に従うまでは、コンソールは"古い"カーネルのディレクトリに居続けます。

現行のカーネル設定のコピー

古いカーネルの設定ファイルを新しいカーネルのフォルダに移動させなければなりません。先程/rootに保存したバックアップに加えて、古い設定ファイルはいくつかの場所にあります。

  • procfsファイルシステムの場合、カーネルのオプションEnable access to .config through /proc/config.gz (CONFIG_IKCONFIG_PROC)が前のカーネルで有効になっている場合:
root #zcat /proc/config.gz > /usr/src/linux/.config
  • 古いカーネルから。これは古いカーネルがCONFIG_IKCONFIGを有効にしてコンパイルされている場合のみ有効です:
root #/usr/src/linux/scripts/extract-ikconfig /path/to/old/kernel >/usr/src/linux/.config
  • 設定が/bootにインストールされている場合:
root #cp /boot/config-3.14.14-gentoo /usr/src/linux/.config
  • 現在使用されているカーネルのディレクトリの中:
root #cp /usr/src/linux-3.14.14-gentoo/.config /usr/src/linux/
  • もし/etc/genkernel.conf内でSAVE_CONFIG="yes"と設定され、過去にgenkernelを使用していた場合、/etc/kernels/ディレクトリの中:
root #cp /etc/kernels/kernel-config-x86_64-3.14.14-gentoo /usr/src/linux/.config

.configファイル

古いカーネルの設定を新しいカーネルで使用する場合、設定を変換する必要があります。変換はmake silentoldconfigmake olddefconfigを実行することで可能です。どちらかを使用してください、両方ではありません。

make silentoldconfig

Important
make silentoldconfigはlinuxバージョン4.19より削除され、make syncconfigに取って代わられます。

The following configuration is like the text based configuration with make config. For new configuration options, the user is asked for a decision. For example:

root #cd /usr/src/linux
root #make silentoldconfig
Anticipatory I/O scheduler (IOSCHED_AS) [Y/n/m/?] (NEW)

最後の(NEW)は、このオプションが新しいオプションであることを示しています。左の角括弧内の文字は選択可能な設定です:Yes、no、module,あるいは?を入力してヘルプを表示します。推奨される(すなわちデフォルトの)設定は大文字で表示されます(ここではY)。ヘルプではオプションやドライバの説明がされます。

残念ながら、make silentoldconfigはそれぞれのオプションに対して例えば背景など、よりたくさんの情報を示してくれません。従って正しい選択をすることが難しい場合がたまにあります。この場合、オプションの名前を覚えておいて、グラフィカルなカーネル設定ツールを使用してあとで直す方法が最も良いです。

make olddefconfig

もし、すべての新しい設定オプションを推奨される(すなわちデフォルトの)値に設定する場合、make olddefconfigを使用してください。

root #cd /usr/src/linux
root #make olddefconfig

make help

他の利用可能な変換方法を見るには、make helpを実行してください:

root #make help

ビルド

Important
もし外部カーネルモジュール(例えばnvidiaやzfs)がインストールされているならば、カーネルをビルドする前に 下で説明されているようにmake modules_prepareを実行することが必要かもしれません。一部のモジュールはカーネルがビルドされる前にインストールや準備をすることができません。
Important
新しいカーネルのファイル名を参照させるためにブートローダーを再設定することを忘れないでください。そして、もしinitramfsを使用していた場合、こちらも同様に再設定することを忘れないでください。

このステップに関しては、ビルドのページに従ってください。

自動ビルドとインストール

Portageフックで新しくemergeされたカーネルを自動でビルド、インストールすることが可能です。他の方法も可能ですが、以下ではgenkernelとgentoo-sourcesパッケージをベースとしています。以下の条件を満たす必要があります:

  1. genkernel all is able to build and install the kernel to which the /usr/src/linux symlink points into $BOOTDIR and the bootloader.
  2. The symlink use flag is set for the kernel ebuild.

If those are fulfilled, simply install a post_pkg_postinst Portage hook as shown below.

FILE /etc/portage/env/sys-kernel/gentoo-sourcesAutomated kernel build and installation portage hook
post_pkg_postinst() {
	CURRENT_KV=$(uname -r)
	# Check to see if genkernel has been run previously for the running kernel and use that config
	if [[ -f "${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" ]] ; then
		genkernel --kernel-config="${EROOT}/etc/kernels/kernel-config-${CURRENT_KV}" all
	elif [[ -f "${EROOT}/usr/src/linux-${CURRENT_KV}/.config" ]] ; then # Use latest kernel config from current kernel
		genkernel --kernel-config="${EROOT}/usr/src/linux-${CURRENT_KV}/.config" all
	elif [[ -f /proc/config.gz ]] ; then # Use known running good kernel
		zcat /proc/config.gz >> "${EROOT}/tmp/genkernel.config"
		genkernel --kernel-config="${EROOT}/tmp/genkernel.config" all
		rm "${EROOT}/tmp/genkernel.config"
	else # No valid configs known
		genkernel all
	fi
}

外部のカーネルモジュールの再インストール

Note
もしカーネル全体をビルドするのなら、modules_prepareは必要ありません。この機能は通常のプロセスの一部だからです。

例えばバイナリカーネルモジュールのようなすべての外部カーネルモジュールは、それぞれの新しいカーネルに対して再ビルドされる必要があります。もしまだカーネルをビルドしていないのならば、外部カーネルモジュールのビルドのためにカーネルを準備しなければなりません。

root #make modules_prepare

カーネルモジュールを含むパッケージは@module-rebuildをセットすることで再ビルドできます:

root #emerge --ask @module-rebuild

ビルドの問題の解決

もし、現在のカーネルの再ビルド中に問題が発生したのであれば、カーネルソースをきれいにすることが役に立つかもしれません。初めに.configファイルのバックアップを取ることを忘れないでください。以下のコマンドはこのファイルを削除するからです。.bak~をファイル名の後ろにつけないでください。make distcleanはこれらの拡張子や接尾辞を持つファイルも削除するからです。

root #cp .config /usr/src/kernel_config_bk
root #make distclean
root #mv /usr/src/kernel_config_bk .config

削除

kernel removalを参照してください。

参考

外部資料