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

From Gentoo Wiki
< Kernel
Jump to:navigation Jump to:search
This page is a translated version of the page Kernel/Upgrade and the translation is 37% complete.
Outdated translations are marked like this.
Other languages:
Deutsch • ‎English • ‎Nederlands • ‎español • ‎français • ‎italiano • ‎português do Brasil • ‎русский • ‎中文(中国大陆)‎ • ‎日本語 • ‎한국어

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

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

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

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

Kernel upgrade in Gentoo involves these steps:

  • Step 1: Emerging the new kernel sources.
  • Step 2: Setting the right symlink to the new kernel.
  • Step 3: Moving to the new kernel's folder.
  • Step 4: Adjusting the .config file for the options introduced to, or removed from the new kernel's configuration.
  • Step 5: Building the kernel and the initramfs.
  • Step 6: Updating the bootloader.
  • Step 7: Removing or keeping the old kernel.


Important
It is wise to make a backup of the kernel configuration so that the previous configurations are not lost. Many users devote considerable time to figure out the best configuration for the system, and losing that information is definitely not wanted. One of the ways introduced in Copy the previous kernel configuration of this article can be used for making a backup of the configuration file.

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

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

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

設定

The kernel configuration is saved in a file named .config in the directory that holds the kernel sources, a symlink is used to point to that directory.

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

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

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

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

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

必要であれば、他の 2 個の方法のいずれかを使って、後から変更できます。

新しいフォルダへ移動

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

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

Adjusting the .config file for the new kernel

Copy the previous kernel configuration

古いカーネルの設定ファイルを新しいカーネルのフォルダに移動させなければなりません。先程/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ファイル

Note
Invoking make oldconfig and make menuconfig can be done automatically via genkernel in the build process by enabling the OLDCONFIG and MENUCONFIG parameters in /etc/genkernel.conf. If OLDCONFIG is enabled in genkernel's configuration or if it's going to be enabled by passing --oldconfig option to genkernel command, jump to the build section in this article.

古いカーネルの設定を新しいカーネルで使用する場合、設定を変換する必要があります。変換は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

Observing the difference

A diff tool can be used to compare the old and new .config files to see what options have been added:

user $diff <(cat .config | sort) <(cat .config.old | sort) | awk '/^<.*(=|Linux)/ { $1=""; print }'
CONFIG_64BIT_TIME=y
CONFIG_AMD_NB=y
CONFIG_ARCH_CLOCKSOURCE_INIT=y
CONFIG_ARCH_HAS_GIGANTIC_PAGE=y
CONFIG_ARCH_HAS_PTE_DEVMAP=y
CONFIG_ARCH_HAS_SET_DIRECT_MAP=y
CONFIG_ARCH_STACKWALK=y
CONFIG_ARCH_USE_MEMREMAP_PROT=y
CONFIG_BLK_PM=y
CONFIG_CC_CAN_LINK=y
CONFIG_CC_DISABLE_WARN_MAYBE_UNINITIALIZED=y
CONFIG_CC_HAS_ASM_INLINE=y
CONFIG_CC_HAS_KASAN_GENERIC=y
CONFIG_CC_HAS_WARN_MAYBE_UNINITIALIZED=y
CONFIG_CPU_SUP_AMD=y
CONFIG_CPU_SUP_HYGON=y
CONFIG_CPU_SUP_ZHAOXIN=y
CONFIG_CRYPTO_LIB_AES=y
CONFIG_CRYPTO_LIB_ARC4=y
CONFIG_CRYPTO_LIB_DES=y
CONFIG_CRYPTO_LIB_SHA256=y
CONFIG_DEBUG_MISC=y
CONFIG_DRM_I915_FORCE_PROBE=""
CONFIG_DRM_I915_SPIN_REQUEST=5
CONFIG_DRM_I915_USERFAULT_AUTOSUSPEND=250
CONFIG_DYNAMIC_EVENTS=y
CONFIG_EFI_EARLYCON=y
CONFIG_GCC_PLUGINS=y
CONFIG_GENERIC_GETTIMEOFDAY=y
CONFIG_HAVE_ARCH_JUMP_LABEL_RELATIVE=y
CONFIG_HAVE_ARCH_STACKLEAK=y
CONFIG_HAVE_ASM_MODVERSIONS=y
CONFIG_HAVE_EISA=y
CONFIG_HAVE_FAST_GUP=y
CONFIG_HAVE_FUNCTION_ARG_ACCESS_API=y
CONFIG_HAVE_GENERIC_VDSO=y
CONFIG_HAVE_MOVE_PMD=y
CONFIG_HAVE_PCI=y
CONFIG_INIT_STACK_NONE=y
CONFIG_IO_URING=y
CONFIG_KASAN_STACK=1
CONFIG_LEDS_TRIGGER_AUDIO=y
CONFIG_LSM="lockdown,yama,loadpin,safesetid,integrity"
CONFIG_MMC_SDHCI_IO_ACCESSORS=y
CONFIG_NETFILTER_XT_TARGET_MASQUERADE=m
CONFIG_NET_VENDOR_GOOGLE=y
CONFIG_NET_VENDOR_MICROCHIP=y
CONFIG_NET_VENDOR_PENSANDO=y
CONFIG_NET_VENDOR_XILINX=y
CONFIG_NF_NAT=m
CONFIG_NF_NAT_MASQUERADE=y
CONFIG_NVMEM_SYSFS=y
CONFIG_OPTIMIZE_INLINING=y
CONFIG_POWER_SUPPLY_HWMON=y
CONFIG_PROC_PID_ARCH_STATUS=y
CONFIG_SKB_EXTENSIONS=y
CONFIG_SND_INTEL_NHLT=y
CONFIG_UBSAN_ALIGNMENT=y
CONFIG_UNIX_SCM=y
CONFIG_USB_AUTOSUSPEND_DELAY=2
CONFIG_X86_ACPI_CPUFREQ_CPB=y
CONFIG_X86_MCE_AMD=y
# end of Gentoo Linux
# Linux/x86 5.4.0-gentoo Kernel Configuration

And which have been removed:

user $diff <(cat .config | sort) <(cat .config.old | sort) | awk '/^>.*(=|Linux)/ { $1=""; print }'
CONFIG_ANON_INODES=y
CONFIG_ARCH_DISCARD_MEMBLOCK=y
CONFIG_ARCH_HAS_SG_CHAIN=y
CONFIG_ARCH_HAS_ZONE_DEVICE=y
CONFIG_ARCH_SUPPORTS_OPTIMIZED_INLINING=y
CONFIG_ARM_GIC_MAX_NR=1
CONFIG_AUDIT_TREE=y
CONFIG_AUDIT_WATCH=y
CONFIG_BACKLIGHT_LCD_SUPPORT=y
CONFIG_CRYPTO_WORKQUEUE=y
CONFIG_DEFAULT_CFQ=y
CONFIG_DEFAULT_IO_DELAY_TYPE=0
CONFIG_DEFAULT_IOSCHED="cfq"
CONFIG_DEFAULT_SECURITY=""
CONFIG_DMA_DIRECT_OPS=y
CONFIG_FB_BACKLIGHT=y
CONFIG_GENERIC_HWEIGHT=y
CONFIG_HAVE_DEBUG_STACKOVERFLOW=y
CONFIG_HAVE_GENERIC_GUP=y
CONFIG_HAVE_MEMBLOCK=y
CONFIG_IA32_AOUT=y
CONFIG_INET6_XFRM_MODE_BEET=y
CONFIG_INET6_XFRM_MODE_TRANSPORT=y
CONFIG_INET6_XFRM_MODE_TUNNEL=y
CONFIG_INET_XFRM_MODE_TRANSPORT=y
CONFIG_INET_XFRM_MODE_TUNNEL=y
CONFIG_IO_DELAY_TYPE_0X80=0
CONFIG_IO_DELAY_TYPE_0XED=1
CONFIG_IO_DELAY_TYPE_NONE=3
CONFIG_IO_DELAY_TYPE_UDELAY=2
CONFIG_IOSCHED_CFQ=y
CONFIG_IOSCHED_NOOP=y
CONFIG_MAY_USE_DEVLINK=y
CONFIG_NO_BOOTMEM=y
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
CONFIG_X86_DEV_DMA_OPS=y
# Linux/x86 4.19.86-gentoo Kernel Configuration

Alternatively, the kernel provides a script to cleanly compare two config files even if the options have moved in the file itself:

user $/usr/src/linux/scripts/diffconfig .config.old .config

make menuconfig

The options can then be researched and changed if necessary by running:

root #make menuconfig

The menuconfig target is helpful because it safely handles kernel symbol dependency resolution.

ビルド

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-sources自動でカーネルビルドとインストールをする portage フック
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

Update the bootloader

The upgraded and built kernel needs to be set up and eventually a bootloader or boot item updated, see Kernel/Configuration#Setup. Users of Grub can use the method below, users of other bootloaders must consult the handbook.

After making sure /boot partition is mounted,

Using grub-mkconfig

The following command can be executed for updating grub's configuration file:

root #grub-mkconfig -o /boot/grub/grub.cfg

Using systemd-boot-gen to update systemd-boot UEFI configuration

Warning
Installing from the cargo, the Rust package manager, should be done at one's own risk. The Gentoo project cannot what is built from it and could contain security risks particularly at the bootloader level. This could mean installing a rootkit if compromised. Proceed with the following section with caution.

Manual installation of systemd-boot-gen:

user $cargo install systemd-boot-gen

Copy the kernel parameters to /etc/default/cmdline, the file should contain:

FILE /etc/default/cmdline
CMDLINE="<kernel command line parameters>"

And run it using root privileges:

user $sudo ~/.cargo/bin/systemd-boot-gen

This will generate the boot configuration in /boot/loader/entries/ for all the available /boot/vmlinuz-* that have a matching /boot/initramfs-*.

Keeping or removing the old kernel

Keeping the old kernel sources

Kernel sources will eventually become unsupported. Some packages require the current sources to build. To protect the new sources from being removed by a depclean, it can be added to the world file (/var/lib/portage/world) by:

root #emerge --noreplace sys-kernel/gentoo-sources:newsource.version.here

Old sources that are no longer supported can be removed from the world file by:

root #emerge --deselect sys-kernel/gentoo-sources:unwanted.version.here

削除

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

参考

外部資料