Як створити нестандартний дистрибутив Linux, який запускає лише одну програму і нічого іншого?


12

Як я міг би створити власний "спеціальний" дистрибутив Linux, який запускатиме лише одну програму, майже точно так само, як XBMCbuntu .


Ласкаво просимо на U&L, пройди екскурсію та знайди час, щоб навчитися задавати питання, що ти хочеш робити? оскільки визначення програми є досить розпливчастим і зовсім не означає нічого, тому що я радив би використовувати, busyboxале це, мабуть, не те, що ви хочете. тому, будь ласка, знайдіть необхідний час, щоб висловити свою потребу, і ми можемо допомогти вам. Не соромтеся відредагувати своє запитання, щоб додати до нього будь-який відповідний елемент.
Ківі

1
Мені здається досить зрозумілим ...
goldilocks

@ TAFKA'goldilocks 'ні, тому що я думаю, що ви все ще можете мати доступ до терміналу або чогось подібного на XBMCubuntu, хоча здається, що лише один додаток працює графічно, але не працює одна програма. Я зробив невеликий дистрибутив з нуля лише з ядром і busbox, і в цьому випадку, навіть якщо є сервіси, які запускаються ядром, ви можете сказати, що zasedbox - це ваш єдиний додаток.
Ківі

@Kiwi Тоді гарна відповідь (краще, ніж LFS). Майте на увазі: 1) Це запитання може бути корисним іншим людям, загальне призначення яких однакове, тому коло відповідей хороша; 2) Хоча тут існує коло можливих рішень - наприклад, TIMTOWTDI - і деякі можуть бути краще підходить до якоїсь конкретнішої мети, ніж інші, я впевнений, що вони працюватимуть, і важливий аспект рішення щодо рішення буде суб'єктивним (наприклад, через попередні знання та досвід ОП, а не об'єктивний характер завдання) .
goldilocks

Відповіді:


6

Я б не почав возитися з 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 простіша у використанні), проте більшість собак вважають за краще їхні старі хитрощі. Це захоплення починає згасати зараз, коли обидві системи використовувались деякий час.


1
Ви не можете обійтися, initале, безумовно, ви можете обійтися без upstart, systemd,або sysv. initпросто якийсь виконуваний файл, названий initвашим ядром, коли він монтується. initramfs.У більшості випадків ці три інших навіть не є, initале вони насправді execinit,busybox.
редагуються,

@mikeserv Абсолютно (і я прямо зазначив, що це не єдині три варіанти). Зауважте також, що я навмисно виключив, busyboxбо це заслуговує на окреме звернення в окремій відповіді, але не мною.
goldilocks

Як милостиво вам запропонувати! Але жодного проклятого шляху.
mikeserv

Було б цікаво дізнатися, чи справді такий підхід працює на практиці. Хтось насправді спробував це?
Faheem Mitha

@FaheemMitha Якщо ви маєте на увазі те, що я рекомендую тут (налаштуйте конфігурацію init), звичайно, це робиться - ось так вже працює система, ви б просто створили зняту та спрощену версію (я впевнений, що це що таке XBMCbutu). Якщо ви маєте на увазі заміну init на якийсь більш спеціалізований виконуваний файл ala busybox, це, мабуть, більше проблем, ніж це варто, якщо ви не повинні зробити це таким чином - головна мета busbox - це використання в крихітних вбудованих середовищах (з, наприклад, лише декількома МБ оперативної пам’яті).
goldilocks

18

Мінімальна покрокова програма програми 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


4
Це, мабуть, найбільш занижена відповідь: D. Дивовижно!
msouth

1
@msouth трохи менше, тому зараз :-)
Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功

1

якщо ви трохи програмуєте і хочете створити його з нуля, ви можете перейти з LFS, тобто Linux з Scratch http://www.linuxfromscratch.org/

якщо ви хочете налаштувати ubutnu, ви можете використовувати ubunt-builder, а якщо ви хочете на базі rpm, ви можете використовувати SUsE-Studio, студія Suse дозволить вам зробити власний suse linux

ура


1

Це більше про те, що вимагає ваша "одна програма".

Ви все ще можете добре зрозуміти, як скласти речі, побудувавши LFS (він же " Linux From Scratch ") . Тоді ви додасте речі, необхідні вашою програмою, або перейдете до повного розповсюдження, оскільки побудова важкої підсистеми на зразок Gnome або KDE на LFS може бути справжнім болем у дусі.

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

(мої 2 копійки)

Редагувати :

Як зазначає SecurityBeast, замість того, щоб починати з повного розповсюдження на зразок CentOS або Ubuntu , ви також можете ознайомитись із побудовою інструментів розподілу на зразок:


1

Що потрібно запитати - це для чого потрібна ваша "одна програма" та які ресурси у вас є.

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

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

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

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