• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Konfiguration policy file für HAL

Raphalon

Newbie
Hallo,

ich möchte eine policy für HAL erstellen (z.B. /etc/hal/fdi/policy/10-usbstick.fdi), damit mein USB - Stick immer unter einem geg. Verzeichnis eingebunden wird (letztlich zum Lernen, da dies ja normalerweise sowieso unter dem Label des Sticks geschieht). Folgende Dateien habe ich jeweils ausprobiert und HAL danach neu gestartet. Der Stick wurde jedoch nach wie vor unter dem label des Sticks in /media gemounted und nicht unter /media/usbstick. Was fehlt da noch?

Um einigermaßen durch den Syntax zu steigen, habe ich außer ein paar Forumseinträgen die Datei hal-spec.html aus dem Paket hal-doc durchforstet. Die Infos, wie z.B. die SerienNr und Vendor/ProductId habe ich mittels lshal konfiguriert.

Grundsätzlich sollte doch die Konfiguration wie hier geg. von den Device-Files (udev) unabhängig sein!? Diese Frage nur zur Sicherheit, weil ich eine (funktionierende) Regel für den Stick für udev erstellt habe.

Code:
<?xml version="1.0" encoding="UTF-8"?>

<deviceinfo version="0.2">
  <device> 
    <match key="block.is_volume" bool="true">
      <match key="usb_device.serial" int="[SerienNummer des Sticks]">
          <merge key="volume.mount_point" type="string">/media/usbstick</merge>
      </match>
    </match>
  </device> 
</deviceinfo>


Code:
<?xml version="1.0" encoding="UTF-8"?>

<deviceinfo version="0.2">
  <device>
    <match key="@storage.physical_device:info.bus" string="usb">
      <match key="@storage.physical_device:usb.vendor_id" int="0x930">
        <match key="@storage.physical_device:usb.product_id" int="0x6544">
          <merge key="volume.mount_point" type="string">/media/usbstick</merge>
        </match>
      </match>
    </match>
  </device>
</deviceinfo>
Gruß,

Raphalon
 

spoensche

Moderator
Teammitglied
Sieh dir doch mal die bestehende Regel für das Mounten des USB- Sticks an. Du müsstest die bestehende Regel auch deaktivieren, da meines Wissens her die darauf folgenden Regeln mit dem selben Ziel nicht mehr ausgeführt werden.
 
OP
R

Raphalon

Newbie
1.) zu udev

Folgendes Vorgehen hat bei mir funktioniert:

Erstellen des Mountpoints mit dem User root (mkdir /media/usbstick).

Erstellen einer Regeldatei in /etc/udev/rules.d mit folgender Regel:
Code:
SUBSYSTEMS=="usb", ATTRS{serial}=="[SerialId]", KERNEL=="sd*", NAME="usbstick", RUN+="/bin/mount /dev/usbstick /media/usbstick"
Den Daemon dazu bringen, die Regeln neu einzulesen mit # udevadm control --reload-rules

Beim Einstecken des Sticks werden dann folgende Geraetedateien erstellt:
/dev/sdb, /dev/sdb1, /dev/usbstick, /dev/sg2

Vorteil: Der Stick wird wie erwartet nach /media/usbstick gemounted.
Nachteil: HAL wird hier komplett umgangen. Das fuehrt dann dazu, dass z.B. der dolphin Dateibrowser den Stick nicht "unmounted" mit der entsprechenden Fehlermeldung: org.freedesktop.org.Hal.Device.Volume.notMountedByHal: Device to umount is not in /media/.hal-mtab so it is not mounted by HAL

Daher moechte ich von diesem Verfahren mal absehen.

Dennoch haette ich noch folgende Frage: auf meinem SuSE 11.3 finden sich noch jede Menge rules-Files in /lib/udev/rules.d/ Werden diese Dateien alle mit eingelesen? Warum der separate Ordner - warum die Dateien nicht in /etc/udev/rules.d?

2.) zu HAL

Hier habe ich beim googeln u.a. folgende Quelle gefunden: http://www.suseforum.de/suse-system-konfigurieren/9301-mini-howto-hal-usb-wechselmedien-einen-festen-mountpunkt-zuweisen.html, die ich hier nicht
uebergehen moechte.

Zu meinem Versuch:

Mit der Installation habe ich unter /etc/hal/fdi/policy keine Policy-Dateien gefunden, wohl aber unter
/usr/share/hal/fdi/policy/10osvendor/
/usr/share/hal/fdi/information/10freedesktop/
/usr/share/hal/fdi/information/20thirdparty/
Ob und welche von diesen Regeln verwendet werden, weiß ich nicht. Ich habe folgende Regel in /etc/hal/fdi/policy/95-usb-stick.fdi erstellt (und zuvor die udev-Regel entfernt mit anschließendem # udevadm control --reload-rules):

Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<deviceinfo version="0.2">
  <device>
    <match key="block.is_volume" bool="true">
      <match key="volume.fsusage" string="filesystem">
        <match key="volume.uuid" string="12A3-9U0U">
          <merge key="volume.policy.should_mount" type="bool">true</merge>
          <merge key="volume.policy.desired_mount_point" type="string">/media/usbstick</merge>
        </match>
      </match>
    </match>
  </device>
</deviceinfo>

Nun die Regel laden mit # rchal restart

Beim Einstecken des Sticks wurde folgende Datei erstellt (also nach wie vor nach /media/USB_STICK_G gemounted):

Code:
hostname:/media # cat .hal-mtab
/dev/sdb1       1000    0       vfat    nosuid,nodev,uid=1000,utf8,shortname=mixed,flush        /media/USB_STICK_G

Dazu folgendes "Log":
Code:
hostname:/home/myuser # lshal -m

Start monitoring devicelist:
-------------------------------------------------
18:58:47.012: storage_model_DVD_RAM_UJ_850_z property storage.partitioning_scheme = '' (new)
18:58:47.048: storage_model_DVD_RAM_UJ_850_z property storage.cdrom.write_speeds = {'4234', '2822', '2117', '1411', '706'}
18:58:51.127: usb_device_930_6544_[SerialNo_replaced] added
18:58:51.133: usb_device_930_6544_[SerialNo_replaced]_if0 added
18:58:51.134: usb_device_930_6544_[SerialNo_replaced]_if0_scsi_host added
18:58:52.122: usb_device_930_6544_[SerialNo_replaced]_if0_scsi_host_0 added
18:58:52.122: usb_device_930_6544_[SerialNo_replaced]_if0_scsi_host_0_scsi_device_lun0 added
18:58:52.125: usb_device_930_6544_[SerialNo_replaced]_if0_scsi_host_0_scsi_device_lun0_scsi_generic added
18:58:52.186: storage_serial__USB_Flash_Memory_[SerialNo_replaced]_0_0 added
18:58:52.195: storage_serial__USB_Flash_Memory_[SerialNo_replaced]_0_0 property info.interfaces = {'org.freedesktop.Hal.Device.Storage.Removable'} (new)
18:58:52.220: volume_uuid_12A3_9U0U added
18:59:09.994: volume_uuid_12A3_9U0U property volume.mount_point = '/media/USB_STICK_G'
18:59:09.999: volume_uuid_12A3_9U0U property volume.is_mounted = true

Folgende Geraetedateien werden erstellt:
/dev/sdb, /dev/sdb1, /dev/sg2


Code:
udi = '/org/freedesktop/Hal/devices/volume_uuid_12A3_9U0U'
  block.device = '/dev/sdb1'  (string)
  block.is_volume = true  (bool)
  block.major = 8  (0x8)  (int)
  block.minor = 17  (0x11)  (int)
  block.storage_device = '/org/freedesktop/Hal/devices/storage_serial__USB_Flash_Memory_[SerialNo_replaced]_0_0'  (string)
  info.capabilities = {'volume', 'block'} (string list)
  info.category = 'volume'  (string)
  info.interfaces = {'org.freedesktop.Hal.Device.Volume'} (string list)
  info.parent = '/org/freedesktop/Hal/devices/storage_serial__USB_Flash_Memory_[SerialNo_replaced]_0_0'  (string)
  info.product = 'USB_STICK_G'  (string)
  info.udi = '/org/freedesktop/Hal/devices/volume_uuid_12A3_9U0U'  (string)
  linux.hotplug_type = 3  (0x3)  (int)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2:1.0/host9/target9:0:0/9:0:0:0/block/sdb/sdb1'  (string)
  org.freedesktop.Hal.Device.Volume.method_argnames = {'mount_point fstype extra_options', 'extra_options', 'extra_options'} (string list)
  org.freedesktop.Hal.Device.Volume.method_execpaths = {'hal-storage-mount', 'hal-storage-unmount', 'hal-storage-eject'} (string list)
  org.freedesktop.Hal.Device.Volume.method_names = {'Mount', 'Unmount', 'Eject'} (string list)
  org.freedesktop.Hal.Device.Volume.method_signatures = {'ssas', 'as', 'as'} (string list)
  volume.block_size = 512  (0x200)  (int)
  volume.fstype = 'vfat'  (string)
  volume.fsusage = 'filesystem'  (string)
  volume.fsversion = 'FAT32'  (string)
  volume.ignore = false  (bool)
  volume.is_disc = false  (bool)
  volume.is_mounted = true  (bool)
  volume.is_mounted_read_only = false  (bool)
  volume.is_partition = true  (bool)
  volume.label = 'USB_STICK_G'  (string)
  volume.linux.is_device_mapper = false  (bool)
  volume.mount.valid_options = {'ro', 'sync', 'dirsync', 'noatime', 'nodiratime', 'relatime', 'noexec', 'quiet', 'remount', 'exec', 'utf8', 'shortname=', 'codepage=', 'iocharset=', 'umask=', 'dmask=', 'f
mask=', 'uid=', 'flush'} (string list)
  volume.mount_point = '/media/USB_STICK_G'  (string)
  volume.num_blocks = 31308417  (0x1ddba81)  (uint64)
  volume.partition.media_size = 16030597120  (0x3bb7f8000)  (uint64)
  volume.partition.number = 1  (0x1)  (int)
  volume.partition.start = 32256  (0x7e00)  (uint64)
  volume.policy.desired_mount_point = '/media/usbstick'  (string)
  volume.policy.should_mount = true  (bool)
  volume.size = 16029909504  (0x3bb750200)  (uint64)
  volume.unmount.valid_options = {'lazy'} (string list)
  volume.uuid = '12A3-9U0U'  (string)

Fazit: die Regel hat zwar funktioniert (die keys wurden eingetragen), aber es wird dennoch unter /media/USB_STICK_G gemounted. Das sieht danach aus, als ob volume.policy.desired_mount_point ignoriert wird. Habe es aber auch z.B. direkt mit dem Ueberschreiben von volume.mount_point versucht. Dies wird laut der Ausgabe von lshal auch eingetragen, doch der letztlich tatsaechliche MountPoint aendert sich auch dann nicht.

Frage: Hat mir noch jemand einen Tip? Durch den Dateinamen 95... sollte doch eigentlich sichergestellt sein, dass die Datei als letztes abgearbeitet wird, sofern keine "hoeheren" vorhanden sind. Von den oben genannten Regeln scheint keine auf den USB-Stick zuzutreffen (mount point).

Könnte das ein Bug sein? So etwas scheint es schon mal geg. zu haben: https://bugs.launchpad.net/ubuntu/+source/ltsp/+bug/335767
 

spoensche

Moderator
Teammitglied
Raphalon schrieb:
Dennoch haette ich noch folgende Frage: auf meinem SuSE 11.3 finden sich noch jede Menge rules-Files in /lib/udev/rules.d/ Werden diese Dateien alle mit eingelesen? Warum der separate Ordner - warum die Dateien nicht in /etc/udev/rules.d?

Udev ist nicht HAL. Die Udev Rules in /etc/udev/rules.d sind automatisch generierte Regeln und sorgen dafür, dass die Rules nicht jedes mal neu generiert werden müssen. Die eigentlichen Scripte und Programme für die Rules- Generierung liegen unter /lib/udev bzw. unter /usr/lib/udev.
Udev wird vom Kernel verwendet um die Gerätedateien unter /dev etc. zu erzeugen uvm.

HAL wird von KDE etc. verwendet.

Ist das ganze bei dir reproduzierbar?
 

josef-wien

Ultimate Guru
Unter KDE 3.5 funktioniert Deine fdi-Datei, die Meldungen bei lshal -m sind mit Ausnahme der vorletzten die gleichen wie bei Dir:
Code:
22:36:47.109: volume_uuid_2C4C_997C property volume.mount_point = '/media/usbstick'
Ob da bei KDE 4 wieder einmal etwas anders läuft?
 
OP
R

Raphalon

Newbie
@josef-wien: vielen Dank fürs Ausprobieren! Das bringt mich schon mal weiter.
@spoensche: klar ist HAL <> udev. Deshalb hatte ich die beiden mit 1.) und 2.) getrennt und erwähnt, daß ich beim Ausprobieren mit HAL die udev-Regel wieder gelöscht hatte. Die Architektur ist mir im groben mittlerweile klar.

Habe meinen Stick nochmal überprüft und wegen eines mit fdisk nicht reparablen Fehlers neu formatiert - mit demselben Ergebnis (uuid muß man dann halt anpassen, denn diese wird neu vergeben). Werde nochmal ein bißchen rumprobieren, evtl. mal ein cross-posting in einem anderen Forum machen. Sobald ich was Neues weiß, werde ich es hier noch ergänzen.

Meine Fragen oben zu den Dateien von HAL ist ebenfalls in der oben genannten Datei hal-spec.html beantwortet. Es steht en detail drin, welche fdi (device information file) es gibt sowie deren Unterschiede. Auch wird die Reihenfolge der Ausführung beschrieben.
 
OP
R

Raphalon

Newbie
Habe jetzt mal ein Cross-Posting unter http://www.suseforum.de/suse-mobile...oint-f-r-ext-speicher-nicht-zu.html#post29051 gemacht - und nachdem ich hier vergessen habe, den Link einzutragen, wurde ich freundlicherweise darauf aufmerksam gemacht. Daher hole ich dies hiermit nach.

Was ich gestern noch ausprobiert hatte: Wenn man die fdi - Datei ändert und ein nicht definiertes Property definiert, wie z.B. <merge key="funny.stuff" type="string">justAjoke</merge>, so wird dieses ebenfalls von HAL in die DB geschrieben (überprüft mit lshal). Somit kann es auch sein, daß die Properties volume.policy.should_mount und volume.policy.desired_mount_point zwar hinzugefügt, aber nicht mehr verwendet werden.

Vermutlich werde ich das Thema dann erst mal sein lassen - es war auch keine technisches Erfordernis, sondern ein "Lernen durch Ausprobieren".
 
Oben