GNU/Linux >> Belajar Linux >  >> Cent OS

Centos – Bagaimana Cara Mengecilkan Sistem File Root Tanpa Mem-boot Livecd?

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.

  1. 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....
    
  2. 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...
    
  3. 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.

  4. 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 menyebabkan pivot_root gagal. Oleh karena itu, kami mematikannya secara global dengan mount --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.

  5. 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 .

  6. 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 hanyalah kill $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 jalankan systemctl 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, coba systemctl restart systemd-udevd .

    Beberapa proses tidak dapat ditangani melalui systemctl restart sederhana . Bagi saya ini termasuk auditd (yang tidak suka dibunuh melalui systemctl , dan hanya ingin kill -15 ). Ini dapat ditangani secara individual.

    Proses terakhir yang akan Anda temukan, biasanya, adalah systemd diri. Untuk ini, jalankan systemctl daemon-reexec .

    Setelah selesai, tabel akan terlihat seperti ini:

                 USER        PID ACCESS COMMAND
    /oldroot:    root     kernel mount /oldroot
    
  7. 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.

  8. 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.

  9. 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.

  10. Kembalikan barang ke tempatnya

    Pasang sistem file lagi:

    mount -a
    

    Pada titik ini, Anda juga harus memperbarui /etc/fstab dan grub.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.


Cent OS
  1. Cara Menginstal Habari di CentOS 7

  2. Cara Menginstal Elgg di CentOS 7

  3. Cara mengecilkan sistem file root di CentOS / RHEL 6

  1. Cara Mengatur Ulang Kata Sandi Root Di CentOS 7

  2. Cara Menginstal MariaDB Di CentOS 6

  3. Cara menghapus opsi pemasangan noatime dari titik pemasangan root tanpa reboot (CentOS/RHEL)

  1. Cara Menginstal MariaDB di CentOS 7

  2. Cara Menginstal Moodle di CentOS 7

  3. Cara Menginstal Magento di CentOS 7