Программный RAID в Linux. Расширение массива






Как известно, дискового пространства много не бывает и, рано или поздно, многие сталкиваются с необходимостью добавления в массив новых дисков. О том, как это делается при использовании драйвера md — в сегодняшней заметке.




Расширение массива, которое можно проводить для всех уровней RAID, кроме нулевого, состоит из двух (трёх для RAID 4/5) этапов: добавления нового устройства, расширения массива (и, для RAID 5/6, расширения файловой системы). Обо всём по порядку.

Добавление нового устройства

Допустим, у нас имеется массив RAID-5 общей ёмкостью 16GiB, состоящий из трёх устройств, ёмкостью по 8 GiB каждое:

#  mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Tue Jan 31 17:23:21 2012
     Raid Level : raid5
     Array Size : 16774144 (16.00 GiB 17.18 GB)
  Used Dev Size : 8387072 (8.00 GiB 8.59 GB)
   Raid Devices : 3
  Total Devices : 3
    Persistence : Superblock is persistent

    Update Time : Tue Jan 31 17:28:43 2012
          State : clean
 Active Devices : 3
Working Devices : 3
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

           Name : debian-test0:0  (local to host debian-test0)
           UUID : a1f02ec1:81276abd:595fe0f9:8c9b3bd0
         Events : 48
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd

и к нему понадобилось добавить новый диск, находящийся за файлом /dev/sde, ёмкостью также 8 GiB. На устройстве /dev/md0 в данный момент у нас расположена файловая система ext4, размеров 16 GiB. Целью добавления нового устройства является увеличение размера файловой системы.

Добавить новое устройство к массиву очень просто:

# mdadm --add /dev/md0 /dev/sde
mdadm: added /dev/sde

Посмотрим на состояние массива:

# mdadm --detail /dev/md0
...
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd
       4       8       64        -      spare   /dev/sde

Как видим, диск /dev/sde добавился как запасной, то есть, он зарезервирован для массива на случай выхода из строя одного из дисков, и не используется. Теперь. когда в массиве есть свободное (неактивное) устройство, можно расширить массив:

# mdadm --grow --raid-devices=4 --backup-file=/root/md0_growing.backup /dev/md0
mdadm: Need to backup 3072K of critical section.

Обратите внимание на опцию --backup-file. Значением этой опции является путь к файлу, в который записываются критически-важные данные, пока массив расширяется. Содержимое этого файла пригодится вам в случае, если вдруг в момент расширения массива процесс будет внезапно прерван отключением питания сервера или чем-то подобным. Логично этот файл сохранять на диске, который не является частью расширяемого массива :)

Посмотрим на состояние массива теперь:

# mdadm --detail /dev/md0
/dev/md0:
        Version : 1.2
  Creation Time : Tue Jan 31 17:23:21 2012
     Raid Level : raid5
     Array Size : 16774144 (16.00 GiB 17.18 GB)
  Used Dev Size : 8387072 (8.00 GiB 8.59 GB)
   Raid Devices : 4
  Total Devices : 4
    Persistence : Superblock is persistent

    Update Time : Tue Jan 31 17:47:10 2012
          State : clean, recovering
 Active Devices : 4
Working Devices : 4
 Failed Devices : 0
  Spare Devices : 0

         Layout : left-symmetric
     Chunk Size : 512K

 Reshape Status : 14% complete
  Delta Devices : 1, (3->4)

           Name : debian-test0:0  (local to host debian-test0)
           UUID : a1f02ec1:81276abd:595fe0f9:8c9b3bd0
         Events : 102
    Number   Major   Minor   RaidDevice State
       0       8       16        0      active sync   /dev/sdb
       1       8       32        1      active sync   /dev/sdc
       3       8       48        2      active sync   /dev/sdd
       4       8       64        3      active sync   /dev/sde

Как видим, ёмкость массива осталась (пока) прежней, количество активных устройств увеличилось, как мы и просили, статус массива сменился на recovering, поскольку драйвер md занялся перестроением массива:

Reshape Status : 14% complete
Delta Devices : 1, (3->4)

После того, как процесс расширения будет завершён, посмотрим на размер массива:

Array Size : 25161216 (24.00 GiB 25.77 GB)

чего мы, собственно, и ожидали. Однако, как обстоят дела с файловой системой?

# mount /dev/md0 /mnt/md0
# df -h /dev/md0
Filesystem            Size  Used Avail Use% Mounted on
/dev/md0               16G  172M   15G   2% /mnt/md0

Как видно, файловая система осталась прежнего размера, поскольку ей ничего неизвестно о наших операциях с массивом.

Расширение файловой системы

Чтобы изменить размер файловой системы ext2/¾, необходимо воспользоваться утилитой resize2fs, которая умеет изменять размер ФС на лету, если у вас ядро >= 2.6. Вызванная без параметров, утилита расширит файловую систему до максимально возможного размера:

# resize2fs /dev/md0
resize2fs 1.41.12 (17-May-2010)
Filesystem at /dev/md0 is mounted on /mnt/md0; on-line resizing required
old desc_blocks = 1, new_desc_blocks = 2
Performing an on-line resize of /dev/md0 to 6290304 (4k) blocks.
The filesystem on /dev/md0 is now 6290304 blocks long.

Умножив 6290304 блока на 4 KiB, получим 25162416 KiB или же 24 GiB, что соответствует размеру массива.

# df -h /dev/md0
Filesystem            Size  Used Avail Use% Mounted on
/dev/md0               24G  172M   23G   1% /mnt/md0