Налаштування, компілювання та встановлення користувальницького ядра Linux


38

Я хотів би спробувати використовувати ядро, відмінне від того, яке надає мій дистрибутив - або з іншого місця, або як я налаштовував мене. Це важко чи небезпечно?

З чого я починаю?

Відповіді:


51

Створення власного ядра може зайняти багато часу - в основному в конфігурації, оскільки сучасні комп’ютери можуть робити збірку за лічені хвилини - але це не особливо небезпечно, якщо ви зберігаєте своє поточне, робоче ядро ​​і не забудьте залишити це як опція через завантажувач (див. крок №6 нижче). Таким чином, якщо ваш новий не працює, ви можете просто перезавантажити старий.

У наступних інструкціях шляхи всередині вихідного дерева приймають форму [src]/whatever, де [src]знаходиться каталог, у який ви встановили джерело, наприклад /usr/src/linux-3.13.3. Ви, мабуть, хочете зробити цей матеріал, su rootоскільки дерево-джерело повинне залишатися захищеним в плані дозволу на запис (воно повинно належати root).

Хоча деякі етапи необов’язкові, ви все одно повинні прочитати їх, оскільки вони містять інформацію, необхідну для розуміння решти процесу.

  1. Завантажте та розпакуйте вихідний тарбол.

    Вони доступні на kernel.org . Останні перелічені на першій сторінці, але якщо ви заглянете всередину /pub/каталогу, ви знайдете архів, який повертається до версії 1.0. Якщо у вас немає особливих причин зробити інше, вам краще просто вибрати "Останній стабільний". На момент написання цього тексту це tar.xzфайл розміром 74 Мб .

    Після завантаження тарболу вам потрібно десь розпакувати його. Нормальне місце знаходиться в /usr/src. Помістіть файл і:

    tar -xJf linux-X.X.X.tar.xz
    

    Зауважте, що окремі дистрибутиви зазвичай рекомендують використовувати один із вихідних пакетів замість ванільного дерева. Він містить виправлення для конкретного дистрибутива, які можуть не мати значення для вас. Він також буде відповідати ядрам, включаючи заголовки, які використовуються для компіляції деяких інструментів простору користувачів, хоча вони, швидше за все, однакові.

    За 15+ років створення власних ядер (переважно в Fedora / Debian / Ubuntu) у мене ніколи не було проблем із використанням джерела ванілі 1 . Це дійсно не має великої різниці, однак, поза тим, що якщо ви хочете абсолютного останнього ядра, ваш дистрибутив, ймовірно, ще не пакував його. Тому найбезпечнішим маршрутом все ж є використання пакета distro, який слід встановити в /usr/src. Я віддаю перевагу останню конюшню, щоб я міг діяти як морська свинка, перш ніж її розкачатимуть у дистрибутиві :)

  2. Почніть з базової конфігурації [необов’язково].

    Вам не потрібно цього робити - ви можете просто зануритися прямо і створити конфігурацію з нуля. Однак якщо ви ніколи цього не робили, очікуйте багато спроб та помилок. Це також означає, що ви повинні прочитати більшість варіантів (їх сотні). Краще зробити ставку на використання наявної конфігурації, якщо вона є. Якщо ви використовували пакунок джерела дистрибутива, він, ймовірно, вже містить [src]/.configфайл, тому ви можете використовувати його. В іншому випадку перевірте наявність /proc/config.gz. Це додаткова функція, додана в ядрі 2.6. Якщо він існує, скопіюйте це у верхній рівень вихідного дерева та gunzip -c config.gz > .config.

Якщо його не існує, можливо, тому що ця опція була налаштована як модуль. Спробуйте sudo modprobe configs, а потім знову перевірте /procкаталог config.gz.

Конфігурація дистрибутива не дуже ідеальна в тому сенсі, що вона включає практично кожен можливий апаратний драйвер. Це не має великого значення для функціональності ядра, оскільки вони є модулями, і більшість з них ніколи не звикне, але це дуже суттєво збільшує час, необхідний для створення. Це також незручно тим, що він вимагає, щоб initramfs містив певні основні модулі (див. Крок №4 нижче). Однак це, мабуть, краща відправна точка, ніж за замовчуванням.

Зауважте, що параметри конфігурації змінюються та змінюються від однієї версії ядра до іншої, і коли ви запустите одну з make configпрограм нижче .config, спочатку буде проаналізовано та оновлено відповідність новій версії. Якщо конфігурація має значно старішу версію, це може призвести до дивних результатів, тому зверніть увагу, коли ви робите конфігурацію. AFAIK не буде працювати навпаки (використовуючи конфігурацію з нової версії).

  1. Створіть .configурацію.

    [src]/.configце текстовий файл, який використовується для налаштування ядра. Не редагуйте цей файл безпосередньо . Зміна параметрів часто не є простим питанням заміни на Yі Nт.д.; зазвичай існує набір можливостей взаємозалежності та розгалуження. Замість цього ви хочете використовувати одну з конфігураційних цілей з makefile ядра (тобто введіть make _____у командному рядку з вихідного каталогу верхнього рівня):

    • make configє найосновнішим, але, мабуть, не на смак більшості людей. Це послідовність питань - багато запитань - і якщо ви передумаєте, вам доведеться починати заново.

    • make oldconfigце як, make configза винятком випадків, якщо ви вже маєте .configпопередню версію, буде пропускати питання, крім тих, що стосуються нових параметрів. Тих може бути ще багато, і більшість з них буде для вас неактуальним, тому я не рекомендую.

    • make menuconfigє моїм (і я думаю, що більшість інших) кращим методом. Він створює та виконує інтерфейс TUI (кольорові меню, які працюватимуть на терміналі). Для цього потрібно встановити -devпакет для ncurses. Це досить зрозуміло, за винятком сечі, до яких можна дістатися через /; F1 "довідка" дає пояснення для поточного варіанту. Існує альтернативна версія, make nconfigяка має кілька додаткових функцій, де F2 "syminfo" є еквівалентом F1 menuconfig.

    • make xconfigє повним інтерфейсом GUI. Для цього потрібно qmakeвстановити -devпакет для Qt, оскільки, знову ж таки, це програма, яка компілюється та будується. Якщо ви не використовували їх раніше, це може бути істотним завантаженням. Причиною, яку я віддаю перевагу menuconfigверсії GUI, є те, що ієрархії опцій представлені за допомогою послідовних екранів у першому, але відкритому гармошці, як у другому.

    Одне з перших, що ви повинні (але цього не потрібно робити) - це додати рядок "Локальна версія" (у розділі Загальна настройка ). Причина цього згадується у №5 нижче.

    "Лабіринтин" - це хороший спосіб описати ієрархію варіантів, і деталізація з нею виходить далеко за межі питань Q&A, як ця. Якщо ви хочете сісти і пройти все, відкладіть години . Грег Кроах-Хартман (довгий час ведучий розробник для ядра Linux) має безкоштовну онлайн-книгу про ядро ​​(див. Посилання нижче), яка містить розділ про конфігурацію , хоча це було написано в 2006 році. Моя порада - почати з розумної бази від вашого поточного ядра дистрибутива (відповідно до №2), а потім пройдіть його та зніміть прапорці з усіх речей, які ви знаєте, що вам не потрібно. Ви також, ймовірно, захочете змінити деякі параметри "модуля" на "вбудований", що приведе нас до моєї наступної точки ...

  2. Про initramfs[необов’язково]

    "Initramfs" - це стисла файлова система, вбудована в ядро ​​та / або завантажена під час завантаження. Її основна мета - включити модулі, які будуть потрібні ядрам, перш ніж він зможе отримати доступ до тих, хто знаходиться /lib/modulesв кореневій файловій системі - наприклад, драйвери для пристрою, що містить цю файлову систему. Distros завжди використовує їх частково, оскільки драйвери взаємно несумісні, і тому вони не можуть бути вбудовані в ядро. Натомість ті, які відповідають поточній системі, вибираються зсередини initramfs.

    Це добре працює і не представляє жодних недоліків, але це, мабуть, непотрібне ускладнення при створенні власного ядра. 2 Висновок полягає в тому, що якщо ви не використовуєте initramfs, вам потрібно переконатися, що драйвери вашої кореневої файлової системи (і пристрою, на якому він увімкнено) вбудовані в ядро. В menuconfigцьому полягає різниця між Mопцією (= модуль) та опцією *(= вбудований). Якщо ви не отримаєте цього права, система вийде з ладу на початку процесу завантаження. Так, наприклад, якщо у вас є жорсткий диск SATA та коренева файлова система ext4, для цих вбудованих потрібні драйвери. [Якщо хтось може придумати щось інше, що є обов'язковим, залиште коментар, і я включу це сюди].

    Якщо ви хочете скористатися програмою initramfs, вам доведеться вибрати відповідні параметри в Загальній настройці . Там є скелет керівництво по створенню один вбудований в ядро в [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt, але врахуйте , що дистрибутиви не робити цього; вони використовують зовнішній gpіp файл cpio. Однак, цей документ містить обговорення того, що має бути зроблено в initramfs(див. "Зміст initramfs").

  3. Створіть та встановіть ядро.

    Наступний крок простий. Щоб зробити ядро, просто запустіть makeу [src]каталозі. Якщо ви перебуваєте в багатоядерній системі, ви можете додати, -j Nщоб прискорити роботу, де Nкількість ядер, яким ви хочете виділити + 1. Немає testабо check. Як тільки це буде зроблено, ви можете make modules. На швидкій коробці все це повинно зайняти <10 хвилин.

    Якщо все піде добре, то make INSTALL_MOD_STRIP=1 modules_install. Це створить каталог, який /lib/modulesвідповідає номеру версії ядра плюс рядку "Локальна версія", зазначеному в кроці 3, якщо такий є. Якщо ви не використовували рядок "Локальна версія", будьте обережні, якщо у вас вже є ядро ​​тієї ж версії, від якої ви залежите , оскільки ці модулі замінять їх. 3 не INSTALL_MOD_STRIP=1 є обов'язковим, про значення див. Тут .

    Потім make installможна встановити ядро ​​до місця за замовчуванням. Моя рекомендація, однак, полягає в тому, щоб зробити це самостійно, щоб не перезаписати існуючі файли. Подивіться в [src]/arch/[ARCH]/bootфайл з ім'ям bzImage4 , де [ARCH]знаходиться , x86якщо ви перебуваєте на x86 або x86-64 машини (і що - то інше , якщо ви на що - то інше). Скопіюйте це в /bootі перейменуйте його на щось більш конкретне та інформативне (не важливо до чого). Зробіть те саме [src]/System.map, але перейменуйте його за наступною схемою:

    System.map-[VERSION]
    

    Тут, [VERSION]це точно так же , як ім'я каталогу в /lib/modulesствореномуmake modules_install , який буде включати в себе «Локальна версія» рядок, наприклад, System.map-3.13.3-mykernel.

  4. Налаштуйте завантажувач GRUB 2.

    Якщо ви не використовуєте grub(більшість користувачів настільних ПК Linux), це, очевидно, не стосується вас. У вас повинен бути /etc/grub.d/40_customфайл з ним не так багато. Якщо ні, створіть його у власності root та chmod 755(він повинен бути виконаним). До цього додайте:

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    Якщо ви використовуєте initramfs, у вас також повинен бути останній рядок initrd /path/to/initramfs. Остерігайтеся set root=лінії. Приклад припускає, що grub був встановлений на першому розділі першого жорсткого диска (hd0,1). Якщо у вас є кілька дисків, ви можете замість цього використовувати UUID розділу і замінити цей рядок на:

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    Якщо grub не знаходиться у вашій кореневій файловій системі, це також повинно відповідати root=директиві в linuxрядку, яка вказує на вашу кореневу файлову систему (та з /sbin/initі /lib/modules). Версія UUID цього є root=UUID=[the UUID].

    Ви можете ознайомитись із наявними, /boot/grub2/grub.cfgщоб дізнатись про назву пристрою. Ось короткий посібник щодо таких підручників 2. Після того, як ви щасливі, біжіть grub2-mkconfig -o /boot/grub2/grub.cfg(але grub.cfgспершу створіть резервну копію свого поточного ). Потім ви можете відредагувати цей файл і перенести запис доверху. Він повинен ще містити список для вашого старого (біг) ядер, а ваш дистрибутив може мати механізм , який дублюється записом для нового ядра автоматично (так як він був знайдений в /boot, Fedora робить це, отже, використовуючи особливий титул menuentryє гарна ідея). Ви можете зняти це пізніше, якщо все піде добре.

    Ви також можете просто вставити menuentryв grub.cfg, але деякі дистрибутиви замінять це, коли їх ядро ​​буде оновлено (тоді як використання /etc/grub.d/буде зберігати його включеним).

    Це воно. Все, що вам потрібно зробити зараз, це перезавантажити. Якщо це не працює, спробуйте вивести проблему з екранного виводу, перезавантажте, вибравши старе ядро, і поверніться до кроку 3 (за винятком випадків, коли .configви вже є та налаштуйте це). Може бути хорошою ідеєю make clean(або make mrproper) між спробами, але переконайтеся, що ви скопіювали [src]/.configспочатку резервну копію, оскільки це буде стерто. Це допомагає переконатися, що об’єкти, які використовуються в процесі збирання, не є устареними.

  5. Щодо заголовків ядра та ін. ін.

    Одне, що ви, ймовірно, повинні зробити, це symlink ( ln -s -i) /lib/modules/X.X.X/sourceта /lib/modules/X.X.X/buildдо /usr/srcкаталогу, де знаходиться дерево-джерело (збережіть це). Це необхідно для того, щоб деякі інструменти простору користувачів (та сторонні інсталятори драйверів) могли отримати доступ до джерела запущеного ядра.

    Проблема, пов’язана з цим, - це .hфайли в /usr/includeтощо. Вони змінюються дуже поступово і є сумісними назад . У вас є два варіанти:

    • Залиште ті, якими користується ваш дистрибутив. Якщо ви регулярно оновлюєте всю систему, дистрибутив все одно періодично встановлюватиме нові, тому це варіант "найменшого клопоту".

    • Використовуйте make headers_install.

    Оскільки вони сумісні з зворотним ходом (тобто "програма, побудована на основі бібліотеки С, що використовує старі заголовки ядра, повинна працювати на більш новому ядрі"), вам не доведеться надто метушитися з цього приводу. Єдиною потенційною проблемою було б, якщо ви створили користувальницьке ядро ​​і збережете його деякий час, під час якого дистрибутив оновить пакет "ядро-заголовки" на більш нову версію, ніж використовується для створення ядра, і виявляється, що воно є несумісність (що стосується лише програмного забезпечення, згодом зібраного з джерела).

Список літератури

Ось деякі ресурси:

  • [src]/README включає короткий посібник зі створення та встановлення.

  • [src]/DocumentationКаталог містить багато інформації , яка може виявитися корисною в конфігурації.

  • Більшість книг Грега КН Linux Linux Kernel in Nutshell (доступна там безкоштовно у вигляді серії PDF) обертається навколо створення ядра.

  • Grub 2 має онлайн-посібник .


1. "Ваніль" посилається на оригінальне, незареєстроване офіційне джерело, яке знайдено на kernel.org. Більшість дистрибуторів приймають це джерело ванілі та додають деякі незначні налаштування.

2. Зауважте, що існують обставини, які потребують initramfs, оскільки для монтажу кореневої файлової системи потрібен певний простір користувачів - наприклад, якщо він зашифрований або розповсюджений на складний масив RAID.

3. Однак він не видалить модулі, які вже є, якщо ви їх не створили, а це означає, що ви можете додати модуль пізніше, просто змінивши конфігурацію та запустивши її make modules_installзнову. Зауважте, що для складання деяких модулів може знадобитися зміна самого ядра, і в цьому випадку вам також доведеться замінити ядро. Ви зможете сказати, коли ви намагатиметеся modprobeвставити модуль.

4. Цей файл може бути названий чимось іншим, якщо ви використовували нестандартний параметр стиснення. Я не впевнений, які є всі можливості.


3
Отримано. Ви можете додати згадку localmodconfigта такі інструменти, як streamline_config.plсценарій; корисний підхід до роботи з існуючих налаштувань ...
jasonwryan

1
Це, мабуть, досить детально, щоб стати канонічним питанням типу на ініціативу @ terdon. Розглянемо можливість відповіді на його запитання щодо мета. Або я міг би, якщо хочете. Схоже, це був такий намір, оскільки ви все одно поставили запитання. Включення специфічних для розподілу методів побудови бінарних пакетів також було б корисно.
Faheem Mitha

1
FYI: initramfsйого слід використовувати майже завжди. Наприклад, для установки коренів на LVM + RAID часто потрібен такий. Зашифрований корінь, безумовно, робить. Навіть досить складні настройки RAID. Автомобільна збірка навіть у тривіальних масивах фактично застаріла ...
derobert

2
@derobert: Це ставить питання про те, що Linux майже завжди використовується для запуску корпоративного сервера. Моя думка про initramfsте, що якщо вам не потрібно використовувати його, вам не доведеться, і це спрощує процес. У будь-якому разі я додав виноску про зашифровані кореневі файли тощо.
zladilocks

Будь ласка, включіть подробиці про функціональність EFI та Linux для efi-stub.
IW16
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.