Linux

【PC】Linuxビルドのノウハウ ⑥カーネルコンフィギュレーションを変更してみる、カーネルのMakefileを開いてみる

【※ 当記事は2020年7月2日時点の情報です】

ペイヴメント(@pavement1234)です。

エンジニア
エンジニア

Linuxのカーネルビルドの方法を知りたいけど簡単にまとめられた情報源がない

こんな悩みを解決します。

今回やることは2つ。

  1. カーネルコンフィギュレーションを変更してみる
  2. カーネルのMakefileを開いてみる

バージョン情報

Linux Kernel 3.14

 

カーネルコンフィギュレーションを変更してみる

①まず.configをバックアップ

元の設定に戻せるようにバックアップ。

$ cd /usr/src/linux-3.14.79
$ cp .config .config_backup

②階層を掘ってみる

まずカーネルコンフィギュレーションメニューを開きます。

$ cd /usr/src/linux-3.14.79
$ make menuconfig

初回メニュー構築に時間がかかりますが、2回目以降は瞬時に開きます。

画面上部にメニューの設定方法が書いてあります。

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 [ ] <M> module
< > module capable

例えば、64-bit kernelが選択された状態で ? を入力すると、コンフィギュレーションの詳細情報が見れます。

そして、いつかやりたいと思っていたカーネルコンフィギュレーションの階層を全て見るをやってみました。networkとdriverが想像を超える量でした。

③カーネルコンフィギュレーションを変更してみる

色々変えるのは、そのうち試すとして、今回は2箇所変更して保存する手順をやってみます。

先ほどと同様にカーネルコンフィギュレーションメニューを開きます。

$ cd /usr/src/linux-3.14.79
$ make menuconfig

先頭の[*] 64-bit kernelを選択した状態でスペースを押すと…。

[ ] 64-bit kernelという具合に選択が解除されます。

次に< > Intel System On Chip IOSF Sideband supportを選択した状態でスペースを1回押すと…。

<M> Intel System On Chip IOSF Sideband supportという具合にローダブルモジュールになります。もう1回スペースを押すと…。

<*> Intel System On Chip IOSF Sideband supportになります。

右を押して<Exit>にカーソルを合わせ、エンターキーを押すと…。

保存するか聞いてくるので<Yes>にカーソルが合った状態でエンターを押します。

コンソールに戻ります(make menuconfigから抜けます)。

今保存した.config.config_backupを比較すると、CONFIG_64BITがOFFになりCONFIG_X86_32がyになるなど、色々変更されていることがわかります。

$ diff .config .config_backup
5,6c5,6
< # CONFIG_64BIT is not set
< CONFIG_X86_32=y

> CONFIG_64BIT=y
> CONFIG_X86_64=y
9,10c9,10
< CONFIG_OUTPUT_FORMAT=”elf32-i386″
< CONFIG_ARCH_DEFCONFIG=”arch/x86/configs/i386_defconfig”

> CONFIG_OUTPUT_FORMAT=”elf64-x86-64″
> CONFIG_ARCH_DEFCONFIG=”arch/x86/configs/x86_64_defconfig”
18a19
> CONFIG_GENERIC_BUG_RELATIVE_POINTERS=y
33,34c34,35
< # CONFIG_ZONE_DMA32 is not set
< # CONFIG_AUDIT_ARCH is not set
(以下略)

カーネルコンフィギュレーションの変更を元に戻すため、バックアップファイルを復元して終わりました。

カーネルのMakefileを開いてみる

make installなどmakeのオプションをもっと調べたいと考え、カーネルソースコードに含まれるMakefileを開いてみました。

1490行もあり全部を真剣に見るのはツライので、HELPを表示してみました。こまったらコレを見ます。

$ make help
Cleaning targets:
clean – Remove most generated files but keep the config and
enough build support to build external modules
mrproper – Remove all generated files + config + various backup files
distclean – mrproper + remove editor backup and patch files

Configuration targets:
config – Update current config utilising a line-oriented program
nconfig – Update current config utilising a ncurses menu based program
menuconfig – Update current config utilising a menu based program
xconfig – Update current config utilising a QT based front-end
gconfig – Update current config utilising a GTK based front-end
oldconfig – Update current config utilising a provided .config as base
localmodconfig – Update current config disabling modules not loaded
localyesconfig – Update current config converting local mods to core
silentoldconfig – Same as oldconfig, but quietly, additionally update deps
defconfig – New config with default from ARCH supplied defconfig
savedefconfig – Save current config as ./defconfig (minimal config)
allnoconfig – New config where all options are answered with no
allyesconfig – New config where all options are accepted with yes
allmodconfig – New config selecting modules when possible
alldefconfig – New config with all symbols set to default
randconfig – New config with random answer to all options
listnewconfig – List new options
olddefconfig – Same as silentoldconfig but sets new symbols to their default value

Other generic targets:
all – Build all targets marked with [*] * vmlinux – Build the bare kernel
* modules – Build all modules
modules_install – Install all modules to INSTALL_MOD_PATH (default: /)
firmware_install- Install all firmware to INSTALL_FW_PATH
(default: $(INSTALL_MOD_PATH)/lib/firmware)
dir/ – Build all files in dir and below
dir/file.[oisS] – Build specified target only
dir/file.lst – Build specified mixed source/assembly target only
(requires a recent binutils and recent build (System.map))
dir/file.ko – Build module including final link
modules_prepare – Set up for building external modules
tags/TAGS – Generate tags file for editors
cscope – Generate cscope index
gtags – Generate GNU GLOBAL index
kernelrelease – Output the release version string
kernelversion – Output the version stored in Makefile
image_name – Output the image name
headers_install – Install sanitised kernel headers to INSTALL_HDR_PATH
(default: /usr/src/linux-3.14.79/usr)

Static analysers
checkstack – Generate a list of stack hogs
namespacecheck – Name space analysis on compiled kernel
versioncheck – Sanity check on version.h usage
includecheck – Check for duplicate included header files
export_report – List the usages of all exported symbols
headers_check – Sanity check on exported headers
headerdep – Detect inclusion cycles in headers
coccicheck – Check with Coccinelle.

Kernel packaging:
rpm-pkg – Build both source and binary RPM kernel packages
binrpm-pkg – Build only the binary kernel package
deb-pkg – Build the kernel as a deb package
tar-pkg – Build the kernel as an uncompressed tarball
targz-pkg – Build the kernel as a gzip compressed tarball
tarbz2-pkg – Build the kernel as a bzip2 compressed tarball
tarxz-pkg – Build the kernel as a xz compressed tarball
perf-tar-src-pkg – Build perf-3.14.79.tar source tarball
perf-targz-src-pkg – Build perf-3.14.79.tar.gz source tarball
perf-tarbz2-src-pkg – Build perf-3.14.79.tar.bz2 source tarball
perf-tarxz-src-pkg – Build perf-3.14.79.tar.xz source tarball

Documentation targets:
Linux kernel internal documentation in different formats:
htmldocs – HTML
pdfdocs – PDF
psdocs – Postscript
xmldocs – XML DocBook
mandocs – man pages
installmandocs – install man pages generated by mandocs
cleandocs – clean all generated DocBook files

Architecture specific targets (x86):
* bzImage – Compressed kernel image (arch/x86/boot/bzImage)
install – Install kernel using
(your) ~/bin/installkernel or
(distribution) /sbin/installkernel or
install to $(INSTALL_PATH) and run lilo
fdimage – Create 1.4MB boot floppy image (arch/x86/boot/fdimage)
fdimage144 – Create 1.4MB boot floppy image (arch/x86/boot/fdimage)
fdimage288 – Create 2.8MB boot floppy image (arch/x86/boot/fdimage)
isoimage – Create a boot CD-ROM image (arch/x86/boot/image.iso)
bzdisk/fdimage*/isoimage also accept:
FDARGS=”…” arguments for the booted kernel
FDINITRD=file initrd for the booted kernel
kvmconfig – Enable additional options for guest kernel support

i386_defconfig – Build for i386
x86_64_defconfig – Build for x86_64

make V=0|1 [targets] 0 => quiet build (default), 1 => verbose build
make V=2 [targets] 2 => give reason for rebuild of target
make O=dir [targets] Locate all output files in “dir”, including .config
make C=1 [targets] Check all c source with $CHECK (sparse by default)
make C=2 [targets] Force check of all c source with $CHECK
make RECORDMCOUNT_WARN=1 [targets] Warn about ignored mcount sections
make W=n [targets] Enable extra gcc checks, n=1,2,3 where
1: warnings which may be relevant and do not occur too often
2: warnings which occur quite often but may still be relevant
3: more obscure warnings, can most likely be ignored
Multiple levels can be combined with W=12 or W=123

Execute “make” or “make all” to build all targets marked with [*] For further info see the ./README file

まとめ

今回、カーネルコンフィギュレーションを変更したり、カーネルのMakefileを開いたりしました。まだ初歩的な内容です。

ABOUT ME
ペイヴメント
ペイヴメントのエンジニア塾(当ブログ)では20年以上の経験から得られたプログラミング系ノウハウについてベテランにも満足して頂けるような内容の濃いコンテンツを初心者にも分かりやすい形で日々発信しています。【経歴】ベンチャーのソフトハウスで4年勤務後、精密機器メーカーのソフト開発部門に勤務し今に至ります。