Jaka jest korzyść z kompilacji własnego jądra Linux?

101

Jaką korzyść mogę zobaczyć, samemu kompilując jądro Linuksa? Czy jest jakaś wydajność, którą można by uzyskać, dostosowując ją do swojego sprzętu?

jjclarkson
źródło
proste pytanie, na czym polega korzyść, staje się bardzo niejasne lub bardzo szybko wyrwane z kontekstu. Byłoby o wiele lepiej zapytać What are the pros and cons of compiling your own kernel? Cons = niełatwe, wiele sytuacji bez wartości dodanej. Plusy = bezpieczeństwo, wydajność, jeśli wiesz, co robisz, na przykład urządzenia NAS, używając Linuksa, aby jakiś sprzęt działał i miał możliwości sieciowe i graficzne.
ron

Odpowiedzi:

73

Moim zdaniem jedyną korzyścią, jaką naprawdę czerpiesz ze skompilowania własnego jądra linuksa, jest:

Dowiesz się, jak skompilować własne jądro Linux.

To nie jest coś, co musisz zrobić, aby uzyskać większą prędkość / pamięć / xxx cokolwiek. Jest to cenna rzecz do zrobienia, jeśli czujesz, że jesteś na etapie rozwoju. Jeśli chcesz głębiej zrozumieć, na czym polega cała ta sprawa „open source”, jak i jakie są różne części jądra, powinieneś spróbować. Jeśli chcesz tylko przyspieszyć swój rozruch o 3 sekundy, to ... o co chodzi ... idź kupić SSD. Jeśli jesteś ciekawy, jeśli chcesz się uczyć, to skompilowanie własnego jądra jest świetnym pomysłem i prawdopodobnie z niego wiele skorzystasz.

Mając to na uwadze, istnieje kilka konkretnych powodów, dla których właściwe byłoby skompilowanie własnego jądra (jak wskazało kilka osób w innych odpowiedziach). Zasadniczo wynikają one z konkretnej potrzeby konkretnego wyniku, na przykład:

  • Muszę zmusić system do uruchomienia / uruchomienia na sprzęcie z ograniczonymi zasobami
  • Muszę przetestować łatkę i przekazać opinie programistom
  • Muszę wyłączyć coś, co powoduje konflikt
  • Muszę rozwinąć jądro Linuksa
  • Muszę włączyć obsługę mojego nieobsługiwanego sprzętu
  • Muszę poprawić wydajność x, ponieważ osiągam obecne limity systemu (i wiem, co robię)

Problem polega na myśleniu, że kompilacja własnego jądra wiąże się z pewnymi istotnymi korzyściami, gdy wszystko działa już tak, jak powinno, i nie sądzę, że tak jest. Chociaż możesz spędzić niezliczone godziny na wyłączaniu rzeczy, których nie potrzebujesz i poprawianiu rzeczy, które można ulepszyć, faktem jest, że jądro Linuksa jest już dość dobrze dostrojone (według twojej dystrybucji) w większości sytuacji użytkowników.

Gabe.
źródło
25
Argumentowałbym, że jeśli chcesz zbudować własne jądro wyłącznie do nauki, to robisz to za pomocą źródłowej dystrybucji Linuksa, takiej jak Gentoo lub Linux From Scratch. Dokumentacja instalacji etapu 2 Gentoo jest doskonałym przewodnikiem po zrozumieniu, co oznacza budowanie Linuksa od jądra.
Sandy,
Uzgodnione ... te dwa projekty są zbudowane dla tego typu rzeczy.
Gabe.
Oczywiście wiesz, że faktycznie zaprzeczasz sobie w swojej odpowiedzi. Jeśli jedyną korzyścią z kompilacji jądra było nauczenie się, jak to zrobić, byłoby to bezużyteczne - nie miałoby żadnej wartości. Ale potem kilka słów później mówisz, że jest to cenna rzecz ...
rozcietrzewiacz
@rozcietrzewiacz Wiedza ma najwyższą wartość. Kompilacja jądra pomaga poszerzyć wiedzę. Jeśli tego nie kupisz, to oto - wiedza to potęga, a ludzie płacą dobre pieniądze, aby zdobyć władzę, a pieniądze mają wartość w dzisiejszym świecie, więc dzięki własności przechodniej ....: P
lunchmeat317
Zgadzam się, warto tylko ze względu na zdobytą wiedzę.
1100110
35

Większość użytkowników nie musi kompilować własnego jądra, ich dystrybucja wykonała dla nich tę pracę. Zwykle dystrybucje zawierają zestaw poprawek do zintegrowania z niektórymi częściami sposobu działania dystrybucji, backportami sterowników urządzeń i poprawkami z nowszych, ale niepublikowanych wersji jądra lub funkcji, które są pionierami wśród swoich użytkowników.

Kiedy kompilujesz własne jądro, masz kilka opcji, możesz skompilować oficjalne jądro Linusa Torvaldsa, nie będzie to obejmowało żadnych łat ani dostosowań dodanych przez twoją dystrybucję (które mogą być dobre lub złe) lub możesz użyj narzędzia do przebudowy dystrybucji, aby zbudować własne jądro.

Powody, dla których możesz chcieć odbudować jądro to:

  • Łagodzenie błędów lub dodawanie określonej funkcji do systemu produkcyjnego, w której tak naprawdę nie można ryzykować aktualizacji całego jądra dla jednej poprawki lub dwóch.
  • Aby wypróbować określony sterownik urządzenia lub nową funkcję
  • Aby rozszerzyć jądro, popracuj nad nim
  • testowanie niektórych modułów lub funkcji „Alpha”.

Wielu programistów używa go do tworzenia niestandardowych wersji jądra dla systemów osadzonych lub urządzeń typu set-box, w których potrzebują specjalnych sterowników urządzeń lub chcą usunąć funkcje, których nie potrzebują.

miguel.de.icaza
źródło
8
+1. Dzieciaki, teraz nie wiedzą nawet, co znaczy „make menuconfig” i nigdy nie musiały łatać kodu sieciowego jądra, aby nie dać się porwać dzieciom skryptowym. Na szczęście te dni już minęły.
axel_c
2
powinieneś dodać bisecting, aby dowiedzieć się, gdzie został wprowadzony błąd ...
xenoterracide
1
zdumiewające, jak głosował ten komentarz, gdy nie ma on nic wspólnego z pytaniem PO. „Większość użytkowników nie…” dalej. Pytanie PO jest bardzo jasne o chęci poznania korzyści; nie twoja opinia o tym, co „większość użytkowników” robi tu i tam.
Eric
30

Samodzielna kompilacja jądra pozwala na dołączenie tylko części istotnych dla twojego komputera, co czyni go mniejszym i potencjalnie szybszym, szczególnie podczas uruchamiania. Ogólne jądra muszą zawierać wsparcie dla jak największej ilości sprzętu; w czasie rozruchu wykrywają sprzęt podłączony do komputera i ładują odpowiednie moduły, ale zajmuje to dużo czasu i muszą załadować moduły dynamiczne, a nie kod upieczony bezpośrednio w jądrze. Nie ma powodu, aby jądro obsługiwało 400 różnych procesorów, gdy w komputerze jest tylko jeden, lub wspierać myszy Bluetooth, jeśli go nie masz, to wszystko zmarnowane miejsce, które możesz zwolnić

Michał Mrożek
źródło
15
Zgadzam się z większością odpowiedzi, ale byłbym ciekawy kilku twardych faktów na temat „znacznie szybszego”. Nie chciałbym dać nowemu użytkownikowi wrażenia, że ​​jego pulpit będzie działał ogólnie szybciej z ręcznie zbudowanym jądrem (z mojego doświadczenia z Gentoo, to po prostu nieprawda). Czy potrafisz określić przyrost prędkości rozruchu?
Sandy,
2
Ta odpowiedź była prawdą 15 lat temu, ale w dzisiejszych czasach nie jest tak naprawdę istotna. Większość sterowników i tak występuje w modułach, więc zajmują tylko miejsce na dysku, a nie w pamięci. (A może niektóre dystrybucje wciąż przychodzą bez initrd? Bez initrd jądro musi zawierać wszystkie sterowniki, których może potrzebować do uruchomienia). Jeśli chodzi o czas uruchamiania, kilka sterowników, które spędzają ponad milisekundę na wykryciu nieistniejącego sprzętu, można wyłączyć z opcją rozruchu jądra.
Gilles,
1
@Michael, jeśli jest to niezweryfikowane założenie, myślę, że zastąpienie słowa „znacznie szybszy” słowem „potencjalnie szybszy” w twojej odpowiedzi może być dobrym pomysłem ... aby upewnić się, że żadne n00bs nie jest wprowadzane w błąd. :-)
Sandy,
3
@Sandy zgodził się, ponieważ wygląda na to, że jestem jednym z tych n00bs :). Stałe
Michał Mrozek
2
Myślę, że „znacznie” szybciej jest właściwie uzasadnione zastrzeżeniem, że mówimy o czasach rozruchu. Standardowe jądra dystrybucji zajmują 5–10 sekund dłużej na uruchomienie tego, którego usunąłem, aby nie szukać sprzętu, którego nie planuję używać. Szybkość działania jest prawdopodobnie znikoma, nie mogę tego dokładnie zmierzyć.
Kaleb
24

Nie mogę uwierzyć, że przyjęta tutaj odpowiedź zaczyna się od stwierdzenia: „To nie jest coś, co musisz zrobić, aby uzyskać większą prędkość / pamięć / xxx cokolwiek”.

To jest całkowicie fałszywe. Rutynowo buduję własne jądra, aby zarówno usuwać niepotrzebny kod, jak i dołączać kod zwiększający wydajność, głównie związany ze sprzętem. Na przykład korzystam ze starszego sprzętu i mogę uzyskać pewien wzrost wydajności, włączając rzadko włączane sterowniki jądra, takie jak obsługa mikroukładu HPT36x w niektórych starszych MoBos, które mają tę wbudowaną funkcję.

Kolejny przykład, BIG SMP pod Slackware jest domyślny i na przykład na Dell 2800 zużyje znaczny ślad, aby uruchomić takie rzeczy jak GFSD (nie jako moduł jądra), który, nawiasem mówiąc, zużywa tagi procesora dla czegoś, co I nie potrzebuję Podobnie dla NFSD i innych catch-all, aby zadowolić wszystkie mentalności, co jest w porządku, jeśli próbujesz uruchomić Linuksa na komputerze i działać, ale jeśli zależy ci na „szybkości / pamięci / xxx cokolwiek”, to te rzeczy mają znaczenie i działają .

Wszystkie moje pudełka produkcyjne to niestandardowe jądra. Jeśli korzystam ze zwykłego sprzętu, takiego jak sprzęt Dell (2800, 2850, 2900 itp.), Wystarczy skopiować plik .config jądra do każdego urządzenia, skompilować jądro i zainstalować.

Eric
źródło
3
Myślę, że głównym punktem przyjętej odpowiedzi jest to, że w przypadku większości urządzeń wydajność uzyskana dzięki kompilacji własnego jądra nie jest warta czasu potrzebnego na nauczenie się, jak to zrobić (i dowiedzieć się, co oznaczają opcje). Prawdopodobnie jest to empiryczne: byłoby wspaniale znaleźć jakieś liczby na ten temat.
Andres Riofrio,
dobrze więc, że nieuczciwe jest nie podawać tego w pierwotnym pytaniu, a następnie zaakceptować odpowiedzi, na której się opierasz.
Eric
2
Cóż, to nie moja wina, że ​​moja odpowiedź została zaakceptowana. I choć tak, zdarzają się przypadki, gdy kompilacja jądra pomoże ci „sprawdzić wydajność” lub uruchomić się na maszynie o małej mocy, założyłem, że pierwotne pytanie zostało zadane przez kogoś, kto nie miał określonego potrzebowałem z wyprzedzeniem i byłem po prostu ciekawy w ogólnym sensie, jaką korzyścią było skompilowanie jądra. Twierdziłbym, że tylko osoby z konkretnymi wymaganiami korzystają z poprawek jądra. Ponieważ moja odpowiedź została zaakceptowana, poprawię ją, aby uwzględnić przyczyny, dla których niestandardowe jądra są bardziej
zaawansowane
14

Oto kilka sytuacji, w których kompilacja własnego jądra przyniesie korzyści:

  • Jądro z wyłączonym ładowaniem modułu jest bezpieczniejsze. Będzie to wymagało wybrania modułów, o których wiesz, że potrzebujesz i włączenia ich jako części jądra, a nie kompilacji ich jako modułów.

  • Wyłączenie wsparcia dla / dev / kmem lub okaleczenie go odpowiednią opcją kompilatora jest dobrym rozwiązaniem dla bezpieczeństwa. Myślę, że większość dystrybucji robi to teraz domyślnie.

  • Wolę nie używać initrd, jeśli to możliwe. Dostosowanie jądra do sprzętu, z którego uruchamia się, eliminuje initrd.

  • Czasami późniejsza wersja jądra będzie miała potrzebne funkcje, ale dzisiaj jest to bardzo rzadkie. Pamiętam, kiedy po raz pierwszy zacząłem używać Debiana, używałem jądra 2.4, ale potrzebowałem jądra 2.6 do obsługi udev.

  • Wyłączenie niepotrzebnych protokołów / opcji sieciowych może przyspieszyć działanie protokołu TCP / IP.

  • Wyłączenie niepotrzebnych opcji obniża zużycie pamięci jądra, co jest ważne w środowiskach o niskiej pamięci RAM. Pomaga to w przypadku korzystania z 256 MB systemu RAM jako routera.

  • Uważam, że wszystkie urządzenia „tty” w / dev są denerwujące w systemach, w których generalnie loguję się tylko przez port szeregowy lub ssh.

LawrenceC
źródło
Wszystko prawda. Jednak usunięcie ładowania modułu może powodować problemy podczas uruchamiania: większość, jeśli nie wszystkie, dzisiejsze dystrybucje zakładają, że moduły będą musiały zostać załadowane. Ostatnim razem, gdy wyłączyłem moduły, spowodowało to pojawienie się wielu komunikatów o błędach podczas uruchamiania systemu Red Hat.
Mei
7

Kompilacja własnego jądra pozwala uczestniczyć w procesie rozwoju jądra, niezależnie od tego, czy jest to proste, takie jak dostarczanie identyfikatorów urządzeń PCI / USB dla istniejącego sterownika, który może sprawić, że nowsze urządzenie będzie działać, aby głęboko zaangażować się w walkę rdzenia rozwój jądra.

Pozwala także testować jądra programistyczne na sprzęcie i przekazywać informacje zwrotne w przypadku zauważenia jakichkolwiek regresji. Może to być szczególnie pomocne dla Ciebie i innych osób, jeśli masz nietypowy sprzęt. Jeśli czekasz na jądro dystrybucji, może upłynąć trochę czasu, zanim poprawki z raportów o problemach zostaną przefiltrowane do nowej wersji jądra dystrybucji.

Osobiście lubię też kompilować własne jądra, aby zapewnić obsługę tylko posiadanego sprzętu. Kiedy uruchamiasz jądra dystrybucyjne i patrzysz na wynik lsmod(8), widzisz wiele modułów załadowanych dla sprzętu, którego nie masz. Może to skazić listę modułów, / proc, / sys i twoje logi, tak że gdy czegoś szukasz, może się ukryć wśród hałasu; Nie możesz być również w 100% pewien, że te moduły nie przyczyniają się do problemu, który próbujesz zdiagnozować.

camh
źródło
6

Druga odpowiedź gabe. (Mój komentarz jest za długi, więc zamieszczam jako odpowiedź).

Jeśli nie masz wysoce wyspecjalizowanego celu (np. Wbudowane maszyny, ścisłe profilowanie bezpieczeństwa), nie widzę żadnych praktycznych korzyści z kompilacji własnego jądra poza tym, jak to zrobić. Metodyczne przeglądanie opcji i sprawdzanie, jak współdziałają ze sobą w celu zbudowania systemu, jest świetnym sposobem na zrozumienie działania systemu. To niesamowite, co dowiadujesz się, gdy próbujesz usunąć komponenty, które wydają się nie mieć żadnego celu dla zadań, które próbujesz wykonać.

Ostrzegamy jednak - dlaczego zeskakiwanie do króliczej nory jest niewątpliwie ekscytujące, wysysa więcej nocy i weekendów, niż myślałeś, że to możliwe!

gvkv
źródło
3

W pracy używamy ręcznie zwijanych jąder, aby stosować łatki spoza drzewa, takie jak vserver i unionfs.

W domu kompiluję ręcznie zwijane jądra, aby sprawdzić, które zatwierdzenie wprowadziło występujący błąd. Kiedy to skończę, prawdopodobnie przykleję się do ręcznie zwijanego jądra, dopóki błąd nie zostanie naprawiony w mojej dystrybucji (Debian), w którym to momencie powrócę do ich jąder.

jmtd
źródło
2

Wątek ten ma już wiele lat, a mimo to jest aktualny, tak jak wtedy, gdy zadano pytanie!

Odpowiedź brzmi: kompilujesz wybrane jądro Linuksa zgodnie z potrzebami i wymaganiami.

Wiele scenariuszy jest poprawnych:

  1. Jesteś inżynierem i wymaga twojej kompilacji do spełnienia wymagań / wymagań dotyczących wydajności i bezpieczeństwa twojego systemu, rekompilujesz, aby spełnić i / lub przekroczyć określone kryteria.

  2. Jesteś zwykłym użytkownikiem i masz stary system, który chcesz kontynuować tak długo, jak to możliwe, rekompilujesz, aby dodać / usunąć komponenty, aby zoptymalizować stary system.

  3. Jesteś zwykłym użytkownikiem z najnowszym najszybszym sprzętem i ma on więcej niż wystarczającą ilość pamięci / pamięci RAM. Nie ma potrzeby ponownej kompilacji, ale nadal możesz, jeśli chcesz dowiedzieć się więcej o swoim systemie.

  4. Po prostu chcesz być jak codzienny użytkownik Microsoft i / lub Mac, nie rekompiluj i po prostu korzystaj z aktualizacji z dystrybucji.

  5. Nadchodzące scenariusze :-)

W przeciwieństwie do użytkowników komputerów Mac / Windows Linux zapewnia wybór. Wybór, aby ułatwić lub zoptymalizować system do swoich wymagań.

użytkownik4565
źródło
1

W przypadku większości zastosowań ogólne jądra są odpowiednie dla praktycznie dowolnego sprzętu. Dodatkowo zazwyczaj zawierają (ed) łaty specyficzne dla dystrybucji, więc skompilowanie własnego jądra może (może) powodować problemy.

Rezonsem do kompilacji własnego jądra są:

  • Używasz dystrybucji opartej na źródłach, więc nie ma jądra „ogólnego”
  • Jesteś programistą jądra i rozwijasz jądro
  • Musisz dostosować jądro na przykład dla urządzenia osadzonego z bardzo ograniczonym dyskiem twardym
  • Niektóre sterowniki nie są kompilowane (bardzo rzadki przypadek)
  • Chcesz załatać jądro ORAZ wiesz, co robisz
  • Chcesz nauczyć się kompilować jądro

Gdybym nie używał dystrybucji opartej na źródłach, w ogóle nie skompilowałbym jądra.

Maciej Piechotka
źródło
1

Innym przypadkiem poza wieloma wymienionymi tutaj dla niestandardowych skompilowanych jąder jest konfigurowanie specjalistycznych sieciowych środowisk rozruchowych, w których ładowanie modułów nie jest możliwe i trzeba przekazywać w pełni działające jądra do określonych maszyn do określonych zadań.

Caleb
źródło
1

Dziwi mnie, że nikt nie wspomniał o tym powodzie kompilacji niestandardowego jądra:

ponieważ chcesz użyć innego kompilatora C / c ++. GCC jest całkiem dobry do kompilacji jądra Linuksa. Ale są tam znacznie lepsze kompilatory! Optymalizacje GCC są nieco za kompilatorem C / C ++ Intela. Intel dostarcza biblioteki prymitywów wydajności i narzędzie vtune, które są niezbędne do stworzenia wysokowydajnego jądra Linux. Do tej pory możesz dostać się tylko dzięki GCC i G ++. Praktycznie bez względu na to, co robisz, wynik będzie ograniczony przez kompilator. Używam więc kompilatora Intel i bibliotek wydajności. Jest trochę duży - pobiera 1,5 GB, ale daje to pojęcie o tym, co jest zawarte w dobrym kompilatorze.

Kompilator C / C ++ firmy Intel jest dostępny bezpłatnie do użytku niekomercyjnego. Łatwiej jest jednak przejrzeć stronę pobierania niekomercyjnej licencji kompilatora Intel c ++, aby przeszukać witrynę firmy Intel. Zwykle nie używam GCC / G ++ do niczego. I nie musisz być programistą. Wystarczy ustawić środowisko i zmienić dwie linie w pliku make, aby wskazywały na kompilator Intela.

Wtedy możesz uzyskać poważną prędkość!

SwanSword
źródło
-1

Jeśli chcesz zainstalować Linuksa na bardzo specyficznym sprzęcie, powiedzmy bardziej egzotycznym niż DS , będziesz musiał skompilować krzyżowo własne jądro.

mouviciel
źródło