Чи можливо встановити ядро ​​Linux самостійно?


45

Мені просто цікаво, чи можливо встановити ядро ​​Linux самостійно або якщо вам потрібно скористатися одним із ароматів. Якби це було можливо, як би ти це зробив? Мені не потрібен докладний підручник. Я просто хочу знати, як це було б зроблено концептуально. Мені не дуже добре з матеріалами низького рівня, і хочу дізнатися, як потрапляє ОС в комп’ютер. Я думаю, це має щось спільне з MBR.

О, і я помітив, що багато відповідей говорять про певний розподіл деякого мінімального Linux. Я, мабуть, мав заявити, що я не хочу встановлювати мінімальну чи голі кістки Linux. Це питання суто теоретичне. І все-таки я дуже ціную всі відповіді і негайно звернусь до них, якщо колись хотів би встановити справді персоналізований Linux.


3
Що ви маєте на увазі під "самотніми" та "ароматами"? Linux - це не ОС, це ядро, для чого корисно ядро ​​без ОС? Чи намагаєтесь ви встановити послідовність завантажувача?
Калеб

3
Якщо ви хочете зрозуміти, як ядро ​​/ ОС потрапляє в комп'ютер, ось тут можна почати. Просто переконайтеся , що не питати «новачка» питання є, вони будуть кусати вас, попросіть їх на SO замість цього.
Філомат

3
Поодинці я маю на увазі лише ядро, мінус користувальницький інтерфейс і такі програми, як OpenOffice. Під «ароматами» я маю на увазі різні дистрибутиви linux, як-от ubuntu, redhat, debian та mandriva. Я майже не маю уявлення про те, про що я говорю. Я уявляв, що ядро ​​Linux має деякі основні можливості bash, такі як DOS. Я думаю, що, можливо, я сформулюю свої ідеї ядер та операційних систем.
цезар

4
Так, ви їх дійсно заплутані :) Bash - це просто програма-користувач, яка працює як процес, керований ядром. Ядро саме по собі не дає нічого, крім платформи для запуску інших речей. Пропозиція LFS (Linux From Scratch) у відповіді Шадура відповідає правильній меті. Ви дізнаєтесь багато про те, що є різними фрагментами і що робить дистрибутив дистрибутивом і де закінчується ядро ​​і починається земля користувача, будуючи систему подряпин.
Калеб

2
Власне, і DOS kernelне мав базових bashможливостей. Стандартний інтерфейс користувача забезпечувався програмою оболонки COMMAND.COM. Найближчим ви можете дістатись до оголеного ядра, що робить щось корисне, було б завантажуватись за допомогою параметра ядра init=/bin/bash(якщо припустимо, що на диску є мінімальний Linux). Як відповів, якщо у вас є лише завантажувач і ядро, воно дуже швидко зупиниться, коли воно не знайде init.
StarNamer

Відповіді:


51

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

До речі, це частина завантажувача, що знаходиться в MBR. Ядро сидить десь на звичайній ділянці диска. Завантажувач налаштований так, щоб знати, де це, тому він може завантажувати ядро ​​та виконувати його.


Як би ви ввели його в MBR?
цезар

Кожен завантажувач постачається з інструментом для встановлення себе в MBR. Існують також дружніші інструменти, такі як Boot-Repair ( help.ubuntu.com/community/Boot-Repair ).
Шон Дж. Гофф

Добре, ви можете створити initramfs і вставити його у зображення ядра, і тоді у вас буде повністю працююча система лише з файлу зображення ядра :-)
Патрік,

@ ShawnJ.Goff Чому ядро ​​скаржиться на те, що не може запустити init, якщо ми надаємо initramfs?
Пратік Сінгал

4
@ ps06756 Якщо у вас є initramfs, це не ядро ​​"наодинці", як задано питання. Якщо в initramfs є init, ядро ​​не буде скаржитися.
Шон Дж. Гофф

18

Я не думаю, що ви точно розумієте, про що ви просите, але ви, можливо, захочете поглянути на проект Linux From Scratch .


LFS було б гарною ідеєю розібратися, як побудувати мінімальну систему. Або ви можете подивитися на MINIX (і прочитати книгу ). Або для іншого вступу (менше роботи, але менш інформативне), подивіться на пакунки, позначені "суттєвими" ( aptitude search '?essential') на Debian або Ubuntu, і зрозумійте, що кожен робить (є трохи більше, ніж мінімальний мінімум).
Жиль "ТАК - перестань бути злим"

12

Якщо ви запитуєте, чи можете ви просто встановити або оновити ядро ​​"над" існуючою системою, не встановлюючи купу інших програм?

Ядро Linux - це двійковий файл, як правило, названий vmlinuz-x.x.x-x-nameу bootкаталозі (який зазвичай є окремим невеликим розділом на початку жорсткого диска), де x - номер версії. "name" - це лише вибране ім'я для ядра, яке можна встановити під час компіляції. Ви можете використовувати його для визначення типу машини чи архітектури ядра з будь-якої іншої причини.

Він завантажується під час завантаження завантажувачем, як правило, GRUBякий викликається кодом завантаження у MBR, на який викликається BIOS ROM. Після завантаження він не "тримається відкритим" або захищається спеціально. Таким чином, ви можете замінити цей файл іншим робочим ядром. Але, GRUBмає цікаву функцію, яка дозволяє вибрати декілька ядер для завантаження. Тому досить розумно додати ваше додаткове ядро ​​до цього списку, але зберігайте оригінальне відоме робоче ядро ​​на випадок, якщо все піде не так.

Майже всі дистрибутиви, які я вважаю, складають "модульне" ядро, де драйвери пристроїв знаходяться в окремих файлах. Тому більшості ядер потрібна файлова система, що містить драйвери, доступні їй під час завантаження, і саме для цього призначений "initrd" (початковий диск RAM) або "initramfs". GRUBзавантажить ядро ​​в пам'яті, а initrd - в іншому місці, і перейде до ядра, повідомляючи, де знаходиться initrd, запускаючи Linux.

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

Існують інструменти для зміни та створення initrds. У Debian є чудові інструменти, і я думаю, що це роблять і інші дистрибутиви.

Отже, якщо ви завантажите більш нове ядро ​​з kernel.org і компілюєте його для створення нового бінарного зображення ядра, вам потрібно зробити або оновити initrd з драйверами, які працюють з цим ядром. Старий initrd не працюватиме, оскільки драйвери повинні відповідати версії ядра, що працює.

Файл initrd названий initrd.img-x.x.x.x-nameтак само, як ядро, і його можна замінити після завантаження так само, як ядро, і найкраща практика вказуватиме на те, що ви не видаляєте відомий робочий initrd, поки не дізнаєтесь, що можете успішно завантажувати нове ядро ​​+ initrd.

Я сподіваюся, що це дає певний контекст.

Якщо ви шукаєте інсталяцію Linux «barebones», яка не має додаткових програм, встановлених з нею, моїм улюбленим вибором завжди була установка netinstобразу Debian . Насправді у вас є лише найосновніші інструменти, необхідні для запуску текстової консолі командного рядка та nanoредактора тексту.


5

Поодинокі виконувані корені

Абсолютна мінімальна система запускає єдину /initпрограму, як я пояснив в Single Application Linux | Супер Користувач

Мінімальний Linux Live

https://github.com/ivandavidov/minimal

Для більш цікавої інтерактивної системи це (переважно навчальний) невеликий сценарій, який:

  • завантажує джерело для ядра та зайнятої скриньки
  • складає їх
  • створює завантажувальний 8Mb ISO з ними

Тоді ISO залишає вас у мінімальній оболонці з busbox.

За допомогою QEMU ви можете легко завантажуватися в систему.

Я змінив його, щоб дозволити запускати його з каталогу джерела ядра: https://github.com/cirosantilli/runlinux

Використання:

git clone https://github.com/ivandavidov/minimal
cd minimal/src
./build_minimal_linux_live.sh
# Wait.
# Install QEMU.
# minimal_linux_live.iso was generated
./qemu64.sh

і ви залишитеся у вікні QEMU з вами новою мінімальною системою. Дивовижно.

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

Тестовано на Ubuntu 16.04.

Buildroot

https://buildroot.org/

Великий набір сценаріїв Makefile, які керують:

  • Мережа інструментів перехресної компіляції GCC
  • компіляція ядра
  • компіляція завантажувача
  • генерація коренів
  • містить десятки рецептів завантаження / складання пакунків у вихідному дереві, включаючи складні речі, такі як GTK. Існує система залежності.

Мінімальний приклад:

git clone git://git.buildroot.net/buildroot
cd buildroot
git checkout 2016.05
make qemu_x86_defconfig
# Can't use -jN, use `BR2_JLEVEL=2` instead.
BR2_JLEVEL=2 make
# Wait.
# cat board/qemu/x86_64/readme.txt
qemu-system-x86_64 -M pc -kernel output/images/bzImage -drive file=output/images/rootfs.ext2,if=virtio,format=raw -append root=/dev/vda -net nic,model=virtio -net user
# You are now in a shell with BusyBox utilities.

У ньому навіть є рецепти побудови X11 з нуля: Як встановити X11 в моїй власній системі Linux Buildroot?

Професійні речі.

Альпійський Linux

https://github.com/gliderlabs/docker-alpine

Вбудований дистрибутив із менеджером пакунків, який пропонує попередньо складені бінарні файли з веб-сайту.

Дивитися також


3

Мені хотілося б надати другу пропозицію Шадура, щоб ви забруднили свої рухи в Linux від Scratch.
Також щось подібне, спробуйте Pocket Linux .

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


2
Хоча зауважте, що ніхто з розумом не рекомендує / або / LFS або PocketLinux для будь-якого важливого виробничого завдання - вони гарні для того, щоб дізнатись, як працює робота, але є причина, що більшість дистрибутивів надходять із повним набором інструментів та фронталів для більшості речей.
Шадур

3

Встановити ядро ​​Linux можна без звичайних інструментів для користувальницького простору. Це зазвичай робиться у вбудованих системах, таких як маршрутизатори. Зазвичай ядро ​​завантажується з ПЗУ або флеш-пам’яті та настроюється для відповідного пристрою (як правило, необхідні драйвери, зібрані в ядро, а не завантажуються як модулі).

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

Звичайно, не обов’язково мати оболонку, щоб мати робочий пристрій на базі Linux, хоча це може значно спростити розробку!


2

Багато дистрибутивів забезпечують встановлення "основних". Це те, що ти хочеш. Дивіться ubuntu-minimal, debian net-install, archlinux (за замовчуванням - лише ядро).

Інші відповіді корисні, якщо ви хочете навчитися, але це може бути не так = p

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