Report abuse

In preseed:

d-i preseed/early_command string wget http://URL/autopart -P /tmp ; chmod 755 /tmp/autopart ; echo /tmp/autopart installer >> /var/lib/dpkg/info/download-installer.postinst


Contents of URL/autopart:

#!/bin/sh
#
# Manually create LVM configuration
#
# Partman does not currently support multi-disk lvm
#
# Designed to be run after download-installer but before partman-base
# This allows us to modify partman-base.postinst after it's been dropped
# in by anna
#
# Partman appears to be entirely an external program, removing the call
# to partman from partman-base.postinst prevents it from running.

# -x is useful for debugging
set -ex

# doesn't work
# exec 2>&1 | logger -t autopart

case "$1" in
    installer)
	# We should have d-i downloaded by now.  partman comes in a udeb
	# from the network so we have to hook here and replace the
	# partman-base.postinst file

	anna-install lvm2-udeb
	sed -i 's/partman/\/tmp\/autopart partman/' \
	    /var/lib/dpkg/info/partman-base.postinst
	logger -t autopart modified partman-base.postinst
	;;

    partman)
	. /usr/share/debconf/confmodule

	# do filesystem stuff: detect our config, fdisk, lvms, mount /target
	logger -t autopart Partition configuration starting
	modprobe dm_mod
	# Did I ask you to activate exising VGs and LVs? No. So fuck off.
	/sbin/vgchange -aln --ignorelockingfailure	
	for vg in $(vgdisplay |grep 'VG Name' |sed 's/.*VG Name *//'); do
	    echo y | vgremove $vg
	done

	size_sda=`sed -n 's/.* \([0-9]*\) sda$/\1/p' /proc/partitions`
	size_sdb=`sed -n 's/.* \([0-9]*\) sdb$/\1/p' /proc/partitions`
	size_hda=`sed -n 's/.* \([0-9]*\) hda$/\1/p' /proc/partitions`
	size_hdb=`sed -n 's/.* \([0-9]*\) hdb$/\1/p' /proc/partitions`

	# If we've got SCSI, it's probably used for booting.
	if [ -n "$size_sda" ]; then
	    boot_device=sda

	    # SCSI needs a delay for LVM to work
	    db_get debian-installer/add-kernel-opts
	    kopt="${RET:+$RET } rootdelay=5"
	    db_set debian-installer/add-kernel-opts "$kopt"
	else
	    boot_device=hda
	fi
	logger -t autopart Boot device is $boot_device

	if [ -n "$size_sda" ]; then
	    devices="${devices:+$devices }sda"
	fi

	if [ -n "$size_sdb" ]; then
	    devices="${devices:+$devices }sdb"
	fi

	if [ -n "$size_hda" ]; then
	    devices="${devices:+$devices }hda"
	fi

	if [ -n "$size_hdb" ]; then
	    devices="${devices:+$devices }hdb"
	fi

	for device in $devices; do
	    # Wipe any existing partition tables.  This action is
	    # COMPLETELY, UNAMBIGUOUSLY DESTRUCTIVE. So DON'T DO IT.
	    logger -t autopart Wiping /dev/$device
	    dd if=/dev/zero of=/dev/$device bs=512 count=1

	    # Create a single partition for lvm.
	    # If device == boot_device, create a partition at the
            # beginning for /boot

            if [ $device = $boot_device ]; then
                cyl=$(sfdisk -g /dev/$device | cut -d\  -f2)
                eval dev_size=\$size_$device
                # (Usually?) KB
                cyl_size=$(($dev_size/$cyl))
                sfdisk="${sfdisk:+$sfdisk },$(((128*1024)/$cyl_size)),L,*"
		pv=/dev/${device}2
	    else
		pv=/dev/${device}1
            fi

	    logger -t autopart Partitioning /dev/$device
            sfdisk="${sfdisk:+$sfdisk },,8e"
            for line in $sfdisk; do
                echo "$line"
            done | sfdisk /dev/$device
	    unset sfdisk

	    logger -t autopart Creating PV $pv
	    pvcreate $pv
	    lvm="${lvm:+$lvm }$pv"
	    dev_count=$((${dev_count:-0}+1))
        done

	logger -t autopart Creating VG
	vgcreate vgsys $lvm

	# Create and activate swap first. One for each PV.
	if [ $dev_count -gt 4 ]; then
	    swapsize=128M
	elif [ $dev_count -gt 2 ]; then
	    swapsize=256M
	else
	    swapsize=512M
	fi
	for device in $lvm; do
	    swap=$((${swap:--1}+1))
	    logger -t autopart Creating swap sw$swap on $device
	    lvcreate -L $swapsize -n sw$swap -C y vgsys $device
	    mkswap /dev/vgsys/sw$swap
	    swapon /dev/vgsys/sw$swap
	done
	unset swap

	# Then create other core filesystems
	logger -t autopart Creating LVs
	lvcreate -L 384M -n root vgsys
	lvcreate -L 256M -n tmp  vgsys
	lvcreate -L 3G   -n usr  vgsys
	lvcreate -L 1.5G -n var  vgsys

	# And format them
	logger -t autopart Formatting
	mke2fs    -L boot /dev/${boot_device}1

	mke2fs -j -L root /dev/vgsys/root
	mke2fs    -L tmp  /dev/vgsys/tmp
	mke2fs -j -L usr  /dev/vgsys/usr
	mke2fs -j -L var  /dev/vgsys/var

	# Create directory structure
	logger -t autopart Mounting
	mkdir -p /target
	mount -t ext3 /dev/vgsys/root /target
	mkdir -p /target/boot
	mount -t ext2 /dev/${boot_device}1 /target/boot
	for mountpoint in tmp usr var; do
	    mkdir -p /target/$mountpoint
	    mount /dev/vgsys/$mountpoint /target/$mountpoint
	done

	db_get debian-installer/add-kernel-opts
	# 'twould be nice to detect exist rootflags and append
	kopt="${RET:+$RET } rootflags=data=journal"
	db_set debian-installer/add-kernel-opts "$kopt"

	# Create fstab
	logger -t autopart Creating fstab
	mkdir -p /target/etc
	(
	    echo \# /etc/fstab: static file system information.
	    echo \#

	    echo
	    echo proc /proc proc defaults 0 0

	    echo
	    for device in $lvm; do	
		swap=$((${swap:--1}+1))
		echo /dev/vgsys/sw$swap none swap sw,pri=0 0 0
	    done
	    unset swap

	    echo
	    echo /dev/vgsys/root / ext3 \
		defaults,noatime,sync,data=journal,errors=remount-ro 0 1
	    echo /dev/${boot_device}1 /boot ext2 \
		defaults,ro,noatime,nodev,nosuid,sync 0 2
	    echo /dev/vgsys/tmp /tmp ext2 \
		defaults,noatime,nodev,nosuid,errors=continue 0 2
	    echo /dev/vgsys/usr /usr ext3 \
		defaults,ro,noatime,nodev,errors=remount-ro 0 2
	    echo /dev/vgsys/var /var ext3 \
		defaults,noatime,nodev,nosuid,errors=remount-ro 0 2
	) > /target/etc/fstab
	    
	;;
    *)

	echo $0: This script is destructive and should only be run as
	echo part of the debian-installer process
	;;
esac