Я пытаюсь запустить приложение в Linux и все, что я хочу запустить это приложение от загрузки. Мне нужна сеть, и это все (без дисплея, периферийных устройств и т. д.). Я не хочу других приложений, так что приложение я запускаю имеет 100% процессора. Такое возможно?
Как создать систему Linux, которая запускает одно приложение?
6 ответов
минимальный initrd CPIO hello world программа Шаг за шагом
скомпилировать 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.
похоже, вы пытаетесь настроить киоска. Большинство руководств по интернету сосредоточены на веб-браузере, таком как Firefox, как единственное приложение, которое работает. Взгляните на данное руководство для идей.
вы можете запустить ядро с init=/path/to/myapp
параметр, определенный в загрузчике.
вы можете запустить только одно пользовательское приложение после загрузки ядра. Но он не будет иметь 100% процессора, потому что будут некоторые другие процессы, связанные с ядром, которые должны существовать. Это обычно делается во встроенных устройствах Linux, например беспроводных маршрутизаторах. У меня также есть опыт работы с многопоточным приложением.
после загрузки ядра запускается скрипт инициализации или запуска. Читайте на Linux выполнения и инит процесс. Существуют различные схемы запуска в использовании, поэтому невозможно быть конкретным. Но Linux позволит вам установить, какие именно приложения и демоны будут выполнять в вашей ситуации. Другие, чем файл Startup в корень, файлы, которые нужно изменить в /и т. д. и в частности / etc / init.d
BTW если вы не somekind суперпрограммы или прежде чем вы получите удаленный сервер GDB работает, вам понадобится somekind консоли отладки (консоль ПК или последовательный порт) для вашего приложения. Это позволит вам получать уведомления о Сег неисправности, ошибки и сбои утверждение. Поэтому планируйте иметь что-то "периферийное", кроме"сети".
если вы действительно не хотите ничего, кроме ядра 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, работающий по умолчанию, и несколько других служб, но легко отключается.
есть некоторые системные приложения, которые должны быть запущены, кроме них, конечно, вы можете выделить остальную часть компьютерных ресурсов для этого приложения. Чтобы иметь самый минимум, вы можете взглянуть на действительно небольшие дистрибутивы Linux, такие как Tinycore Linux и т. д.
также он будет зависеть от самого приложения тоже, какие услуги он требует, кроме сети и т. д.
Я думаю если вы можете обеспечить более специфическую информацию, то вы получили бы более детальным ответ.
- какие такие приложения и т. д.
Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]