GNU/Linux >> Belajar Linux >  >> Linux

Cara menggunakan systemd-nspawn untuk pemulihan sistem Linux

Selama sistem GNU/Linux telah ada, administrator sistem perlu memulihkan dari kerusakan sistem file root, perubahan konfigurasi yang tidak disengaja, atau situasi lain yang membuat sistem tidak dapat boot ke status "normal".

Distribusi Linux biasanya menawarkan satu atau lebih opsi menu pada saat boot (misalnya, dalam menu GRUB) yang dapat digunakan untuk menyelamatkan sistem yang rusak; biasanya mereka mem-boot sistem ke mode pengguna tunggal dengan sebagian besar layanan sistem dinonaktifkan. Dalam kasus terburuk, pengguna dapat memodifikasi baris perintah kernel di bootloader untuk menggunakan shell standar sebagai proses init (PID 1). Metode ini adalah yang paling kompleks dan penuh dengan komplikasi, yang dapat menyebabkan frustrasi dan kehilangan waktu ketika sistem perlu diselamatkan.

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Yang paling penting, semua metode ini mengasumsikan bahwa sistem yang rusak memiliki semacam konsol fisik, tetapi ini tidak lagi diberikan di zaman komputasi awan. Tanpa konsol fisik, hanya ada sedikit (jika ada) opsi untuk memengaruhi proses boot dengan cara ini. Bahkan mesin fisik mungkin kecil, perangkat tertanam yang tidak menawarkan konsol yang mudah digunakan, dan menemukan kabel dan adaptor port serial yang tepat dan menyiapkan emulator terminal serial, semuanya untuk menggunakan port konsol serial saat menangani darurat, seringkali rumit.

Ketika sistem lain (dengan arsitektur yang sama dan konfigurasi umumnya serupa) tersedia, teknik umum untuk menyederhanakan proses perbaikan adalah mengekstrak perangkat penyimpanan dari sistem yang rusak dan menghubungkannya ke sistem kerja sebagai perangkat sekunder. Dengan sistem fisik, ini biasanya mudah, tetapi sebagian besar platform komputasi awan juga dapat mendukung ini karena memungkinkan volume penyimpanan root dari instance yang rusak untuk dipasang pada instance lain.

Setelah sistem file root dipasang ke sistem lain, mengatasi kerusakan sistem file dapat dilakukan dengan mudah menggunakan fsck dan alat lainnya. Mengatasi kesalahan konfigurasi, paket yang rusak, atau masalah lain dapat menjadi lebih rumit karena memerlukan pemasangan sistem file dan mencari serta mengubah file konfigurasi atau database yang benar.

Menggunakan systemd

Sebelum systemd , mengedit file konfigurasi dengan editor teks adalah cara praktis untuk memperbaiki konfigurasi. Menemukan file yang diperlukan dan memahami isinya mungkin merupakan tantangan tersendiri, yang berada di luar cakupan artikel ini.

Ketika sistem GNU/Linux menggunakan systemd meskipun, banyak perubahan konfigurasi paling baik dilakukan menggunakan alat yang disediakannya—mengaktifkan dan menonaktifkan layanan, misalnya, memerlukan pembuatan atau penghapusan tautan simbolik di berbagai lokasi. systemctl alat digunakan untuk membuat perubahan ini, tetapi menggunakannya memerlukan systemd contoh untuk menjalankan dan mendengarkan (pada D-Bus) untuk permintaan. Saat sistem file root dipasang sebagai sistem file tambahan di komputer lain, systemd yang sedang berjalan instance tidak dapat digunakan untuk membuat perubahan ini.

Meluncurkan systemd sistem target secara manual juga tidak praktis, karena dirancang untuk menjadi proses PID 1 pada sistem dan mengelola semua proses lainnya, yang akan bertentangan dengan instance yang sudah berjalan pada sistem yang digunakan untuk perbaikan.

Untungnya, systemd memiliki kemampuan untuk meluncurkan container, sistem GNU/Linux yang dienkapsulasi sepenuhnya dengan PID 1 mereka sendiri, dan lingkungan yang memanfaatkan berbagai fitur namespace yang ditawarkan oleh kernel Linux. Tidak seperti alat seperti Docker dan Rocket, systemd tidak memerlukan gambar wadah untuk meluncurkan wadah; itu dapat meluncurkan satu yang di-rooting di titik mana pun di sistem file yang ada. Ini dilakukan dengan menggunakan systemd-nspawn alat, yang akan membuat ruang nama sistem yang diperlukan dan meluncurkan proses awal di wadah, lalu menyediakan konsol di wadah. Berbeda dengan chroot , yang hanya mengubah root yang tampak dari sistem file, jenis wadah ini akan memiliki ruang nama sistem file yang terpisah, sistem file yang sesuai dipasang di /dev , /run , dan /proc , dan ruang nama proses dan ruang nama IPC yang terpisah. Lihat systemd-nspawn halaman manual untuk mempelajari lebih lanjut tentang kemampuannya.

Contoh untuk menunjukkan cara kerjanya

Dalam contoh ini, perangkat penyimpanan yang berisi sistem file root sistem yang rusak telah dilampirkan ke sistem yang sedang berjalan, yang muncul sebagai /dev/vdc . Nama perangkat akan bervariasi berdasarkan jumlah perangkat penyimpanan yang ada, jenis perangkat, dan metode yang digunakan untuk menghubungkannya ke sistem. Sistem file root dapat menggunakan seluruh perangkat penyimpanan atau berada di partisi di dalam perangkat; karena konfigurasi (sederhana) yang paling umum menempatkan sistem file root di partisi pertama perangkat, contoh ini akan menggunakan /dev/vdc1. Pastikan untuk mengganti nama perangkat pada perintah di bawah ini dengan nama perangkat yang benar dari sistem Anda.

Sistem file root yang rusak mungkin juga lebih kompleks daripada sistem file tunggal pada perangkat; itu mungkin volume dalam set volume LVM atau pada satu set perangkat yang digabungkan menjadi perangkat RAID perangkat lunak. Dalam kasus ini, langkah-langkah yang diperlukan untuk menyusun dan mengaktifkan perangkat logis yang menyimpan sistem file harus dilakukan sebelum tersedia untuk dipasang. Sekali lagi, langkah-langkah tersebut berada di luar cakupan artikel ini.

Prasyarat

Pertama, pastikan systemd-nspawn alat telah diinstal—sebagian besar distribusi GNU/Linux tidak menginstalnya secara default. Ini disediakan oleh systemd-container paket di sebagian besar distribusi, jadi gunakan manajer paket distribusi Anda untuk menginstal paket itu. Instruksi dalam contoh ini telah diuji menggunakan Debian 9 tetapi seharusnya bekerja dengan cara yang sama pada distribusi GNU/Linux modern.

Menggunakan perintah di bawah ini hampir pasti memerlukan izin root, jadi Anda harus masuk sebagai root, gunakan sudo untuk mendapatkan shell dengan izin root, atau awali setiap perintah dengan sudo .

Verifikasi dan pasang sistem file

Pertama, gunakan fsck untuk memverifikasi struktur dan konten sistem file target:

$ fsck /dev/vdc1

Jika menemukan masalah dengan sistem file, jawab pertanyaan dengan tepat untuk memperbaikinya. Jika sistem file cukup rusak, mungkin tidak dapat diperbaiki, dalam hal ini Anda harus mencari cara lain untuk mengekstrak isinya.

Sekarang, buat direktori sementara dan pasang sistem file target ke direktori itu:

$ mkdir /tmp/target-rescue
$ mount /dev/vdc1 /tmp/target-rescue

Dengan sistem file terpasang, luncurkan wadah dengan sistem file itu sebagai sistem file root:

$ systemd-nspawn --directory /tmp/target-rescue --boot -- --unit rescue.target

Argumen baris perintah untuk meluncurkan wadah adalah:

  • --directory /tmp/target-rescue menyediakan jalur sistem file root container.
  • --boot mencari program init yang sesuai di sistem file root container dan meluncurkannya, meneruskan parameter dari baris perintah ke sana. Dalam contoh ini, sistem target juga menggunakan systemd sebagai proses PID 1-nya, sehingga parameter yang tersisa ditujukan untuknya. Jika sistem target yang Anda perbaiki menggunakan alat lain sebagai proses PID 1-nya, Anda harus menyesuaikan parameternya.
  • -- memisahkan parameter untuk systemd-nspawn dari yang dimaksudkan untuk proses PID 1 penampung.
  • --unit rescue.target memberitahu systemd dalam wadah nama target yang harus dicapai selama proses boot. Untuk menyederhanakan operasi penyelamatan di sistem target, boot ke mode "penyelamatan" daripada ke mode multi-pengguna normal.

Jika semuanya berjalan dengan baik, Anda akan melihat output yang terlihat seperti ini:

Spawning container target-rescue on /tmp/target-rescue.
Press ^] three times within 1s to kill container.
systemd 232 running in system mode. (+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
Detected virtualization systemd-nspawn.
Detected architecture arm.

Welcome to Debian GNU/Linux 9 (Stretch)!

Set hostname to <test>.
Failed to install release agent, ignoring: No such file or directory
[  OK  ] Reached target Swap.
[  OK  ] Listening on Journal Socket (/dev/log).
[  OK  ] Started Dispatch Password Requests to Console Directory Watch.
[  OK  ] Reached target Encrypted Volumes.
[  OK  ] Created slice System Slice.
         Mounting POSIX Message Queue File System...
[  OK  ] Listening on Journal Socket.
         Starting Set the console keyboard layout...
         Starting Restore / save the current clock...
         Starting Journal Service...
         Starting Remount Root and Kernel File Systems...
[  OK  ] Mounted POSIX Message Queue File System.
[  OK  ] Started Journal Service.
[  OK  ] Started Remount Root and Kernel File Systems.
         Starting Flush Journal to Persistent Storage...
[  OK  ] Started Restore / save the current clock.
[  OK  ] Started Flush Journal to Persistent Storage.
[  OK  ] Started Set the console keyboard layout.
[  OK  ] Reached target Local File Systems (Pre).
[  OK  ] Reached target Local File Systems.
         Starting Create Volatile Files and Directories...
[  OK  ] Started Create Volatile Files and Directories.
[  OK  ] Reached target System Time Synchronized.
         Starting Update UTMP about System Boot/Shutdown...
[  OK  ] Started Update UTMP about System Boot/Shutdown.
[  OK  ] Reached target System Initialization.
[  OK  ] Started Rescue Shell.
[  OK  ] Reached target Rescue Mode.
         Starting Update UTMP about System Runlevel Changes...
[  OK  ] Started Update UTMP about System Runlevel Changes.
You are in rescue mode. After logging in, type "journalctl -xb" to view
system logs, "systemctl reboot" to reboot, "systemctl default" or ^D to
boot into default mode.
Give root password for maintenance
(or press Control-D to continue):

Dalam keluaran ini, Anda dapat melihat systemd meluncurkan sebagai proses init dalam wadah dan mendeteksi bahwa itu sedang dijalankan di dalam wadah sehingga dapat menyesuaikan perilakunya dengan tepat. Berbagai file unit mulai membawa wadah ke status yang dapat digunakan, kemudian kata sandi root sistem target diminta. Anda dapat memasukkan kata sandi root di sini jika Anda menginginkan prompt shell dengan izin root, atau Anda dapat menekan Ctrl+D untuk mengizinkan proses startup untuk melanjutkan, yang akan menampilkan prompt login konsol normal.

Setelah Anda menyelesaikan perubahan yang diperlukan pada sistem target, tekan Ctrl+] tiga kali berturut-turut dengan cepat; ini akan menghentikan wadah dan mengembalikan Anda ke shell asli Anda. Dari sana, Anda dapat membersihkan dengan melepas sistem file sistem target dan menghapus direktori sementara:

$ umount /tmp/target-rescue
$ rmdir /tmp/target-rescue

Itu dia! Anda sekarang dapat menghapus perangkat penyimpanan sistem target dan mengembalikannya ke sistem target.

Ide untuk menggunakan systemd-nspawn dengan cara ini, terutama --parameter boot , berasal dari pertanyaan yang diposting di StackExchange. Terima kasih kepada Shibumi dan kirbyfan64sos karena telah memberikan jawaban yang berguna untuk pertanyaan ini!


Linux
  1. Bagaimana saya menggunakan cron di Linux

  2. Cara Memasang dan menggunakan Hashcat untuk pemulihan kata sandi di Linux :[Forensik Cyber]

  3. Linux – Bagaimana Cara Menonaktifkan Bip Sistem Untuk Pengguna yang Tidak Memiliki Hak Istimewa?

  1. Cara menggunakan BusyBox di Linux

  2. Cara menggunakan rsync lanjutan untuk cadangan Linux besar

  3. Cara menggunakan Perintah Su di Linux

  1. Bagaimana saya menggunakan Cockpit untuk manajemen server Linux di rumah saya

  2. Cara Menggunakan htop untuk Memantau Proses Sistem Linux

  3. Cara menggunakan perintah strace dan ltrace di Linux