USB mit Debian/Sarge

Nachdem ich nun auf Sarge umgestiegen bin, musste ich erstmal meinen ganzen USB-Kram einrichten. Natürlich soll alles automatisch funktionieren.
Ich laß mich doch nicht von Windows-Anwendern belächeln... :-)

Die Geschichte ist schnell eingerichtet - wenn man Kernel 2.6 und udev verwendet.

Es folgt eine schnelle Übersicht der Einrichtung in 6 Schritten. Hersteller oder Produktnamen können bei deinen Geräten anders sein! Eventuell muss man diese Informationen erst über das sysfs (unter /sys) in Erfahrung bringen. Die System-Logdateien können auch hilfreich sein. Datei- und Zugriffsrechte sind abhängig von deiner persönlichen Paranoia. :-)

1. Benutzergruppen anlegen

# addgroup --system --gid 222 usbstick
# addgroup --system --gid 250 usbdrive
# addgroup --system --gid 333 multicard

2. Benutzer den Gruppen zuweisen

# adduser hugo2 usbstick
# adduser hugo8 multicard
# adduser hugo8 usbdrive

3. Verzeichnisse anlegen

$ ls -l /media/
drwxr-xr-x  2 root root 4096 2005-07-02 14:20 medion
drwxr-xr-x  6 root root 4096 2005-07-02 14:20 multicard
drwxr-xr-x  2 root root 1024 2006-03-03 15:18 usbdrive
drwxr-xr-x  2 root root 4096 2005-07-02 14:20 usbstick
$ ls -l /media/multicard/
drwxr-xr-x  2 root root 4096 2005-07-02 14:20 cf-md
drwxr-xr-x  2 root root 4096 2005-07-02 14:20 mmc-sd
drwxr-xr-x  2 root root 4096 2005-07-02 14:20 ms-pro
drwxr-xr-x  2 root root 4096 2005-07-02 14:20 xd-sm
$ ls -ld /etc/dev.d/block/
drwxr-xr-x  2 root root 4096 2005-07-08 15:09 /etc/dev.d/block/

4. Dateien für Devices anlegen

$ ls -l /etc/dev.d/block/
-rwxr-xr-x  1 root root 1159 2005-07-08 15:07 medion.dev
-rwxr-xr-x  1 root root 2073 2005-07-08 15:08 multicard.dev
-rwxr-xr-x  1 root root 1127 2005-07-08 15:09 usbstick.dev
-rwxr-xr-x  1 root root 1351 2006-03-04 11:33 usbdrive.dev

/etc/dev.d/block/medion.dev

#!/bin/sh
######################################################################
# /etc/dev.d/block/medion.dev
######################################################################
#
# Medion Kamera beim Anstecken/Abziehen automatisch mounten/umounten
#
# Achtung: falls Daten auf die Kamera geschrieben wurden:
# vor dem Abziehen manuell den Befehl sync ausfuehren,
# sonst droht eventuell Datenverlust!
# Das kann man schlecht automatisieren - woher will das
# System wissen, wann ich die Kamera abziehe?! :-)
#
######################################################################
if [ "$ACTION" == "add" ] ; then
    if [ "$DEVNAME" == "/dev/medion" ]; then
        if [ $UDEV_LOG ]; then
            logger "medion device added ($*)[`env`]"
        fi
        mount /media/medion
    fi
fi
if [ "$ACTION" == "remove" ] ; then
    if [ "$DEVNAME" == "/dev/medion" ]; then
        if [ $UDEV_LOG ]; then
            logger "medion device removed ($*)[`env`]"
        fi
        umount /media/medion
    fi
fi
exit 0
######################################################################
# eof
######################################################################

/etc/dev.d/block/multicard.dev

#!/bin/sh
######################################################################
# /etc/dev.d/block/multicard.dev
######################################################################
#
# USB MultiCard ReaderWriter beim Anstecken/Abziehen
# automatisch mounten/umounten
#
# Hinweis: beim einstecken neuer Cards in den MultiCard
# ReaderWrite kurz USB-Kabel ziehen und wieder einstecken,
# weil ein einfacher Kartenwechsel nicht erkannt wird!)
#
# Achtung: falls Daten auf eine Karte geschrieben wurden:
# vor dem Abziehen manuell den Befehl sync ausfuehren,
# sonst droht eventuell Datenverlust!
# Das kann man schlecht automatisieren - woher will das
# System wissen, wann ich das Kabel abziehe?! :-)
#
######################################################################
log_add_dev() {
    if [ $UDEV_LOG ]; then
        logger "multicard new device added [`env`]"
    fi
}
log_del_dev() {
    if [ $UDEV_LOG ]; then
        logger "multicard device removed [`env`]"
    fi
}
if [ "$ACTION" == "add" ] ; then
    if [ "$DEVNAME" == "/dev/multicard/cf-md" ]; then
        log_add_dev
        mount /media/multicard/cf-md
    fi
    if [ "$DEVNAME" == "/dev/multicard/ms-pro" ]; then
        log_add_dev
        mount /media/multicard/ms-pro
    fi
    if [ "$DEVNAME" == "/dev/multicard/mmc-sd" ]; then
        log_add_dev
        mount /media/multicard/mmc-sd
    fi
    if [ "$DEVNAME" == "/dev/multicard/xd-sm" ]; then
        log_add_dev
        mount /media/multicard/xd-sm
    fi
fi
if [ "$ACTION" == "remove" ] ; then
    if [ "$DEVNAME" == "/dev/multicard/cf-md" ]; then
        log_del_dev
        umount /media/multicard/cf-md
    fi
    if [ "$DEVNAME" == "/dev/multicard/ms-pro" ]; then
        log_del_dev
        umount /media/multicard/ms-pro
    fi
    if [ "$DEVNAME" == "/dev/multicard/mmc-sd" ]; then
        log_del_dev
        umount /media/multicard/mmc-sd
    fi
    if [ "$DEVNAME" == "/dev/multicard/xd-sm" ]; then
        log_del_dev
        umount /media/multicard/xd-sm
    fi
fi
exit 0
######################################################################
# eof
######################################################################

/etc/dev.d/block/usbstick.dev

#!/bin/sh
######################################################################
# /etc/dev.d/block/usbstick.dev
######################################################################
#
# USB-Stick beim Anstecken/Abziehen automatisch mounten/umounten
#
# Achtung: falls Daten auf den Stick geschrieben wurden:
# vor dem Abziehen manuell den Befehl sync ausfuehren,
# sonst droht eventuell Datenverlust!
# Das kann man schlecht automatisieren - woher will das
# System wissen, wann ich den Stick abziehe?! :-)
#
######################################################################
if [ "$ACTION" == "add" ]; then
    if [ "$DEVNAME" == "/dev/usbstick" ]; then
        if [ $UDEV_LOG ]; then
            logger "usbstick new device added ($*)[`env`]"
        fi
        mount /media/usbstick
    fi
fi
if [ "$ACTION" == "remove" ]; then
    if [ "$DEVNAME" == "/dev/usbstick" ]; then
        if [ $UDEV_LOG ]; then
            logger "usbstick device removed ($*)[`env`]"
        fi
        umount /media/usbstick
    fi
fi
exit 0
######################################################################
# eof
######################################################################

/etc/dev.d/block/usbdrive.dev

#!/bin/sh
######################################################################
# /etc/dev.d/block/usbdrive.dev
######################################################################
#
# nur einfache Loggingfunktionen fuer USB-Platte an/abstecken
# (mounten mit automounter)
#
######################################################################
log_add_dev() {
    if [ $UDEV_LOG ]; then
        logger "usbdrive new device added [`env`]"
    fi
}
log_del_dev() {
    if [ $UDEV_LOG ]; then
        logger "usbdrive device removed [`env`]"
    fi
}
if [ "$ACTION" == "add" ] ; then
    if [ "$DEVNAME" == "/dev/usbdrive/part" ]; then
        log_add_dev
    fi
    if [ "$DEVNAME" == "/dev/usbdrive/part/1" ]; then
        log_add_dev
    fi
    if [ "$DEVNAME" == "/dev/usbdrive/part/2" ]; then
        log_add_dev
    fi
    if [ "$DEVNAME" == "/dev/usbdrive/part/3" ]; then
        log_add_dev
    fi
fi
if [ "$ACTION" == "remove" ] ; then
    if [ "$DEVNAME" == "/dev/usbdrive/part" ]; then
        log_del_dev
    fi
    if [ "$DEVNAME" == "/dev/usbdrive/part/1" ]; then
        log_del_dev
    fi
    if [ "$DEVNAME" == "/dev/usbdrive/part/2" ]; then
        log_del_dev
    fi
    if [ "$DEVNAME" == "/dev/usbdrive/part/3" ]; then
        log_del_dev
    fi
fi
exit 0
######################################################################
# eof
######################################################################

5. Datei und Link für udev-Regeln anlegen

$ ls -l /etc/udev/MAIN.rules
-rw-r--r--  1 root root 2072 2005-07-08 15:18 /etc/udev/MAIN.rules
$ ls -l /etc/udev/rules.d/MAIN.rules
lrwxrwxrwx  1 root root 13 2005-06-30 15:24 /etc/udev/rules.d/MAIN.rules -> ../MAIN.rules

/etc/udev/MAIN.rules

#########################################################################
# /etc/udev/rules.d/MAIN.rules (is link of /etc/udev/MAIN.rules!)
#########################################################################
#
# Devices mit udev automatisch anlegen,
# abhaengig von Hersteller und Produkt
#
#########################################################################
# Digicam Medion                            made by http://www.medion.de/
#########################################################################
BUS="scsi", SYSFS{vendor}="MCC", SYSFS{model}="DSC-3", \
    MODE="0660", GROUP="multicard", NAME="medion"
#########################################################################
# USB Stick Red Pearl                     made by http://www.cnmemory.de/
#########################################################################
BUS="scsi", SYSFS{vendor}="OTi", SYSFS{model}="Flash Disk", \
    MODE="0660", GROUP="usbstick", NAME="usbstick"
#########################################################################
# Hama USB 2.0 CardReaderWriter               made by http://www.hama.de/
#########################################################################
# CompactFlash Typ I + II ; MicroDrive
BUS="scsi", SYSFS{vendor}="ICSI", SYSFS{model}="* CF", \
    MODE="0660", GROUP="multicard", NAME="multicard/cf-md"
# Memory Stick Card ; Memory Stick Pro
BUS="scsi", SYSFS{vendor}="ICSI", SYSFS{model}="* MS", \
    MODE="0660", GROUP="multicard", NAME="multicard/ms-pro"
# MMC ; SD
BUS="scsi", SYSFS{vendor}="ICSI", SYSFS{model}="* MMC/SD", \
    MODE="0660", GROUP="multicard", NAME="multicard/mmc-sd"
# XD Card ; SM
BUS="scsi", SYSFS{vendor}="ICSI", SYSFS{model}="* SM", \
    MODE="0660", GROUP="multicard", NAME="multicard/xd-sm"
#########################################################################
# Siemens USB Data Cable 510               made by http://www.siemens.de/
# Mobil-Connection for Internet over GPRS
#########################################################################
BUS="usb", KERNEL="ttyUSB*", SYSFS{idProduct}="2303", \
    MODE="0660", GROUP="dip", NAME="handy"
#########################################################################
# USB-Drive - Billigteil von: ich bin doch nicht blöd! :-)
#########################################################################
BUS="scsi", SYSFS{vendor}="TOSHIBA", SYSFS{model}="MK3021GAS", \
    MODE="0660", GROUP="usbdrive", NAME="usbdrive/part/%n"
#########################################################################
# Canon EOS 350D nicht hier, sondern ueber hotplug und gphoto2 ansteuern!
#########################################################################
# eof
#########################################################################

Hinweis für Debian/Etch: prinzipiell kann man diesen Setup auch für Etch verwenden, wenn man genau festgelegte Devices braucht.
Man muss das aber bei Etch nicht unbedingt machen! (da wird eh einiges besser...)
Wichtig: die Syntax von udev hat sich bei Etch geändert (teilweise anderer Operator == bitte Manpage lesen)!

6. /etc/fstab anpassen (Beispiele)

/dev/usbstick /media/usbstick vfat defaults,noauto,gid=222,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid 0 0

/dev/medion /media/medion vfat defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid 0 0

/dev/multicard/cf-md /media/multicard/cf-md vfat defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid 0 0

/dev/multicard/mmc-sd /media/multicard/mmc-sd vfat defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid 0 0

/dev/multicard/ms-pro /media/multicard/ms-pro vfat defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid 0 0

/dev/multicard/xd-sm /media/multicard/xd-sm vfat defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid 0 0

Hinweis: die Option sync habe ich erstmal aus den Mount-Optionen entfernt!
Nach neueren Erkenntnissen, kann diese Option in Zusammenhang mit vfat eine USB-Stick sogar zerstören! Ich habe bis jetzt aber noch nichts negatives festgestellt.

Automounter mit autofs

Festeingebaute Cardreader

Hinweis: momentan teste ich gerade autofs. Ich bin mir noch nicht sicher, ob's soo gut ist...

Bei festeingebauten MultiCardreadern hat man das Problem, dass man den Cardreader eben nicht mal schnell vom Strom/Netz trennen kann (für die automatische Erkennung). Hier könnte man den Automounter zum Zuge kommen lassen. (In Ermangelung eines festeingebauten Gerätes benutze ich mal meinen mobilen Cardreader! - obwohl, an diese Zugriffsart könnte ich mich auch ständig gewöhnen...) Alle Anpassungen beziehen sich auf obrige Anpassungen mit udev.

Als erste Maßnahme wird autofs installiert: apt-get install autofs

Danach erstmal alle /dev/multicard/* Einträge aus der /etc/fstab wieder entfernen (oder auskommentieren).

In der Datei /etc/dev.d/block/multicard.dev werden alle mount und umount Befehle entfernt (oder auskommentiert). Der Rest kann in der Datei bleiben - für ein eventuelles Debugging.

Die Verzeichnisse unter /media/multicard/* werden nicht mehr benötigt, sie stören eher an dieser Stelle. Diese Verzeichnisse werden entfernt und später durch Links ersetzt.

Weiterhin werden noch die zwei folgenden Dateien angepasst:

/etc/auto.master

/var/autofs/usb /etc/auto.usb --timeout=60                   
          

/etc/auto.usb

#
# This is an automounter map and it has the following format
# key [ -mount-options-separated-by-comma ] location
# Details may be found in the autofs(5) manpage
#

multicard_cf-md -fstype=vfat,defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid :/dev/multicard/cf-md

multicard_mmc-sd -fstype=vfat,defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid :/dev/multicard/mmc-sd

multicard_ms-pro -fstype=vfat,defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid :/dev/multicard/ms-pro

multicard_xd-sm -fstype=vfat,defaults,noauto,gid=333,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid :/dev/multicard/xd-sm


#
# eof
#                   
          

Alle Anpassungen müssen natürlich auf das jeweilige System und auf die eigenen Bedürfnisse abgestimmt werden!

Da momentan bei Sarge vor einem direkten Mounten gewarnt wird
/usr/share/doc/autofs/README.direct, lege ich einfach Links für die jeweiligen Mountpunkte an:

$ ls -l /media/multicard/
lrwxrwxrwx  1 root root 31 2006-02-28 13:40 cf-md -> /var/autofs/usb/multicard_cf-md
lrwxrwxrwx  1 root root 32 2006-02-28 13:40 mmc-sd -> /var/autofs/usb/multicard_mmc-sd
lrwxrwxrwx  1 root root 32 2006-02-28 13:40 ms-pro -> /var/autofs/usb/multicard_ms-pro
lrwxrwxrwx  1 root root 31 2006-02-28 13:40 xd-sm -> /var/autofs/usb/multicard_xd-sm              
                  

Hinweis: meine Cards haben alle nur ein Partition!
Falls mehrere Partitionen auf einer Card vorhanden sind,
muss man die ganze Geschichte selbstverständlich anpassen!

Zugriff auf die Mountpunkte geht dann über die Links in /media/multicard/*.
umounten automatisch nach voreingestelltem Timeout, falls kein Zugriff mehr erfolgt.

Hinweis: an besten immer vor entnehmen einer Card den Befehl sync ausführen!

Ach ja, nach den Anpassungen bitte den autofs-Deamon neu starten: /etc/init.d/autofs restart

externe USB-Platte

Habe mir jetzt auch mal so ein Billigteil zugelegt; aufgeteilt habe ich die Platte in 3 Partitionen: 2x FAT32 und 1x ext2 (für Backupzwecke). Auch hier habe ich mich erstmal für den automounter entschieden. Die Datei /etc/udev/MAIN.rules wurde um eine Regel erweitert und die Datei /etc/dev.d/block/usbdrive.dev wurde neu erstellt.
Zuerst wird die Datei /etc/auto.usb erweitert:

/etc/auto.usb

#
# die Datei um folgende Einträge erweitern:
#

usbdrive_part_1 -fstype=vfat,defaults,noauto,gid=250,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid :/dev/usbdrive/part/1

usbdrive_part_2 -fstype=vfat,defaults,noauto,gid=250,umask=002,quiet,noexec,nodev,showexec,codepage=850,iocharset=iso8859-15,nosuid :/dev/usbdrive/part/2

usbdrive_part_3 -fstype=ext2,defaults,noauto :/dev/usbdrive/part/3
                     
                

Nun nur noch die Symlinks unter /media/usbdrive/* anlegen:

$ ls -l /media/usbdrive/
lrwxrwxrwx  1 root root 31 2006-03-03 15:18 part_1 -> /var/autofs/usb/usbdrive_part_1
lrwxrwxrwx  1 root root 31 2006-03-03 15:18 part_2 -> /var/autofs/usb/usbdrive_part_2
lrwxrwxrwx  1 root root 31 2006-03-03 15:18 part_3 -> /var/autofs/usb/usbdrive_part_3
                

Zugriff auf die Mountpunkte geht dann über die Links in /media/usbdrive/*.
umounten automatisch nach voreingestelltem Timeout, falls kein Zugriff mehr erfolgt.

Schreibzugriff auf die FAT-Partitionen sollte kein Problem sein, Lesezugriff auf die ext2-Partition auch nicht. Schreibzugriff auf die ext2-Partition bleibt root vorbehalten, was ich auch völlig in Ordnung finde für reine Systembackups.

Hinweis: an besten immer vor abhängen der Platte den Befehl sync ausführen!

Hinweis: der automounter müllt die Logs ganz schön voll. Bei Verwendung von syslog-ng kann man die Ausgaben ganz gut unterbinden mit einer Erweiterung des f_syslog-Filters (z.B. ... and not match("automount")). Die anderen Logging-Meldungen kann man in den /etc/dev.d/block/*.dev-Dateien beeinflussen.

Und noch ein Tipp zu dem Billigteil: meine Platte besitzt zwei Anschlüsse: einmal Mini-USB (für die Daten) und noch einen Stromanschluss auch über USB; ohne diese extra Stromanschluss geht nichts! Am besten immer erst den Strom anschliessen und dann das Datenkabel - beim Abziehen genau umgekehrt.

weitere Informationen

Spezielle Informationen findest du in den Manpages von addgroup, adduser, udev, mount, hotplug und fstab.

Das Arbeiten mit den USB-Geräten sollte in Zukunft gleich viel mehr Freude bereiten! :-)