LinuxカーネルMakefileの「Oldconfig」ターゲット
1. 概要
このチュートリアルでは、Linuxカーネルを構成し、その oldconfigMakefileターゲットについて学習します。
2. Linuxカーネルのソースコードの取得
ご存知のとおり、Linuxカーネルは完全にオープンソースであり、そのソースコードはhttps://kernel.orgから入手できます。 執筆時点で、最新バージョンは
$ curl -LO "https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.14.14.tar.xz"
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 115M 100 115M 0 0 2688k 0 0:00:43 0:00:43 --:--:-- 2831k
これで、 tar xflinux-5.14.14.tar.xzとcdを実行して、tarで抽出できます。
3. ビルドシステム
Linuxカーネルのビルドシステムは、主にmakeツールで使用されるMakefileを中心に展開されます。 トップレベルの。configファイルを介してさまざまなビルドオプションを構成します。 最上位のMakefileを使用して、makeターゲットを介して便利な方法でカーネルを構成および構築します。
4. カーネルの構成
さまざまな構成フロントエンドを使用してLinuxカーネルを構成し、構成オプションを簡単に検索できます。 この目的のために内部でKconfigファイルを使用します。
4.1. メニューベースのTUI
make menuconfig を実行することにより、インタラクティブなメニューベースのプログラムを介してカーネルを構成できます。
.config - Linux/x86 5.14.14 Kernel Configuration
───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌───────────────────────────────────────────────── Linux/x86 5.14.14 Kernel Configuration ─────────────────────────────────────────────────┐
│ Arrow keys navigate the menu. <Enter> selects submenus ---> (or empty submenus ----). Highlighted letters are hotkeys. Pressing <Y> │
│ includes, <N> excludes, <M> modularizes features. Press <Esc><Esc> to exit, <?> for Help, </> for Search. Legend: [*] built-in [ ] │
│ excluded <M> module < > module capable │
│ │
│ ┌──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐ │
│ │ General setup ---> │ │
│ │ [*] 64-bit kernel │ │
│ │ Processor type and features ---> │ │
│ │ Power management and ACPI options ---> │ │
│ │ Bus options (PCI etc.) ---> │ │
│ │ Binary Emulations ---> │ │
│ │ Firmware Drivers ---> │ │
│ │ [*] Virtualization ---> │ │
│ │ General architecture-dependent options ---> │ │
│ │ [*] Enable loadable module support ---> │ │
│ │ -*- Enable the block layer ---> │ │
│ │ IO Schedulers ---> │ │
│ │ Executable file formats ---> │ │
│ │ Memory Management options ---> │ │
│ │ [*] Networking support ---> │ │
│ │ Device Drivers ---> │ │
│ │ File systems ---> │ │
│ │ Security options ---> │ │
│ │ -*- Cryptographic API ---> │ │
│ │ Library routines ---> │ │
│ └────────────────────────────────v(+)──────────────────────────────────────────────────────────────────────────────────────────────────┘ │
├──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┤
│ <Select> < Exit > < Help > < Save > < Load > │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
上部の凡例を使用してさまざまな記号の意味を識別し、スペースを押して機能を切り替え、矢印キーを使用してメニューをナビゲートします。
さらに、 nconfigという名前の同様のメニューを見つけることができます。これは、あいまい検索を提供し、UIが暗いです。
4.2. 平文メニュー
make configを使用して、基本的なプロンプトベースのメニューからカーネルを構成することもできます。機能を有効にするには、Yなどのさまざまなオプションに答える必要がありますN を使用して無効にし、 m を使用して、可能であればモジュールとしてビルドします。
$ make config
HOSTCC scripts/kconfig/conf.o
HOSTLD scripts/kconfig/conf
*
* Linux/x86 5.14.14 Kernel Configuration
*
*
* General setup
*
Compile also drivers which will not load (COMPILE_TEST) [N/y/?] y
Local version - append to kernel release (LOCALVERSION) []
Build ID Salt (BUILD_SALT) []
Kernel compression mode
> 1. Gzip (KERNEL_GZIP)
2. Bzip2 (KERNEL_BZIP2)
3. LZMA (KERNEL_LZMA)
4. XZ (KERNEL_XZ)
5. LZO (KERNEL_LZO)
6. LZ4 (KERNEL_LZ4)
7. ZSTD (KERNEL_ZSTD)
choice[1-7?]: 5
Default init path (DEFAULT_INIT) []
Default hostname (DEFAULT_HOSTNAME) [(none)]
Support for paging of anonymous memory (swap) (SWAP) [Y/n/?] Y
これは非常に面倒な作業になる可能性があるため、ほとんどの人はmenuconfigアプローチを好みます。
4.3. 自動生成された構成
さまざまなターゲットから構築する構成を自動的に生成できます。
- defconfig – x86_64システムのarch/ x86 / configs / x86_64_defconfig など、事前定義されたルールから現在のアーキテクチャのデフォルト構成を生成します。
- localmodconfig –現在のカーネルの構成とロードされたモジュールに基づいて構成を生成し、不要なモジュールを無効にします。
- localyesconfig – localmodconfig に似ていますが、すべてのモジュール( m )オプションを組み込み( = y )に変更します。
5. oldconfigターゲット
oldconfig ターゲットは、既存の.configファイルを更新して新しいカーネルで動作するようにします。 古いカーネルの構成ファイルを新しいもので使用したい場合は、これが必要になる可能性があります。実行中のカーネルの構成ファイルで makeoldconfigを実行してみましょう。
$ gzip -dc /proc/config.gz > .config
$ make oldconfig
*
* Restart config...
*
*
* General setup
*
Compile also drivers which will not load (COMPILE_TEST) [N/y/?] n
Local version - append to kernel release (LOCALVERSION) []
...
uselib syscall (USELIB) [N/y/?] n
Auditing support (AUDIT) [N/y/?] n
Core Scheduling for SMT (SCHED_CORE) [N/y/?] (NEW)
/proc/config.gzにある圧縮カーネル構成をgzipで抽出し、-cフラグを使用してstdoutに書き込みました。 。 これで、 makeconfigのメニューと同様のメニューが表示されます。
これは、新しい/削除されたオプションだけでなく、依存関係の変更も処理します。たとえば、古いカーネルでCONFIG_FOOがCONFIG_BARを必要とした場合を解決します。ただし、CONFIG_BAZも必要になります。
make olddefconfigを使用して、新しいオプションをデフォルト値に設定することもできます。 プロンプトは表示されません。
6. 構成オプションがありません
.config ファイルでオプションが無効になっている場合、 CONFIG_FOO = n や#CONFIG_FOOが設定されていないなどの行が見つかります。 依存関係が満たされていないオプションは完全に省略されます。 CONFIG_DEBUG_INFOを必要とするシンボルDEBUG_INFO_REDUCEDがあるとします– DEBUG_INFO_REDUCED が無効になっている場合、ファイルに表示されません。
$ grep CONFIG_DEBUG_INFO .config
# CONFIG_DEBUG_INFO is not set
$ grep DEBUG_INFO_REDUCED .config # No matches
ここで、 CONFIG_DEBUG_INFO =yを設定してmakeoldconfig を実行すると、上記のオプションの入力を求められます。
Compile the kernel with debug info (DEBUG_INFO) [Y/n/?] y
Reduce debugging information (DEBUG_INFO_REDUCED) [N/y/?] (NEW)
7. 結論
この記事では、Linuxカーネルの構成について説明しました。ビルドシステムの概要と、Makefile内のさまざまなターゲットです。