2020-08-14 mdadm shrink
Пипец, чуть с ума щас не сошёл. Вроде такая простая задача, а протрахался… :)
Дано: mdadm RAID1 (зеркало) из /dev/sda2 и /dev/sdb2, и это rootfs. Надо немного уменьшить разделы на диске. Ну, я думаю — что тут сложного:
- Перезагружаемся в initramfs (в Debian опция ядра break=mount), прихватив с собой busybox, resize2fs и sfdisk (и нужные им библиотеки), ну или делаем извращение типа такого, но перезагрузиться проще
- Уменьшаем ФС — resize2fs /dev/md0 <SIZE>K
- Уменьшаем RAID — mdadm --grow --size=<SIZE> /dev/md0
- Останавливаем RAID — mdadm --stop /dev/md0
- Меняем размеры разделов 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 (он в килобайтах).
- Запускаем 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.
[ Хронологический вид ]Комментарии
Войдите, чтобы комментировать.