Điều gì xảy ra trong mỗi bước của quy trình xây dựng nhân Linux?


27

Tôi đã đọc nhiều hướng dẫn về cách xây dựng các hạt nhân tùy chỉnh và khởi động Ubuntu bằng các hạt nhân đó, và đã thực hiện thành công các hướng dẫn và khởi động các hạt nhân tùy chỉnh, nhưng tôi không hiểu về mỗi lệnh trong hướng dẫn làm gì và những gì thực sự xảy ra với mỗi lệnh.

Các thủ tục được mô tả trên trang web của Ubuntu làm rất nhiều công việc với fakeroot, dpkg, make-kpkg, một số initramfs, và các công cụ kinh khủng khác mà tác phẩm mà chỉ đơn giản không giúp tôi hiểu những gì đang xảy ra.

  • Đầu ra của makemột thư mục kernel linux là gì?
  • Liệu nó có tạo ra một "hình ảnh hạt nhân nén"?
  • Tên của tệp "hình ảnh hạt nhân nén" là gì và nó được đặt ở đâu?
  • Không gì make moduleslàm gì?
  • Nên make moduleslàm trước hay sau make?
  • Không maketự động xây dựng các mô-đun của tôi?
  • Quá trình (bằng tiếng Anh, không chỉ là danh sách các lệnh) của việc thêm các hạt nhân mới được xây dựng vào danh sách các hạt nhân có thể khởi động là gì?
  • Không gì make installlàm gì?
  • Sẽ make installthêm nó vào danh sách các hạt nhân có thể khởi động để tôi không phải làm gì thêm?
  • Có tương đương make modules_installkhông?

Điều này nên được chia thành nhiều câu hỏi.
Ciro Santilli 心 心

Câu trả lời:


34

Từ đầu ...

  • makebiên dịch và liên kết hình ảnh hạt nhân. Đây là một tập tin duy nhất có tên vmlinuz.
  • make modulesbiên dịch các tệp riêng lẻ cho mỗi câu hỏi bạn đã trả lời Mtrong cấu hình kernel. Mã đối tượng được liên kết với hạt nhân mới được xây dựng của bạn. (Đối với các câu hỏi đã được trả lời Y, đây đã là một phần vmlinuzvà đối với các câu hỏi đã được trả lời, Nchúng sẽ bị bỏ qua).
  • make installcài đặt kernel đã xây dựng của bạn vào /vmlinuz.
  • make modules_installcài đặt các mô-đun hạt nhân của bạn để /lib/moduleshoặc /lib/modules/<version>.

Đối với việc thêm nó vào danh sách các hạt nhân có sẵn, điều đó được bộ tải khởi động quan tâm. Nó khác nhau đối với mỗi bộ tải khởi động, nhưng grublà phổ biến nhất trên x86 và amd64 vì vậy tôi sẽ mô tả điều đó. Nó thực sự khá đơn giản. Grub nhìn vào /, /boot/lib/modulesđối với bất kỳ thứ gì có vẻ như nó có thể là một hạt nhân hoạt động và thêm nó. Và vâng, đây là một mô tả quá đơn giản.

Thêm "thứ khủng khiếp" trong tài liệu Ubuntu là những thứ bổ sung để tạo ra một debgói. Khi bạn làm việc đó nhiều hơn cho bản thân, tốt hơn hết là bạn nên gói nó. Bạn sẽ chuyển đổi kịp thời.

Việc xây dựng kernel và các mô-đun được giữ riêng biệt bởi vì đối với những người cần (tức là các nhà phát triển kernel), họ thường thực hiện các thay đổi đối với chỉ một mô-đun. Họ có thể áp dụng các thay đổi của mình, xây dựng lại và chỉ cài đặt các mô-đun. Điều này tiết kiệm rất nhiều thời gian khi nó phải được thực hiện 20 lần một ngày. Nó sẽ không bao giờ được cập nhật để có một make everythinglệnh duy nhất . Bạn thay vào đó, chạy make && make modules && make install && make modules_install giống như các tài liệu nói để làm . Quá trình xây dựng ủng hộ các nhà phát triển kernel, không phải bạn. Và đó là cách nó phải như vậy.

Trong thực tế, hầu như không có lý do cho bất kỳ ai ngoại trừ các nhà phát triển kernel hoặc distro packager để biên dịch kernel. Trong hầu hết mọi trường hợp, tính năng kernel mà bạn muốn đã được xây dựng cho bạn và có sẵn trong một trong các hạt nhân được đóng gói sẵn. Có những trường hợp ngoại lệ, nhưng chúng cực kỳ hiếm ngày nay.

Không phải là tôi không khuyến khích bạn xây dựng hạt nhân của riêng bạn, tôi thực sự khuyến khích bạn làm điều đó. Tôi nghĩ rằng xây dựng hạt nhân của bạn từ đầu là một thực tiễn vô giá để tìm hiểu về cách tất cả hoạt động ở dưới đó. Một phần, vì có thể một ngày nào đó bạn sẽ là ngoại lệ cần phải làm. Nhưng nó cũng dạy cho bạn rất nhiều về quá trình khởi động và kernel nói chung. Bạn sẽ là một người tốt hơn vì đã làm điều đó.


1
Thankyou rất nhiều cho các mô tả dễ đọc của con người của quá trình. Tôi có một vài nghi ngờ. Trình biên dịch kernel của tôi tạo ra vmlinux chứ không phải vmlinuz. Tôi nghĩ rằng sự khác biệt là nén. Tôi có nên nén hình ảnh bằng tay? Là /vmlinuzmột thư mục trong thư mục gốc? Khi tôi thực hiện cài đặt, thư mục này sẽ được tạo và kernel mới được đặt ở đó? Sẽ make modules_installthay thế các mô-đun hiện đang cài đặt của tôi? Giả sử tôi đặt vmlinux của mình vào thư mục / boot, tôi có cần phải làm gì khác không (như chỉnh sửa tệp cấu hình grub và cập nhật grub hoặc một cái gì đó sau đó?)
AnkurVj

3
Bạn nói đúng, sự khác biệt là nén. Lệnh make bzimagelà những gì làm điều đó. /vmlinuzlà một tệp nhị phân, không phải là một thư mục. Tôi đã chỉ tạo ra các hạt nhân được đóng gói trong khoảng 5 năm qua, vì vậy tôi không nhớ chính xác hành vi của modules_installmột hạt nhân được cài đặt trực tiếp. Grub sẽ tìm thấy kernel của bạn /bootmà không cần trợ giúp. Có, bạn nên luôn luôn chạy grub-updatesau khi cài đặt kernel mới.
bahamat

vậy tôi có nên làm make bzimagethay make? DO tôi cần phải làm một make cleanmake bzimagemột lần nữa? Bằng cách /vmlinuznào bạn có nghĩa là các tập tin sẽ được tạo trong thư mục gốc hoặc trong thư mục mã nguồn kernel linux?
AnkurVj

1
Nó không thực sự quan trọng khi hạt nhân của bạn được nén hay không. Không nén nó chỉ chiếm thêm một chút dung lượng đĩa. Bất cứ điều gì có tiền tố /là một đường dẫn tuyệt đối, vì vậy, đó là một tập tin trong thư mục gốc.
bahamat

1
@GuyAvraham Các mô-đun trả lời Yđược biên dịch trong (nghĩa là chúng là một phần của vmlinuz). Các mô-đun trả lời Mđược biên dịch dưới dạng các mô-đun có thể tải. Các mô-đun trả lời Nkhông được biên dịch. make modules_installchỉ áp dụng cho những người trả lời M.
bahamat
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.