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ì.
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:
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.
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
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:
selectdependsCá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:
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.
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.
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ả.
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
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?
Cập nhật cấu hình cũ với các tùy chọn mới / thay đổi / loại bỏ.
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.
Đó 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.
yes "" | make oldconfig