Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
# This is a preseed partman recipe that will later allow the created on # LVM-on-software-RAID, somethat that wasn't possible directly in the # preseed at the time (~2003)
# This is a preseed partman recipe that will later allow the created on
# LVM-on-software-RAID, somethat that wasn't possible directly in the
# preseed at the time (~2003)
d-i lvmcfg/activevg boolean false
d-i lvmcfg/vgdelete_names select vg00
d-i lvmcfg/vgcreate_name string vg00
d-i lvmcfg/vgdelete_confirm boolean true
d-i partman-auto/method string lvm
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-md/confirm boolean true
d-i partman-auto/disk string /dev/sda
# the entire drive has to be allocated using a preseed partman recipe,
# so create “/tmp/removeme” at the end to leave some free space in the VG
d-i partman-auto/expert_recipe string host3 ::
200 200 200 ext3 \
$primary{ } $bootable{ } \
method{ format } format{ } \
use_filesystem{ } \
filesystem{ ext3 } \
mountpoint{ /boot } . \
512 512 512 \
linux-swap $primary{ } \
method{ swap } \
format{ } . \
100 1000000 1000000000 ext3 \
method{ lvm } \
use_filesystem{ } \
format{ } \
vg_name{ vg00 } . \
5120 5120 5120 ext3 \
$lvmok{ } \
in_vg{ vg00 } \
lv_name{ usr } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext3 } \
mountpoint{ /usr } . \
5120 5120 5120 ext3 \
$lvmok{ } \
in_vg{ vg00 } \
lv_name{ slash } \
method{ format } \
use_filesystem{ } \
filesystem{ ext3 } \
mountpoint{ / } . \
5120 5120 5120 ext3 \
$lvmok{ } \
in_vg{ vg00 } \
lv_name{ var } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext3 } \
format{ } \
mountpoint{ /var } . \
2048 2048 2048 ext3 \
$lvmok{ } \
in_vg{ vg00 } \
lv_name{ tmp } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext3 } \
mountpoint{ /tmp } . \
512 512 512 ext3 \
$lvmok{ } \
in_vg{ vg00 } \
lv_name{ home } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext3 } \
mountpoint{ /home } . \
512 61440 1000000000 ext3 \
$lvmok{ } \
in_vg{ vg00 } \
lv_name{ removeme } \
method{ format } \
format{ } \
use_filesystem{ } \
filesystem{ ext3 } \
mountpoint{ /tmp/removeme } . \
d-i partman/confirm_write_new_label boolean true
d-i partman/choose_partition select finish
d-i partman/choose_partition select Finish partitioning and write changes to disk
d-i partman/confirm boolean true
#!/bin/bash
# Once the base OS is installed, the machine reboots; the admin then logs in as root using
# a known password defined in the preseed, changes the password, and then runs partman.sh
# to start the final configuration process.
#
# If there were such a thing as the Hack of the Year award, this config script would have
# been a contender. Since drive SDA is in use, we can’t effectively release it for
# partitioning until we reboot using the other drive. We’ve already created our LVM setup
# using the preseed; this script:
#
# 1. creates broken software RAID mirrors using only the partitions in SDB (creating md0
# and md1 as RAID devices),
# 2. migrates the data in /boot from sda1 to md0,
# 3. initializes md1 as a physical volume for LVM,
# 4. migrates the physical extents from PV sda2 to PV md1,
# 5. removes PV sda2 from the volume group,
# 6. removes references to sda in fstab,
# 7. runs the bootloader to rebuild the initrd with the software RAID module, and
# 8. reboots to fully release sda.
#
# Remember, this was all to get around the fact that you can’t create LVM-on-software-RAID
# using a preseed.
#
# Also, at the time this was written, booting LVM from GRUB was as bad idea, if it was
# even possible.
#
# enable the boot log
sed -i -e "s/BOOTLOGD_ENABLE=No/BOOTLOGD_ENABLE=Yes/" /etc/default/bootlogd
# deactive all swap partitions so we're not holding any open, then delete
# the swap line on sda to free the disk for repartitioning later
swapoff -a
sed -i -e "/swap/d" /etc/fstab
# remove the dummy LV to speed the PV migration
umount /tmp/removeme
rm -rf /tmp/removeme
sed -i -e "/removeme/d" /etc/fstab
lvchange -a n /dev/vg00/removeme
lvremove /dev/vg00/removeme
# partition SDB
sfdisk /dev/sdb << EOF
,24,fd,*
,62,82
,,fd
EOF
# SDB needs swap, and RAID partitions
# create md1 first to ensure it's ready when we provision it as a PV mkswap /dev/sdb2
echo "/dev/sdb2 none swap sw 0 0" >>/etc/fstab
mdadm -C /dev/md1 --run -n 2 -l 1 /dev/sdb3 missing
mdadm -C /dev/md0 --run -n 2 -l 1 /dev/sdb1 missing
# sleep for a bit to ensure arrays created
sleep 10
# migrate the LVs from SDA to SDB
pvcreate /dev/md1
vgextend vg00 /dev/md1
pvmove /dev/sda5
vgreduce vg00 /dev/sda5
pvremove /dev/sda5
# resize /home
lvextend -L 60g /dev/vg00/home
resize2fs /dev/vg00/home
# copy /boot to SDB
mke2fs -j /dev/md0
mount /dev/md0 /mnt/
cp -ax /boot/* /mnt/
umount /boot
umount /mnt
mount /dev/md0 /boot
sed -i -e 's/sda1/md0/' /etc/fstab
# wipe SDA's partition table
dd if=/dev/zero of=/dev/sda count=1 bs=512
# setup mdadm.conf
echo "DEVICE partitions" >/etc/mdadm/mdadm.conf
echo "CREATE owner=root group=disk mode=0660 auto=yes" >>/etc/mdadm/mdadm.conf
echo "HOMEHOST <system>" >>/etc/mdadm/mdadm.conf
echo "MAILADDR user1@domain.com,user2@domain.com" >>/etc/mdadm/mdadm.conf
mdadm --detail --scan >>/etc/mdadm/mdadm.conf
# fix a known bug in mdadm - "--detail --scan" outputs metadata version 00.90, should be 0.90
sed -i -e "s/metadata=00.90/metadata=0.90/" /etc/mdadm/mdadm.conf
# rebuild the ramdisk to include the MDADM module update-initramfs -uk all
lilo -H
# reboot
shutdown -r now
#!/bin/bash
# This script duplicates the partition table from sdb to sda, then adds the RAID
# components from SDA to the mirror set. LVM metadata is stored on the RAID set, so we
# don’t need to worry about losing any configs in that regard.
#
# This is can be run manually after a reboot, but automated in some other way
# add SDA to the RAID mirrors
sfdisk -d /dev/sdb | sfdisk /dev/sda
echo "/dev/sda2 none swap sw 0 0" >>/etc/fstab
mdadm -a /dev/md0 /dev/sda1
mdadm -a /dev/md1 /dev/sda3
sleep 10
lilo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment