Czy możliwe jest zmniejszenie on-line objętości EXT4 za pomocą LVM?

47

Dzisiaj wypróbowałem to na moim komputerze z OpenSUSE 12.3 (jądro 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 to wolumin EXT4.

Czy to naprawdę nie jest obsługiwane, czy coś mi brakuje?

Alicia
źródło

Odpowiedzi:

68

Jak napisano w komunikacie, możesz rozwijać system plików tylko on-line. Jeśli chcesz go zmniejszyć, najpierw musisz odmontować.

Według opiekuna systemu plików ext4 , Ted Ts'o:

Niestety, kurczenie się on-line nie jest obsługiwane.

Michael Hampton
źródło
12
Szkoda ...
Alicia,
5
O co chodzi z oceną?
Michael Hampton
16
@MichaelHampton - jakiś kretyn strzelający do posłańca? : D
zadzwonić
2
To było 10 lat temu. Czy zostało to już zaimplementowane?
duane
@duane Nie. Nie ma. Prawdopodobnie nigdy też nie będzie.
Michael Hampton
17

Tak, możesz zmniejszyć / przenieść / rozwinąć partycję root bez żadnych restartów (ani livecd, ani usbkey): zapoznaj się z tą odpowiedzią . Jest bardzo dobrze napisany i łatwy do naśladowania, choć dość długi i trochę ryzykowny.

resize2fs nie można zmniejszyć ext4partycji online . Ograniczenie to, zastosowane na partycji głównej, może prowadzić do wniosku, że nie można uniknąć ponownego uruchomienia hosta, aby umożliwić zmniejszenie rootpartycji, czego można uniknąć. Połączony proces pozwoli na umountowanie partycji root bez ponownego uruchamiania. Dlatego w tym świetle zmiana rozmiaru online nie jest ściśle związana ze stanem zamontowanym partycji, pozostaje jednak zmiana rozmiaru online ze względu na status online sieci lub dostępność hosta.

Oczywiście, jeśli chcesz tylko rozbudować partycję ext4, powinieneś trzymać się konwencjonalnych działających resize2fsrozwiązań.

Ogólne rozwiązanie, które podłączyłem, będzie działać na przykład na dowolnym typie rozwiązania dedykowanego lub VPS.

TLDR; Rozwiązanie to zakłada się pivot_root, aby tmpfswięc można umountbezpiecznie twoja partycja na żywo i skrzypce z nim. Po zakończeniu pivot_rootwrócisz do nowej partycji root.

Umożliwia to praktycznie dowolną manipulację w głównym systemie plików (przenieś go, zmień system plików, zmień urządzenie fizyczne ...).

Osobiście korzystałem z tego i działa bardzo dobrze również w systemie Debian, ale przewodnik został początkowo napisany w 2007 roku dla redhat, odpowiedź, którą podłączyłem, została zaktualizowana dla CentOS7. Jest wysoce prawdopodobne, że będzie działać na twoim OpenSUSE, choć prawdopodobnie z pewnymi modyfikacjami.

Vaab
źródło
4
Nie jest to „online” w odniesieniu do porównania z „internetowym wzrostem”. Wszystkie usługi muszą być wyłączone, a główny system plików staje się niedostępny. Być może warto w tym komentarzu skontrastować z podejściem livecd lub initramfs / rdshell. Nienawidzę, gdy ludzie są tym zmieszani.
Brian Chrisman
2
@BrianChrisman To rzeczywiście jest gotcha, która zasługuje na wyjaśnienie i mam nadzieję, że omówiłem edycję w moim poście. Wielkie dzięki za opinie.
vaab
W odnośnym rozwiązaniu podoba mi się to, że jest „prawie online”. Zrobiłem to, kodując mały skrypt i narzędzia w komendzie dracut i uruchomiłem powstałe initramfs z kexec. Gdyby to mogło jakoś utrzymać otwartą sesję ssh podczas całego procesu, byłoby najlepiej. Podejrzewam, że jeśli zbudujesz fałszywego roota z sshd i potrzebnymi plikami, uruchom inny sshd (ponieważ jesteś ssh'd w) na innym porcie, wtedy możesz ssh do drugiego portu i sprawdzić łączność przed kontynuowaniem lobotomizacji systemu.
Brian Chrisman,
13

Jeśli sprawa jest zdalnym serwerem bez konsoli, możesz zmniejszyć system plików przy użyciu initramfs podczas ponownego uruchamiania. Musisz dodać resize2fs do initramfs i uruchomić go przed zamontowaniem roota.

Przykład Debian / Ubuntu:

/ etc / initramfs-tools / hooks / resizefs (plik wykonywalny):

#!/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 / scripts / local-premount / resizefs (plik wykonywalny)

#!/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

Teraz uruchom update-initramfs, uruchom ponownie, sprawdź rozmiar, usuń te skrypty i ponownie zaktualizuj intiramfs.

W przypadku dracut (Fedora, CentOS) użyj tej samej logiki (/usr/lib/dracut/modules.d).

Jest to bardzo przydatne do szyfrowania lub przenoszenia rootfów, ponieważ nie ma wolnego miejsca dla nowej partycji.

urusha
źródło
2
To działa jak urok. Zauważ, że musisz uruchomić update-initramfs z opcją -u.
Diomidis Spinellis
Chłodny. W moim przypadku też musiałem update-grub.
Wojciech Kaczmarek