
Fast Init для Linux Systems. Обратный спроектирован из EEEPC Fastinit Claudio Matsuoka - «Защиты, заполненные лягушкой ДНК…»

Рисунок 1: Скриншот финального загрузки Alpine Linux (Howto).
Особенности включают:
/etc/rc.local поддержка/etc/network/interfacesinitctl topsulogin для защищенной оболочки технического обслуживанияsyslogd , см. Рекомендуемый проект SYSKLOGD для полной интеграции журнала и того, как войти в буфер кольца ядра из сценариев с использованием loggerОсновное внимание уделяется небольшим и встроенным системам, хотя Finit также полностью используется в системах сервера и настольных компьютеров. Для рабочих примеров см. Вклад/ раздел с учебниками для следующих распределений Linux:
ПРИМЕЧАНИЕ. Поддержка различных распределений Linux не означает, что финальная установка легко устанавливается на все архитектуры. Скрипты установки в комплекте являются примерами стандартных установок, протестированных в системах AMD64 (x86_64). Пользовательские настройки, например, для встроенных систем можно найти в любом из следующих примеров на основе строительства: Mylinux, Infix или простой Br2-Finit-Demo.
Этот пример /etc/finit.conf также может быть разделен в несколько файлов .conf в /etc/finit.d . Доступные, но еще не включенные, службы могут быть размещены в /etc/finit.d/available и включены оператором, использующим инструмент initctl. Смотрите вышеупомянутые распределения Linux или Mylinux.
Примечание. Начиная с Finit v4.4, линии Conf можно разорвать с помощью стандартного символа Continuation Contrauation (
), теперь также поддерживаются комментарии. Последнее означает, что вам нужно избежать любых хэшей, используемых в директивах и описаниях (#). Для получения дополнительной информации об этом и примерах см. Руководство Finit.conf (5) или doc/config.md.
# Fallback if /etc/hostname is missing
host default
# Runlevel to start after bootstrap, 'S', default: 2
# runlevel 2
# Support for setting global environment variables, using foo=bar syntax
# be careful though with variables like PATH, SHELL, LOGNAME, etc.
# PATH=/usr/bin:/bin:/usr/sbin:/sbin
# Max file size for each log file: 100 kiB, rotate max 4 copies:
# log => log.1 => log.2.gz => log.3.gz => log.4.gz
log size=100k count=4
# Services to be monitored and respawned as needed
service [S12345] env:-/etc/conf.d/watchdog watchdog $WATCHDOG_OPTS $WATCHDOG_DEV -- System watchdog daemon
service [S12345] env:-/etc/conf.d/syslog syslogd -n $SYSLOGD_OPTS -- System log daemon
service [S12345] < pid /syslogd> env:-/etc/conf.d/klogd klogd -n $KLOGD_OPTS -- Kernel log daemon
service [2345] env:-/etc/conf.d/lldpd lldpd -d $LLDPD_OPTS -- LLDP daemon (IEEE 802.1ab)
# The BusyBox ntpd does not use syslog when running in the foreground
# So we use this trick to redirect stdout/stderr to a log file. The
# log file is rotated with the above settings. The condition declares
# a dependency on a system default route (gateway) to be set. A single
# <!> at the beginning means ntpd does not respect SIGHUP for restart.
service [2345] log:/var/log/ntpd.log <!net/route/default> ntpd -n -l -I eth0 -- NTP daemon
# For multiple instances of the same service, add :ID somewhere between
# the service/run/task keyword and the command.
service :80 [2345] merecat -n -p 80 /var/www -- Web server
service :8080 [2345] merecat -n -p 8080 /var/www -- Old web server
# Alternative method instead of below runparts, can also use /etc/rc.local
# sysv [S] /etc/init.d/keyboard-setup -- Setting up preliminary keymap
# sysv [S] /etc/init.d/acpid -- Starting ACPI Daemon
# task [S] /etc/init.d/kbd -- Preparing console
# Hidden from boot progress, using empty `--` description
# sysv [S] /etc/init.d/keyboard-setup --
# sysv [S] /etc/init.d/acpid --
# task [S] /etc/init.d/kbd --
# Run start scripts from this directory
# runparts /etc/start.d
# Virtual consoles run BusyBox getty, keep kernel default speed
tty [12345] /sbin/getty -L 0 /dev/tty1 linux nowait noclear
tty [2345] /sbin/getty -L 0 /dev/tty2 linux nowait noclear
tty [2345] /sbin/getty -L 0 /dev/tty3 linux nowait noclear
# Use built-in getty for serial port and USB serial
# tty [12345] /dev/ttyAMA0 noclear nowait
# tty [12345] /dev/ttyUSB0 noclear
# Just give me a shell, I need to debug this embedded system!
# tty [12345] console noclear nologin service строфа, а также task , run и другие описаны в полном объеме в doc/config.md. Вот краткий обзор некоторых из самых распространенных компонентов, необходимых для запуска демона Unix:
service [LVLS] <COND> log env:[-]/etc/default/daemon daemon ARGS -- Daemon daemon
^ ^ ^ ^ ^ ^ ^ ^
| | | | | | | `---------- Optional description
| | | | | | `------------------ Daemon arguments
| | | | | `------------------------- Path to daemon
| | | | `---------------------------------------------------- Optional env. file
| | | `-------------------------------------------------------- Redirect output to log
| | `--------------------------------------------------------------- Optional conditions
| `---------------------------------------------------------------------- Optional Runlevels
`------------------------------------------------------------------------------ Monitored application
Некоторые компоненты являются необязательными: Runlevel (ы), условие (ы) и описание, что позволяет легко создавать простые сценарии начала и все еще возможным для более расширенного использования:
service /usr/sbin/sshd -D
Зависимости обрабатываются с использованием условий. Одним из наиболее распространенных условий является ждать, пока станет доступной базовой сетью:
service <net/route/default> nginx -- High performance HTTP server
Вот еще один пример, в котором мы инструктируем Finit не начинать BusyBox ntpd , пока syslogd не начался должным образом. Finit ожидает, что syslogd создает свой PID -файл по умолчанию /var/run/syslogd.pid .
service [2345] log <!pid/syslogd> ntpd -n -N -p pool.ntp.org
service [S12345] syslogd -n -- Syslog daemon
Обратите внимание на ключевое слово log , BusyBox ntpd использует stderr для регистрации при запуске на переднем плане. С помощью log Finit перенаправляет stdout + stderr в демон журнала системы, используя инструмент logger(1) .
Услуга или задача может иметь перечисленные несколько зависимостей. Здесь мы ждем, пока как syslogd , и базовые сетевые сетки станут:
service [2345] log <pid/syslogd,net/route/default> ntpd -n -N -p pool.ntp.org
Если какое -либо условие терпит неудачу, например, потеря сетей, ntpd останавливается, и как только он снова вернется, ntpd перезагружается автоматически.
ПРИМЕЧАНИЕ. Убедитесь, что Daemons не распадаются и не отделяются от управляющего TTY, обычно флаг -n или -f , или -D как в случае OpenSsh выше. Если он отсоединяется, Finit не может отслеживать его и вместо этого попытается перезапустить его.
Процесс наблюдения
Начните, контролируйте и перезапустите услуги, если они потерпят неудачу.
Гетти
Finit поддерживает внешнюю Getty, но также поставляется с ограниченным встроенным Getty, полезным для действительно небольших систем. Getty устанавливает TTY и ожидает ввода пользователя перед передачей /bin/login , который отвечает за обработку фактической аутентификации.
tty [12345] /dev/tty1 nowait linux
tty [12345] /dev/ttyAMA0 noclear vt100
tty [12345] /sbin/getty -L /dev/ttyAMA0 vt100
Пользователи встроенных систем могут захотеть включить автоматическую последовательную консоль со специальным устройством @console . Это работает независимо от погоды, система использует ttyS0 , ttyAMA0 , ttyMXC0 или что -либо еще. Finit фигурирует это путем запроса sysfs: /sys/class/tty/console/active .
tty [12345] @console linux noclear
Обратите внимание на дополнительные флаги noclear , nowait и nologin . Последнее для полного пропуска процесса входа в систему. Для получения дополнительной информации см. Doc/config.md.
Runlevels
Поддержка SYSV в стиле init доступна в том же минимальном стиле, что и все остальное в Finit. Синтаксис [2345] может быть применен для обслуживания, задачи, запуска и TTY Stanzas.
Зарезервированные Runlevels - 0 и 6, остановка и перезагрузка соответственно, как и Sysv Init. Runlevel 1 может быть настроен свободно, но рекомендуется сохранять как System Single User Runlevel, так как Finit не запустит здесь сеть. Настройка runlevel NUM от /etc/finit.conf - это то, что Finit изменяется после начальной загрузки, если только «Single» (или 's') не приведен на Cmdline ядра, и в этом случае запускается Runlevel 1.
Все услуги в Runlevel S) запускаются первыми, за которыми следует желаемый Runlevel. Запуск задач в Runlevel S может быть запущена в последовательности с помощью run [S] cmd . Изменение Runlevels во время выполнения выполняется, как и любой другой init, например, Init 4 , но также и использует более продвинутый инструмент intictl .
Условия
Как упоминалось ранее, Finit имеет расширенную систему зависимостей для обработки синхронизации, называемых условиями. Его можно использовать во многих отношениях; зависеть от другой услуги, доступности сети и т. Д.
Одним из действительно классных примеров, полезных для встроенных систем, является запуск определенных сценариев, если у платы есть определенная функция, закодированная в дереве устройств. В начальной загрузке мы запускаем следующий сценарий ident :
#! /bin/sh
conddir=/var/run/finit/cond/hw/model
dtmodel=/sys/firmware/devicetree/base/model
if ! test -e $dtmodel ; then
exit 0
fi
model= $( cat $dtmodel | tr " [A-Z] " " [a-z]- " )
mkdir -p $conddir && ln -s ../../reconf $conddir / $model При условии, что узел дерева устройств существует, и является строкой, мы можем затем использовать условие <hw/model/foo> при запуске других сценариев. Вот пример:
run [S] /path/to/ident --
task [2] <hw/model/foo> /path/to/foo-init -- Initializing Foo board
Обратите внимание на трюк с пустым описанием, чтобы скрыть вызов, чтобы
identв результате финального прогресса.
Плагины
Плагины могут расширить функциональность Finit и поднять на различные этапы процесса загрузки и во время выполнения. Плагины записываются в C и скомпилируются в динамическую библиотеку, загруженную автоматически с помощью Finit At Boot. Основной набор плагинов связан в plugins/ каталоге.
Возможности:
Расширения и функциональность не связаны с тем, что нужно /sbin/init чтобы запустить систему, доступны в виде набора плагинов, которые либо зацепляются в процесс загрузки, либо отвечают на различные ввод/вывода.
Для получения дополнительной информации см. Doc/Plugins.md.
Автоматический перезагрузка
По умолчанию Finit Monitors /etc/finit.d/ и /etc/finit.d/enabled/ Регистрировать любые изменения в файлах .conf . Чтобы активировать изменение, пользователь должен вызовать initctl reload , который перезагружает все измененные файлы, останавливает любые удаленные сервисы, запускает новые и перезагружает любые модифицированные. Если аргументы командной строки службы изменились, процесс будет прекращен, а затем снова начнется с обновленных аргументов. Если аргументы не были изменены, а процесс поддерживает Shughup, процесс получит вздох, а не прекращается и начинается.
Для некоторых вариантов использования дополнительный шаг вызова initctl reload создает ненужные накладные расходы, которые можно удалить во время сборки, используя:
configure --enable-auto-reload
CGROUPS
Finit поддерживает CGROUPS V2 и поставляется со следующими группами по умолчанию, в которых помещаются службы и пользовательские сеансы:
/sys/fs/cgroup
|-- init/ # cpu.weight:100
|-- system/ # cpu.weight:9800
`-- user/ # cpu.weight:100
Сам Finit и его помощники и службы помещаются в группу листовых узлов верхнего уровня init/ , которая также зарезервирована .
Все процессы запуска/задача/служба/SYSV помещаются в собственную подгруппу в system/ . Имя каждой подгруппы взято из соответствующего файла .conf из /etc/finit.d .
Все процессы Getty/ Tty помещаются в собственную подгруппу в user/ . Имя каждой подгруппы взято из имени пользователя.
Четвертая группа также существует, root группа. Он также зарезервирован и в основном предназначен для задач RT. Если у вас есть задачи RT, они должны быть объявлены как таковые в своей службе, как это:
service [...] <...> cgroup.root /path/to/foo args -- description
или
cgroup.root
service [...] <...> /path/to/foo args -- description
service [...] <...> /path/to/bar args -- description
См. Doc/config.md для получения дополнительной информации, например, как настроить пределы для группы.
Инструмент initctl имеет три команды, которые помогают отладки и оптимизации настройки и мониторинга CGROUPS. Смотрите команды ps , top и cgroup для деталей.
Примечание. Системы, которые не поддерживают CGROUPS, в частности, версия 2, автоматически обнаруживаются. В таких системах вышеуказанная функциональность отключена рано при загрузке.
В конце загрузки, когда все задачи и услуги начались, но не в сети, Finit вызывает свою встроенную команду Run Parts (8) в любых S каталогах runparts <DIR> . Это происходит непосредственно перед тем, как перейти на настроенный Runlevel (по умолчанию 2). (Сеть включена непосредственно перед сменой из одного пользовательского режима.)
runparts /etc/rc.d/ Сразу после изменения Runlevel, когда все службы начались должным образом, называется /etc/rc.local .
Для rc.local не требуется никакой конфигурации в /etc/finit.conf . Если он существует и является исполняемым сценарием Shell Finit, вызывает его в самом конце загрузки, прежде чем вызовать HOOK_SYSTEM_UP . Посмотрите больше на крючках в doc/plugins.md.
Невозможно вызовать финал с помощью сигналов или использовать initctl в любых runparts или /etc/rc.local . Это потому, что Finit является одиночной резьбой и называется этими сценариями блокирующими способом в конце Runlevel S, после чего цикл событий еще не был запущен.
Цикл событий - это все это, которое строится с финалом, за исключением Runlevel S, которая остается медленной процессией в течение многих настроек, с несколькими крючками и блокирующими вызовами на внешние сценарии.
Однако не все команды initctl запрещены. Поддерживаемые команды:
inictl cond : только работа из файлов в /run/finit/condinitctl enable/disable : включенная запуск/задача/служба активируется в изменении Runlevel от s на 2initctl touch/show/create/delete/list : create , при условии, что неинтерактивный режим используется, снова изменения вступают в силу в изменении Runlevel сразу после начальной загрузкиinitctl -f reboot/poweroff/halt : при условии, что флаг -f используется для принудительного призрачного ядра Пример: вы можете установить usr/ условие в /etc/rc.local и иметь услугу/задачу в Runlevel 2, чтобы она была зависеть от его выполнения.
Основная поддержка Runlevels включена в Finit от v1.8. По умолчанию все службы, задачи, команды запуска и TTYS, перечисленные без набора Runlevels, получают назначенный набор по умолчанию [234] . Runlevel по умолчанию после загрузки 2.
Finit поддерживает Runlevels 0-9, и S, с 0 зарезервирован для остановки, 6 перезагрузков и S для служб, которые можно работать только в Bootstrap. Runlevel 1 - это однопользовательский уровень, где обычно не включено сеть. В Finit это скорее политика для определения пользователя. Обычно используются только Runlevels 1-6, и даже чаще используется только Runlevel по умолчанию.
Чтобы указать разрешенный набор runlevels для service , run команду, task или tty , добавьте [NNN] к /этк /etc/finit.conf , например:
service [S12345] syslogd -n -x -- System log daemon
run [S] /etc/init.d/acpid start -- Starting ACPI Daemon
task [S] /etc/init.d/kbd start -- Preparing console
service [S12345] <pid/syslogd> klogd -n -x -- Kernel log daemon
tty [12345] /dev/tty1
tty [2] /dev/tty2
tty [2] /dev/tty3
tty [2] /dev/tty4
tty [2] /dev/tty5
tty [2] /dev/tty6
В этом примере Syslogd сначала запускается, параллельно, а затем ACPID называется с помощью обычного сценария SYSV init. Он вызывается с помощью команды RUN, что означает следующую команду задачи для запуска сценария KBD не вызывается до тех пор, пока сценарий ACPID Init не будет полностью завершен. Затем скрипт настройки клавиатуры называется параллельно с Klogd в качестве контролируемой службы.
Опять же, задачи и услуги запускаются параллельно, в то время как команды запуска вызываются в перечисленном заказе, а последующие команды не запускаются до тех пор, пока команда выполнения не завершена. Кроме того, команды задачи и запуска выполняются в оболочке, поэтому можно использовать трубы и перенаправления.
Следующие примеры иллюстрируют это. Задача начальной загрузки и команды запуска также удаляются, когда они завершены, initctl show не будет перечислять их.
task [S] echo "foo" | cat >/tmp/bar
run [S] echo "$HOME" >/tmp/secret
Переключение между Runlevels может быть сделано, вызывая init с одним аргументом, например, init 5 или с помощью initctl runlevel 5 , оба переключаются на Runlevel 5. При изменении Finit Runlevels также автоматически перезагружает все файлы .conf в /etc/finit.d/ Поэтому, если вы хотите установить новую систему конфигурации, переключитесь на Runlevel 1, измените все файлы конфигурации в системе и коснитесь всех файлов .conf в /etc/finit.d , прежде чем переключиться обратно на предыдущий Runlevel - таким образом, Finit может остановить старые сервисы и запустить какие -либо новые, не переопределяя систему.
Традиционно перезагрузка и остановка системы UNIX осуществляется путем изменения его Runlevel. Finit поставляется со своим собственным инструментом: shutdown , reboot , poweroff и suspend , а также инструмент initctl , подробно описанный в следующем разделе.
По причинам совместимости Finit прислушивается к тому же набору сигналов, что и Busybox init. Это не на 100% совместимо с SYSV init, но явно более распространенная комбинация для Finit. Для получения более подробной информации см. Doc/Signals.md.
Finit также реализует современный API для статуса запроса и службы Start/Stop, называемые initctl . В отличие от telinit инструмент initctl не возвращается, пока данная команда не будет полностью завершена.
Usage: initctl [OPTIONS] [COMMAND]
Options:
-b, --batch Batch mode, no screen size probing
-c, --create Create missing paths (and files) as needed
-f, --force Ignore missing files and arguments, never prompt
-h, --help This help text
-j, --json JSON output in 'status' and 'cond' commands
-1, --once Only one lap in commands like 'top'
-p, --plain Use plain table headings, no ctrl chars
-q, --quiet Silent, only return status of command
-t, --no-heading Skip table headings
-v, --verbose Verbose output
-V, --version Show program version
Commands:
debug Toggle Finit (daemon) debug
help This help text
version Show program version
ls | list List all .conf in /etc/finit.d
create <CONF> Create .conf in /etc/finit.d/available
delete <CONF> Delete .conf in /etc/finit.d/available
show <CONF> Show .conf in /etc/finit.d/available
edit <CONF> Edit .conf in /etc/finit.d/available
touch <CONF> Change .conf in /etc/finit.d/available
enable <CONF> Enable .conf in /etc/finit.d/available
disable <CONF> Disable .conf in /etc/finit.d/enabled
reload Reload *.conf in /etc/finit.d (activate changes)
cond set <COND> Set (assert) user-defined conditions +usr/COND
cond get <COND> Get status of user-defined condition, see $? and -v
cond clear <COND> Clear (deassert) user-defined conditions -usr/COND
cond status Show condition status, default cond command
cond dump [TYPE] Dump all, or a type of, conditions and their status
log [NAME] Show ten last Finit, or NAME, messages from syslog
start <NAME>[:ID] Start service by name, with optional ID
stop <NAME>[:ID] Stop/Pause a running service by name
reload <NAME>[:ID] Reload service as if .conf changed (SIGHUP or restart)
This allows restart of run/tasks that have already run
Note: Finit .conf file(s) are *not* reloaded!
restart <NAME>[:ID] Restart (stop/start) service by name
signal <NAME>[:ID] <S> Send signal S to service by name, with optional ID
ident [NAME] Show matching identities for NAME, or all
status <NAME>[:ID] Show service status, by name
status Show status of services, default command
cgroup List cgroup config overview
ps List processes based on cgroups
top Show top-like listing based on cgroups
plugins List installed plugins
runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot
reboot Reboot system
halt Halt system
poweroff Halt and power off system
suspend Suspend system
utmp show Raw dump of UTMP/WTMP db
Для услуг, не поддерживающих SIGHUP нотация <!> В файле .conf должна использоваться, чтобы сказать Finit, чтобы остановиться и запустить его при reload и runlevel . Если <> удерживает больше условий, это также повлияет на то, как поддерживается услуга.
Примечание. Даже если можно запустить службы, не принадлежащие текущему Runlevel, эти услуги не будут автоматически восстановлены, если они выходят (сбой). Следовательно, если runlevel составляет 2, приведенная ниже сервис Dropbear SSH не будет перезапущена, если она будет убита или выходит.
Команда status - это по умолчанию, она отображает быстрый обзор всех контролируемых запуска/задачи/сервисов. Здесь мы называем initctl -p , подходящую для сценариев и документации:
alpine:~# initctl -p
PID IDENT STATUS RUNLEVELS DESCRIPTION
======================================================================
1506 acpid running [---2345----] ACPI daemon
1509 crond running [---2345----] Cron daemon
1489 dropbear running [---2345----] Dropbear SSH daemon
1511 klogd running [S-12345----] Kernel log daemon
1512 ntpd running [---2345----] NTP daemon
1473 syslogd running [S-12345----] Syslog daemon
alpine:~# initctl -pv
PID IDENT STATUS RUNLEVELS COMMAND
======================================================================
1506 acpid running [---2345----] acpid -f
1509 crond running [---2345----] crond -f -S $CRON_OPTS
1489 dropbear running [---2345----] dropbear -R -F $DROPBEAR_OPTS
1511 klogd running [S-12345----] klogd -n $KLOGD_OPTS
1512 ntpd running [---2345----] ntpd -n $NTPD_OPTS
1473 syslogd running [S-12345----] syslogd -n
Переменные среды для каждой из приведенных выше службы читаются, в случае Alpine Linux, /etc/conf.d/ . Другие распределения могут иметь другие каталоги, например, использование Debian /etc/default/ .
Команда status принимает необязательное NAME:ID аргумент. Здесь мы проверяем статус dropbear , который имеет только один экземпляр в этой системе:
alpine:~# initctl -p status dropbear
Status : running
Identity : dropbear
Description : Dropbear SSH daemon
Origin : /etc/finit.d/enabled/dropbear.conf
Environment : -/etc/conf.d/dropbear
Condition(s):
Command : dropbear -R -F $DROPBEAR_OPTS
PID file : !/run/dropbear.pid
PID : 1485
User : root
Group : root
Uptime : 2 hour 46 min 56 sec
Runlevels : [---2345----]
Memory : 1.2M
CGroup : /system/dropbear cpu 0 [100, max] mem [--.--, max]
|- 1485 dropbear -R -F
|- 2634 dropbear -R -F
|- 2635 ash
`- 2652 initctl -p status dropbear
Apr 8 12:19:49 alpine authpriv.info dropbear[1485]: Not backgrounding
Apr 8 12:37:45 alpine authpriv.info dropbear[2300]: Child connection from 192.168.121.1:47834
Apr 8 12:37:46 alpine authpriv.notice dropbear[2300]: Password auth succeeded for 'root' from 192.168.121.1:47834
Apr 8 12:37:46 alpine authpriv.info dropbear[2300]: Exit (root) from <192.168.121.1:47834>: Disconnect received
Apr 8 15:02:11 alpine authpriv.info dropbear[2634]: Child connection from 192.168.121.1:48576
Apr 8 15:02:12 alpine authpriv.notice dropbear[2634]: Password auth succeeded for 'root' from 192.168.121.1:48576
Finit способен работать в системах настольных/серверов с UDEV и встроенными системами, которые обычно поставляются с MDEV BusyBox. Некоторые системы имеют SystemD-Udev или Eudev сегодня вместо оригинального UDEV, финальных зондов для всех из них во время выполнения и ожидают /dev/ быть файловой системой с использованием записи с использованием devtmpfs . Также можно запустить статически настройку /dev если это необходимо. Однако не очень хорошая идея, чтобы UDEV и MDEV были установлены одновременно, это приведет к непредсказуемым результатам.
При загрузочных вызовах mdev или udevd для заполнения /dev это делается немного по-другому, и в системах с UDEV вы можете добавить следующую задачу с одним выстрелом в начале вашего /etc/finit.conf :
run [S] udevadm settle --timeout=120 -- Waiting for udev
Finit имеет встроенную Getty для TTYS, но требует работы /bin/login или /bin/sh , если не настроены ttys в /etc/finit.conf .
Для полной эксплуатационной системы /var , /run и /tmp должны быть правильно настроены в /etc/fstab - который итератируется при загрузке.
Этот проект основан на оригинальном финале Claudio Matsuoka, который был обратно спроектирован из Syscalls of eeepc Fastinit - «Защиты, заполненные лягушкой ДНК…»
Finit разрабатывается и поддерживается Йоахимом Вибергом в Github. Пожалуйста, подайте отчеты об ошибках, клонируйте их или отправьте запросы на привлечение исправлений ошибок и предлагаемые расширения.