2020-08-14 mdadm shrink

Материал из YourcmcWiki
Перейти к: навигация, поиск

Пипец, чуть с ума щас не сошёл. Вроде такая простая задача, а протрахался… :)

Дано: mdadm RAID1 (зеркало) из /dev/sda2 и /dev/sdb2, и это rootfs. Надо немного уменьшить разделы на диске. Ну, я думаю — что тут сложного:

  1. Перезагружаемся в initramfs (в Debian опция ядра break=mount), прихватив с собой busybox, resize2fs и sfdisk (и нужные им библиотеки), ну или делаем извращение типа такого, но перезагрузиться проще
  2. Уменьшаем ФС — resize2fs /dev/md0 <SIZE>K
  3. Уменьшаем RAID — mdadm --grow --size=<SIZE> /dev/md0
  4. Останавливаем RAID — mdadm --stop /dev/md0
  5. Меняем размеры разделов sfdisk-ом — sfdisk --dump /dev/sda > sda.txt; vi sda.txt; sfdisk /dev/sda < sda.txt; sfdisk /dev/sdb < sdb.txt — конечно, правильно их рассчитав по mdadm --examine /dev/sda сложением Data Offset + 2*Array Size (он в килобайтах).
  6. Запускаем RAID обратно — mdadm --assemble --scan

И вот на последнем этапе схема даёт сбой:

/ # mdadm --assemble --scan
mdadm: failed to add /dev/sdb2 to /dev/md/0: Invalid argument
mdadm: failed to add /dev/sda2 to /dev/md/0: Invalid argument
mdadm: failed to RUN_ARRAY /dev/md/0: Invalid argument

Причём я априори в курсе, что старые версии суперблока mdadm хранятся в конце раздела и изменение раздела не переживают — но в данном случае версия суперблока изначально 1.2, так что этой проблемы быть не должно.

Разгадка: эта тварь хранит размер каждого устройства в его суперблоке, и отказывается запускаться, когда реальный размер не соответствует сохранённому. Но есть способ его обновить — для этого на последнем этапе надо просто сказать mdadm --assemble -U devicesize /dev/md0 /dev/sda2 /dev/sdb2.

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.