4

Internally, we use Ubuntu (14.04 Trusty) on our workstations, and until now we've done all of our builds by hand, including the creation of RAID/LVM/LUKS-encrypted volumes. This doesn't scale, and I'm now working to automate some of our processes to reduce the amount of "hands on" involvement required to build a fresh workstation.

Our hard disk configuration is as follows:

  • /dev/sda & /dev/sdb are both 1Tb Hard Disks partitioned identically and RAIDed
    • 1Gb Partition with RAID 1 containing ext4 filesystem mounted as /boot
    • Remainder of drive RAID 1 containing a LVM PV/VG (vg_raid)
      • 8Gb LV for swap space
      • Remainder of space - LV containing ext4 filesystem mounted as /
  • /dev/sdc 128Gb SSD
    • Single partition containing a LVM PV/VG (vg_ssd)
    • Single LV using all available space containing an ext4 filesystem which is mounted at /ssd

Partitioned in this way we have a large, redundant, root filesystem for general data storage, and a smaller partition on which files which are I/O speed sensitive can be placed (e.g. MySQL databases).

I'm trying to replicate this in a partman expert_recipe with related configuration so that it can be created by the Ubuntu installer. My main issue is that there doesn't seem to be a (working?) mechanism in the partman recipe "language" to specify that a specific LV needs to be created in a specific colume group, and which LVM physical volumes are assigned to each volume group. I had an earlier version of this configuration working without trying to partition/format/mount any volumes on /dev/sdc, but as soon as the extra "non-RAID" drive is involved, I can't seem to express what I want in the partman recipe.

The relevant portion of my preseed.cfg file is as follows:

d-i partman-auto/disk string /dev/sda /dev/sdb /dev/sdc
d-i partman-auto/method string raid
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/new_vg_name string vg_raid vg_ssd
d-i partman-auto-lvm/guided_size string max
d-i partman-auto/expert_recipe string                              \
      boot-root ::                                                 \
              512 10 1024 raid                                     \
                      $primary{ } $lvmignore{ } $bootable{ }       \
                      method{ raid }                               \
                      device{ /dev/sda /dev/sdb }                  \
                      vg_name{ vg_raid }                           \
              .                                                    \
              4096 20 -1 raid                                      \
                      $primary{ } $lvmignore{ }                    \
                      method{ raid }                               \
                      device{ /dev/sda /dev/sdb }                  \
              .                                                    \
              2048 20 -1 lvm                                       \
                      $primary{ }                                  \
                      $defaultignore{ }                            \
                      method{ lvm }                                \
                      device{ /dev/sdc }                           \
                      vg_name{ vg_ssd }                            \
              .                                                    \
              8192 100 -1 ext4                                     \
                      $defaultignore $lvmok{ }                     \
                      in_vg{ vg_raid }                             \
                      lv_name{ lv_root }                           \
                      method{ format } format{ }                   \
                      use_filesystem{ } filesystem{ ext4 }         \
                      mountpoint{ / }                              \
                      device{ /dev/sda /dev/sdb }                  \
              .                                                    \
              4096 100 100% linux-swap                             \
                      $defaultignore $lvmok{ }                     \
                      in_vg{ vg_raid }                             \
                      lv_name{ lv_swap }                           \
                      method{ swap } format{ }                     \
                      device{ /dev/sda /dev/sdb }                  \
              .                                                    \
              2048 100 -1 ext4                                     \
                      $defaultignore $lvmok{ }                     \
                      method{ format } format{ }                   \
                      use_filesystem{ } filesystem{ ext4 }         \
                      device{ /dev/sdc }                           \
                      in_vg{ vg_ssd }                              \
                      lv_name{ lv_ssd }                            \
                      mountpoint{ /ssd }                           \
              .                                                    \
d-i partman-auto-raid/recipe string                              \
    1 2 0 ext4 /boot  /dev/sda1#/dev/sdb1                    .   \
    1 2 0 lvm  -      /dev/sda2#/dev/sdb2                    .
d-i partman-partitioning/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
d-i partman-lvm/confirm boolean true
d-i partman-md/confirm boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman-md/confirm_nooverwrite boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman/mount_style select label

You'll note that I've tried to be quite specific about which partitions/volumes are to be placed on which disks, but partman doesn't seem to honor at least some of that configuration. I've also kept the minimum volume sizes fairly small while I test this configuration on a VM. When I run an install with this configuration onto a VirtualBox VM with smaller drives, the install fails with the error message:

Error while setting up RAID
An unexpected error occurred while setting up a preseeded RAID configuration.

Check /var/log/syslog or see virtual console 4 for the details.

The relevant section from syslog is as follows:

Jan 13 02:41:54 md-devices: mdadm: No arrays found in config file or automatically
Jan 13 02:41:54 partman:   No matching physical volumes found
Jan 13 02:41:54 partman:   Reading all physical volumes.  This may take a while...
Jan 13 02:41:54 partman:   
Jan 13 02:41:54 partman: No volume groups found
Jan 13 02:41:54 partman: 
Jan 13 02:41:54 partman-lvm:   
Jan 13 02:41:54 partman-lvm: No volume groups found
Jan 13 02:41:54 partman-lvm: 
Jan 13 02:41:56 partman-auto: Available disk space (4294) too small for expert recipe (4608); skipping
Jan 13 02:41:57 kernel: [   91.295036] Adding 2095100k swap on /dev/sdc5.  Priority:-1 extents:1 across:2095100k FS
Jan 13 02:41:57 partman: mke2fs 1.42.9 (4-Feb-2014)
Jan 13 02:41:57 apt-install: Queueing package mdadm for later installation
Jan 13 02:41:57 partman-auto-raid: Error: No recipe specified in partman-auto-raid/recipe

I suspect the line 4th from the bottom is most relevant, as you can see that partman has gone ahead and created swap space on /dev/sdc, which wasn't what I wanted.

I've tried a number of variations of how partitions are specified. I've Googled a lot for versions terms relating to partman recipes and preseed in general, and I can't find a canonical reference for the different configuration options in a recipe and why they're applicable. I've found a number of RAID examples, and many LVM examples, but nothing that mixes the two in the way I'm trying to use them. This thread from the debian-user mailing list suggests that what I want to do isn't possible, and that seem to track with my impression that the partman recipe language doesn't have the tools required to describe what I'm trying to acheive.

If anyone can point out what I'm doing wrong with my configuration, or even just some good reference materials on partman expert_recipe and the configuration language involved, that'd be most appreciated. At this point it looks like I can automate my entire install, except for the partitioning portion, which is really the main thing I wanted to automate!

1 Answer 1

0

Using preseed file to create raid+lvm is tricky. Basically, you cannot create a flexible configuration file using preseed. It is not simple and flow as a kickstart in RedHat/CentOS.

For me, I had to create custom commands using preseed_early syntax. You can change is as you like, regarding your configuration. The main goal is to create RAID array before the partitioner starts. Setup daemon will as you that no /boot partition is defined, ignore this. Tested on Debian 9

So we have four disks

/dev/sda1 and /dev/sdb1 is a RAID1 mirror -> /dev/md0
/dev/sda2 and /dev/sdb2 is a RAID0 stripe. -> /dev/md1
/dev/sdc1 and /dev/sdd1 is a RAID1 mirror. -> /dev/md2

on md0 he have a /boot partition
on md1 we have a swap file
on md2 is a / root.

so the preseed file is the following:

d-i partman-auto/disk string /dev/md0 /dev/md1 /dev/md2
d-i partman-auto/method string lvm

d-i partman-auto/expert_recipe string                         \
            1 1 -1 lvm                                        \
                $defaultignore{ }                             \
                $primary{ } \
                device{ /dev/md0 }                            \
                method{ lvm }                                 \
                vg_name{ vg00 }                               \
            .                                                 \
            1 1 -1 lvm                                        \
                $defaultignore{ }                             \
                $primary{ }                                   \
                device{ /dev/md1 }                            \
                method{ lvm }                                 \
                vg_name{ vg01 }                               \
            .                                                 \
            1 1 -1 lvm                                        \
                $defaultignore{ }                             \
                $primary{ }                                   \
                device{ /dev/md2 }                            \
                method{ lvm }                                 \
                vg_name{ vg02 }                               \
            .                                                 \
            512 512 512 ext4                                  \
                $lvmok{ }                                     \
                in_vg{ vg00 }                                 \
                lv_name{ lv_boot }                            \
                method{ format } format{ }                    \
                use_filesystem{ } filesystem{ ext4 }          \
                mountpoint{ /boot }                           \
            .                                                 \
            512 1024 1024 linux-swap                          \
                $lvmok{ }                                     \
                in_vg{ vg02 }                                 \
                lv_name{ lv_swap }                            \
                method{ swap } format{ }                      \
            .                                                 \
            1000 9000 9000 ext4                               \
                $lvmok{ }                                     \
                in_vg{ vg01 }                                 \
                lv_name{ lv_root }                            \
                method{ format } format{ }                    \
                use_filesystem{ } filesystem{ ext4 }          \
                mountpoint{ / }                               \
            .

d-i grub-installer/bootdev  string /dev/sda /dev/sdb

d-i preseed/early_command string /bin/killall.sh;\
/bin/netcfg;\

    echo "o# clear the in memory partition table" >> /tmp/fdisk1;\
    echo "n# create new partition" >> /tmp/fdisk1;\
    echo "p# type primary" >> /tmp/fdisk1;\
    echo "1# no. of partition" >> /tmp/fdisk1;\
    echo " # default" >> /tmp/fdisk1;\
    echo "+512M# partition size" >> /tmp/fdisk1;\
    echo "t# partition type" >> /tmp/fdisk1;\
    echo "fd# Linux RAID" >> /tmp/fdisk1;\
    echo "w# write changes" >> /tmp/fdisk1;\

    echo "n# create new partition" >> /tmp/fdisk2;\
    echo "p# type primary" >> /tmp/fdisk2;\
    echo "2# no. of partition" >> /tmp/fdisk2;\
    echo " # default" >> /tmp/fdisk2;\
    echo " # partition size" >> /tmp/fdisk2;\
    echo "t# partition type" >> /tmp/fdisk2;\
    echo "2# no. of partition" >> /tmp/fdisk2;\
    echo "fd# Linux RAID" >> /tmp/fdisk2;\
    echo "w# write changes" >> /tmp/fdisk2;\

    echo "o# clear the in memory partition table" >> /tmp/fdisk3;\
    echo "n# create new partition" >> /tmp/fdisk3;\
    echo "p# type primary" >> /tmp/fdisk3;\
    echo "1# no. of partition" >> /tmp/fdisk3;\
    echo " # default" >> /tmp/fdisk3;\
    echo " # partition size" >> /tmp/fdisk3;\
    echo "t# partition type" >> /tmp/fdisk3;\
    echo "fd# Linux RAID" >> /tmp/fdisk3;\
    echo "w# write changes" >> /tmp/fdisk3;\

cat /tmp/fdisk1 | grep -o '^[^#]*' | fdisk /dev/sda;\
cat /tmp/fdisk1 | grep -o '^[^#]*' | fdisk /dev/sdb;\
cat /tmp/fdisk2 | grep -o '^[^#]*' | fdisk /dev/sda;\
cat /tmp/fdisk2 | grep -o '^[^#]*' | fdisk /dev/sdb;\
/sbin/mdadm --create /dev/md0 --metadata=1.2 --auto=mdp \
--raid-devices=2 --level=1 /dev/sda1 /dev/sdb1;\

cat /tmp/fdisk3 | grep -o '^[^#]*' | fdisk /dev/sdc;\
cat /tmp/fdisk3 | grep -o '^[^#]*' | fdisk /dev/sdd;\
/sbin/mdadm --create /dev/md1 --metadata=1.2 --auto=mdp \
--raid-devices=2 --level=1 /dev/sdc1 /dev/sdd1;\

/sbin/mdadm --create /dev/md2 --metadata=1.2 --auto=mdp \
--raid-devices=2 --level=0 /dev/sda2 /dev/sdb2;\

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .