Cara menggunakan systemd-nspawn untuk memulihkan sistem Linux

Terjemahan artikel disiapkan khusus untuk siswa kursus Administrator Linux .





Kami berurusan dengan kemampuan systemd untuk menjalankan kontainer untuk memulihkan sistem file root dari sistem yang rusak.

Selama sistem GNU / Linux ada, administrator sistem perlu memulihkan dari kerusakan pada sistem file root, perubahan konfigurasi yang tidak disengaja, atau situasi lain yang mencegah sistem memuat ke keadaan "normal".

Biasanya, distribusi Linux menawarkan satu atau lebih opsi menu saat boot (misalnya, dalam menu GRUB) yang dapat digunakan untuk memperbaiki sistem yang rusak; seringkali mereka mem-boot sistem dalam mode pengguna tunggal dengan penutupan sebagian besar layanan sistem. Dalam kasus terburuk, pengguna dapat mengubah baris perintah kernel di bootloader untuk menggunakan shell standar sebagai proses init (PID 1). Metode ini adalah yang paling kompleks dan sarat dengan kesulitan yang dapat menyebabkan hilangnya waktu dan frustrasi, sementara sistem perlu dipulihkan.

Yang paling penting, semua metode ini mengasumsikan bahwa sistem yang rusak memiliki semacam konsol fisik, tetapi di era komputasi awan ini tidak dapat lagi diandalkan. Tanpa konsol fisik, hanya ada beberapa opsi (jika masih tersedia) untuk mempengaruhi proses boot dengan cara ini. Bahkan mesin fisik dapat berubah menjadi perangkat built-in kecil yang tidak memiliki konsol yang mudah digunakan, dan menemukan kabel yang tepat dan adaptor port serial dan mengatur emulator terminal, semuanya untuk menggunakan konsol pada port serial dalam keadaan darurat seringkali cukup rumit.

Ketika sistem lain tersedia (dengan arsitektur yang sama dan konfigurasi yang umumnya serupa), cara umum untuk menyederhanakan proses pemulihan adalah dengan menghapus perangkat penyimpanan dari sistem yang rusak dan menghubungkannya ke sistem kerja sebagai perangkat sekunder. Pada sistem fisik, ini biasanya mudah, dan sebagian besar platform komputasi awan juga dapat mendukung ini, karena mereka memungkinkan Anda untuk me-mount volume root dari instance yang rusak dalam contoh lain.

Setelah sistem file root terhubung ke sistem lain, masalah sistem file korupsi diselesaikan menggunakan fsck dan alat-alat lainnya. Memecahkan masalah kesalahan konfigurasi, paket yang rusak, atau masalah lain bisa lebih sulit karena mereka mengharuskan Anda untuk memasang sistem file dan menemukan serta memodifikasi file atau basis data konfigurasi yang benar.

Menggunakan systemd


Sebelum munculnya systemd, cara untuk memperbaiki konfigurasi dalam praktek adalah mengedit file konfigurasi menggunakan editor teks. Menemukan file yang diperlukan dan memahami isinya adalah tugas terpisah yang berada di luar cakupan artikel ini.

Ketika sistem GNU / Linux menggunakan systemd , banyak perubahan konfigurasi paling baik dilakukan dengan menggunakan alat yang disediakannya - misalnya, mengaktifkan atau menonaktifkan layanan memerlukan membuat atau menghapus tautan simbolis di berbagai tempat. Alat systemctl digunakan untuk membuat perubahan ini, tetapi penggunaannya membutuhkan systemd instance untuk bekerja dan mendengarkan permintaan (melalui D-Bus). Ketika sistem file root dipasang sebagai sistem file tambahan di komputer lain, instans systemd yang berfungsi tidak dapat digunakan untuk melakukan perubahan ini.

Manual start dari systemd dari sistem target juga tidak praktis, karena ia dirancang sebagai proses PID 1 untuk mengontrol semua proses lainnya, yang mungkin bertentangan dengan instance yang sudah berjalan dalam sistem yang digunakan untuk koreksi.

Untungnya, systemd memiliki kemampuan untuk menjalankan kontainer - sistem GNU / Linux yang dienkapsulasi sepenuhnya dengan PID 1 dan lingkungannya sendiri, yang menggunakan berbagai fungsi namespace yang ditawarkan oleh kernel Linux. Tidak seperti alat-alat seperti Docker dan Rocket, systemd tidak memerlukan gambar kontainer untuk menjalankan kontainer; ia dapat menjalankannya dengan hak akses root di mana saja di sistem file yang ada. Ini dilakukan dengan menggunakan alat systemd-nspawn , yang akan membuat ruang nama sistem yang diperlukan dan memulai proses awal dalam wadah dan kemudian menyediakan konsol. Tidak seperti chroot , yang hanya mengubah akar yang terlihat dari sistem file, jenis wadah ini akan memiliki namespace sistem file yang terpisah, sistem file yang sesuai dipasang di / dev , / run dan / proc , serta proses namespace dan IPC yang terpisah. Kunjungi sumber daya systemd-nspawn utama untuk mempelajari lebih lanjut tentang fitur-fiturnya.

Contoh untuk menunjukkan cara kerjanya


Dalam contoh ini, perangkat penyimpanan yang berisi sistem file root dari sistem yang rusak terhubung ke sistem yang sedang berjalan, di mana ia muncul sebagai / dev / vdc . Nama perangkat akan bervariasi tergantung pada 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 yang paling umum (sederhana) menempatkan sistem file root di partisi pertama perangkat, / dev / vdc1 akan digunakan dalam contoh ini. Pastikan untuk mengganti nama perangkat dalam perintah di bawah ini dengan nama perangkat yang benar dari sistem Anda .

Sistem file root yang rusak juga bisa lebih kompleks daripada sistem file terpisah pada perangkat; itu bisa berupa volume dalam LVM atau pada set perangkat yang digabungkan dalam array RAID. Dalam kasus ini, Anda harus menyelesaikan langkah-langkah yang diperlukan untuk membuat dan mengaktifkan perangkat logis yang berisi sistem file sebelum tersedia untuk pemasangan. Sekali lagi, langkah-langkah ini berada di luar cakupan artikel ini.

Persiapan yang diperlukan


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

Menggunakan perintah di bawah ini hampir pasti membutuhkan hak akses root, jadi Anda harus masuk sebagai root, menggunakan sudo untuk mendapatkan shell dengan hak akses root, atau menambahkan awalan sudo ke setiap perintah.

Periksa dan pasang sistem file


Pertama gunakan fsck untuk memeriksa struktur dan isi sistem file target:

$ fsck /dev/vdc1 

Jika ia menemukan masalah dengan sistem file, jawab pertanyaan sesuai untuk memperbaikinya. Jika sistem file rusak parah, itu tidak dapat diperbaiki, dalam hal ini Anda harus mencari cara lain untuk mengekstrak isinya.

Sekarang buat direktori sementara dan pasang sistem file target ke dalamnya:

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

Ketika sistem file dipasang, jalankan wadah dengan itu sebagai sistem file root:

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

Argumen baris perintah untuk memulai wadah:

  • --directory / tmp / target-rescue menyediakan path ke sistem file root kontainer.
  • --boot mencari program inisialisasi yang sesuai di sistem file root dari wadah dan memulainya, meneruskan parameter ke sana dari baris perintah. Dalam contoh ini, sistem target juga menggunakan systemd sebagai PID 1 dari proses, jadi parameter lainnya adalah untuknya. Jika sistem target yang Anda pulihkan menggunakan beberapa alat lain sebagai PID 1 dari proses, Anda perlu mengkonfigurasi pengaturan yang sesuai.
  • - Pisahkan parameter untuk systemd-nspawn dari yang dimaksudkan untuk PID 1 dari proses wadah.
  • --unit rescue.target memberi tahu systemd dalam wadah nama target yang harus dicapainya selama proses boot. Untuk menyederhanakan operasi pemulihan pada sistem target, boot dalam mode "pemulihan", bukan dalam 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 output ini, Anda dapat melihat bahwa systemd mulai sebagai proses init dalam wadah dan menentukan bahwa itu berjalan di dalam wadah sehingga dapat menyesuaikan perilakunya. Untuk membawa wadah ke kondisi kerja, berbagai file unit diluncurkan, kemudian kata sandi root dari sistem target diminta. Anda dapat memasukkan kata sandi root di sini jika Anda ingin meminta shell dengan hak akses root, atau Anda dapat menekan Ctrl + D untuk melanjutkan proses startup, yang akan menampilkan prompt login konsol yang biasa.

Saat Anda membuat perubahan yang diperlukan pada sistem target, tekan Ctrl +] tiga kali berturut-turut; ini akan menutup wadah dan mengembalikan Anda ke cangkang asli. Dari sana, Anda dapat melakukan pembersihan dengan melepas sistem file dari sistem target dan menghapus direktori sementara:

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

Itu saja! Sekarang Anda dapat menghapus perangkat penyimpanan sistem target dan mengembalikannya.

Gagasan menggunakan systemd-nspawn dengan cara ini, terutama opsi --boot , berasal dari pertanyaan yang diposting di StackExchange. Terima kasih kepada Shibumi dan kirbyfan64sos untuk jawaban yang bermanfaat untuk pertanyaan ini!

Sumber Daya Linux Lebih Banyak


Source: https://habr.com/ru/post/id470497/


All Articles