Linux 커널 makefile에서 대상 "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
요약
Ignacio 에서 언급했듯이 .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
해당 옵션이 true가되도록 강제 선택합니다. 참조 : /unix/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
. 참조 : /server/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 파일에서 비대화 형으로 기능을 어떻게 설정합니까?