среда, 8 июня 2016 г.

Замена дисков с сохранением информации и расширение ФС в software RAID1

На сервере в software RAID1 установлены 2 диска по 1Тб, задача состоит в том, чтобы заменить эти два диска на диски 2Тб с сохранением всей информации.
Оригинал заметки отсюда.

Исходные данные:
# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sda3[0] sdb3[1]
      967979584 blocks super 1.2 [2/2] [UU]
md0 : active raid1 sda1[0] sdb1[1]
      262080 blocks [2/2] [UU]

# lsblk
NAME    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sdb       8:16   0 931.5G  0 disk  
├─sdb1    8:17   0   256M  0 part  
│ └─md0   9:0    0   256M  0 raid1 /boot
├─sdb2    8:18   0     8G  0 part  
└─sdb3    8:19   0 923.3G  0 part  
  └─md1   9:1    0 923.1G  0 raid1 /
sda       8:0    0 931.5G  0 disk  
├─sda1    8:1    0   256M  0 part  
│ └─md0   9:0    0   256M  0 raid1 /boot
├─sda2    8:2    0     8G  0 part  [SWAP]
└─sda3    8:3    0 923.3G  0 part  
  └─md1   9:1    0 923.1G  0 raid1 /

# df -h
Файловая система                                       Размер Использовано  Дост Использовано% Cмонтировано в
rootfs                                                   909G         713G  150G           83% /
udev                                                      10M            0   10M            0% /dev
tmpfs                                                    390M         256K  390M            1% /run
/dev/disk/by-uuid/0955d7b0-f8ff-4655-9653-93ce744e926a   909G         713G  150G           83% /
tmpfs                                                    5.0M            0  5.0M            0% /run/lock
tmpfs                                                    2.4G            0  2.4G            0% /run/shm
/dev/md0                                                 248M          24M  212M           11% /boot

# fdisk -l /dev/sda /dev/sdb
Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0000519d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      526335      262144   fd  Linux raid autodetect
/dev/sda2          526336    17303551     8388608   82  Linux swap / Solaris
/dev/sda3        17303552  1953525167   968110808   fd  Linux raid autodetect

Disk /dev/sdb: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00049591

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      526335      262144   fd  Linux raid autodetect
/dev/sdb2          526336    17303551     8388608   83  Linux
/dev/sdb3        17303552  1953525167   968110808   fd  Linux raid autodetect

# cat /etc/issue
Debian GNU/Linux 7 \n \l
# apt-cache policy grub2
grub2:
  Установлен: (отсутствует)
  Кандидат:   1.99-27+deb7u2
  Таблица версий:
     1.99-27+deb7u2 0
        500 http://ftp.ru.debian.org/debian/ wheezy/main amd64 Packages

1. GRUB должен быть установлен на обоих дисках (sda/sdb):
# dpkg-reconfigure grub-pc
Installation finished. No error reported.
Installation finished. No error reported.
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-4-amd64
Found initrd image: /boot/initrd.img-3.2.0-4-amd64
Found memtest86+ image: /memtest86+.bin
Found memtest86+ multiboot image: /memtest86+_multiboot.bin
done


Проверяем установился ли GRUB:
# dd if=/dev/sda bs=512 count=1 | xxd | grep -i grub
...
0000180: 4752 5542 2000 4765 6f6d 0048 6172 6420  GRUB .Geom.Hard 
# dd if=/dev/sdb bs=512 count=1 | xxd | grep -i grub
...
0000180: 4752 5542 2000 4765 6f6d 0048 6172 6420  GRUB .Geom.Hard 

После того как загрузчик установлен на оба диска, желательно проверить, что загрузка работает с обоих дисков.

2. Отключаем сервер, пишем в ДЦ, чтобы заменили первый диск. После замены диска включаем сервер.
После включения видим, пустой диск /dev/sda:
# fdisk -l /dev/sda
Disk /dev/sda: 4000.8 GB, 4000787030016 bytes
255 heads, 63 sectors/track, 486401 cylinders, total 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sda doesn't contain a valid partition table
# cat /proc/mdstat
Personalities : [raid1] 
md1 : active raid1 sdb3[1]
      967979584 blocks super 1.2 [2/1] [_U]
md0 : active raid1 sdb1[1]
      262080 blocks [2/1] [_U]
   
3. Переносим таблицу разделов с /dev/sdb на /dev/sda:
# sfdisk -d /dev/sdb | sfdisk --force /dev/sda
# fdisk -l /dev/sda
Disk /dev/sda: 4000.8 GB, 4000787030016 bytes
255 heads, 63 sectors/track, 486401 cylinders, total 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      526335      262144   fd  Linux raid autodetect
/dev/sda2          526336    17303551     8388608   83  Linux
/dev/sda3        17303552  1953525167   968110808   fd  Linux raid autodetect

4. Расширяем раздел /dev/sda3:
# fdisk /dev/sda
...
Command (m for help): d
Partition number (1-4): 3

Command (m for help): n
Partition type:
   p   primary (2 primary, 0 extended, 2 free)
   e   extended
Select (default p): p
Partition number (1-4, default 3): 3
First sector (17303552-4294967295, default 17303552): 
Using default value 17303552
Last sector, +sectors or +size{K,M,G} (17303552-4294967294, default 4294967294): 
Using default value 4294967294

Command (m for help): t
Partition number (1-4): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): p

Disk /dev/sda: 4000.8 GB, 4000787030016 bytes
255 heads, 63 sectors/track, 486401 cylinders, total 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1            2048      526335      262144   fd  Linux raid autodetect
/dev/sda2          526336    17303551     8388608   83  Linux
/dev/sda3        17303552  4294967294  2138831871+  fd  Linux raid autodetect

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

5. Добавляем новые разделы в RAID:
# mdadm --manage /dev/md0 --add /dev/sda1
mdadm: added /dev/sda1
# mdadm --manage /dev/md1 --add /dev/sda3
mdadm: added /dev/sda3

Ждем окончания ребилда:
# watch cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sda3[2] sdb3[1]
      967979584 blocks super 1.2 [2/1] [_U]
      [>....................]  recovery =  0.0% (751104/967979584) finish=193.1min speed=83456K/sec
md0 : active raid1 sda1[0] sdb1[1]
      262080 blocks [2/2] [UU]

6. После того, как прошел ребилд, снова устанавливаем GRUB:
# dpkg-reconfigure grub-pc

Проверка:
# dd if=/dev/sda bs=512 count=1 | xxd | grep -i grub
...
0000180: 4752 5542 2000 4765 6f6d 0048 6172 6420  GRUB .Geom.Hard 
# dd if=/dev/sdb bs=512 count=1 | xxd | grep -i grub
...
0000180: 4752 5542 2000 4765 6f6d 0048 6172 6420  GRUB .Geom.Hard 

7. Перезагружаем, убеждаемся, что система загружается с любого диска.
Если все ок, то можно менять второй диск.

8. Отключаем сервер, просим поменять второй диск, включаем сервер.
Аналогично делаем все и для 2 диска.
Пункт 4 делать не надо, т.к. таблица разделов итак уже такая, какой и должна быть.
# cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sda3[2]
      967979584 blocks super 1.2 [2/1] [U_]
md0 : active raid1 sda1[0]
      262080 blocks [2/1] [U_]
# fdisk -l /dev/sdb
Disk /dev/sdb: 4000.8 GB, 4000787030016 bytes
255 heads, 63 sectors/track, 486401 cylinders, total 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table

# sfdisk -d /dev/sda | sfdisk --force /dev/sdb
# fdisk -l /dev/sda /dev/sdb
Disk /dev/sdb: 4000.8 GB, 4000787030016 bytes
255 heads, 63 sectors/track, 486401 cylinders, total 7814037168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1            2048      526335      262144   fd  Linux raid autodetect
/dev/sdb2          526336    17303551     8388608   83  Linux
/dev/sdb3        17303552  4294967294  2138831871+  fd  Linux raid autodetect

# mdadm --manage /dev/md0 --add /dev/sdb1
mdadm: added /dev/sdb1
# mdadm --manage /dev/md1 --add /dev/sdb3
mdadm: added /dev/sdb3
# watch cat /proc/mdstat 
Personalities : [raid1] 
md1 : active raid1 sdb3[3] sda3[2]
      967979584 blocks super 1.2 [2/1] [U_]
      [>....................]  recovery =  0.0% (929088/967979584) finish=86.7min speed=185817K/sec
md0 : active raid1 sdb1[1] sda1[0]
      262080 blocks [2/2] [UU]
   
После окончания ребилда снова ставим GRUB:
# dpkg-reconfigure grub-pc

Расширяем раздел и делаем ресинк:
# mdadm --grow /dev/md1 --size=max
mdadm: component size of /dev/md1 has been set to 2138700799K

Снова ждем ресинк.
После окончания ресинка осталось только расширить ФС:
# resize2fs /dev/md1

Проверяем что все расширилось как надо:
# df -h

Комментариев нет: