Russian Qt Forum
Ноябрь 25, 2024, 15:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Определение типа девайса  (Прочитано 8107 раз)
cresta
Гость
« : Март 01, 2009, 21:28 »

Можно ли определить тип девайса под линуксом? Fixed, removable, cd-rom e.t.c....
Например для /dev/sda1 (или по его точке монтирования /mnt/winc)

Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #1 : Март 01, 2009, 21:45 »

Смотри в сторону HAL: http://freedesktop.org/wiki/Software/hal
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
cresta
Гость
« Ответ #2 : Март 01, 2009, 23:28 »

По-моему, это не совсем то.
Для использования libhal и предлагаемых им инструментов, нужно знать о девайсе больше, чем у меня есть.

Например, вот вывод от hal-device  информации о винчестере:

Код:
90: udi = '/org/freedesktop/Hal/devices/pci_8086_2922_scsi_host_0_scsi_device_lun0'
  info.subsystem = 'scsi'  (string)
  scsi.model = 'ST3250410AS'  (string)
  info.product = 'SCSI Device'  (string)
  scsi.vendor = 'ATA'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0'  (string)
  scsi.type = 'disk'  (string)
  info.udi = '/org/freedesktop/Hal/devices/pci_8086_2922_scsi_host_0_scsi_device_lun0'  (string)
  info.parent = '/org/freedesktop/Hal/devices/pci_8086_2922_scsi_host_0'  (string)
  info.linux.driver = 'sd'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  scsi.host = 4  (0x4)  (int)
  linux.subsystem = 'scsi'  (string)
  scsi.bus = 0  (0x0)  (int)
  scsi.target = 0  (0x0)  (int)
  scsi.lun = 0  (0x0)  (int)

Здесь выводится информация о железке как таковой, без учета разделов /dev/xxx которые на ней присутствуют.

Если использовать hal-find-by-property, то опять же из полученного результата никак не получить список разделов:
Цитировать
[cr@localhost warnspace]$ hal-find-by-property --key storage.drive_type --string disk
/org/freedesktop/Hal/devices/storage_serial_USBest_USB2FlashStorage_00000000000004_0_0
/org/freedesktop/Hal/devices/storage_serial_SATA_ST3120026AS_3JT2HCKF
/org/freedesktop/Hal/devices/storage_serial_SATA_ST3250410AS_6RYESR2P

Более того, даже не определить, какой это disk: fixed или removable


Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #3 : Март 02, 2009, 04:53 »

По-моему, это не совсем то.

Нет, это всё и даже больше Улыбающийся

Для использования libhal и предлагаемых им инструментов, нужно знать о девайсе больше, чем у меня есть.

Например, вот вывод от hal-device  информации о винчестере:

Код:
90: udi = '/org/freedesktop/Hal/devices/pci_8086_2922_scsi_host_0_scsi_device_lun0'
  info.subsystem = 'scsi'  (string)
  scsi.model = 'ST3250410AS'  (string)
  info.product = 'SCSI Device'  (string)
  scsi.vendor = 'ATA'  (string)
  linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1f.2/host4/target4:0:0/4:0:0:0'  (string)
  scsi.type = 'disk'  (string)
  info.udi = '/org/freedesktop/Hal/devices/pci_8086_2922_scsi_host_0_scsi_device_lun0'  (string)
  info.parent = '/org/freedesktop/Hal/devices/pci_8086_2922_scsi_host_0'  (string)
  info.linux.driver = 'sd'  (string)
  linux.hotplug_type = 2  (0x2)  (int)
  scsi.host = 4  (0x4)  (int)
  linux.subsystem = 'scsi'  (string)
  scsi.bus = 0  (0x0)  (int)
  scsi.target = 0  (0x0)  (int)
  scsi.lun = 0  (0x0)  (int)

Здесь выводится информация о железке как таковой, без учета разделов /dev/xxx которые на ней присутствуют.

libhal_drive_find_all_volumes, http://geexbox.org/~ben/list_shares.c

Более того, даже не определить, какой это disk: fixed или removable

свойство storage.removable можно получить с помощью обычного libhal, или смотреть в сторону libhal-storage, там куча всего.
Записан
cresta
Гость
« Ответ #4 : Март 02, 2009, 08:32 »

libhal-storage я таки проглядел, каюсь...
пойду разбираться.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #5 : Март 02, 2009, 09:00 »

А вот тут смотрели ? Может поможет!

http://www.linux.org.ru/wiki/en/HAL
Записан

ArchLinux x86_64 / Win10 64 bit
cresta
Гость
« Ответ #6 : Март 02, 2009, 21:24 »

Спасибо всем!
Порылся по вашим ссылкам, почитал, сделал так:
Нахожу устройства, сидящие на usb:

Код:
[cr@localhost hal-0.5.12rc1]$ hal-find-by-property --key storage.bus --string usb
/org/freedesktop/Hal/devices/storage_serial_Sony_Storage_Media
/org/freedesktop/Hal/devices/storage_serial_USBest_USB2FlashStorage_00000000000004_0_0

Затем для каждой точки монтирования нахожу uuid:
Код:
[cr@localhost hal-0.5.12rc1]$ hal-find-by-property --key volume.mount_point --string /media/disk
/org/freedesktop/Hal/devices/volume_uuid_CC21_0F55

Каждый из найденных uuid передаю дальше в dbus-send:

Код:
[cr@localhost hal-0.5.12rc1]$ dbus-send --system --print-reply --dest=org.freedesktop.Hal /org/freedesktop/Hal/devices/volume_uuid_CC21_0F55 org.freedesktop.Hal.Device.GetAllProperties

Получаю вывод от dbus-send и ищу в нем имена usb-девайсов, полученных на первом шаге:
Код:
method return sender=:1.1 -> dest=:1.101 reply_serial=2
   array [
      dict entry(
         string "info.product"
         variant             string "Volume (vfat)"
      )
      dict entry(
         string "linux.hotplug_type"
         variant             int32 3
      )
      dict entry(
         string "info.udi"
         variant             string "/org/freedesktop/Hal/devices/volume_uuid_CC21_0F55"
      )
      dict entry(
         string "block.storage_device"
         variant             string "/org/freedesktop/Hal/devices/storage_serial_USBest_USB2FlashStorage_00000000000004_0_0"
      )
      dict entry(
         string "volume.fstype"
         variant             string "vfat"
      )
      dict entry(
         string "volume.fsusage"
         variant             string "filesystem"
      )
      dict entry(
         string "volume.fsversion"
         variant             string "FAT32"
      )
      dict entry(
         string "volume.uuid"
         variant             string "CC21-0F55"
      )
      dict entry(
         string "volume.label"
         variant             string ""
      )
      dict entry(
         string "volume.mount_point"
         variant             string "/media/disk"
      )
      dict entry(
         string "volume.is_mounted"
         variant             boolean true
      )
      dict entry(
         string "volume.is_mounted_read_only"
         variant             boolean false
      )
      dict entry(
         string "volume.linux.is_device_mapper"
         variant             boolean false
      )
      dict entry(
         string "volume.is_disc"
         variant             boolean false
      )
      dict entry(
         string "info.interfaces"
         variant             array [
               string "org.freedesktop.Hal.Device.Volume"
            ]
      )
      dict entry(
         string "volume.is_partition"
         variant             boolean true
      )
      dict entry(
         string "volume.partition.number"
         variant             int32 1
      )
      dict entry(
         string "volume.block_size"
         variant             int32 512
      )
      dict entry(
         string "volume.num_blocks"
         variant             int32 31588288
      )
      dict entry(
         string "volume.size"
         variant             uint64 16173203456
      )
      dict entry(
         string "block.device"
         variant             string "/dev/sdc1"
      )
      dict entry(
         string "volume.partition.start"
         variant             uint64 32256
      )
      dict entry(
         string "info.category"
         variant             string "volume"
      )
      dict entry(
         string "block.major"
         variant             int32 8
      )
      dict entry(
         string "volume.partition.media_size"
         variant             uint64 16173235712
      )
      dict entry(
         string "info.capabilities"
         variant             array [
               string "volume"
               string "block"
            ]
      )
      dict entry(
         string "block.minor"
         variant             int32 33
      )
      dict entry(
         string "volume.partition.scheme"
         variant             string "mbr"
      )
      dict entry(
         string "block.is_volume"
         variant             boolean true
      )
      dict entry(
         string "volume.partition.type"
         variant             string "0x0c"
      )
      dict entry(
         string "volume.partition.label"
         variant             string ""
      )
      dict entry(
         string "linux.sysfs_path"
         variant             string "/sys/block/sdc/sdc1"
      )
      dict entry(
         string "volume.partition.uuid"
         variant             string ""
      )
      dict entry(
         string "info.parent"
         variant             string "/org/freedesktop/Hal/devices/storage_serial_USBest_USB2FlashStorage_00000000000004_0_0"
      )
      dict entry(
         string "volume.partition.flags"
         variant             array [
               string "boot"
            ]
      )
      dict entry(
         string "volume.ignore"
         variant             boolean false
      )
      dict entry(
         string "storage.model"
         variant             string ""
      )
      dict entry(
         string "org.freedesktop.Hal.Device.Volume.method_names"
         variant             array [
               string "Mount"
               string "Unmount"
               string "Eject"
            ]
      )
      dict entry(
         string "org.freedesktop.Hal.Device.Volume.method_signatures"
         variant             array [
               string "ssas"
               string "as"
               string "as"
            ]
      )
      dict entry(
         string "org.freedesktop.Hal.Device.Volume.method_argnames"
         variant             array [
               string "mount_point fstype extra_options"
               string "extra_options"
               string "extra_options"
            ]
      )
      dict entry(
         string "org.freedesktop.Hal.Device.Volume.method_execpaths"
         variant             array [
               string "hal-storage-mount"
               string "hal-storage-unmount"
               string "hal-storage-eject"
            ]
      )
      dict entry(
         string "volume.mount.valid_options"
         variant             array [
               string "ro"
               string "sync"
               string "dirsync"
               string "noatime"
               string "nodiratime"
               string "noexec"
               string "quiet"
               string "remount"
               string "exec"
               string "utf8"
               string "shortname="
               string "codepage="
               string "iocharset="
               string "umask="
               string "dmask="
               string "fmask="
               string "uid="
               string "flush"
            ]
      )
      dict entry(
         string "volume.unmount.valid_options"
         variant             array [
               string "lazy"
            ]
      )
   ]

Нашёл - значит removable, если нет, проверяю поле volume.is_disc. которое равно true в случае cd-rom'a и false в случае винчестера.

Такой вот геморройный алгоритм.
Но и этот алгоритм на некоторых разделах даёт сбой: некоторые uuid dbus-send категорически отказывается принимать, возвещая об ошибке и ссылаясь на некие баги в прогах, использующих D-Bus:
process 11609: arguments to dbus_message_new_method_call() were incorrect, assertion "_dbus_check_is_valid_path (path)" failed in file dbus-message.c line 1074.
This is normally a bug in some application using the D-Bus library.

Такие вот пирожки Грустный

Что делать?

libhal, которая советовалась выше, использовать пока не решился. Фиг его знает, как она состыкуется с моей системой.
У меня установлена libhal1. Версия: 0.5.11-0.rc2.1mdv2008.1. Тот list_shares.c, который советовался выше, ссылается на <libhal.h> и <libhal-storage.h>,  которых у меня нет.
Ставить devel-пакет hal-0.5.12rc1?

« Последнее редактирование: Март 02, 2009, 21:42 от cresta » Записан
BRE
Гость
« Ответ #7 : Март 02, 2009, 21:41 »

Сейчас посмотрел это:
Цитировать
libhal_drive_find_all_volumes, http://geexbox.org/~ben/list_shares.c

Почему ты от libhal-storage отказался, вроде все что тебе нужно делается в примере?
Записан
cresta
Гость
« Ответ #8 : Март 02, 2009, 21:44 »

Всё-таки стоит попробовать?

Просто был неудачный опыт замены системных либ на более новую версию, поэтому как-то стрёмно Грустный
Записан
BRE
Гость
« Ответ #9 : Март 02, 2009, 21:47 »

Всё-таки стоит попробовать?

Просто был неудачный опыт замены системных либ на более новую версию, поэтому как-то стрёмно Грустный
Ты переживаешь, что интерфейс libhal поменяют или что?
Записан
cresta
Гость
« Ответ #10 : Март 02, 2009, 22:10 »

Кроме интерфейса libhal через инклюды тянется ещё и весь dbus
Тупо использовать libhal.h и libhal-storage.h на имеющихся libhal.so и  libhal-storage.so не катит:
у меня нет кучи фалов, подключаемых через include <dbus/dbus.h>. Уже попробовал. Также пробовал компильнуть hal-0.5.12rc1 - тоже отсутствуют многие хидеры (usb.h, pci.h, etc) и ещё под конец конфигурирования error: PolicyKit not explicitly disabled and no PolicyKit found
Записан
BRE
Гость
« Ответ #11 : Март 02, 2009, 22:13 »

Кроме интерфейса libhal через инклюды тянется ещё и весь dbus
Тупо использовать libhal.h и libhal-storage.h на имеющихся libhal.so и  libhal-storage.so не катит:
у меня нет кучи фалов, подключаемых через include <dbus/dbus.h>. Уже попробовал. Также пробовал компильнуть hal-0.5.12rc1 - тоже отсутствуют многие хидеры (usb.h, pci.h, etc) и ещё под конец конфигурирования error: PolicyKit not explicitly disabled and no PolicyKit found
Так может стоит доустановить необходимые devel пакеты?
Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #12 : Март 02, 2009, 23:18 »

Неужели в Мандриве нельзя обновиться посредством пакетного менеджера? Не верю Улыбающийся
Записан
cresta
Гость
« Ответ #13 : Март 04, 2009, 09:51 »

К сожалению, не могу найти devel-пакетов для Mandriva 2008.1 Грустный
А имеющиеся у меня хидеры версии 0.5.12 к установленным в системе либам 0.5.11 не подходят.

Видимо придётся пока отложить это дело


Спасибо всем.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.062 секунд. Запросов: 23.