Chính xác thì “make oldconfig” làm gì trong makefile của nhân Linux?


81

Bất cứ ai có thể giải thích mục tiêu "oldconfig" thực hiện chính xác những gì trong makefile nhân Linux? Tôi thấy nó được tham chiếu trong một số tài liệu xây dựng nhưng chưa bao giờ giải thích chính xác nó làm gì.

Câu trả lời:


125

Nó đọc .configtệp hiện có và nhắc người dùng về các tùy chọn trong nguồn hạt nhân hiện tại không được tìm thấy trong tệp. Điều này rất hữu ích khi lấy một cấu hình hiện có và chuyển nó sang một nhân mới.


Cảm ơn bạn, rất hữu ích.
fred basset

chào, tôi đã thử nghiệm với mã u-boot (nó cũng sử dụng Kconfig). Tôi đã sử dụng 'make menuconfig' và đặt nó thành kiến ​​trúc cánh tay (và một tệp .config mới đã được tạo. Kiến trúc mặc định là Sandbox.). sau đó tôi thực hiện 'make menuconfig' và thấy rằng cấu trúc cánh tay vẫn được chọn. Vì vậy, nếu có .config, 'make menuconfig' bắt đầu từ tệp .config đó. Vậy mục tiêu 'menuconfig' và 'oldconfig' có hiệu lực giống nhau không?
Chan Kim

25

Trước khi chạy make oldconfig, bạn cần sao chép tệp cấu hình hạt nhân từ một hạt nhân cũ hơn vào thư mục gốc của hạt nhân mới.

Bạn có thể tìm thấy bản sao của tệp cấu hình hạt nhân cũ trên hệ thống đang chạy tại /boot/config-3.11.0. Ngoài ra, mã nguồn hạt nhân có cấu hình tronglinux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}

Nếu nguồn hạt nhân của bạn được đặt tại /usr/src/linux:

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig

3
Không xây dựng hạt nhân dưới dạng gốc! xem youtube.com/watch?v=fMeH7wqOwXA#t=15m44s
ted

24

Tóm lược

Như đã đề cập bởi Ignacio , nó cập nhật .configcho bạn sau khi bạn cập nhật nguồn hạt nhân, ví dụ với git pull.

Nó cố gắng giữ các tùy chọn hiện có của bạn.

Có một tập lệnh cho điều đó rất hữu ích vì:

  • các tùy chọn mới có thể đã được thêm vào hoặc các tùy chọn cũ bị xóa

  • định dạng cấu hình Kconfig của nhân có các tùy chọn:

    • ám chỉ nhau qua select
    • phụ thuộc vào cái khác qua depends

    Các mối quan hệ tùy chọn đó làm cho việc phân giải cấu hình thủ công thậm chí còn khó hơn.

Hãy sửa đổi .config theo cách thủ công để hiểu cách nó giải quyết các cấu hình

Trước tiên, hãy tạo một cấu hình mặc định với:

make defconfig

Bây giờ hãy chỉnh sửa .configtệp được tạo theo cách thủ công để mô phỏng bản cập nhật hạt nhân và chạy:

make oldconfig

để xem điều gì xảy ra. Một số kết luận:

  1. Các dòng thuộc loại:

    # CONFIG_XXX is not set
    

    không chỉ là những bình luận mà thực sự chỉ ra rằng tham số không được đặt.

    Ví dụ: nếu chúng ta xóa dòng:

    # CONFIG_DEBUG_INFO is not set
    

    và chạy make oldconfig, nó sẽ hỏi chúng tôi:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    Khi nó kết thúc, .configtập tin sẽ được cập nhật.

    Nếu bạn thay đổi bất kỳ ký tự nào của dòng, ví dụ thành # CONFIG_DEBUG_INFO, nó không được tính.

  2. Các dòng thuộc loại:

    # CONFIG_XXX is not set
    

    luôn được sử dụng để phủ định một thuộc tính, mặc dù:

    CONFIG_XXX=n
    

    còn được hiểu là sự phủ định.

    Ví dụ: nếu bạn xóa # CONFIG_DEBUG_INFO is not setvà trả lời:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    với N, sau đó tệp đầu ra chứa:

    # CONFIG_DEBUG_INFO is not set
    

    và không:

    CONFIG_DEBUG_INFO=n
    

    Ngoài ra, nếu chúng tôi sửa đổi thủ công dòng thành:

    CONFIG_DEBUG_INFO=n
    

    và chạy make oldconfig, sau đó dòng được sửa đổi thành:

    # CONFIG_DEBUG_INFO is not set
    

    mà không cần oldconfighỏi chúng tôi.

  3. Các cấu hình có sự phụ thuộc không được đáp ứng, sẽ không xuất hiện trên .config. Tất cả những người khác làm.

    Ví dụ, đặt:

    CONFIG_DEBUG_INFO=y
    

    và chạy make oldconfig. Bây giờ nó sẽ yêu cầu chúng tôi cho: DEBUG_INFO_REDUCED, DEBUG_INFO_SPLITvv configs.

    Những thuộc tính đó đã không xuất hiện defconfigtrước đó.

    Nếu chúng ta xem xét lib/Kconfig.debugnơi chúng được xác định, chúng ta thấy rằng chúng phụ thuộc vào DEBUG_INFO:

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    Vì vậy, khi DEBUG_INFOđã tắt, họ đã không xuất hiện ở tất cả.

  4. Các cấu hình được selectedbật bởi cấu hình được đặt tự động mà không cần hỏi người dùng.

    Ví dụ, nếu CONFIG_X86=yvà chúng tôi xóa dòng:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    và chạy make oldconfig, dòng được tạo lại mà không cần hỏi chúng tôi, không giống như DEBUG_INFO.

    Điều này xảy ra vì arch/x86/Kconfig chứa:

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    

    và chọn buộc tùy chọn đó phải đúng. Xem thêm: /unix/117521/select-vs-depends-in-kernel-kconfig

  5. Các cấu hình có các ràng buộc không được đáp ứng sẽ được yêu cầu.

    Ví dụ, defconfigđã đặt:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    Nếu chúng tôi chỉnh sửa:

    CONFIG_64BIT=n
    

    và chạy make oldconfig, nó sẽ hỏi chúng tôi:

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
    

    Điều này là do RCU_FANOUTđược định nghĩa tại init/Kconfig:

    config RCU_FANOUT
        int "Tree-based hierarchical RCU fanout value"
        range 2 64 if 64BIT
        range 2 32 if !64BIT
    

    Do đó, không có 64BIT, giá trị lớn nhất là 32, nhưng chúng tôi đã 64đặt trên .config, điều này sẽ làm cho nó không nhất quán.

Tiền thưởng

make olddefconfigđặt mọi tùy chọn thành giá trị mặc định của chúng mà không cần hỏi tương tác. Nó sẽ tự động chạy makeđể đảm bảo rằng .confignó nhất quán trong trường hợp bạn đã sửa đổi nó theo cách thủ công như chúng tôi đã làm. Xem thêm: /server/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfiggiống như make olddefconfig, nhưng nó cũng chấp nhận một phân đoạn cấu hình để hợp nhất. Mục tiêu này được sử dụng bởi merge_config.shtập lệnh: https://stackoverflow.com/a/39440863/895245

Và nếu bạn muốn tự động hóa việc .configsửa đổi, điều đó không quá đơn giản: Làm cách nào để bạn bật các tính năng không tương tác trong tệp .config của nhân Linux?


5

Cập nhật cấu hình cũ với các tùy chọn mới / thay đổi / loại bỏ.


2

Từ trang này :

Make oldconfig lấy .config và chạy nó thông qua các quy tắc của tệp Kconfig và tạo ra .config phù hợp với các quy tắc Kconfig. Nếu thiếu giá trị CONFIG, make oldconfig sẽ yêu cầu chúng.

Nếu .config đã phù hợp với các quy tắc được tìm thấy trong Kconfig, thì việc tạo oldconfig về cơ bản là một việc không cần làm.

Nếu bạn chạy make oldconfig và sau đó chạy make oldconfig lần thứ hai, thì lần thứ hai sẽ không thực hiện bất kỳ thay đổi bổ sung nào.


1

Đó là sự tra tấn. Thay vì bao gồm một tệp conf chung, chúng khiến bạn phải nhấn trả lại 9000 lần để tạo một tệp.


6
Hãy thử:yes "" | make oldconfig
Ray Donnelly
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.