1. 概要

このチュートリアルでは、Linuxカーネルを構成し、その oldconfigMakefileターゲットについて学習します。

2. Linuxカーネルのソースコードの取得

ご存知のとおり、Linuxカーネルは完全にオープンソースであり、そのソースコードはhttps://kernel.orgから入手できます。 執筆時点で、最新バージョンは 5.14.14。 でダウンロードしましょうカール

$ 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.xzcdを実行して、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のメニューと同様のメニューが表示されます。ここで、最後のオプションがカーネルバージョン間で変更され、(NEW)とマークされているため、その値を設定する必要があります。[X183X ]元の値を保持するため、変更されていないオプションを設定する必要はありません。 また、古い構成ファイルが新しいカーネルと完全に互換性がある場合は、プロンプトに応答する必要はありません。

これは、新しい/削除されたオプションだけでなく、依存関係の変更も処理します。たとえば、古いカーネルでCONFIG_FOOCONFIG_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内のさまざまなターゲットです。