Як я міг би створити власний "спеціальний" дистрибутив Linux, який запускатиме лише одну програму, майже точно так само, як XBMCbuntu .
Як я міг би створити власний "спеціальний" дистрибутив Linux, який запускатиме лише одну програму, майже точно так само, як XBMCbuntu .
Відповіді:
Я б не почав возитися з LFS, це садова доріжка, що веде до деяких темних лісів.
Почніть з дистрибутива, у якому ви маєте великий контроль над початковою установкою, наприклад, Arch або безголовим виданням, таким як сервер Ubuntu. Суть у цьому не стільки в економії місця, скільки в обмеженні складності конфігурації init; починаючи з безголового дистрибутива, якщо програма, яку ви хочете запустити, вимагає графічного інтерфейсу, ви можете додати необхідне для цього, не потребуючи входу в GUI (він же, менеджер дисплеїв або DM), розпочатий програмою init, і повнорозмірний робочий стіл середовище, щоб піти з цим.
Потім ви хочете навчитися налаштовувати систему init під свої цілі - зауважте, що без init вам не обійтися, і це може бути найкращим засобом для досягнення вашої мети. Існує три варіанти щодо init, що зазвичай використовується в Linux (але є й інші ):
Debian використовує варіацію класичного init у стилі Unix SysV . Станом на jessie
випуск Debian також перейшов на systemd
( https://wiki.debian.org/systemd )
Ubuntu та похідні використовують запуску .
Fedora, Arch та похідні використовують systemd .
Якщо ви ще нічого не знаєте про будь-яке з них, жоден із них не є особливо складним у використанні, ніж будь-який з інших. Якщо ви переходите до одного з останніх двох, вони забезпечують деякі механізми зворотної сумісності з SysV, але не турбуйтеся з цим , це НЕ простіше. 1
Сенс у тому, щоб мінімізувати, що робить init під час завантаження, і саме так ви можете створити систему, яка запускатиме мінімальний обсяг програмного забезпечення для підтримки програми, на яку ви хочете зосередитись - це, по суті, як налаштований сервер, BTW, тому це звичайне завдання (зауважте, що ви не можете буквально запустити "лише один" процес користувальницької країни, принаймні, не корисно).
Якщо додаток, яке ви хочете запустити, - це програма GUI (хороший приклад того, чому ви не можете буквально просто запустити одну програму, оскільки для програм GUI потрібен X-сервер), ви можете мати такий ~/.xinitrc
вигляд;
#!/bin/sh
myprogram
Коли ви тоді startx
, ваша програма буде єдиним, що працює, і неможливо буде змінити робочий стіл або запустити що-небудь інше, частково через те, що немає віконного менеджера або середовища робочого столу (отже, також не буде віконної рамки або заголовка).
1. Дещо підкреслити суть: Коли ви досліджуєте це, ви можете виявити деякі захоплення систематизованими та перешкодами у людей, які раніше були знайомі з SysV, стверджуючи, наприклад, що вони занадто складні. Однак об'єктивно вони не є більш складними, ніж SysV (насправді система IMO простіша у використанні), проте більшість собак вважають за краще їхні старі хитрощі. Це захоплення починає згасати зараз, коли обидві системи використовувались деякий час.
init
але, безумовно, ви можете обійтися без upstart, systemd,
або sysv. init
просто якийсь виконуваний файл, названий init
вашим ядром, коли він монтується. initramfs.
У більшості випадків ці три інших навіть не є, init
але вони насправді exec
init,
busybox.
busybox
бо це заслуговує на окреме звернення в окремій відповіді, але не мною.
Мінімальна покрокова програма програми init hello
Складіть привіт світ без будь-яких залежностей, який закінчується нескінченним циклом. init.S
:
.global _start
_start:
mov $1, %rax
mov $1, %rdi
mov $message, %rsi
mov $message_len, %rdx
syscall
jmp .
message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
.equ message_len, . - message
Ми не можемо використовувати вихідний системний виклик, інакше ядро панікує.
Тоді:
mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o # link
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"
Це створює файлову систему з нашим привітним світом at /init
, який є першою програмою для користувача, яка буде запускати ядро. Ми також могли б додати більше файлів, d/
і вони будуть доступні через /init
програму під час запуску ядра.
Потім cd
у дерево ядра Linux, збирайте як завжди і запускайте його в QEMU:
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"
І вам слід побачити рядок:
FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR
на екрані емулятора! Зауважте, що це не останній рядок, тому вам доведеться дивитися трохи далі.
Ви також можете використовувати програми C, якщо з'єднати їх статично:
#include <stdio.h>
#include <unistd.h>
int main() {
printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
sleep(0xFFFFFFFF);
return 0;
}
з:
gcc -static init.c -o init
Динамічне посилання вимагає встановлення виконуваного динамічного лінкера, найпоширеніший з яких є частиною стандартних бібліотек C, таких як glibc.
Ви можете працювати на справжньому обладнанні, використовуючи USB /dev/sdX
та:
make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX
Чудове джерело на цю тему: Технічна порада: Як користуватися initramfs | landley.net Також роз'яснюється, як використовувати gen_initramfs_list.sh
сценарій із дерева вихідного ядра Linux для автоматизації процесу.
Тестовано на Ubuntu 16.10, QEMU 2.6.1.
Наступні кроки
Наступне, що ви хочете зробити - це налаштувати BusyBox .
BusyBox реалізує основні утиліти POSIX-y CLI, включаючи оболонку POSIX-y, завдяки якій ви можете простіше експериментувати з системою в інтерактивному режимі.
Особисто в цей момент я вважаю за краще просто покластися на Buildroot , який є дивовижним набором сценаріїв, який автоматизує побудову всього з джерела та створення кореневої файлової системи.
Я завантажив дуже детальну та автоматизовану помічницю для цього за адресою: https://github.com/cirosantilli/linux-kernel-module-cheat
якщо ви трохи програмуєте і хочете створити його з нуля, ви можете перейти з LFS, тобто Linux з Scratch http://www.linuxfromscratch.org/
якщо ви хочете налаштувати ubutnu, ви можете використовувати ubunt-builder, а якщо ви хочете на базі rpm, ви можете використовувати SUsE-Studio, студія Suse дозволить вам зробити власний suse linux
ура
Це більше про те, що вимагає ваша "одна програма".
Ви все ще можете добре зрозуміти, як скласти речі, побудувавши LFS (він же " Linux From Scratch ") . Тоді ви додасте речі, необхідні вашою програмою, або перейдете до повного розповсюдження, оскільки побудова важкої підсистеми на зразок Gnome або KDE на LFS може бути справжнім болем у дусі.
Звичайно, спочатку назад може бути простішим, але вилучення речей з повного розповсюдження може бути клопітким: робіть це у вітчизняній машині та робіть копію цього віртуального комп'ютера на кожному кроці.
(мої 2 копійки)
Редагувати :
Як зазначає SecurityBeast, замість того, щоб починати з повного розповсюдження на зразок CentOS або Ubuntu , ви також можете ознайомитись із побудовою інструментів розподілу на зразок:
Що потрібно запитати - це для чого потрібна ваша "одна програма" та які ресурси у вас є.
Якщо він потребує широкого вибору бібліотек та бінарних файлів підтримки, вам, можливо, найкраще скористатися "звичайним" дистрибутивом Linux (Debian або подібним) і просто трохи заплутатися з процесом завантаження.
Якщо він потребує більш вузького вибору матеріалів підтримки, але все-таки потрібні такі речі, як мережа або підтримка різних апаратних засобів, використовуючи різні модулі ядра або біти підтримки користувачів, і ви не хочете, щоб дисковий простір надходив у звичайний дистрибутив, то я б радив переглянути вбудовані дистрибутиви (buildroot чи подібні) або, можливо, Linux з нуля підходу (хоча це може бути головним болем у підтримці)
Якщо вам потрібно лише те, що може забезпечити немодульне ядро, і більше нічого, тоді запуск власного бінарного прямо на ядрі може працювати і стати найлегшим рішенням ..
busybox
але це, мабуть, не те, що ви хочете. тому, будь ласка, знайдіть необхідний час, щоб висловити свою потребу, і ми можемо допомогти вам. Не соромтеся відредагувати своє запитання, щоб додати до нього будь-який відповідний елемент.