Відповіді:
Створення власного ядра може зайняти багато часу - в основному в конфігурації, оскільки сучасні комп’ютери можуть робити збірку за лічені хвилини - але це не особливо небезпечно, якщо ви зберігаєте своє поточне, робоче ядро і не забудьте залишити це як опція через завантажувач (див. крок №6 нижче). Таким чином, якщо ваш новий не працює, ви можете просто перезавантажити старий.
У наступних інструкціях шляхи всередині вихідного дерева приймають форму [src]/whatever
, де [src]
знаходиться каталог, у який ви встановили джерело, наприклад /usr/src/linux-3.13.3
. Ви, мабуть, хочете зробити цей матеріал, su root
оскільки дерево-джерело повинне залишатися захищеним в плані дозволу на запис (воно повинно належати root).
Хоча деякі етапи необов’язкові, ви все одно повинні прочитати їх, оскільки вони містять інформацію, необхідну для розуміння решти процесу.
Завантажте та розпакуйте вихідний тарбол.
Вони доступні на 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
. Я віддаю перевагу останню конюшню, щоб я міг діяти як морська свинка, перш ніж її розкачатимуть у дистрибутиві :)
Почніть з базової конфігурації [необов’язково].
Вам не потрібно цього робити - ви можете просто зануритися прямо і створити конфігурацію з нуля. Однак якщо ви ніколи цього не робили, очікуйте багато спроб та помилок. Це також означає, що ви повинні прочитати більшість варіантів (їх сотні). Краще зробити ставку на використання наявної конфігурації, якщо вона є. Якщо ви використовували пакунок джерела дистрибутива, він, ймовірно, вже містить [src]/.config
файл, тому ви можете використовувати його. В іншому випадку перевірте наявність /proc/config.gz
. Це додаткова функція, додана в ядрі 2.6. Якщо він існує, скопіюйте це у верхній рівень вихідного дерева та gunzip -c config.gz > .config
.
Якщо його не існує, можливо, тому що ця опція була налаштована як модуль. Спробуйте sudo modprobe configs
, а потім знову перевірте /proc
каталог config.gz
.
Конфігурація дистрибутива не дуже ідеальна в тому сенсі, що вона включає практично кожен можливий апаратний драйвер. Це не має великого значення для функціональності ядра, оскільки вони є модулями, і більшість з них ніколи не звикне, але це дуже суттєво збільшує час, необхідний для створення. Це також незручно тим, що він вимагає, щоб initramfs містив певні основні модулі (див. Крок №4 нижче). Однак це, мабуть, краща відправна точка, ніж за замовчуванням.
Зауважте, що параметри конфігурації змінюються та змінюються від однієї версії ядра до іншої, і коли ви запустите одну з make config
програм нижче .config
, спочатку буде проаналізовано та оновлено відповідність новій версії. Якщо конфігурація має значно старішу версію, це може призвести до дивних результатів, тому зверніть увагу, коли ви робите конфігурацію. AFAIK не буде працювати навпаки (використовуючи конфігурацію з нової версії).
Створіть .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), а потім пройдіть його та зніміть прапорці з усіх речей, які ви знаєте, що вам не потрібно. Ви також, ймовірно, захочете змінити деякі параметри "модуля" на "вбудований", що приведе нас до моєї наступної точки ...
Про 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").
Створіть та встановіть ядро.
Наступний крок простий. Щоб зробити ядро, просто запустіть 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
файл з ім'ям bzImage
4 , де [ARCH]
знаходиться , x86
якщо ви перебуваєте на x86 або x86-64 машини (і що - то інше , якщо ви на що - то інше). Скопіюйте це в /boot
і перейменуйте його на щось більш конкретне та інформативне (не важливо до чого). Зробіть те саме [src]/System.map
, але перейменуйте його за наступною схемою:
System.map-[VERSION]
Тут, [VERSION]
це точно так же , як ім'я каталогу в /lib/modules
створеномуmake modules_install
, який буде включати в себе «Локальна версія» рядок, наприклад, System.map-3.13.3-mykernel
.
Налаштуйте завантажувач 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
спочатку резервну копію, оскільки це буде стерто. Це допомагає переконатися, що об’єкти, які використовуються в процесі збирання, не є устареними.
Щодо заголовків ядра та ін. ін.
Одне, що ви, ймовірно, повинні зробити, це 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. Цей файл може бути названий чимось іншим, якщо ви використовували нестандартний параметр стиснення. Я не впевнений, які є всі можливості.
initramfs
його слід використовувати майже завжди. Наприклад, для установки коренів на LVM + RAID часто потрібен такий. Зашифрований корінь, безумовно, робить. Навіть досить складні настройки RAID. Автомобільна збірка навіть у тривіальних масивах фактично застаріла ...
initramfs
те, що якщо вам не потрібно використовувати його, вам не доведеться, і це спрощує процес. У будь-якому разі я додав виноску про зашифровані кореневі файли тощо.
localmodconfig
та такі інструменти, якstreamline_config.pl
сценарій; корисний підхід до роботи з існуючих налаштувань ...