348 lines
9.6 KiB
Bash
348 lines
9.6 KiB
Bash
#!/bin/bash
|
|
# ssd-mount-manager.sh - USB-C SSD Mount Management
|
|
# Zweck: Flexibles Mounting verschiedener SSDs auf konstanten Mount-Point
|
|
|
|
set -e
|
|
|
|
# Konfiguration
|
|
MOUNT_POINT="/mnt/ssd-storage"
|
|
CONFIG_FILE="/etc/ssd-mount.conf"
|
|
LOG_FILE="/var/log/ssd-mount.log"
|
|
|
|
# Logging-Funktion
|
|
log_message() {
|
|
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | sudo tee -a "$LOG_FILE"
|
|
echo "$1"
|
|
}
|
|
|
|
# Konfigurationsdatei erstellen
|
|
create_config() {
|
|
log_message "Erstelle Konfigurationsdatei..."
|
|
sudo tee "$CONFIG_FILE" > /dev/null << EOF
|
|
# SSD Mount Manager Konfiguration
|
|
# Erstellt: $(date)
|
|
|
|
# Standard Mount-Point
|
|
MOUNT_POINT="$MOUNT_POINT"
|
|
|
|
# Standard Mount-Optionen für NTFS
|
|
MOUNT_OPTIONS="defaults,uid=1000,gid=1000,umask=002,fmask=111,noatime"
|
|
|
|
# Automatisches Unmounting bei Shutdown
|
|
AUTO_UMOUNT=true
|
|
|
|
# Backup der letzten gemounteten SSD
|
|
LAST_DEVICE=""
|
|
LAST_UUID=""
|
|
EOF
|
|
log_message "Konfiguration erstellt: $CONFIG_FILE"
|
|
}
|
|
|
|
# Konfiguration laden
|
|
load_config() {
|
|
if [ -f "$CONFIG_FILE" ]; then
|
|
source "$CONFIG_FILE"
|
|
else
|
|
create_config
|
|
source "$CONFIG_FILE"
|
|
fi
|
|
}
|
|
|
|
# Mount-Point vorbereiten
|
|
prepare_mount_point() {
|
|
log_message "Bereite Mount-Point vor: $MOUNT_POINT"
|
|
|
|
if [ ! -d "$MOUNT_POINT" ]; then
|
|
sudo mkdir -p "$MOUNT_POINT"
|
|
log_message "Mount-Point erstellt: $MOUNT_POINT"
|
|
fi
|
|
|
|
sudo chown root:root "$MOUNT_POINT"
|
|
sudo chmod 755 "$MOUNT_POINT"
|
|
log_message "Mount-Point Berechtigungen gesetzt"
|
|
}
|
|
|
|
# Aktuelle Mounts prüfen
|
|
check_current_mount() {
|
|
if mountpoint -q "$MOUNT_POINT"; then
|
|
mounted_device=$(df "$MOUNT_POINT" | tail -1 | awk '{print $1}')
|
|
log_message "Aktuell gemountet: $mounted_device auf $MOUNT_POINT"
|
|
return 0
|
|
else
|
|
log_message "Kein Device auf $MOUNT_POINT gemountet"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Device unmounten
|
|
unmount_device() {
|
|
log_message "Unmounte Device von $MOUNT_POINT..."
|
|
|
|
if mountpoint -q "$MOUNT_POINT"; then
|
|
mounted_device=$(df "$MOUNT_POINT" | tail -1 | awk '{print $1}')
|
|
log_message "Unmounte $mounted_device..."
|
|
|
|
sudo umount "$MOUNT_POINT"
|
|
log_message "Device erfolgreich unmountet"
|
|
|
|
# Letztes Device in Config speichern
|
|
update_last_device ""
|
|
else
|
|
log_message "Kein Device zum Unmounten gefunden"
|
|
fi
|
|
}
|
|
|
|
# Safe-Eject Funktion
|
|
safe_eject_device() {
|
|
log_message "Starte Safe-Eject Prozess..."
|
|
|
|
# Externes Safe-Eject Script aufrufen
|
|
if command -v ssd-safe-eject >/dev/null; then
|
|
ssd-safe-eject eject
|
|
else
|
|
# Fallback: Integrierte Safe-Eject Funktionalität
|
|
perform_integrated_safe_eject
|
|
fi
|
|
}
|
|
|
|
# Integrierte Safe-Eject Funktionalität
|
|
perform_integrated_safe_eject() {
|
|
if ! mountpoint -q "$MOUNT_POINT"; then
|
|
log_message "Keine SSD gemountet - Safe-Eject nicht erforderlich"
|
|
return 1
|
|
fi
|
|
|
|
mounted_device=$(df "$MOUNT_POINT" | tail -1 | awk '{print $1}')
|
|
device_base=$(echo "$mounted_device" | sed 's/[0-9]*$//')
|
|
|
|
log_message "Safe-Eject für $mounted_device..."
|
|
|
|
# Vollständiger Sync
|
|
log_message "Führe Sync durch..."
|
|
sync
|
|
sleep 2
|
|
|
|
# Unmount
|
|
log_message "Unmounte Device..."
|
|
if sudo umount "$MOUNT_POINT"; then
|
|
log_success "Unmount erfolgreich"
|
|
else
|
|
log_error "Unmount fehlgeschlagen"
|
|
return 1
|
|
fi
|
|
|
|
# Hardware-Eject
|
|
log_message "Hardware-Eject..."
|
|
if command -v eject >/dev/null; then
|
|
if sudo eject "$device_base" 2>/dev/null; then
|
|
log_success "Hardware-Eject erfolgreich"
|
|
else
|
|
log_warning "Hardware-Eject fehlgeschlagen"
|
|
fi
|
|
else
|
|
log_warning "eject Befehl nicht verfügbar"
|
|
fi
|
|
|
|
# Finaler Sync
|
|
sync
|
|
|
|
log_success "Safe-Eject abgeschlossen - SSD kann entfernt werden"
|
|
update_last_device ""
|
|
}
|
|
# Device mounten
|
|
mount_device() {
|
|
local device="$1"
|
|
|
|
if [ -z "$device" ]; then
|
|
log_message "Fehler: Kein Device angegeben"
|
|
return 1
|
|
fi
|
|
|
|
if [ ! -b "$device" ]; then
|
|
log_message "Fehler: Device $device existiert nicht"
|
|
return 1
|
|
fi
|
|
|
|
log_message "Mounte Device: $device"
|
|
|
|
# Prüfe ob bereits etwas gemountet ist
|
|
if mountpoint -q "$MOUNT_POINT"; then
|
|
log_message "Mount-Point bereits belegt - unmounte zuerst..."
|
|
unmount_device
|
|
fi
|
|
|
|
# Device mounten
|
|
log_message "Mounte $device auf $MOUNT_POINT mit Optionen: $MOUNT_OPTIONS"
|
|
sudo mount -t ntfs-3g -o "$MOUNT_OPTIONS" "$device" "$MOUNT_POINT"
|
|
|
|
if [ $? -eq 0 ]; then
|
|
log_message "Mount erfolgreich: $device auf $MOUNT_POINT"
|
|
|
|
# Device-Info speichern
|
|
device_uuid=$(sudo blkid -s UUID -o value "$device")
|
|
update_last_device "$device" "$device_uuid"
|
|
|
|
# Mount-Status anzeigen
|
|
show_mount_status
|
|
return 0
|
|
else
|
|
log_message "Fehler beim Mounten von $device"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Letztes Device in Config updaten
|
|
update_last_device() {
|
|
local device="$1"
|
|
local uuid="$2"
|
|
|
|
sudo sed -i "s|LAST_DEVICE=.*|LAST_DEVICE=\"$device\"|" "$CONFIG_FILE"
|
|
sudo sed -i "s|LAST_UUID=.*|LAST_UUID=\"$uuid\"|" "$CONFIG_FILE"
|
|
}
|
|
|
|
# Mount-Status anzeigen
|
|
show_mount_status() {
|
|
echo ""
|
|
echo "=== Mount-Status ==="
|
|
|
|
if mountpoint -q "$MOUNT_POINT"; then
|
|
mounted_device=$(df "$MOUNT_POINT" | tail -1 | awk '{print $1}')
|
|
echo "✓ Gemountet: $mounted_device"
|
|
echo "✓ Mount-Point: $MOUNT_POINT"
|
|
|
|
# Speicherplatz anzeigen
|
|
df -h "$MOUNT_POINT"
|
|
echo ""
|
|
|
|
# Device-Details
|
|
device_uuid=$(sudo blkid -s UUID -o value "$mounted_device")
|
|
device_label=$(sudo blkid -s LABEL -o value "$mounted_device" 2>/dev/null || echo "Kein Label")
|
|
echo "UUID: $device_uuid"
|
|
echo "Label: $device_label"
|
|
|
|
# Zugriffstest
|
|
if [ -r "$MOUNT_POINT" ]; then
|
|
echo "✓ Lesezugriff: OK"
|
|
else
|
|
echo "✗ Lesezugriff: Fehler"
|
|
fi
|
|
|
|
if [ -w "$MOUNT_POINT" ]; then
|
|
echo "✓ Schreibzugriff: OK"
|
|
else
|
|
echo "✗ Schreibzugriff: Fehler"
|
|
fi
|
|
|
|
else
|
|
echo "✗ Kein Device gemountet auf $MOUNT_POINT"
|
|
fi
|
|
echo ""
|
|
}
|
|
|
|
# Verfügbare NTFS-Devices auflisten
|
|
list_ntfs_devices() {
|
|
echo "=== Verfügbare NTFS-Devices ==="
|
|
lsblk -f | grep ntfs | while IFS= read -r line; do
|
|
device=$(echo "$line" | awk '{print "/dev/" $1}')
|
|
uuid=$(echo "$line" | awk '{print $3}')
|
|
label=$(echo "$line" | awk '{print $4}')
|
|
size=$(lsblk -o SIZE "$device" 2>/dev/null | tail -1)
|
|
echo "$device | $size | UUID: $uuid | Label: $label"
|
|
done
|
|
echo ""
|
|
}
|
|
|
|
# Automatisches Device-Detection
|
|
auto_detect_device() {
|
|
log_message "Automatische Device-Erkennung..."
|
|
|
|
# Suche nach NTFS-Partitionen auf USB-Devices
|
|
for device in /dev/sd[a-z][0-9]*; do
|
|
if [ -b "$device" ]; then
|
|
fstype=$(lsblk -o FSTYPE "$device" 2>/dev/null | tail -1 | xargs)
|
|
if [ "$fstype" = "ntfs" ]; then
|
|
size=$(lsblk -b -o SIZE "$device" 2>/dev/null | tail -1)
|
|
size_gb=$((size / 1024 / 1024 / 1024))
|
|
|
|
# Nur Devices > 100GB berücksichtigen (typisch für SSDs)
|
|
if [ $size_gb -gt 100 ]; then
|
|
log_message "NTFS-SSD gefunden: $device (${size_gb}GB)"
|
|
echo "$device"
|
|
return 0
|
|
fi
|
|
fi
|
|
fi
|
|
done
|
|
|
|
log_message "Keine geeignete NTFS-SSD gefunden"
|
|
return 1
|
|
}
|
|
|
|
# Hauptfunktion
|
|
main() {
|
|
echo "=== USB-C SSD Mount Manager ==="
|
|
echo "Version: 1.0"
|
|
echo ""
|
|
|
|
load_config
|
|
prepare_mount_point
|
|
|
|
case "${1:-status}" in
|
|
"mount")
|
|
if [ -n "$2" ]; then
|
|
mount_device "$2"
|
|
else
|
|
# Auto-Detection
|
|
auto_device=$(auto_detect_device)
|
|
if [ -n "$auto_device" ]; then
|
|
echo "Auto-erkanntes Device: $auto_device"
|
|
echo "Mounten? (y/n)"
|
|
read -r response
|
|
if [ "$response" = "y" ] || [ "$response" = "Y" ]; then
|
|
mount_device "$auto_device"
|
|
fi
|
|
else
|
|
echo "Kein Device auto-erkannt. Verfügbare Devices:"
|
|
list_ntfs_devices
|
|
fi
|
|
fi
|
|
;;
|
|
"unmount"|"umount")
|
|
unmount_device
|
|
;;
|
|
"safe-eject"|"eject")
|
|
safe_eject_device
|
|
;;
|
|
"status")
|
|
show_mount_status
|
|
;;
|
|
"list")
|
|
list_ntfs_devices
|
|
;;
|
|
"remount")
|
|
if check_current_mount; then
|
|
unmount_device
|
|
sleep 2
|
|
fi
|
|
auto_device=$(auto_detect_device)
|
|
if [ -n "$auto_device" ]; then
|
|
mount_device "$auto_device"
|
|
fi
|
|
;;
|
|
*)
|
|
echo "Verwendung: $0 {mount [device]|unmount|safe-eject|status|list|remount}"
|
|
echo ""
|
|
echo "Befehle:"
|
|
echo " mount [device] - Device mounten (auto-detect wenn kein device)"
|
|
echo " unmount - Device unmounten (einfach)"
|
|
echo " safe-eject - Sichere USB-C SSD Entfernung mit Hardware-Eject"
|
|
echo " status - Mount-Status anzeigen"
|
|
echo " list - Verfügbare NTFS-Devices auflisten"
|
|
echo " remount - Unmount + Auto-detect + Mount"
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Script ausführen
|
|
main "$@"
|