Setup installation
This commit is contained in:
347
scripts/ssd-management/ssd-mount-manager.sh
Normal file
347
scripts/ssd-management/ssd-mount-manager.sh
Normal file
@@ -0,0 +1,347 @@
|
||||
#!/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 "$@"
|
Reference in New Issue
Block a user