« Назад

 

 

Все, описанные ниже действия, вы делаете на свой страх и риск. Мы не несем ответственности за потерю или повреждение данных.

Оригинал статьи: How To Set Up Software RAID1 On A Running System (Incl. GRUB2 Configuration) (Debian Squeeze)

Исходные данные

Имеем два жестких диска /dev/sda и /dev/sdb, одинакового размера. Диск /dev/sdb — новый, подключенный в систему. Диск /dev/sda имеет слкдующие разделы:

  • /dev/sda1 — раздел /boot, ext4
  • /dev/sda2 — swap
  • /dev/sda3 — раздел /, ext4

 

 Задача — получить RAID1-массив следующего вида:

  • /dev/md0 (состоящий из /dev/sda1 и /dev/sdb1) — раздел /boot, ext4
  • /dev/md1 (состоящий из /dev/sda2 и /dev/sdb2) — раздел подкачки
  • /dev/md2 (состоящий из /dev/sda3 и /dev/sdb3) — раздел /, ext4

 

Установка утилиты mdadm

Для настройки и управления программным RAID-ом в Linux используется утилита mdadm. Установим ее:

#apt-get install initramfs-tools mdadm

 

MD arrays needed for the root file system: all 

 

Загрузим необходимые модули ядра:

#modprobe linear
#modprobe multipath
#modprobe raid0
#modprobe raid1
#modprobe raid5
#modprobe raid6
#modprobe raid10

 

Для того чтобы удостовериться, что все необходимые модули и компоненты установлены, выполним следующую команду:

#cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices:
#

 

Если Вы видите что-то подобное, значит все хорошо.

  Подготовка /dev/sdb

 Оба диска в массиве должны иметь абсолютно одинаковое разбиение. В зависимости от используемого типа таблицы разделов (MBR или GPT) необходимо использовать соответствующие утилиты для копирования таблицы разделов.

Жесткий диск с таблицей разделов MBR

Для жесткого диска с MBR используем утилиту sfdisk:

#sfdisk -d /dev/sda | sfdisk --force /dev/sdb

 

где /dev/sda — диск источник, /dev/sdb — диск назначения.

Удостоверимся, что все верно:

#fdisk -l

Disk /dev/sda: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000b0ecb

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          63      498688   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              63         125      499712   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3             125         653     4242432   83  Linux
Partition 3 does not end on cylinder boundary.

Disk /dev/sdb: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 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   *           1          63      498688   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sdb2              63         125      499712   82  Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sdb3             125         653     4242432   83  Linux
Partition 3 does not end on cylinder boundary.
#

 

 На следующем шаге изменим тип трех разделов жесткого диска /dev/sdb на Linux raid autodetect:

#fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

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):
 t
Partition number (1-4): 1
Hex code (type L to list codes): L

 0  Empty           24  NEC DOS         81  Minix / old Lin bf  Solaris
 1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
 2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
 3  XENIX usr       40  Venix 80286     84  OS/2 hidden C:  c6  DRDOS/sec (FAT-
 4  FAT16  5  Extended        42  SFS             86  NTFS volume set da  Non-FS data
 6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
 7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
 8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
 9  AIX bootable    50  OnTrack DM      93  Amoeba          e1  DOS access
 a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
 b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor
 c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
 e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT
 f  W95 Ext'd (LBA) 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
11  Hidden FAT12    5c  Priam Edisk     a8  Darwin UFS      f1  SpeedStor
12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor
14  Hidden FAT16 16  Hidden FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS
17  Hidden HPFS/NTF 65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
1b  Hidden W95 FAT3 75  PC/IX           bb  Boot Wizard hid fe  LANstep
1c  Hidden W95 FAT3 80  Old Minix       be  Solaris boot    ff  BBT
1e  Hidden W95 FAT1
Hex code (type L to list codes):
 fd
Changed system type of partition 1 to fd (Linux raid autodetect)

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

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):
 w
The partition table has been altered!

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

 

 Жесткий диск с таблицей разделов GPT

Для жесткого диска с GPT используем утилиту sgdisk из GPT fdisk:

#sgdisk -R /dev/sdb /dev/sda
#sgdisk -G /dev/sdb
#sgdisk --randomize-guids --move-second-header /dev/sdb

 

где /dev/sda — диск источник, /dev/sdb — диск назначения. Вторая строка назначает новому жесткому диску случайный UUID.

Проверим, что разделы созданы:

#parted -s /dev/sdb print

 

Изменим тип трех разделов жесткого диска /dev/sdb на raid:

#parted -s /dev/sdb set 1 "raid" on
#parted -s /dev/sdb set 2 "raid" on
#parted -s /dev/sdb set 3 "raid" on

 

где цифры 1,2,3 — номера разделов, полученных предыдущей командой. В результате получаем такую таблицу разделов:

# parted -s /dev/sdb print
Model: ATA ST33000650NS (scsi)
Disk /dev/sdb: 3001GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Number Start End Size File system Name Flags
4 1049kB 2097kB 1049kB bios_grub
1 2097kB 51.5GB 51.5GB raid
2 51.5GB 52.1GB 537MB raid
3 52.1GB 1152GB 1100GB raid
#

 

Очищаем суперблоки RAID на разделах /dev/sdb, в случае если этот диск уже использовался в RAID-массивах:

#mdadm --zero-superblock /dev/sdb1
#mdadm --zero-superblock /dev/sdb2
#mdadm --zero-superblock /dev/sdb3

 

Если жесткий диск новый, будет выдано следующее сообщение:

# mdadm --zero-superblock /dev/sdb1
mdadm: Unrecognised md component device - /dev/sdb1
#

 

В противном случае- никаких сообщений не будет.

Создание RAID-массивов

 

 Создадим три RAID-массива: /dev/md0, /dev/md1, /dev/md2. Раздел /dev/sdb1 будет входить в /dev/md0, /dev/sdb2 в /dev/md1, /dev/sdb3 в /dev/md2. Разделы жесткого диска /dev/sda, на данном этапе, в RAID-массивы включены быть не могут, так как они используются системой. Используем опцию missing при создании массивов:

#mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
#mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
#mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3

 

На вопрос о создании массивов отвечаем утвердительно:

# mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
mdadm: Note: this array has metadata at the start and
    may not be suitable as a boot device.  If you plan to
    store '/boot' on this device please ensure that
    your boot-loader understands md/v1.x metadata, or use
    --metadata=0.90
Continue creating array?
 y
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md2 started.
#
 

 

Используя команду cat /proc/mdstat, просмотрим информацию о массивах:

#cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1]
      4241396 blocks super 1.2 [2/1] [_U]

md1 : active raid1 sdb2[1]
      499700 blocks super 1.2 [2/1] [_U]

md0 : active raid1 sdb1[1]
      498676 blocks super 1.2 [2/1] [_U]

unused devices: 
#

 

[_U] — означает, что массив рассинхронизирован, т.к. отсутствует первый раздел массива (разделы диска /dev/sda). В рабочем, синхронизированном состоянии, квадратные кавычки выглядят так — [UU].

Создадим файловые системы на только что созданных составных дисках /dev/md0 (/boot), /dev/md1 (swap), /dev/md2 (/):

#mkfs.ext4 /dev/md0
#mkswap /dev/md1
#mkfs.ext4 /dev/md2

 

 Запишем информацию о созданных массивах в конфигурационный файл mdadm.conf, предварительно сделав резервную копию:

#cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
#mdadm --examine --scan >> /etc/mdadm/mdadm.conf

 

 Конфигурационный файл примет следующий вид:

# mdadm.conf
#
# Please refer to mdadm.conf(5) for information about this file.
#

# by default, scan all partitions (/proc/partitions) for MD superblocks.
# alternatively, specify devices to scan, using wildcards if desired.
DEVICE partitions

# auto-create devices with Debian standard permissions
CREATE owner=root group=disk mode=0660 auto=yes

# automatically tag new arrays as belonging to the local system
HOMEHOST 

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays

# This file was auto-generated on Tue, 24 May 2011 14:09:09 +0200
# by mkconf 3.1.4-1+8efb9d1
ARRAY /dev/md/0 metadata=1.2 UUID=b40c3165:17089af7:5d5ee79b:8783491b name=server1.example.com:0
ARRAY /dev/md/1 metadata=1.2 UUID=62e4a606:878092a0:212209c5:c91b8fef name=server1.example.com:1
ARRAY /dev/md/2 metadata=1.2 UUID=94e51099:d8475c57:4ff1c60f:9488a09a name=server1.example.com:2

 

Подготовка системы для работы с RAID-массивами

 Подмонтируем /dev/md0 и /dev/md2 в нашу систему (монтировать раздел подкачки- /dev/md1, нет никакого смысла):

#mkdir /mnt/md0
#mkdir /mnt/md2
#mount /dev/md0 /mnt/md0
#mount /dev/md2 /mnt/md2
#mount
/dev/sda3 on / type ext4 (rw,errors=remount-ro)
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
udev on /dev type tmpfs (rw,mode=0755)
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)
/dev/sda1 on /boot type ext4 (rw)
/dev/md0 on /mnt/md0 type ext4 (rw)
/dev/md2 on /mnt/md2 type ext4 (rw)
#

 

Отредактируем файл /etc/fstab — закомментируем  строки, относящиеся к /dev/sda и добавим информацию о массивах:

#vim /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' 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/sda3 during installation
#UUID=e4e38871-0115-477d-94f9-34b079d26248 /               ext4    errors=remount-ro 0       1
/dev/md2 /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
#UUID=7e2fb013-073e-4312-a669-f34b35069bfb /boot           ext4    defaults        0       2
/dev/md0 /boot           ext4    defaults        0       2
# swap was on /dev/sda2 during installation
#UUID=1a5951f8-d0ab-4e0e-b42a-871f81b6fd82 none            swap    sw              0       0
/dev/md1 none            swap    sw              0       0
/dev/scd0       /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

 

Подправим файл /etc/mtab подобным образом:

#vim /etc/mtab
/dev/md2 / ext4 rw,errors=remount-ro 0 0
tmpfs /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
sysfs /sys sysfs rw,noexec,nosuid,nodev 0 0
udev /dev tmpfs rw,mode=0755 0 0
tmpfs /dev/shm tmpfs rw,nosuid,nodev 0 0
devpts /dev/pts devpts rw,noexec,nosuid,gid=5,mode=620 0 0
/dev/md0 /boot ext4 rw 0 0
/dev/md0 /mnt/md0 ext4 rw 0 0
/dev/md2 /mnt/md2 ext4 rw 0 0

 

Пришла очередь настройки загрузчика GRUB2:

#cp /etc/grub.d/40_custom /etc/grub.d/09_swraid1_setup
#vim /etc/grub.d/09_swraid1_setup
#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom menu entries.  Simply type the
# menu entries you want to add after this comment.  Be careful not to change
# the 'exec tail' line above.
menuentry 'Debian GNU/Linux, with Linux 2.6.32-5-amd64' --class debian --class gnu-linux --class gnu --class os {
        insmod raid
        insmod mdraid
        insmod part_msdos
        insmod ext2
        set root='(md/0)'
        echo    'Loading Linux 2.6.32-5-amd64 ...'
        linux   /vmlinuz-2.6.32-5-amd64 root=/dev/md2 ro  quiet
        echo    'Loading initial ramdisk ...'
        initrd  /initrd.img-2.6.32-5-amd64
}

 

Обратите внимание на версию ядра в строках linux и initrd. Если ваша версия ядра отличается — измените их. Проверить версию ядра можно командой:

#uname -r

 

Строка «set root = ‘md/0’» передает загрузчику информацию о том, что загрузка должна осуществляться с массива /dev/md0 (раздел /boot). Теперь у загрузчика нет привязки ни к одному из жестких дисков, установленных в системе. В случае выхода из строя одного из них, система сможет загрузиться.

Так как мы изменили файл /etc/fstab на использование обычных названий устройств вместо их UUID, сообщим об этом загрузчику:

#vim /etc/default/grub
# If you change this file, run 'update-grub' afterwards to update
# /boot/grub/grub.cfg.

GRUB_DEFAULT=0
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
GRUB_CMDLINE_LINUX_DEFAULT="quiet"
GRUB_CMDLINE_LINUX=""

# Uncomment to enable BadRAM filtering, modify to suit your needs
# This works with Linux (no patch required) and with any kernel that obtains
# the memory map information from GRUB (GNU Mach, kernel of FreeBSD ...)
#GRUB_BADRAM="0x01234567,0xfefefefe,0x89abcdef,0xefefefef"

# Uncomment to disable graphical terminal (grub-pc only)
GRUB_TERMINAL=console

# The resolution used on graphical terminal
# note that you can use only modes which your graphic card supports via VBE
# you can see them in real GRUB with the command `vbeinfo'
#GRUB_GFXMODE=640x480

# Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
GRUB_DISABLE_LINUX_UUID=true

# Uncomment to disable generation of recovery mode menu entries
#GRUB_DISABLE_LINUX_RECOVERY="true"

# Uncomment to get a beep at grub start
#GRUB_INIT_TUNE="480 440 1"

 

Обновим загрузчик:

#update-grub

 

Подготовим ramdisk:

#update-initramfs -u 

 

Пришло время перенести систему с диска /dev/sda на составные устройства /dev/mdx. То есть содержимое раздела /dev/sda1 на /dev/md0, а /dev/sda3 на /dev/md2. Напомню, что массивы /dev/md0 и /dev/md2 у нас подмонтированы в /mnt/md0 и /mnt/md2 соответственно. Раздел подкачки переносить не будем.

#cp -dpRx / /mnt/md2
#cd /boot
#cp -dpRx . /mnt/md0

 

Настройка загрузчика GRUB2 (часть 1) 

Установим загрузчик на оба жестких диска:

#grub-install /dev/sda
#grub-install /dev/sdb

 

Проверяем, что загрузка с /dev/md0 возможна:

#shutdown -r now

 

Подготовка диска /dev/sda

После загрузки системы проверяем все ли загрузилось и работает:

# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/md2              4.0G  714M  3.1G  19% /
tmpfs                 249M     0  249M   0% /lib/init/rw
udev                  244M  132K  244M   1% /dev
tmpfs                 249M     0  249M   0% /dev/shm
/dev/md0              472M   25M  423M   6% /boot
# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sdb3[1]
      4241396 blocks super 1.2 [2/1] [_U]

md1 : active (auto-read-only) raid1 sdb2[1]
      499700 blocks super 1.2 [2/1] [_U]

md0 : active raid1 sdb1[1]
      498676 blocks super 1.2 [2/1] [_U]

unused devices: 
#

 

Если видим нечто похожее — все нормально.

Жесткий диск /dev/sda с MBR 

Изменим тип разделов диска /dev/sda на Linux raid autodetect: 

#fdisk /dev/sda

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

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

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

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):
 w
The partition table has been altered!

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

 

Жесткий диск /dev/sda с GPT

Изменим флаг разделов на raid

#parted -s /dev/sda print
#parted -s /dev/sda set 1 "raid" on
#parted -s /dev/sda set 2 "raid" on
#parted -s /dev/sda set 3 "raid" on

 

Добавляем разделы /dev/sda в RAID-массивы:

#mdadm --add /dev/md0 /dev/sda1
#mdadm --add /dev/md1 /dev/sda2
#mdadm --add /dev/md2 /dev/sda3

 

Проверяем, что массивы синхронизируются:

# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[2] sdb3[1]
      4241396 blocks super 1.2 [2/1] [_U]
      [==========>..........]  recovery = 54.6% (2319808/4241396) finish=0.7min speed=45058K/sec

md1 : active raid1 sda2[2] sdb2[1]
      499700 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sda1[2] sdb1[1]
      498676 blocks super 1.2 [2/2] [UU]

unused devices: 
#

 

По окончанию процесса синхронизации увидим следующее:

# cat /proc/mdstat
Personalities : [raid1]
md2 : active raid1 sda3[2] sdb3[1]
      4241396 blocks super 1.2 [2/2] [UU]

md1 : active raid1 sda2[2] sdb2[1]
      499700 blocks super 1.2 [2/2] [UU]

md0 : active raid1 sda1[2] sdb1[1]
      498676 blocks super 1.2 [2/2] [UU]

unused devices: 
#

 

Осталось совсем немного. Подправим файл /etc/mdadm/mdadm.conf, восстановив его предварительно из резервной копии:

#cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
#mdadm --examine --scan >> /etc/mdadm/mdadm.conf

 

Его содержимое станет приблизительно таким:

# automatically tag new arrays as belonging to the local system
HOMEHOST 

# instruct the monitoring daemon where to send mail alerts
MAILADDR root

# definitions of existing MD arrays

# This file was auto-generated on Tue, 24 May 2011 14:09:09 +0200
# by mkconf 3.1.4-1+8efb9d1
ARRAY /dev/md/0 metadata=1.2 UUID=b40c3165:17089af7:5d5ee79b:8783491b name=server1.example.com:0
ARRAY /dev/md/1 metadata=1.2 UUID=62e4a606:878092a0:212209c5:c91b8fef name=server1.example.com:1
ARRAY /dev/md/2 metadata=1.2 UUID=94e51099:d8475c57:4ff1c60f:9488a09a name=server1.example.com:2

 

Настройка загрузчика GRUB2 (часть 2)

Удалим файл /etc/grub.d/09_swraid1_setup:

#rm -f /etc/grub.d/09_swraid1_setup

 

И обновим конфигурацию загрузчика:

#update-grub
#update-initramfs -u

 

Если посмотреть на секцию ### BEGIN /etc/grub.d/10_linux ### файла /boot/grub/grub.cfg, увидим те же данные, что были в /etc/grub.d/09_swraid1_setup.

Обновим загрузчик на обоих жестких дисках:

#grub-install /dev/sda
#grub-install /dev/sdb

 

Перезагрузим систему:

#shutdown -r now

 

Вот собственно и все. Заранее планируйте правильную конфигурацию для своего сервера, чтобы в вашей работе не возникало подобной не безопасной и трудоемкой работы.

 

10 мая, 2013

Если у вас возникли вопросы

СВЯЖИТЕСЬ С НАМИ!

Оставьте свои данные и мы свяжемся
с вами ближайшее время