Einträge für fstab mit UUID erstellen
Baustelle: Dieser Artikel ist eine Baustelle. Das heißt, jemand hat sich dieses Artikels angenommen und überarbeitet ihn gerade. |
Ein Shell-Script zur Erzeugung einer fstab mit UUID aus allen gemounteten Dateisystemen.
Allgemeines
Da das manuelle Erstellen der kompletten Datei /etc/fstab oder einzelner ihrer Einträge manchmal mühsam und fehleranfällig ist, hilft dieses Script, alle Einträge gemounteter Filesyteme zu finden und dabei gleichzeitig Partitionsangaben wie z.B. /dev/sdc3 durch ihre jeweiligen UUIDs zu ersetzen. Das Script funktioniert mit den Shells sh, dash und bash. Außerdem wird nach Einträgen in /etc/fstab gescannt, die noch nicht gemountet sind.
Warnung: Dieses Script bitte nicht automatisiert nutzen, um es in anderen Scripten zu benutzen! Es dient nur der Arbeitserleichterung. KEINE GEWÄHR FÜR NICHTS! Bitte selbst nochmal drüberschauen, ob die Ausgabe liefert, was sie soll. |
Das Script
root@debian:~# fstabentry
Usage: fstabentry [-nc|--no-comment][-uo|--uuid-only][-?|-h|--help]
-nc: Keine Kommentare zum Original-Device ausgeben
-uo: Nur Filesysteme mit UUID ausgeben
-h: Kurzhilfe
#!/bin/sh
# Funktioniert auch mit #!/bin/bash und #!/bin/dash
# Scriptname: fstabentry
# --------
# lookforuuid() emuliert den Befehl blkid -o export $DEV|grep "^UUID",
# kommt aber ohne Root-Rechte aus.
#
# Usage: lookforuuid $DEV
# --------
lookforuuid() {
cd /dev/disk/by-uuid > /dev/null
AKTDEV="$(readlink -e "$1")"
for i in *; do
if [ "$(readlink -e "$i")" = "$AKTDEV" ]; then
cd - > /dev/null
echo "$i"
return
fi
done
cd - > /dev/null
}
# --------
# output() verarbeitet die übergeordneten, globalen Variablen der
# beiden Hauptschleifen.
#
# Usage: outputentry
# --------
outputentry() {
EFFDEV=''
UUID=$(lookforuuid "$DEV")
[ ! "$UUID" = "" ] && EFFDEV="# $DEV" && DEV="UUID=$UUID" && CHK=2
[ "$MP" = "/" ] && CHK=1
if [ "$NC" = 0 -a ! "$EFFDEV" = "" ]; then echo "$EFFDEV"; fi
if [ "$UO" = 0 -o ! "$EFFDEV" = "" ]; then
echo "$DEV" "$MP" "$TYP" "$MO" "$DUMP" "$CHK"
fi
}
# --------
# Optionen parsen
# --------
NC=0
UO=0
while [ $# -gt 0 ]; do
case "$1" in
-nc|--no-comment)
NC=1
;;
-uo|--uuid-only)
UO=1
;;
-\?|-h|--help)
echo "Usage: fstabentry [-nc|--no-comment][-uo|--uuid-only][-?|-h|--help]"
echo "-nc: Keine Kommentare zum Original-Device ausgeben"
echo "-uo: Nur Filesysteme mit UUID ausgeben"
echo "-h: Kurzhilfe"
exit 0
;;
*)
echo "Unbekannter Parameter" >&2
exit 1
;;
esac
shift
done
# --------
# Falls UUIDs gefunden werden, ersetzen sie die Deviceangaben.
# Ohne Option -nc: Kommentarzeile mit Origininalgerät einfügen.
# --------
while read -r DEV MP TYP MO DUMP CHK; do
outputentry
done < /etc/mtab
# --------
# Entdeckung nicht gemounteter Geräte mit fstab-Option 'noauto'
# --------
echo
echo "# Nichtgemountete fstab-Einträge"
echo "# Soweit auffindbar, wird das Gerät mit UUID ausgegeben."
echo "# Wenn das nicht möglich ist, Ausgabe des Original-Eintrages."
echo
while read -r DEV MP TYP MO DUMP CHK; do
echo "$DEV" | grep -q "#" && continue # Kommentare überspringen
if [ "$(echo "$MO" | grep "noauto")" ]; then
if [ ! -d "$MP" ]; then
echo "# FEHLER in /etc/fstab: Mountpoint $MP existiert nicht."
continue
fi
# Kanonische Bezeichnung finden
case "$DEV" in
UUID=*)
AKTDEV="$(readlink -e "/dev/disk/by-uuid/$(echo $DEV|cut -d"=" -f2)")"
;;
LABEL=*)
AKTDEV="$(readlink -e "/dev/disk/by-label/$(echo $DEV|cut -d"=" -f2)")"
;;
*) # Liegt schon in kanonischer Form vor.
AKTDEV="$DEV"
;;
esac
# Aussortieren, falls gefundenes Device an falschem Ort gemountet,...
if [ ! "$AKTDEV" = "" ] && grep -v "$MP" /etc/mtab | grep -q "$AKTDEV"; then
echo "# FEHLER in fstab: Device $AKTDEV für vorgesehen Mountpoint $MP bereits belegt."
continue
fi
# ... der Mountpoint schon mit falschem Gerät belegt...
if [ ! "$AKTDEV" = "" ] && grep -v "$AKTDEV" /etc/mtab | grep -q "$MP"; then
echo "# FEHLER in fstab: Mountpoint $MP bereits mit anderem Gerät als $AKTDEV gemountet."
continue
fi
# ... oder regulär gemountet und bereits aufgelistet wurde.
mountpoint -q "$MP" && continue # Bereits in erster Schleife gelistet
# Gefundenes Gerät an Ausgabefunktion übergeben.
# Falls keines gefunden wurde, wird der Originaleintrag benutzt.
[ ! "$AKTDEV" = "" ] && DEV="$AKTDEV"
outputentry
fi
done < /etc/fstab
##################################
# TODO: Swap-Partitionen scannen #
##################################
Verwendbarkeit
- Der oben angebrachte Warnhinweis ist ernst gemeint. Man erhält als Ausgabe zwar alle verwendbaren fstab-Einträge, aber es gibt Grenzen der Benutzbarkeit: Die mount-Informationen werden aus der Datei /etc/mtab bezogen. Diese liefert aber keine gültigen Werte für die Spalten 5 und 6 eines fstab-Eintrages. Üblicherweise lauten sie für das Wurzelverzeichnis "0 1", für virtuelle Dateisysteme (wie z.B. /proc oder /sys) "0 0" und für "normale" mounts "0 2". Dies wird im Script so berücksichtigt, kann aber von den konkreten Anforderungen abweichen.
- Die Mountoptionen sollten immer überprüft werden. Bspw. möchte man Angaben wie "uhelper" nicht in der fstab sehen.
- Es wurde bewusst auf bashisms verzichtet, damit das Script unter sh und bash lauffähig ist.
Hintergrundinfos
Dieser Beitrag entstand aus einer Forenanfrage zum automatisierten Mounten: Beitrag 1342452
Diskussion um Korrekturen und Anpassungen im Wiki-Forenthread: Beitrag 1342472