Einträge für fstab mit UUID erstellen

Aus DebianforumWiki
Zur Navigation springen Zur Suche springen
Wiki ‹ Scripting ‹ Einträge für fstab mit UUID erstellen



Baustelle.png 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.png 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

Man-Page.png fstab(5)