воскресенье, 12 декабря 2010 г.

Настройка программного RAID1 на первичных и логических разделах на работающей системе Linux Debian Lenny

Содержание:


Источники
Введение
1. О системе
2. Просмотр дисков
3. Установка пакетов
4. Подготовка второго диска /dev/sdb
5. Создание RAID-массива
6. Подготовка и перенос данных
7. Настройка Grub (часть 1)
8. Подготовка первого диска /dev/sda
9. Настройка Grub (часть 2)
10. Тестирование и решение возможных проблем
11. Восстонавление(копирование) данных новый винчестер, в случае выходно из строя одного из двух работающех дисков массива. [пункт в процессе написания]


Источники:
Руководство Falko Timme и его перевод Андрей Синицын aka boombick . 

Введение

Целью данной статьи являеться практический разбор руководства Falko Timme. Я хотел показать читателю что комманды в руковдсте всё ещё актуальны на 12 декобря 2010 года. Главным отличием являеться разница в разбиение дисков. В отличии от руководства Falko Timme, мы будем строить массиы не только на первычных(Primary) разделах, но также и на логических(Logical) разделах. Также будем использовать файловаю систему reiserfs для разделов /tmp и /var/log.
В конце статьи в разделе "Тестирование" я привел решение проблемы, когда после аварийного выключания питания при загрузке не все массивы строяться верно, т.е. некоторые массивы строяться из одного диска, вместо как положенно двух.

Итак, мы имеем два SATA-диска одного объема, одинаковой модели и из одной партии. Диск sda уже стоиn на машине и работает. Выключаем компьютер и устонавливаем второй винчестер(sdb).


1. О системе

Настройка и испытания проводились 12.12.2010 на тестовой площадке:

Материнская плата:  ASRock, ALiveNF4G-DVI
Процессор:                AMD Sempron(tm) Processor 2800+
Память:                      TakeMS, DDR2 1024 2шт.
Винчестеры:             SAMSUNG, SATA HD080HJ 2шт. (из одной партии, серийные номера отличаются на несколько цифр)

Была установленна свежая система из дестрибутива Debian GNU/Linux 5.0.7, из стабильной на тот момент ветки lenny. Ядро 2.6.26-2-686.

Система Debian 5 stable/lenny:

leopard:~# cat /etc/debian_version                                                                                                           
5.0.7       
leopard:~# uname -a                                                                                                          
Linux leopard 2.6.26-2-686 #1 SMP Thu Nov 25 01:53:57 UTC 2010 i686 GNU/Linux


2. Просмотр дисков 


Просмотрем состояние наших дисков:

leopard:~# df -h


leopard:~# fdisk -l
leopard:~# cat /etc/mtab 




3. Установка пакетов

Теперь устоновим необходимые пакеты.
Установим initramfs-tools для работы с образом ядра (у меня уже был установлен этот пакет):
leopard:~# apt-get install initramfs-tools

Установим пакет mdadm для настройки программного RAID-1. В процессе установки выбираем "all" и жмём OK.


leopard:~# apt-get install mdadm
Чтение списков пакетов... Готово
Построение дерева зависимостей       
Чтение информации о состоянии... Готово
НОВЫЕ пакеты, которые будут установлены:
  mdadm
обновлено 0, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и 0 пакетов не обновлено.
Необходимо скачать 275kБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 799kB.
Получено:1 http://ftp.ua.debian.org lenny/main mdadm 2.6.7.2-3 [275kB]
Получено 275kБ за 0s (381kБ/c)
Предварительная настройка пакетов ...
Выбор ранее не выбранного пакета mdadm.
(Чтение базы данных... на данный момент установлено 22001 файлов и каталогов.)
Распаковывается пакет mdadm (из файла .../mdadm_2.6.7.2-3_i386.deb)...
Обрабатываются триггеры для man-db ...
Настраивается пакет mdadm (2.6.7.2-3) ...
Generating array device nodes... done.
Generating mdadm.conf... done.
update-initramfs: deferring update (trigger activated)
Starting MD monitoring service: mdadm --monitor.                                                
Assembling MD arrays...done (no arrays found in config file or automatically).
Обрабатываются триггеры для initramfs-tools ...                                                    
update-initramfs: Generating /boot/initrd.img-2.6.26-2-686
W: mdadm: /etc/mdadm/mdadm.conf defines no arrays.
W: mdadm: no arrays defined in configuration file



Далее подгрузим модули:
leopard:~# modprobe md
leopard:~# modprobe linear
leopard:~# modprobe multipath
leopard:~# modprobe raid0
leopard:~# modprobe raid1
leopard:~# modprobe raid5
leopard:~# modprobe raid6
leopard:~# modprobe raid10

Проверим подгрузились ли модули:
leopard:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: 


4. Подготовка второго диска /dev/sdb

Оба диска должни иметь одинаковыю таблицу разделов. Для этого скопируем таблицу разделов с диска sda на диск sdb:

leopard:~# sfdisk -d /dev/sda | sfdisk /dev/sdb





























Проверим что имеем одинаковые таблицы разделов на обоих дисках:

leopard:~# sfdisk -d /dev/sda | sfdisk /dev/sdb


На втором диске sdb изменяем тип разделов на Linux raid auto (код fd). Для этого указываем ключи t-type, цифры 1-7 номера разделов, L-list of types, fd-код, w-wright partitions changes.
Красным цветом подсвеченны варианты ответов.

leopard:~# fdisk /dev/sdb

The number of cylinders for this disk is set to 9729.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
   (e.g., DOS FDISK, OS/2 FDISK)

Command (m for help): t
Partition number (1-7): 1
Hex code (type L to list codes): L

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

Command (m for help): t
Partition number (1-7): 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-7): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)

Command (m for help): t
Partition number (1-7): 4
Hex code (type L to list codes): fd
You cannot change a partition into an extended one or vice versa
Delete it first.

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

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

Command (m for help): t
Partition number (1-7): 7
Hex code (type L to list codes): fd
Changed system type of partition 7 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.

Обратите внимание на ошибку при попытке изменить тип раздела 4. Это произошло т.к. раздел 4 расширенный. В расширеном (Extanded) нельзя менять тип файловой системы, поэтому программа fdisk пропустиа этот раздел.

Что бы удостовериться что на диске sdb не было никаких ранее установленных RAID-массивов
выполним команду mdadm --zero-superblock /dev/sdb1:

leopard:~# mdadm --zero-superblock /dev/sdb1
mdadm: Unrecognised md component device - /dev/sdb1  
Строка выше говорит о том что на этом диске на было ранее RAID-массивов. Проделать эту операцию для каждого раздела (от 1-7 в моём случае, раздел 4 можно пропустить так как он расширенный)

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

Будем создавать массивы от /dev/md0 до /dev/md6. Нумерация начинается с цифры 0.
Раздел /dev/sdb1 добавим в массив /dev/md0,  /dev/sdb2 -->  /dev/md1 и так далее, расширенный раздел (4) пропускаем,либо можем попробовать, но mdadm выдаст ошибку. Разделы на первом диске мы пока не трогаем, т.к. с него загружена система. Поэтому при создании массива на месте первого диска sda мы будем использовать указатель missing.

Схема:
/dev/md0       -> /dev/sdb1    /boot      Primary     ext3
/dev/md1       -> /dev/sdb2    swap      Primary      swap
/dev/md2       -> /dev/sdb3    /             Primary      ext3
пропускаем      /dev/sdb4                   Extendet      
/dev/md3       -> /dev/sdb5    /var         Logical      ext3
/dev/md4       -> /dev/sdb6    /var/log    Logical     reiserfs
/dev/md5       -> /dev/sdb7    /tmp        Logical      reiserfs



Создаём массивы:


leopard:~# mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm: /dev/sdb1 appears to contain an ext2fs file system
    size=979932K  mtime=Fri Nov 12 10:27:13 2010
Continue creating array? yes  
mdadm: array /dev/md0 started.
(Система предупреждает что диск не пуст и на нём обнаруженна файловая система, пишем "yes")
leopard:~# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
mdadm: array /dev/md1 started.
leopard:~# mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3
mdadm: array /dev/md2 started.
leopard:~# mdadm --create /dev/md3 --level=1 --raid-disks=2 missing /dev/sdb5
mdadm: array /dev/md3 started.
leopard:~# mdadm --create /dev/md4 --level=1 --raid-disks=2 missing /dev/sdb6
mdadm: array /dev/md4 started.
leopard:~# mdadm --create /dev/md5 --level=1 --raid-disks=2 missing /dev/sdb7
mdadm: array /dev/md5 started.



Проверяем состояние массива. Мы видим что у нас 6 поврежденных массивов. Символы [_U] говорят о том что первое устройство повреждено. Когда массив исправен то символ [UU].

leopard:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10] 
md5 : active (auto-read-only) raid1 sdb7[1]
      3927744 blocks [2/1] [_U]
      
md4 : active (auto-read-only) raid1 sdb6[1]
      4883648 blocks [2/1] [_U]
      
md3 : active (auto-read-only) raid1 sdb5[1]
      55568704 blocks [2/1] [_U]
      
md2 : active (auto-read-only) raid1 sdb3[1]
      9767424 blocks [2/1] [_U]
      
md1 : active (auto-read-only) raid1 sdb2[1]
      3903680 blocks [2/1] [_U]
      
md0 : active (auto-read-only) raid1 sdb1[1]
      96256 blocks [2/1] [_U]
      
unused devices:



Запись (auto-read-only) говорит о том что на это устройство пока ничего не писалось, при следующей перезагрузке когда на него начнет писаться информация, массив автоматически перейдет в состояние right-wright. По видимому это особенность ядра 2.6 так что нечего бояться. Ссылке по этому вопросу приведены ниже:
http://realtechtalk.com/mdadm_autoreadonly_Linux_Software_RAID_solution-1010-articles


Создаём файловые системы на массивах:

/dev/md0           ext3          /boot
/dev/md1           swap        подкачка
/dev/md2           ext3          /
/dev/md3           ext3          /var
/dev/md4           reiserfs     /var/log
/dev/md5           reiserfs     /tmp

Для раздела /boot используем ext3:


leopard:~# mkfs.ext3 /dev/md0
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
24096 inodes, 96256 blocks
4812 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67371008
12 block groups
8192 blocks per group, 8192 fragments per group
2008 inodes per group
Superblock backups stored on blocks: 
        8193, 24577, 40961, 57345, 73729
Writing inode tables: done                            
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.


Подкачка swap:


leopard:~# mkswap /dev/md1
Setting up swapspace version 1, size = 3997364 kB
no label, UUID=cf645ecb-76b6-4ba9-9de6-81171fd1097d


Корневая файловая система /, также используем ext3: 


leopard:~# mkfs.ext3 /dev/md2
mke2fs 1.41.3 (12-Oct-2008)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
610800 inodes, 2441856 blocks
122092 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2503999488
75 block groups
32768 blocks per group, 32768 fragments per group
8144 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 39 mounts or
180 days, whichever comes first.  Use tune2fs -c or -i to override.


Раздел /var, используем ext3:



leopard:~# mkfs.ext3 /dev/md3
mke2fs 1.41.3 (12-Oct-2008) Filesystem label= OS type: Linux Block size=4096 (log=2) Fragment size=4096 (log=2) 3473408 inodes, 13892176 blocks 694608 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=0 424 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624, 11239424 Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done This filesystem will be automatically checked every 38 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override.


Раздел /var/log используем reiserfs:


leopard:~# mkfs.reiserfs /dev/md4
mkfs.reiserfs 3.6.19 (2003 www.namesys.com)
Guessing about desired format.. Kernel 2.6.26-2-686 is running. Format 3.6 with standard journal Count of blocks on the device: 1220912 Number of blocks consumed by mkreiserfs formatting process: 8249 Blocksize: 4096 Hash function used to sort names: "r5" Journal Size 8193 blocks (first block 18) Journal Max transaction length 1024 inode generation number: 0 UUID: 7cd70dc6-fc16-431b-832f-e94dffd57078 ATTENTION: YOU SHOULD REBOOT AFTER FDISK! ALL DATA WILL BE LOST ON '/dev/md4'! Continue (y/n):y Initializing journal - 0%....20%....40%....60%....80%....100% Syncing..ok Tell your friends to use a kernel based on 2.4.18 or later, and especially not a kernel based on 2.4.9, when you use reiserFS. Have fun. ReiserFS is successfully created on /dev/md4.



Раздел /tmp используем reiserfs:


leopard:~# mkfs.reiserfs /dev/md5 mkfs.reiserfs 3.6.19 (2003 www.namesys.com) Guessing about desired format.. Kernel 2.6.26-2-686 is running. Format 3.6 with standard journal Count of blocks on the device: 981936 Number of blocks consumed by mkreiserfs formatting process: 8241 Blocksize: 4096 Hash function used to sort names: "r5" Journal Size 8193 blocks (first block 18) Journal Max transaction length 1024 inode generation number: 0 UUID: 02c2e0cb-3b83-44e0-aa1d-a31a9b290558 ATTENTION: YOU SHOULD REBOOT AFTER FDISK! ALL DATA WILL BE LOST ON '/dev/md5'! Continue (y/n):y Initializing journal - 0%....20%....40%....60%....80%....100% Syncing..ok Tell your friends to use a kernel based on 2.4.18 or later, and especially not a kernel based on 2.4.9, when you use reiserFS. Have fun. ReiserFS is successfully created on /dev/md5.



Теперь отредактируем конфигурационный файл /etc/mdadm/mdadm.conf, предварительно его сохранив. Внизу в строках указанна информация о наших массивах.

leopard:~# cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig leopard:~# mdadm --examine --scan >> /etc/mdadm/mdadm.conf leopard:~# cat /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 Sun, 12 Dec 2010 19:33:21 +0200 # by mkconf $Id$ ARRAY /dev/md0 level=raid1 num-devices=2 UUID=be541299:39e2f0d2:84d43804:33b41315 ARRAY /dev/md1 level=raid1 num-devices=2 UUID=94343e1b:0072922f:84d43804:33b41315 ARRAY /dev/md2 level=raid1 num-devices=2 UUID=1e718bdf:ee27bf42:84d43804:33b41315 ARRAY /dev/md3 level=raid1 num-devices=2 UUID=7f519a51:9491b619:84d43804:33b41315 ARRAY /dev/md4 level=raid1 num-devices=2 UUID=d6317c02:6e989277:84d43804:33b41315 ARRAY /dev/md5 level=raid1 num-devices=2 UUID=63c93027:f0b5b493:84d43804:33b41315



6. Подготовка и перенос данных

Смонтируем наши массивы, все кроме swap, предворительно создав точки монтирования:

leopard:~# mkdir /mnt/md0
leopard:~# mkdir /mnt/md2
leopard:~# mkdir /mnt/md3
leopard:~# mkdir /mnt/md4
leopard:~# mkdir /mnt/md5
leopard:~# mount /dev/md0 /mnt/md0
leopard:~# mount /dev/md2 /mnt/md2
leopard:~# mount /dev/md3 /mnt/md3
leopard:~# mount /dev/md4 /mnt/md4
leopard:~# mount /dev/md5 /mnt/md5

Проверим:

leopard:~# cat /etc/mtab 
/dev/sda3 / ext3 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
procbususb /proc/bus/usb usbfs rw 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/sda1 /boot ext3 rw 0 0
/dev/sda7 /tmp reiserfs rw,nosuid,nodev 0 0
/dev/sda5 /var ext3 rw 0 0
/dev/sda6 /var/log reiserfs rw,noexec,nosuid,nodev 0 0
/dev/md0 /mnt/md0 ext3 rw 0 0
/dev/md3 /mnt/md3 ext3 rw 0 0
/dev/md4 /mnt/md4 reiserfs rw 0 0
/dev/md2 /mnt/md2 ext3 rw 0 0
/dev/md5 /mnt/md5 reiserfs rw 0 0

Теперь необходимо отредактировать файлы /etc/fstab и /etc/mtab заменив в них /dev/sda1  на /dev/md0 по схеме:

/dev/md0      ->  /dev/sda1      /boot
/dev/md1      ->  /dev/sda2      подкачка
/dev/md2      ->  /dev/sda3      /   
/dev/md3      ->  /dev/sda5      /var
/dev/md4      ->  /dev/sda6      /var/log
/dev/md5      ->  /dev/sda7      /tmp


Файлы должны быть приведены к следующему виду, красным выделены изменения:



leopard:~# cat /etc/fstab                                                                                                
# /etc/fstab: static file system information.                                                                                
#                                                                                                                            
                                                                  
proc            /proc           proc    defaults        0       0                                                            
/dev/md2       /               ext3    errors=remount-ro 0       1                                                           
/dev/md0       /boot           ext3    defaults        0       2
/dev/md5       /tmp            reiserfs nodev,nosuid    0       2
/dev/md3       /var            ext3    defaults        0       2
/dev/md4       /var/log        reiserfs nodev,nosuid,noexec 0       2
/dev/md1       none            swap    sw              0       0
/dev/hdd        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0
leopard:~# cat /etc/mtab
/dev/md2 / ext3 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
procbususb /proc/bus/usb usbfs rw 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 ext3 rw 0 0
/dev/md5 /tmp reiserfs rw,nosuid,nodev 0 0
/dev/md3 /var ext3 rw 0 0
/dev/md4 /var/log reiserfs rw,noexec,nosuid,nodev 0 0




Откройте файл /boot/grub/menu.lst и добавьте опцию fallback сразу после default
[...]
default         0
fallback        1
[...]
Это значит, что если первое ядро (нумерация начинается с нуля) не сможет загрузиться, то будет загружено следующее в списке.
В конце этого файла расположены блоки, описывающие параметры ядер для загрузки. Скопируйте первый блок, замените в копии root=/dev/sda3 на root=/dev/md2 и root (hd0,0) на root (hd1,0), после чего поставьте полученный блок первым в списке. 

В первом блоке в строке title в конце строки допишите RAID (hd1). 
После редактирования файл должен выглядеть примерно так:


leopard:~# nano /boot/grub/menu.lst
[...]
## default num
# Set the default entry to the entry number NUM. Numbering starts from 0, and
# the entry number 0 is the default if the command is not used.
#
# You can specify 'saved' instead of a number. In this case, the default entry
# is the entry saved with the command 'savedefault'.
# WARNING: If you are using dmraid do not change this entry to 'saved' or your
# array will desync and will not let you boot your system.
default         0
#### fallback has been added by me
fallback        1
[...]
[...]
## ## End Default Options ##
title           Debian GNU/Linux, kernel 2.6.26-2-686 RAID (hd1) 
root            (hd1,0)
kernel          /vmlinuz-2.6.26-2-686 root=/dev/md2 ro quiet
initrd          /initrd.img-2.6.26-2-686
title           Debian GNU/Linux, kernel 2.6.26-2-686
root            (hd0,0)
kernel          /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro quiet
initrd          /initrd.img-2.6.26-2-686
title           Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
root            (hd0,0)
kernel          /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro single
initrd          /initrd.img-2.6.26-2-686
### END DEBIAN AUTOMAGIC KERNELS LIST




Обновим RAM-диск:
leopard:~# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-2.6.26-2-686

Копируем данные с sda на sdb:

Сначала проверим перед копированием что у нас есть на /mnt/md2/
leopard:~# ls -l /mnt/md2/
итого 16
drwx------ 2 root root 16384 Дек 12 22:21 lost+found

Теперь копируем из корня /  диска sda в котором щас находимся на массив /mnt/md2:
leopard:~# cp -dpRx / /mnt/md2

Проверяем что у нас появилось в /mnt/md2, можем также сравнить что у нас в родном / на sda:
leopard:~# ls -l /mnt/md2/
итого 88

По аналогии поступаем с остальными массивами, копируем и проверяем содержимое:
leopard:~# cd /boot
leopard:/boot# cp -dpRx . /mnt/md0
leopard:/boot# ls -l /mnt/md0


leopard:~# cd /var
leopard:/var# cp -dpRx . /mnt/md3
leopard:/var# ls -l /mnt/md3


leopard:~# cd /var/log
leopard:/var/log# cp -dpRx . /mnt/md4
leopard:/var/log# ls -l /mnt/md4

Если папка /tmp пуста, можно из неё ничего не копировать.



7. Настройка Grub (часть 1)

Устанавливаем загрузчик на второй диск. Запускаем grub и выполняем команды в его оболочке:

leopard:/tmp# grub
Probing devices to guess BIOS drives. This may take a long time.
    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
       [ Minimal BASH-like line editing is supported.   For
         the   first   word,  TAB  lists  possible  command
         completions.  Anywhere else TAB lists the possible
         completions of a device/filename. ]
grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
 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 (hd0)"...  17 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+17 p (hd0,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.
grub> root (hd1,0)
 Filesystem type is ext2fs, partition type 0xfd
grub> 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> quit


Перезагружаем систему:
leopard:~# reboot


Теперь система должна загрузиться с нашего RAID-массива. При перезагрузки в меню grub будут предложенны  три варианта загрузки. Выбираем 1-ый, с массива md2, т.е. со второго винчестера, что нам и нужно. Остальные нам не интересны 2-ой с диска sda, и 3-ий с диска sda в singl mode.


8. Подготовка первого диска /dev/sda

Проверяем с какого диска  загрузились, если все прошло удачно тот видим /dev/md2 и т.д.:
leopard:~# df -h
Файловая система      Разм  Исп  Дост  Исп% смонтированна на
/dev/md2              9,2G  492M  8,3G   6% /
tmpfs                 982M     0  982M   0% /lib/init/rw
udev                   10M  688K  9,4M   7% /dev
tmpfs                 982M     0  982M   0% /dev/shm
/dev/md0               92M   21M   67M  24% /boot
/dev/md5              3,8G   33M  3,8G   1% /tmp
/dev/md3               53G  340M   50G   1% /var
/dev/md4              4,7G   35M  4,7G   1% /var/log

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


leopard:~# cat /proc/mdstat                                                                                   
Personalities : [raid1] 
md5 : active raid1 sdb7[1]
      3927744 blocks [2/1] [_U]
      
md4 : active raid1 sdb6[1]
      4883648 blocks [2/1] [_U]
      
md3 : active raid1 sdb5[1]
      55568704 blocks [2/1] [_U]
      
md2 : active raid1 sdb3[1]
      9767424 blocks [2/1] [_U]
      
md1 : active (auto-read-only) raid1 sdb2[1]
      3903680 blocks [2/1] [_U]
      
md0 : active raid1 sdb1[1]
      96256 blocks [2/1] [_U]
      
unused devices:

Теперь необходимо поменять тип разделов на диске /dev/sda на Linux raid autodetect таким же образом, как мы это делали ранее с диском /dev/sdb:

leopard:/home/vitaliy# fdisk /dev/sda
Command (m for help): t
Partition number (1-7): 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-7): 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-7): 3
Hex code (type L to list codes): fd
Changed system type of partition 3 to fd (Linux raid autodetect)
Command (m for help): t
Partition number (1-7): 4
Hex code (type L to list codes): fd
You cannot change a partition into an extended one or vice versa
Delete it first.
Command (m for help): t   
Partition number (1-7): 5
Hex code (type L to list codes): fd
Changed system type of partition 5 to fd (Linux raid autodetect)
Command (m for help): t
Partition number (1-7): 6
Hex code (type L to list codes): fd
Changed system type of partition 6 to fd (Linux raid autodetect)
Command (m for help): t
Partition number (1-7): 7
Hex code (type L to list codes): fd
Changed system type of partition 7 to fd (Linux raid autodetect)
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Устройство или ресурс занято.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.


Теперь добавим  /dev/sda1/dev/sda2 ... и /dev/sda7 в RAID-массив:


leopard:/home/vitaliy# mdadm --add /dev/md0 /dev/sda1
mdadm: added /dev/sda1
leopard:/home/vitaliy# mdadm --add /dev/md1 /dev/sda2
mdadm: added /dev/sda2
leopard:/home/vitaliy# mdadm --add /dev/md2 /dev/sda3
mdadm: added /dev/sda3
leopard:/home/vitaliy# mdadm --add /dev/md3 /dev/sda5
mdadm: added /dev/sda5
leopard:/home/vitaliy# mdadm --add /dev/md4 /dev/sda6
mdadm: added /dev/sda6
leopard:/home/vitaliy# mdadm --add /dev/md5 /dev/sda7
mdadm: added /dev/sda7


Проверяем состояние массива. Видим что идет процесс синхронизации:

leopard:/home/vitaliy# cat /proc/mdstat
Personalities : [raid1] md5 : active raid1 sda7[2] sdb7[1] 3927744 blocks [2/1] [_U] resync=DELAYED md4 : active raid1 sda6[2] sdb6[1] 4883648 blocks [2/1] [_U] resync=DELAYED md3 : active raid1 sda5[2] sdb5[1] 55568704 blocks [2/1] [_U] [===>.................] recovery = 18.0% (10035072/55568704) finish=13.4min speed=56366K/sec md2 : active raid1 sda3[2] sdb3[1] 9767424 blocks [2/1] [_U] resync=DELAYED md1 : active raid1 sda2[0] sdb2[1] 3903680 blocks [2/2] [UU] md0 : active raid1 sda1[0] sdb1[1] 96256 blocks [2/2] [UU] unused devices:


Коммандой watch cat /proc/mdstat можно смотреть в реальном времени. Обязательно дождитесь завершения процесса синхронизации. 

После синхронизации файл /proc/mdstat будет выгледить следующим образом:

leopard:/home/vitaliy# cat /proc/mdstat                                                                                               
Personalities : [raid1] 
md5 : active raid1 sda7[0] sdb7[1]
      3927744 blocks [2/2] [UU]
      
md4 : active raid1 sda6[0] sdb6[1]
      4883648 blocks [2/2] [UU]
      
md3 : active raid1 sda5[0] sdb5[1]
      55568704 blocks [2/2] [UU]
      
md2 : active raid1 sda3[0] sdb3[1]
      9767424 blocks [2/2] [UU]
      
md1 : active raid1 sda2[0] sdb2[1]
      3903680 blocks [2/2] [UU]
      
md0 : active raid1 sda1[0] sdb1[1]
      96256 blocks [2/2] [UU]
      
unused devices:




Отредактируем /etc/mdadm/mdadm.conf, так что бы учесть теперешнюю ситуацию с массивами:

leopard:/home/vitaliy# cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf                           
leopard:/home/vitaliy# mdadm --examine --scan >> /etc/mdadm/mdadm.conf
leopard:/home/vitaliy# cat /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 Sun, 12 Dec 2010 19:33:21 +0200
# by mkconf $Id$
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=be541299:39e2f0d2:84d43804:33b41315
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=94343e1b:0072922f:84d43804:33b41315
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=1e718bdf:ee27bf42:84d43804:33b41315
ARRAY /dev/md3 level=raid1 num-devices=2 UUID=7f519a51:9491b619:84d43804:33b41315
ARRAY /dev/md4 level=raid1 num-devices=2 UUID=d6317c02:6e989277:84d43804:33b41315
ARRAY /dev/md5 level=raid1 num-devices=2 UUID=63c93027:f0b5b493:84d43804:33b41315



9. Настройка Grub (часть 2)

Почти всё готово. Теперь отредактируем /boot/grub/menu.lst. На данный момент Grub настроен на загрузку с /dev/sdb (hd1,0). Конечно же, мы все еще хотим, чтобы система грузилась, если /dev/sdb содержит какие-то ошибки. Создадаим копию первого блока с описанием параметров загрузки (в котором описан hd1), вставим ее ниже и заменим в этом блоке hd1 на hd0. Остальные блоки закомментируем. Теперь конфиг загрузчика должен выглядеть примерно так:


leopard:/home/vitaliy# nano /boot/grub/menu.lst                                                                                  
[...]
# kopt=root=/dev/md2 ro
[...]
[...]
## ## End Default Options ##
title           Debian GNU/Linux, kernel 2.6.26-2-686 RAID (hd1)
root            (hd1,0)
kernel          /vmlinuz-2.6.26-2-686 root=/dev/md2 ro quiet
initrd          /initrd.img-2.6.26-2-686
title           Debian GNU/Linux, kernel 2.6.26-2-686 RAID (hd0)
root            (hd0,0)
kernel          /vmlinuz-2.6.26-2-686 root=/dev/md2 ro quiet
initrd          /initrd.img-2.6.26-2-686
#title          Debian GNU/Linux, kernel 2.6.26-2-686
#root           (hd0,0)
#kernel         /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro quiet
#initrd         /initrd.img-2.6.26-2-686
#title          Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
#root           (hd0,0)
#kernel         /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro single
#initrd         /initrd.img-2.6.26-2-686
### END DEBIAN AUTOMAGIC KERNELS LIST




Обновляем RAM-диск и перезагружаем систему:
leopard:/home/vitaliy# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-2.6.26-2-686
leopard:~# reboot

При перезагрузки видим два варианта загрузки в меню Grub.



Поздравляю! Вы только что настроили RAID-1 массив в системе Debian Lenny (stable 5.0.7)


10. Тестирование и решение возможных проблем


Для тестирования выключите компьютор, отключите любой из двух винчестеров, и включите компьютер. Система должна загрузиться без проблем.


Если после нескольких экспериментов с отключением/включением дисков во время загрузке вы видите что некоторые массивы поднимаються с 1 диском а не с двумя, необходимо будет выполнить действия кторые преведены ниже.

Вот так выглядит правильная загрузка массива:
[    6.794486] md: md0 stopped.
[    6.807811] md: bind
[    6.808026] md: bind
[    6.821761] raid1: raid set md0 active with 2 out of 2 mirrors


А вот так неправильная:

[    6.901313] md: md2 stopped.
[    6.933030] md: bind
[    6.933224] md: bind
[    6.933246] md: kicking non-fresh sdb3 from array!
[    6.933251] md: unbind
[    6.933259] md: export_rdev(sdb3)
[    6.946926] raid1: raid set md2 active with 1 out of 2 mirrors

Посмотрим ошибки загрузки ядра командой dmesg:


leopard:~# dmesg
[...]
[    6.785280] md: raid1 personality registered for level 1
[...] [    6.794486] md: md0 stopped.
[    6.807811] md: bind
[    6.808026] md: bind [    6.821761] raid1: raid set md0 active with 2 out of 2 mirrors
[...] [    6.822465] md: md1 stopped.
[    6.885858] md: bind
[    6.886056] md: bind
[    6.900995] raid1: raid set md1 active with 2 out of 2 mirrors
[...] [    6.901313] md: md2 stopped. [    6.933030] md: bind
[    6.933224] md: bind
[    6.933246] md: kicking non-fresh sdb3 from array!
[    6.933251] md: unbind
[    6.933259] md: export_rdev(sdb3)
[    6.946926] raid1: raid set md2 active with 1 out of 2 mirrors
[...] [    6.947240] md: md3 stopped.
[    6.958693] md: bind
[    6.958897] md: bind
[    6.958932] md: kicking non-fresh sdb5 from array!
[    6.958937] md: unbind
[    6.958944] md: export_rdev(sdb5)
[    6.975326] raid1: raid set md3 active with 1 out of 2 mirrors
[...] [    6.975642] md: md4 stopped.
[    6.986263] md: bind
[    6.986473] md: bind
[    6.986498] md: kicking non-fresh sdb6 from array!
[    6.986504] md: unbind
[    6.986511] md: export_rdev(sdb6)
[    7.009305] raid1: raid set md4 active with 1 out of 2 mirrors
[...] [    7.009620] md: md5 stopped.
[    7.075068] md: bind
[    7.075359] md: bind
[    7.089303] raid1: raid set md5 active with 2 out of 2 mirrors
[...]

Мы видим что при загрузки модуль madm в процессе сборки каждего массива не включил в них некоторые  диски. Например в массив md2 небыл включен диск sdb3, причины могут быть разные. Возможно проблемы с питанием, например при аварийном выключении.

Для решения проблеммы нада вручную включить каждый диск в соответствующие массивы:
leopard:~# mdadm /dev/md2  --add /dev/sdb3
leopard:~# mdadm /dev/md3  --add /dev/sdb5
leopard:~# mdadm /dev/md4  --add /dev/sdb6

Проверим:
leopard:~# cat /proc/mdstat
Personalities : [raid1] 
md5 : active raid1 sda7[0] sdb7[1]
      3927744 blocks [2/2] [UU]
      
md4 : active raid1 sda6[0]
      4883648 blocks [2/1] [U_]
      
md3 : active raid1 sdb5[2] sda5[0]
      55568704 blocks [2/1] [U_]
      [=>...................]  recovery =  5.9% (3317568/55568704) finish=15.4min speed=56273K/sec
      
md2 : active raid1 sdb3[1] sda3[0]
      9767424 blocks [2/2] [UU]
      
md1 : active (auto-read-only) raid1 sda2[0] sdb2[1]
      3903680 blocks [2/2] [UU]
      
md0 : active raid1 sda1[0] sdb1[1]
      96256 blocks [2/2] [UU]
      
unused devices:


Если команды mdadm --add не сработают, то возможно понадобиться предварительно выполнить команду mdadm с ключами --fail  и -- remove. (в моём случае команда mdadm с ключами --fail  и -- remove не понадобилась):
leopard:~# mdadm /dev/md2  --fail  /dev/sdb3 --remove  /dev/sdb3
leopard:~# mdadm /dev/md2  --add /dev/sdb3

Перезагрузим систему и проверим.


1 комментарий:

  1. You actually make it seem so easy with your presentation
    but I find this matter to be actually something which I think I would never understand.
    It seems too complicated and very broad for me. I am looking forward for your
    next post, I will try to get the hang of it!
    My homepage :: best online casino games

    ОтветитьУдалить