#!/bin/bash
+# Copyright (C) 2016 Ian Kelling
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# usage: mount-latest-subvol
[[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@"
}
errcatch
-
+tu() {
+ while read -r line; do
+ file="$1"
+ grep -xFq "$line" "$file" || tee -a "$file"<<<"$line"
+ done
+}
e() { printf "%s\n" "$*"; "$@"; }
+mnt() {
+ dir=$1
+ if ! mountpoint $dir &>/dev/null; then
+ mkdir -p $dir
+ e mount $dir
+ fi
+}
ret=0
+##### begin setup fstab for subvols we care about ######
first_root_crypt=$(awk '$2 == "/" {print $1}' /etc/mtab)
tu /etc/fstab <<EOF
-$first_root_crypt /q btrfs noatime,subvol=q 0 0
-/q/a /a none bind 0 0
+$first_root_crypt /a btrfs noatime,subvol=a 0 0
EOF
case $HOSTNAME in
treetowl|x2|frodo)
tu /etc/fstab <<EOF
-$first_root_crypt /p btrfs noatime,subvol=p 0 0
+$first_root_crypt /q btrfs noatime,subvol=q 0 0
+$first_root_crypt /o btrfs noatime,subvol=o 0 0
+/q/p /p none bind 0 0
+/o/m /m none bind 0 0
EOF
;;
esac
-if [[ $HOSTNAME == treetowl ]]; then
- # partitioned it with fai partitioner outside of fai,
- # because it\'s worth it to have 1% space reserved for boot and
- # swap partitions in case I ever want to boot off those drives.
- # as root:
- # . /a/bin/fai/fai-wrapper
- # eval-fai-classfile /a/bin/fai/fai/config/class/51-multi-boot
- # fai-setclass ROTATIONAL
- # export LUKS_DIR=/q/root/luks/
- # # because the partition nums existed already
- # fai-setclass REPARTITION
- # /a/bin/fai/fai/config/hooks/partition.DEFAULT
-
- # just the first in the btrfs raid
- dev=ata-TOSHIBA_MD04ACA500_84REK6NTFS9A-part1
- tu /etc/fstab <<EOF
-/dev/mapper/crypt_dev_$dev /i btrfs noatime,subvol=i 0 0
-EOF
- tu /etc/crypttab <<EOF
-crypt_dev_$dev /dev/disk/by-id/$dev /q/root/luks/host-treetowl discard,luks
-EOF
-
-else
- tu /etc/fstab <<'EOF'
-/q/i /i none bind 0 0
-EOF
-
-fi
-
-mkdir -p /q /p /i
+##### end setup fstab for subvols we care about ######
-for vol in q p; do
+for vol in q a o; do
d=/$vol
if ! awk '{print $2}' /etc/fstab | grep -xF $d &>/dev/null; then
continue
fi
- binds=()
- roots=($d)
+ ##### begin building up list of bind mounts ######
+ binds=() # list of bind mounts
+ roots=($d) # list of bind mounts, plus the original mount
while true; do
new_roots=()
for r in ${roots[@]}; do
- # /q/a /a none bind 0 0
- new_roots+=($(sed -rn "s#^$r/\S+\s+(\S+)\s+none\s+bind\s.*#\1#" /etc/fstab))
+ # eg. when r=/q/p, for lines like
+ # /q/p /p none bind 0 0
+ # output /p
+ new_roots+=($(sed -rn "s#^$r/\S+\s+(\S+)\s+none\s+bind\s.*#\1#p" /etc/fstab))
done
(( ${#new_roots} )) || break
binds+=(${new_roots[@]})
roots=( ${new_roots[@]} )
done
+ ##### end building up list of bind mounts ######
+
+ # if latest is already mounted, make sure binds are mounted and move on
if e check-subvol-stale $d; then
for b in ${binds[@]}; do
- mount $b
+ mnt $b
done
continue
fi
unmounted+=($dir)
else
umount_ret=false
+ ret=1
echo "$0: failed to umount $dir"
break
fi
if ! $umount_ret; then
for dir in ${unmounted[@]}; do
- mount $dir
+ mnt $dir
done
- ret=1
continue
fi
# things otherwise didn't get mounted very strangely.
e btrfs sub snapshot btrbk/$last_snap $vol
for dir in $d ${binds[@]}; do
- e mount $dir
+ e mnt $dir
done
+ stale_dir=/nocow/btrfs-stale
+ rm -f $stale_dir/$d
done
+
+if [[ $HOSTNAME == treetowl ]]; then
+ # partitioned it with fai partitioner outside of fai,
+ # because it\'s worth it to have 1% space reserved for boot and
+ # swap partitions in case I ever want to boot off those drives.
+ # as root:
+ # . /a/bin/fai/fai-wrapper
+ # eval-fai-classfile /a/bin/fai/fai/config/class/51-multi-boot
+ # fai-setclass ROTATIONAL
+ # export LUKS_DIR=/q/root/luks/
+ # # because the partition nums existed already
+ # fai-setclass REPARTITION
+ # /a/bin/fai/fai/config/hooks/partition.DEFAULT
+
+ devs=(
+ ata-TOSHIBA_MD04ACA500_84REK6NTFS9A-part1
+ ata-TOSHIBA_MD04ACA500_84R2K773FS9A-part1
+ ata-TOSHIBA_MD04ACA500_8471K430FS9A-part1
+ ata-TOSHIBA_MD04ACA500_8481K493FS9A-part1
+ )
+ first=true
+ for dev in ${devs[@]}; do
+ if $first; then
+ first=false
+ tu /etc/fstab <<EOF
+/dev/mapper/crypt_dev_$dev /i btrfs noatime,subvol=i,noauto 0 0
+/dev/mapper/crypt_dev_$dev /mnt/iroot btrfs noatime,subvolid=0,noauto 0 0
+EOF
+ fi
+ tu /etc/crypttab <<EOF
+crypt_dev_$dev /dev/disk/by-id/$dev /q/root/luks/host-treetowl discard,luks
+EOF
+ if [[ ! -e /dev/mapper/crypt_dev_$dev ]]; then
+ cryptdisks_start crypt_dev_$dev
+ fi
+ done
+ # note, could do an else here and have some kind of mount for /i
+ # on other hosts.
+fi
+
exit $ret