IvmanAutomount (notes)
kde 3.5.2: если стартует при незапущенном hal, показывает в /media устройства в виде:
жесткий диск (hda2) жесткий диск (hda5)
и даже для смонтированных nfs:
жесткий диск (amp:/net)
это fstab бэкэнд. если служба «управление подключаемыми устройствами» стартует при запущенном hal, то используется hal бэкэнд:
носитель 1.2 Gb носитель 4.1 Gb USB DISK
причем, имя устройства все еще можно увидеть в поле «ссылка». ссылки ведут в виртуальные url (media kioslave) вида system:/media/devname: в system:/media/hda2 открывается /, а usb disk (system:/media/sdb1) смонтирован вовсе не в /media/sdb1, и даже не в /media/disk. то ли media:/ сам лезет к устройству, то ли открывает в соответствии с /proc/mounts. больше похоже на второе, так как при открытии устройство автоматически монтируется, если было отмонтировано.
При втыкании кде монтирует разделы флэшек в /media/disk???. (говорят, с помощью pmount — сомневаюсь, так как при control pmount restricted все равно монтирует, из чего я делаю вывод, что pmount тут почти совсем ни при чем). при этом
$ grep sdb /proc/mounts /dev/sda1 /media/disk vfat rw,nosuid,nodev,noexec,noatime,uid=502,fmask=0077,dmask=0077,codepage=cp866,iocharset=koi8-r,utf8 0 0
root@pad /etc/hal/policy # hal-find-by-property --key block.device --string /dev/sda1 /org/freedesktop/Hal/devices/volume_uuid_3087_3C40 root@pad /etc/hal/policy # lshal -l --show /org/freedesktop/Hal/devices/volume_uuid_3087_3C40 > lshal.1 root@pad /etc/hal/policy # cat lshal.1 udi = '/org/freedesktop/Hal/devices/volume_uuid_3087_3C40' info.hal_mount.mounted_by_uid = 502 (0x1f6) (int) info.hal_mount.created_mount_point = '/media/disk' (string) wmvolman.should_mount = true (bool) wmvolman.should_display = true (bool) volume.unmount.valid_options = {'lazy'} (string list) volume.mount.valid_options = {'ro', 'sync', 'dirsync', 'noatime', 'nodiratime', 'noexec', 'quiet', 'utf8', 'shortname=', 'codepage=', 'iocharset=', 'umask=', 'dmask=', 'fmask=', 'uid='} (string list) org.freedesktop.Hal.Device.Volume.method_execpaths = {'hal-system-storage-mount', 'hal-system-storage-unmount', 'hal-system-storage-eject'} (string list) org.freedesktop.Hal.Device.Volume.method_signatures = {'ssas', 'as', 'as'} (string list) org.freedesktop.Hal.Device.Volume.method_names = {'Mount', 'Unmount', 'Eject'} (string list) info.interfaces = {'org.freedesktop.Hal.Device.Volume'} (string list) volume.ignore = false (bool) info.udi = '/org/freedesktop/Hal/devices/volume_uuid_3087_3C40' (string) volume.partition.msdos_part_table_type = 6 (0x6) (int) info.product = 'USB DISK' (string) volume.size = 254263296 (0xf27c000) (uint64) volume.num_blocks = 496608 (0x793e0) (int) volume.block_size = 512 (0x200) (int) volume.partition.number = 1 (0x1) (int) info.capabilities = {'volume', 'block'} (string list) info.category = 'volume' (string) volume.is_partition = true (bool) volume.is_disc = false (bool) volume.is_mounted = true (bool) volume.mount_point = '/media/disk' (string) volume.label = 'USB DISK' (string) volume.uuid = '3087-3C40' (string) volume.fsversion = 'FAT16' (string) volume.fsusage = 'filesystem' (string) volume.fstype = 'vfat' (string) storage.model = '' (string) block.storage_device = '/org/freedesktop/Hal/devices/storage_serial_CANYON_CN_USB20EFD0256A_ccb3380364035e' (string) block.is_volume = true (bool) block.minor = 1 (0x1) (int) block.major = 8 (0x8) (int) block.device = '/dev/sda1' (string) linux.hotplug_type = 3 (0x3) (int) info.parent = '/org/freedesktop/Hal/devices/storage_serial_CANYON_CN_USB20EFD0256A_ccb3380364035e' (string) linux.sysfs_path_device = '/sys/block/sda/sda1' (string) linux.sysfs_path = '/sys/block/sda/sda1' (string)
«безопасно извлечь» соответственно нормально отмонтирует флэшку, получая
root@pad /etc/hal/policy # lshal -l --show /org/freedesktop/Hal/devices/volume_uuid_3087_3C40 > lshal.2 root@pad /etc/hal/policy # diff -Naur lshal.1 lshal.2 @@ -1,6 +1,4 @@ udi = '/org/freedesktop/Hal/devices/volume_uuid_3087_3C40' - info.hal_mount.mounted_by_uid = 502 (0x1f6) (int) - info.hal_mount.created_mount_point = '/media/disk' (string) wmvolman.should_mount = true (bool) wmvolman.should_display = true (bool) volume.unmount.valid_options = {'lazy'} (string list) @@ -21,8 +19,8 @@ info.category = 'volume' (string) volume.is_partition = true (bool) volume.is_disc = false (bool) - volume.is_mounted = true (bool) - volume.mount_point = '/media/disk' (string) + volume.is_mounted = false (bool) + volume.mount_point = '' (string) volume.label = 'USB DISK' (string) volume.uuid = '3087-3C40' (string) volume.fsversion = 'FAT16' (string)
однако, если после этого смонтировать ее вручную:
$ id uid=502(gns) gid=502(gns) группы=10(wheel),108(xgrp),502(gns) $ pmount /dev/sdb1 $ grep sdb /proc/mounts /dev/sdb1 /media/sdb1 vfat rw,nosuid,nodev,noexec,uid=502,gid=502,fmask=0077,dmask=0077,codepage=cp866,iocharset=utf8,shortname=mixed,quiet 0 0
то КДЕ ee открывает (даже при нестандартном mount_point), но не может отмонтировать с руганью:
kio_media_mounthelper: volume mounted by uid unknown cannot be unmounted by uid 502.
что похоже связано с:
root@pad /etc/hal/policy # lshal -l --show /org/freedesktop/Hal/devices/volume_uuid_3087_3C40 > lshal.3 root@pad /etc/hal/policy # diff -Naur lshal.1 lshal.3 udi = '/org/freedesktop/Hal/devices/volume_uuid_3087_3C40' - info.hal_mount.mounted_by_uid = 502 (0x1f6) (int) - info.hal_mount.created_mount_point = '/media/disk' (string) wmvolman.should_mount = true (bool) wmvolman.should_display = true (bool) volume.unmount.valid_options = {'lazy'} (string list) @@ -22,7 +20,7 @@ volume.is_partition = true (bool) volume.is_disc = false (bool) volume.is_mounted = true (bool) - volume.mount_point = '/media/disk' (string) + volume.mount_point = '/media/sda1' (string) volume.label = 'USB DISK' (string) volume.uuid = '3087-3C40' (string) volume.fsversion = 'FAT16' (string)
но кто и зачем добавляет эти info.hal_mount.mounted_by_uid — неясно. если KDE монтирование делает через hal method — это многое объясняет. или hal добавляет сам после вызова callout, что логично. Либо добавляет сам KDE — это было бы бессмысленно, имхо.
Из вышесказанного следует, что при использовании ivman 0.6.12 / pmount 0.9.9 про размонтирование из КДЕ можно забыть.
предположим, мы научим ivman (скорее, pmount-hal) работать через вызов mount method. тогда надо выяснить, как заставить его использовать тот mount_point что я скажу вместо /media/disk. KDE вроде бы как-то это делает, ecли задать в свойствах /media/canyon — монтируется в /media/canyon-1 (возможно — добавляется номер раздела).
hal policy враги выкинули вместе с desired_mount_point :(поэтому выбор точки монтирования придется реализовывать в конфигах ivman.
[root@nirvana bin]# grep hal_mount * [root@nirvana bin]# cd /usr/X11R6/bin/ [root@nirvana bin]# grep hal_mount * [root@nirvana bin]# cd /usr/sbin/ [root@nirvana sbin]# grep hal_mount * Binary file hald matches
Вызывать HAL method для монтирования можно, например, таким способом:
dbus-send --system --print-reply --dest=org.freedesktop.Hal "$UDI" org.freedesktop.Hal.Device.Volume.Mount string:"$MOUNT_POINT" string: array:string:"$MOUNT_OPTIONS"
Параметры:
- $UDI — идентификатор объекта HAL.
- $MOUNT_POINT — требуемое имя для точки монтирования (без /media/ — эту часть изменить нельзя). Можно указать пустую строку, тогда по умолчанию будет использована метка тома. Если имя уже занято, к нему автоматически добавляется номер, делающий его уникальным (name-1, name-2, …).
- $MOUNT_OPTIONS — опции монтирования в обычном виде (через запятую). Опции можно указывать только из набора, указанного в свойстве volume.mount.valid_options, причём на опцию uid= налагаются дополнительные ограничения — можно указывать только идентификатор пользователя, вызывающего эту команду, в виде числа (то есть, uid=`id -u`). Опции noexec,nosuid,nodev устанавливаются принудительно. Никакие другие опции автоматически не добавляются — в частности, опции codepage=... и iocharset=..., если они требуются для монтируемой ФС, нужно указывать явно.
Отмонтировать смонтированное таким образом устройство можно командой:
dbus-send --system --print-reply --dest=org.freedesktop.Hal "$UDI" org.freedesktop.Hal.Device.Volume.Unmount array:string:
Реализацию этих методов можно посмотреть в скриптах /usr/share/hal/scripts/hal-system-storage-mount, /usr/share/hal/scripts/hal-system-storage-unmount.