Skip to content

Instantly share code, notes, and snippets.

@dasjoe
Created January 7, 2016 17:04

Revisions

  1. dasjoe created this gist Jan 7, 2016.
    148 changes: 148 additions & 0 deletions debootstrap_rpool.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,148 @@
    # apt-add-repository ppa:zfs-native/stable
    # apt-get update
    # apt-get install ubuntu-zfs
    # apt-get install debootstrap

    HOST=vm1
    DISKS="/dev/disk/by-id/ata-Samsung_SSD_850_EVO_120GB_S21UNSAG310692M"

    zpool create \
    -f \
    -d \
    -o ashift=13 \
    -o feature@async_destroy=enabled \
    -o feature@empty_bpobj=enabled \
    -o feature@lz4_compress=enabled \
    -o feature@spacemap_histogram=enabled \
    -o feature@enabled_txg=enabled \
    -O normalization=formD \
    -O atime=off \
    -O canmount=off \
    -O compression=lz4 \
    -O mountpoint=/ \
    -R /mnt \
    "$HOST"-rpool \
    "$DISKS"

    zfs set sync=disabled "$HOST"-rpool
    zfs create -o canmount=off -o mountpoint=none "$HOST"-rpool/ROOT
    zfs create -o canmount=noauto -o mountpoint=/ "$HOST"-rpool/ROOT/trusty
    zfs mount "$HOST"-rpool/ROOT/trusty
    zpool set bootfs="$HOST"-rpool/ROOT/trusty "$HOST"-rpool

    for disk in $DISKS; do
    parted -s "$disk" mkpart GRUB2 48s 2047s
    parted -s $disk set 2 bios_grub on
    done

    debootstrap trusty /mnt

    cat > /mnt/etc/hosts << EOF
    127.0.0.1 localhost
    127.0.1.1 $HOST
    ::1 ip6-localhost ip6-loopback
    fe00::0 ip6-localnet
    ff00::0 ip6-mcastprefix
    ff02::1 ip6-allnodes
    ff02::2 ip6-allrouters
    ff02::3 ip6-allhosts
    EOF

    for if in eth0 eth1 eth2 eth3; do
    cat > /mnt/etc/network/interfaces.d/$if << EOF
    allow-hotplug $if
    iface $if inet dhcp
    EOF
    done

    echo "$HOST" > /mnt/etc/hostname

    cat > /mnt/etc/udev/rules.d/70-zfs-grub-fix.rules << 'EOF'
    KERNEL=="sd*[a-z]1|cciss*[a-z]1", ENV{DEVTYPE}=="partition", ENV{ID_SERIAL}=="?*", SYMLINK+="$env{ID_BUS}-$env{ID_SERIAL}"
    EOF

    cat > /mnt/etc/default/grub << EOF
    GRUB_DEFAULT=0
    GRUB_HIDDEN_TIMEOUT_QUIET=true
    GRUB_TIMEOUT=5
    GRUB_DISTRIBUTOR=\`lsb_release -i -s 2> /dev/null || echo Debian\`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
    GRUB_CMDLINE_LINUX="boot=zfs rpool=$HOST-rpool"
    EOF

    cat > /mnt/etc/apt/sources.list << EOF
    deb http://de.archive.ubuntu.com/ubuntu trusty main restricted universe multiverse
    deb http://de.archive.ubuntu.com/ubuntu trusty-backports main restricted universe multiverse
    deb http://de.archive.ubuntu.com/ubuntu trusty-updates main restricted universe multiverse
    deb http://de.archive.ubuntu.com/ubuntu trusty-security main restricted universe multiverse
    EOF

    cat > /mnt/etc/apt/apt.conf.d/01norecommend << EOF
    APT::Install-Recommends "0";
    APT::Install-Suggests "0";
    EOF

    cat > /mnt/etc/resolv.conf << EOF
    nameserver 192.168.188.1
    search fritz.box
    EOF

    echo "Europe/Berlin" > /mnt/etc/timezone

    for disk in /dev/disk/by-id/ata*-part1; do ln -s $disk /dev/$(echo $disk | sed 's,.*/\(.*\)-part1,\1,g'); done

    for f in /sys /proc /dev; do mount --rbind $f /mnt/$f; done

    cat > /mnt/root/install-chroot.sh << __EOF__
    for locale in en_US.UTF-8 de_DE.UTF-8; do locale-gen \$locale; done
    grep -v rootfs /proc/mounts > /etc/mtab
    dpkg-reconfigure -f noninteractive tzdata
    apt-get update
    apt-get --yes dist-upgrade
    apt-get install --yes linux-generic-lts-wily build-essential tasksel software-properties-common
    for task in server openssh-server virt-host; do tasksel install \$task; done
    apt-add-repository --yes ppa:zfs-native/stable
    apt-get update
    apt-get --yes dist-upgrade
    apt-get install --yes ubuntu-zfs
    apt-get install --yes zfs-initramfs
    adduser --disabled-password --gecos "" username
    usermod -a -G adm,sudo username
    echo "username:password" | chpasswd
    apt-get install --yes htop
    DEBIAN_FRONTEND=noninteractive apt-get --yes -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" install grub-pc
    for disk in $DISKS; do
    grub-install \$disk
    done
    update-grub
    __EOF__

    chroot /mnt /bin/bash -x /root/install-chroot.sh

    umount /mnt/proc
    umount /mnt/sys/fs/fuse/connections
    umount /mnt/sys/kernel/*
    umount /mnt/sys/fs/cgroup/*
    umount /mnt/sys/fs/cgroup
    umount /mnt/sys/fs/pstore
    umount /mnt/sys
    umount /mnt/dev/pts
    umount /mnt/dev
    umount /mnt/tmp
    umount /mnt

    zfs inherit sync "$HOST"-rpool
    zfs snapshot "$HOST"-rpool/ROOT/trusty@installed
    zpool export "$HOST"-rpool