various changes for libreboot having no pxe
[automated-distro-installer] / fai / config / hooks / partition.DEFAULT
index aa7440968b8eaca3cde4c43672a69ad5825441c0..f6132268ba1ed63738e8342aa6846d1ec89703e0 100755 (executable)
@@ -1,4 +1,19 @@
 #!/bin/bash -x
+# Copyright (C) 2016 Ian Kelling
+
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
 
 set -eE -o pipefail
 trap 'echo "$0:$LINENO:error: \"$BASH_COMMAND\" returned $?" >&2' ERR
@@ -14,13 +29,13 @@ rootn=1
 swapn=2
 bootn=3
 bios_grubn=4
-boot_mib=1500
+boot_mib=4000
 
 
 ##### end configuration
 
 
-add-part() {
+add-part() { # add partition suffix to $dev
     local d ret
     if [[ $# == 1 ]]; then
         d=$dev
@@ -145,15 +160,23 @@ for dev in ${devs[@]}; do
 done
 
 if [[ ! $DISTRO ]]; then
-    if ifclass STABLE; then
+    if ifclass STABLE_BOOTSTRAP; then
+        DISTRO=debianstable_bootstrap
+    elif ifclass STRETCH64; then
+        DISTRO=debiantesting
+    elif ifclass STABLE; then
         DISTRO=debianstable
+    elif ifclass XENIAL64; then
+        DISTRO=ubuntuxenial
+    elif ifclass BELENOS64; then
+        DISTRO=trisquelbelenos
     else
-        DISTRO=debiantesting
+        echo "PARTITIONER ERROR: no distro class/var set" >&2
+        exit 1
     fi
 fi
 
 
-
 case ${#boot_devs[@]} in
     # need double the space if we are raid 10, and then
     # might as well give some extra overhead.
@@ -227,14 +250,14 @@ if $partition; then
         swap_end=$(( root_end + swap_mib))
 
         parted -s $dev mklabel gpt
-        # gpt ubuntu cloud image uses ~4. fai uses 1 MiB.
-        # I read something in the parted manual saying cheap flash media
-        # likes to start at 4.
         # MiB because parted complains about alignment otherwise.
         pcmd="parted -a optimal -s -- $dev"
         $pcmd mkpart primary "ext3" 4MiB ${root_end}MiB
         $pcmd mkpart primary "linux-swap" ${root_end}MiB ${swap_end}MiB
         $pcmd mkpart primary "" ${swap_end}MiB ${disk_mib}MiB
+        # gpt ubuntu cloud image uses ~4. fai uses 1 MiB.
+        # I read something in the parted manual saying cheap flash media
+        # likes to start at 4.
         $pcmd mkpart primary "" 1MiB 4MiB
         $pcmd set $bios_grubn bios_grub on
         $pcmd set $bootn boot on # generally not needed on modern systems
@@ -267,7 +290,7 @@ if $partition; then
         cryptsetup luksOpen `rootdev` `root-cryptname` \
                    --key-file $luks_dir/host-$HOSTNAME
     done
-    ls -la /dev/btrfs-control
+    ls -la /dev/btrfs-control # this was probably for debugging...
     sleep 1
     bpart $(for dev in ${devs[@]}; do root-cryptdev; done)
     bpart ${boot_devs[@]}
@@ -279,85 +302,140 @@ else
     sleep 1
 fi
 
-mount -o subvolid=0 $first_root_crypt /mnt
-# systemd creates subvolumes we want to delete.
-s=($(btrfs subvolume list --sort=-path /mnt |
-         sed -rn "s#^.*path\s*(root_$DISTRO/\S+)\s*\$#\1#p"))
-for subvol in ${s[@]}; do btrfs subvolume delete /mnt/$subvol; done
-btrfs subvolume set-default 0 /mnt
-[[ ! -e /mnt/root_$DISTRO ]] || btrfs subvolume delete /mnt/root_$DISTRO
 
-## create subvols ##
-cd /mnt
-btrfs subvolume create root_$DISTRO
-[[ -e q ]] || btrfs subvolume create q
-chown root:1000 q
-
-mkdir -p /mnt/root_$DISTRO/boot
-for x in q/a q/i; do
-    mkdir -p $x
-    chown 1000:1000 $x
-    chmod 755 $x
-done
-# could set default like this, but no reason to.
-# btrfs subvolume set-default \
-    #       $(btrfs subvolume list . | grep "root_$DISTRO$" | awk '{print $2}') .
-chattr -Rf +C root_$DISTRO
-cd /
-umount /mnt
+if [[ $DISTRO != debianstable_bootstrap ]]; then
+    # bootstrap distro doesn't use separate encrypted root.
+    mount -o subvolid=0 $first_root_crypt /mnt
+    # systemd creates subvolumes we want to delete.
+    s=($(btrfs subvolume list --sort=-path /mnt |
+             sed -rn "s#^.*path\s*(root_$DISTRO/\S+)\s*\$#\1#p"))
+    for subvol in ${s[@]}; do btrfs subvolume delete /mnt/$subvol; done
+    btrfs subvolume set-default 0 /mnt
+    [[ ! -e /mnt/root_$DISTRO ]] || btrfs subvolume delete /mnt/root_$DISTRO
+
+    ## create subvols ##
+    cd /mnt
+
+    btrfs subvolume create root_$DISTRO
+    [[ -e q ]] || btrfs subvolume create q
+    chown root:1000 q
+
+    mkdir -p /mnt/root_$DISTRO/boot
+    for x in q/a q/i; do
+        mkdir -p $x
+        chown 1000:1000 $x
+        chmod 755 $x
+    done
+    # could set default like this, but no reason to.
+    # btrfs subvolume set-default \
+        #       $(btrfs subvolume list . | grep "root_$DISTRO$" | awk '{print $2}') .
+
+    # no cow on the root filesystem. it's setup is fully scripted,
+    # (immutable in buzzwords). if it messes up, we will just recreated it,
+    # and we can get better perf with this.
+    # I can't remember exactly why, but this is preferable to mounting with
+    # -o nodatacow, I think because subvolumes inherit that.
+    chattr -Rf +C root_$DISTRO
+    cd /
+    umount /mnt
+fi
+
 mount -o subvolid=0 $first_boot_dev /mnt
 cd /mnt
 btrfs subvolume set-default 0 /mnt
-[[ ! -e /mnt/boot_$DISTRO ]] || btrfs subvolume delete /mnt/boot_$DISTRO
-btrfs subvolume create boot_$DISTRO
+
+# for libreboot systems
+mkdir -p /mnt/grub2
+cat >/mnt/grub2/libreboot_grub.cfg <<'EOF'
+#!/bin/sh
+# shebang is for editor file mode detection only
+
+if [ -s $prefix/grubenv ]; then
+    load_env
+fi
+
+set default="0"
+set timeout=1
+
+menuentry debianstable_bootstrap {
+    configfile /$1/boot/grub/grub.cfg
+}
+
+for dir in /boot_*; do
+    if [ x$dir = x$default_subvol ]; then
+        default=default_id
+        menuentry $dir --id=default_id {
+            configfile $1/grub/grub.cfg
+        }
+    else
+        menuentry $dir {
+            configfile $1/grub/grub.cfg
+        }
+    fi
+done
+EOF
+
+if [[ $DISTRO == debianstable_bootstrap ]]; then
+    # this is just convenience for the libreboot_grub config
+    # so we can glob the other ones easier.
+    boot_vol=$DISTRO
+else
+    boot_vol=boot_$DISTRO
+fi
+[[ ! -e /mnt/$boot_vol ]] || btrfs subvolume delete /mnt/$boot_vol
+btrfs subvolume create $boot_vol
 cd /
 umount /mnt
 ## end create subvols ##
 
 
-# note, the mount point /a seems to get automatically created somewhere
-cat > /tmp/fai/fstab <<EOF
+if [[ $DISTRO == debianstable_bootstrap ]]; then
+    cat > /tmp/fai/fstab <<EOF
+$first_boot_dev  /  btrfs  noatime,subvol=$boot_vol  0 0
+EOF
+    cat >/tmp/fai/disk_var.sh <<EOF
+BOOT_DEVICE="${short_devs[@]}"
+ROOT_PARTITION=$first_boot_dev
+EOF
+else
+    # note, the mount point /a seems to get automatically created somewhere
+    cat > /tmp/fai/fstab <<EOF
 $first_root_crypt  /  btrfs  noatime,subvol=root_$DISTRO  0 0
 $first_root_crypt  /q  btrfs  noatime,subvol=q  0 0
 /q/a  /a  none  bind  0 0
-$first_boot_dev  /boot  btrfs  noatime,subvol=boot_$DISTRO  0 0
+$first_boot_dev  /boot  btrfs  noatime,subvol=$boot_vol  0 0
 EOF
 
-
-if ifclass treetowl; then
-    cat >> /tmp/fai/fstab <<'EOF'
+    # I will avoid using uuid in the future. the other way of specifying is simpler
+    if ifclass treetowl; then
+        cat >> /tmp/fai/fstab <<'EOF'
+$first_root_crypt  /i  btrfs  noatime,subvol=i  0 0
 UUID=3f7b31cd-f299-40b4-a86b-7604282e2715 /i btrfs  noatime  0 2
 EOF
-fi
-
-if ifclass frodo; then
-    cat >> /tmp/fai/fstab <<'EOF'
-/q/i  /i  none  bind  0 0
-EOF
-fi
+    fi
 
-swaps=()
-for dev in ${devs[@]}; do
-    swaps+=(`swap-cryptname`)
-    cat >>/tmp/fai/crypttab <<EOF
+    swaps=()
+    for dev in ${devs[@]}; do
+        swaps+=(`swap-cryptname`)
+        cat >>/tmp/fai/crypttab <<EOF
 `root-cryptname`  `rootdev`  none  keyscript=/root/keyscript,discard,luks
 `swap-cryptname` `swapdev`  /dev/urandom  swap,cipher=aes-xts-plain64,size=256,hash=ripemd160
 EOF
-    cat >> /tmp/fai/fstab <<EOF
+        cat >> /tmp/fai/fstab <<EOF
 `swap-cryptdev`  none  swap  sw  0 0
 EOF
-done
-
-# fai would do this:
-#BOOT_DEVICE=\${BOOT_DEVICE:-"${devs[0]}"}
+    done
 
-# swaplist seems to do nothing.
+    # fai would do this:
+    #BOOT_DEVICE=\${BOOT_DEVICE:-"${devs[0]}"}
 
-cat >/tmp/fai/disk_var.sh <<EOF
+    # note: swaplist seems to do nothing.
+    cat >/tmp/fai/disk_var.sh <<EOF
+BOOT_DEVICE="${short_devs[@]}"
+BOOT_PARTITION=\${BOOT_PARTITION:-$first_boot_dev}
 # ROOT_PARTITIONS is added by me, used in arch setup.
 ROOT_PARTITIONS="${root_devs[@]}"
 ROOT_PARTITION=\${ROOT_PARTITION:-$first_root_crypt}
-BOOT_PARTITION=\${BOOT_PARTITION:-$first_boot_dev}
-BOOT_DEVICE="${short_devs[@]}"
 SWAPLIST=\${SWAPLIST:-"${swaps[@]}"}
 EOF
+fi