Как я мог создать свой собственный «пользовательский» дистрибутив Linux, который будет запускать только одну программу, почти так же, как XBMCbuntu .
linux
distributions
user3462992
источник
источник
busybox
но это, вероятно, не то, что вы хотите. поэтому, пожалуйста, уделите необходимое время, чтобы высказать свои пожелания, и мы сможем вам помочь. Не стесняйтесь редактировать свой вопрос, чтобы добавить любой соответствующий элемент в нем.Ответы:
Я бы не стал возиться с LFS, это садовая дорожка, ведущая к темному лесу.
Начните с дистрибутива, где у вас есть большой контроль над первоначальной установкой, такой как Arch, или безголовый выпуск, такой как сервер Ubuntu. Смысл этого не столько в экономии места, сколько в том, чтобы ограничить сложность конфигурации init; начиная с безголового дистрибутива, если приложение, которое вы хотите запустить, требует графического интерфейса, вы можете добавить то, что для этого требуется, без необходимости входа в систему с графическим интерфейсом пользователя (он же диспетчера отображения или DM), запускаемого init, и полнофункционального рабочего стола среда, чтобы пойти с этим.
Затем вы захотите узнать, как настроить систему init для ваших целей - обратите внимание, что вы не можете обойтись без init, и это может быть лучшим средством для достижения вашей цели. Существует три варианта init, обычно используемых в linux (но есть и другие ):
Debian использует вариант классического инициала Unix SysV . На момент
jessie
выпуска Debian также переключился наsystemd
( https://wiki.debian.org/systemd )Ubuntu и его производные используют upstart .
Fedora, Arch и производные используют systemd .
Если вы еще ничего не знаете ни о одном из них, ни один из них не является особенно сложным в использовании, чем любой другой. Если вы пойдете с одним из последних двух, они предоставляют некоторые механизмы для обратной совместимости с SysV, но не беспокойтесь об этом , это НЕ немного проще. 1
Суть в том, чтобы минимизировать то, что init делает при загрузке, и именно так вы можете создать систему, которая будет запускать минимальное количество программного обеспечения для поддержки приложения, на котором вы хотите сосредоточиться - это, по сути, то, как настроен сервер, Кстати, это обычная задача (обратите внимание, что вы не можете буквально запустить «только один» пользовательский процесс, по крайней мере, бесполезно).
Если приложение, которое вы хотите запустить, является программой с графическим интерфейсом (хороший пример того, почему вы не можете буквально просто запустить одно приложение, поскольку приложения с графическим интерфейсом требуют X-сервер), вы можете иметь такой
~/.xinitrc
вид;Когда вы потом
startx
, ваша программа будет единственной запущенной, и будет невозможно изменить рабочие столы или запустить что-то еще, частично потому, что нет оконного менеджера или рабочего стола (следовательно, не будет ни оконной рамки, ни заголовка окна).1. Чтобы немного пояснить суть: когда вы исследуете это, вы можете найти некоторые жалобы на systemd и upstart от людей, которые ранее были знакомы с SysV, утверждая, например, что они слишком сложные. Однако объективно они не более сложны, чем SysV (IMO systemd на самом деле проще в использовании), но большинство собак, так сказать, предпочитают свои старые приемы. Этот захват начинает ослабевать, теперь обе системы уже некоторое время используются.
источник
init
но , конечно , вы можете обойтись безupstart, systemd,
илиsysv. init
просто какой - то исполняемый файл с именем ,init
что ваше ядро вызывает , когда он подключаетinitramfs.
В большинстве случаев эти другие три не даже ,init
но они на самом делеexec
эд в наinit,
который обычноbusybox.
busybox
потому что это заслуживает отдельного рассмотрения в отдельном ответе, но не мной.Минимальная начальная программа Hello World, шаг за шагом
Скомпилируйте привет мир без каких-либо зависимостей, который заканчивается бесконечным циклом.
init.S
:Мы не можем использовать системный вызов exit, иначе ядро паникует.
Затем:
Это создает файловую систему с нашим hello world at
/init
, которая является первой пользовательской программой, которую будет запускать ядро. Мы могли бы также добавить больше файлов,d/
и они были бы доступны из/init
программы при запуске ядра.Затем
cd
в дерево ядра Linux, сборка, как обычно, и запустить его в QEMU:И вы должны увидеть строку:
на экране эмулятора! Обратите внимание, что это не последняя строка, поэтому вам нужно посмотреть немного дальше.
Вы также можете использовать программы на C, если статически связываете их:
с:
Динамическое связывание потребовало бы установки исполняемого файла динамического компоновщика, наиболее распространенные из которых являются частью стандартных библиотек C, таких как glibc.
Вы можете работать на реальном оборудовании с включенным USB
/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 с нуля, http://www.linuxfromscratch.org/
если вы хотите настроить ubutnu, вы можете использовать ubunt-builder, и если вы хотите использовать его на базе rpm, вы можете использовать SUsE-Studio, Suse studio позволит вам сделать собственный suse linux.
ура
источник
Это больше о том, что требует ваша «одна программа».
Вы все еще можете хорошо начать понимать, как собрать все воедино, создав LFS (« Linux From Scratch ») . Затем вы добавите вещи, необходимые для вашей программы, или пойдете на полный дистрибутив, потому что создание тяжелой подсистемы, такой как Gnome или KDE на LFS, может быть настоящей болью в заднице.
Конечно, поначалу может быть проще вернуться назад, но удаление вещей из полного дистрибутива может быть проблематичным: делайте это на ВМ и копируйте эту ВМ на каждом шагу.
(мои 2 цента)
Редактировать :
Как указывает SecurityBeast, вместо того, чтобы начинать с полного дистрибутива, такого как CentOS или Ubuntu , вы также можете взглянуть на создание инструментов распространения, таких как:
источник
Вам нужно спросить, что нужно вашей «единой программе» и какие ресурсы у вас есть.
Если вам нужен широкий выбор библиотек и вспомогательных двоичных файлов, вам лучше всего использовать «обычный» дистрибутив linux (Debian или аналогичный) и просто немного поиграться с процессом загрузки.
Если ему требуется более узкий набор вспомогательных средств, но все же требуются такие вещи, как работа в сети или поддержка разнообразного оборудования, использующего различные модули ядра или биты поддержки пользовательского пространства, и вы не хотите, чтобы дисковое пространство занимало обычные дистрибутивы, тогда я бы посоветовал взглянуть на встроенные дистрибутивы (buildroot или аналогичные) или, возможно, Linux с нуля (хотя это может быть головной болью при обслуживании)
Если вам нужно только то, что может обеспечить немодульное ядро, и ничего больше, тогда ваш собственный двоичный файл прямо на ядре может сработать и будет самым легким решением.
источник