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

Другой метод отъезда offlineimap работающий со знанием Вашего пароля, но не помещая пароль на диск, должен оставить offlineimap, работающий в tmux/screen с autorefresh установка включила в Вашем ~/.offlineimaprc

Необходимо добавить autorefresh = 10 к [Account X] раздел offlineimaprc файла, чтобы заставить это проверять каждые 10 минут. Также удалите любую строку конфигурации с password или passwordeval.

Затем выполненный offlineimap - это будет просить Ваш пароль и кэшировать его в памяти. Это не выйдет после первого показа, но будет спать в течение 10 минут. Затем это будет просыпаться и работать снова, но это будет все еще помнить Ваш пароль.

Таким образом, можно оставить tmux сессию, работающую с offlineimap, ввести пароль однажды, и offlineimap будет прекрасен там после.

9
09.03.2019, 17:10
5 ответов

Я бы не стал возиться с LFS, это садовая дорожка, ведущая к темному лесу.

Начните с дистрибутива, в котором у вас есть большой контроль над первоначальной установкой, например Arch, или безголового выпуска, такого как сервер Ubuntu. Дело здесь не столько в экономии места, сколько в ограничении сложности конфигурации init; начиная с автономного дистрибутива, если приложение, которое вы хотите запустить, требует графического интерфейса, вы можете добавить то, что требуется для этого, без необходимости использовать логин с графическим интерфейсом (он же диспетчер отображения или DM), запускаемый с помощью init, и полностью развернутый рабочий стол окружающая среда, чтобы пойти с этим.

Затем вы хотите узнать, как настроить систему инициализации для ваших целей - обратите внимание, что вы не можете обойтись без init, и это может быть лучшим средством достижения вашей цели.Существует три варианта init, обычно используемых в Linux (но есть и некоторые другие ):

  • Debian использует вариант классического Unix SysV style init . Начиная с выпуска jessie , Debian также перешел на systemd ( https://wiki.debian.org/systemd )

  • Ubuntu и его производные используют выскочка .

  • Fedora, Arch и производные используют systemd .

Если вы еще ничего не знаете ни об одном из них, то ни один из них не является особенно сложным в использовании, чем любой другой. Если вы выберете один из двух последних, они предоставляют некоторые механизмы обратной совместимости с SysV, , но не беспокоятся об этом , это НЕ проще. 1

Суть здесь в том, чтобы минимизировать то, что init делает при загрузке, и именно так вы можете создать систему, которая будет запускать минимальное количество программного обеспечения для поддержки приложения, на котором вы хотите сосредоточиться - это, по сути, как настроен сервер, кстати, так что это обычная задача (обратите внимание, что вы не можете буквально запустить «только один» процесс пользовательского пространства, по крайней мере, бесполезно).

Если приложение, которое вы хотите запустить, является программой с графическим интерфейсом пользователя (хороший пример того, почему вы не можете буквально просто запустить одно приложение, поскольку приложениям с графическим интерфейсом требуется X-сервер), вы можете иметь ~ /.xinitrc , который выглядит так:

#!/bin/sh

myprogram

Когда вы затем startx , ваша программа будет единственной запущенной, и будет невозможно изменить рабочие столы или запустить что-либо еще, частично потому, что нет оконный менеджер или окружение рабочего стола (следовательно, не будет ни оконной рамки, ни заголовка).

1. Вкратце: когда вы исследуете это, вы можете найти некоторую озабоченность по поводу systemd и выскочки от людей, которые ранее были знакомы с SysV, утверждая, например, что они слишком сложны. Однако объективно они не сложнее SysV (IMO systemd на самом деле проще в использовании), но большинство собак, так сказать, предпочитают свои старые уловки. Это сцепление начинает утихать, поскольку обе системы уже давно используются.

6
27.01.2020, 20:04

Минимальная программа инициализации hello world, шаг за шагом

enter image description here

Скомпилируйте hello world без каких-либо зависимостей, завершающуюся бесконечным циклом. 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

Мы не можем использовать системный вызов exit, иначе произойдет паника ядра.

Затем:

mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o      # link
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

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

Вы можете работать на реальном оборудовании с USB на / dev / sdX и:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/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

15
27.01.2020, 20:04

Это больше о том, что требует ваша «одна программа».

Вы все еще можете хорошо понять, как собрать все вместе, создав LFS (также известную как « Linux From Scratch ») . Тогда вы сможете добавьте вещи, необходимые для вашей программы, или перейдите к полному дистрибутиву, потому что создание такой тяжелой подсистемы, как Gnome или KDE на LFS, может быть настоящей головной болью.

Конечно, сначала может быть проще вернуться назад, но удаление чего-либо из полного дистрибутива может быть проблематичным: делайте это на виртуальной машине и копируйте эту виртуальную машину на каждом этапе.

(мои 2 цента)

Изменить :

Как указано в SecurityBeast вместо того, чтобы начинать с полного дистрибутива, такого как CentOS или Ubuntu , вы также можете ознакомиться с такими инструментами распространения, как:

1
27.01.2020, 20:04

если вы немного разбираетесь в программировании и хотите создать его с нуля, вы можете использовать LFS, т.е. Linux from Scratch http://www.linuxfromscratch.org/

если вы хотите настроить ubutnu, вы можете использовать ubunt-builder и если вы хотите его на базе rpm, вы можете использовать SUsE-Studio, Suse studio позволит вам сделать пользовательский suse linux

спасибо

1
27.01.2020, 20:04

Что вам нужно спросить, так это то, что нужно вашей «одной программе» и какие ресурсы у вас есть.

Если требуется широкий выбор библиотек и вспомогательных двоичных файлов, возможно, лучше всего будет использовать «обычный» дистрибутив Linux (Debian или аналогичный) и просто немного повозиться с процессом загрузки.

Если требуется более узкий набор средств поддержки, но по-прежнему требуются такие вещи, как сеть или поддержка различного оборудования с использованием разных модулей ядра или битов поддержки пользовательского пространства, и вам не нужны накладные расходы на дисковое пространство, как в обычном дистрибутиве, я бы предложите взглянуть на встроенные дистрибутивы (buildroot или аналогичные) или, может быть, подход linux с нуля (хотя это может быть головной болью при обслуживании)

Если вам нужно только то, что может предоставить немодульное ядро, и ничего больше, кроме запуска собственного двоичного файла прямо на ядре может работать и быть самым легким решением ..

1
27.01.2020, 20:04

Теги

Похожие вопросы