IvmanAutomount (notes)

Материал из ALT Linux Wiki
42px-Wikitext-ru.svg.png
Эту статью следует викифицировать.
Merge-arrow.svg
Необходимо перенести содержимое этой статьи в статью IvmanAutomount
Вы можете помочь проекту, объединив их.


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.