Каковы минимальные приложения корневой файловой системы, необходимые для полной загрузки Linux?

Это вопрос о приложениях для пользовательского пространства, но выслушайте меня!

Три «приложения», так сказать, необходимы для загрузки функционального дистрибутива Linux:

  1. Загрузочный загрузчик – для встроенных обычно U-Boot, хотя и не является жестким требованием.

  2. Ядро – это довольно просто.

  3. Корневая файловая система. Невозможно загрузить ее без оболочки. Содержит файловую систему, к которой загружается ядро, и где init называется формой.

Мой вопрос касается № 3. Если кто-то хотел создать крайне минимальные rootfs (для этого вопроса, скажем, нет GUI, только shell), какие файлы / программы необходимы для загрузки в оболочку?

  • Измените / etc / xdg / lxsession / LXDE / автозапуск перед загрузкой
  • Debian не загружается в графический интерфейс
  • как запустить запуск скрипта на live-дистрибутиве?
  • X (?) Перезапуск каждую минуту при тестировании debian
  • не запускать xorg при загрузке
  • Как автоматически выполнить «netctl start tq84-wifi» при загрузке?
  • Помимо crontab, какие другие способы можно добавить программы для запуска во время загрузки?
  • Linux mint 13: Ошибка при запуске MATE
  • 4 Solutions collect form web for “Каковы минимальные приложения корневой файловой системы, необходимые для полной загрузки Linux?”

    Это полностью зависит от того, какие услуги вы хотите использовать на своем устройстве.

    программы

    Вы можете сделать загрузку 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. В дополнение к бинарнику init (обычно находящемуся в /sbin ) вам понадобятся файлы конфигурации (обычно называемые /etc/inittab – некоторые современные замены init заменяют этот файл, но вы не найдете их на небольшой встроенной системе ), которые указывают, какие услуги следует начинать и когда. Для BusyBox /etc/inittab является необязательным; если он отсутствует, вы получаете корневую оболочку на консоли, а скрипт /etc/init.d/rcS (местоположение по умолчанию) выполняется во время загрузки.

    Это все, что вам нужно, помимо программ, которые делают ваше устройство полезным. Например, на моем домашнем маршрутизаторе, использующем вариант OpenWrt , единственными программами являются BusyBox, nvram (для чтения и изменения настроек в NVRAM) и сетевые утилиты.

    Если все ваши исполняемые файлы статически связаны, вам понадобится динамический загрузчик ( ld.so , который может быть вызван разными именами в зависимости от выбора libc и архитектуры процессора) и всех динамических библиотек ( /lib/lib*.so , возможно, некоторые из них в /usr/lib ), требуемые этими исполняемыми файлами.

    Структура каталога

    Стандарт иерархии файловой системы описывает общую структуру каталогов систем 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 записей, но во встроенной системе сценарий часто не входит в изображение. Если какое-либо оборудование может быть hotplugged (например, если устройство имеет хост-порт USB), то /dev следует управлять с помощью udev (у вас может быть минимальный набор в корневой файловой системе).

    Действия загрузки

    Помимо корневой файловой системы вам необходимо установить еще несколько для нормальной работы:

    • procfs on /proc (практически незаменим)
    • sysfs on /sys (в значительной степени незаменим)
    • tmpfs filesystem on /tmp (чтобы программы могли создавать временные файлы, которые будут находиться в ОЗУ, а не в корневой файловой системе, которая может находиться во флэш-памяти или только для чтения)
    • tmpfs, devfs или devtmpfs on /dev если они динамические (см. udev в «Файлы устройств» выше)
    • devpts on /dev/pts если вы хотите использовать [псевдотерминалы (см. примечание о pts выше)

    Вы можете создать файл /etc/fstab и вызвать mount -a или запустить mount вручную.

    Запустите демон syslog (а также klogd для журналов ядра, если программа syslogd не позаботится об этом), если у вас есть место для записи журналов.

    После этого устройство готово к запуску приложений.

    Как создать корневую файловую систему

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

    Корневая файловая система может храниться в ОЗУ (загружается из (обычно сжатого) изображения в ПЗУ или флэш) или в файловую систему на диске (хранится в ПЗУ или флэш) или загружается из сети (часто поверх TFTP ), если это применимо , Если корневая файловая система находится в ОЗУ, сделайте ее initramfs – файловой системой RAM, содержимое которой создается во время загрузки.

    Существует множество фреймворков для сборки корневых изображений для встроенных систем. В часто задаваемых вопросах BusyBox есть несколько указателей. Buildroot является популярным, позволяя вам создать полный корневой образ с настройкой, подобной ядру Linux и BusyBox. OpenEmbedded – еще одна такая структура.

    В Википедии есть (неполный) список популярных встроенных дистрибутивов Linux . Примером встроенного Linux, который может быть рядом с вами, является семейство операционных систем OpenWrt для сетевых устройств (популярное на домашних маршрутизаторах tinkerers). Если вы хотите учиться на опыте, вы можете попробовать Linux от Scratch , но он ориентирован на настольные системы для любителей, а не на встроенные устройства.

    Заметка о Linux-ядре Linux

    Единственное, что испечено в ядре Linux, – это первая программа, запущенная во время загрузки. (Здесь я не буду разбираться в initrd и initramfs ). Эта программа, традиционно называемая init , имеет идентификатор процесса 1 и имеет определенные привилегии (иммунитет к сигналам KILL ) и обязанности (пожинать сирот ). Вы можете запустить систему с ядром Linux и начать все, что захотите, в качестве первого процесса, но тогда у вас есть операционная система, основанная на ядре Linux, а не то, что обычно называется «Linux» – Linux , в здравом смысле этого термина, является операционной системой Unix , чье ядро ​​является ядром Linux . Например, Android – это операционная система, которая не является Unix-подобной, но основана на ядре Linux.

    Все, что вам нужно, – это один статически связанный исполняемый файл, который помещается в файловую систему изолированно. Вам не нужны никакие другие файлы. Этот исполняемый файл является процессом init. Это может быть busybox. Это дает вам оболочку и множество других утилит, само по себе. Вы можете перейти к полностью функционирующей системе, просто выполнив команды вручную в busybox для монтирования корневой файловой системы read-write, create / dev, exec real init и т. Д.

    Если вам не нужны какие-либо утилиты оболочки, будет mksh статически связанный mksh файл mksh (например, против klibc-130K на Linux / i386). Вам нужен /linuxrc или /init или /sbin/init который просто вызывает mksh -l -T!/dev/tty1 в цикле:

     #!/bin/mksh while true; do /bin/mksh -l -T!/dev/tty1 done 

    Опция -T!$tty – это последнее дополнение к mksh которое сообщает ему, чтобы порождать новую оболочку на данном терминале и ждать ее. (До этого было только -T-, чтобы запрограммировать программу и -T$tty чтобы появиться на терминале, но не дождаться его. Это было не так хорошо.) Параметр -l просто сообщает ему запустить оболочку входа ( который читает /etc/profile , ~/.profile и ~/.mkshrc ).

    Это предполагает, что ваш терминал /dev/tty1 , замените. (С большим количеством магии терминал может быть автоматически обнаружен. /dev/console не даст вам полного контроля работы.)

    Для этого вам нужно несколько файлов в /dev :

    • / DEV / консоли
    • / DEV / нуль
    • / DEV / TTY
    • / DEV / tty1

    Загрузка с опцией ядра devtmpfs.mount=1 устраняет необходимость в заполненном /dev , просто пусть это будет пустой каталог (подходящий для использования в качестве точки монтирования).

    Обычно вы хотите иметь некоторые утилиты (от klibc, busybox, beastiebox, toybox или toolbox), но они действительно не нужны.

    Вы можете добавить файл ~/.mkshrc , который устанавливает $ PS1 и некоторые основные псевдонимы и функции оболочки.

    Однажды я сделал сжатый сжатый (371K) initrd 171K для Linux / m68k, используя mksh (и его пример файла mkshrc) и только klibc-utils. (Это было до того, как -T! Был добавлен в оболочку, однако, поэтому вместо этого он породил оболочку входа в /dev/tty2 и отправил сообщение на консоль, чтобы пользователь мог переключать терминалы.) Он отлично работает.

    Это действительно минимальная настройка. Другие ответы дают отличные рекомендации в отношении нескольких более признанных систем. Это настоящая особая вещь.

    Отказ от ответственности: Я разработчик mksh.

    Пошаговая инструкция по минимальной инициализации приветствия

    введите описание изображения здесь

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

     .global _start _start: mov $1, %rax mov $1, %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" 

    Это создает файловую систему с нашим миром приветствия в /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 

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

    Вы также можете использовать программы C, если вы ставите их статически:

     #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 on /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 , который является скриптом из дерева исходных gen_initramfs_list.sh ядра Linux, чтобы помочь автоматизировать процесс.

    Следующий шаг: настройка BusyBox, чтобы вы могли взаимодействовать с системой: https://github.com/cirosantilli/runlinux

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

    Linux и Unix - лучшая ОС в мире.