Linuxカーネルのメイクファイルでターゲットの「oldconfig」が正確に何をするのか誰かが説明できますか?一部のビルドドキュメントで参照されているようですが、正確に何をするのか説明していません。
回答:
既存の.config
ファイルを読み取り、ファイルに見つからない現在のカーネルソースのオプションの入力をユーザーに求めます。これは、既存の構成を取得して新しいカーネルに移動するときに役立ちます。
を実行する前にmake oldconfig
、カーネル構成ファイルを古いカーネルから新しいカーネルのルートディレクトリにコピーする必要があります。
実行中のシステムにある古いカーネル構成ファイルのコピーは、にあります/boot/config-3.11.0
。または、カーネルソースコードの構成はlinux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}
カーネルソースが次の場所にある場合/usr/src/linux
:
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
概要
前述のようにイグナシオによって、それはあなたが更新され.config
、あなたが持つカーネルソースを、例えば更新した後、あなたのためにgit pull
。
それはあなたの既存のオプションを維持しようとします。
そのためのスクリプトがあると、次の理由で役立ちます。
新しいオプションが追加されたか、古いオプションが削除された可能性があります
カーネルのKconfig構成形式には、次のオプションがあります。
select
depends
これらのオプションの関係により、手動による構成の解決がさらに困難になります。
.configを手動で変更して、構成がどのように解決されるかを理解しましょう
まず、次のデフォルト構成を生成します。
make defconfig
次に、生成された.config
ファイルを手動で編集して、カーネルの更新をエミュレートして実行します。
make oldconfig
何が起こるかを見るために。いくつかの結論:
タイプの行:
# CONFIG_XXX is not set
単なるコメントではなく、実際にはパラメータが設定されていないことを示しています。
たとえば、次の行を削除すると、次のようになります。
# CONFIG_DEBUG_INFO is not set
実行するとmake oldconfig
、次のように尋ねられます。
Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
それが終わると、.config
ファイルが更新されます。
行の任意の文字を、たとえばに変更した場合# CONFIG_DEBUG_INFO
、それはカウントされません。
タイプの行:
# CONFIG_XXX is not set
ただし、プロパティの否定には常に使用されます。
CONFIG_XXX=n
否定としても理解されます。
たとえば、削除# CONFIG_DEBUG_INFO is not set
して回答した場合:
Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
を使用するとN
、出力ファイルには次のものが含まれます。
# CONFIG_DEBUG_INFO is not set
ではなく:
CONFIG_DEBUG_INFO=n
また、行を手動で次のように変更した場合:
CONFIG_DEBUG_INFO=n
を実行するmake oldconfig
と、行は次のように変更されます。
# CONFIG_DEBUG_INFO is not set
oldconfig
私たちに聞かずに。
依存関係が満たされていない構成は、に表示されません.config
。他のすべてはそうします。
たとえば、次のように設定します。
CONFIG_DEBUG_INFO=y
を実行しmake oldconfig
ます。:それは今の私たちに聞いてきますDEBUG_INFO_REDUCED
、DEBUG_INFO_SPLIT
などのconfigs。
これらのプロパティは、defconfig
以前は表示されませんでした。
lib/Kconfig.debug
それらが定義されている場所を見ると、それらが以下に依存していることがわかりますDEBUG_INFO
。
config DEBUG_INFO_REDUCED
bool "Reduce debugging information"
depends on DEBUG_INFO
そのDEBUG_INFO
ため、オフのときはまったく表示されませんでした。
設定をselected
オンにすることで設定が自動的に設定され、ユーザーに確認する必要はありません。
たとえばCONFIG_X86=y
、次の行を削除すると、次のようになります。
CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
を実行するmake oldconfig
と、とは異なり、行は私たちに尋ねることなく再作成されDEBUG_INFO
ます。
これは、次の理由で発生しarch/x86/Kconfig
ます。
config X86
def_bool y
[...]
select ARCH_MIGHT_HAVE_PC_PARPORT
選択すると、そのオプションが強制的に真になります。参照:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
制約が満たされていない構成が要求されます。
たとえば、次のようにdefconfig
設定しました。
CONFIG_64BIT=y
CONFIG_RCU_FANOUT=64
編集する場合:
CONFIG_64BIT=n
実行するとmake oldconfig
、次のように尋ねられます。
Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
これは、RCU_FANOUT
次のように定義されinit/Kconfig
ているためです。
config RCU_FANOUT
int "Tree-based hierarchical RCU fanout value"
range 2 64 if 64BIT
range 2 32 if !64BIT
したがって、がない64BIT
場合、最大値はですが32
、に64
設定した.config
ため、一貫性がなくなります。
ボーナス
make olddefconfig
対話的に尋ねることなく、すべてのオプションをデフォルト値に設定します。私たちが行ったように手動で変更した場合に備えmake
て、.config
が一貫していることを確認するために自動的に実行されます。参照:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfig
に似てmake olddefconfig
いますが、マージする構成フラグメントも受け入れます。このターゲットはmerge_config.sh
スクリプトによって使用されます:https://stackoverflow.com/a/39440863/895245
また、.config
変更を自動化したい場合、それはそれほど単純ではありません。Linuxカーネルの.configファイルの機能を非対話的にオンにするにはどうすればよいですか。