Conditional partitioning in debian installer
I needed to create an automatic, unattended installer that would repartition the whole disk, but keep an existing home partition if it is already existing. The idea is to replace the operating system, but keep the user's home files. If the home partition does not exist, however, we need to create it.
The starting point for this is in Holger's website, which does everything except create the partition if it's missing.
The technique I used is to
create a udeb that would scan the partitions using
/usr/lib/partconf/find-partitions and then load the
right preseeding for partman-auto, the automatic
partitioner.
Here you find the udeb source. I'll comment the most important bits:
First, the two partman-auto recipes that we are
going to preseed. The format
is documented in the debian-installer documentation.
This will create /home if missing:
d-i partman-auto/expert_recipe string \
condpart :: \
2048 2048 2048 ext3 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext3 } \
mountpoint{ / } \
. \
1024 1024 1024 linux-swap \
method{ swap } format{ } \
. \
1024 4096 10000000 ext3 \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext3 } \
mountpoint{ /home } \
.
And this will keep /home if it exists:
d-i partman-auto/expert_recipe string \
condpart :: \
2048 2048 2048 ext3 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } filesystem{ ext3 } \
mountpoint{ / } \
. \
1024 1024 1024 linux-swap \
method{ swap } format{ } \
. \
1024 4096 10000000 ext3 \
method{ keep } \
use_filesystem{ } filesystem{ ext3 } \
mountpoint{ /home } \
.
Then the postinst file of the package, where the
logic is. Otavio and Daniel on #debian-boot have
taught me that udebs are, simply put, just big postinsts (installer
wise, apart from shipping binaries). Postinst is where the logic is
done, or applications are started.
#!/bin/sh # Copyright 2008 Enrico Zini <enrico@truelite.it> # Licensed under the terms of the GNU General Public License, # version 3 or any later version. set -e FINDPARTS="/usr/lib/partconf/find-partitions" notice () { logger -t condpart "$@" } error () { logger -t condpart "error: $@" } # load debconf . /usr/share/debconf/confmodule notice "Checking if we need to recreate /home" if [ ! -x $FINDPARTS ] then error "$FINDPARTS not found" exit 1 fi if $FINDPARTS | grep -q part6 then # Keep notice "/home exists: we keep it" debconf-set-selections /usr/lib/condpart/part-keep.preseed else # Format notice "/home does not exist: we create it" debconf-set-selections /usr/lib/condpart/part-create.preseed fi notice "Finished special handling of /home" #DEBHELPER# exit 0
Finally, debian/control. The basic bits about
creating a d-i udeb are to put it in Section:
debian-installer and to use XC-Package-Type:
udeb. Then there is XB-Installer-Menu-Item,
that defines the order of execution of postinsts. The d-i
documentation
lists the numbers that are currently assigned.
Source: condpart Section: debian-installer Priority: optional Maintainer: Enrico Zini <enrico@debian.org> Build-Depends: debhelper (>= 4.0.0), cdbs Standards-Version: 3.7.2.1 Package: condpart Architecture: any XC-Package-Type: udeb XB-Installer-Menu-Item: 38 Description: Conditional partitioning Tells partman-auto to create /home if it's missing, or if it exists, to keep it.
I am using 38 rather than 3800 because I'm targeting etch d-i. After etch, "numbers have been multiplied by 100 from what they were before to give us more space".
This is it. debian/rules is just boilerplate,
except installing the preseed files in the right place. CDBS is
useful to make this self-evident:
#!/usr/bin/make -f include /usr/share/cdbs/1/rules/debhelper.mk install/condpart:: install -o root -g root -m 0644 *.preseed debian/$(cdbs_curpkg)/usr/lib/condpart/
To build the installer CD with this d-i, I'm using simple-cdd; here are the profile files I'm using at the moment, with the main preseeding for fully unattended install (it is designed to trash your hard disk if you boot it, so only test it in an emulated environment) and the inclusion of the custom udeb.