Přečte existující .config
soubor, který byl použit pro staré jádro a vyzve uživatele k zadání voleb v aktuálním zdroji jádra, které v souboru nejsou nalezeny. To je užitečné, když vezmete existující konfiguraci a přesunete ji do nového jádra.
Než spustíte make oldconfig
, musíte zkopírovat konfigurační soubor jádra ze staršího jádra do kořenového adresáře nového jádra.
Kopii starého konfiguračního souboru jádra na běžícím systému najdete na /boot/config-3.11.0
. Alternativně má zdrojový kód jádra konfigurace v linux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}
Pokud je zdroj vašeho jádra umístěn na /usr/src/linux
:
cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig
Shrnutí
Jak zmínil Ignacio, aktualizuje váš .config
pro vás po aktualizaci zdrojového kódu jádra, např. s git pull
.
Snaží se zachovat vaše stávající možnosti.
Mít k tomu skript je užitečné, protože:
-
mohly být přidány nové možnosti nebo odstraněny staré
-
konfigurační formát Kconfig jádra má tyto možnosti:
- vzájemně naznačovat pomocí
select
- závisí na jiném přes
depends
Tyto vztahy možností ještě více ztěžují ruční řešení konfigurace.
- vzájemně naznačovat pomocí
Pojďme upravit soubor .config ručně, abychom pochopili, jak řeší konfigurace
Nejprve vygenerujte výchozí konfiguraci pomocí:
make defconfig
Nyní upravte vygenerovaný .config
soubor ručně emulovat aktualizaci jádra a spustit:
make oldconfig
vidět, co se stane. Některé závěry:
-
Řádky typu:
# CONFIG_XXX is not set
nejsou pouhé komentáře, ale ve skutečnosti indikují, že parametr není nastaven.
Pokud například odstraníme řádek:
# CONFIG_DEBUG_INFO is not set
a spusťte
make oldconfig
, zeptá se nás:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
Když to skončí,
.config
soubor bude aktualizován.Pokud změníte jakýkoli znak řádku, např. na
# CONFIG_DEBUG_INFO
, to se nepočítá. -
Řádky typu:
# CONFIG_XXX is not set
se vždy používají pro negaci vlastnosti, ačkoli:
CONFIG_XXX=n
je také chápán jako negace.
Pokud například odstraníte
# CONFIG_DEBUG_INFO is not set
a odpovězte:Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
s
N
, pak výstupní soubor obsahuje:# CONFIG_DEBUG_INFO is not set
a ne:
CONFIG_DEBUG_INFO=n
Také, pokud ručně upravíme řádek na:
CONFIG_DEBUG_INFO=n
a spusťte
make oldconfig
, pak se řádek upraví na:# CONFIG_DEBUG_INFO is not set
bez
oldconfig
ptáte se nás. -
Konfigurace, jejichž závislosti nejsou splněny, se na
.config
nezobrazují . Všichni ostatní ano.Například nastavte:
CONFIG_DEBUG_INFO=y
a spusťte
make oldconfig
. Nyní se nás zeptá na:DEBUG_INFO_REDUCED
,DEBUG_INFO_SPLIT
, atd.Tyto vlastnosti se na
defconfig
neobjevily dříve.Pokud se podíváme pod
lib/Kconfig.debug
kde jsou definovány, vidíme, že závisí naDEBUG_INFO
:config DEBUG_INFO_REDUCED bool "Reduce debugging information" depends on DEBUG_INFO
Takže když
DEBUG_INFO
byl vypnutý, vůbec se neobjevili. -
Konfigurace, které jsou
selected
po zapnutí se konfigurace automaticky nastaví bez dotazu uživatele.Pokud například
CONFIG_X86=y
a odstraníme řádek:CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
a spusťte
make oldconfig
, linka se na rozdíl odDEBUG_INFO
znovu vytvoří bez dotazu .To se děje, protože
arch/x86/Kconfig
obsahuje:config X86 def_bool y [...] select ARCH_MIGHT_HAVE_PC_PARPORT
a vyberte, aby tato možnost byla pravdivá. Viz také:https://unix.stackexchange.com/questions/117521/select-vs-depends-in-kernel-kconfig
-
Jsou požadovány konfigurace, jejichž omezení nejsou splněna.
Například
defconfig
měl nastaveno:CONFIG_64BIT=y CONFIG_RCU_FANOUT=64
Pokud upravíme:
CONFIG_64BIT=n
a spusťte
make oldconfig
, zeptá se nás:Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
Důvodem je
RCU_FANOUT
je definován nainit/Kconfig
jako:config RCU_FANOUT int "Tree-based hierarchical RCU fanout value" range 2 64 if 64BIT range 2 32 if !64BIT
Tedy bez
64BIT
, maximální hodnota je32
, ale měli jsme64
nastavte na.config
, což by jej činilo nekonzistentním.
Bonusy
make olddefconfig
nastaví každou možnost na výchozí hodnotu bez interaktivního dotazování. Spustí se automaticky na make
abyste zajistili, že .config
je konzistentní v případě, že jste jej upravili ručně jako my. Viz také:https://serverfault.com/questions/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree
make alldefconfig
je jako make olddefconfig
, ale také přijímá konfigurační fragment ke sloučení. Tento cíl používá merge_config.sh
skript:https://stackoverflow.com/a/39440863/895245
A pokud chcete automatizovat .config
modifikace, která není příliš jednoduchá:Jak neinteraktivně zapínáte funkce v souboru .config jádra Linuxu?
Aktualizuje starou konfiguraci s novými/změněnými/odebranými možnostmi.