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 .config
tệ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 .config
cho 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:
select
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 .config
tệ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, .config
tậ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 set
và 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 oldconfig
hỏ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_SPLIT
vv configs.
Những thuộc tính đó đã không xuất hiện defconfig
trước đó.
Nếu chúng ta xem xét lib/Kconfig.debug
nơ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 selected
bậ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=y
và 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 .config
nó 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 alldefconfig
giố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.sh
tập lệnh: https://stackoverflow.com/a/39440863/895245
Và nếu bạn muốn tự động hóa việc .config
sử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