
Linux kernel release 4.x http://kernel.org/
これらは Linux バージョン 4 のリリースノートです。注意深くお読みください。これらは、これが何であるか、カーネルのインストール方法、問題が発生した場合の対処方法を説明しています。
LINUX とは何か?
Linux は、Unix オペレーティングシステムのクローンであり、Linus Torvalds がネット上の緩やかに結びついたハッカーチームの支援を受けてゼロから書きました。POSIX および Single UNIX Specification への準拠を目指しています。
真のマルチタスク、仮想メモリ、共有ライブラリ、デマンドローディング、共有コピーオンライト実行ファイル、適切なメモリ管理、IPv4 および IPv6 を含むマルチスタックネットワーキングなど、現代の本格的な Unix に期待されるすべての機能を備えています。
GNU General Public License の下で配布されています。詳細については、付属の COPYING ファイルを参照してください。
どのハードウェアで動作しますか?
当初は 32 ビット x86 ベースの PC(386 以上)向けに開発されましたが、現在では Linux は(少なくとも)Compaq Alpha AXP、Sun SPARC および UltraSPARC、Motorola 68000、PowerPC、PowerPC64、ARM、Hitachi SuperH、Cell、IBM S/390、MIPS、HP PA-RISC、Intel IA-64、DEC VAX、AMD x86-64、AXIS CRIS、Xtensa、Tilera TILE、AVR32、Renesas M32R アーキテクチャでも動作します。
Linux は、ページングメモリ管理ユニット(PMMU)と GNU C コンパイラ(gcc)(GNU Compiler Collection、GCC の一部)の移植が存在する限り、ほとんどの汎用 32 ビットまたは 64 ビットアーキテクチャに容易に移植可能です。Linux は PMMU のないいくつかのアーキテクチャにも移植されていますが、その場合機能は明らかにいくぶん制限されます。 Linux はそれ自身にも移植されています。現在ではカーネルをユーザースペースアプリケーションとして実行できます。これは UserMode Linux(UML)と呼ばれています。
ドキュメント:
インターネット上および書籍の両方で、電子的な形式と、Linux 固有のものと一般的な UNIX の質問に関するものの両方で、多くのドキュメントが利用可能です。LDP(Linux Documentation Project)の書籍については、任意の Linux FTP サイトのドキュメントサブディレクトリを調べることをお勧めします。この README はシステムのドキュメントを意図したものではありません。より優れた情報源が利用可能です。
Documentation/ サブディレクトリにはさまざまな README ファイルがあります。これらには通常、例えば一部のドライバ用のカーネル固有のインストールメモが含まれています。各ファイルに何が含まれているかのリストについては、Documentation/00-INDEX を参照してください。Changes ファイルを読んでください。カーネルをアップグレードすることによって生じる可能性のある問題に関する情報が含まれています。
Documentation/DocBook/ サブディレクトリには、カーネル開発者とユーザー向けのいくつかのガイドが含まれています。これらのガイドは、PostScript (.ps)、PDF、HTML、man ページなど、いくつかの形式でレンダリングできます。インストール後、"make psdocs"、"make pdfdocs"、"make htmldocs"、または "make mandocs" を実行すると、要求された形式でドキュメントがレンダリングされます。
カーネルソースのインストール:
完全なソースをインストールする場合は、カーネルの tarball を権限のあるディレクトリ(例:ホームディレクトリ)に置き、展開します:
xz -cd linux-4.X.tar.xz | tar xvf -
"X" を最新のカーネルのバージョン番号に置き換えてください。
/usr/src/linux/ 領域は使用しないでください!この領域には、(通常不完全な)ライブラリのヘッダファイルで使用されるカーネルヘッダのセットがあります。これらはライブラリと一致している必要があり、その時々のカーネルによって混乱させられるべきではありません。
また、パッチを適用して 4.x リリース間をアップグレードすることもできます。パッチは xz 形式で配布されています。パッチでインストールするには、新しいパッチファイルをすべて入手し、カーネルソースのトップレベルディレクトリ(linux-4.X)に入り、次のコマンドを実行します:
xz -cd ../patch-4.x.xz | patch -p1
"x" を現在のソースツリーのバージョン "X" よりも大きいすべてのバージョンに置き換えて、_順番に_実行すれば問題ありません。バックアップファイル(some-file-name~ または some-file-name.orig)を削除し、失敗したパッチ(some-file-name# または some-file-name.rej)がないことを確認することをお勧めします。もしあれば、あなたか私のどちらかが間違いを犯したことになります。
4.x カーネル用のパッチとは異なり、4.x.y カーネル用のパッチ(-stable カーネルとしても知られる)は増分的ではなく、ベースとなる 4.x カーネルに直接適用されます。例えば、ベースカーネルが 4.0 で 4.0.3 パッチを適用したい場合、最初に 4.0.1 および 4.0.2 パッチを適用してはいけません。同様に、カーネルバージョン 4.0.2 を実行していて 4.0.3 にジャンプしたい場合、最初に 4.0.2 パッチを逆適用(つまり patch -R)してから 4.0.3 パッチを適用する必要があります。これについて詳しくは Documentation/applying-patches.txt をご覧ください。
あるいは、スクリプト patch-kernel を使用してこのプロセスを自動化することもできます。これは現在のカーネルバージョンを判別し、見つかったパッチを適用します。
linux/scripts/patch-kernel linux
上記のコマンドの最初の引数はカーネルソースの場所です。パッチはカレントディレクトリから適用されますが、代替ディレクトリを 2 番目の引数として指定することもできます。
古い .o ファイルや依存関係が残っていないことを確認してください:
cd linux make mrproper
これでソースが正しくインストールされたはずです。
ソフトウェア要件
4.x カーネルのコンパイルと実行には、さまざまなソフトウェアパッケージの最新バージョンが必要です。必要な最小バージョン番号とこれらのパッケージの更新方法については、Documentation/Changes を参照してください。これらのパッケージの過度に古いバージョンを使用すると、追跡が非常に困難な間接的なエラーが発生する可能性があるため、ビルドまたは動作中に明らかな問題が発生した場合にパッケージを更新するだけでよいと仮定しないでください。
カーネルの BUILD ディレクトリ:
カーネルをコンパイルするとき、すべての出力ファイルはデフォルトでカーネルソースコードと一緒に保存されます。 "make O=output/dir" オプションを使用すると、出力ファイル(.config を含む)の代替場所を指定できます。 例:
カーネルソースコード: /usr/src/linux-4.X
ビルドディレクトリ: /home/name/build/kernel
カーネルを構成およびビルドするには、以下を使用します:
cd /usr/src/linux-4.X
make O=/home/name/build/kernel menuconfig
make O=/home/name/build/kernel
sudo make O=/home/name/build/kernel modules_install install
注意:'O=output/dir' オプションを使用する場合、make のすべての呼び出しで使用する必要があります。
カーネルの設定:
マイナーバージョンのみをアップグレードする場合でも、この手順をスキップしないでください。新しい設定オプションは各リリースで追加され、設定ファイルが期待どおりに設定されていないと、奇妙な問題が発生する可能性があります。既存の設定を最小限の労力で新しいバージョンに引き継ぎたい場合は、"make oldconfig" を使用してください。これにより、新しい質問に対する回答のみが求められます。
代替の設定コマンドは次のとおりです:
"make config" プレーンテキストインターフェース。
"make menuconfig" テキストベースのカラーメニュー、ラジオリスト、ダイアログ。
"make nconfig" 強化されたテキストベースのカラーメニュー。
"make xconfig" X windows (Qt) ベースの設定ツール。
"make gconfig" X windows (Gtk) ベースの設定ツール。
"make oldconfig" 既存の ./.config ファイルの内容に基づいてすべての質問をデフォルトにし、新しい設定シンボルについて尋ねます。
"make silentoldconfig" 上記と同様ですが、既に回答済みの質問で画面を散らかすのを避けます。 さらに依存関係を更新します。
"make olddefconfig" 上記と同様ですが、新しいシンボルをプロンプトなしでデフォルト値に設定します。
"make defconfig" アーキテクチャに応じて、arch/$ARCH/defconfig または arch/$ARCH/configs/${PLATFORM}_defconfig のデフォルトシンボル値を使用して ./.config ファイルを作成します。
"make ${PLATFORM}_defconfig" arch/$ARCH/configs/${PLATFORM}_defconfig のデフォルトシンボル値を使用して ./.config ファイルを作成します。 アーキテクチャで利用可能なすべてのプラットフォームのリストを取得するには、"make help" を使用します。
"make allyesconfig" シンボル値を可能な限り 'y' に設定して ./.config ファイルを作成します。
"make allmodconfig" シンボル値を可能な限り 'm' に設定して ./.config ファイルを作成します。
"make allnoconfig" シンボル値を可能な限り 'n' に設定して ./.config ファイルを作成します。
"make randconfig" シンボル値をランダムな値に設定して ./.config ファイルを作成します。
"make localmodconfig" 現在の設定とロードされたモジュール (lsmod) に基づいて設定を作成します。ロードされたモジュールに不要なモジュールオプションを無効にします。
別のマシン用の localmodconfig を作成するには、そのマシンの lsmod をファイルに保存し、LSMOD パラメータとして渡します。
target$ lsmod > /tmp/mylsmod
target$ scp /tmp/mylsmod host:/tmp
host$ make LSMOD=/tmp/mylsmod localmodconfig
上記はクロスコンパイル時にも機能します。
"make localyesconfig" localmodconfig と似ていますが、すべてのモジュールオプションを組み込み (=y) オプションに変換します。
Linux カーネル設定ツールの使用方法の詳細については、Documentation/kbuild/kconfig.txt を参照してください。
"make config" に関する注意:
不要なドライバがあるとカーネルが大きくなり、状況によっては問題を引き起こす可能性があります。存在しないコントローラカードをプローブすると、他のコントローラが混乱する可能性があります。
"Processor type" を 386 より高く設定してカーネルをコンパイルすると、386 では動作しないカーネルになります。カーネルは起動時にこれを検出し、停止します。
数学エミュレーションを組み込んでコンパイルされたカーネルは、コプロセッサが存在する場合には引き続きそれを使用します。その場合、数学エミュレーションは決して使用されません。カーネルは少し大きくなりますが、数学コプロセッサの有無にかかわらず、さまざまなマシンで動作します。
"kernel hacking" 設定の詳細は、通常、より大きなまたはより遅いカーネル(またはその両方)をもたらし、さらにルーチンを設定してカーネル問題を見つけるために悪いコードを積極的に壊そうとすることにより(kmalloc())、カーネルの安定性を低下させる可能性があります。したがって、"development"、"experimental"、または "debugging" 機能に関する質問にはおそらく 'n' と答えるべきです。
カーネルのコンパイル:
少なくとも gcc 3.2 が利用可能であることを確認してください。 詳細については、Documentation/Changes を参照してください。
このカーネルでは、a.out ユーザープログラムを引き続き実行できることに注意してください。
"make" を実行して、圧縮されたカーネルイメージを作成します。lilo がカーネルの makefile に適合するようにインストールされている場合は "make install" を実行することも可能ですが、最初に特定の lilo 設定を確認することをお勧めします。
実際のインストールを行うには、root である必要がありますが、通常のビルドでは root は必要ありません。root の名前をいたずらに使用しないでください。
カーネルの一部を `modules' として設定した場合は、"make modules_install" も実行する必要があります。
詳細なカーネルコンパイル/ビルド出力:
通常、カーネルビルドシステムはかなり静かなモード(ただし完全に無音ではない)で動作します。ただし、あなたや他のカーネル開発者がコンパイル、リンク、またはその他のコマンドをそのまま実行された状態で確認する必要がある場合があります。この場合は、"verbose" ビルドモードを使用します。これは "make" コマンドに "V=1" を挿入することで行います。例:
make V=1 all
ビルドシステムに各ターゲットの再ビルドの理由も伝えさせるには、"V=2" を使用します。デフォルトは "V=0" です。
問題が発生した場合に備えて、バックアップカーネルを手元に置いておいてください。これは特に開発リリースに当てはまります。各新リリースにはデバッグされていない新しいコードが含まれているためです。そのカーネルに対応するモジュールのバックアップも必ず保持してください。動作中のカーネルと同じバージョン番号の新しいカーネルをインストールする場合は、"make modules_install" を実行する前にモジュールディレクトリのバックアップを作成してください。
あるいは、コンパイル前にカーネル設定オプション "LOCALVERSION" を使用して、通常のカーネルバージョンに一意のサフィックスを追加します。LOCALVERSION は "General Setup" メニューで設定できます。
新しいカーネルを起動するには、カーネルイメージ(例:コンパイル後の .../linux/arch/i386/boot/bzImage)を通常の起動可能なカーネルがある場所にコピーする必要があります。
LILO などのブートローダの助けなしにフロッピーから直接カーネルを起動することは、もはやサポートされていません。
ハードドライブから Linux を起動する場合、/etc/lilo.conf ファイルで指定されたカーネルイメージを使用する LILO を使用している可能性が高いです。カーネルイメージファイルは通常 /vmlinuz、/boot/vmlinuz、/bzImage、または /boot/bzImage です。新しいカーネルを使用するには、古いイメージのコピーを保存し、新しいイメージを古いイメージの上にコピーします。次に、LILO を再実行してローディングマップを更新する必要があります!!これを行わないと、新しいカーネルイメージを起動できません。
LILO の再インストールは、通常 /sbin/lilo を実行することです。 新しいカーネルが動作しない場合に備えて、古いカーネルイメージ(例:/vmlinux.old)のエントリを /etc/lilo.conf に指定することもできます。詳細については LILO のドキュメントを参照してください。
LILO を再インストールした後は、準備完了です。システムをシャットダウンし、再起動してお楽しみください。
カーネルイメージ内のデフォルトのルートデバイス、ビデオモード、RAM ディスクサイズなどを変更する必要がある場合は、'rdev' プログラム(または適切な場合には LILO ブートオプション)を使用してください。これらのパラメータを変更するためにカーネルを再コンパイルする必要はありません。
新しいカーネルで再起動してお楽しみください。
問題が発生した場合:
カーネルのバグに起因すると思われる問題がある場合は、ファイル MAINTAINERS をチェックして、問題の発生しているカーネルの部分に関連する特定の人物がいるかどうかを確認してください。そこに誰もリストされていない場合は、次善の策として、私([email protected])にメールを送り、場合によっては他の関連するメーリングリストやニュースグループに送信してください。
すべてのバグレポートでは、必ず どのカーネルについて話しているのか、問題を再現する方法、および自分のセットアップは何かを(常識をもって)お知らせください。問題が新しいものであればそう伝え、問題が古いものであればいつ最初に気づいたかをお知らせください。
バグにより次のようなメッセージが表示された場合
unable to handle kernel paging request at address C0000010 Oops: 0002 EIP: 0010:XXXXXXXX eax: xxxxxxxx ebx: xxxxxxxx ecx: xxxxxxxx edx: xxxxxxxx esi: xxxxxxxx edi: xxxxxxxx ebp: xxxxxxxx ds: xxxx es: xxxx fs: xxxx gs: xxxx Pid: xx, process nr: xx xx xx xx xx xx xx xx xx xx xx
または同様のカーネルデバッグ情報が画面またはシステムログに表示された場合は、それを 正確に 複製してください。ダンプはあなたには理解できないように見えるかもしれませんが、問題のデバッグに役立つ情報が含まれています。ダンプの上のテキストも重要です。それは、カーネルがなぜコードをダンプしたかについて何かを伝えています(上記の例では、カーネルポインタの不良が原因です)。ダンプを理解するための詳細情報は Documentation/oops-tracing.txt にあります。
CONFIG_KALLSYMS を有効にしてカーネルをコンパイルした場合は、ダンプをそのまま送信できます。それ以外の場合は、"ksymoops" プログラムを使用してダンプを理解する必要があります(ただし、CONFIG_KALLSYMS を有効にしてコンパイルすることが通常は推奨されます)。このユーティリティは次の場所からダウンロードできます: ftp://ftp..kernel.org/pub/linux/utils/kernel/ksymoops/ 。 あるいは、ダンプのルックアップを手動で行うこともできます:
上記のようなデバッグダンプでは、EIP 値が何を意味するかを調べることが非常に役立ちます。16 進数値そのものは私や他の誰にもあまり役に立ちません。それは特定のカーネル設定に依存します。すべきことは、EIP 行から 16 進数値を取り出し("0010:" は無視)、カーネル名リストで調べて、どのカーネル関数が問題のアドレスを含むかを見つけることです。
カーネル関数名を見つけるには、症状を示したカーネルに関連付けられたシステムバイナリを見つける必要があります。これはファイル 'linux/vmlinux' です。名リストを抽出し、カーネルクラッシュからの EIP と照合するには、次のコマンドを実行します:
nm vmlinux | sort | less
これにより、昇順にソートされたカーネルアドレスのリストが表示され、そこから問題のアドレスを含む関数を簡単に見つけることができます。カーネルデバッグメッセージによって与えられるアドレスは、関数アドレスと正確に一致するとは限らないことに注意してください(実際、それは非常にまれです)。したがって、リストを単に 'grep' することはできません。ただし、リストは各カーネル関数の開始点を提供するため、検索中のアドレスよりも低い開始アドレスを持ち、その後に高いアドレスを持つ関数が続く関数を探すことで、目的の関数を見つけることができます。実際、問題レポートに少しの "コンテキスト" を含めて、興味のある行の周りの数行を提供することは良い考えかもしれません。
何らかの理由で上記の操作ができない場合(プリコンパイル済みのカーネルイメージなどがある場合)、セットアップについて可能な限り多くの情報を私に伝えることが役立ちます。詳細については REPORTING-BUGS ドキュメントをお読みください。
あるいは、実行中のカーネルで gdb を使用することもできます。(読み取り専用。つまり、値を変更したりブレークポイントを設定したりすることはできません。)これを行うには、まず -g フラグを付けてカーネルをコンパイルします。arch/i386/Makefile を適切に編集し、次に "make clean" を実行します。また、CONFIG_PROC_FS を有効にする必要があります("make config" を使用)。
新しいカーネルで再起動した後、"gdb vmlinux /proc/kcore" を実行します。これで、通常の gdb コマンドをすべて使用できます。システムがクラッシュしたポイントを調べるコマンドは "l *0xXXXXXXXX" です。(XXX を EIP 値に置き換えてください。)
現在、実行されていないカーネルでの gdb は、gdb が(誤って)カーネルがコンパイルされた開始オフセットを無視するため、失敗します。