Это полностью зависит от того, какие услуги вы хотите иметь на своем устройстве.
программы
Вы можете заставить Linux загружаться прямо в оболочку . Это не очень полезно в производстве - кому бы просто хотелось, чтобы там была оболочка - но это полезно в качестве механизма вмешательства, когда у вас есть интерактивный загрузчик: переход init=/bin/sh
к командной строке ядра. Все системы Linux (и все системы Unix) имеют оболочку в стиле Bourne / POSIX /bin/sh
.
Вам понадобится набор утилит оболочки . BusyBox - очень распространенный выбор; она содержит оболочку и общие утилиты для файла и обработки текста ( cp
, grep
, ...), сетевые настройки ( ping
, ifconfig
, ...), манипуляции с процессом ( ps
, nice
, ...), а также различные другие инструменты системы ( fdisk
, mount
, syslogd
...). BusyBox является чрезвычайно настраиваемым: вы можете выбрать, какие инструменты вы хотите, и даже отдельные функции во время компиляции, чтобы получить правильный размер / компромисс функциональности для вашего приложения. Помимо sh
, голый минимум , который вы не можете сделать ничего не есть mount
, umount
и halt
, но было бы нетипичной не имеют также cat
, cp
, mv
, rm
,mkdir
, rmdir
, ps
, sync
И еще несколько. BusyBox устанавливается как один двоичный файл busybox
с символической ссылкой для каждой утилиты.
Первый процесс в нормальной системе Unix называется init
. Его работа - запускать другие сервисы. BusyBox содержит систему инициализации. В дополнение к init
двоичному /sbin
файлу (обычно расположенному в ) вам понадобятся его конфигурационные файлы (обычно называемые /etc/inittab
- некоторые современные замены init покончили с этим файлом, но вы не найдете их в небольшой встроенной системе), которые указывают, какие службы нужно запускать и когда. Для BusyBox /etc/inittab
необязательно; если он отсутствует, вы получаете корневую оболочку на консоли и скрипт /etc/init.d/rcS
(расположение по умолчанию) выполняется во время загрузки.
Это все, что вам нужно, кроме программ, которые заставляют ваше устройство делать что-то полезное. Например, на моем домашнем маршрутизаторе, использующем вариант OpenWrt , единственными программами являются BusyBox nvram
(для чтения и изменения настроек в NVRAM) и сетевые утилиты.
Если все ваши исполняемые файлы статически не связаны, вам потребуется динамический загрузчик ( ld.so
который может вызываться разными именами в зависимости от выбора libc и архитектуры процессора) и все динамические библиотеки ( /lib/lib*.so
возможно, некоторые из них /usr/lib
), необходимые для эти исполняемые файлы.
Структура каталогов
Filesystem Hierarchy Standard описывает общую структуру каталогов системы Linux. Он ориентирован на установку на настольных компьютерах и серверах: многие из них могут быть опущены во встроенной системе. Вот типичный минимум.
/bin
: исполняемые программы (некоторые могут быть /usr/bin
вместо).
/dev
: узлы устройства (см. ниже)
/etc
: файлы конфигурации
/lib
: общие библиотеки, включая динамический загрузчик (если все исполняемые файлы статически не связаны)
/proc
: точка монтирования для файловой системы proc
/sbin
: исполняемые программы. Различие с тем /bin
, что /sbin
это для программ, которые полезны только для системного администратора, но это различие не имеет смысла на встроенных устройствах. Вы можете сделать /sbin
символическую ссылку на /bin
.
/mnt
: удобно иметь в корневых файловых системах только для чтения в качестве точки монтирования во время обслуживания
/sys
: точка монтирования для файловой системы sysfs
/tmp
: расположение для временных файлов (часто tmpfs
монтирование)
/usr
: Содержит подкаталоги bin
, lib
и sbin
. /usr
существует для дополнительных файлов, которые не находятся в корневой файловой системе. Если у вас его нет, вы можете сделать /usr
символическую ссылку на корневой каталог.
Файлы устройства
Вот несколько типичных записей в минимуме /dev
:
console
full
(запись в него всегда сообщает «на устройстве не осталось места»)
log
(сокет, который программы используют для отправки записей журнала), если у вас есть syslogd
демон (например, BusyBox), читающий из него
null
(действует как файл, который всегда пуст)
ptmx
и pts
каталог , если вы хотите использовать псевдо-терминалы (то есть любой терминал, отличный от консоли) - например, если устройство подключено к сети, и вы хотите подключиться через telnet или ssh
random
(возвращает случайные байты, блокирует риски)
tty
(всегда обозначает терминал программы)
urandom
(возвращает случайные байты, никогда не блокирует, но может быть неслучайным на недавно загруженном устройстве)
zero
(содержит бесконечную последовательность нулевых байтов)
Помимо этого вам понадобятся записи для вашего оборудования (кроме сетевых интерфейсов, в которые они не попадают /dev
): последовательные порты, хранилище и т. Д.
Для встроенных устройств вы обычно создаете записи устройства непосредственно в корневой файловой системе. В высокопроизводительных системах есть сценарий, который вызывается MAKEDEV
для создания /dev
записей, но во встроенной системе этот сценарий часто не входит в образ. Если какое-либо оборудование может быть подключено в горячем режиме (например, если устройство имеет хост-порт USB), тогда им /dev
должно управлять udev (у вас может быть минимальный набор в корневой файловой системе).
Действия при загрузке
Помимо корневой файловой системы, вам нужно смонтировать еще несколько для нормальной работы:
- procfs on
/proc
(в значительной степени незаменимый)
- sysfs on
/sys
(в значительной степени незаменимый)
tmpfs
файловая система включена /tmp
(чтобы позволить программам создавать временные файлы, которые будут в ОЗУ, а не в корневой файловой системе, которая может быть во флэш-памяти или только для чтения)
- tmpfs, devfs или devtmpfs включены,
/dev
если они динамические (см. udev в разделе «Файлы устройств» выше)
- devpts on,
/dev/pts
если вы хотите использовать [псевдо-терминалы (см. замечание pts
выше)
Вы можете сделать /etc/fstab
файл и позвонить mount -a
, или запустить mount
вручную.
Запустите демон syslog (а также klogd
для журналов ядра, если syslogd
программа об этом не позаботится), если у вас есть место для записи журналов.
После этого устройство готово к запуску специфичных для приложения сервисов.
Как сделать корневую файловую систему
Это длинная и разнообразная история, поэтому все, что я здесь сделаю, - это несколько советов.
Корневая файловая система может храниться в ОЗУ (загружаться из (обычно сжатого) образа в ПЗУ или флэш-памяти) или в файловой системе на диске (храниться в ПЗУ или во флэш-памяти) или загружаться из сети (часто через TFTP ), если применимо , Если корневая файловая система находится в ОЗУ, сделайте ее initramfs - файловой системой ОЗУ, содержимое которой создается во время загрузки.
Существует множество платформ для сборки корневых образов для встроенных систем. В FAQ BusyBox есть несколько указателей . Buildroot является популярным, позволяя вам создать целый корневой образ с настройкой, аналогичной ядру Linux и BusyBox. OpenEmbedded - еще один такой фреймворк.
В Википедии есть (неполный) список популярных дистрибутивов встроенного Linux . Примером встроенного Linux, который вы можете иметь рядом с вами, является семейство операционных систем OpenWrt для сетевых устройств (популярное на домашних маршрутизаторах тинкеров). Если вы хотите учиться на собственном опыте, вы можете попробовать Linux с нуля , но он ориентирован на настольных систем для любителей, а не на встраиваемые устройства.
Примечание по Linux против ядра Linux
Единственное поведение, которое запекается в ядре Linux, заключается в том, что первая программа запускается во время загрузки. (Я не буду вдаваться в тонкости initrd и initramfs .) Эта программа, традиционно называемая init , имеет идентификатор процесса 1 и имеет определенные привилегии (невосприимчивость к сигналам KILL ) и обязанности (пожинает сирот ). Вы можете запустить систему с ядром Linux и запустить все, что захотите, в качестве первого процесса, но тогда у вас будет операционная система, основанная на ядре Linux, а не то, что обычно называется «Linux» - Linux , в обычном смысле слова термина, Unix- подобная операционная система, ядро которой является ядром Linux, Например, Android - это операционная система, которая не похожа на Unix, но основана на ядре Linux.