Lợi ích của việc biên dịch kernel linux của bạn là gì?


101

Tôi có thể thấy lợi ích gì khi tự biên dịch kernel Linux? Có một số hiệu quả bạn có thể tạo ra bằng cách tùy chỉnh nó vào phần cứng của bạn?


câu hỏi đơn giản về lợi ích là gì trở nên mơ hồ hoặc được đưa ra khỏi bối cảnh rất nhanh. Sẽ tốt hơn nếu hỏi What are the pros and cons of compiling your own kernel? Cons = không dễ, nhiều tình huống không có giá trị gia tăng. Ưu điểm = bảo mật, hiệu suất, nếu bạn biết bạn đang làm gì, ví dụ như các thiết bị NAS, sử dụng linux để làm cho một số phần cứng hoạt động và có khả năng kết nối mạng và đồ họa.
ron

Câu trả lời:


73

Trong suy nghĩ của tôi, lợi ích duy nhất bạn thực sự nhận được từ việc biên dịch kernel linux của riêng bạn là:

Bạn học cách biên dịch kernel linux của riêng bạn.

Đó không phải là thứ bạn cần làm để có thêm tốc độ / bộ nhớ / xxx. Đó là một điều có giá trị để làm nếu đó là giai đoạn bạn cảm thấy bạn đang ở trong sự phát triển của mình. Nếu bạn muốn hiểu sâu hơn về toàn bộ điều "nguồn mở" này là gì, về cách thức và các phần khác nhau của hạt nhân, thì bạn nên thử. Nếu bạn chỉ muốn tăng tốc thời gian khởi động thêm 3 giây, thì ... điểm gì ... hãy mua một ssd. Nếu bạn tò mò, nếu bạn muốn tìm hiểu, thì việc biên dịch kernel của riêng bạn là một ý tưởng tuyệt vời và bạn có thể sẽ nhận được rất nhiều từ nó.

Như đã nói, có một số lý do cụ thể khi nó phù hợp để biên dịch kernel của riêng bạn (như nhiều người đã chỉ ra trong các câu trả lời khác). Nói chung, những điều này phát sinh từ một nhu cầu cụ thể mà bạn có cho một kết quả cụ thể, ví dụ:

  • Tôi cần để hệ thống khởi động / chạy trên phần cứng với nguồn lực hạn chế
  • Tôi cần thử nghiệm một bản vá và cung cấp phản hồi cho các nhà phát triển
  • Tôi cần phải vô hiệu hóa một cái gì đó gây ra xung đột
  • Tôi cần phát triển kernel linux
  • Tôi cần kích hoạt hỗ trợ cho phần cứng không được hỗ trợ của mình
  • Tôi cần cải thiện hiệu suất của x vì tôi đang đạt đến giới hạn hiện tại của hệ thống (và tôi biết tôi đang làm gì)

Vấn đề nằm ở chỗ nghĩ rằng có một số lợi ích nội tại để biên dịch kernel của riêng bạn khi mọi thứ đã hoạt động theo đúng nghĩa của nó và tôi không nghĩ rằng có. Mặc dù bạn có thể dành vô số thời gian để vô hiệu hóa những thứ bạn không cần và điều chỉnh những thứ có thể điều chỉnh được, nhưng thực tế là kernel linux đã được điều chỉnh khá tốt (theo phân phối của bạn) cho hầu hết các tình huống của người dùng.


25
Tôi tranh luận rằng nếu bạn muốn xây dựng hạt nhân của riêng mình chỉ đơn giản là cho trải nghiệm học tập, thì bạn sẽ làm điều đó với bản phân phối Linux dựa trên nguồn như Gentoo hoặc Linux From Scratch. Tài liệu cài đặt Gentoo giai đoạn 2 là một hướng dẫn tuyệt vời để hiểu ý nghĩa của việc xây dựng Linux từ kernel trở lên.
Sandy

Đồng ý ... hai dự án đó được xây dựng cho loại điều này.
gabe.

Tất nhiên bạn biết bạn thực sự mâu thuẫn với chính mình trong câu trả lời của bạn. Nếu lợi ích duy nhất của việc biên dịch kernel là học cách làm nó, thì nó sẽ vô dụng - không có giá trị. Nhưng sau đó một vài từ bạn nói đó là một điều có giá trị ...
rozcietrzewiacz

@rozcietrzewiacz Kiến thức có giá trị tối đa. Biên dịch kernel giúp bạn mở rộng kiến ​​thức. Nếu bạn không mua thứ đó, thì đây là - kiến ​​thức là sức mạnh và mọi người trả tiền tốt để có được sức mạnh và tiền giữ giá trị trong thế giới ngày nay, vì vậy, bởi tài sản
bắc cầu

Tôi đồng ý, nó chỉ có giá trị cho kiến ​​thức thu được.
1100110

35

Hầu hết người dùng không cần phải biên dịch kernel của riêng họ, bản phân phối của họ đã thực hiện công việc này cho họ. Thông thường các bản phân phối sẽ bao gồm một tập hợp các bản vá để tích hợp với một số phần nhất định trong cách thức phân phối hoạt động, hỗ trợ trình điều khiển thiết bị và sửa lỗi từ các phiên bản mới hơn nhưng chưa được phát hành của hạt nhân hoặc các tính năng mà chúng tiên phong với người dùng.

Khi bạn biên dịch kernel của riêng mình, bạn có một vài tùy chọn, bạn có thể biên dịch kernel Linus Torvalds chính thức, điều này sẽ không bao gồm bất kỳ bản vá hoặc tùy chỉnh nào được thêm bởi bản phân phối của bạn (có thể tốt hoặc xấu) hoặc bạn có thể sử dụng công cụ xây dựng lại phân phối của bạn để xây dựng kernel của riêng bạn.

Những lý do bạn có thể muốn xây dựng lại kernel của mình bao gồm:

  • Sửa lỗi hoặc thêm một tính năng cụ thể vào hệ thống sản xuất, nơi bạn không thể thực sự mạo hiểm nâng cấp toàn bộ kernel cho một hoặc hai lần sửa chữa.
  • Để dùng thử trình điều khiển thiết bị cụ thể hoặc tính năng mới
  • Để mở rộng kernel, hãy làm việc với nó
  • thử nghiệm một số mô-đun hoặc tính năng "Alpha".

Nhiều nhà phát triển sử dụng nó để tạo các phiên bản tùy chỉnh của kernel cho các hệ thống nhúng hoặc hộp giải quyết nơi họ cần trình điều khiển thiết bị đặc biệt hoặc họ muốn xóa chức năng mà họ không cần.


8
+1. Trẻ em ngày nay, chúng thậm chí không biết 'tạo ra menuconfig' nghĩa là gì và không bao giờ phải vá mã mạng hạt nhân của mình để tránh bị lừa bởi những đứa trẻ kịch bản. May thay những ngày đó hầu hết không còn nữa.
axel_c

2
bạn nên thêm bisecting để tìm nơi giới thiệu lỗi ...
xenoterracide

1
thật ngạc nhiên khi bình luận này được bình chọn khi nó không liên quan gì đến câu hỏi của OP. "Hầu hết người dùng không ...." bây giờ. Câu hỏi của OP rất rõ ràng về việc muốn biết lợi ích; không phải ý kiến ​​của bạn về những gì "hầu hết người dùng" làm ở đây và ở đó.
Eric

30

Tự biên dịch kernel cho phép bạn chỉ bao gồm các phần có liên quan đến máy tính của bạn, điều này làm cho nó nhỏ hơn và có khả năng nhanh hơn, đặc biệt là khi khởi động. Hạt nhân chung cần bao gồm hỗ trợ cho càng nhiều phần cứng càng tốt; tại thời điểm khởi động, họ phát hiện phần cứng nào được gắn vào máy tính của bạn và tải các mô-đun thích hợp, nhưng cần có thời gian để làm tất cả những điều đó và họ cần tải các mô-đun động, thay vì phải nướng mã trực tiếp vào kernel. Không có lý do gì để nhân của bạn hỗ trợ 400 CPU khác nhau khi chỉ có một trong máy tính của bạn hoặc để hỗ trợ chuột bluetooth nếu bạn không có, tất cả đều lãng phí không gian mà bạn có thể giải phóng


15
Tôi đồng ý với hầu hết câu trả lời của bạn, nhưng tôi tò mò về một số sự thật khó khăn về "nhanh hơn đáng kể". Tôi không muốn tạo cho người dùng mới ấn tượng rằng máy tính để bàn của họ thường chạy nhanh hơn với kernel được tạo bằng tay (theo kinh nghiệm của tôi với Gentoo, điều này đơn giản là không đúng). Bạn có thể định lượng mức tăng trong tốc độ khởi động?
Sandy

2
Câu trả lời này là đúng 15 năm trước, nhưng ngày nay nó không thực sự phù hợp. Hầu hết các trình điều khiển đều có các mô-đun, vì vậy chúng chỉ chiếm chỗ trên đĩa chứ không phải trong bộ nhớ. . với tùy chọn khởi động kernel.
Gilles

1
@Michael nếu đó là một giả định chưa được xác minh, tôi nghĩ thay thế "nhanh hơn đáng kể" bằng "có khả năng nhanh hơn" trong câu trả lời của bạn có thể là một ý tưởng hay ... chỉ để đảm bảo rằng không có n00bs bị nhầm lẫn. :-)
Sandy

3
@Sandy Đồng ý, vì có vẻ như tôi là một trong số n00bs đó :). Đã sửa lỗi
Michael Mrozek

2
Tôi nghĩ rằng "đáng kể" nhanh hơn thực sự hợp lý với sự cảnh báo mà chúng ta đang nói về thời gian khởi động. Các hạt nhân distro stock mất dễ dàng hơn 5 - 10 giây để khởi động mà tôi đã gỡ xuống để không tìm kiếm bất kỳ phần cứng nào tôi không dự định sử dụng. Tốc độ thời gian chạy có lẽ không đáng kể, tôi thực sự không thể đo được điều đó một cách đáng tin cậy.
Caleb

24

Tôi không thể tin câu trả lời được chấp nhận ở đây bắt đầu nói rằng "Đó không phải là điều bạn cần làm để có thêm tốc độ / bộ nhớ / xxx."

Điều này là hoàn toàn sai. Tôi thường xuyên tùy chỉnh xây dựng Kernels của mình để loại bỏ mã không cần thiết cũng như bao gồm mã tăng cường hiệu suất chủ yếu liên quan đến phần cứng. Ví dụ: tôi chạy một số phần cứng cũ hơn và có thể tăng thêm một số hiệu suất bằng cách kích hoạt trình điều khiển Kernel hiếm khi được hỗ trợ như chipset HPT36x trên một số MoBos cũ có tích hợp sẵn này.

Một ví dụ khác, BIG SMP trong Slackware là mặc định và trên Dell 2800, chẳng hạn, sẽ tiêu thụ một bản in chân có kích thước lớn để chạy những thứ như GFSD (không phải là một mô-đun hạt nhân), nhân tiện, cũng tiêu thụ CPU cho một thứ gì đó tôi không cần. Tương tự như vậy đối với NFSD và những người nắm bắt khác để làm hài lòng tất cả các tinh thần, điều đó tốt nếu bạn chỉ cố gắng lấy Linux trên một chiếc hộp và chạy nhưng nếu bạn quan tâm đến "tốc độ / bộ nhớ / xxx bất cứ điều gì" thì những điều này quan trọng và hiệu quả .

Tất cả các hộp sản xuất của tôi là Kernels tùy chỉnh. Nếu tôi sử dụng phần cứng phổ biến như phần cứng Dell (2800, 2850, 2900, v.v.), thì việc sao chép tệp .config của kernel xung quanh vào mỗi hộp và biên dịch kernel và cài đặt.


3
Tôi nghĩ rằng điểm chính của câu trả lời được chấp nhận là đối với hầu hết các phần cứng, hiệu năng đạt được bằng cách biên dịch kernel của bạn không đáng để bạn phải học cách làm nó (và tìm hiểu ý nghĩa của các tùy chọn). Đó có lẽ là kinh nghiệm: sẽ thật tuyệt khi tìm thấy một số con số về điều này.
Andres Riofrio

vậy thì thật thiếu sót khi không nêu điều này trong câu hỏi ban đầu và sau đó chấp nhận câu trả lời dựa trên lý do bạn cho là đúng.
Eric

2
Vâng, đó không phải là lỗi của tôi, câu trả lời của tôi đã được chấp nhận. Và mặc dù có những trường hợp biên dịch kernel của bạn sẽ giúp bạn "tăng hiệu suất" hoặc đứng dậy và chạy trên một máy năng lượng thấp, tôi đã đưa ra giả định rằng câu hỏi ban đầu được hỏi bởi một người không có câu hỏi cụ thể cần đi trước thời đại và chỉ tò mò theo nghĩa chung là lợi ích của việc biên dịch kernel là gì. Tôi sẽ lập luận rằng chỉ những người có yêu cầu cụ thể trong tâm trí mới được hưởng lợi từ các chỉnh sửa kernel. Vì câu trả lời của tôi đã được chấp nhận, tôi sẽ cải thiện nó để giải quyết các lý do nhiều người sử dụng năng lượng hơn cho các hạt nhân tùy chỉnh
gabe.

14

Dưới đây là một số tình huống biên dịch kernel của riêng bạn sẽ có lợi cho bạn:

  • Một hạt nhân với tải mô-đun bị vô hiệu hóa là an toàn hơn. Điều này sẽ yêu cầu bạn chọn các mô-đun bạn biết bạn cần và đưa chúng vào như một phần của kernel, trái ngược với việc biên dịch chúng thành các mô-đun.

  • Vô hiệu hóa hỗ trợ cho / dev / kmem hoặc làm tê liệt nó với tùy chọn trình biên dịch phù hợp là một điều tốt cho bảo mật. Tôi nghĩ rằng hầu hết các distro làm điều này theo mặc định bây giờ.

  • Tôi không thích sử dụng initrd khi có thể. Tùy chỉnh kernel của bạn với phần cứng mà nó khởi động để loại bỏ initrd.

  • Đôi khi một phiên bản kernel sau này sẽ có các tính năng bạn cần, nhưng điều này rất hiếm ngày nay. Tôi nhớ khi tôi mới bắt đầu sử dụng Debian, nó đã sử dụng hạt nhân 2.4, nhưng tôi cần một hạt nhân 2.6 để hỗ trợ udev.

  • Vô hiệu hóa các giao thức / tùy chọn mạng mà bạn không cần có thể tăng tốc hiệu suất TCP / IP của bạn.

  • Vô hiệu hóa các tùy chọn bạn không cần làm giảm dung lượng bộ nhớ của kernel, điều này rất quan trọng trong môi trường RAM thấp. Khi bạn đang sử dụng hệ thống RAM 256 MB làm bộ định tuyến, điều này sẽ giúp ích.

  • Tôi thấy tất cả các thiết bị "tty" trong / dev gây phiền nhiễu trên các hệ thống mà tôi thường chỉ đăng nhập qua serial hoặc ssh.


Tất cả đều đúng. Tuy nhiên, loại bỏ tải mô-đun có thể gây ra sự cố khi khởi động: hầu hết, nếu không phải tất cả, các bản phân phối ngày nay chỉ cho rằng các mô-đun sẽ cần phải được tải. Lần trước khi tôi tắt các mô-đun, nó đã khiến một loạt các thông báo lỗi bật ra trong quá trình khởi động Red Hat.
Mei

7

Biên dịch kernel của riêng bạn cho phép bạn tham gia vào quá trình phát triển kernel, cho dù đó là những việc đơn giản như cung cấp ID thiết bị PCI / USB cho trình điều khiển hiện có có thể giúp thiết bị mới hơn hoạt động với bạn, để tham gia sâu vào lõi. phát triển nhân.

Nó cũng cho phép bạn kiểm tra các hạt phát triển trên phần cứng của bạn và cung cấp phản hồi nếu bạn nhận thấy bất kỳ hồi quy nào. Điều này có thể đặc biệt hữu ích cho bạn và những người khác nếu bạn có một phần cứng không phổ biến. Nếu bạn chờ kernel phân phối, có thể mất một chút thời gian để sửa lỗi từ các báo cáo sự cố của bạn để lọc thành bản phát hành kernel phân phối mới.

Cá nhân tôi cũng thích biên dịch các hạt nhân của riêng mình để chỉ hỗ trợ cho phần cứng mà tôi có. Khi bạn chạy hạt nhân distro và nhìn vào đầu ra lsmod(8), bạn sẽ thấy rất nhiều mô-đun được tải cho phần cứng bạn không có. Điều này có thể gây ô nhiễm danh sách mô-đun, / Proc, / sys và nhật ký của bạn để khi bạn tìm kiếm thứ gì đó, nó có thể bị ẩn trong tiếng ồn; Bạn cũng không thể chắc chắn 100% rằng các mô-đun đó không góp phần vào vấn đề bạn đang cố gắng chẩn đoán.


6

Tôi thứ hai câu trả lời của gabe. (Bình luận của tôi quá dài nên tôi đang đăng dưới dạng câu trả lời).

Trừ khi bạn có một mục đích chuyên môn cao (ví dụ: máy nhúng, hồ sơ bảo mật nghiêm ngặt), tôi không thấy lợi ích thiết thực nào để biên dịch kernel của bạn ngoài việc xem nó được thực hiện như thế nào. Bằng cách xem xét một cách có phương pháp các tùy chọn, xem cách chúng tương tác với nhau để xây dựng hệ thống là một cách tuyệt vời để hiểu cách hệ thống của bạn hoạt động. Thật đáng kinh ngạc những gì bạn phát hiện ra khi bạn cố gắng loại bỏ các thành phần dường như không có bất kỳ mục đích nào cho các nhiệm vụ bạn đang cố gắng thực hiện.

Tuy nhiên, được cảnh báo - tại sao nhảy xuống hố thỏ chắc chắn là rất phấn khích, nó sẽ hút lại nhiều đêm và cuối tuần hơn bạn nghĩ có thể!


3

Tại nơi làm việc, chúng tôi sử dụng hạt nhân cuộn bằng tay để áp dụng các bản vá ngoài cây như vserver và unionfs.

Ở nhà, tôi đang biên dịch các hạt nhân cuộn bằng tay để tìm ra cam kết nào đã giới thiệu một lỗi mà tôi đang gặp phải. Khi tôi đã hoàn thành điều đó, tôi có thể sẽ dính vào một hạt nhân cuộn bằng tay cho đến khi lỗi được khắc phục trong bản phân phối của tôi (Debian), tại thời điểm đó tôi sẽ trở lại hạt nhân của họ một lần nữa.


2

Chủ đề này đã cũ và vẫn còn hiệu lực như ngày nay khi câu hỏi được hỏi!

Câu trả lời là: Bạn biên dịch kernel linux theo lựa chọn của bạn theo nhu cầu và yêu cầu của bạn.

Nhiều kịch bản có giá trị:

  1. Bạn là một kỹ sư và yêu cầu bản dựng của bạn phải đáp ứng các yêu cầu / yêu cầu về hiệu suất và bảo mật cho hệ thống của bạn, bạn biên dịch lại để đáp ứng và / hoặc vượt qua các tiêu chí đã chỉ định.

  2. Bạn là người dùng bình thường và có một hệ thống cũ mà bạn muốn tiếp tục sử dụng miễn là bạn có thể, bạn biên dịch lại để thêm / xóa các thành phần để giữ cho hệ thống cũ của bạn được tối ưu hóa.

  3. Bạn là người dùng bình thường với phần cứng nhanh nhất mới nhất và nó có quá nhiều bộ nhớ / RAM. Không cần biên dịch lại nhưng bạn vẫn có thể nếu bạn muốn tìm hiểu thêm một chút về hệ thống của mình.

  4. Bạn chỉ muốn giống như một người dùng Microsoft và / hoặc Mac hàng ngày, không biên dịch lại và chỉ đi với các bản cập nhật từ bản phân phối ngược dòng của bạn.

  5. Giữ các kịch bản sắp tới :-)

Không giống như người dùng Mac / Windows, những gì Linux cung cấp là sự lựa chọn. Sự lựa chọn để làm cho nó dễ dàng hoặc tối ưu hóa hệ thống theo yêu cầu của bạn.


1

Đối với hầu hết các sử dụng hạt nhân chung là tốt cho hầu hết mọi phần cứng. Ngoài ra, chúng thường chứa (ed) các bản vá dành riêng cho phân phối để biên dịch kernel của bạn có thể (có thể) gây ra sự cố.

Các cộng hưởng để biên dịch kernel của riêng bạn là:

  • Bạn đang sử dụng bản phân phối dựa trên nguồn nên không có kernel 'generic'
  • Bạn là nhà phát triển kernel và bạn phát triển kernel
  • Bạn phải tùy chỉnh kernel chẳng hạn cho thiết bị nhúng với ổ cứng rất hạn chế
  • Một số trình điều khiển không được biên dịch trong (trường hợp rất hiếm)
  • Bạn muốn vá kernel bạn biết bạn đang làm gì
  • Bạn muốn học cách biên dịch kernel

Nếu tôi không sử dụng bản phân phối dựa trên nguồn, tôi sẽ không biên dịch kernel.


1

Một trường hợp khác ngoài nhiều trường hợp được đề cập ở đây vì có các hạt nhân được biên dịch tùy chỉnh là thiết lập môi trường khởi động mạng chuyên dụng trong đó việc tải mô-đun là không khả thi và bạn phải chuyển các hạt nhân làm việc hoàn toàn cho các máy cụ thể cho các tác vụ cụ thể.


1

Tôi ngạc nhiên khi không ai đề cập đến lý do này để biên dịch kernel tùy chỉnh:

bởi vì bạn muốn sử dụng một trình biên dịch C / c ++ khác. GCC là khá tốt để biên dịch kernel linux. Nhưng có rất nhiều trình biên dịch vượt trội ngoài kia! Tối ưu hóa của GCC chậm hơn một chút so với trình biên dịch C / C ++ của Intel. Và Intel cung cấp các thư viện nguyên thủy hiệu năng và công cụ vtune, cả hai đều không thể thiếu trong việc tạo ra một nhân linux hiệu năng cao. Bạn chỉ có thể đi xa hơn với GCC và G ++. Thực tế không có vấn đề gì bạn làm kết quả sẽ bị giới hạn bởi trình biên dịch. Vì vậy, tôi sử dụng trình biên dịch hiệu năng và thư viện Intel Nó hơi lớn - tải xuống 1,5 GB, nhưng điều đó mang lại một chút ý tưởng về tất cả những gì có trong một trình biên dịch tốt.

Trình biên dịch C / C ++ của Intel có sẵn miễn phí cho sử dụng phi thương mại. Nhưng nó dễ dàng hơn để google trang tải xuống trình biên dịch Intel c ++ phi giấy phép để tìm kiếm trang web của Intel. Tôi không thường sử dụng GCC / G ++ cho bất cứ điều gì. Và bạn không cần phải là một lập trình viên. Bạn chỉ cần đặt môi trường của mình và thay đổi hai dòng trong tệp tạo để trỏ đến trình biên dịch của Intel.

Sau đó, bạn có thể nhận được một số tốc độ nghiêm trọng!


-1

Nếu bạn muốn cài đặt Linux trên phần cứng rất cụ thể, nói kỳ lạ hơn DS , bạn sẽ phải biên dịch chéo kernel của chính mình.

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.