diff options
author | Uwe Kleine-König <u.kleine-koenig@pengutronix.de> | 2020-10-06 11:19:13 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-11-18 15:29:19 +0100 |
commit | efeba0875ed181e7c1c7915742a3868799604d0c (patch) | |
tree | 3b95e86798d0e49b388be8d3bea30c1ce1ebc082 | |
parent | cf8a7fcbb54a36af6e10c7cd29f9afa905083ec1 (diff) |
Add an ubifs mount helper
This abstracts away attaching of the right ubi and then selecting the right
ubi device and volume to mount.
As described in the comment at the top this allows to mount ubifs volumes
directly from /etc/fstab without having to use hardcoded numbers (which
depend on mount order and so are unreliable) and extra magic to care for
attaching.
Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r-- | ubifs-utils/Makemodule.am | 2 | ||||
-rwxr-xr-x | ubifs-utils/mount.ubifs | 101 |
2 files changed, 103 insertions, 0 deletions
diff --git a/ubifs-utils/Makemodule.am b/ubifs-utils/Makemodule.am index 59109cc..5c5d99f 100644 --- a/ubifs-utils/Makemodule.am +++ b/ubifs-utils/Makemodule.am @@ -47,4 +47,6 @@ UBIFS_EXTRA = \ EXTRA_DIST += $(UBIFS_HEADER) $(UBIFS_EXTRA) +dist_sbin_SCRIPTS = ubifs-utils/mount.ubifs + sbin_PROGRAMS += $(UBIFS_BINS) diff --git a/ubifs-utils/mount.ubifs b/ubifs-utils/mount.ubifs new file mode 100755 index 0000000..b94ddc5 --- /dev/null +++ b/ubifs-utils/mount.ubifs @@ -0,0 +1,101 @@ +#!/bin/sh + +# This script should be installed as /sbin/mount.ubifs. The benefit is that an +# fstab entry like: +# +# mtd=mtddev:home /home ubifs defaults 0 0 +# +# results in the ubi contained in the mtd named "mtddev" to be attached (if not +# already done) and then the volume named "home" being mounted to /home. + +# This is called by mount with the following options: +# /sbin/mount.ubifs spec dir [-sfnv] [-N namespace] [-o options] [-t type.subtype] + +spec="$1" +shift + +mtdname2num() { + local name + + name="$1" + + for d in $(find /sys/class/mtd/ -regex '.*/mtd[0-9]*'); do + case "$d" in + *ro) + continue + ;; + esac + + if test "$name" = "$(cat "$d/name")"; then + local dev mtdnum + + dev="$(basename "$d")" + mtdnum="${dev#mtd}" + echo "$mtdnum" + return + fi + done + + return 1 +} + +mtdnum2ubi() { + local mtdnum + + mtdnum="$1" + + for d in $(find /sys/class/ubi/ -regex '.*/ubi[0-9]*'); do + case "$d" in + *_[0-9]*) + continue + ;; + esac + + if test "$mtdnum" = "$(cat "$d/mtd_num")"; then + local ubi + + ubi="$(basename "$d")" + echo "$ubi" + return; + fi + done + + return 1 +} + +mtdnum2ubi_autoattach() { + local mtdnum ubi + + mtdnum="$1" + + ubi="$(mtdnum2ubi "$mtdnum")" && { echo "$ubi"; return; } + + # ubiattach might fail with "mtdX is already attached to ubiY" if there + # is more than one mount to do in the same mtd partition. So ignore errors. + ubiattach -m "$mtdnum" >&2 || true + + mtdnum2ubi "$mtdnum" +} + +case "$spec" in + mtd=*:*) + spec="${spec#mtd=}" + mtd="${spec%:*}" + rspec="${spec#*:}" + + mtdnum="$(mtdname2num "$mtd")" || { + echo "Failed to find mtdnum for mtd \"$mtd\"" + exit 1 + } + + ubi="$(mtdnum2ubi_autoattach "$mtdnum")" || { + echo "Failed to find ubi for mtd \"$mtd\"" + exit 1 + } + + spec="$ubi:$rspec" + + ;; +esac + +/bin/mount -i -t ubifs "$spec" "$@" |