X-Git-Url: https://iankelling.org/git/?a=blobdiff_plain;f=mount-latest-subvol;h=091cf44448d4cace3675056a015f179f9cfa2989;hb=28d76e1e82027ad40d7ec48ff68839f1f035b7b1;hp=6a714d1a791ff8a67d4901f9654b5a049f93ccfd;hpb=7002af6b587b8d66d1f3b58ae77f09fa3d794d15;p=distro-setup diff --git a/mount-latest-subvol b/mount-latest-subvol index 6a714d1..091cf44 100644 --- a/mount-latest-subvol +++ b/mount-latest-subvol @@ -1,4 +1,19 @@ #!/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. + + [[ $EUID == 0 ]] || exec sudo -E "$BASH_SOURCE" "$@" @@ -44,55 +59,37 @@ bash-trace() { } 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 first_root_crypt=$(awk '$2 == "/" {print $1}' /etc/mtab) tu /etc/fstab </dev/null; then continue @@ -104,17 +101,19 @@ for vol in q p; do 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)) + # example + # /q/p /p none bind 0 0 + 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 + # 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 @@ -134,6 +133,7 @@ for vol in q p; do unmounted+=($dir) else umount_ret=false + ret=1 echo "$0: failed to umount $dir" break fi @@ -142,9 +142,8 @@ for vol in q p; do if ! $umount_ret; then for dir in ${unmounted[@]}; do - mount $dir + mnt $dir done - ret=1 continue fi @@ -157,7 +156,49 @@ for vol in q p; do # 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 <