Можно ли безопасно уменьшить программный массив RAID5?

Можно ли безопасно уменьшить программный массив RAID5?

Можно ли безопасно сжать файловую систему ext4 и лежащий в ее основе массив raid5?

Я хотел бы уменьшить свой RAID-массив объемом 15 ТБ / 6 дисков, содержащий файловую систему ext4.

Прежде чем сделать это на живой системе, я решил попробовать в тестовой среде. Я написал скрипт, который имитирует жизненный цикл raid+файловой системы (assemble, mkfs, resize2fs, shrink, ...), но в некоторых случаях он портит файловую систему. Скрипт был запущен на двух разных дистрибутивах (один из них был Centos-8).

Я попытался разобраться в причинах сбоев, и если я ничего не упускаю, mdadm во время процесса сжатия RAID (mdadm --grow) ничего не знает о файловой системе ext4, и, похоже, невозможно заставить этот инструмент работать должным образом.

В моем сценарии скрипт имитирует процесс:

  1. выбирает случайное числоnum_devices(от 5 до 10) выбирается - это определяет количество устройств в нашем тестовом массиве
  2. выбирает случайное числоразмер_устройства(от 300 до 350) - размер (в МиБ) одного устройства
  3. создает и собирает/dev/md0- массив RAID 5 (в моем случае это были метаданные 0,90) - размер массива составляетarray_size=($num_devices-1)*$device_size
  4. создает файловую систему ext4 на/dev/md0и монтирует его на/мнт
  5. копирует эталонный файл (в моем случае это был один из образов ядра из /boot)$num_devicesраз в/мнт(чтобы иметь некоторые данные для проверки целостности файловой системы) - в файловой системе доступно около 80% свободного места
  6. файловая система размонтирована, проверена fsck ( e2fsck -f), затем сжата (либо resize2fs -Mдо минимального размера, либо reisze2fs /dev/md0 {calculated_size}), и проверена fsck снова

  7. скрипт ждет завершения процесса пересборки mdadm (просматривая /proc/mdstat)

  8. Рассчитывается новый размер массива:новый_размер_массива=($num_devices-2)*$device_size
  9. Отказ жесткого диска имитируется mdadm --manage /dev/md0 --fail /dev/loop3следующим образом: mdadm --manage /dev/md0 --remove /dev/loop3
  10. ждет завершения процесса изменения формы

После завершения процесса изменения формы /dev/loop3 помечается как удаленное, а другое петлевое устройство (например, /dev/loop2) помечается как резервное.

  1. процесс определяет запасной элемент и повторно добавляет его в массив ( mdadm --manage /dev/md0 --remove /dev/loop2за которым следует mdadm --manage /dev/md0 --add /dev/loop2)
  2. скрипт ждет завершения перестроения рейда (наблюдая за /proc/mdstat)

В этот момент происходит коррупция:

  1. файловая система снова смонтирована в /mnt
  2. Сравнение контрольной суммы md5 между эталонным файлом и копиями в сжатой файловой системе либо успешно, либо неудачно для 1-2 файлов
  3. Файловая система размонтирована, проверена fsck ( e2fsck -f), увеличена до максимального размера (resize2fs) и проверена fsck снова
  4. коррупция все еще присутствует

Я что-то делаю не так или процесс сжатия RAID5 действительно не поддерживается? Или причина в метаданных 0.90?

Связанный контент