Во-первых, системаd
не является традиционным униксом init
. Systemd намного больше, поэтому сравнивать их немного несправедливо.
Для ответа на вопрос, кажется, что необходимы некоторые двоичные файлы и следующие конфигурационные файлы:
/usr/lib/systemd/system/default.target /usr/lib/systemd/system/basic.target /usr/lib/systemd/system/sysinit.target /usr/lib/systemd/system/getty.target /usr/lib/systemd/system/getty@.service /usr/lib/systemd/system/console-getty.service
выдача systemctl для включения консольного getty.service getty@tty2.service
, затем создание этих симлинков:
/etc/systemd/system/default.target.wants/getty@tty2.service -> /lib/systemd/system/getty@service /etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service
ПРИМЕЧАНИЕ: Чтобы использовать специальные возможности systemd
для динамического запуска agetty
, при нажатии Alt+F3 и т.д., кажется, что вы также должны иметь как минимум эти два файла:
/etc/systemd/logind.conf /lib/systemd/system/autovt@.service
где autovt@. service
является сим-ссылкой на getty@.service
.
Файлы default.target
, getty.target
, sysinit.target
могут быть пустыми, за исключением тега [Unit]
и (возможно) Description=xxx
.
basic.target
также содержит информацию о зависимостях:
[Unit] Description=Basic System Requires=sysinit.target Wants=sockets.target timers.target paths.target slices.target After=sysinit.target sockets.target timers.target paths.target slices.target
Я не уверен, нужны ли ссылки на цели, которые не существуют в виде файлов или нет. Они описаны на странице man systemd.special(7)
man page.
console-getty.service
: (Особый случай для agetty на консоли)
[Unit] Description=Console Getty After=systemd-user-sessions.service plymouth-quit-wait.service Before=getty.target [Service] ExecStart=-/sbin/agetty --noclear --keep-baud console 115200,38400,9600 $TERM Type=idle Restart=always RestartSec=0 UtmpIdentifier=cons TTYPath=/dev/console TTYReset=yes TTYVHangup=yes KillMode=process IgnoreSIGPIPE=no SendSIGHUP=yes [Install] WantedBy=getty.target
getty@.service
: (общая конфигурация для всех сервисов getty, кроме console)
[Unit] Description=Getty on %I After=systemd-user-sessions.service plymouth-quit-wait.service Before=getty.target IgnoreOnIsolate=yes ConditionPathExists=/dev/tty0 [Service] ExecStart=-/sbin/agetty --noclear %I $TERM Type=idle Restart=always RestartSec=0 UtmpIdentifier=%I TTYPath=/dev/%I TTYReset=yes TTYVHangup=yes TTYVTDisallocate=no KillMode=process IgnoreSIGPIPE=no SendSIGHUP=yes [Install] WantedBy=getty.target DefaultInstance=tty1
Наконец, вам, вероятно, понадобится несколько этих специальных двоичных файлов (я не пробовал, какие из них решающие):
/lib/systemd/systemd (/sbin/init usually points to this) /lib/systemd/systemd-logind /lib/systemd/systemd-cgroups-agent /lib/systemd/systemd-user-sessions /lib/systemd/systemd-vconsole-setup /lib/systemd/systemd-update-utmp /lib/systemd/systemd-sleep /lib/systemd/systemd-sysctl /lib/systemd/systemd-initctl /lib/systemd/systemd-reply-password /lib/systemd/systemd-ac-power /lib/systemd/systemd-activate /lib/systemd/systemd-backlight /lib/systemd/systemd-binfmt /lib/systemd/systemd-bootchart /lib/systemd/systemd-bus-proxyd /lib/systemd/systemd-coredump /lib/systemd/systemd-cryptsetup /lib/systemd/systemd-fsck /lib/systemd/systemd-hostnamed /lib/systemd/systemd-journald /lib/systemd/systemd-journal-gatewayd /lib/systemd/systemd-journal-remote /lib/systemd/systemd-localed /lib/systemd/systemd-machined /lib/systemd/systemd-modules-load /lib/systemd/systemd-multi-seat-x /lib/systemd/systemd-networkd /lib/systemd/systemd-networkd-wait-online /lib/systemd/systemd-quotacheck /lib/systemd/systemd-random-seed /lib/systemd/systemd-readahead /lib/systemd/systemd-remount-fs /lib/systemd/systemd-resolved /lib/systemd/systemd-rfkill /lib/systemd/systemd-shutdown /lib/systemd/systemd-shutdownd /lib/systemd/systemd-socket-proxyd /lib/systemd/systemd-timedated /lib/systemd/systemd-timesyncd /lib/systemd/systemd-udevd /lib/systemd/systemd-update-done
Чтобы подвести итог процессу запуска systemd, я думаю, что он работает примерно так:
basic.target
(или все *. целевые
файлы?) WantedBy=
, Wants=
, Before=
, After=
... директив в разделе [Install]
конфигурационных файлов *.service
и *.target
. В *.service
, которые должны запускаться (не являются "специальными" службами), имеется раздел [Service]
с директивой ExecStart=
, в котором указан исполняемый файл, который нужно запустить. Я использовал e2sl [1], чтобы найти кандидатов на файловые системы непосредственно с одного из RAID-устройств и смонтировать файловую систему, используя устройство замкнутого цикла [2], пропустив LVM и программный RAID. Мне пришлось немного поиграть со смещением (позиция суперблока имеет смещение в 1KB к началу раздела!), но в конце концов мне удалось это сделать.
Отсюда спасение было простым, как пирог: Монтаж loopdevice в точку монтирования и все было скопировано.
http://schumann.cx/e2sl/mount --loop & see losetup[1175186]