何とは言わない天然水飲みたさ

kernel config 生成(略記)のためのシェルスクリプト

Gentoo Advent Calendar 2016 の6日目の記事です。
昨日の記事は Gentoo on Windows 10 (Gentoo Advent Calender 2016 5日目)でした。

概要

[0]なので、移行にあたってそこまで問題になりません。

問題なのは、カーネルの .config です。 ハードウェア由来の設定が多く項目も多いため、安直にコピーしてちょっと改変すれば使えるというものでもありません。 そこで、以下のようなスクリプトが欲しくなったため、簡単に書いてみたというお話です。

  • 設定の理由がわかる(コメントが書ける)
  • 値の無効化(CONFIG_FOO=n)ができる
  • 興味のない項目は、何も書かずともよろしく設定しておいてほしい
  • 記述した設定に無効なもの(あるいは上書きされたもの)があれば、警告してほしい

対象読者

CC0 とします。 (要するにパブリックドメインです。)

#!/bin/sh

# These codes are licensed under CC0.
# https://creativecommons.org/publicdomain/zero/1.0/deed.ja

# Set up parameters.
DATETIME="$(date '+%F-%H%M%S')"
: ${SRC_DIR:=/usr/src/linux}
cd "$(dirname "$0")"
DIR="$(pwd)"
CONFFILE_SRC="${DIR}/config"
CONFFILE_TEMP="${DIR}/.temp.$(basename "${CONFFILE_SRC}")"

sed -r -n \
    -e 's/^\s*(CONFIG_)?([A-Za-z0-9_]+=.+)$/CONFIG_\2/' \
    -e 's/^\s*# (CONFIG_[A-Za-z0-9_]+) is not set$/\1=n/' \
    -e '/^CONFIG_/!d' -e 's/^(CONFIG_[^=]+)=n$/# \1 is not set/' \
    -e 'p' \
    "${CONFFILE_SRC}" | sort -u >"${CONFFILE_TEMP}"

# `merge_config.sh` should be executed in the kernel source directory.
cd "${SRC_DIR}"
cp -f .config ".config-${DATETIME}"

# -n: use allnoconfig instead of alldefconfig
# -r: list redundant entries when merging fragments
./scripts/kconfig/merge_config.sh -r "${CONFFILE_TEMP}"

rm "${CONFFILE_TEMP}"
genconfig.sh

というか実質 sed スクリプト。

つかいかた

  1. [1]

ソースコードのディレクトリはデフォルトで /usr/src/linux ですが、 SRC_DIR=/path/to/linux/source ./genconfig.sh のようにすれば別の場所を使うことができます。 そのディレクトリのパーミッションによっては、 sudo は必要ないかもしれません。

config ファイルの内容

config の例(抜粋)

CONFIG_COMPAT_VDSOCONFIG_I2C_CHARDEV など、名前からは何故これを有効/無効にしたのかわからないような設定は結構ありますが、こうしてコメントとインデントで整理して書いてやることで、設定の意図や必要性がある程度明確にわかるようになります。 私は面倒だったので使いませんでしたが、 vim などであれば fold marker を使って折り畳みできるようにすれば、より読み易くなるかもしれません。

解説

[2]

# Use the merged file as the starting point for:
# alldefconfig: Fills in any missing symbols with Kconfig default
# allnoconfig: Fills in any missing symbols with # CONFIG_* is not set
make KCONFIG_ALLCONFIG=$TMP_FILE $OUTPUT_ARG $ALLTARGET
/usr/src/linux-4.8.11-gentoo/scripts/kconfig/merge_config.sh 151〜154行

$ALLTARGET は、デフォルトでは alldefconfig ですが、 -n オプションを付けて merge_config.sh を起動すると allnoconfig となります。

make alldefconfig

まとめ

おまけ

/var/log/portage/elog/summary.log に、過去 portage で emerge されたパッケージのメッセージが記録されています。 これを見て検索をかければ、どのパッケージがどのような設定を要求しているか、ある程度[3]わかるでしょう。

vim で見易いよう、簡単な syntax を用意しておきました。 ご活用ください。

molokai で syntax を適用した場合の見た目
/var/log/portage/elog/summary.log を molokai colorscheme で見た例
au BufRead,BufNewFile */portage/elog/summary.log set filetype=portage-summary-log
~/.config/nvim/ftdetect/portage-summary-log.vim
if exists("b:current_syntax")
    finish
endif

syn case match
syn spell notoplevel


syn match logPackageAtom excludenl '[a-z-_]\+/[a-zA-Z0-9_\.-]\+' contained containedin=logPackageLine
syn match logPackageLine excludenl '^>>> Messages generated by process .*:$' contains=logPackageAtom

syn match logKernelConfig excludenl 'CONFIG_[A-Z0-9_]\+' containedin=ALL

syn match logQA excludenl '^QA: .*$'
syn match logQANoticeLabel excludenl '^QA Notice:'me=e-1
syn match logWarning excludenl '^WARN: .*'
syn match logError excludenl '^ERROR: .*'


hi link logPackageAtom Keyword
hi link logPackageLine Comment

hi link logKernelConfig Identifier

hi link logQA Label
hi link logQANoticeLabel Label
hi link logWarning Label
hi link logError Label

let b:current_syntax = "portage-summary-log"
~/.config/nvim/ftdetect/portage-summary-log.vim
適当なところに置いて使ってくださいな

次に欲しい機能

kernel config checkには kernel-config-check.py とか / “kernel config 生成(略記)のためのシェルスクリプト - 何とは言わない天然水飲みたさ” https://blog.cardina1.red/2016/12/06/kernel-config-shellscript/

kernel-config-check.py というものを公開している方がいらっしゃるようで、これを使うと、インストール済のパッケージが要求するカーネルオプションを網羅できるようです。 すごい! 便利! 圧倒的感謝!!

このエントリーをはてなブックマークに追加