Ручне складання і конфігурація ядра linux


У цій статті я опишу процес ручної збірки ядра Linux. Розповідати спробую просто і зрозуміло, тому що матеріал розрахований на новачків. Ті, хто вже вміє це робити, швидше за все, не знайдуть в цій статті нічого корисного. Мета статті - описати процес конфігурації ядра і способи визначення потрібних для роботи драйверів.

Почну з спроби зруйнувати міф. Багато хто звик думати, що конфігурація та збірка ядра - справа, посильну лише гуру. Звичайно, це не так і я розповім, чому. Конфиг ядра не потрібно створювати з нуля, в Linux є готовий дефолтний конфіг і вся додаткова настройка зводиться до включення потрібних драйверів на основні компоненти системи і включенню підтримки необхідних файлових систем. За бажанням можна прибрати підтримку не потрібних драйверів, але ця умова зовсім не обов'язково і навіть не бажано.

Найчастіша проблема, які можуть спіткати людей, вперше конфігурують своє нове ядро ​​- питання, які ж саме драйвера потрібно включити, щоб ядро ​​запрацювало на вашому комп'ютері? Але в більшості випадків це все легко вирішується і вистачить лише назви чіпа материнської плати. А якщо ви не знаєте і цього, на допомогу прийде утиліта lspci з набору pciutils. У деяких людей, правда, виникають яких важко проблеми в зв'язку з недостатньою підтримкою Linux їх обладнання, але це буває лише у користувачів екзотичного заліза.

Друга проблема проявляється вже після складання ядра і перезавантаження комп'ютера, і вона може погасити прагнення до вивчення у багатьох. Як ви вже зрозуміли, вона полягає в тому, що комп'ютер не включається. Точніше, комп'ютер то включається, але ось завантаження системи переривається на kernel panic. І я з упевненістю можу сказати, що в більшості випадків це відбувається не через те, що користувач не включив потрібні модулі, а через те, що користувач їх відключив, вважаючи, що вони ядру не потрібні. Саме з цього я і сказав, що "тюнінг" ядра і відключення зайвих опцій в прагненні до досконалості, можуть привести до повної непрацездатності ядра. Для цього є золоте правило - якщо не знаєте, що це і для чого, не чіпайте це, залиште все, як є.

Переходимо до практики. Ручне складання ядра Linux

Тепер переходимо до конфігурації. Це самий трудомісткий процес у збірці ядра: Ви потрапите в утиліту конфігурації ядра Linux. Зайдіть в розділ "Processor type and features" і знайдіть рядок "Processor family" (див. Скріншот).

Ручне складання і конфігурація ядра linux

Вам потрібно вибрати тип свого процесора. Якщо ви не впевнені з вибором або не вважаєте в цьому списку свій процесор, ви можете вибрати тип 586 або 486. Але перед цим, скористайтеся утилітою lspci з пакета pciutils. Запустіть її від користувача root і знайдіть в її виведення інформацію про процесор. На моєму комп'ютері lspci виводить текст, що містить такий рядок:

Значить, значення опції "Processor family" в моєму випадку треба вказати в "Opteron / Athlon64 / Hammer / K8".

Тепер, не виходячи з розділу "Processor type and features" знайдіть опцію "High Memory Support" (див. Скріншот)

Ручне складання і конфігурація ядра linux

Її значення за замовчуванням встановлено в 4GB. І це найкращий варіант, якщо у вас не більше 4GB оперативної пам'яті. Справа в тому, що 32-бітові машини можуть працювати не більше ніж з 4GB (2 ^ 32) фізичної пам'яті. При включенні підтримки пам'яті більше 4GB, ви активуєте роботу з віртуальною пам'яттю. І не турбуйтеся, якщо побачите, що пам'яті у вас всього ніби 3.5GB. Але чому на 32-бітних машинах власники 4GB планки RAM бачать лише 3.5GB доступної пам'яті? Відповідь проста: ядро ​​Linux розділяє фізичну пам'ять на дві частини, одна з них доступна для користувача додатків, а невелика частина зарезервована ядром. Утиліти, що показують обсяг RAM, не мають доступу до зарезервованої ядром пам'яті, завдяки чому ви і бачите ці горезвісні 3.5GB.

Якщо RAM у вас більше 4GB, ви можете включити підтримку до 64GB пам'яті. В цьому випадку активується PAE (Physical Address Extension), яка дозволяє x86 процесорів працювати з більше ніж 4GB RAM. Не варто включати це, якщо у вас не більше 4GB RAM, тому що PAE накладає деякі обмеження і, попросту, працює трохи повільніше.

Тепер переходимо до розділу "Device Drivers" - "Serial ATA and Parallel ATA drivers".

Ручне складання і конфігурація ядра linux

У цьому розділі вам треба включити драйвера для роботи з вашим жорстким диском. У нових версіях Linux навіть старі IDE диски будуть визначатися як / dev / sdXX. У визначенні потрібного драйвера знову допоможе утиліта lspci. На моєму комп'ютері вона пише ось що:

Ручне складання і конфігурація ядра linux

З цього включаємо підтримку "AMD / Nvidia PATA support" і йдемо далі. Так, до речі, тому що я не використовую initrd, драйвер для роботи з жорстким диском потрібно включити в ядро, тобто (*), А не (M).

Тепер переходимо в розділ "Graphics support" (див. Скріншот).

Ручне складання і конфігурація ядра linux

Переходимо в розділ "Sound card support" - "Advanced Linux Sound Architecture". У моєму випадку у мене інтегрована звукова карта, а lspci повідомляє:

Повертаємося до утиліти конфігурації ядра, знаходимо в списку драйверів на звукові карти "Intel HD Audio". переходимо туди і виявляємо великий список. Скажу чесно - я не знаю, як точно визначити, який саме варіант зі списку потрібний. На моєму залозі звукова карта працює тільки з Realtek HD-audio. З NVIDIA HDMI HD-audio і INTEL HDMI HD-audio - ні в яку. Думаю, що можна залишити підтримку їх усіх, а система сама підбере потрібний.

Переходимо до підтримки мережевої карти в розділі "Device Drivers - Network device support". Наша незамінна lspci каже:

Ручне складання і конфігурація ядра linux

Отже, ім'я модуля дізналися, залишилося дізнатися, де його шукати. Детальну інформацію про мережевої карти покаже маленька, але корисна, утилитка ethtool. Запускати її можна, вказавши єдиний параметр - ім'я мережевого інтерфейсу. Я не буду приводити сюди її висновок, просто скажу, що там є такий рядок:

От і відмінно. Вибираємо в розділі "Network device support" підрозділ "Ethernet (10 or 100Mbit)" і переходимо в нього. "Forcedeth" в списку, звичайно, немає, тому що це ім'я самого модуля. Але, я знаю, що мій чіп - nVidia nForce, тому вибираємо "nForce Ethernet support" і натискаємо "Help". У верху буде рядок "CONFIG_FORCEDETH". а значить - це те, що нам потрібно. Тепер можна перейти на рівень вище і зняти галки з "Ethernet (1000 Mbit)" і "Ethernet (10000 Mbit)"

З розділом "Device drivers" покінчено. Залишилося всього нічого - включити підтримку потрібних файлових систем. Переходимо в розділ "File systems".

Ручне складання і конфігурація ядра linux

Просто включите в ядро ​​всі необхідні файлові системи. Пам'ятайте, що тому initrd не використовується, то драйвер файлової системи кореневого розділу повинен бути вкомпілен в ядро ​​((*), а не (M)).

Якщо вам потрібно мати доступ до даних на NTFS розділах, включіть опцію "FUSE (Filesystem in Userspace) support". Пізніше, для можливості монтування NTFS розділів, вам потрібно буде встановити пакет ntfs3g. Так само можете включити опцію "CD-ROM / DVD Filesystems" - "UDF file system support".

Можна вважати, що конфігурацію ядра ми майже закінчили. Залишилося лише злегка полегшити ядро, перейшовши в розділ "Kernel hacking" і відключивши "Kernel debugging". "Compile the kernel with frame pointers" і "Remote debugging over FireWire early on boot"

От і все. Конфігурація ядра Linux завершена і можна приступати до складання. Вийдіть з утиліти конфігурації зі збереженням конфіга і виконайте наступні команди:

Ось найпростіший конфиг GRUB: / dev / sda2 ви повинні замінити на ім'я вашого кореневого розділу. (Не «/ boot", а "/").

Тепер можна перезавантажуватися з новим ядром. )

Можливі проблеми.

Якщо ви не вкажіть драйвер на жорсткий диск або неправильно вкажіть "root =", ядро ​​не зможе примонтировать кореневий розділ і біля повідомлення Kernel panic ви зможете знайти щось подібне:

Після цього рядка буде перерахований список виявлених накопичувачів. Якщо вашого жорсткого диска серед них немає, то вам треба пересобрать ядро, включивши відсутні драйвера на жорсткий диск. Якщо ж ваш жорсткий диск в цьому списку є, значить ви не правильно вказали значення "root =".

Так само часто люди забувають включити підтримку файлової системи кореневого розділу в ядро ​​і це так само є причиною непрацездатності ядра.

Уточнення.

Я не використовував підтримку initrd в цій статті. І, швидше за все, вам вона теж не знадобиться. Якщо ви включите в ядро ​​необхідні драйвера на кореневу файлову систему і жорсткий диск, то ядро ​​цілком обійдеться без initrd.

У цій статті я спеціально не розповідав про відключення непотрібного функціонала, зайвих драйверів і інших способах полегшення ядра, тому що моєю метою було пояснення збірки _рабочего_ ядра, а в процесі "тюнінгу" дуже легко можна його зіпсувати, якщо не знаєш точно, що робиш.

Як жити далі?

Пізніше, якщо ви захочете встановити свіжу версію ядра, вам не доведеться конфігурувати ядро ​​Linux заново. Вам потрібно буде лише скопіювати файл ".config" з каталогу з кодами старого ядра в нове і виконати команду make oldconfig. Вона "піджене" старий конфиг під нове ядро ​​і, якщо в новій версії з'явилися нові опції, вона запитає, включати їх чи ні. У більшості випадків ви можете залишати все по-замовчуванню. Кількість питань, на які доведеться відповідати, залежить від різниці між версіями ядер. Після цього, нове ядро ​​можна буде просто зібрати і скопіювати в потрібне місце.

Навіщо це взагалі треба?

Може виникнути закономірне питання "якого біса це взагалі треба?". Звичайно, ви можете встановити вже зібране ядро ​​за допомогою пакетного менеджера вашого дистрибутива Linux і воно буде відмінно працювати, хоча і буде злегка "жирніше" сконфигурированного вручну. Відповісти я можу тільки за себе. Я роблю це вручну, тому що на мій погляд, ядро ​​- основний компонент будь-якої Linux-системи і розуміння його, і вміння його збирати є такими ж необхідними основами, як знання правил дорожнього руху для водія автомобіля. Але навіть якщо ви вважаєте по-іншому, цей досвід ручної збірки ядра допоможе вам краще зрозуміти свою систему, а значить, краще вміти нею управляти, підтримувати в працездатному вигляді і всяке-всяке;)


Дякую за увагу!

Можливо, ці матеріали Вас зацікавлять:

> # Make menuconfig

Чому так відбувається? Адже я навіть виставляю пріоритети навантажує програмами, скажімо браузер у мене працює з PRI = 30, аби ворд 25, LXpanel 20. Тобто виходячи з усіх книг про розподіл процесорного часу в Лінуксі має слідувати, що як тільки процес із середнім пріоритетом (LXpanel PRI 20) попросить від системи щось, то процес з високим пріоритетом (Chromium PRI 30) відразу ж повинен відправиться в кінець черги і чекати коли LXpanel відпрацює. На практиці - chromium захлинувся у флеш анімації в 10+ вкладках і все встало нафіг ...

Вищеописане в ненавісних винда (windows NT) трапляється тільки якщо система зжерла до фіга пам'яті і пекельно зависла в своп після якої-небудь пекла гри ... тобто в будь-який час там зарезірвіровано трохи cpu для того, щоб сама система працювала, щоб хоча б диспетчер задач (task менеджер в винде, htop в Лінуксі) викликати і грохнути якийсь процес.

to Benn копати треба глибше і не в сторону лінукс. Наприклад firefox (та й інші браузера) відкривають відразу кілька з'єднань. При невеликій швидкості, великої кількості графіки, та й то що наприклад вантажить аякс або флеш в бекграунді - все це призводить до Висяки. Від флеша вже наприклад aple відхрещувалась, так як вантажить проц на 100 відсотків. Якщо у вас проц з одним ядром - це фатально. Лінукс прекрасна система, але теж залежить і від заліза і від ідіотського софта.

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