Apa perbedaan antara "systemctl mask" dan "systemctl disable"?

35

Saya ingin meningkatkan waktu boot Ubuntu GNOME 16.04 saya dengan menonaktifkan layanan plymouth ketika boot. Saya telah menemukan dua jawaban tentang bagaimana melakukannya di berbagai situs web yaitu:

# systemctl disable plymouth-quit-wait.service 
# systemctl mask plymouth-quit-wait.service 

Saya tidak dapat menjalankan salah satu dari yang di atas kecuali saya tahu apa yang mereka lakukan.

pearlstar
sumber

Jawaban:

52

Jika suatu layanan enabled, maka ada symlink di suatu tempat di

/etc/systemd/system

ke file unit, paling sering di suatu tempat di

/lib/systemd/system

Bermanfaat, ketika Anda enablesuatu layanan, jalur lengkap dari tautan dan target yang dibuat akan dicetak ke stdout.

Menonaktifkan layanan menghapus symlink, sehingga file unit itu sendiri tidak terpengaruh, tetapi layanan tidak dimuat pada boot berikutnya, ketika systemd membaca /etc/systemd/system.

Namun, layanan yang dinonaktifkan dapat dimuat, dan akan dimulai jika layanan yang bergantung padanya dimulai ; enabledan disablehanya mengonfigurasi perilaku mulai otomatis untuk unit, dan statusnya mudah diganti.

Layanan bertopeng adalah layanan yang file unitnya adalah symlink /dev/null. Ini membuatnya "mustahil" untuk memuat layanan, bahkan jika diperlukan oleh layanan lain yang diaktifkan.

Saat Anda maskmenggunakan layanan, symlink dibuat dari /etc/systemd/systemke /dev/null, membiarkan file unit asli di tempat lain tidak tersentuh. Saat Anda unmaskmenggunakan layanan, symlink dihapus.

Namun, saya perhatikan bahwa perintah ini tidak selalu dihormati.

Ketika saya mencoba untuk menutupi sebagian besar layanan, itu gagal:

$ sudo systemctl mask bluetooth.service
Failed to execute operation: Invalid argument

Tentu saja, saya menghentikan layanan terlebih dahulu. @Anwar menyarankan masking hanya mungkin untuk layanan non-kritis.

Membuka kedok layanan bertopeng, kecuali saya menutup sendiri, juga gagal (diam-diam). Saya percaya ini karena tidak ada file unit untuk layanan di mana pun, kecuali dalam bentuk symlink /dev/null, kali ini di /lib/systemd/system:

$ file $(locate fuse.service)
/lib/systemd/system/fuse.service: symbolic link to /dev/null
$ sudo systemctl unmask fuse.service
$ systemctl status fuse
● fuse.service
   Loaded: masked (/dev/null; bad)
   Active: inactive (dead)

Saya bukan satu-satunya yang memiliki masalah ini

Untuk benar-benar membuka kedok layanan masked x11-common, saya harus menghapus symlink ke /dev/nulldan sudo apt-get install --reinstall x11-common && sudo systemctl daemon-reload. Sekarang ketika saya menanyakannya dengan systemctl status x11-commonsaya melihat layanan memiliki lingkaran hijau yang bagus dan dimuat dan aktif (keluar) meskipun tidak memiliki file unit.

Untuk referensi lebih lanjut, artikel ini tentang Cara Menggunakan Systemctl mungkin bermanfaat.

Zanna
sumber
1
Hmm, saya mengerti systemctl status x11-common ● x11-common.service Loaded: masked (/dev/null; bad) Active: inactive (dead). Apakah itu buruk? Tapi saya menggunakan Debian, bukan Ubuntu. Lagi pula, penjelasan yang bagus. Terima kasih.
Faheem Mitha
@FaheemMitha Saya tidak yakin layanan ini diperlukan - sistem saya sepertinya berfungsi tanpanya. Tidak ada pengalaman dengan Debian, maaf!
Zanna
17

Sederhana saja.

  • systemctl start, systemctl stop: memulai (menghentikan) unit yang dimaksud segera ;
  • systemctl enable, systemctl disable: menandai (hapus tanda) unit untuk mulai otomatis saat boot (dengan cara khusus unit, dijelaskan pada [Install]bagiannya);
  • systemctl mask, systemctl unmask : melarang (memungkinkan) semua dan segala upaya untuk memulai unit yang dipermasalahkan (baik secara manual atau sebagai ketergantungan dari unit lain, termasuk dependensi dari target boot default). Perhatikan bahwa menandai untuk autostart di systemd diimplementasikan dengan menambahkan ketergantungan buatan dari target boot default ke unit yang dimaksud, jadi "mask" juga melarang autostarting.

Ref .: systemctl (1) .

Lebih lanjut: Lennart Poettering (2011-03-02). "Tiga Tingkat Mati" . systemd untuk Administrator . 0pointer.de.

intelfx
sumber
Tinjauan luar biasa! Lihat juga Cara Menggunakan Systemctl untuk Mengelola Layanan dan Unit Systemd .
Peter Mortensen
6

Pendeknya,

  • disablemembuat unit dinonaktifkan saat boot. Tetapi unit itu dapat dimulai kapan saja setelah boot.

  • maskmenonaktifkan unit sepenuhnya. Itu tidak dapat dimulai tanpa membuka kedok. Itu secara otomatis berarti akan gagal saat boot.

Anwar
sumber
Saya ingin tahu - lakukan maskdan unmaskbekerja untuk Anda? (Saya benar-benar mengerti jika Anda tidak ingin menguji!)
Zanna
1
@Zanna ya. Itu berhasil. Saya sudah diuji sebelumnya diuji lagi sekarang. dengan [email protected]layanan.
Anwar
Hmm saya harus mencari tahu mengapa itu tidak berhasil untuk saya. Saya tahu saya bukan satu-satunya
Zanna
Mungkin berfungsi untuk layanan yang tidak penting. Itu masih baru saya pikir. btw, jawaban Anda lebih informatif. Itu membantu
Anwar