Я пытаюсь запустить приложение Linux, и все, что я хочу запустить - это одно приложение без загрузки. Мне нужна сеть и все (без дисплея, периферии и т. Д.). Я не хочу, чтобы другие приложения работали, чтобы приложение, которое я запускаю, имело 100% ЦП. Это возможно?
17
Ответы:
Минимальная программа initrd CPIO hello world, шаг за шагом
Скомпилируйте привет мир без каких-либо зависимостей, который заканчивается бесконечным циклом.
init.S
:Мы не можем использовать
sys_exit
, иначе ядро паникует.Потом:
Это создает файловую систему с нашим hello world at
/init
, которая является первой пользовательской программой, которую будет запускать ядро. Мы могли бы также добавить больше файлов,d/
и они были бы доступны из/init
программы при запуске ядра.Затем
cd
в дерево ядра Linux, сборка, как обычно, и запустить его в QEMU:И вы должны увидеть строку:
на экране эмулятора! Обратите внимание, что это не последняя строка, поэтому вам нужно посмотреть немного дальше.
Вы также можете использовать программы на C, если статически связываете их:
с:
Вы можете работать на реальном оборудовании с включенным USB
/dev/sdX
и:Отличный источник на эту тему: http://landley.net/writing/rootfs-howto.html Также объясняется, как его использовать
gen_initramfs_list.sh
, это скрипт из дерева исходных текстов ядра Linux, помогающий автоматизировать процесс.Следующий шаг: настройте BusyBox, чтобы вы могли взаимодействовать с системой: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902#203902
Протестировано на Ubuntu 16.10, QEMU 2.6.1.
источник
Вы можете запустить ядро с
init=/path/to/myapp
параметром, определенным в вашем загрузчике.источник
Похоже, вы пытаетесь установить киоск . Большинство руководств по Интернету фокусируются на веб-браузере, таком как Firefox, как на отдельном приложении, которое работает. Посмотрите на это руководство для идей.
источник
Конечно, вы можете запустить только одно пользовательское приложение после загрузки ядра. Но у него не будет 100% ЦП, потому что будут некоторые другие процессы, связанные с ядром, которые должны существовать. Обычно это делается на устройствах со встроенным Linux, например, беспроводных маршрутизаторах. У меня также есть опыт из первых рук, делающий это для многопоточного приложения.
После загрузки ядра запускается сценарий инициализации или запуска. Читайте об уровнях запуска Linux и процессе init. Существуют различные схемы запуска, поэтому невозможно быть конкретным. Но Linux позволит вам точно настроить, какие приложения и демоны будут выполняться в вашей ситуации. За исключением файла запуска в корневом каталоге, файлы, которые необходимо изменить, находятся в / etc и, в частности, /etc/init.d
Кстати, если вы не являетесь суперпрограммистом или не запустили удаленный GDB-сервер, вам понадобится какая-то консоль отладки (консоль ПК или последовательный порт) для вашего приложения. Это позволит вам получать уведомления о сбоях сегмента, ошибках шины и ошибках подтверждения. Так что планируйте иметь что-то вроде «периферийного» помимо «сетевого».
источник
Есть некоторые системные приложения, которые должны быть запущены, кроме них, конечно, вы можете выделить остальные ресурсы компьютера для этого приложения. Чтобы получить минимум, вы можете взглянуть на действительно маленькие дистрибутивы Linux, такие как TinyCore Linux и т. Д.
Также это будет зависеть от самого приложения, каких сервисов оно требует помимо сети и т. Д.
Я думаю, что если вы сможете предоставить более конкретную информацию, вы получите более подробный ответ.
Как то, что приложение и т. Д.
источник
Если вы действительно хотите ничего, кроме ядра Linux, работы в сети и своего приложения, единственный способ сделать это - это:
make menuconfig
) свое собственное ядро и удалить все функции, не связанные с работой системы и работой в сети. Вы захотите отключить, чтобы заблокировать слой, я не знаю, как это сделать на последних ядрах черезmake menuconfig
.init
не сможет этого сделать, или быть готовой к выполнению 1 дополнительного процесса в пространстве пользователя.Я знаю, что модули ядра могут создавать процессы - простое
ps aux
показало бы многие в типичной системе (все они в скобках). Вы, вероятно, хотите, чтобы ваш модуль создал процесс ядра. Чтобы избавиться от всех процессов, созданных ядром, кроме ваших, вам необходимо отключить потоки [kthreadd
], управление питанием [pm
], слой событий [events
] и другие.Если вам нужна более практичная настройка процесса ядра + 1 пользовательского пространства, это возможно.
В Linux есть опция командной строки ядра
init=
- это то, что запускается ядром после завершения загрузки. Программа должна находиться на корневом устройстве, указанном с помощьюroot=
или в initrd (загруженном вашим загрузчиком).Если эта программа закроется, Linux начнет паниковать, поэтому убедитесь, что она никогда не завершится.
Во многих современных дистрибутивах Linux это настроено так, что
init
программа в initrd выполняет некоторую дополнительную инициализацию пользовательского пространства перед запуском/sbin/init
или/sbin/systemd
. Вам нужно выяснить, что делает ваш дистрибутив здесь (информация о Debian здесь ) и найти, где вы можете указать конечную программу «handoff», и оттуда вы можете указать ей запускать ваше приложение вместоinit
илиsystemd
.systemd
управляет многими основными функциями, такими как создание/dev
, установка имени хоста и другими вещами, поэтому, если вы проявите гибкость, вы можете вместо этого взглянуть на настройкуsystemd
для порождения отдельного процесса и, при необходимости, перезапустить его в случае сбоя. Если я не ошибаюсь, он в основном делает это для однопользовательского режима или режима восстановления - он запускает оболочку.У вас будет запущено 2 процесса (
systemd
и ваша программа), но система не будет паниковать, если ваша программа закроется или завершится сбоем.Рассмотрим также просто облегченную установку Debian - у установки «netinst» не так много работы, кроме ядра, оболочки и пары сервисов - или рассмотрим OpenWRT / LEDE - у нее есть веб-сервер для Luci, работающий по умолчанию, и пара других услуг, но легко отключается.
источник