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

Вопрос или проблема

Сегодня я попробовал это на своей машине с OpenSUSE 12.3 (ядро 3.7):

# resize2fs /dev/mapper/system-srv 2G
resize2fs 1.42.6 (21-Сент-2012)
Файловая система на /dev/mapper/system-srv смонтирована на /srv; требуется изменение размера в режиме онлайн
resize2fs: Уменьшение размера в режиме онлайн не поддерживается

/dev/mapper/system-srv является томом EXT4.

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

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

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

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

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

Пример для 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

# сложный пример устройства
# активировать md-raid, содержащий FS/PV
#/sbin/mdadm -A /dev/md0
# активировать VG, содержащий FS
#/sbin/lvm vgchange -ay vg0
# изменить размер
#/sbin/e2fsck -yf /dev/vg0/root # или /dev/md0
#/sbin/resize2fs /dev/vg0/root 5G
#/sbin/e2fsck -yf /dev/vg0/root

Теперь выполните update-initramfs -u -k kernel-name, чтобы обновить initramfs для ядра kernel-name, которое установлено по умолчанию в вашем загрузчике (grub). В случае сбоя загрузки вы можете загрузиться с другого незатронутого здорового ядра/initramfs. Или вы можете использовать all, чтобы обновить все ядра, но тогда у вас не будет возможности вернуться назад.

Проверьте, чтобы в вашей системе не было инструментов, которые автоматически увеличивают файловую систему. Например, закомментируйте resizefs в /etc/cloud/cloud.cfg и удалите x-systemd.growfs в /etc/fstab.

Перезагрузите. Проверьте размер файловой системы. Удалите скрипты initramfs и снова выполните update-intiramfs -u -k kernel-name.

Теперь вы можете уменьшить подлежащее устройство с помощью parted resizepart / mdadm --grow --size= / lvresize -L. Размер устройства должен быть больше, чем размер файловой системы из скриптов. Самый простой способ избежать ошибок: если планируемый размер устройства – 6G, установите размер fs в скрипте на 5G. После изменения размера файловой системы – измените размер устройства на 6G, затем увеличьте размер файловой системы до максимума в режиме онлайн с помощью resize2fs /dev/sda1. Теперь ваша файловая система идеально помещается в ваше устройство.

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

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

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

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

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

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

Кратко: это решение подразумевает использование pivot_root к tmpfs, чтобы вы могли безопасно отмонтировать свой корневой раздел и поработать с ним. После завершения вы вернетесь к своему новому корневому разделу с помощью pivot_root.

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

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

Ответ или решение

Тема уменьшения (shrink) фрагмента ext4 в LVM (Logical Volume Manager) является достаточно сложной и требует внимательного подхода. Ваша ситуация, основанная на использовании OpenSUSE 12.3 с ядром 3.7, затрагивает ключевые аспекты возможностей файловых систем и управления объемами. Давайте рассмотрим, что можно сделать в этой ситуации.

Возможности уменьшения объемов ext4

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

Почему невозможно уменьшить размер ext4 в онлайне

  1. Нет поддержки онлайн-уменьшения: Основной ограничивающий фактор в данном случае заключается в том, что для уменьшения ext4 необходимо сначала размонтировать файловую систему. В том числе, как указано разработчиком Ted Ts’o, по вопросам поддержки онлайн-уменьшения ext4:

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

  2. Риск потери данных: Уменьшение размера файловой системы, когда она смонтирована, может привести к повреждению данных, поскольку система не может эффективно управлять перемещением и перераспределением данных, что противоречит целостности данных.

Как это сделать безопасно

Использование Initramfs

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

  1. Создание скриптов для initramfs:

    • Создайте исполняемый скрипт в /etc/initramfs-tools/hooks/resizefs, который будет включать команды для проверки и уменьшения размера файловой системы.
    • Создайте скрипт в /etc/initramfs-tools/scripts/local-premount/resizefs, где будет прописана логика для проверки, уменьшения и повторной проверки файловой системы.
  2. Обновление initramfs: После написания скриптов выполните команду update-initramfs -u -k <имя_ядра>.

  3. Перезагрузка: После этого вам нужно перезагрузить систему, где initramfs выполнит ваши команды до монтирования файловой системы.

  4. Изменение логического объема: После уменьшения размера файловой системы с помощью resize2fs, вы можете уменьшить размер логического тома с помощью lvresize.

Уменьшение root-партии без перезагрузки

Хотя прямое уменьшение ext4 в онлайне невозможно, существует метод, позволяющий обойти это ограничение, не перезагружая сервер. Для этого используется метод pivot_root, который позволяет "переопределить" корень файловой системы на временную файловую систему (tmpfs), что позволяет вам отмонтировать корневой раздел и выполнить необходимые действия без простоя системы. Это более рискованный подход, но во многих случаях эффективно решает задачу.

Заключение

В заключение, уменьшение файловой системы ext4 в LVM в онлайновом режиме невозможно, и для его выполнения необходимо размонтировать файловую систему. Однако существуют различные методы и обоснованные подходы, которые позволяют осуществить требуемые манипуляции даже на удаленных серверах. Процесс требует аккуратности и понимания рисков, связанных с целостностью данных. Обязательно осуществляйте резервное копирование всех данных перед проведением подобных операций.

Оцените материал
Добавить комментарий

Капча загружается...