Hi, I've made some tests based on the patch proposed by Lunar. To fully automate LVM over RAID setups, I've changed some parts of the scripts :
1) Parted try to read a partition table on the RAID volume. I added a commit.d script before parted to avoid that. 2) In the initial_auto_raid_lvm script, before starting auto_lvm_perform, the vg map must be created with auto_lvm_create_vg_map. Here is a new patch proposal. Cheers, Philippe Le Brouster
diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/commit.d/auto_raid_parted_hack ./commit.d/auto_raid_parted_hack --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/commit.d/auto_raid_parted_hack 1970-01-01 01:00:00.000000000 +0100 +++ ./commit.d/auto_raid_parted_hack 2009-03-04 15:34:25.000000000 +0100 @@ -0,0 +1,28 @@ +#!/bin/sh + +. /lib/partman/lib/base.sh +. /lib/partman/lib/commit.sh + +for dev in $DEVICES/\=dev\=md*; do + [ -d "$dev" ] || continue + cd $dev + + id=$(ls -d 0-*) + fstype="" + + [ -f "$id/filesystem" ] && fstype=$(cat $id/filesystem) + + [ -z $fstype ] && continue + case "$fstype" in + swap) + ;; + lvm) + ;; + *) + open_dialog DISK_UNCHANGED + close_dialog + ;; + + esac +done + diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/commit.d/_numbers ./commit.d/_numbers --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/commit.d/_numbers 1970-01-01 01:00:00.000000000 +0100 +++ ./commit.d/_numbers 2009-03-03 14:09:05.000000000 +0100 @@ -0,0 +1,2 @@ +29 auto_raid_parted_hack + diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/debian/changelog ./debian/changelog --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/debian/changelog 2008-09-22 02:04:43.000000000 +0200 +++ ./debian/changelog 2009-03-10 14:08:14.000000000 +0100 @@ -1,3 +1,10 @@ +partman-auto-raid (14+slis4.1.3~2) UNRELEASED; urgency=low + + * Add the ability to preseed LVM over RAID based on the patch in #484421. + + + -- Philippe Le Brouster <p...@ac-grenoble.fr> Mon, 09 Mar 2009 12:02:44 +0100 + partman-auto-raid (14) unstable; urgency=low [ Updated translations ] diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/debian/control ./debian/control --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/debian/control 2008-08-09 21:26:06.000000000 +0200 +++ ./debian/control 2009-02-23 17:03:09.000000000 +0100 @@ -9,5 +9,5 @@ Package: partman-auto-raid XC-Package-Type: udeb Architecture: all -Depends: ${misc:Depends}, partman-base (>= 114), partman-basicfilesystems, partman-ext3, partman-auto (>= 58), partman-md +Depends: ${misc:Depends}, partman-base (>= 114), partman-basicfilesystems, partman-ext3, partman-auto (>= 79), partman-md Description: Allow preseeded RAID installs diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/debian/rules ./debian/rules --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/debian/rules 2008-08-09 21:26:06.000000000 +0200 +++ ./debian/rules 2009-03-03 13:36:47.000000000 +0100 @@ -17,6 +17,7 @@ dh_clean -k dh_install auto-raidcfg bin debian/install-rc display.d + debian/install-rc commit.d binary-arch: build install dh_testdir diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/display.d/initial_auto_raid_fs ./display.d/initial_auto_raid_fs --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/display.d/initial_auto_raid_fs 2008-08-09 21:26:07.000000000 +0200 +++ ./display.d/initial_auto_raid_fs 2009-03-04 17:19:16.000000000 +0100 @@ -29,16 +29,24 @@ fi cd $id - if [ "$fstype" = swap ]; then + case "$fstype" in + swap) rm -f filesystem mountpoint use_filesystem options echo swap >method - else + ;; + lvm) + # Register this RAID as a PV for initial_auto_raid_lvm + echo lvm >method + echo "/dev/md$raidnum" >>/var/lib/partman/initial_auto_raid_pvs + ;; + *) echo "$fstype" >filesystem echo "$mountpoint" >mountpoint echo format >method touch use_filesystem mkdir options - fi + ;; + esac touch format touch formatable @@ -50,6 +58,7 @@ exit 0 fi rm /var/lib/partman/do_initial_auto_raid_fs +rm -f /var/lib/partman/initial_auto_raid_pvs # Check we have the stashed value of the first RAID dev we created db_get partman-auto-raid/raidnum diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/display.d/initial_auto_raid_lvm ./display.d/initial_auto_raid_lvm --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/display.d/initial_auto_raid_lvm 1970-01-01 01:00:00.000000000 +0100 +++ ./display.d/initial_auto_raid_lvm 2009-03-04 16:55:54.000000000 +0100 @@ -0,0 +1,58 @@ +#!/bin/sh + +#set -x + +# Apply LVM partitioning on top of a RAID preseed + +if ! [ -f /var/lib/partman/initial_auto_raid_pvs ] || + ! [ -e /lib/partman/lib/auto-lvm.sh ]; then + exit 0 +fi + +. /lib/partman/lib/auto-lvm.sh + +# pv_devices is used by auto_lvm_perform() +pv_devices="$(cat /var/lib/partman/initial_auto_raid_pvs)" +rm -f /var/lib/partman/initial_auto_raid_pvs + +db_get partman-auto/expert_recipe_file +recipe="$RET" + +nr_devices=0 +size=0 +for pv_device in $pv_devices; do + dev="$(dev_to_partman $pv_device)" + [ -f $dev/size ] || exit 1 + size=$(($size + $(cat $dev/size))) + nr_devices=$(($nr_devices + 1)) +done + +if [ $nr_devices -eq 1 ]; then + dev="$(dev_to_partman $pv_devices)" + target="$(humandev $(cat $dev/device)) - $(cat $dev/model)" +else + for pv_device in $pv_devices; do + dev="$(dev_to_partman $pv_device)" + target="${target:+$target }$(cat $dev/device)" + done + target="Multiple disks ($target)" +fi +target="$target: $(longint2human $size)" +free_size=$(expr 0000000"$size" : '0*\(..*\)......$') # convert to megabytes + +choose_recipe lvm "$target" "$free_size" || return $? + +# Do nothing if there is no "lvmok" partitions. +if ! echo "$scheme" | grep -q lvmok; then + exit 0 +fi + +expand_scheme + +# Be sure the modules are loaded +modprobe dm-mod >/dev/null 2>&1 || true +modprobe lvm-mod >/dev/null 2>&1 || true + +auto_lvm_create_vg_map +auto_lvm_perform + diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/display.d/_numbers ./display.d/_numbers --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/display.d/_numbers 2008-08-09 21:26:07.000000000 +0200 +++ ./display.d/_numbers 2009-02-23 17:03:09.000000000 +0100 @@ -1,2 +1,3 @@ 50 initial_auto_raid 55 initial_auto_raid_fs +56 initial_auto_raid_lvm diff -aburN -x .svn /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/README ./README --- /home/plb/debian/sources/official/lenny/partman/partman-auto-raid-14/README 2008-08-09 21:26:07.000000000 +0200 +++ ./README 2009-02-23 17:03:09.000000000 +0100 @@ -23,3 +23,64 @@ -- Simon Huggins <hug...@earth.li> sponsored by Black Cat Networks http://www.blackcatnetworks.co.uk/ + +It is also possible to preseed LVM over RAID. The following example will +create a RAID 1 setup on two hard drives with: + + /dev/md0 as /boot (ext3) + /dev/md1 as a LVM physical volume + /dev/mapper/<hostname>-root as / (ext3) + /dev/mapper/<hostname>-swap_1 as swap + /dev/mapper/<hostname>-home as /home (ext3) + +--- 8< --- +d-i partman-auto/method string raid + +d-i partman-auto/disk string /dev/sda /dev/sdb + +d-i partman-auto-raid/recipe string \ + 1 2 0 ext3 /boot \ + /dev/sda1#/dev/sdb1 \ + . \ + 1 2 0 lvm - \ + /dev/sda5#/dev/sdb5 \ + . + +# Please note that RAID partitions are tagged as "lvmignore" +# and LVM logical volumes as "defaultignore" and "lvmok". +d-i partman-auto/expert_recipe string \ + multiraid :: \ + 100 512 256 raid \ + $lvmignore{ } \ + $primary{ } \ + method{ raid } \ + . \ + 900 5000 4000 raid \ + $lvmignore{ } \ + method{ raid } \ + . \ + 700 5000 4000 ext3 \ + $defaultignore{ } \ + $lvmok{ } \ + method{ format } \ + format{ } \ + use_filesystem{ } \ + filesystem{ ext3 } \ + mountpoint{ / } \ + . \ + 64 512 300% linux-swap \ + $defaultignore{ } \ + $lvmok{ } \ + method{ swap } \ + format{ } \ + . \ + 100 1000 1000000000 ext3 \ + $defaultignore{ } \ + $lvmok{ } \ + method{ format } \ + format{ } \ + use_filesystem{ } \ + filesystem{ ext3 } \ + mountpoint{ /home } \ + . +--- >8 ---