HowTo: Safe Remove USB on XFCE

Ez a post azért születik, mert egyes Ubuntu DE-kben nincs "Safe Remove USB" funkció(XFCE,LXDE). Nem is azzal van a baj, ha feszültség alatt húzzuk ki az USB-t, egy sima umount is elegendő lenne. A baj nagyobb. Jelezték is az igényt ezen dokumentáció elkészítésére.

Alapozásnak érdemes ezt elolvasni:
http://hup.hu/node/112319

Hogyan használjuk az UDisks-et célunk eléréséhez:
DBUS metódus hívást az UDisks-nek a következő paranccsal tehetünk:


$ dbus-send --system --print-reply --type=method_call --dest=org.freedesktop.UDisks <call>

Az áttekinthetőség kedvéért ezentúl a <call> helyébe helyettesítsünk be, valamint a sorok végén a \ jelöli hogy a sor még folytatódik.

Listázzuk ki az elérhető objektumokat:


call: /org/freedesktop/UDisks org.freedesktop.UDisks.EnumerateDevices
   array [
      object path "/org/freedesktop/UDisks/devices/fd0"
      object path "/org/freedesktop/UDisks/devices/sdb1"
      object path "/org/freedesktop/UDisks/devices/sdb2"
      object path "/org/freedesktop/UDisks/devices/sdb"
      object path "/org/freedesktop/UDisks/devices/sr0"
      object path "/org/freedesktop/UDisks/devices/sda"
      object path "/org/freedesktop/UDisks/devices/sda1"
      object path "/org/freedesktop/UDisks/devices/sda2"
      object path "/org/freedesktop/UDisks/devices/sda3"
      object path "/org/freedesktop/UDisks/devices/sda5"
      object path "/org/freedesktop/UDisks/devices/sda6"
   ]

Ezek az objektumok az egyes linux device-okat reprezentálják.

Hogyan állapítsuk meg hogy ezek közül melyik eltávolítható?


call: /org/freedesktop/UDisks/devices/sr0 org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.UDisks.Device" string:"DeviceIsRemovable"
   variant       boolean true

Tehát az sr0 igen, mivel ez egy DVD meghajtó.

Nézzük meg, fel van-e mountolva:


call: /org/freedesktop/UDisks/devices/sr0 org.freedesktop.DBus.Properties.Get \
string:"org.freedesktop.UDisks.Device" string:"DeviceIsMounted"
   variant       boolean true

Igen.

Akkor unmount:


call: /org/freedesktop/UDisks/devices/sr0 org.freedesktop.UDisks.Device.FilesystemUnmount \
array:string:

Adjuk ki az eject parancsot a CD meghajtónak:


call: /org/freedesktop/UDisks/devices/sr0 org.freedesktop.UDisks.Device.DriveEject \
array:string:

Szépen kilökte a tálcát. De miért is foglalkozok én CD-vel?
Azért mert a Thunar úgy kezeli az USB drive-okat is, mintha ki lehetne nekik adni az eject parancsot. A menüben nincs is más, lehetőség csak az eject:
http://git.xfce.org/xfce/thunar/log/?qt=grep&q=eject
Miért baj ez? Ezért: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1082920

A biztonságos eltávolításhoz a következő lépéseket kell tennünk:
Tegyük fel hogy van egy USB drive-unk, aminek a neve sdb, és egy partíció van rajta sdb1 néven.


call: /org/freedesktop/UDisks/devices/sdb1 org.freedesktop.UDisks.Device.FilesystemUnmount \
array:string:

Ez idáig tiszta sor. Ezen a ponton már el is távolíthatnánk a pendrive-ot, de legyünk alaposak, nézzük mik a lehetőségeink:


call: /org/freedesktop/UDisks/devices/sdb org.freedesktop.DBus.Introspectable.Introspect
...
    <method name="DriveDetach">
      <arg name="options" type="as" direction="in"/>
    </method>
    <method name="DriveEject">
      <arg name="options" type="as" direction="in"/>
    </method>
...

Tippeljetek melyik lesz a nyerő! Hát nem a DriveEject az biztos!


call:  /org/freedesktop/UDisks/devices/sdb org.freedesktop.UDisks.Device.DriveDetach \
array:string:

Hozzászólások

Igazság szerint ez portable HDD-nél hasznos, vagy inkább nagyon fontos lenne. Köszi a leírást.
--
AGA@
Fork portal és az egyik logóm :)

Kösz. Szép dolog a DBus.
(Ja, én amúgy akkor lettem kicsit morcos, amikor a CD-t kezelő rétegből valamikor úgy egy-másfél éve eltávolították az umount funkciót, és csak az ejectet hagyták meg. Mert csak. Hogy aztán visszaszavazta-e a népharag, azt nem tudom.)

Szerintem ugyan az lehet mögötte pendrive-oknál is. 10.04-en még szépen megy az unmount, 12.04-en már ez az eject-es borzadály van. Érdekes, hogy sikerült összehozni?!

A nép meg csak kattint az eject-re, aztán csodálkozik hogy adatvesztés/rendszerösszeomlás lesz egy sima unmount helyett.