“make oldconfig”는 Linux 커널 makefile에서 정확히 무엇을합니까?


82

Linux 커널 makefile에서 대상 "oldconfig"가 정확히 무엇을하는지 설명 할 수 있습니까? 일부 빌드 문서에서 참조했지만 정확히 무엇을하는지 설명하지 않았습니다.

답변:


127

기존 .config파일을 읽고 파일에서 찾을 수없는 현재 커널 소스의 옵션을 사용자에게 프롬프트합니다. 이것은 기존 구성을 가져와 새 커널로 이동할 때 유용합니다.


안녕하세요, 저는 u-boot 코드로 테스트했습니다 (Kconfig도 사용합니다). 'make menuconfig'를 사용하여 arm 아키텍처로 설정했습니다 (새 .config 파일이 생성되었습니다. 기본 아키텍처는 Sandbox입니다.). 그런 다음 'make menuconfig'를 수행하고 arm 아키텍처가 여전히 선택되어 있음을 알았습니다. 따라서 .config가 있으면 해당 .config 파일에서 'make menuconfig'가 시작됩니다. 그렇다면 대상 'menuconfig'와 'oldconfig'는 실제로 동일합니까?
찬 김

menuconfig와 oldconfig가 모두 .config에서 시작한다고 생각합니다. oldconfig만이 .config가 이전 커널에서 온 것으로 가정하고 현재 커널의 새 구성 변수를 채 웁니다.
Chan Kim

25

를 실행하기 전에 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

3
커널을 루트로 빌드하지 마십시오! youtube.com/watch?v=fMeH7wqOwXA#t=15m44s
ted

24

요약

Ignacio 에서 언급했듯이 .config커널 소스를 업데이트 한 후 업데이트합니다 (예 : git pull.

기존 옵션을 유지하려고합니다.

다음과 같은 이유로 스크립트가 있으면 도움이됩니다.

  • 새 옵션이 추가되었거나 이전 옵션이 제거되었을 수 있습니다.

  • 커널의 Kconfig 구성 형식에는 다음과 같은 옵션이 있습니다.

    • 서로를 통해 암시 select
    • 다른 것을 통해 의존 depends

    이러한 옵션 관계는 수동 구성 해결을 더욱 어렵게 만듭니다.

구성을 해결하는 방법을 이해하기 위해 .config를 수동으로 수정 해 보겠습니다.

먼저 다음을 사용하여 기본 구성을 생성하십시오.

make defconfig

이제 생성 된 .config파일을 수동으로 편집하여 커널 업데이트를 에뮬레이트하고 다음을 실행합니다.

make oldconfig

무슨 일이 일어나는지 볼 수 있습니다. 몇 가지 결론 :

  1. 유형의 라인 :

    # 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) 계산되지 않습니다.

  2. 유형의 라인 :

    # 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우리에게 묻지 않고 .

  3. 종속성이 충족되지 않는 구성은 .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쉬었을 때 그들은 전혀 나타나지 않았습니다.

  4. 설정을 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

  5. 제약 조건이 충족되지 않는 구성이 요청됩니다.

    예를 들어 다음 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 파일에서 비대화 형으로 기능을 어떻게 설정합니까?


5

신규 / 변경 / 제거 된 옵션으로 이전 구성을 업데이트합니다.


2

페이지에서 :

Make oldconfig는 .config를 가져와 Kconfig 파일의 규칙을 통해 실행하고 Kconfig 규칙과 일치하는 .config를 생성합니다. 누락 된 CONFIG 값이 있으면 make oldconfig가 해당 값을 요청합니다.

.config가 이미 Kconfig에있는 규칙과 일치하는 경우 make oldconfig는 기본적으로 작동하지 않습니다.

make oldconfig를 실행 한 다음 make oldconfig를 두 번째로 실행하면 두 번째로 추가 변경 사항이 발생하지 않습니다.


1

고문입니다. 일반 conf 파일을 포함하는 대신 반환을 9000 번 눌러 생성합니다.


6
시도 :yes "" | make oldconfig
Ray Donnelly
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.