Code:
#! /bin/bash
# fstab-rebuild.sh
VERSION="April 2012"
# Farbe Variablen zuweisen
ROT="\033[31m"
ROT_HELL="\033[41m"
GRUEN="\033[32m"
GRUEN_HELL="\033[42m"
GELB="\033[33m"
GELB_HELL="\033[43m"
BLAU="\033[34m"
BLAU_HELL="\033[44m"
MAGENTA="\033[35m"
MAGENTA_HELL="\033[45m"
ENDE="\033[0m\n"
ENDE1="\033[0m"
NUTZER=$(users |awk '{print $1}')
if [ $(id -u) != 0 ]; then
echo -e "$ROT_HELL Script erfordert root - Rechte \n $ENDE "
su
exit 1
fi
echo -e "$ROT_HELL"
cat <<EOT
Diese script schreibt die /etc/fstab
LABEL wird abgefragt.
Falls kein LABEL vorhanden wird eins erzeugt in einer Mischung von Laufwerk und UUID.
Gleichzeitig wird der Mountpoint in /media entsprechend der Auswahl in einem Menü geändert.
alle anderen Mountpoints in /media werden gelöscht.
Vorhandene /etc/fstab wird mehrfach gesichert.
Vor dem Überschreiben der alten /etc/fstab gibt es eine Abfrage.
Ich habe da nun mehrfache Sicherheiten eingebaut, damit kein Müll entsteht.
Kritik ist gerne willkommen. Zumal ich noch zimlich wenig Ahnung habe.
Neu ist:
Menü zum Auswählen von Optionen.
z.B. auch atime
Problem wheezy dass root-Partition als solche nicht erkannt wird behoben.
Vor überschreiben wird nachgefragt.
EOT
# read
echo -e "$ENDE $ENDE1"
AUSW=`dialog --checklist "Wie soll die fstab.aussehen ??? " 0 0 0 \
System "Linux Systeme als auto mounten ? " off \
"homes mounten" "Partitionen mit home-Verzeichissen automounten?" off \
automount "andere beim Start mounten?" on \
noatime "noatime ? " off \
Floppy "vorhanden ?" off \
"USB-Laufwerke" "und andere bewegliche - normal nicht!!!!" off \
"Mountpoint zusammenstellen aus:" "" off \
"Laufwerk z.B. sda5" "falls hier " off \
UUID "mehrer angekreuzt werden *1 " off \
Label "alle aneinandergehängt " on \
3>&1 1>&2 2>&3`
if [[ "$AUSW" == *homes* ]] ; then
HOMEAUTO=auto
else
HOMEAUTO=noauto
fi
if [[ "$AUSW" == *automount* ]] ; then
ALLAUTO=auto
else
ALLAUTO=noauto
fi
if [[ "$AUSW" == *noatime* ]] ; then
KEINATIME=noatime
else
KEINATIME=atime
fi
if [[ "$AUSW" == *System* ]] ; then
SYSTEMAUTO=auto
else
SYSTEMAUTO=noauto
fi
SAVEROOT=$(cat /etc/fstab | grep errors=remount)
KURZUUIDSAVEROOT=$(cat /etc/fstab | grep errors=remount | awk '{print $1}'| cut -b 1-3 )
cd /
umount -a
# mögliche wichtige Mountpoints zum erhalten
mount /
mount $(cat /etc/fstab | grep errors=remount | awk '{print $1}')
mount /home
mount /home/$NUTZER
mount /root
mkdir /etc/fstab.backup
# mv --backup=t funktioniert nicht, machen wirs halt selbst
for (( I=1; $I <= 200; I++ )) ; do
if [ -e /etc/fstab.backup/fstab.bak~$I ] ; then
continue
fi
mv --backup=t /etc/fstab.bak /etc/fstab.backup/fstab.bak~$I
break
done
# mv /etc/fstab /etc/fstab.bak
echo -e "# /etc/fstab: static file system information. \n# \n#\t <file system>\t\t\t\t<mount point> \t<type>\t\t<options>\t<dump><pass> " > /etc/fstab.neu # /etc/fstab wir damit überschrieben
rmdir /media/*
for LAUFWERK in sda sdb sdc sde sdf sdg sdh sdi ; do
if [ ! -e /dev/$LAUFWERK ] ; then
# echo $LAUFWERK existiert nicht
continue
fi
if ! [[ "$AUSW" == *USB-Laufwerke* ]] ; then
REM=$(cat /sys/block/${LAUFWERK#/dev/}/removable 2>/dev/null)
if [ "$REM" = "1" ]; then
continue
fi
fi
for (( I=1; $I <= 20; I++ )) ; do
if [ ! -e /dev/$LAUFWERK$I ] ; then
continue
fi
TYPE=$(blkid -o list /dev/$LAUFWERK$I | grep $LAUFWERK$I | awk '{print $2}')
if [ "x$TYPE" = "x" ] ; then
echo TYPE $TYPE von $LAUFWERK$I nicht ermittelt
continue
fi
UUID_ERMITTELT2=$(blkid -o list /dev/$LAUFWERK$I | grep $LAUFWERK$I | awk '{print $7}' )
if [ x$UUID_ERMITTELT2 = x ] ; then
UUID_ERMITTELT2=$(blkid -o list /dev/$LAUFWERK$I| grep $LAUFWERK$I | awk '{print $6}' )
fi
if [ x$UUID_ERMITTELT2 = x ] ; then
UUID_ERMITTELT2=$(blkid -o list /dev/$LAUFWERK$I| grep $LAUFWERK$I --max-count=1 | awk '{print $5}' )
fi
if [ x$UUID_ERMITTELT2 = x ] ; then
UUID_ERMITTELT2=$(blkid -o list /dev/$LAUFWERK$I | grep $LAUFWERK$I --max-count=1 | awk '{print $4}' )
fi
KURZUUID=$(echo $UUID_ERMITTELT2 | cut -b 1-4)
LABELERSATZ=$TYPE-$(echo $LAUFWERK | cut -b 3)$I-$KURZUUID
ERMITTELT=$(e2label /dev/$LAUFWERK$I)
if [ x$ERMITTELT = x ] ; then
e2label /dev/$LAUFWERK$I $LABELERSATZ
ERMITTELT=$LABELERSATZ
fi
if [ ! -e /dev/disk/by-label/$ERMITTELT ] ; then
LABEL_AUS_BLKID=$(blkid -o list /dev/$LAUFWERK$I | grep $LAUFWERK$I --max-count=1 | awk '{print $3}')
if [ -e /dev/disk/by-label/$LABEL_AUS_BLKID ] ; then
ERMITTELT=$LABEL_AUS_BLKID
fi
fi
SCHONDA=$(cat /etc/fstab.neu | grep $ERMITTELT--max-count=1)
if [ "x" != "x$SCHONDA" ] ; then
echo das ist schon da $SCHONDA mit LABEL $ERMITTELT
continue
fi
MOUNTPOINT=$ERMITTELT
if [[ "$AUSW" == *sda5* ]] ; then
MOUNTPOINT=$LAUFWERK$I
if [[ "$AUSW" == *Label* ]] ; then
MOUNTPOINT=$MOUNTPOINT"_"$ERMITTELT
fi
fi
if [[ "$AUSW" == *UUID* ]] ; then
MOUNTPOINT=$MOUNTPOINT"_"$UUID_ERMITTELT2
fi
WOEINGH=$(mount |grep $LAUFWERK$I --max-count=1 | awk '{print $3}')
if [ ! -e /dev/disk/by-uuid/$UUID_ERMITTELT2 ] ; then
echo UUID $UUID_ERMITTELT2 nicht gültig mounten nach Device
if [ $TYPE = swap ] ; then
echo -e "# $LAUFWERK$I ist SWAP " >> /etc/fstab.neu
echo -e "/dev/$LAUFWERK$I \t\tnone \tswap \t\tsw \t\t\t0 0" >> /etc/fstab.neu
continue
elif [ $TYPE = vfat ] ; then
echo -e "# $LAUFWERK$I LABEL=$(dosfslabel $LAUFWERK$I) vfat " >> /etc/fstab.neu
echo -e "/dev/$LAUFWERK$I /media/$MOUNTPOINT vfat $ALLAUTO,users,exec,umask=000,shortname=mixed,rw 0 0" >> /etc/fstab.neu # UUID=5F76D7A66A61B554 /media/daten ntfs defaults 0 0
continue
elif [ $TYPE = ntfs ] ; then
echo -e "# $LAUFWERK$I ntfs " >> /etc/fstab.neu
echo -e "/dev/$LAUFWERK$I /media/$MOUNTPOINT $ALLAUTO,ntfs defaults,user,$KEINATIME,rw 0 0" >> /etc/fstab.neu
continue
fi
if [ "x$WOEINGH" = "x/" ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) ROOT-System \n/dev/$LAUFWERK$I\t\t$WOEINGH\t$TYPE\trw,errors=remount-ro,$KEINATIME \t0 0" >> /etc/fstab.neu
continue
elif [[ $SAVEROOT == *$KURZUUID* ]] ; then
echo ist root und lies sich nicht erkennen nach mountpoint
echo rootuuid ist kurz: $KURZUUIDSAVEROOT
echo ermitteltes für das Laufwerk ist: *$KURZUUID*
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) ROOT-System \n/dev/$LAUFWERK$I\t\t$WOEINGH\t$TYPE\trw,errors=remount-ro,$KEINATIME \t0 0" >> /etc/fstab.neu
continue
elif [ x$WOEINGH != x ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) \n/dev/$LAUFWERK$I\t/\t$TYPE\tdefaults,user,$KEINATIME,auto\t0 0" >> /etc/fstab.neu
continue
else
mount /dev/$LAUFWERK$I /mnt
if [ -e /mnt/vmlinuz ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) mit einem Linux System \n/dev/$LAUFWERK$I\t/media/$MOUNTPOINT\t$TYPE\tdefaults,user,$KEINATIME,$SYSTEMAUTO\t 0 0" >> /etc/fstab.neu
elif [ -e /mnt/Desktop/ ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) mit einem Home-Verzeichniss \n/dev/$LAUFWERK$I\t/media/$MOUNTPOINT\t$TYPE\tdefaults,user,$KEINATIME,$HOMEAUTO \t0 0" >> /etc/fstab.neu
else
echo -e "#/dev/$LAUFWERK$I (LABEL=$ERMITTELT) \n/dev/$LAUFWERK$I\t/media/$MOUNTPOINT\t$TYPE\tdefaults,user,$ALLAUTO,$KEINATIME\t0 0" >> /etc/fstab.neu
fi
fi
while [[ $(mount | grep mnt) == *mnt* ]] ; do
umount /mnt
done
mkdir /media/$MOUNTPOINT
chown $NUTZER:$NUTZER /media/$MOUNTPOINT
mount /media/$ERMITTEL
chown $NUTZER:$NUTZER /media/$MOUNTPOINT/.
continue
fi
SCHONDA=$(cat /etc/fstab.neu | grep $UUID_ERMITTELT2)
if [ "x" != "x$SCHONDA" ] ; then
echo UUID von Laufwerk $LAUFWERK$I ist schon da $SCHONDA
# read
continue
fi
if [ $TYPE = swap ] ; then
echo -e "# $LAUFWERK$I ist SWAP " >> /etc/fstab.neu
echo -e "UUID=$UUID_ERMITTELT2 \t\tnone \tswap \t\tsw \t\t\t0 0" >> /etc/fstab.neu
continue
elif [ $TYPE = vfat ] ; then
# apt-get install dosfstools
echo -e "# $LAUFWERK$I LABEL=$ERMITTELT (vfat) " >> /etc/fstab.neu
echo -e "UUID=$UUID_ERMITTELT2 /media/$MOUNTPOINT vfat $ALLAUTO,users,exec,umask=000,shortname=mixed,rw 0 0" >> /etc/fstab.neu # UUID=5F76D7A66A61B554 /media/daten ntfs defaults 0 0
continue
elif [ $TYPE = ntfs ] ; then
echo -e "# $LAUFWERK$I $ERMITTELT (ntfs) " >> /etc/fstab.neu
echo -e "UUID=$UUID_ERMITTELT2 /media/$MOUNTPOINT ntfs $ALLAUTO,defaults,user,$KEINATIME,rw 0 0" >> /etc/fstab.neu
continue
elif [ "x$WOEINGH" = "x/" ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) ROOT-System \nUUID=$UUID_ERMITTELT2\t\t/\t$TYPE\trw,errors=remount-ro,$KEINATIME \t0 0" >> /etc/fstab.neu
continue
elif [[ $SAVEROOT == *$KURZUUID* ]] ; then
echo ist root und lies sich nicht erkennen nach mountpoint
echo rootuuid ist kurz: $KURZUUIDSAVEROOT
echo ermitteltes für das Laufwerk ist: *$KURZUUID*
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) ROOT-System \nUUID=$UUID_ERMITTELT2\t\t/\t$TYPE\trw,errors=remount-ro,$KEINATIME \t0 0" >> /etc/fstab.neu
continue
elif [ x$WOEINGH != x ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) \nUUID=$UUID_ERMITTELT2\t$WOEINGH\t$TYPE\tdefaults,user,$KEINATIME,auto\t0 0" >> /etc/fstab.neu
continue
else
mount /dev/$LAUFWERK$I /mnt
if [ -e /mnt/vmlinuz ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) mit einem Linux System \nUUID=$UUID_ERMITTELT2\t/media/$MOUNTPOINT\t$TYPE\tdefaults,user,$KEINATIME,$SYSTEMAUTO \t0 0" >> /etc/fstab.neu
elif [ -e /mnt/Desktop/ ] ; then
echo -e "# /dev/$LAUFWERK$I (LABEL=$ERMITTELT) mit einem Home-Verzeichniss \nUUID=$UUID_ERMITTELT2\t/media/$MOUNTPOINT\t$TYPE\tdefaults,user,$KEINATIME,$HOMEAUTO \t0 0" >> /etc/fstab.neu
else
echo -e "#/dev/$LAUFWERK$I (LABEL=$ERMITTELT) \nUUID=$UUID_ERMITTELT2\t/media/$MOUNTPOINT\t$TYPE\t$ALLAUTO,defaults,user,$KEINATIME\t0 0" >> /etc/fstab.neu
fi
while [[ $(mount | grep mnt) == *mnt* ]] ; do
umount /mnt
done
fi
while [[ $(mount | grep mnt) == *mnt* ]] ; do
umount /mnt
done
mkdir /media/$MOUNTPOINT
chown $NUTZER:$NUTZER /media/$MOUNTPOINT
mount /media/$MOUNTPOINT
chown $NUTZER:$NUTZER /media/$MOUNTPOINT/.
done
done
echo >> /etc/fstab.neu
if [[ "$AUSW" == *Floppy* ]] ; then
echo /dev/fd0 /media/floppy0 auto rw,user,noauto 0 0 >> /etc/fstab.neu
mkdir /media/floppy0
fi
echo /dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0 >> /etc/fstab.neu
mkdir /media/cdrom0
echo >> /etc/fstab.neu
dialog --timeout 35 --exit-label "Das ist die neue /etc/fstab.neu" --textbox "/etc/fstab.neu" 35 130
# dialog --timeout 35 "Das ist die neue /etc/fstab.neu" --textbox "/etc/fstab.neu" 35 130
dialog --yesno "Ursprüngliche damit überschreiben?" 0 0
# 0=ja; 1=nein
antwort=$?
if [ $antwort = 0 ]; then
mv /etc/fstab /etc/fstab.bak
mv /etc/fstab.neu /etc/fstab
fi
mount -a
|