Unattended installation with preseed -- give a custom device to partman-auto

I'm doing an unattended installation of Ubuntu-14.04-server with a USB drive and a preseed file on different type of servers (HP Proliant ML110, ML310, ML350).

  • On the ML110 and ML310, the hard drive is in /dev/sda and the USB drive takes /dev/sdb.
  • While on the servers ML350, the USB drive takes the /dev/sda and the hard drive shows up in /dev/sdb.

As this should be a completely unattended installation, regardless of the server type, I need to find a way to give the correct device path to d-i partman-auto/disk.

My first idea was to force the hard drive to show up before the USB drive, allowing it to take /dev/sda on the ML350 servers ; but I didn't find a way do that.

Therefore, I made a small script that detects the device name just before partman executes, and record that in a variable $INSTALL_DEV:

d-i partman/early_command string                                  \
    for DEV in `ls /sys/block | grep sd`; do                      \
        if [ -n "`ls -l /sys/block/$DEV | grep /usb`" ]; then     \
            USB_DEV=/dev/${DEV};                                  \
            echo "USB_DEV is $USB_DEV" >> /var/log/syslog;        \
        else                                                      \
            INSTALL_DEV=/dev/${DEV};                              \
            echo "INSTALL_DEV = $INSTALL_DEV" >> /var/log/syslog; \
            break;                                                \
        fi;                                                       \
    done;                                                         \

Since then, I'm struggeling to find a way to give that variable to d-i partman-auto/disk. I thought of different alternatives but I couldn't find a way to implement one of them:

  1. Make the partma-auto/disk interpret a variable. But unfortunately it only takes a string as a value.
  2. Modify the debian-installer database where I hope the preseeded values are stored. But I didn't find the database file (neither the way to alter it).
  3. Make a script that includes a tiny preseed file with the correct device. But I can only include files from preseed/include, before the hard drive shows in /dev.

Solution 1:

Here is a simple partman/early_command that does the exactly what I wanted

d-i partman/early_command \
    string debconf-set partman-auto/disk "$(echo /dev/`ls -l /sys/block/[hs]d* | grep -v "usb" | head -n1 | sed 's/^.*\([hs]d[a-z]\+\).*$/\1/'`)"

This early-command is executed just before partman executes. It dynamically sets the value of partman-auto/disk configuration of the debian-installer.

The command between $( and ) outputs the first hard drive found that is not an USB drive.