Можно ли безопасно сжать файловую систему ext4 и лежащий в ее основе массив raid5?
Я хотел бы уменьшить свой RAID-массив объемом 15 ТБ / 6 дисков, содержащий файловую систему ext4.
Прежде чем сделать это на живой системе, я решил попробовать в тестовой среде. Я написал скрипт, который имитирует жизненный цикл raid+файловой системы (assemble, mkfs, resize2fs, shrink, ...), но в некоторых случаях он портит файловую систему. Скрипт был запущен на двух разных дистрибутивах (один из них был Centos-8).
Я попытался разобраться в причинах сбоев, и если я ничего не упускаю, mdadm во время процесса сжатия RAID (mdadm --grow) ничего не знает о файловой системе ext4, и, похоже, невозможно заставить этот инструмент работать должным образом.
В моем сценарии скрипт имитирует процесс:
- выбирает случайное числоnum_devices(от 5 до 10) выбирается - это определяет количество устройств в нашем тестовом массиве
- выбирает случайное числоразмер_устройства(от 300 до 350) - размер (в МиБ) одного устройства
- создает и собирает/dev/md0- массив RAID 5 (в моем случае это были метаданные 0,90) - размер массива составляетarray_size=($num_devices-1)*$device_size
- создает файловую систему ext4 на/dev/md0и монтирует его на/мнт
- копирует эталонный файл (в моем случае это был один из образов ядра из /boot)$num_devicesраз в/мнт(чтобы иметь некоторые данные для проверки целостности файловой системы) - в файловой системе доступно около 80% свободного места
файловая система размонтирована, проверена fsck (
e2fsck -f
), затем сжата (либоresize2fs -M
до минимального размера, либоreisze2fs /dev/md0 {calculated_size}
), и проверена fsck сноваскрипт ждет завершения процесса пересборки mdadm (просматривая /proc/mdstat)
- Рассчитывается новый размер массива:новый_размер_массива=($num_devices-2)*$device_size
- Отказ жесткого диска имитируется
mdadm --manage /dev/md0 --fail /dev/loop3
следующим образом:mdadm --manage /dev/md0 --remove /dev/loop3
- ждет завершения процесса изменения формы
После завершения процесса изменения формы /dev/loop3 помечается как удаленное, а другое петлевое устройство (например, /dev/loop2) помечается как резервное.
- процесс определяет запасной элемент и повторно добавляет его в массив (
mdadm --manage /dev/md0 --remove /dev/loop2
за которым следуетmdadm --manage /dev/md0 --add /dev/loop2
) - скрипт ждет завершения перестроения рейда (наблюдая за /proc/mdstat)
В этот момент происходит коррупция:
- файловая система снова смонтирована в /mnt
- Сравнение контрольной суммы md5 между эталонным файлом и копиями в сжатой файловой системе либо успешно, либо неудачно для 1-2 файлов
- Файловая система размонтирована, проверена fsck (
e2fsck -f
), увеличена до максимального размера (resize2fs) и проверена fsck снова - коррупция все еще присутствует
Я что-то делаю не так или процесс сжатия RAID5 действительно не поддерживается? Или причина в метаданных 0.90?