diff --git a/Makefile b/Makefile index 062d5cdb..c91a06aa 100644 --- a/Makefile +++ b/Makefile @@ -127,6 +127,7 @@ install: bcachefs $(INSTALL) -m0644 -D bcachefs.8 -t $(DESTDIR)$(PREFIX)/share/man/man8/ $(INSTALL) -m0755 -D initramfs/script $(DESTDIR)$(INITRAMFS_SCRIPT) $(INSTALL) -m0755 -D initramfs/hook $(DESTDIR)$(INITRAMFS_HOOK) + $(INSTALL) -m0755 -D mount.bcachefs.sh $(DESTDIR)$(ROOT_SBINDIR) sed -i '/^# Note: make install replaces/,$$d' $(DESTDIR)$(INITRAMFS_HOOK) echo "copy_exec $(ROOT_SBINDIR)/bcachefs /sbin/bcachefs" >> $(DESTDIR)$(INITRAMFS_HOOK) diff --git a/mount.bcachefs.sh b/mount.bcachefs.sh new file mode 100755 index 00000000..b75fbf8b --- /dev/null +++ b/mount.bcachefs.sh @@ -0,0 +1,50 @@ +#!/bin/bash + +join_by() +{ + local IFS="$1" + shift + echo "$*" +} + +args=$(getopt -u -o 'sfnvo:t:N:' -n 'mount.bcachefs' -- "$@") +if [ $? -ne 0 ]; then + echo 'Terminating...' >&2 + exit 1 +fi + +read -r -a argv <<< "$args" + +for i in ${!argv[@]}; do + [[ ${argv[$i]} == '--' ]] && break +done + +i=$((i+1)) + +if [[ $((i + 2)) < ${#argv[@]} ]]; then + echo "Insufficient arguments" + exit 1 +fi + +UUID=${argv[$i]} + +if [[ ${UUID//-/} =~ ^[[:xdigit:]]{32}$ ]]; then + PARTS=() + + for part in $(tail -n +3 /proc/partitions|awk '{print $4}'); do + uuid_line=$(bcachefs show-super /dev/$part|& head -n1) + + if [[ $uuid_line =~ $UUID ]]; then + PARTS+=(/dev/$part) + fi + done + + if [[ ${#PARTS[@]} == 0 ]]; then + echo "uuid $UUID not found" + exit 1 + fi + + argv[$i]=$(join_by : "${PARTS[@]}") +fi + +exec mount -i -t bcachefs ${argv[@]}