# Verschlüsselte Partition mounten wenn USBStick da ist...

## Dragonix

Sry für die Überschrift^^

Hi erstmal.

Ich möchte bald auf meinem "Server" eine Partition verschlüsseln (wollt ich nach http://de.gentoo-wiki.com/DM-Crypt machen). Da ich an dem PC aber keinen Bildschirm hab, kann ich schlecht immer ein PW eingeben wenn ich auf die Daten zugreifen möchte. Also würde ich gerne mit einem Keyfile arbeiten, und dieses Keyfile soll auf einen Usbstick.

Ist es möglich LUKS zu sagen, dass sobald ein Keyfile verfügbar ist, er doch bitte die verschlüsselte Partition mounten soll? Und natürlich soll ers auch wieder unmounten, sobald ich den Stick wieder abzieh...

Kennt ihr sowas in der richtung? Muss auch nicht nach obigen Tutorial gehen ==> kann andere Software verwendet werden. Bin da (noch) recht flexibel, das ganze ist auch mehr eine spielerei  :Wink: 

Mfg, Matthias

----------

## oscarwild

Klar geht das, musst Du aber selbst stricken:

- udev-Regel, die beim An- bzw. Abstecken des USB-Sticks ein Skript ausführt

- Skript, das die gewünschte Partition mit Hilfe des Keys auf dem USB-Stick mountet bzw. unmountet

Um noch eins draufzusetzen, kannst Du den Key auf zwei Sticks verteilen, so dass ein Stick alleine nicht viel wert ist, sollte er mal verloren gehen.

 *Dragonix wrote:*   

> das ganze ist auch mehr eine spielerei

 

Aufgrund so manchem Spielkind in Berlin vielleicht eine durchaus sinnvolle Spielerei für die Zukunft   :Wink: 

----------

## Dragonix

Hm ok. Dann schau ich mir die Tage mal ShellScripts an.... Ich glaube damit sollte sich das (recht leicht?) realisieren lassen... Falls ichs durchziehe, meld ich mich hier sicher nochmal, da ich sicher den ein oder anderen Bug nicht ausmerzen kann^^

----------

## Finswimmer

Kannst dann ja daraus eine Erweiterung zu dem Howto machen.

Tobi

----------

## Dragonix

 *Quote:*   

> Kannst dann ja daraus eine Erweiterung zu dem Howto machen. 

 

2 Dinge die (leider) dagegen Sprechen:

Erstens meine geringen Linux Kenntnisse

Zweitens meine (noch geringeren) Deutschkenntnisse...

Also, ich hab jetzt Notenschluss und bald Ferien, d.h. perfekte Zeit das "Projekt" wieder aufzugreifen. Hier ein paar Fragen zu dem Skript aus dem Wiki ( http://de.gentoo-wiki.com/Udev_Rules#USB-Sticks_einh.C3.A4ngen )

Wie gesagt, ich hab Keine Erfahrung mit Skripten (also die perfekten Vorraussetzungen  :Wink: )

 *Quote:*   

> #!/bin/sh
> 
> DEVICE="$1"           #Was macht das? Ich vermute, der Variable DEVICE wird ein Wert zu gewiessen. Blos welcher? $1 denk ich mal nicht, eher der Inhalt von $1. Blos was ist der Inhalt? Der Parameter mit dem man das Skript aufruft? Also /dev/blablubb?
> 
> GID=`grep plugdev /etc/group | cut -d: -f 3`     #Hier wird vermute ich die GroupID von der Gruppe plugdev rausgefunden?
> ...

 

Büüüüddddeee helft mir  :Wink: 

 *Quote:*   

> SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/mount-device.sh /dev/%k"

 

Dazu noch ne kurze Frage: Wenn das Skript xy ausgeführ werden soll, wenn der Stick entfernt wird, dann muss ich das add in ein remove umändern, oder?

Thx  :Smile: 

----------

## forrestfunk81

```
#!/bin/sh

DEVICE="$1"           #Was macht das? Ich vermute, der Variable DEVICE wird ein Wert zu gewiessen. Blos welcher? $1 denk ich mal nicht, eher der Inhalt von $1. Blos was ist der Inhalt? Der Parameter mit dem man das Skript aufruft? Also /dev/blablubb?
```

Richtig, $1 ist die erste dem Skript übergebene Variable, $2 die zweite Variable usw.

```

GID=`grep plugdev /etc/group | cut -d: -f 3`     #Hier wird vermute ich die GroupID von der Gruppe plugdev rausgefunden?

```

 Ja

```

if [ "$DEVICE" = "" ] ; then exit 1 ; fi       #Wenn das Device "nichts" ist, dann enden wir hier

```

Ja

```

# wait a moment till' hal has information about the device

sleep 2                                    #Sonst warten wir, worauf auch immer

```

Zwischen erkennen des neuen Devices und laden der entsprechenden Module etc.. vergehen manchmal ein paar Sek. Deshalb kurz warten.

```

#Brauch ich das ab hier noch? Es handelt sich ja nur um ein Gerät...

HAL_UID=`hal-find-by-property --key block.device --string "$DEVICE"`     # WTH? Variablenzuweisung schön und gut.. aber was weiss ich hier der Variable zu? Die ID des USB-Geräts von HAL?

```

Der Befehl zwischen den `` wird ausgeführt und das Ergebnis davon wird der Variablen HAL_UID zugewiesen. UID=Unique Identifier deines Gerätes.

```

if [ "$HAL_UID" = "" ]

then

   # can't find device in hal db

   MOUNTPOINT=/media/${DEVICE##/dev/}                        

else

   LABEL=`hal-get-property --key volume.label --udi "$HAL_UID"`   

   if [ "$LABEL" != "" ]

   then

      MOUNTPOINT="/media/$LABEL"

   else

      MOUNTPOINT=/media/${DEVICE##/dev/}

   fi

fi
```

Wenns keine HAL_UID gibt, wird dein Gerät nach /media/$DEVICE (z.B. /media/sdb1) gemountet. Ansonsten wird versucht den Namen der Festplatte herauszufinden und diesen als Mountpoint zu verwenden.

 *Quote:*   

> SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/mount-device.sh /dev/%k"
> 
> Dazu noch ne kurze Frage: Wenn das Skript xy ausgeführ werden soll, wenn der Stick entfernt wird, dann muss ich das add in ein remove umändern, oder?

 

Richtig, einfach Zeile kopieren und in der zweiten Zeile dann eben remove statt add und n anderes skript.

----------

## Dragonix

Ok, thx!

Aber... der mountet nix!? Des Script wird auch garnicht ausgeführt!

Ist da ein Fehler drinnen?

 *Quote:*   

> 
> 
> SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/mount-device.sh /dev/%k"
> 
> 

 

Fakt ist, das Script wird nicht ausgeführt. Auch das:

SUBSYSTEM=="block", ACTION=="add", RUN+="echo ch >> /media/blubb"

funktioniert nicht.

stehen tuts in der 10-udev.rules

----------

## Vaarsuvius

also in der zeile ist kein fehler.

du kannst folgendes ausprobieren um den fehler zu finden:

lass udevmonitor (braucht glaub ich root-rechte) laufen waehrend du den usb-stick einsteckst. da solltest du sehen dass ein  uevent ausgeloest wird.

wenn der stick angeschlossen ist, fuehre den befehl udevtest /sys/block/dein_usbstick aus. Da sollte in den letzten zeilen sowas aehnliches kommen:

```
main: run: '/dein/auszufuehrender/befehl/oder/script'
```

wenn beides klappt, dann hmmm... keine ahnung erstmal.

----------

## Dragonix

Ok, thx, probier ich gleich aus, wenn ich heimkomm.

Bye!

udevmonitor:

 *Quote:*   

> # udevmonitor
> 
> udevmonitor prints the received event from the kernel [UEVENT]
> 
> and the event which udev sends out after rule processing [UDEV]
> ...

 

Udevtest:

 *Quote:*   

> # udevtest /sys/block/sda
> 
> parse_file: reading '/etc/udev/rules.d/05-udev-early.rules' as rules file
> 
> parse_file: reading '/etc/udev/rules.d/10-udev.rules' as rules file
> ...

 

Stimmt /sys/block/sda? Das is je ne directory, deswegen frag ich^^

----------

## Vaarsuvius

 *Dragonix wrote:*   

> Udevtest:
> 
>  *Quote:*   # udevtest /sys/block/sda
> 
> parse_file: reading '/etc/udev/rules.d/05-udev-early.rules' as rules file
> ...

 

ja das sda stimmt schon, nur solltest du das ausfuehren wenn der stick drinsteckt, wie ich oben auch geschrieben hab. sonst existiert das device natuerlich nicht (-> unable to open device)...  :Wink:  ... aber an sich siehts erstmal gut aus, dein 10-udev.rules wird ja auch gelesen... hmm..

natuerlich noch ne einfache sache: hattest du dein /usr/local/bin/mount-device.sh auch ausfuehrbar gemacht? (chmod u+x)

----------

## Dragonix

Tjo... gibt blos ein problem: Der Stick steckt. Bei den Festplatten (die zu 1000% da sind  :Wink: ) kommt auch "unable to open device". Hab ich hier was im Kernel verbockt? Aber beim wiki steht doch auch nix Kernelspezifisches Oo

Ich guck mal ob das script ausführbar ist *nachguck*:

 *Quote:*   

>  # ls -l
> 
> total 8
> 
> -rw-r--r-- 1 root root 725 Jul 14 01:50 mount-device.sh
> ...

 

Schaut nich so aus...

 *Quote:*   

>  # ls -l
> 
> total 8
> 
> -rwxr--r-- 1 root root 725 Jul 14 01:50 mount-device.sh
> ...

 

Schaut scho besser aus...

Edit:

 *Quote:*   

> emerge -av sysfsutils hotplug

 

Braucht man das?

Das würde die folgenden Pakete installieren:

 *Quote:*   

>  # emerge -pv sysfsutils hotplug
> 
> These are the packages that would be merged, in order:
> 
> Calculating dependencies... done!
> ...

 

Steht im Wiki... so wie ich das interpretiere, sollte das aber als abhängigkeit von udev mitinstalliert werden?! udev ista aber definitv installiert  :Wink: 

----------

## Vaarsuvius

 *Dragonix wrote:*   

> Tjo... gibt blos ein problem: Der Stick steckt. Bei den Festplatten (die zu 1000% da sind ) kommt auch "unable to open device". Hab ich hier was im Kernel verbockt? 

 

hmm naja du brauchst sysfs im kernel, das sollte aber automatisch drin sein (ich sehe zumindest nicht wie mans deaktivieren kann...)... mach mal ein grep "SYSFS" /usr/src/linux/.config

 *Quote:*   

>  *Quote:*   emerge -av sysfsutils hotplug 
> 
> Braucht man das?

 

hotplug: brauchte man mal frueher, mittlerweile ist hotplug in udev integriert.... ich weiss nicht mehr genau seit wann, aber auf jedenfall noch in ner udev version <100. wenn du ne aktuelle version von udev hast, brauchst dus nicht.

sysfsutils: bin ich mir jetzt nicht sicher. also udev zieht das definitiv nicht als dep mit, allerdings z.B. so sachen wie pmount schon... ich habs auch installiert. koennte sein, dass dus brauchst, kannst es ja einfach mal ausprobieren.

----------

## Dragonix

Ok... FERIEN!!! D.h. ich hab wieder Zeit  :Wink: 

 *Quote:*   

> 
> 
> #  grep "SYSFS" /usr/src/linux/.config
> 
> CONFIG_SYSFS_DEPRECATED=y
> ...

 

Also alle io, oder?

Also... nachdem ich die "fallback" Zeilen des mount scripts geändert hab:

ursprünglich so:

```
mkdir -p "$MOUNTPOINT" &&

touch "$MOUNTPOINT"/.created_by_pmount &&

mount "$DEVICE" "$MOUNTPOINT" -o gid=$GID,umask=007 ||

rm "$MOUNTPOINT"/.created_by_pmount &&

rmdir "$MOUNTPOINT"
```

in folgendes geändert hab:

```
mkdir -p "$MOUNTPOINT" &&

touch "$MOUNTPOINT"/.created_by_pmount &&

mount "$DEVICE" "$MOUNTPOINT" -o gid=$GID,umask=007 #||

#rm "$MOUNTPOINT"/.created_by_pmount &&

#rmdir "$MOUNTPOINT"
```

Kann ich wunderbar sehen, dass 2 Verzeichnisse erstellt werden, nämlich "sda" und "sda1". Leider wird da nichts gemountet. Also geh ich davon aus, dass der Fehler (bzw. das Problem, dass das Skript defekt ist, bezweifle ich jetzt einfach mal...)

in der mount Zeile liegt...

Edit: Nachdem ich beim mounten die Optionen ausgekommentiert hab, mountet ers brav...

.. OMFG!!! Ich weiss warum... die Gruppe "plugdev" existiert nicht! zumindest liefert mir

grep plugdev /etc/group

nichts zurück...

Edit³: Ok... Mounten geht jetzt. Blos unmounten nicht. Aber das wär ganz praktisch  :Wink: , denn sonst ist der stick beim nächsten reinstecken nicht mehr unter sda1 sondern unter sdb1 zu finden...

Das unmount Skript schaut so aus:

```
 #!/bin/sh

DEVICE="$1"

GID=`grep plugdev /etc/group | cut -d: -f 3`

if [ "$DEVICE" = "" ] ; then exit 1 ; fi

# wait a moment till' hal has information about the device

sleep 2

HAL_UID=`hal-find-by-property --key block.device --string "$DEVICE"`

if [ "$HAL_UID" = "" ]

then

   # can't find device in hal db

   MOUNTPOINT=/media/${DEVICE##/dev/}

else

   LABEL=`hal-get-property --key volume.label --udi "$HAL_UID"`

   if [ "$LABEL" != "" ]

   then

      MOUNTPOINT="/media/$LABEL"

   else

      MOUNTPOINT=/media/${DEVICE##/dev/}

   fi

fi

if [ ls -a | grep .created_by_pmount ]

then

        rm "$MOUNTPOINT"/.created_by_pmount

        umount "$MOUNTPOINT"

        rmdir "$MOUNTPOINT"

fi

```

Nur der Schluss ist von mir... und genau der geht nicht  :Smile: 

Geht das mit der if Abfrage nicht so? Wie kann ich sonst rausfinden, ob die Datei existiert? Als vorlage diente übrigens das Mountskript. Andere Frage: Kann ich das irgendwie so einrichten, dass der USB-Stick immer unter XYZ zu finden ist?

Der Eintrag

 *Quote:*   

> BUS=="usb", SYSFS{product}=="USB Drive", KERNEL=="sd?1", NAME="%k", SYMLINK="XYZ"

 

Steht in der gleichen Datei wie 

 *Quote:*   

> SUBSYSTEM=="block", ACTION=="add", RUN+="/usr/local/bin/mount-device.sh /dev/%k"
> 
> SUBSYSTEM=="block", ACTION=="remove", RUN+="/usr/local/bin/umount-device.sh /dev/%k"
> 
> 

 

, wird auch ausgeführt, aber es weiterhin stur nach sdX gemountet  :Sad: ... /dev/XYZ existiert dann aber.

THX!

----------

## c_m

Um zu prüfen ob ne datei existiert musst du afair nur folgendes machen:

```
if [ -e .created_by_pmount ]
```

nen bestimmten namen gibst du deinen Sticks so:

```
BUS=="scsi", SYSFS{vendor}=="WDC WD16", NAME="usbhdd%n", ACTION=="add", RUN+="/bin/mount /media/usbhdd"
```

Diese Regel sorgt dafür, dass meine USB-HDD immer unter /dev/usbhdd zu finden ist. Das %n sorgt dafür, dass auch die einzelnen Partitionen immer so heißen, also /dev/usbhdd1 usw.

//EDIT: Denk daran, dass deine Udev Regeln zuerst abgearbeitet werden, da AFAIK immer die Erste Reghel für ein Gerät greift. => Ich hab bei mir alles in einer datei /etc/udev/rules.d/10-* stehen.

----------

## Dragonix

 *Quote:*   

> Diese Regel sorgt dafür, dass meine USB-HDD immer unter /dev/usbhdd zu finden ist. Das %n sorgt dafür, dass auch die einzelnen Partitionen immer so heißen, also /dev/usbhdd1 usw. 

 

Kann ich dann, indem ich ein weiteres "RUN+=" hinzufüge, ein Skript ausführen lassen, dass mir dann die mit luks verschlüsselte Partition mountet?!?

Edit:

 *Quote:*   

> BUS=="usb", SYSFS{product}=="USB Drive", ACTION=="add", KERNEL=="sd?1", NAME="%k", SYMLINK="XYZ" RUN+="/bin/mount /dev/XYZ /media/XYZ"
> 
> BUS=="usb", SYSFS{product}=="USB Drive", ACTION=="remove", "KERNEL=="sd?1", RUN+="/bin/umount /media/XYZ"
> 
> 

 

Und geh ich richtig in der Annahme, das letzteres nicht geht? Er mountets zwar jetzt brav, aber unmounten tut ers nicht  :Sad: 

----------

## c_m

nimm das mounten deines Sticks doch einfach in das Script mit auf.

Bsp:

1) mount StickA

2) StickB da? dann mounte verschl. Partition

3) nein? dann mache nichts weiter.

Zum unmounten: Wenn du den USB stick rausziehst zerschießt du dier die einbindung. Du musst erst unmounten und dann das device entfernen, damit alles fürs System ok ist. Andersrum gehts nicht.

----------

## Dragonix

Und wenn ich den Stick read-only mounte? Was soll ich mir da zerschiessen?

Solang ich über den mountpoint, und nicht über den mount-device unmounte, geht alles wunderbar, zumindest kann ich dann das (nicht mehr vorhandene) Gerät unmounten...

----------

## Dragonix

Hm.. ich mach fortschritte!

Jetzt müsst ich blos noch wissen, was "cryptsetup isLuks /bl/ubb" returnt, wenns "richtig" ist.

Wenns keine luks ist, dann schreibt er was, sonst kommt auf der Konsole nichts, draus folgere ich, dass er wenns eine luks-Partition ist, 0 returnt. Aber wieso geht dann ein

if [cryptsetup isLuks -eq 0]

...

nicht? Wär egtl die letzte große Hürde...

Kann mir mal bitte jemand erklären, was der Unterschied zwischen

if [blubb]

...

fi

und

if blubb; then

...

fi

Ist? Letzteres geht..

----------

