GIT – This guide explains how to set up software RAID1 on an already running 10.04 system. The GRUB2 bootloader will be configured in such a way that the system will still be able to boot if one of the hard drives fails (no matter which one).

I do not issue any guarantee that this will work for you!

1 Preliminary Note

In this tutorial I’m using an Ubuntu 10.04 system with two hard drives,¬†/dev/sda¬†and¬†/dev/sdb¬†which are identical in size.¬†/dev/sdb¬†is currently unused, and¬†/dev/sda¬†has the following partitions:

  • /dev/sda1:¬†/boot¬†partition, ext4;
  • /dev/sda2: swap;
  • /dev/sda3:¬†/¬†partition, ext4

In the end I want to have the following situation:

  • /dev/md0¬†(made up of¬†/dev/sda1¬†and¬†/dev/sdb1):¬†/boot¬†partition, ext4;
  • /dev/md1¬†(made up of¬†/dev/sda2¬†and¬†/dev/sdb2): swap;
  • /dev/md2¬†(made up of¬†/dev/sda3¬†and¬†/dev/sdb3):¬†/¬†partition, ext4

This is the current situation:

[email protected]:~#¬†df¬†-h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda3             4.0G  808M  3.0G  21% /
none                  243M  168K  243M   1% /dev
none                  247M     0  247M   0% /dev/shm
none                  247M   36K  247M   1% /var/run
none                  247M     0  247M   0% /var/lock
none                  247M     0  247M   0% /lib/init/rw
none                  4.0G  808M  3.0G  21% /var/lib/ureadahead/debugfs
/dev/sda1             472M   27M  422M   6% /boot
[email protected]:~#

 

[email protected]:~#¬†fdisk¬†-l

 /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: 0x000246b7

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          63      498688   83  
Partition 1 does not end on cylinder boundary.
/dev/sda2              63         125      499712   82  Linux swap / 
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

Disk¬†/dev/sdb¬†doesn’t¬†contain¬†a¬†valid¬†partition¬†table
[email protected]:~#

2 Installing mdadm

The most important tool for setting up RAID is¬†mdadm. Let’s install it like this:

aptitude install initramfs-tools mdadm

Afterwards, we load a few kernel modules (to avoid a reboot):

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

Now run

cat /proc/mdstat

The output should look as follows:

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: <none>
[email protected]:~#

3 Preparing /dev/sdb

To create a RAID1 array on our already running system, we must prepare the /dev/sdb hard drive for RAID1, then copy the contents of our /dev/sda hard drive to it, and finally add /dev/sda to the RAID1 array.

First, we copy the partition table from /dev/sda to /dev/sdb so that both disks have exactly the same layout:

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

The output should be as follows:

[email protected]:~#¬†sfdisk¬†-d¬†/dev/sda¬†|¬†sfdisk¬†–force¬†/dev/sdb

Checking¬†that¬†no-one¬†is¬†using¬†this¬†disk¬†right¬†now¬†…
OK

Disk /dev/sdb: 652 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0

Device Boot    Start       End   #sectors  Id  System
/dev/sdb1   *      2048    999423     997376  83  Linux
/dev/sdb2        999424   1998847     999424  82  Linux swap / Solaris
/dev/sdb3       1998848  10483711    8484864  83  Linux
/dev/sdb4¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†0¬†¬†¬†¬†¬†¬†¬†¬†¬†–¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†0¬†¬†¬†0¬†¬†Empty
Warning: partition 1 does not end at a cylinder boundary
Successfully wrote the new partition table

Re-reading¬†the¬†partition¬†table¬†…

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
[email protected]:~#

The command

fdisk -l

should now show that both HDDs have the same layout:

[email protected]:~#¬†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: 0x000246b7

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.
[email protected]:~#

Next we must change the partition type of our three partitions on /dev/sdb to Linux raid autodetect:

fdisk /dev/sdb

[email protected]:~#¬†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 <32M      41  PPC PReP Boot   85  Linux extended  c7  Syrinx
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   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 <3 63  GNU HURD or Sys ab  Darwin boot     f2  DOS secondary
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.
[email protected]:~#

To make sure that there are no remains from previous RAID installations on /dev/sdb, we run the following commands:

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

If there are no remains from previous RAID installations, each of the above commands will throw an error like this one (which is nothing to worry about):

[email protected]:~# mdadm –zero-superblock /dev/sdb1
mdadm: Unrecognised md component device – /dev/sdb1
[email protected]:~#

Otherwise the commands will not display anything at all.

4 Creating Our RAID Arrays

Now let’s create our RAID arrays¬†/dev/md0,¬†/dev/md1, and¬†/dev/md2.¬†/dev/sdb1¬†will be added to¬†/dev/md0,¬†/dev/sdb2¬†to/dev/md1, and¬†/dev/sdb3¬†to¬†/dev/md2.¬†/dev/sda1,¬†/dev/sda2, and¬†/dev/sda3¬†can’t be added right now (because the system is currently running on them), therefore we use the placeholder¬†missing¬†in the following three commands:

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

The command

cat /proc/mdstat

should now show that you have three degraded RAID arrays ([_U] or [U_] means that an array is degraded while [UU] means that the array is ok):

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1]
4242368 blocks [2/1] [_U]

md1 : active raid1 sdb2[1]
499648 blocks [2/1] [_U]

md0 : active raid1 sdb1[1]
498624 blocks [2/1] [_U]

unused devices: <none>
[email protected]:~#

Next we create filesystems on our RAID arrays (ext4 on /dev/md0 and /dev/md2 and swap on /dev/md1):

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

Next we must adjust¬†/etc/mdadm/mdadm.conf¬†(which doesn’t contain any information about our new RAID arrays yet) to the new situation:

cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_orig
mdadm –examine –scan >> /etc/mdadm/mdadm.conf

Display the contents of the :

cat /etc/mdadm/mdadm.conf

At the bottom of the file you should now see details about our three (degraded) RAID arrays:

# 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 <system>

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

# definitions of existing MD arrays

# This file was auto-generated on Mon, 21 Jun 2010 13:21:00 +0200
# by mkconf $Id$
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=68686c40:b924278e:325ecf68:79913751
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=9719181e:3071f655:325ecf68:79913751
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=c3360f0f:7f3d47ec:325ecf68:79913751

5 Adjusting The System To RAID1

Now let’s ¬†/dev/md0¬†and¬†/dev/md2¬†(we don’t need to the swap array¬†/dev/md1):

mkdir /mnt/md0
mkdir /mnt/md2

mount /dev/md0 /mnt/md0
mount /dev/md2 /mnt/md2

You should now find both arrays in the output of

mount

[email protected]:~# mount
/dev/sda3 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/ type securityfs (rw)
none on /dev type devtmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
none on /var/lib/ureadahead/debugfs type debugfs (rw,relatime)
/dev/sda1 on /boot type ext4 (rw)
/dev/md0 on /mnt/md0 type ext4 (rw)
/dev/md2 on /mnt/md2 type ext4 (rw)
[email protected]:~#

Next we modify /etc/fstab. Comment out the current /, /boot, and swap partitions and add new lines for them where you replace the UUIDs with /dev/md0 (for the /bootpartition), /dev/md1 (for the swap partition) and /dev/md2 (for the / partition) so that the file looks as follows:

vi /etc/fstab

# /etc/fstab: static file system information.
#
# Use 'blkid -o value -s 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).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
# / was on /dev/sda3 during installation
#UUID=48d65bba-0f02-44b4-8557-b508309b1963 /               ext4    errors=remount-ro 0       1
/dev/md2 /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
#UUID=e3a677ee-2db0-4a8a-8d6c-94715c8cd90f /boot           ext4    defaults        0       2
/dev/md0 /boot           ext4    defaults        0

Next replace /dev/sda1 with /dev/md0 and /dev/sda3 with /dev/md2 in /etc/mtab:

vi /etc/mtab

/dev/md2 / ext4 rw,errors=remount-ro 0 0
proc /proc proc rw,noexec,nosuid,nodev 0 0
none /sys sysfs rw,noexec,nosuid,nodev 0 0
none /sys/fs/fuse/connections fusectl rw 0 0
none /sys/kernel/debug debugfs rw 0 0
none /sys/kernel/security securityfs rw 0 0
none /dev devtmpfs rw,mode=0755 0 0
none /dev/pts devpts rw,noexec,nosuid,gid=5,mode=0620 0 0
none /dev/shm tmpfs rw,nosuid,nodev 0 0
none /var/run tmpfs rw,nosuid,mode=0755 0 0
none /var/lock tmpfs rw,noexec,nosuid,nodev 0 0
none /lib/init/rw tmpfs rw,nosuid,mode=0755 0 0
none /var/lib/ureadahead/debugfs debugfs rw,relatime 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

Now up to the GRUB2 boot loader. Create the file /etc/grub.d/09_swraid1_setup as follows:

cp /etc/grub.d/40_custom /etc/grub.d/09_swraid1_setup
vi /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 'Ubuntu, with Linux 2.6.32-21-server' --class ubuntu --class gnu-linux --class gnu --class os {
        recordfail
        insmod raid
        insmod mdraid
        insmod ext2
        set root='(md0)'
        linux   /vmlinuz-2.6.32-21-server root=/dev/md2 ro   quiet
        initrd  /initrd.img-2.6.32-21-server
}

Make sure you use the correct kernel version in the menuentry stanza (in the linux and initrd lines). You can find it out by running

uname -r

or by taking a look at the current menuentry stanzas in the ### BEGIN /etc/grub.d/10_linux ### section in /boot/grub/grub.cfg. Also make sure that you useroot=/dev/md2 in the linux line.

The important part in our new¬†menuentry¬†stanza is the line set¬†root='(md0)’¬†– it makes sure that we boot from our RAID1 array¬†/dev/md0¬†(which will hold the¬†/boot¬†partition) instead of¬†/dev/sda¬†or¬†/dev/sdb¬†which is important if one of our hard drives fails – the system will still be able to boot.

Run

update-grub

to write our new kernel stanza from /etc/grub.d/09_swraid1_setup to /boot/grub/grub.cfg.

Next we adjust our ramdisk to the new situation:

update-initramfs -u

Now we copy the contents of /dev/sda1 and /dev/sda3 to /dev/md0 and /dev/md2 (which are mounted on /mnt/md0 and /mnt/md2):

cp -dpRx / /mnt/md2

cd /boot
cp -dpRx . /mnt/md0

6 Preparing GRUB2 (Part 1)

Afterwards we must make sure that the GRUB2 bootloader is installed on both hard drives, /dev/sda and /dev/sdb:

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

Now we reboot the system and hope that it boots ok from our RAID arrays:

reboot

7 Preparing /dev/sda

If all goes well, you should now find /dev/md0 and /dev/md2 in the output of

df -h

[email protected]:~#¬†df¬†-h
Filesystem            Size  Used Avail Use% Mounted on
/dev/md2              4.0G  815M  3.0G  22% /
none                  243M  192K  243M   1% /dev
none                  247M     0  247M   0% /dev/shm
none                  247M   40K  247M   1% /var/run
none                  247M     0  247M   0% /var/lock
none                  247M     0  247M   0% /lib/init/rw
none                  4.0G  815M  3.0G  22% /var/lib/ureadahead/debugfs
/dev/md0              472M   27M  421M   6% /boot
[email protected]:~#

The output of

cat /proc/mdstat

should be as follows:

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sdb1[1]
498624 blocks [2/1] [_U]

md1 : active raid1 sdb2[1]
499648 blocks [2/1] [_U]

md2 : active raid1 sdb3[1]
4242368 blocks [2/1] [_U]

unused devices: <none>
[email protected]:~#

Now we must change the partition types of our three partitions on /dev/sda to Linux raid autodetect as well:

fdisk /dev/sda

[email protected]:~#¬†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.
[email protected]:~#

Now we can add /dev/sda1, /dev/sda2, and /dev/sda3 to the respective RAID arrays:

mdadm –add /dev/md0 /dev/sda1
mdadm –add /dev/md1 /dev/sda2
mdadm –add /dev/md2 /dev/sda3

Now take a look at

cat /proc/mdstat

… and you should see that the RAID arrays are being synchronized:

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
498624 blocks [2/2] [UU]

md1 : active raid1 sda2[2] sdb2[1]
499648 blocks [2/1] [_U]
resync=DELAYED

md2 : active raid1 sda3[2] sdb3[1]
4242368 blocks [2/1] [_U]
[===========>………]¬†¬†recovery¬†=¬†55.1%¬†(2338176/4242368)¬†finish=0.3min¬†speed=83506K/sec

unused devices: <none>
[email protected]:~#

(You can run

watch cat /proc/mdstat

to get an ongoing output of the process. To leave watch, press CTRL+C.)

Wait until the synchronization has finished (the output should then look like this:

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid1 sda1[0] sdb1[1]
498624 blocks [2/2] [UU]

md1 : active raid1 sda2[0] sdb2[1]
499648 blocks [2/2] [UU]

md2 : active raid1 sda3[0] sdb3[1]
4242368 blocks [2/2] [UU]

unused devices: <none>
[email protected]:~#

).

Then adjust /etc/mdadm/mdadm.conf to the new situation:

cp /etc/mdadm/mdadm.conf_orig /etc/mdadm/mdadm.conf
mdadm –examine –scan >> /etc/mdadm/mdadm.conf

/etc/mdadm/mdadm.conf should now look something like this:

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 <system>

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

# definitions of existing MD arrays

# This file was auto-generated on Mon, 21 Jun 2010 13:21:00 +0200
# by mkconf $Id$
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=68686c40:b924278e:325ecf68:79913751
ARRAY /dev/md1 level=raid1 num-devices=2 UUID=9719181e:3071f655:325ecf68:79913751
ARRAY /dev/md2 level=raid1 num-devices=2 UUID=c3360f0f:7f3d47ec:325ecf68:79913751

8 Preparing GRUB2 (Part 2)

Now we delete¬†/etc/grub.d/09_swraid1_setup…

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

… and update our GRUB2 bootloader configuration:

update-grub
update-initramfs -u

Now if you take a look at¬†/boot/grub/grub.cfg, you should find that the¬†menuentry¬†stanzas in the¬†### BEGIN /etc/grub.d/10_linux ###¬†section look pretty much the same as what we had in¬†/etc/grub.d/09_swraid1_setup¬†(they should now also be set to boot from¬†/dev/md0¬†instead of¬†(hd0,1)¬†or¬†(hd1,1)), that’s why we don’t need/etc/grub.d/09_swraid1_setup¬†anymore.

Reboot the system:

reboot

It should boot without problems.

That’s it – you’ve successfully set up software RAID1 on your running Ubuntu 10.04 system!

9 Testing

Now let’s simulate a hard drive failure. It doesn’t matter if you select¬†/dev/sda¬†or¬†/dev/sdb¬†here. In this example I assume that¬†/dev/sdb¬†has failed.

To simulate the hard drive failure, you can either shut down the system and remove /dev/sdb from the system, or you (soft-)remove it like this:

mdadm –manage /dev/md0 –fail /dev/sdb1
mdadm –manage /dev/md1 –fail /dev/sdb2
mdadm –manage /dev/md2 –fail /dev/sdb3

mdadm –manage /dev/md0 –remove /dev/sdb1
mdadm –manage /dev/md1 –remove /dev/sdb2
mdadm –manage /dev/md2 –remove /dev/sdb3

Shut down the system:

shutdown -h now

Then put in a new¬†/dev/sdb¬†drive (if you simulate a failure of¬†/dev/sda, you should now put¬†/dev/sdb¬†in¬†/dev/sda’s place and connect the new as¬†/dev/sdb!) and boot the system. It should still start without problems.

Now run

cat /proc/mdstat

and you should see that we have a degraded array:

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sda3[0]
4242368 blocks [2/1] [U_]

md1 : active raid1 sda2[0]
499648 blocks [2/1] [U_]

md0 : active raid1 sda1[0]
498624 blocks [2/1] [U_]

unused devices: <none>
[email protected]:~#

The output of

fdisk -l

should look as follows:

[email protected]:~#¬†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: 0x000246b7

Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          63      498688   fd  Linux raid autodetect
Partition 1 does not end on cylinder boundary.
/dev/sda2              63         125      499712   fd  Linux raid autodetect
Partition 2 does not end on cylinder boundary.
/dev/sda3             125         653     4242432   fd  Linux raid autodetect
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

Disk¬†/dev/sdb¬†doesn’t¬†contain¬†a¬†valid¬†partition¬†table

Disk /dev/md0: 510 MB, 510590976 bytes
2 heads, 4 sectors/track, 124656 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk¬†/dev/md0¬†doesn’t¬†contain¬†a¬†valid¬†partition¬†table

Disk /dev/md1: 511 MB, 511639552 bytes
2 heads, 4 sectors/track, 124912 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk¬†/dev/md1¬†doesn’t¬†contain¬†a¬†valid¬†partition¬†table

Disk /dev/md2: 4344 MB, 4344184832 bytes
2 heads, 4 sectors/track, 1060592 cylinders
Units = cylinders of 8 * 512 = 4096 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk¬†/dev/md2¬†doesn’t¬†contain¬†a¬†valid¬†partition¬†table
[email protected]:~#

Now we copy the partition table of /dev/sda to /dev/sdb:

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

[email protected]:~#¬†sfdisk¬†-d¬†/dev/sda¬†|¬†sfdisk¬†–force¬†/dev/sdb
Checking¬†that¬†no-one¬†is¬†using¬†this¬†disk¬†right¬†now¬†…
OK

Disk /dev/sdb: 652 cylinders, 255 heads, 63 sectors/track

sfdisk: ERROR: sector 0 does not have an msdos signature
/dev/sdb: unrecognized partition table type
Old situation:
No partitions found
New situation:
Units = sectors of 512 bytes, counting from 0

Device Boot    Start       End   #sectors  Id  System
/dev/sdb1   *      2048    999423     997376  fd  Linux raid autodetect
/dev/sdb2        999424   1998847     999424  fd  Linux raid autodetect
/dev/sdb3       1998848  10483711    8484864  fd  Linux raid autodetect
/dev/sdb4¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†0¬†¬†¬†¬†¬†¬†¬†¬†¬†–¬†¬†¬†¬†¬†¬†¬†¬†¬†¬†0¬†¬†¬†0¬†¬†Empty
Warning: partition 1 does not end at a cylinder boundary
Successfully wrote the new partition table

Re-reading¬†the¬†partition¬†table¬†…

If you created or changed a DOS partition, /dev/foo7, say, then use dd(1)
to zero the first 512 bytes:  dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(See fdisk(8).)
You have new mail in /var/mail/root
[email protected]:~#

Afterwards we remove any remains of a previous RAID array from¬†/dev/sdb…

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

… and add¬†/dev/sdb¬†to the RAID array:

mdadm -a /dev/md0 /dev/sdb1
mdadm -a /dev/md1 /dev/sdb2
mdadm -a /dev/md2 /dev/sdb3

Now take a look at

cat /proc/mdstat

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[2] sda3[0]
4242368 blocks [2/1] [U_]
[===>……………..]¬†¬†recovery¬†=¬†16.1%¬†(683520/4242368)¬†finish=0.6min¬†speed=97645K/sec

md1 : active raid1 sdb2[2] sda2[0]
499648 blocks [2/1] [U_]
resync=DELAYED

md0 : active raid1 sdb1[1] sda1[0]
498624 blocks [2/2] [UU]

unused devices: <none>
[email protected]:~#

Wait until the synchronization has finished:

[email protected]:~#¬†cat¬†/proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md2 : active raid1 sdb3[1] sda3[0]
4242368 blocks [2/2] [UU]

md1 : active raid1 sdb2[1] sda2[0]
499648 blocks [2/2] [UU]

md0 : active raid1 sdb1[1] sda1[0]
498624 blocks [2/2] [UU]

unused devices: <none>
[email protected]:~#

Then install the bootloader on both HDDs:

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

That’s it. You’ve just replaced a failed hard drive in your RAID1 array.

10 Links

Print Friendly, PDF & Email

Comments

comments

B√†i viŠļŅt li√™n quan