mdadm, Мигрируем на новые физические диски
Сегодня мы будем переносить mdraid разделы с одних физических дисков на другие. Причём делать это будем на горячую - то есть без остановки работающих приложений.
Что мы имеем:
Ubuntu Linux 9.10
4 физических диска: два старых по 250 Gb и два новых по 500 Gb. Все диски SATA.
На старых дисках размечен совтовый Mdraid по следующей схеме:
- /dev/md0 level=raid1 – бут;
- /dev/md1 level=raid0 – своп;
- /dev/md2 level=raid1 – рут и данные.
Отдельно стоит упомянуть SWAP раздел на нулевой рейде – плохая мысль) Во-первых на нормально функционирующей Linux системе своп использоваться не должен. Во-вторых при неполадках в дисковой системе север необратимо зависает. И того: выигрыш в производительности ни как не используется, за то мы изрядно теряем в стабильности. Сэкономленные в нашем случае 16Gb дискового пространства в рамках SATA дисков выглядят даже не смешно.
Кроме того из старых дисков один уже умер. Swap не работает.
Листинг /dev/sd*:
# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sda6 /dev/sdb /dev/sdc
Как видно из листинга один из старых дисков даже не определяется.
# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda6[0]
238099264 blocks [2/1] [U_]
md1 : inactive sda5[0](S)
5855552 blocks
md0 : active raid1 sda1[0]
240832 blocks [2/1] [U_]
unused devices: <none>
Задачи будет две:
- Перенести md0 и md2 на новые диски
- Пересоздать swap в виде зеркального RAID (raid1). К счастью сделать это будет не сложно. В Swap разделе не храниться важных данных. к тому-же в текущей конфигурации он просто отсутствует. А вот если бы пришлось пере собирать диск с данными- то данные пришлось бы временно перемещать. А сделать это на горячую без LVM вряд ли получиться.
И так, поехали:
1. Нужно создать разделы под рейд на новых дисках:
#fdisk /dev/sdb
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition's system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): n
Command action
e extended
p primary partition (1-4)
1
Invalid partition number for type `1'
Command action
e extended
p primary partition (1-4)
1
Invalid partition number for type `1'
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-60801, default 1): 1
Last cylinder, +cylinders or +size{K,M,G} (1-60801, default 60801): 30
Command (m for help): t
Selected partition 1
Hex code (type L to list codes): L
0 Empty 1e Hidden W95 FAT1 80 Old Minix bf Solaris
1 FAT12 24 NEC DOS 81 Minix / old Lin c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 82 Linux swap / So c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 83 Linux c6 DRDOS/sec (FAT-
4 FAT16 <32M 40 Venix 80286 84 OS/2 hidden C: c7 Syrinx
5 Extended 41 PPC PReP Boot 85 Linux extended da Non-FS data
6 FAT16 42 SFS 86 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set de Dell Utility
8 AIX 4e QNX4.x 2nd part 88 Linux plaintext df BootIt
9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi ee GPT
f W95 Ext'd (LBA) 54 OnTrackDM6 a5 FreeBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a6 OpenBSD f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f4 SpeedStor
14 Hidden FAT16 <3 61 SpeedStor a9 NetBSD f2 DOS secondary
16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
Hex code (type L to list codes): fd
Changed system type of partition 1 to fd (Linux raid autodetect)
Command (m for help): a
Partition number (1-4): 1
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
Не забудем изменить тип диска с Linux на Linux raid autodetect
Команда: «t», Hex код: «fd».
А также добавить бут флаг для загрузочного раздела (если такой имеется).
Ещё, в случае переноса разделов я рекомендую указывать размер диска в цилиндрах, а не в байтах. Так проще создать идентичный раздел. Посмотреть размер можно через «fdisk -l {путь диска}«.
Проделываем тоже самое со вторым диском /dev/sdc
#fdisk /dev/sdс
.
.
.
Разбиваем оставшееся дисковое пространство, чтобы оно было идентично старым дискам. В моем случае это немного не так. Я выделаю дополнительный раздел под своп. В остальном размеры логических дисков идентичны. вот что получилось:
# fdisk -l /dev/sdc
Disk /dev/sdc: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Disk identifier: 0x6f91c38c
Device Boot Start End Blocks Id System
/dev/sdc1 * 1 30 240943+ fd Linux raid autodetect
/dev/sdc2 31 60801 488143057+ 5 Extended
/dev/sdc5 31 2120 16787893+ fd Linux raid autodetect
/dev/sdc6 2121 31762 238099333+ fd Linux raid autodetect
# ls /dev/sd*
/dev/sda /dev/sda1 /dev/sda2 /dev/sda5 /dev/sda6 /dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb5 /dev/sdb6 /dev/sdc /dev/sdc1 /dev/sdc2 /dev/sdc5 /dev/sdc6
PS у меня после записи изменение fdisk выдал ошибку о невозможности заменить таблицу разделов:
WARNING: Re-reading the partition table failed with error 16: Device or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Это произошло потому, что к этому моменту я уже добавил в рейд один из логических дисков.
В этом случае нужно выполнить команду partprobe, и диски сразу появятся в системе.
Теперь нужно добавить эти разделы в md0.
Но для начала не мешает взглянуть на состояние диска через mdadm –detail /dev/md0
# mdadm /dev/md0 --add /dev/sdb1
mdadm: added /dev/sdb1
# mdadm /dev/md0 --add /dev/sdc1
mdadm: added /dev/sdc1
Изменим количество активных дисков для синхронизации, чтобы избавиться от spare дисков.
mdadm --grow -n 3 /dev/md0
mdadm --grow -n 3 /dev/md2
Аналогично с остальными дисками.
Теперь нужно создать раздел под Swap. Я буду делать это через пересоздание md1.
Как видно из листинга своп у меня отсутствует.
# swapon -s
Filename
Убиваем неработающий диск
# mdadm -S /dev/md1
mdadm: stopped /dev/md1
Создаем на его месте новый
# mdadm --create /dev/md1 --level=1 --raid-devices=2 /dev/sdb5 /dev/sdc5
mdadm: array /dev/md1 started.
Создадим файловую систему на новом диске:
# mkswap /dev/md1
Setting up swapspace version 1, size = 16787772 KiB
no label, UUID=33ca1464-316a-4d97-be87-7128758b86c1
Сразу активируем только что созданный SWAP.
# swapon /dev/md1
И проверяем
# swapon -s
Filename Type Size Used Priority
/dev/md1 partition 16787768 58464 -1
Редактируем /etc/fstab
Узнать UUID диска можно через команду blkid.
# /etc/fstab: static file system information.
#
# Use 'vol_id --uuid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
#
proc /proc proc defaults 0 0
# / was on /dev/md2 during installation
UUID=3b3646e2-6865-4e0d-af35-65d938a55fb3 / ext3 relatime,errors=remount-ro 0 1
# /boot was on /dev/md0 during installation
UUID=0bc279df-f2e3-4ad9-b409-ae396eb73f18 /boot ext2 relatime 0 2
# swap was on /dev/md1 during installation
UUID=33ca1464-316a-4d97-be87-7128758b86c1 none swap sw 0 0
/dev/scd0 /media/cdrom0 udf,iso9660 user,noauto,exec,utf8 0 0
В моём случае я пересоздал только раздел для SWAP, поэтому мне пришлось отредактировать только 1 UUID. Если перенос осуществляется без пересоздания разделов, то fstab править не нужно.
Затем берём информацию из mdadm –examine –scan и записываем в /etc/mdadm/mdadm.conf иначе новые md* диски подниматься не будут.
Устанавливаем GRUB на каждый новый диск:
# grub
grub> root (hd1,0)
root (hd1,0)
grub> setup (hd1)
setup (hd1)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd1)"... 17 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd1) (hd1)1+17 p (hd1,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.
grub> root (hd2,0)
root (hd2,0)
grub> setup (hd2)
setup (hd2)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... yes
Checking if "/grub/stage2" exists... yes
Checking if "/grub/e2fs_stage1_5" exists... yes
Running "embed /grub/e2fs_stage1_5 (hd2)"... 17 sectors are embedded.
succeeded
Running "install /grub/stage1 (hd2) (hd2)1+17 p (hd2,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.
Осталось перезагрузить, проверить как это всё работает, а также отключить старые диски.