Bagaimana cara menonaktifkan perilaku shell darurat systemd agressive?

10

Secara default systemd jatuh ke shell darurat jika ada kesalahan sedikit pun. Sebagai contoh, jika salah satu mount di fstab gagal karena suatu alasan sistem menjadi tidak dapat di-boot segera. Saya mengelola banyak sistem produksi yang beragam dan saya merasa perilaku ini sangat merusak. (Sebenarnya saya pikir ini kegagalan desain utama, tapi itu pendapat pribadi).

Saya ingin meningkatkan ketahanan boot sistem. Secara optimal sistem harus selalu boot, driver yang hilang, mount, dll. Tidak boleh drop shell darurat, (hanya menunjukkan peringatan saja) kecuali kesalahan yang diberikan akan membuat login konsol benar-benar mustahil. Apa yang bisa dijalankan, itu harus dijalankan.

Saya tahu systemd secara otomatis menghasilkan file * .mount dari / etc / fstab dan saya bisa menggunakan opsi nofail dengan timeout x-systemd.device kecil (atau menentukan sendiri file .mount yang relevan). Namun itu tidak akan menyelesaikan masalah saya, saya ingin membuat sistem lebih tangguh, "menambal" fstab setiap kali sangat tidak nyaman dan saya tidak yakin berapa banyak "masalah" yang mungkin ada yang akan membuat sistem saya tidak dapat di-boot hanya karena beberapa pengembang di suatu tempat berpikir itu cukup penting.

Singkatnya, saya ingin mendapatkan kembali kontrol atas mesin saya dan tidak membiarkan systemd memutuskan masalah apa yang cukup serius untuk menghancurkan proses boot. Apa itu mungkin?

Goteguru
sumber
apa masalah sebenarnya btw? Saya sadar dua - tidak bisa login lebih dari ssh, dan prompt sulogin hanya memungkinkan root, bukan pengguna sudo, untuk mendapatkan akses dalam mode darurat. apakah itu menutupi kerusakan yang Anda derita?
sourcejedi
Sebenarnya sistem akan jauh lebih mudah diakses jika kedua layanan itu akan dimulai, ya. Secara optimal sistem harus memulai semua yang dapat dimulai seperti di masa SysV lama (error loggin 'bukannya kematian yang menyakitkan oleh shell darurat), dan mulai shell hanya jika terjadi kesalahan fatal.
Goteguru

Jawaban:

7

Secara harfiah hanya me-mount kegagalan, itu saja yang perlu Anda ubah.

Jadi surat permintaan Anda akan sepele untuk dijawab. Buat file tarik-turun:

# /etc/systemd/system/local-fs.target.d/nofail.conf

# Clear OnFailure= (set it to nothing)
[Unit]
OnFailure=

Saya percaya ini tidak akan menambah masalah baru, di luar yang sudah dialami oleh linux sysvinit dengan membiarkan skenario kegagalan parsial ini.


Namun Anda juga menunjukkan pertanyaan tentang berapa lama systemd harus menunggu perangkat blok yang ditentukan tersedia. Saya tidak dapat melihat cara untuk mengkonfigurasi ini, tanpa memberikan pengganti untuk generator fstab secara keseluruhan. https://www.freedesktop.org/software/systemd/man/systemd.generator.html

Jika Anda membuang sejumlah besar kode yang kurang banyak digunakan di sini, tampaknya tidak mungkin untuk meningkatkan ketahanan sistem. Saya pikir solusi terdekat adalah dengan menambal generator fstab yang ada. Ini tidak terlalu rumit, saya kira Anda bisa lolos / mengikuti perubahan signifikan.

Secara teknis, jika distribusi Anda memiliki mountallskrip sysvinit mandiri , Anda dapat mencoba mengaitkannya. Tetapi itu akan secara signifikan mengubah proses boot - sebenarnya lebih dari garpu. Saya tidak akan merekomendasikan pendekatan itu.


https://unix.stackexchange.com/a/393711/29483

Jika Anda mencari melalui file unit, hanya ada beberapa cara untuk boot kembali emergency.target. Biasanya ketika .mountunit untuk sistem file lokal gagal, menyebabkan local-fs.target gagal. Atau ketika initramf Anda gagal me-mount filesystem root, jika initramf Anda menggunakan systemd.

local-fs.targettelah OnFailure=emergency.target. Dan itu gagal karena unit untuk sistem file lokal secara otomatis ditambahkan ke daftar Memerlukan local-fs.target (kecuali jika ada DefaultDependencies=no).

$ systemctl show --property Requires local-fs.target
Requires=-.mount home.mount boot.mount boot-efi.mount
sourcejedi
sumber
2
Saya kira saya harus memasukkan [Unit]\nOnFailure= nofail.conf saya. Tampaknya mungkin untuk mengkonfigurasi waktu tunggu di /etc/systemd/system.conf (melalui opsi DefaultTimeoutStartSec generik). Sistem saya biasanya cukup cepat, 90-an sepertinya merupakan pembunuhan berat. Solusi ini tampaknya menjanjikan.
Goteguru
Dalam kasus saya saya set OnFailure=di /lib/systemd/system/local-fs.targetbukan /etc/systemd(Ubuntu 16.04 pada AWS)
ThiagoAlves
@ThiagoAlves Anda tidak harus melakukan itu, itu akan ditimpa pada peningkatan sistem. Ikuti instruksi dalam jawaban, atau minta klarifikasi :-).
sourcejedi
@sourcejedi saya mencoba jawabannya tetapi tidak berhasil untuk saya
ThiagoAlves
1
@ThiagoAlves Terima kasih atas tanggapan Anda. Saya sudah membuat jawabannya kurang ambigu, jadi kita bisa lebih jelas tentang apakah itu masalahnya atau tidak. Yaitu, saya ingin tahu apakah Anda memastikan untuk memasukkan [Unit]sebelumnya OnFailure=.
sourcejedi
0

Matikan pemasangan otomatis dari setiap sistem file yang tidak penting untuk operasi boot dengan menambahkan noautoopsi mount ke /etc/fstabentri:

/dev/sdxy /u01 nfs defaults 0 0

untuk:

/dev/sdyx /u01 nfs noauto 0 0

dan kemudian pasang sistem file setelah boot dengan menggunakan baris di /etc/rc.local:

mount /u01

Contoh ini menggunakan NFS tetapi juga berlaku untuk LUN yang diimpor dari server file.

Perangkat Lunak Tertua
sumber
1
Ya, saya tahu noauto, tetapi jika saya akan mengubah fstab setiap waktu, nofail akan menjadi pilihan yang jauh lebih baik. Terima kasih.
Goteguru
0

Coba ini mungkin?

systemctl mask emergency.service
systemctl mask emergency.target
pierre
sumber
4
Sudahkah Anda mencoba ini? Apa yang terjadi ketika systemd menemukan kesalahan saat boot, dengan target darurat ditutup?
Stephen Kitt