Saya menemukan diri saya perlu mengatur ulang partisi sistem untuk memindahkan data sebelumnya di bawah sistem file root ke titik mount khusus. Volume semuanya ada di LVM, jadi ini relatif mudah: buat volume baru, pindahkan data ke dalamnya, menyusutkan sistem file root, lalu pasang volume baru di titik yang sesuai.
Masalahnya adalah langkah 3, menyusutkan sistem file root. Sistem file yang terlibat adalah ext4, jadi pengubahan ukuran online didukung; namun, ketika di-mount, sistem file hanya bisa ditanam. Untuk mengecilkan partisi diperlukan unmount, yang tentu saja tidak mungkin untuk partisi root dalam operasi normal.
Jawaban di sekitar Web tampaknya berputar di sekitar mem-boot LiveCD atau media penyelamat lainnya, melakukan operasi menyusut, lalu mem-boot kembali ke sistem yang diinstal. Namun, sistem yang dimaksud adalah jarak jauh, dan saya hanya memiliki akses melalui SSH. Saya dapat reboot, tetapi mem-boot disk cadangan dan melakukan operasi dari konsol tidak dimungkinkan.
Bagaimana saya bisa melepas sistem file root dengan tetap mempertahankan akses shell jarak jauh?
pivot_root
ke sana. Contoh di sini dreamlayers.blogspot.co.uk/2012/10/running-linux-from-ram.html - rumit tetapi jika Anda memiliki kotak tes untuk mencobanya, patut dipertimbangkan.Jawaban:
Dalam mengatasi masalah ini, informasi yang disediakan di http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml sangat penting. Namun, panduan itu adalah untuk versi RHEL yang sangat lama, dan berbagai informasi sudah usang.
Instruksi di bawah ini dibuat untuk bekerja dengan CentOS 7, tetapi mereka harus cukup mudah ditransfer ke distro yang menjalankan systemd. Semua perintah dijalankan sebagai root.
Pastikan sistem dalam kondisi stabil
Pastikan tidak ada orang lain yang menggunakannya dan tidak ada hal lain yang penting sedang terjadi. Mungkin ide yang bagus untuk menghentikan unit penyedia layanan seperti httpd atau ftpd, hanya untuk memastikan koneksi eksternal tidak mengganggu hal-hal di tengah.
Lepas semua sistem file yang tidak digunakan
Ini akan mencetak sejumlah peringatan 'Target is busy', untuk volume root itu sendiri dan untuk berbagai FS sementara / sistem. Ini dapat diabaikan untuk saat ini. Yang penting adalah bahwa tidak ada sistem file pada disk yang tetap terpasang, kecuali sistem file root itu sendiri. Verifikasikan ini:
Jika Anda melihat sistem file pada disk masih terpasang, maka sesuatu masih berjalan yang seharusnya tidak. Periksa apa yang digunakan
fuser
:Buat root sementara
Ini menciptakan sistem root yang sangat minimal, yang memecah (antara lain) melihat halaman manual (tidak
/usr/share
), kustomisasi tingkat pengguna (tidak/root
atau/home
) dan sebagainya. Ini disengaja, karena merupakan dorongan untuk tidak tinggal di sistem root seperti juri lebih lama dari yang diperlukan.Pada titik ini, Anda juga harus memastikan bahwa semua perangkat lunak yang diperlukan telah diinstal, karena itu juga akan menghancurkan manajer paket. Lihatlah semua langkah, dan pastikan Anda memiliki executable yang diperlukan.
Putar ke root
systemd menyebabkan mount untuk memungkinkan berbagi subtree secara default (seperti dengan
mount --make-shared
), dan ini menyebabkanpivot_root
gagal. Karenanya, kami mematikannya secara globalmount --make-rprivate /
. Sistem dan sistem file sementara dipindahkan secara grosir ke root baru. Ini diperlukan untuk membuatnya berfungsi sama sekali; soket untuk komunikasi dengan systemd, antara lain, tinggal di/run
dalamnya, dan dengan demikian tidak ada cara untuk membuat proses yang berjalan menutupnya.Pastikan akses jarak jauh selamat dari pergantian tersebut
Setelah memulai kembali sshd, pastikan Anda dapat masuk, dengan membuka terminal lain dan menghubungkan ke mesin lagi melalui ssh. Jika tidak bisa, perbaiki masalah sebelum melanjutkan.
Setelah memverifikasi, Anda dapat terhubung lagi, keluar dari shell yang saat ini Anda gunakan dan sambungkan kembali. Ini memungkinkan garpu yang tersisa
sshd
untuk keluar dan memastikan yang baru tidak tertahan/oldroot
.Tutup semuanya masih menggunakan root yang lama
Ini akan mencetak daftar proses yang masih berpegang pada direktori root yang lama. Di sistem saya, tampilannya seperti ini:
Anda harus berurusan dengan masing-masing dari proses ini sebelum Anda dapat meng-unmount
/oldroot
. Pendekatan brute-force hanyakill $PID
untuk masing-masing, tetapi ini dapat merusak banyak hal. Untuk melakukannya dengan lebih lembut:Ini membuat daftar layanan yang berjalan. Anda harus dapat menghubungkan ini dengan daftar proses yang ada
/oldroot
, kemudian mengeluarkansystemctl restart
untuk masing-masing proses. Beberapa layanan akan menolak untuk muncul di root sementara dan memasuki kondisi gagal; ini tidak terlalu penting untuk saat ini.Jika root drive yang ingin Anda ubah ukurannya adalah drive LVM, Anda mungkin juga perlu me-restart beberapa layanan lain yang berjalan, bahkan jika mereka tidak muncul dalam daftar yang dibuat oleh
fuser -vm /oldroot
. Jika ternyata Anda tidak dapat mengubah ukuran drive LVM pada Langkah 7, cobasystemctl restart systemd-udevd
.Beberapa proses tidak dapat ditangani dengan sederhana
systemctl restart
. Bagi saya ini termasukauditd
(yang tidak suka dibunuh viasystemctl
, dan hanya ingin akill -15
). Ini dapat ditangani secara individual.Proses terakhir yang Anda temukan, biasanya, adalah
systemd
dirinya sendiri. Untuk ini, jalankansystemctl daemon-reexec
.Setelah selesai, tabel akan terlihat seperti ini:
Lepas root yang lama
Pada titik ini, Anda dapat melakukan manipulasi apa pun yang Anda butuhkan. Pertanyaan aslinya membutuhkan
resize2fs
doa sederhana , tetapi Anda dapat melakukan apa pun yang Anda inginkan di sini; satu use case lainnya adalah mentransfer filesystem root dari partisi sederhana ke LVM / RAID / apa pun.Putar kembali root
Ini adalah pembalikan langsung dari langkah 4.
Buang akar sementara
Ulangi langkah 5 dan 6, kecuali menggunakan
/tmp/tmproot
di tempat/oldroot
. Kemudian:Karena ini adalah tmpfs, pada titik ini root sementara larut ke dalam eter, tidak pernah terlihat lagi.
Kembalikan semuanya ke tempatnya masing-masing
Pasang kembali sistem file:
Pada titik ini, Anda juga harus memperbarui
/etc/fstab
dangrub.cfg
sesuai dengan penyesuaian yang Anda buat selama langkah 7.Mulai ulang layanan yang gagal:
Izinkan sub pohon yang dibagikan lagi:
Mulai unit layanan yang dihentikan - Anda dapat menggunakan perintah tunggal ini:
Dan kamu sudah selesai.
Terima kasih banyak kepada Andrew Wood, yang telah mengerjakan evolusi ini di RHEL4, dan steve, yang memberi saya tautan ke yang sebelumnya.
sumber
umount /oldroot/boot
, pada tahap 6). Saya menghubungkan jawaban Anda ke pertanyaan SE lain yang tidak memiliki jawaban atau jawaban negatif.umount /oldroot/boot
sebelum Andaumount /oldroot
mount --move
tmpfs, tetapi itu tidak didukung.telinit u
mungkin melakukan apa yang Anda inginkan./oldroot/tmp
, yang mencegah saya unmount/oldroot
, tetapi tidak munculfuser
atau keluarlsof
. Butuh sedikit menatap systemd untuk mengerjakan yang keluar ...Jika Anda yakin apa yang Anda lakukan - sehingga tidak bereksperimen, Anda dapat menggunakan initrd yang merupakan cara non-interaktif dan cepat.
Pada sistem berbasis Debian di sini adalah caranya.
Lihat kode: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-resizefs.sh
Ada contoh lain: https://github.com/szepeviktor/debian-server-tools/blob/master/debian-convert-ext3-ext4.sh
sumber