Apakah mungkin untuk mengecilkan volume EXT4 secara online dengan LVM?

47

Hari ini saya mencoba ini di komputer saya dengan OpenSUSE 12.3 (kernel 3.7):

# resize2fs /dev/mapper/system-srv 2G
resize2fs 1.42.6 (21-Sep-2012)
Filesystem at /dev/mapper/system-srv is mounted on /srv; on-line resizing required
resize2fs: On-line shrinking not supported

/dev/mapper/system-srv adalah volume EXT4.

Apakah ini benar-benar tidak didukung atau saya kehilangan sesuatu?

Alicia
sumber

Jawaban:

68

Seperti yang dikatakan pesan, Anda hanya dapat mengembangkan sistem file secara online. Jika Anda ingin mengecilkannya, Anda harus melepasnya terlebih dahulu.

Menurut pengelola sistem file ext4 , Ted Ts'o:

Maaf, penyusutan online tidak didukung.

Michael Hampton
sumber
12
Sayang sekali ...
Alicia
5
Ada apa dengan downvote?
Michael Hampton
16
@MichaelHampton - orang bodoh menembak utusan itu? : D
tink
2
Itu 10 tahun yang lalu. Apakah ini sudah diimplementasikan?
duane
@duane No. Tidak. Itu juga tidak mungkin terjadi.
Michael Hampton
17

Ya, Anda dapat mengecilkan / memindahkan / menumbuhkan partisi root tanpa reboot (atau livecd, atau usbkey): lihat jawaban ini . Ini ditulis dengan sangat baik dan mudah diikuti, meskipun cukup panjang dan sedikit berisiko.

resize2fs tidak dapat mengecilkan ext4partisi online . Keterbatasan ini, ketika diterapkan pada partisi root dapat membuat Anda berpikir Anda tidak dapat menghindari me-reboot host untuk memungkinkan menyusutnya rootpartisi, yang mungkin merupakan sesuatu yang ingin Anda hindari. Proses yang tertaut akan memungkinkan Anda untuk melakukan umount partisi root tanpa reboot. Jadi dalam hal ini tidak secara langsung mengubah ukuran online terkait dengan status pemasangan partisi, namun ia tetap mengubah ukuran online terkait status jaringan online atau jangkauan host.

Tentu saja, jika Anda hanya ingin menumbuhkan partisi ext4 Anda, Anda harus tetap berpegang pada resize2fssolusi kerja konvensional .

Solusi umum yang saya tautkan akan bekerja pada semua jenis solusi khusus atau VPS misalnya.

TLDR; solusi ini menyiratkan untuk pivot_rootke tmpfssehingga Anda dapat umountdengan aman partisi root Anda hidup dan biola dengan itu. Setelah selesai, Anda akan pivot_rootkembali ke partisi root baru Anda.

Ini memungkinkan hampir semua manipulasi pada sistem file root (pindahkan, ubah filesystem, ubah perangkat fisiknya ...).

Saya pribadi menggunakan ini, dan ini bekerja sangat baik pada sistem debian juga, tetapi panduan ini awalnya ditulis pada 2007 untuk redhat, jawaban yang saya tautkan diperbarui untuk CentOS7. Sangat mungkin ini akan bekerja pada OpenSUSE Anda, meskipun mungkin dengan beberapa adaptasi.

vaab
sumber
4
Ini bukan 'online' dalam perbandingan dengan 'online grow'. Semua layanan harus turun dan sistem file root Anda menjadi tidak dapat diakses. Mungkin layak untuk membandingkan ini dengan pendekatan livecd atau initramfs / rdshell dalam komentar ini. Aku benci orang bingung dengan ini.
Brian Chrisman
2
@BrianChrisman Ini memang gotcha yang pantas klarifikasi dan saya harap saya sudah meliput dengan mengedit di posting saya. Terima kasih banyak atas umpan baliknya.
vaab
Apa yang saya sukai dari solusi yang direferensikan adalah 'hampir online'. Saya melakukan hal khusus ini dengan menyandikan skrip dan alat kecil ke dalam perintah dracut dan meluncurkan initramf yang dihasilkan dari kexec. Jika ini bisa membuat sesi ssh tetap terbuka melalui prosesnya, itu yang terbaik. Saya kira jika Anda membangun root palsu dengan sshd dan file yang diperlukan, mulai sshd lain (karena Anda ssh akan) pada port lain, maka Anda dapat ssh ke port lain dan memverifikasi konektivitas sebelum melanjutkan melakukan lobotomize sistem.
Brian Chrisman
13

Jika kasing adalah server jarak jauh tanpa konsol, Anda dapat mengecilkan sistem file menggunakan initramfs saat reboot. Anda perlu menambahkan resize2fs ke initramfs dan menjalankannya sebelum memasang root.

Contoh Debian / Ubuntu:

/ etc / initramfs-tools / hooks / resizefs (executable):

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case $1 in
    prereqs)
        prereqs
        exit 0
    ;;
esac

. /usr/share/initramfs-tools/hook-functions

copy_exec /sbin/e2fsck
copy_exec /sbin/resize2fs

exit 0

/ etc / initramfs-tools / script / local-premount / resizefs (dapat dieksekusi)

#!/bin/sh

set -e

PREREQS=""

prereqs() { echo "$PREREQS"; }

case "$1" in
    prereqs)
        prereqs
        exit 0
    ;;
esac

/sbin/e2fsck -yf /dev/sda1
/sbin/resize2fs /dev/sda1 5G
/sbin/e2fsck -yf /dev/sda1

Sekarang jalankan pembaruan-initramfs, reboot, periksa ukuran, hapus skrip ini dan perbarui-intiramfs lagi.

Untuk dracut (Fedora, CentOS) gunakan logika yang sama (/usr/lib/dracut/modules.d).

Ini sangat berguna untuk crypting atau memindahkan rootfs, tanpa ruang kosong yang tersedia untuk partisi baru.

urusha
sumber
2
Ini bekerja seperti pesona. Perhatikan bahwa Anda perlu menjalankan pembaruan-initramfs dengan opsi -u.
Diomidis Spinellis
Keren. Dalam kasus saya, saya juga perlu update-grub.
Wojciech Kaczmarek