Temat: Skrypt do automatycznego montowania partycji
Napisałem skrypt do automatycznego montowania partycji nowo podłączanych urządzeń, działający jako usługa Openwrt.
Przy montowaniu pomijane są partycje montowane poprzez fstab. Może komuś się przyda
#!/bin/sh /etc/rc.common
# Skrypt startowy dla OpenWRT
START=99
STOP=10
# Katalog, w którym będą montowane partycje
MOUNT_DIR="/mnt/devices"
# Logowanie do syslog
log_to_syslog() {
local level=$1
local message=$2
logger -t "automount" -p "user.$level" "$message"
}
# Funkcja startowa
start() {
log_to_syslog "info" "Starting automount service..."
# Tworzenie katalogu montowania, jeśli nie istnieje
mkdir -p "$MOUNT_DIR"
# Uruchomienie głównej pętli w tle
(
while true; do
# Pobierz listę wszystkich partycji
PARTITIONS=$(lsblk -lnpo NAME,TYPE | grep -E 'part$' | awk '{print $1}') || {
log_to_syslog "err" "Failed to list partitions using lsblk."
sleep 10
continue
}
# Iteruj przez wszystkie partycje
for PARTITION in $PARTITIONS; do
# Pomijaj partycje wymienione w /etc/fstab
if grep -q "^$PARTITION" /etc/fstab; then
continue
fi
# Pobierz typ systemu plików i UUID
FSTYPE=$(blkid -o value -s TYPE "$PARTITION") || {
log_to_syslog "err" "Failed to get filesystem type for $PARTITION."
continue
}
UUID=$(blkid -o value -s UUID "$PARTITION") || {
log_to_syslog "err" "Failed to get UUID for $PARTITION."
continue
}
# Pomijaj partycje bez systemu plików lub typu swap
if [ -z "$FSTYPE" ] || [ "$FSTYPE" = "swap" ]; then
continue
fi
# Sprawdź, czy partycja jest już zamontowana
if ! findmnt -rno UUID | grep -q "^$UUID$"; then
# Utwórz katalog montowania
MOUNT_POINT="$MOUNT_DIR/$(basename $PARTITION)"
mkdir -p "$MOUNT_POINT"
# Spróbuj zamontować partycję
/bin/mount "$PARTITION" "$MOUNT_POINT" || {
log_to_syslog "err" "Failed to mount $PARTITION at $MOUNT_POINT."
rmdir "$MOUNT_POINT"
continue
}
log_to_syslog "info" "Partition $PARTITION (UUID: $UUID) successfully mounted at $MOUNT_POINT."
fi
done
# Sprawdź katalogi w /mnt/devices/ i usuń te bez zamontowanej partycji
for MOUNT_POINT in "$MOUNT_DIR"/*; do
if [ -d "$MOUNT_POINT" ]; then
MOUNTED_UUID=$(findmnt -rn -o UUID "$MOUNT_POINT")
if [ -z "$MOUNTED_UUID" ]; then
rmdir "$MOUNT_POINT"
fi
fi
done
# Odczekaj 10 sekund przed kolejnym sprawdzeniem
sleep 10
done
) &
}
# Funkcja stopowa
stop() {
log_to_syslog "info" "Stopping automount service..."
killall $(basename $0) 2>/dev/null
}
# Funkcja restart
restart() {
stop
start
}