Как создать систему Linux, которая запускает одно приложение?

Я пытаюсь запустить приложение в Linux и все, что я хочу запустить это приложение от загрузки. Мне нужна сеть, и это все (без дисплея, периферийных устройств и т. д.). Я не хочу других приложений, так что приложение я запускаю имеет 100% процессора. Такое возможно?

5
задан Ciro Santilli 新疆改造中心 六四事件 法轮功
04.12.2022 19:46 Количество просмотров материала 2380
Распечатать страницу

6 ответов

минимальный initrd CPIO hello world программа Шаг за шагом

enter image description here

скомпилировать hello world без каких-либо зависимостей, который заканчивается бесконечным циклом. init.S:

.global _start
_start:
    mov , %rax
    mov , %rdi
    mov $message, %rsi
    mov $message_len, %rdx
    syscall
    jmp .
    message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
    .equ message_len, . - message

мы не можем использовать sys_exit, иначе паника ядра.

затем:

mkdir d
as --64 -o init.o init.S
ld -o init d/init.o
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"

это создает файловую систему с нашим hello world в /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

на экране эмулятора! Обратите внимание, что это не последняя строка, поэтому вам нужно посмотреть немного дальше.

вы можете также использовать программы К Если вы соединяете их статически:

#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

вы можете работать на реальном оборудовании с USB на /dev/sdX и:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX

отличный источник на эту тему:http://landley.net/writing/rootfs-howto.html это также объясняет, как использовать gen_initramfs_list.sh, который представляет собой скрипт из дерева исходного кода ядра Linux для автоматизации процесса.

следующий шаг: настройка BusyBox, так что вы можете взаимодействовать с системой: https://unix.stackexchange.com/questions/2692/what-is-the-smallest-possible-linux-implementation/203902#203902

протестировано на Ubuntu 16.10, QEMU 2.6.1.

8
отвечен Ciro Santilli 新疆改造中心 六四事件 法轮功 2022-12-06 03:34

похоже, вы пытаетесь настроить киоска. Большинство руководств по интернету сосредоточены на веб-браузере, таком как Firefox, как единственное приложение, которое работает. Взгляните на данное руководство для идей.

3
отвечен William Jackson 2022-12-06 05:51

вы можете запустить ядро с init=/path/to/myapp параметр, определенный в загрузчике.

3
отвечен Michał Šrajer 2022-12-06 08:08

вы можете запустить только одно пользовательское приложение после загрузки ядра. Но он не будет иметь 100% процессора, потому что будут некоторые другие процессы, связанные с ядром, которые должны существовать. Это обычно делается во встроенных устройствах Linux, например беспроводных маршрутизаторах. У меня также есть опыт работы с многопоточным приложением.

после загрузки ядра запускается скрипт инициализации или запуска. Читайте на Linux выполнения и инит процесс. Существуют различные схемы запуска в использовании, поэтому невозможно быть конкретным. Но Linux позволит вам установить, какие именно приложения и демоны будут выполнять в вашей ситуации. Другие, чем файл Startup в корень, файлы, которые нужно изменить в /и т. д. и в частности / etc / init.d

BTW если вы не somekind суперпрограммы или прежде чем вы получите удаленный сервер GDB работает, вам понадобится somekind консоли отладки (консоль ПК или последовательный порт) для вашего приложения. Это позволит вам получать уведомления о Сег неисправности, ошибки и сбои утверждение. Поэтому планируйте иметь что-то "периферийное", кроме"сети".

2
отвечен sawdust 2022-12-06 10:25

если вы действительно не хотите ничего, кроме ядра Linux, сети и вашего приложения, единственный способ сделать это:

  • вам нужно сделать ваше приложение модулем ядра - убедитесь, что оно отлажено и хорошо протестировано. Этот модуль ядра должен был бы инициализировать вещи, обычно выполняемые через пространство пользователя, такие как набор IP-адресов интерфейса и все такое хорошее.
  • вам нужно будет скачать и настроить (make menuconfig) ваше собственное ядро и удалить все функции, которые не связаны с запуском системы и сети. Вы хотите отключить блокировать слой, я не знаю, как это сделать на последних ядрах через make menuconfig.
  • затем вам нужно включить ваш модуль в ядро, чтобы он был включен как часть ядра, а не загружаемый модуль. Скорее всего, вы отключите загружаемые модули на шаге выше. Если вы знаете достаточно C / C++, чтобы создать модуль ядра это должно быть легко для вас.
  • вам нужно изменить какая бы часть ядра не паниковала, если init не может этого сделать или быть готовым жить с 1 дополнительным процессом пользовательского пространства.

я знаю, что модули ядра могут создавать процессы-простой ps aux покажет много на типичной системе (все они в скобках). Вероятно, вы хотите, чтобы ваш модуль создал процесс ядра. Чтобы избавиться от всех процессов, созданных ядром, кроме вашего, вам нужно отключить threads [kthreadd], управления питанием [pm], the уровень событий [events], и другие.


если вы хотите более практичную настройку процесса ядра + 1 пользовательское пространство, это возможно.

Linux имеет опцию командной строки ядра под названием init= - это то, что ядро начнет, когда закончит загрузку. Программа должна находиться на корневом устройстве, указанном с помощью root= или в initrd (загружается загрузчика).

если эта программа выйдет, Linux запаникует, поэтому убедитесь, что она никогда не выходит из комнаты.

многие современные дистрибутивы Linux имеют такую настройку init программа в initrd выполняет некоторую дополнительную инициализацию пользовательского пространства перед запуском /sbin/init или /sbin/systemd. Вам нужно будет узнать, что делает ваш дистрибутив (info for Debian здесь) и найти, где вы можете указать окончательный "handoff" программу, и оттуда вы можете сказать, чтобы начать приложение вместо init или systemd.

systemd управляет много базовой функциональности, как здание /dev, установка имени хоста, и другие вещи, так что если вы гибки, вы можете вместо этого посмотреть в настройке systemd, чтобы породить один процесс, и, возможно, перезапустить его, если он терпит неудачу. Если я не ошибаюсь, он в основном делает это для однопользовательского или режима восстановления - он запускает оболочку.

у вас будет запущено 2 процесса (systemd и ваша программа) но система не запаникует если ваша программа выходит или крахи.

рассмотрим также просто легкую установку Debian-установка "netinst" не имеет много работы, кроме ядра, оболочки и нескольких служб - или рассмотрим OpenWRT/LEDE - у нее есть веб-сервер для Luci, работающий по умолчанию, и несколько других служб, но легко отключается.

2
отвечен LawrenceC 2022-12-06 12:42

есть некоторые системные приложения, которые должны быть запущены, кроме них, конечно, вы можете выделить остальную часть компьютерных ресурсов для этого приложения. Чтобы иметь самый минимум, вы можете взглянуть на действительно небольшие дистрибутивы Linux, такие как Tinycore Linux и т. д.

также он будет зависеть от самого приложения тоже, какие услуги он требует, кроме сети и т. д.

Я думаю если вы можете обеспечить более специфическую информацию, то вы получили бы более детальным ответ.

- какие такие приложения и т. д.

1
отвечен bakytn 2022-12-06 14:59

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх