- Компилирање сопственог језгра вам омогућава да оптимизујете перформансе, безбедност и подршку. хардвер подешавање модула, фајл система и специфичних опција.
- Стандардни процес укључује инсталирање зависности, преузимање изворног кода са kernel.org, поновно коришћење тренутне конфигурације и конфигурисање помоћу make menuconfig или xconfig.
- Неопходно је компајлирати и инсталирати језгро и модуле, правилно генерисати initramfs-ове и интегрисати ново језгро у GRUB како би се осигурало боот очишћен.
- Одржавање старијих језгара и знање како вратити претходну верзију или уклонити проблематично језгро је кључно за безбедно експериментисање на било којој дистрибуцији.

Компајлирајте језгро од линук То је један од оних задатака који раздваја радозналог корисника од оног који жели да се дубоко упусти у оперативни системНије обавезно за свакодневно коришћење ГНУ/Линукса, али је одличан начин да боље разумете како ваша машина ради, да извучете максимум из хардвера и да фино подесите систем по свом укусу.
У овом водичу ћете видети, корак по корак, како Преузмите, конфигуришите, компајлирајте и инсталирајте Линук кернел од нуле. Обрадићемо дистрибуције засноване на Дебијану (Дебијан, Убунту, Минт и деривати), као и опште концепте који се примењују на друге породице система попут Федоре или ЦентОС-а. Такође ћемо истражити зашто бисте можда желели да ово урадите, који алати ће вам бити потребни, како да поново користите тренутну конфигурацију језгра, како да подесите опције за Докер или одређени хардвер и како да вратите претходна подешавања ако нешто крене наопако.
Зашто би вас могло занимати компајлирање сопственог језгра
Пре него што се било чега дотакнете, важно је да будете јасни шта желите: Компајлирање кернела није увек неопходноАли постоји неколико убедљивих разлога да се то учини.
- Перформансе и ефикасностУклањање драјвера и функција које никада не користите може убрзати покретање система, користити мање РАМ-а и смањити латенцију под одређеним оптерећењима.
- БезбедностОнемогућавање функција или модула који вам не требају смањује површину за напад. Минималистичкије језгро је, у многим контекстима, безбедније језгро.
- Подршка за одређени хардверПонекад ваша дистрибуција још увек не укључује драјвер који вам је потребан или је онемогућен; компајлирањем сопственог језгра можете активирајте подршку за ваш хардвер (мрежне картице, RAID, уређаји од складиштење неуобичајено, итд.).
- Посебне функцијеМожда бисте желели да испробате нови распоред задатака, специфичне функције за виртуелизацију, Докер, контејнере, БПФ, io_uring или било које друге напредне функције које нису подразумевано омогућене.
- Учење и експериментисањеКомпајлирање кернела је веома једноставан начин да се Научите како је ГНУ/Линукс систем организован интерно, како се хардвер иницијализује и како су модули интегрисани.
Међутим, за кућног корисника који само жели да укључи рачунар, претражује интернет и мало шта друго, Ручно компајлирање кернела је као коришћење топа за убијање мува.То је дуг, деликатан процес и нормално је да се успут поједе и нешто хране. кернел паниц Пре него што га фино подесите. Ако волите да петљате, само напред; ако не, најбоље је да се држите званичних пакета за вашу дистрибуцију.
Шта је тачно Линукс кернел?
Линуксово језгро је централна компонента система: софтвер који се налази између хардвера и осталих програмаОдговоран је за управљање меморијом, процесима, датотечним системима, улазно/излазним уређајима, мрежом, безбедношћу и још много тога.
Линукс је настао 1991. године као лични пројекат Линуса Торвалдса да се направи слободно језгро. Од тада је изузетно порасло: данас говоримо о десетинама милиона линија кода, које одржавају хиљаде програмера под лиценцом ГПЛвКСНУМКССистем који обично називамо „Линукс“ је заправо комбинација Линукс језгро + ГНУ алати и остале компоненте који састављају дистрибуцију.
Када компајлирате прилагођено језгро, генеришете бинарну датотеку (обично /boot/vmlinuz-version) плус скуп модула у /lib/modules/version, праћено датотекама као што су Системска мапа, цонфиг са коришћеном конфигурацијом и почетном сликом за покретање (initrd или initramfs).
Основни алати потребни за компајлирање језгра
Да бисте компајлирали Линукс кернел из изворног кода, потребно вам је комплетно развојно окружење. На Дебијан, Убунту и Минт системима, ово обично укључује инсталирање build-essential и бројне додатне библиотеке и услужне програме.
Многи класични водичи препоручују сетове попут следећих (Можете их прилагодити свом распореду.):
- Минимални сет у Дебијану/Убунтуу за релативно модерно језгро:
sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev libudev-dev libpci-dev libiberty-dev dkms openssl bc autoconf - Дебијан окружење за паковање да бисте изградили .deb пакете језгра:
sudo apt install autoconf automake autotools-dev bison build-essential dh-make debhelper debmake devscripts dpkg fakeroot file gfortran git gnupg fp-compiler lintian patch pbuilder perl quilt xutils-dev
У Федори, ЦентОС-у и дериватимаПриступ се мало мења, али идеја остаје иста: инсталирајте сет развојних алата и библиотеке за конфигурационе интерфејсе (текстуалне и графичке). На пример, следеће се често користе команде стила:
su -c 'yum groupinstall "Development Tools"'
su -c 'yum install ncurses-devel qt-devel unifdef'
Без ових зависности, компилација ће прилично брзо пропасти, тако да је Важно је имати спремно окружење пре преузимања изворног кода.
Где преузети изворни код Линукс кернела
Званични извор за добијање кода језгра је кернел.оргОдатле можете бирати између главне, стабилне и верзије са дугорочном подршком (LTS). Свака има своју фасциклу и везу до тарбалл компримовани.
Неки примери преузимања које се често виђају Туторијали су:
- Стабилно језгро 6.6 за недавно тестирање:
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz - Језгро 6.0.11 (граница v6.x):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.0.11.tar.xz - Језгро 5.10.13 (граница v5.x):
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.13.tar.xz
Такође можете преузети фонтове са репозиторијуми ваше дистрибуцијеНа пример, у Дебијану/Убунтуу постоји пакет linux-source:
sudo apt-get install linux-source
Ово оставља датотеку типа linux-source-xxxtar.bz2 en / уср / срцкоји можете распаковати на сличан начин као kernel.org tarball.
Припремите изворно стабло и простор на диску
Када преузмете tarball језгра, потребно је да га распакујете на локацију где га имате довољно простора и дозвола за писањеНисте обавезни да користите /usr/src, иако је то класика. Можете креирати, на пример, директоријум као што је ~/Преузимања/моја-језгра.
Имајте на уму да, када се не компресује, изворно стабло може бити отприлике КСНУМКС МБи током компилације, ствари лако прескачу изнад КСНУМКС МБЗато оставите доста простора за грешке.
Неке типични примери декомпресије звук:
- Са tar.xz:
tar avxf linux-6.6.tar.xz - Са tar.bz2:
tar jxvf linux-2.6.36.tar.bz2 -C /usr/src - Са tar.gz:
tar zxvf linux-x.x.x.x.tar.gz -C /usr/src
Након распакивања, имаћете директоријум као што је линук-6.6 o линук-5.10.13Можете креирати генеричку симболичку везу под називом linux да не бисте полудели са рутама:
cd /usr/src
sudo ln -s linux-6.0.11 linux
Није обавезно постављати изворе у / уср / срц, иако многи водичи то раде из традиције. Компилација и инсталација ће функционисати исто ако то урадите у свом корисничком фолдеру.под условом да имате простор и одговарајуће дозволе.
Поново користите тренутну конфигурацију језгра
Конфигурисање језгра од нуле, опцију по опцију, је бескрајан задатак чак и за веома искусне људе. Уобичајена пракса је поново користите конфигурацију језгра коју већ користите као полазиште.
Да би се то урадило, прво је потребно знати Које језгро си учитао/учитала? у ово вријеме:
uname -r
Резултат ће бити нешто попут 6.1.0-13-амд64 o 4.19.0-6-амд64Са тим информацијама, можете копирати тренутну конфигурацију из / боот у директоријум новодекомпримованих извора:
cd linux-6.6
cp /boot/config-$(uname -r) .config
Та датотека .цонфиг Ово ће бити онај који систем за изградњу језгра користи као основу. У новијим верзијама, приликом покретања алата за конфигурацију, биће вам затражено само опције које нису постојале у вашем претходном језгрушто штеди огромну количину времена.
Како прилагодити подешавања стварном хардверу
Поред поновног коришћења тренутне .config датотеке, можете је додатно фино подесити користећи алате које пружа само стабло језгра. Један посебно користан алат је направи лоцалмодцонфиг, који покушава да генерише конфигурацију прилагођену модулима које сте у том тренутку учитали.
Унутар изворног директоријума, једноставно покрените:
make localmodconfig
Ова команда прегледа активне модуле и Онемогућава многе ствари које ваш систем не користи.Ово је идеално ако конфигуришете језгро за ту специфичну машину. Ако намеравате да компајлирате генеричко језгро за друге машине или сервере, мораћете пажљиво да га након тога прегледате како бисте били сигурни да нисте изоставили хардвер који није присутан на систему на којем компајлирате.
Режими конфигурације језгра: текстуално и графичко окружење
Конфигурација језгра може се обавити на неколико начина. Сви они на крају генеришу или мењају датотеку .цонфигАли искуство је веома различито у зависности од режима:
- направи конфигурацијуУпитник заснован искључиво на тексту, питање по питање. Данас се сматра практичним само за веома специфичне случајеве; то је споро, досадно и лако је направити грешке.
- направи менуцонфигТекстуални интерфејс менија (ncurses), веома чест на серверима или када немате графичко окружење. Крећете се помоћу тастера са стрелицама, тастера Tab и размакнице.
- направи xconfigГрафички интерфејс базиран на Qt-у, удобан за коришћење миша. Идеалан за рад са целе радне површине.
- направи gconfigГрафички интерфејс базиран на GTK-у, дизајниран за окружења типа GNOME.
У пракси, направи менуцонфиг То је звезда скоро сваког водича јер ради у готово сваком контексту. Почевши од копираног .config фајла, све што треба да урадите је:
make menuconfig
Видећете главни мени са категоријама као што су „Тип и функције процесора“, „Драјвери уређаја“, „Системи датотека“, „Подршка за мреже“, „Виртуелизација“ итд. У свакој од њих моћи ћете да активирати, деактивирати или означити као модул Различите опције. Обично:
- [*] То значи „уграђено“.
- [М] То указује да је „компилиран као модул који се може учитати“.
- [] То је „деактивирано“.
Идеја је да се у језгро интегрише оно што је неопходно за покретање система (на пример, подршка за root диск) и да се користе модули за мање критичне функције или функције које се не користе увектако да је главно зрно лакше.
Свака ставка менија обично има опцију за Помоћ Ово објашњава тачно шта ради и понекад даје подразумевану препоруку. Ако нисте сигурни у вези са нечим веома специфичним, најбоље је да се држите препоручене вредности или оне која је већ била омогућена у претходној конфигурацији.
Корисна подешавања: фајл системи, виртуелизација и Докер
Важан део прилагођавања језгра је добар избор Који фајл системи, механизми контејнера и мрежне опције? Биће вам потребно. На пример, ако планирате да користите партиције НТФС Приликом писања, потребно је да активирате одговарајућу подршку (обично се налази у „Датотечни системи → DOS/FAT/EXFAT/NT Датотечни системи“).
Ако планирате да радите са виртуелизацијом или контејнерима, постоје блокови опција које је важно прегледати. За Docker и Docker Swarm, на пример, постоји низ функције именског простора, контролних група и мреже који мора бити активан:
- хијерархија cgroup-а.
CONFIG_NAMESPACES,CONFIG_NET_NS,CONFIG_PID_NS,CONFIG_IPC_NS,CONFIG_UTS_NS.CONFIG_CGROUPSи подопције као што суCONFIG_CGROUP_CPUACCT,CONFIG_CGROUP_DEVICE,CONFIG_CGROUP_FREEZER,CONFIG_CGROUP_SCHED,CONFIG_CPUSETS,CONFIG_MEMCG.- Кључна подршка (
CONFIG_KEYS). - Мрежне опције као што су
CONFIG_VETH,CONFIG_BRIDGE,CONFIG_BRIDGE_NETFILTER,CONFIG_NF_NAT_IPV4,CONFIG_IP_NF_FILTER,CONFIG_IP_NF_TARGET_MASQUERADE,CONFIG_NETFILTER_XT_MATCH_ADDRTYPE,CONFIG_NETFILTER_XT_MATCH_CONNTRACK,CONFIG_NETFILTER_XT_MATCH_IPVS,CONFIG_IP_NF_NAT,CONFIG_NF_NAT,CONFIG_NF_NAT_NEEDED. - Подршка за ред чекања POSIX (
CONFIG_POSIX_MQUEUE). - Опције попут
CONFIG_IPVLANза одређене мрежне конфигурације које користи Docker.
Већи део ове функционалности може се компајлирати као модул без икаквих проблема, али Препоручљиво је прегледати документацију Докера или користити скрипте за тестирањеПостоје услужни програми као што су check-config.sh који анализирају .config датотеку језгра и говоре вам шта недостаје за потпуну компатибилност контејнера.
Основна механика би била:
chmod +x check-config.sh
./check-config.sh .config
Излаз ће вам показати које су опције у реду, које недостају или које су погрешно конфигурисане. Ако пронађете нешто критично онемогућено, можете га поново покренути. направи менуцонфиг o направи xconfig, исправите га, сачувајте и поновите верификацију.
Занимљива побољшања у новијим верзијама језгра
Поред прилагођавања, многи људи компајлирају нове верзије језгра да би Искористите побољшања перформанси и нове функције којима ће и даље требати неко време да стигну до пакета ваше дистрибуције.
На пример, у Оквир 6.6 Поменута су побољшања као што су:
- Значајно повећање перформанси у EXT4, са повећањима до 34% код одређених истовремених оптерећења писања.
- Побољшања у подршци за графичке процесоре АМД користећи бесплатни драјвер Ноувеау, припремајући терен за возача НВК (Вулкан).
- Опције за конфигуришите аспекте БИОС са HP опреме директно из Linux-а.
- Подешавања заказивања кластера за хибридне процесоре интел (Језеро Алдер, језеро Раптор и касније).
- Оптимизација директног асинхроног У/И са ио_уринг, са повећањем перформанси од око 37% у одређеним тестовима.
- Нови планер задатака, EEVDF (Прво најранији подобан виртуелни рок), што побољшава алокацију процесора између процеса.
Све ово долази „одмах по инсталацији“ у модерним верзијама, али вашој дистрибуцији може бити потребно време да се то спакује или омогући, због чега многи људи прибегавају ручно компајлирајте новији кернел.
Компилирање језгра: make, модули и нити компилације
Када подесите конфигурацију онако како желите, време је да покренете процесор. Ту долазе на ред команде. make (правити) Класична компилација језгра. Компилација може трајати од неколико минута до преко сат времена, у зависности од хардвера и броја модула које генеришете.
У суштини, тхе основни ток У Дебијану/Убунтуу (или другим дистрибуцијама) то је обично:
- Компајлирајте језгро (главна слика):
make -j$(nproc)
Или, ако желите да користи само једно језгро:
make - Компајлирајте и инсталирајте модуле:
sudo make modules_install
Опција -j$(nproc) Говори програму make да користи онолико паралелних процеса колико ваш процесор има језгара, што штеди много времена на модерним машинама. Ако видите грешке током компајлирања, мораћете да их проверите у тренутку када дође до грешке; могу бити узроковане... недостајуће зависности, конфликтне конфигурације или одређене грешке у тој верзији језгра.
Неки напреднији рецепти користе Дебијанов алат make-kpkg и пакет kernel-package да се језгро спакује у .deb датотеке. Ово вам затим омогућава да инсталирате и деинсталирате прилагођено језгро као да је само још један пакет, са нечим попут:
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
cd /usr/src
sudo dpkg -i *.deb
У том сценарију, такође је уобичајено да се наиђе на грешке повезане са сертификати језграМноги водичи решавају специфичне проблеме онемогућавањем поузданих кључева у .config датотеци помоћу линије попут ове:
sed -i '/CONFIG_SYSTEM_TRUSTED_KEYS/s/^/#/g' .config
Инсталирајте новокомпилирано језгро и ажурирајте покретачки програм
Ако не користите .deb пакет и користите стандардне алате за стабло језгра „без везова“, Инсталација се врши директно из изворног директоријумаНајчешћи редослед након компилације је:
- Инсталирајте модуле (ако већ нисте):
sudo make modules_install - Инсталирајте језгро:
sudo make install
Сопствени систем скриптовања језгра ће копирати бинарни фајл бзИмаге генерисано у /boot, заједно са System.map и конфигурационом датотеком. У Debian/Ubuntu, скрипте се обично покрећу у /etc/kernel/postinst.d који генеришу инитрамфс и аутоматски ажурирајте менаџер покретања (GRUB).
Упркос томе, никада не шкоди експлицитно извршити:
sudo update-initramfs -u
sudo update-grub
sudo update-grub2
Са овим Уверите се да је почетна слика за покретање исправно регенерисана. за нову верзију језгра и да GRUB то узима у обзир у свом менију. У другим дистрибуцијама, као што су неке засноване на Red Hat-у, може се користити мкинитрд o драцут уместо update-initramfs, али циљ је исти: креирајте initrd/initramfs слику погодну за ново језгро.
Улога initrd/initramfs и потенцијални проблеми
Initrd или initramfs је слика фајл система која се учитава у меморију веома рано у процесу покретања системаСадржи минималне драјвере потребне за монтирање стварног коренског фајл система (на пример, подршку за SATA или NVMe контролер где се налази ваша / партиција).
Ако је ваш initrd неправилно генерисан или не садржи потребне модуле, језгро ће се покренути, али неће моћи да се монтира / и завршићете са кернел паниц жали се да не може да пронађе корен фајл систем. Ово је типична грешка када су критичне опције језгра онемогућене или је initramfs заборављен након промене верзија.
У Дебијану/Убунтуу, референтна команда данас је ажурирање инитрамфс:
sudo update-initramfs -c -k x.x.x
Параметар -c ствара нову слику и -k означава тачну верзију језгра. У старијим дистрибуцијама (или са различитим алатима) коришћена је мкинитрд са сличном синтаксом:
cd /boot
mkinitrd -o initrd.img-2.6.36 2.6.36
У сваком случају, ако након инсталирања вашег прилагођеног језгра видите грешке везане за /lib/modules или за монтирање root-а, Прво, проверите initramfs/initrd и GRUB конфигурацију. пре него што додирнете било шта друго.
Проверите да ли ново језгро исправно ради
Када је све инсталирано и менаџер покретања ажуриран, време је за поновно покретање система како би се тестирао систем. Током покретања, праћење GRUB-а и порука о покретању језгра у случају да се грешке појаве из модула, фајл система или уређаја који нису препознати.
Када уђете у систем, можете проверити коју верзију кернела користите са:
uname -a
Излаз треба да одражава новокомпилирана верзијаОдатле је потребно тестирати ваше уобичајене сервисе: веб сервер, базе података, Докер, виртуелне машинедесктоп програми итд. Ако све исправно функционише, можете оставити то језгро као главно и чувати старије верзије као резервне копије.
Како се вратити на претходно језгро и деинсталирати ново
Ако нешто крене наопако (што се може десити, посебно првих неколико пута), важно је да Не паничитеДокле год ваш GRUB наводи остала радна језгра, можете опоравити систем без већих проблема.
Процес типично би:
- Поново покрените систем.
- На GRUB екрану се крећите помоћу стрелица и унесите одељак типа „Напредне опције за…“.
- Изаберите старију верзију кернела за коју знате да је добро функционисала.
- Покрените систем са тим кернелом и, када уђете унутра, наставите са брисањем проблематичног кернела.
Ако сте ручно инсталирали језгро, без .deb пакета, уклањање обично укључује обришите одговарајуће датотеке у /boot и /lib/modulesНа пример, да бисте уклонили верзију 6.6.0, можете урадити следеће:
cd /boot
sudo rm config-6.6.0 initrd.img-6.6.0 System.map-6.6.0 vmlinuz-6.6.0
А затим, обришите његове модуле:
cd /lib/modules
sudo rm -rf 6.6.0
Када завршите, ажурирајте GRUB тако да више не нуди то језгро у менију и поново покрените систем:
sudo update-grub
sudo update-grub2
sudo reboot
Ако сте инсталирали језгро упаковано као .deb, оно је чистије. Користите га као и било који други пакет Користите apt или dpkg да бисте га деинсталирали, држећи стање система под бољом контролом.
Напомене за друге дистрибуције: Fedora, CentOS и друге
Иако се овај водич у великој мери фокусира на Debian/Ubuntu/Mint, општа логика је слична у дистрибуцијама заснованим на Red Hat-у као што су Fedora или CentOS. Које су промене алати за управљање пакетима, нека имена зависности и како приступити менаџеру покретања.
На пример, у Fedora/CentOS-у, основни ток рада за компајлирање језгра са kernel.org може бити:
- Инсталирајте развојне алате:
su -c 'yum groupinstall "Development Tools"'
su -c 'yum install ncurses-devel qt-devel unifdef' - Преузмите стабилну верзију (као што је 2.6.36 у класичним примерима):
cd /tmp
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.tar.bz2 - Распакујте и припремите изворно стабло:
mkdir /usr/src/linux
tar -xjvf linux-2.6.36.tar.bz2 -C /usr/src/linux
cd /usr/src/linux - Конфигуришите језгро користећи menuconfig, xconfig или gconfig.
- Саставите и инсталирајте:
make
make modules
make modules_install
make install
Онда ћете морати да прегледате и измените /boot/grub/grub.conf (или еквивалентну датотеку, у зависности од тога да ли користите GRUB Legacy, GRUB2, итд.) да бисте додали унос за ново језгро са одговарајућим initrd-ом, водећи рачуна о путањама роот = и референце на логичке томове ако користите LVM.
Компилирање, конфигурисање и инсталирање прилагођеног Линукс кернела је дуг, али невероватно поучан процес: тера вас да разумете које модуле треба да покренете, које опције су неопходне за ваше сервисе (као што су Докер или виртуелизација), како су initramfs и GRUB интегрисани у процес покретања и како увек одржавати резервну опцију за враћање на претходно кернел ако нешто крене наопако. Ако одвојите време да прегледате сваки одељак, интелигентно поново користите тренутну конфигурацију кернела и навикнете се на постепено тестирање промена, можете на крају уживати у заиста моћном систему. оптимизованији, прилагођенији вашем хардверу и усклађенији са вашим стварним потребама него што пружају генеричка језгра већине дистрибуција.
Страствени писац о свету бајтова и технологије уопште. Волим да делим своје знање кроз писање, и то је оно што ћу радити на овом блогу, показивати вам све најзанимљивије ствари о гаџетима, софтверу, хардверу, технолошким трендовима и још много тога. Мој циљ је да вам помогнем да се крећете у дигиталном свету на једноставан и забаван начин.