Apa yang diperlukan untuk boot sistemd minimal untuk meluncurkan getty pada konsol virtual?

21

Untuk SysV init, saya perlu /etc/inittabresptyning getty entry, /sbin/initbinary, binary dan shared library untuk shell login,, the getty, PAM / security / shadow stuff, dan beberapa file perangkat.

Karena upstartsaya memerlukan persyaratan yang hampir sama, tetapi alih-alih /etc/inittab, saya memiliki beberapa *.conffile di bawah /etc/init: satu * .conf start on startupyang menetapkan runlevel telinit, dan satu * .conf untuk setiap tty yang memulai / respawn gettypada tty pada runlevel yang sesuai .

Konfigurasi dan binari apa yang saya perlukan systemd init?

Dokumentasi yang saya temukan sepertinya berfokus pada bagaimana menggunakan sistem yang sudah diinstal untuk memulai dan menghentikan layanan.

Daftar file yang minimal untuk disalin (kecuali kernel / initrd) dari instalasi Arch atau fedora yang berjalan akan baik-baik saja, tetapi sepertinya saya tidak dapat menemukan informasi tentang itu systemd.


Yang ingin saya ketahui adalah, untuk systemd, file apa yang diperlukan, dan apa yang harus dikandungnya, untuk memulai shell login setelah initramfs melakukan switch_rootpanggilan ke systemd /sbin/init.


Contoh untuk upstart, binari dan dua *.conffile:

File /etc/init/whatever.conf:

mulai saat startup
memancarkan runlevel
tugas
naskah
  telinit 2
skrip akhir

File /etc/init/tty1.conf:

mulai dari runlevel [12345]
respawn
exec / sbin / agetty -8 --noclear 38400 tty1 linux

Contoh untuk sysvinit, file biner dan 1 conf bernama /etc/inittab:

id: 2: initdefault:
c1: 12345: respawn: / sbin / agetty 38400 tty1 linux

Sekarang saya mengejar yang systemdsetara.

Saya berasumsi setidaknya 1 *.servicefile diperlukan di suatu tempat, dengan [Service]entri yang berisi ExecStart=-/sbin/agetty --noclear %I linuxdan Restart=always, tetapi apa lagi yang dibutuhkan?

MattBianco
sumber
Sekarang ada artikel basis pengetahuan RedHat baru-baru ini (754933) yang menggambarkan boot systemd di URL ini: Tinjauan systemd untuk RHEL 7
MattBianco
Sangat menyedihkan melihat bagaimana orang meledakkan satu baris konfigurasi menjadi kekacauan besar dan menyebutnya perbaikan.
mulai

Jawaban:

17

Pertama-tama, systemdini bukan unix tradisional init. Systemd jauh lebih banyak, jadi agak tidak adil untuk membandingkan keduanya.

Untuk menjawab pertanyaan, yang tampaknya diperlukan adalah beberapa biner dan file konfigurasi berikut:

/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/[email protected]
/usr/lib/systemd/system/console-getty.service

mengeluarkan systemctl enable console-getty.service [email protected]kemudian membuat symlinks ini:

/etc/systemd/system/default.target.wants/[email protected] -> / lib / systemd / system / getty @ service
/etc/systemd/system/getty.target.wants/console-getty.service -> /lib/systemd/system/console-getty.service

CATATAN : Untuk memanfaatkan systemdfitur khusus untuk memulai agettysecara dinamis, sesuai permintaan saat menekan Alt+ F3dan seterusnya, tampaknya Anda juga harus memiliki setidaknya dua file ini:

/etc/systemd/logind.conf
/lib/systemd/system/[email protected]

di mana [email protected]symlink ke [email protected].

Isi file konfigurasi:

The default.target, getty.target, sysinit.targetfile bisa kosong kecuali untuk [Unit]tag dan (mungkin) Description=xxx.

basic.target juga mengandung informasi ketergantungan:

[Satuan]
Deskripsi = Sistem Dasar
Membutuhkan = sysinit.target
Mau = sockets.target timers.target paths.target slices.target
Setelah = sysinit.target sockets.target timers.target paths.target slices.target

Saya tidak yakin apakah referensi ke target yang tidak ada karena file diperlukan atau tidak. Mereka dijelaskan di systemd.special(7)halaman manual.


console-getty.service: (Kasus khusus untuk agetty di konsol)

[Satuan]
Deskripsi = Konsol Getty
Setelah = systemd-user-session.service plymouth-quit-wait.service
Sebelum = getty.target

[Layanan]
ExecStart = - / sbin / agetty --noclear --keep-baud console 115200,38400,9600 $ TERM
Ketik = idle
Mulai ulang = selalu
RestartSec = 0
UtmpIdentifier = kontra
TTYPath = / dev / console
TTYReset = ya
TTYVHangup = ya
KillMode = proses
IgnoreSIGPIPE = no
SendSIGHUP = ya

[Memasang]
WantedBy = getty.target

[email protected]: (konfigurasi umum untuk semua layanan getty kecuali konsol)

[Satuan]
Keterangan = Getty on% I
Setelah = systemd-user-session.service plymouth-quit-wait.service
Sebelum = getty.target
IgnoreOnIsolate = ya
ConditionPathExists = / dev / tty0

[Layanan]
ExecStart = - / sbin / agetty --noclear% I $ TERM
Ketik = idle
Mulai ulang = selalu
RestartSec = 0
UtmpIdentifier =% I
TTYPath = / dev /% I
TTYReset = ya
TTYVHangup = ya
TTYVTDisallocate = no
KillMode = proses
IgnoreSIGPIPE = no
SendSIGHUP = ya

[Memasang]
WantedBy = getty.target
DefaultInstance = tty1

Akhirnya Anda mungkin perlu beberapa binari khusus ini (saya belum mencoba yang mana yang penting):

/ lib / systemd / systemd (/ sbin / init biasanya menunjukkan ini)
/ lib / systemd / systemd-logind
/ lib / systemd / systemd-cgroups-agent
/ lib / systemd / systemd-pengguna-sesi
/ 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-aktifkan
/ 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-jurnal-gatewayd
/ lib / systemd / systemd-jurnal-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-tunggu-online
/ lib / systemd / systemd-quotacheck
/ lib / systemd / systemd-random-seed
/ lib / systemd / systemd-readahead
/ lib / systemd / systemd-remount-fs
/ lib / systemd / systemd-diselesaikan
/ 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

Untuk meringkas proses mulai systemd, saya pikir itu bekerja seperti ini:

  1. systemd mencari basic.target(atau semua *.targetfile?)
  2. dependensi diselesaikan berdasarkan WantedBy=, Wants=, Before=, After=... arahan dalam [Install]bagian dari *.servicedan *.targetkonfigurasi file.
  3. *.services yang harus dimulai (yang bukan layanan "khusus"), memiliki [Service]bagian dengan ExecStart=arahan, yang menunjukkan eksekusi untuk memulai.
MattBianco
sumber
1
AFAIK [Install]bagian ini tidak digunakan oleh urutan boot, hanya oleh systemctl enable. Yang dilihat oleh boot adalah symlinks in /etc/systemd/system/basic.target.wants/, yang dibuat oleh systemctl enable.
Stefan Majewsky
6

systemdsecara otomatis membuat getty ketika Anda beralih ke terminal, hingga jumlah maksimum tertentu. Standarnya adalah 6 (jadi Anda mendapatkan getty untuk alt + f1 ke alt + f6). Jika Anda ingin mengubah parameter ini, Anda dapat mengedit /etc/systemd/logind.confuntuk mengubah NAutoVTsparameter ke beberapa nomor lain (maks 12)

Jika Anda ingin getty untuk bertelur bahkan jika Anda tidak secara manual beralih Anda dapat menambahkan symlink ke /usr/lib/systemd/system/[email protected]ke /etc/systemd/system/getty.target.wants/direktori:

ln -sf /usr/lib/systemd/system/[email protected] /etc/systemd/system/getty.target.wants/[email protected]

ini akan menghasilkan getty.targetsatu getty@layanan lagi yang membutuhkan . Target adalah kumpulan layanan yang perlu dikembangkan, penggantian runlevel yang mendukung dependensi. Target default tergantung padagetty.target

Lihat di FAQ sistemd di ArchWiki

sunting: Saya meneliti sedikit lebih dalam dokumentasi .

Saat boot systemddaemon memuat semua sistem dalam defaulttarget dan dependensinya. Target ditentukan oleh file

/etc/systemd/system/default.target
/usr/lib/systemd/system/default.target

Target memiliki daftar layanan terlampir yang ditentukan oleh symlink di direktori

/etc/systemd/system/default.target.wants
/usr/lib/systemd/system/default.target.wants

The /etcVersi menimpa default distribusi di /usr/lib. Hanya satu .targetfile yang diperlukan, sementara tidak ada direktori yang diperlukan

gettyhanyalah salah satu layanan di antara yang dapat dijalankan oleh skrip init. Dalam distribusi saya memeriksa (fedora, lengkungan) gettydijalankan dengan dua cara berbeda:

  1. Dimulai oleh skrip khusus untuk setiap terminal (tautan ke /usr/lib/systemd/system/[email protected]file tempat nama tty diganti oleh systemddari nama file tautan )
  2. Secara otomatis dimunculkan sesuai kebutuhan logindketika pengguna beralih ke terminal virtual (mirip dengan cara layanan yang lama inetdmuncul hanya ketika permintaan tiba). logindadalah daemon berbeda yang didistribusikan systemd, dan membaca konfigurasinya dari /etc/systemd/logind.conffile.

Semoga ini memuaskan.

pqnet
sumber
Saya ingin tahu file mana yang dibutuhkan, dan apa yang akan dikandungnya. Bisakah Anda meringkas jawaban Anda dengan daftar file yang diperlukan dan apa yang menyebabkan mereka dibaca dalam urutan apa? Saya kehilangan info tentang apa yang perlu ditemukan di direktori itu. Saya akan mencoba sedikit menjelaskan pertanyaan saya. Terima kasih!
MattBianco
@MattBianco Anda tidak perlu memusuhi systemd. Saya sedang meneliti sedikit dari itu dan itu terlihat sangat mudah, setelah Anda memahami cara kerjanya
pqnet
1
Ya, saya dimanjakan oleh dokumentasi dari proyek open source lainnya. Saya minta maaf karena terdengar bermusuhan. Hanya membuat frustasi karena sepertinya tidak ada dokumen sederhana yang menjelaskan proses booting. (Saya mengerti sekarang bahwa itu karena systemd tidak sederhana.) Dengan cara yang lucu saya ingin berkomentar bahwa mungkin systemditu bermusuhan, seperti dalam melakukan pengambilalihan permusuhan dari cara sistem terbuka dimulai. Ternyata GNU / Linux menjauh dari Unix. Bukan mengatakan bahwa itu adalah hal yang buruk, tetapi sangat berbeda dari apa yang secara tradisional terjadi. Dan sedikit mencari di Google menunjukkan bahwa saya tidak sendirian.
MattBianco