Saya merasa perlu mengatur ulang partisi sistem untuk memindahkan data sebelumnya di bawah sistem file root ke titik pemasangan khusus. Semua volume ada di LVM, jadi ini relatif mudah:buat volume baru, pindahkan data ke dalamnya, kecilkan sistem file root, lalu pasang volume baru pada titik yang sesuai.
Masalahnya adalah langkah 3, mengecilkan sistem file root. Sistem file yang terlibat adalah ext4, jadi pengubahan ukuran online didukung; namun, saat dipasang, sistem file hanya dapat dikembangkan. Untuk mengecilkan partisi diperlukan unmount, yang tentu saja tidak mungkin dilakukan untuk partisi root dalam operasi normal.
Jawaban di sekitar Web tampaknya berkisar pada mem-boot LiveCD atau media penyelamat lainnya, melakukan operasi penyusutan, lalu mem-boot kembali ke sistem yang diinstal. Namun, sistem yang dimaksud adalah sistem jarak jauh, dan saya hanya memiliki akses melalui SSH. Saya dapat mem-boot ulang, tetapi mem-boot disk penyelamat dan melakukan operasi dari konsol tidak dimungkinkan.
Bagaimana cara meng-unmount sistem file root sambil mempertahankan akses shell jarak jauh?
Jawaban yang Diterima:
Dalam memecahkan masalah ini, informasi yang diberikan di http://www.ivarch.com/blogs/oss/2007/01/resize-a-live-root-fs-a-howto.shtml sangat penting. Namun, panduan itu untuk versi RHEL yang sangat lama, dan berbagai informasi sudah usang.
Instruksi di bawah ini dibuat untuk bekerja dengan CentOS 7, tetapi instruksi tersebut harus cukup mudah ditransfer ke distro mana pun yang menjalankan systemd. Semua perintah dijalankan sebagai root.
-
Pastikan sistem dalam keadaan stabil
Pastikan tidak ada orang lain yang menggunakannya dan tidak ada hal penting lainnya yang terjadi. Mungkin ada baiknya untuk menghentikan unit penyedia layanan seperti httpd atau ftpd, hanya untuk memastikan koneksi eksternal tidak mengganggu hal-hal di tengah.
systemctl stop httpd systemctl stop nfs-server # and so on....
-
Lepas semua sistem file yang tidak digunakan
umount -a
Ini akan mencetak sejumlah peringatan 'Target sedang sibuk', untuk volume root itu sendiri dan untuk berbagai FS sementara/sistem. Ini dapat diabaikan untuk saat ini. Yang penting adalah tidak ada sistem file pada disk yang tetap terpasang, kecuali sistem file root itu sendiri. Verifikasi ini:
# mount alone provides the info, but column makes it possible to read mount | column -t
Jika Anda melihat ada sistem file di disk yang masih terpasang, berarti ada sesuatu yang masih berjalan yang tidak seharusnya. Periksa apa yang menggunakan
fuser
:# if necessary: yum install psmisc # then: fuser -vm <mountpoint> systemctl stop <whatever> umount -a # repeat as required...
-
Buat root sementara
mkdir /tmp/tmproot mount -t tmpfs none /tmp/tmproot mkdir /tmp/tmproot/{proc,sys,dev,run,usr,var,tmp,oldroot} cp -ax /{bin,etc,mnt,sbin,lib,lib64} /tmp/tmproot/ cp -ax /usr/{bin,sbin,lib,lib64} /tmp/tmproot/usr/ cp -ax /var/{account,empty,lib,local,lock,nis,opt,preserve,run,spool,tmp,yp} /tmp/tmproot/var/
Ini menciptakan sistem root yang sangat minimal, yang merusak (antara lain) tampilan halaman manual (tidak ada
/usr/share
), penyesuaian tingkat pengguna (tanpa/root
atau/home
) Dan seterusnya. Ini disengaja, karena merupakan dorongan untuk tidak tinggal dalam sistem root yang dicurangi 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 merusak pengelola paket. Lihat sekilas semua langkah, dan pastikan Anda memiliki executable yang diperlukan.
-
Putar ke root
mount --make-rprivate / # necessary for pivot_root to work pivot_root /tmp/tmproot /tmp/tmproot/oldroot for i in dev proc sys run; do mount --move /oldroot/$i /$i; done
systemd menyebabkan mount untuk mengizinkan berbagi subtree secara default (seperti dengan
mount --make-shared
), dan ini menyebabkanpivot_root
gagal. Oleh karena itu, kami mematikannya secara global denganmount --make-rprivate /
. Sistem dan sistem file sementara dipindahkan secara grosir ke root baru. Ini diperlukan untuk membuatnya bekerja sama sekali; soket untuk komunikasi dengan systemd, antara lain, tinggal di/run
, jadi tidak ada cara untuk membuat proses yang berjalan menutupnya. -
Pastikan akses jarak jauh selamat dari pergantian
systemctl restart sshd systemctl status sshd
Setelah memulai ulang sshd, pastikan Anda bisa masuk, dengan membuka terminal lain dan menyambungkan ke mesin lagi melalui ssh. Jika tidak bisa, perbaiki masalahnya sebelum melanjutkan.
Setelah Anda memverifikasi, Anda dapat terhubung lagi, keluar dari shell yang sedang Anda gunakan dan sambungkan kembali. Ini memungkinkan
sshd
bercabang yang tersisa untuk keluar dan memastikan yang baru tidak menahan/oldroot
. -
Tutup semua yang masih menggunakan root lama
fuser -vm /oldroot
Ini akan mencetak daftar proses yang masih memegang direktori root lama. Di sistem saya, tampilannya seperti ini:
USER PID ACCESS COMMAND /oldroot: root kernel mount /oldroot root 1 ...e. systemd root 549 ...e. systemd-journal root 563 ...e. lvmetad root 581 f..e. systemd-udevd root 700 F..e. auditd root 723 ...e. NetworkManager root 727 ...e. irqbalance root 730 F..e. tuned root 736 ...e. smartd root 737 F..e. rsyslogd root 741 ...e. abrtd chrony 742 ...e. chronyd root 743 ...e. abrt-watch-log libstoragemgmt 745 ...e. lsmd root 746 ...e. systemd-logind dbus 747 ...e. dbus-daemon root 753 ..ce. atd root 754 ...e. crond root 770 ...e. agetty polkitd 782 ...e. polkitd root 1682 F.ce. master postfix 1714 ..ce. qmgr postfix 12658 ..ce. pickup
Anda perlu menangani setiap proses ini sebelum Anda dapat meng-unmount
/oldroot
. Pendekatan brute-force hanyalahkill $PID
untuk masing-masing, tetapi ini dapat merusak banyak hal. Untuk melakukannya dengan lebih lembut:systemctl | grep running
Ini membuat daftar layanan yang berjalan. Anda seharusnya dapat menghubungkan ini dengan daftar proses yang memegang
/oldroot
, lalu jalankansystemctl restart
untuk masing-masing. Beberapa layanan akan menolak untuk muncul di root sementara dan memasuki status gagal; ini tidak terlalu penting untuk saat ini.Jika root drive yang ingin Anda ubah ukurannya adalah drive LVM, Anda mungkin juga perlu memulai ulang beberapa layanan lain yang sedang berjalan, meskipun layanan tersebut tidak muncul dalam daftar yang dibuat oleh
fuser -vm /oldroot
. Jika Anda tidak dapat mengubah ukuran drive LVM pada Langkah 7, cobasystemctl restart systemd-udevd
.Beberapa proses tidak dapat ditangani melalui
systemctl restart
sederhana . Bagi saya ini termasukauditd
(yang tidak suka dibunuh melaluisystemctl
, dan hanya inginkill -15
). Ini dapat ditangani secara individual.Proses terakhir yang akan Anda temukan, biasanya, adalah
systemd
diri. Untuk ini, jalankansystemctl daemon-reexec
.Setelah selesai, tabel akan terlihat seperti ini:
USER PID ACCESS COMMAND /oldroot: root kernel mount /oldroot
-
Lepas root lama
umount /oldroot
Pada titik ini, Anda dapat melakukan manipulasi apa pun yang Anda butuhkan. Pertanyaan awal membutuhkan
resize2fs
sederhana doa, tetapi Anda dapat melakukan apa pun yang Anda inginkan di sini; satu kasus penggunaan lainnya adalah mentransfer sistem file root dari partisi sederhana ke LVM/RAID/apa pun. -
Putar kembali root
mount <blockdev> /oldroot mount --make-rprivate / # again pivot_root /oldroot /oldroot/tmp/tmproot for i in dev proc sys run; do mount --move /tmp/tmproot/$i /$i; done
Ini adalah pembalikan langsung dari langkah 4.
-
Buang root sementara
Ulangi langkah 5 dan 6, kecuali menggunakan
/tmp/tmproot
sebagai pengganti/oldroot
. Kemudian:umount /tmp/tmproot rmdir /tmp/tmproot
Karena ini adalah tmpfs, pada titik ini akar sementara larut ke dalam eter, tidak akan pernah terlihat lagi.
-
Kembalikan barang ke tempatnya
Pasang sistem file lagi:
mount -a
Pada titik ini, Anda juga harus memperbarui
/etc/fstab
dangrub.cfg
sesuai dengan penyesuaian yang Anda buat selama langkah 7.Mulai ulang semua layanan yang gagal:
systemctl | grep failed systemctl restart <whatever>
Izinkan subpohon yang dibagikan lagi:
mount --make-rshared /
Mulai unit layanan yang dihentikan – Anda dapat menggunakan perintah tunggal ini:
systemctl isolate default.target
Dan selesai.
Terkait:Saya tidak dapat menginstal pusat perangkat lunak di Kali?Terima kasih banyak kepada Andrew Wood, yang mengerjakan evolusi ini di RHEL4, dan steve, yang memberi saya tautan ke yang pertama.