Що таке ядро
Добрий день. Можливо, якщо ви користуйтеся лінуксом, то ви чули всякі страшилки про перезбирання ядра і хотіли б по докладніше розібратися з тим що таке ядро. У цій статті я спробую детально пройтися по цій темі.

Саме ядро знаходиться в директорії / boot і, звичайно, має ім'я на кшталт vmlinuz-linux. Завантажувач під час запуску комп'ютера завантажує його і передає йому управління для завантаження. Але, драйвера всіх залізячки не вкомпілішь в ядро, інакше воно буде занадто здоровим. Тому у linux є динамічно підкачуємі модулі ядра, причому, найчастіше необхідні модулі ядра для завантаження системи теж динамічні. Це означає, що систему так просто не завантажиш: потрібно передбачити механізм завантаження драйверів жорстких дисків, файлових систем і т.д.
Для такого випадку в типовому десятеро передбачений initrd (Initial RAM disk). initrd - це файлова система, де знаходиться мінімальний UNIX, достатній для того, щоб завантажити модулі ядра, необхідні для роботи з дисками, файловими системами, примонтировать розділ жорсткого диска зі встановленою ОС в корінь і продовжити процес завантаження з вмонтованим розділом. Це - демон ініціалізації, shell, утиліти командного рядка (зазвичай, busybox) і модулі ядра. Під час встанови системи або поновлення ядра initrd автоматично збирається і, в результаті, там виявляються необхідні нам модулі.
Тепер, коли ми знаємо про ramdisk, спробуємо організувати процес завантаження по іншому: завантажувач завантажує ядро, завантажує рамдіск і по нікому стандарту повідомляє ядру про цей диск, потім передає управління ядру. Ядро запускає демон ініціалізації. Як правило це / bin / init, той вантажить модулі, показує гарну картинку завантаження вашої Убунту (Федори, Мінта ...) монтує жорсткий диск і працює там.
Давайте переконаємося, що це так. Дружно запускаємо команду
cat / etc / mtab
Якщо система дійсно завантажилася за допомогою initrd, ми побачимо в першому рядку що-небудь на зразок:
rootfs / rootfs rw 0 0
Після rootfs в корінь ФС монтується розділ вашого жорсткого диска. Як і належить, ви після монтування жорсткого диска не можете бачити, що знаходиться в rootfs, проте вона змонтована в корені до нього.
initrd знаходиться в директорії / boot і, в моєму випадку, зветься initramfs-linux.img.
Якщо ви не знайшли ядро або рамдіск раджу подивитися процедуру завантаження в конфігах завантажувача. Якщо ваш завантажувач - GRUB 2, то робиться це так:
cat /boot/grub/grub.cfg
Де модулі?
Модулі в / boot ви можете не шукати, вони знаходяться в папці / lib / modules. Якщо у вас стоїть кілька ядер, то там буде кілька папок. Для того, щоб дізнатися папку запущеного ядра вбийте команду:
uname -r
Модулі ядра мають розширення * .ko і запаковані в архіви.
Let's go!
- make menuconfig - підійде, якщо ми не можемо дозволити собі таку розкіш, як графічний інтерфейс (наприклад, ми не встановили ікси, або вони не запускаються через зміну ядра, або ми працюємо по SSH, хоча збирати ядро по удаленке досить дивно). Буде представлений інтерфейс на псевдографіка, де ми зможемо за допомогою клави відзначити потрібні чекбокси.
- make xconfig - якщо у нас є така розкіш, як графічний інтерфейс і в ньому використовується бібліотека Qt.
- make gconfig - у нас є така розкіш, як графічний інтерфейс, але за дивним збігом обставин ви використовуєте GNOME замість KDE.
- make oldconfig - доповнює старий конфиг новими параметрами, задавши вам кілька запитань.
- make defconfig - настройки, за замовчуванням.
Ми підемо таким шляхом: творець дистрибутива ретельно підбирав настройки ядра і ви точно знаєте, що система з ними працює. Ми візьмемо настройки з робочою системи. Якщо в конфігурації ядра був включений config.gz, то ми можемо знайти цей файл в файловій системі / proc:
cp /proc/config.gz.
gzip -d config.gz
mv config .config
make oldconfig
Далі ми візьмемося всі конфігурувати вже цікавлять нас параметри. По-перше було-б не погано дізнатися, які модулі в наше системі в даний момент завантажені. Команда lsmod видає список модулів в три колонки:
- Module - ім'я модуля
- Size нас не цікавить.
- Used by по суті дві колонки. Перша - це число залежностей від даного модуля. Друга - це ті самі модулі, які його використовують.
Якщо в колонці used by різниця числа модулів і числа залежностей не дорівнює нулю, значить в ядрі є, щось що використовує його і ви не можете цей модуль вивантажити, не ввівши систему в неробочий стан. Це значить, ви не вивантажите драйвер жорсткого диска, який вже примонтовано і на якому встановлена працює в даний момент ОС. Крім, цього є модулі, від яких залежать - ці невивантажуваного модулі. Всі інші ви можете так чи інакше вивантажити в Рантайм командою виду modprobe -r foo і система, швидше за все, залишиться в працездатному стані. Щоб ваша система вантажилася без рам диска вам, як мінімум, потрібно вмонтувати в ядро невивантажуваного модулі. Якщо ви хочете звільнити кілька секунд завантаження, зробивши ядро монолітним, вбудуйте все, що ви бачите в вихлопах команди lsmod. Приступимо до конфігурації:
make menuconfig
Не забудьте перейменувати ядро, для пошуку необхідних опцій годин. Пам'ятайте, що ви не завжди знайдете опцію, що відповідає за той чи інший модуль, в цій справі вам допоможе Google (або Яндекс, Bing, поиск@mail.ru, в залежності, від того, чим ви користуєтеся).
Після, того як ви все налаштували, залишилося ядро зібрати і встановити разом з модулями:
make
Відпочиньте, зробіть чай. У вас з'явилося кілька годин вільного часу, перш ніж ви виконаєте установку:
make install modules_install
Нове ядро буде встановлено як / boot / vmlinuz. Перейменуємо його у vmlinuz-mykern, для того щоб ядро було знайдено GRUB'ом. Крім, цього вам слід зібрати initrd, навіть якщо вважаєте, що система завантажиться без нього, для того щоб переконатися, що вона завантажиться хоча-б з ним. У Арче я роблю це так
mkinitcpio -g /boot/initramfs-mykern.img -k 3.18.6-MYKERN (передбачалося, що ви дали ядру ім'я -MYKERN)
Нам залишається оновити конфіги GRUB'а і ребутнуть систему. Будьте уважні і не видаляйте ядро з десятеро, оскільки ваше ядро виявиться швидше-за все не робочим і вам доведеться в такому випадку брати завантажувальний диск, монтувати жорсткий перейти в chroot оточення і перевстановити ядро (якщо ви не знаєте, як це зробити, вам ще рано збирати заново ядра).
grub-mkconfig -o /boot/grub/grub.cfg
reboot
замість висновку
На цьому я закінчую такий детальний огляд пересборки ядра. Я розповідав про те як компілювати ядро, оскільки опис того, як щось зібрати дає кращий опис, як це щось працює, ніж якась діаграма.
Спробуйте це, переконайтеся, що це не так складно зібрати відповідне ядро з третьої спроби, експериментуйте і пізнавайте систему.