Можно ли в режиме онлайн уменьшить объем EXT4 с помощью LVM?

47

Сегодня я попробовал это на моей машине с OpenSUSE 12.3 (ядро 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 объем EXT4.

Это действительно не поддерживается или я что-то упустил?

Алисия
источник

Ответы:

68

Как говорится в сообщении, вы можете вырастить файловую систему только в режиме онлайн. Если вы хотите уменьшить его, вам нужно сначала отключить его.

По словам сопровождающего файловой системы ext4 Теда Цо:

Извините, сжатие в режиме онлайн не поддерживается.

Майкл Хэмптон
источник
12
Жаль ...
Алисия
5
Что с понижением?
Майкл Хэмптон
16
@MichaelHampton - какой-то придурок стреляет в курьера? : D
Тинк
2
Это было 10 лет назад. Это уже реализовано?
Дуэйн
@ Duane Нет. Это не так. Это вряд ли когда-либо будет.
Майкл Хэмптон
17

Да, вы можете сжать / переместить / увеличить корневой раздел без перезагрузки (ни livecd, ни usbkey): обратитесь к этому ответу . Это очень хорошо написано и легко следовать, хотя довольно долго и немного рискованно.

resize2fs не может сжать онлайн ext4разделы . Это ограничение при применении к корневому разделу может заставить вас думать, что вы не можете избежать перезагрузки хоста, чтобы разрешить сжатие rootраздела, чего вы можете избежать. Связанный процесс позволит вам размонтировать корневой раздел без перезагрузок. Таким образом, с этой точки зрения, это не строго говоря, изменение размера онлайн в отношении смонтированного состояния раздела, однако это остается изменение размера онлайн в отношении сетевого статуса в сети или достижимости хоста.

Конечно, если вы хотите увеличить только раздел ext4, вам следует придерживаться традиционных рабочих resize2fsрешений.

Общее решение, которое я связал, будет работать, например, с любым типом выделенного решения или решения VPS.

TLDR; это решение подразумевает , pivot_rootчтобы tmpfsтаким образом вы можете umountбезопасно корневой раздел жить и возиться с ним. После этого вы pivot_rootвернетесь к своему новому корневому разделу.

Это позволяет практически любые манипуляции с корневой файловой системой (переместить ее, изменить файловую систему, изменить ее физическое устройство ...).

Я лично использовал это, и это очень хорошо работает и в системе Debian, но руководство было изначально написано для Redhat в 2007 году, ответ, который я связал, был обновлен для CentOS7. Весьма вероятно, что он будет работать на вашем OpenSUSE, хотя, вероятно, с некоторой адаптацией.

vaab
источник
4
Это не «онлайн» в сравнении с «онлайн ростом». Все службы должны быть недоступны, и ваша корневая файловая система становится недоступной. Возможно, стоит сравнить это с подходом livecd или initramfs / rdshell в этом комментарии. Я не хотел бы, чтобы люди были смущены этим.
Брайан Крисман
2
@BrianChrisman Это действительно гоча, которая заслуживает разъяснений, и я надеюсь, что я исправил в своем посте. Большое спасибо за отзыв.
Вааб
Что мне нравится в упомянутом решении, так это то, что оно «почти онлайн». Я сделал это, кодируя небольшой скрипт и инструменты в команду dracut, и запустил результирующие initramfs из kexec. Если бы это могло как-то сохранить сессию ssh открытой в процессе, это было бы лучше. Я полагаю, что если вы создадите фальшивый корень с помощью sshd и необходимых файлов, запустите другой sshd (потому что вы ssh'd in) на другом порту, то вы можете подключиться к ssh к другому порту и проверить подключение, прежде чем продолжать лоботомизировать систему.
Брайан Крисман
13

Если дело касается удаленного сервера без консоли, вы можете сжать файловую систему с помощью initramfs при перезагрузке. Вам нужно добавить resize2fs в initramfs и запустить его перед монтированием root.

Пример Debian / Ubuntu:

/ etc / initramfs-tools / hooks / resizefs (исполняемый файл):

#!/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 (исполняемый файл)

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

Теперь запустите update-initramfs, перезагрузите компьютер, проверьте размер, удалите эти сценарии и снова выполните update-intiramfs.

Для dracut (Fedora, CentOS) используйте ту же логику (/usr/lib/dracut/modules.d).

Это очень полезно для шифрования или перемещения rootfs, без свободного места для нового раздела.

Уруша
источник
2
Это работает как шарм. Обратите внимание, что вам нужно запустить update-initramfs с опцией -u.
Диомидис Спинеллис
Здорово. В моем случае мне тоже нужно было update-grub.
Войцех Качмарек