คำเตือน: บทความนี้มีขั้นตอนการสั่งงานระบบที่ค่อนข้างมีความเสี่ยงที่จะทำให้ข้อมูลสูญหายได้ ถ้าใช้งานจริง โปรดสำรองข้อมูลก่อนเสมอ ทุกคำสั่งควรทบทวนอย่างระมัดระวัง และต้องดัดแปลงให้ตรงกับสถานการณ์จริง และควรตรวจสอบผลลัพธ์ว่าเป็นไปตามที่ต้องการหรือไม่ ก่อนจะดำเนินการขั้นต่อไป
ปกติเรามักจะทำ RAID ก่อนที่จะติดตั้งระบบ โดยเฉพาะเมื่อต้องคอนฟิก hardware RAID นั้น เป็นไปไม่ได้เลยที่จะติดตั้งระบบบนดิสก์ตัวเดียวก่อน แล้วค่อยเปลี่ยนเป็น RAID ภายหลัง
แต่ความยืดหยุ่นของ Linux MD RAID ทำให้การ migrate จากพาร์ทิชันธรรมดา มาเป็น RAID ได้ ซึ่งทำได้เฉพาะกับ RAID ที่รองรับ redundant ดังนั้นจึงใช้กับ RAID0 ไม่ได้
ในขั้นแรก ขอยกตัวอย่างการ migrate จาก พาร์ทิชันธรรมดา -> RAID1
สถานการณ์ เดิมมีฮาร์ดดิสก์ 1 ตัว (sda) แบ่งเป็น
- /boot
- swap
- /
- /var
ต่อมาเพิ่มฮาร์ดดิสก์อีกตัวขนาดเท่ากัน (sdb) จะทำ RAID1 ทุกพาร์ทิชัน ยกเว้น swap
หลักการคือ เราจะทำให้ sdb ทำงานเป็น RAID1 ที่มีสถานะ degraded คือมีดิสก์ไม่ครบ แต่ยังทำงานได้ คือมีดิสก์เพียง 1 ตัว จากที่ต้องการจริงคือ 2 ตัว แล้วย้ายข้อมูลจาก sda แต่ละพาร์ทิชัน ไปยัง RAID1 แต่ละพาร์ทิชันที่สร้างขึ้น ปรับ boot parameter ต่างๆ ให้บูตและเมานท์จาก RAID ทั้งหมด แล้วรีบูต แล้วค่อยเพิ่ม sda แต่ละพาร์ทิชันเข้ามาใน RAID แต่ละชุด
ขั้นตอน
โคลนโครงสร้างพาร์ทิชัน
# sfdisk -d /dev/sda | sfdisk -L /dev/sdb
เปลี่ยนชนิดของพาร์ทิชันเป็น Linux raid autodetect (fd)
# fdisk /dev/sdb
t
1
fd
t
3
fd
t
4
fd
w
สร้าง swap
# mkswap /dev/sdb2
ติดตั้ง mdadm
# apt-get install mdadm
สร้าง RAID1 ในพาร์ทิชัน 1,3,4
# mdadm --create /dev/md0 --level=1 --raid-devices=2 --metadata=0.9 missing /dev/sdb1
# mdadm --create /dev/md1 --level=1 --raid-devices=2 missing /dev/sdb3
# mdadm --create /dev/md2 --level=1 --raid-devices=2 missing /dev/sdb4
สำหรับ raid ชุดแรกที่จะให้บูตได้ ควรกำหนดให้ใช้ metadata version 0.9 ส่วนตัวอื่นๆ ไม่ระบุ มันจะใช้ metadata version 1.2 และจะระบุ device เป็น missing เพื่อเว้นไว้เพิ่ม sda เข้ามาภายหลัง
จากนั้นสร้าง filesystem
# mkfs.ext2 -L boot -m 0 /dev/md0
# mkfs.ext4 -L root /dev/md1
# mkfs.ext4 -L var /dev/md2
เมานท์และคัดลอกไฟล์ จากพาร์ทิชันเดิม ในขั้นตอนนี้ ถ้ามีโปรแกรม หรือ service อะไรรันไว้ แ้ล้วอาจจะมีการเปิดไฟล์ค้างไว้ ควรหยุดโปรแกรมหรือ service นั้นก่อน เช่น MySQL มิฉะนั้นแล้วข้อมูลที่คัดลอกไปจะไม่สมบูรณ์ ถ้าไม่แน่ใจ ให้ reboot ระบบเป็น single user mode ก่อน
# mkdir /mnt/root
# mount /dev/md1 /mnt/root
# mkdir /mnt/old-root
# mount -o bind / /mnt/old-root
# (cd /mnt/old-root ; tar c . ) | (cd /mnt/root ; tar xpv )
# umount /mnt/old-root
# rmdir /mnt/old-root
# rmdir /mnt/root/mnt/old-root
# rmdir /mnt/root/mnt/root
# mount /dev/md0 /mnt/root/boot
# (cd /boot ; tar c . ) | (cd /mnt/root/boot ; tar xpv )
# mount /dev/md2 /mnt/root/var
# (cd /var ; tar c . ) | (cd /mnt/root/var ; tar xpv )
ต่อไปจะ chroot และติดตั้ง boot loader ใหม่ และแก้ไขค่าเกี่ยวกับการบูตทั้งหมด
# mount -o bind /dev /mnt/root/dev
# mount -t proc none /mnt/root/proc
# mount -t devpts none /mnt/root/dev/pts
# mount -t sysfs none /mnt/root/sys
# chroot /mnt/root /bin/bash --login
# vi /etc/fstab
(หรือ nano /etc/fstab แล้วแต่ถนัด editor ใด)
แล้้วแก้ไขพาร์ทิชัน หรือ UUID เดิมให้เป็น /dev/md0 สำหรับ /boot, /dev/md1 สำหรับ / และ /dev/md2 สำหรับ /var และเพิ่ม swap ให้กับ /dev/sdb2
# mdadm --examine --scan >> /etc/mdadm/mdadm.conf
# update-grub
# grub-install /dev/sda
# grub-install /dev/sdb
# update-initramfs -u
ตรวจดูในไฟล์ /boot/grub/grub.cfg ว่า ในบรรทัดที่ขึ้นต้นด้วย linux ได้กำหนด root=/dev/md1 ถูกต้องหรือไม่ โดยปกติจะถูกกำหนดไว้ถูกต้องแล้วด้วยโปรแกรม update-grub
จากนั้นสั่ง reboot
# exit
# umount /mnt/root/sys
# umount /mnt/root/dev/pts
# umount /mnt/root/proc
# umount /mnt/root/dev
# umount /mnt/root
# reboot
เมื่อบูตแล้วระบบควรจะใช้ /dev/md1 เป็น root ลองตรวจสอบด้วยคำสั่ง mount
# mount
ควรจะพบบรรทัดนี้
/dev/md1 on / type ext4 (rw,noatime)
เมื่อสั่ง
# cat /proc/mdstat
จะพบระบบ RAID ยังเป็น degraded อยู่ ดังนี้
md0 : active raid1 sdb1[1]
262140 blocks [2/1] [_U]
md1 : active raid1 sdb3[1]
5242816 blocks [2/1] [_U]
md2 : active raid1 sdb4[1]
41942480 blocks [2/1] [_U]
ตรวจสอบระบบและข้อมูลต่างๆ ว่ายังปกติดี เมื่อมั่นใจแล้วก็เอาพาร์ทิชันต่างๆ ใน sda มารวมเข้ากับระบบ RAID
# fdisk /dev/sda
t
1
fd
t
3
fd
t
4
fd
w
# mdadm /dev/md0 --add /dev/sda1
# mdadm /dev/md1 --add /dev/sda3
# mdadm /dev/md2 --add /dev/sda4
# cat /proc/mdstat
md0 : active raid1 sdb1[1]
262140 blocks [2/1] [_U]
[============>........] recovery = 63.5% (166458/262140) finish=0.4min speed=3504K/sec
md1 : active raid1 sdb3[1]
5242816 blocks [2/1] [_U]
md2 : active raid1 sdb4[1]
41942480 blocks [2/1] [_U]
RAID จะ resync จาก sdb ไปยัง sda ซึ่งระยะเวลาขึ้นอยู่กับขนาดของพาร์ทิชันและความเร็วในการอ่านเขียนดิสก์ รวมถึงความ busy ของดิสก์ด้วย
ในระหว่างนี้ ถ้าเป็น server เราก็สามารถให้บริการได้ตามปกติ แต่ก็จะทำให้การ sync ข้อมูลของ RAID ช้าไปด้วย
ถ้าจะ migrate จากพาร์ทิชันธรรมดา ไปเป็น RAID5,6 หรือ RAID10 ก็ทำได้ในลักษณะเดียวกัน คือให้จัดการดิสก์ที่นำเข้ามาเพิ่มให้ทำงานเป็น RAID ที่ไม่สมบูรณ์ หรือ degraded ก่อน แล้วดัดแปลงขั้นตอนจากข้างบนได้เลย
มีข้อควรระวังคือพาร์ทิชันที่จะใช้ boot (ปกติคือ /boot หรือถ้าไม่ได้แยกไว้ ก็จะเป็น /) ต้องกำหนดเป็น RAID1 และใช้ metadata version 0.9 เสมอ ถ้าเป็นแบบอื่น อาจจะบูตไม่ได้ แต่ไม่แน่ใจว่า grub2 นี่รองรับ MD RAID ได้ขนาดไหนแล้ว