星期日, 1月 06, 2008

複製 Arch Linux 到 mdadm/lvm2 系統

剛剛把 Arch Linux 轉了做主要的桌面,感覺很輕快,就是閒著時有點懷念以前 portage/emerge 時屏幕上飛閃的編譯訊息。試用 Arch Linux 差不多一個月了,那是裝在獨立的 40G 硬碟上的,感覺很不錯,便決定把它覆制到主要的 mdadm/lvm2 系統裡去。

本來對 Linux 來說複制系統也就是 cp -a 而己,先前也這樣複制了 2-3 次 Gentoo 吧。可這次 Arch 真的花了我不少時間… 覺得有必要記一下!

先來個介紹,來源是 40G 的硬碟,分區很簡單:
/dev/sde1 /boot
/dev/sde2 swap
/dev/sde3 /

目標的 mdadm/lvm2 系統:
/dev/md0 /boot (/dev/sda1 & /dev/sdb1, ext2)
/dev/md1 / (/dev/sda2 & /dev/sdb2, ext3)
/dev/md2 lvm2 (/dev/sda4 & /dev/sdb4 & /dev/sdd4)

/dev/mapper/vg0-home /home
/dev/mapper/vg0-opt /opt
/dev/mapper/vg0-tmp /tmp
/dev/mapper/vg0-usr /usr
/dev/mapper/vg0-var /var

1. 首先進入 offline 模式
複制 Linux 最好還是在 offline 模式下,這樣便不用特別處理 /dev, /proc, /sys 等掛載點。我使用的是 DFS 的 LiveCD,其實什么版本都沒關係,只要是支援 mdadm/lvm2 的。由於 DFS 未有跟 Arch Linux 一樣使用新的 libata,ide 裝置是 /dev/hda... 這樣表示的,既然 libata 是個趨勢,為了將來覆閱時省工夫,下面我 "人工" 將這些裝置轉化成了 /dev/sda... 跟Arch Linux 一致。


2. 準備新的 Arch 目錄架構
進入 LiveCD 環境后,以 newarch 為新系統的掛載點並建立所需的目錄架構:

# mkdir -p /mnt/newarch
# mount /dev/md1 /mnt/newarch

# mkdir -p /mnt/newarch/boot
# mkdir -p /mnt/newarch/home
# mkdir -p /mnt/newarch/opt
# mkdir -p /mnt/newarch/tmp
# mkdir -p /mnt/newarch/usr
# mkdir -p /mnt/newarch/var



3. 然后掛載上相應的分區 (省略 mdadm/lvm2 的建立過程):
# mount /dev/md0 /mnt/newarch/boot
# mount /dev/mapper/vg0-home /mnt/newarch/home
# mount /dev/mapper/vg0-opt /mnt/newarch/opt
# mount /dev/mapper/vg0-tmp /mnt/newarch/tmp
# mount /dev/mapper/vg0-usr /mnt/newarch/usr
# mount /dev/mapper/vg0-var /mnt/newarch/var



4. 掛載原有 40G 硬碟裡的 Arch:
# mkdir -p /mnt/oldarch
# mount /dev/sde3 /mnt/oldarch
# mount /dev/sde1 /mnt/oldarch/boot



5. 開始複制
# cp -av /mnt/oldarch /mnt/newarch


6. 設定檔的配置
一陣不長不短的等待后,複制完成,接著是按官方 wiki 的指示做好 mdadm/lvm2 相應的設定。留意這裡講的是相對於 newarch 目標系統的路徑,如 /etc/rc.conf 在 LiveCD 下實為 /mnt/newarch/etc/rc.conf。

/etc/rc.conf
USELVM="yes"

/etc/mkinitcpio.conf
MODULES="ata_generic ata_piix raid1 raid456 reiserfs"
HOOKS="base udev autodetect pata scsi sata raid keymap lvm2 filesystems"
md=0,/dev/sda1,/dev/sdb1
md=1,/dev/sda2,/dev/sdb2
md=2,/dev/sda4,/dev/sdb4,/dev/sdd4


/boot/grub/menu.lst
default 0
timeout 5
fallback 1

title Arch Linux
root (hd0,0)
kernel /vmlinuz26 root=/dev/md1 ro md=1,/dev/sdc3,/dev/sdd3
initrd /kernel26.img


/etc/fstab

#
# /etc/fstab: static file system information
#

none /dev/pts devpts defaults 0 0
none /dev/shm tmpfs defaults 0 0

/dev/cdrom /mnt/cdrom iso9660 ro,user,noauto,unhide 0 0
/dev/dvd /mnt/dvd udf ro,user,noauto,unhide 0 0

/dev/md0 /boot ext2 noatime 1 2
/dev/md1 / reiserfs noatime 0 1
/dev/sdb2 none swap sw,pri=1 0 0
/dev/sdd2 none swap sw,pri=1 0 0
/dev/sda2 none swap sw,pri=1 0 0
/dev/vg0/home /home reiserfs noatime 0 1
/dev/vg0/opt /opt reiserfs noatime 0 1
/dev/vg0/tmp /tmp reiserfs noatime 0 1
/dev/vg0/usr /usr reiserfs noatime 0 1
/dev/vg0/var /var reiserfs noatime 0 1



7. 進入 chroot 環境下
以下的指令需在 chroot 環境下執行,所以得先 chroot。

# mount -o bind /dev /mnt/newarch/dev
# mount -t proc none /mnt/newarch/proc


為保證執行 grub-install 時不出錯還要多做以下一步:
# grep -v rootfs /proc/mounts > /mnt/newarch/etc/mtab
# chroot /mnt/newarch /bin/bash



8. 更新 initramfs 的映像檔
# mkinitcpio -p kernel26


9. 修改 /etc/mdadm.conf
DEVICE /dev/sd[acd]1
DEVICE /dev/sd[acd]3
DEVICE /dev/sd[acd]4
ARRAY /dev/md1 level=raid1 num-devices=2 spares=1 UUID=1192e065:a8038ab4:6386aa5a:b25fe52e
ARRAY /dev/md2 level=raid5 num-devices=3 UUID=3d67777f:f4ab5ccd:6310127f:94f272a1
ARRAY /dev/md0 level=raid1 num-devices=2 spares=1 UUID=6e745075:51dee752:b420a73d:56580032


DEVICE 設定是告訴 mdadm raid 分區的位置,而后者是 raid 的組合,經由以下指令取得:
# mdadm -D --scan >>/etc/mdadm.conf


10. 建立必要的 device nodes
也就是 /dev/console, /dev/null, /dev/zero。這就是先前多翻嘗試仍不能進入 Arch 的關鍵,Gentoo 上沒有的東西~~
# /sbin/migrate-udev


11. 把 grub 安裝 MBR
# grub-install --no-floppy /dev/sda
# grub-install --no-floppy /dev/sdb
# grub-install --no-floppy /dev/sdd



12. 任務完成!!
至些大功告成,可以離開 chroot 環境並重新動電腦了。
# exit
# umount /mnt/newarch/boot
# umount /mnt/newarch/home
# umount /mnt/newarch/opt
# umount /mnt/newarch/tmp
# umount /mnt/newarch/usr
# umount /mnt/newarch/var
# umount /mnt/newarch/dev
# umount /mnt/newarch/proc
# umount /mnt/newarch
# reboot


13. Arch wiki 的一些參考資料
Installing_Arch_from_a_LiveCD
Installing_with_Software_RAID_or_LVM

1 則留言:

匿名 提到...

如果grub中的root(也就是说/是raid上的的一个vg的lv中,如/dev/gv00/vroot,gv00在raid5上),这样的话可以正常进入系统吗?