среда, 16 января 2019 г.

Замена тапок на ходу. Точнее замена системного диска с загрузчиком без перезагрузки сервера.

Всякий раз, проводя миграцию системного диска под AIX, я задумывался, а можно ли на linux  поменять загрузочный диск на лету. Можно, когда понадобилось.
Условимся по исходным данным, должно быть:

  1. Два диска, примем что sda - старый диск а sdb - новый диск. Понятно что sdb не должен быть меньше sda. 
  2. Сервер с загрузчиком UEFI
  3. Использование LVM для системных разделов.

Таблица разделов

Смотрим таблицу разделов на старом диске:
# parted --script /dev/sda unit s \ print
Model: ATA ST1000DM010-2EP1
Disk /dev/sda: 314572800s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 2048s 411647s 409600s fat16 EFI System Partition boot
2 411648s 2508799s 2097152s xfs
3 2508800s 115505151s 112996352s lvm

Видим три партиции: первая - это UEFI, вторая - boot, и третья это lvm партиция, в которой находятся root и swap.
Создаем партиции на новом диске, задавая границы в секторах:
# parted --script /dev/sdb mklabel gpt
# parted --script /dev/sdb mkpart primary fat16 2048s 411647s \ toggle 1 boot
# parted --script /dev/sdb mkpart primary xfs 411648s 2508799s
# parted --script /dev/sdb mkpart primary 2508800s 115505151s

Проверяем, что получилось:
# parted --script /dev/sdb unit s \ print
Model: ATA ST1000DM010-2EP1
Disk /dev/sdb: 314572800s
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:

Number Start End Size File system Name Flags
1 2048s 411647s 409600s primary boot
2 411648s 2508799s 2097152s primary
3 2508800s 115505151s 112996352s primary


Перенос разделов

Переносим разделы UEFI и boot:
# umount /boot/efi/
# umount /boot/
# dd if=/dev/sda1 of=/dev/sdb1
409600+0 records in
409600+0 records out
209715200 bytes (210 MB) copied, 12.0039 s, 17.5 MB/s
# dd if=/dev/sda2 of=/dev/sdb2
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB) copied, 17.7454 s, 60.5 MB/s

Поправим fstab в соответствии с новыми разделами и примонтируем их. В fstab, в данном случае, используется UUID:
# blkid /dev/sdb1
/dev/sdb1: SEC_TYPE="msdos" UUID="DDB7-FB03" TYPE="vfat" PARTLABEL="primary" PARTUUID="e5120b6d-2f2b-4f22-ac60-0c323c0ea290"
# blkid /dev/sdb2
/dev/sdb2: UUID="554bd0c3-c9a9-42a3-a860-2ede07f3a9f4" TYPE="xfs" PARTLABEL="primary" PARTUUID="1a9e1cb5-96b1-4435-a9a6-b75f3f15dea3"
# grep boot /etc/fstab
UUID=554bd0c3-c9a9-42a3-a860-2ede07f3a9f4 /boot xfs defaults 0 0
UUID=DDB7-FB03 /boot/efi vfat umask=0077,shortname=winnt 0 0
# mount -a

Проводим мигацию lvm разделов. Точнее, увеличиваем группу томов (VG) за счет sdb3,  перемещаем экстенты с данными и выводим sda3 из группы:

# vgextend rhel /dev/sdb3
# pvmove -i 3 /dev/sda3
# vgreduce rhel /dev/sda3

Настройка загрузчика UEFFI

Текущее конфигурация:
# efibootmgr -v
BootCurrent: 0000
BootOrder: 0000,0001,0002,0003,0004
Boot0000* Red Hat Enterprise Linux HD(1,GPT,4cedfdcd-b8c3-490b-98ca-3ad3cf915259,0x800,0x64000)/File(\EFI\redhat\shimx64.efi)
Boot0001* EFI Floppy /Pci(0x7,0x0)/
Boot0002* EFI IDE CDROM Drive (IDE 1:0) /Pci(0x7,0x1)/Ata(1,0,0)
Boot0003* EFI Network /Pci(0x16,0x0)/Pci(0x0,0x0)/MAC(005056b748e1,1)
Boot0004* EFI Internal Shell (Unsupported option) MemoryMapped(11,0xe1a2000,0xe42ffff)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)

Первым в списке загрузки используется вариант 0000. Кратенько по формату:
  1. Заголовок, в нашем случае - Red Hat Enterprise Linux
  2. Источник загрузки - HD, т.е. жесткий диск и его определение в скобках. 
Что в скобках: 
  • 1 - номер раздела,
  • GPT - формат таблицы разделов, 
  • 4cedfdcd-b8c3-490b-98ca-3ad3cf915259 - это PARTUUID раздела
  • 0x800 и 0x64000 - начало и размер раздела в LBA адресации.
Добавляем новый вариант загрузки и ставим его первым в списке:
# efibootmgr --create --disk /dev/sdb --part 1 --loader /EFI/redhat/shimx64.efi --label "RHEL" --verbose
BootCurrent: 0000
BootOrder: 0005,0000,0001,0002,0003,0004
Boot0000* Red Hat Enterprise Linux HD(1,GPT,4cedfdcd-b8c3-490b-98ca-3ad3cf915259,0x800,0x64000)/File(\EFI\redhat\shimx64.efi)
Boot0001* EFI Floppy /Pci(0x7,0x0)/
Boot0002* EFI VMware Virtual IDE CDROM Drive (IDE 1:0) /Pci(0x7,0x1)/Ata(1,0,0)
Boot0003* EFI Network /Pci(0x16,0x0)/Pci(0x0,0x0)/MAC(005056b748e1,1)
Boot0004* EFI Internal Shell (Unsupported option) MemoryMapped(11,0xe1a2000,0xe42ffff)/FvFile(c57ad6b7-0515-40a8-9d21-551652854e37)
Boot0005* RHEL HD(1,GPT,e5120b6d-2f2b-4f22-ac60-0c323c0ea290,0x800,0x64000)/File(\EFI\redhat\shimx64.efi)

Все. Можно проверить перезагрузкой и потом удалить старый диск, или сразу удалить старый диск. Учитывая, что добавление\удаление дисков производится онлайн, действительно, замену системного диска можно провести без остановки работы.