Saturday, December 9th, 2006 01:24 pm
Например, у вас есть внешний USB HDD и внешняя же флэшка. В зависимости от того, в каком порядке их втыкать, у них будут разные имена. Например, у одного /dev/sda, у другого /dev/sdb. Или наоборот. Что еще хуже, диск может быть разбит на разделы, и у него надо монтировать /dev/sd?1, а флэшка используется вся целиком, как дискета, и у нее надо монтировать собственно /dev/sd?.
Или, скажем, сетевые карты при загрузке обнаруживаются в разном порядке, и получается, что eth1 - это иногда wifi, а иногда firewire. А иногда наоборот.
В результате настраивать точки монтирования или параметры сетевых интерфейсов становится очень неудобно. Но есть выход.

Подключаем диск, смотрим в /var/log/messages, как его нынче назвали. Предположим, sda. И на нем есть раздел sda1.
Запускаем
# udevinfo -a -p /sys/block/sda/sda1

и видим что-то вроде:
  looking at device '/block/sda/sda1':
    KERNEL=="sda1"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{stat}=="      89      178        0        0"
    ATTR{size}=="195366402"
    ATTR{start}=="63"
    ATTR{dev}=="8:1"

Выбираем из этой кучки параметров что-нибудь достаточно уникальное. Например, размер.
Создаем файл /etc/udev/rules.d/10_local.rules, в который пишем
KERNEL=="sd?1", SUBSYSTEM=="block", ATTR{size}=="195366402", SYMLINK+="usbdisk"

Проверяем:
# udevtest /sys/block/sda/sda1

Если в выдаче есть строчка
udev_node_add: creating symlink '/dev/usbdisk' to 'sda1'

значит, все хорошо. Если не появилась, ищем ошибку в параметрах проверки.
Перегружать машину после этого не обязательно, правила начинают действовать сразу. Достаточно отключить диск и подключить его обратно - и магическим образом появится /dev/usbdisk, который отныне можно смело использовать в /etc/fstab.

Для дисков, которые используются целиком, без разбивки на разделы (типично для флэшек с FAT), удобно проверять ATTRS{vendor}, ATTRS{model}, ATTRS{rev} и другие более уникальные вещи, чем размер.

То же самое можно делать и для сетевых карт - у них уникальным параметром является MAC-адрес. Учтите, что в правилах для udev буквы в мак-адресах надо писать маленькими, тогда как ifconfig показывает их большими.
Например:
KERNEL=="eth*", SYSFS{address}=="00:0b:5d:xx:xx:xx", NAME="lan"
KERNEL=="eth*", SYSFS{address}=="00:0e:35:xx:xx:xx", NAME="wlan"
KERNEL=="eth*", SYSFS{address}=="00:00:0e:10:01:xx:xx:xx", NAME="eth1394"

Отныне проводной интерфейс всегда будет называться lan, wifi-интерфейс - wlan, а firewire - eth1394, и они больше не перепутаются.

А еще можно при повялении девайса выполнять некоторые команды, например, поднимать bluetooth'ный интерфейс, если он почему-то не поднимается сам.
KERNEL=="hci*", RUN+="/usr/sbin/hciconfig %k up"
.
Ну и так далее - аудиокарты, принтеры, фотокамеры...

А как в такой же ситуации явно назначить букву для диска или точку монтирования в Windows - я не знаю.
Tags:
Saturday, December 9th, 2006 01:31 pm (UTC)
А как в такой же ситуации явно назначить букву для диска или точку монтирования в Windows — я не знаю

Винда, как обычно, всё делает сама ;)
В Disk Management назначить нужному устройству нужную букву, при следующем подключении она будет ему молча выдаваться. Например, постоянно используемая USB-флэшка у меня висит на K:, и потому с временно подключаемыми флэшками, плеером и прочей фигнёй никак не интерферирует — им винда даёт первую свободную букву (F:).
Saturday, December 9th, 2006 01:34 pm (UTC)
ага, только, afaik, она это в бутблок устройства прописывает или куда-то там :)
Saturday, December 9th, 2006 01:47 pm (UTC)
Для винчестеров она хранит их серийный номер (он уникален для каждого диска) в реестре.
Для флэшек — ХЗ, вероятно, тоже.
Saturday, December 9th, 2006 01:49 pm (UTC)
гм. в случае с подтыканием диска с ntfs на другую машину были случаи, что он вставал на ту же букву диска, что и на предыдущей системе, а не на первую свободную
Sunday, December 10th, 2006 01:45 pm (UTC)
в нтфсе буква диска хранится где-то там в системной области нтфса.
Sunday, December 10th, 2006 01:56 pm (UTC)
Интересно, а что будет, если я воткну в одну машину два диска, у каждого из которых ранее была написана одна и та же буква?

P.S. А в FAT'е она где хранится?
Sunday, December 10th, 2006 02:06 pm (UTC)
Будет.. я думаю, будет пиздец. Но сейчас сюда прибегут евангелисты™, и всё разъяснят :)

А в фате она нигде не хранится. Разве что в регистри.
Friday, February 2nd, 2007 10:58 am (UTC)
есть в папке System Volume Information файлик MountPointManagerRemoteDatabase. вот там оно и хранит всякие точки монтирования для текущего тома. Плюс где-то ведет базу Removable Media как раз для сменных флешек, винтов, ленточек и т.д..
Saturday, December 9th, 2006 01:36 pm (UTC)
А с принтерами как быть? Эту шутку я уже знаю - тот же принтер, воткнутый в другой USB-разъем, опознается как новый со всеми причитающимися последствиями..
Friday, February 2nd, 2007 11:00 am (UTC)
принтеры, но и всякие мыши-клавы тоже. Очень забавен тот факт, что дрова ставятся только после логона, а если клава не в том порту, то попробуй без нее пароль набрать..
Tuesday, May 15th, 2007 05:46 pm (UTC)
есть еще
MOUNTVOL - Creates, deletes, or lists a volume mount point.

\\?\Volume{dbe6bf74-07b1-11db-8cd9-000c6e40997a}\
N:\

это мой ипод. монтировать можно по этому UUID.

это он отмонтирован:

\\?\Volume{dbe6bf74-07b1-11db-8cd9-000c6e40997a}\
*** NO MOUNT POINTS ***

монтируем:
O:\>mountvol o:\ipod \\?\Volume{dbe6bf74-07b1-11db-8cd9-000c6e40997a}\

смотрим - смонтирован:
\\?\Volume{dbe6bf74-07b1-11db-8cd9-000c6e40997a}\
O:\ipod\

не совсем по теме, но вдруг пригодиться.
P.S. не пробуйте отмонтировать на win2000 системный диск, на XP/2k3 вроде можно, перемонтирует :)
Saturday, December 9th, 2006 01:45 pm (UTC)
вообще-то есть еще такая штука, как UUID и LABEL для дисковых устройств..
но в целом, спасибо, да - у меня руки не доходили почитать FM на эту тему
Saturday, December 9th, 2006 02:43 pm (UTC)
Во, а можно я задам вопрос на засыпку? Есть handspring visor (это такой древний палм). При нажатии на кнопку синхронизации он создает два usb устройства (например, /dev/ttyUSB0 & /dev/ttyUSB1 или /dev/ttyUSB1 & /dev/ttyUSB2 - если ttyUSB0 уже был занят). Так вот вопрос, как сделать так, чтобы /dev/pilot линковался именно на _второе_ из этих устройств?
Saturday, December 9th, 2006 04:23 pm (UTC)
А что такое "второе"? Тот, кого воткнули вторым? ;) Пальмы, вероятно, тоже можно по каким-нибудь идентификаторам различить.
Sunday, December 10th, 2006 03:22 pm (UTC)
О, ура, нашел!

< SYSFS{dev}=="188:0"
---
> SYSFS{dev}=="188:1"

Так что различить можно!
Sunday, December 10th, 2006 05:23 pm (UTC)
Меня терзают смутные сомнения, что это атрибут не самого девайса, а порядковый номер aka minor, назначенный драйвером.
То есть, различить-то их, понятное дело, можно, но определить, что конкретно этот - второй от пальма - нельзя.
Можно попробовать извратиться с запуском внешнего скрипта, который будет следить за количеством девайсов.. udev так тоже может
Sunday, December 10th, 2006 05:52 pm (UTC)
Не, хочется без внешних скриптов. Чиста на рулезах.
Sunday, December 10th, 2006 05:55 pm (UTC)
В общем, я выдал в файлы usb0 & usb1 результат udevinfo на два tty, созданные визором. И вот что вижу в дифф:

svu@sputnik:~$ diff usb0 usb1
8,9c8,9
< looking at device '/class/tty/ttyUSB0':
< KERNEL=="ttyUSB0"
---
> looking at device '/class/tty/ttyUSB1':
> KERNEL=="ttyUSB1"
11c11
< SYSFS{dev}=="188:0"
---
> SYSFS{dev}=="188:1"
13,14c13,14
< looking at device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.0/ttyUSB0':
< ID=="ttyUSB0"
---
> looking at device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.0/ttyUSB1':
> ID=="ttyUSB1"
Sunday, December 10th, 2006 06:18 pm (UTC)
Это понятно. Я к тому, что если в момент подключения визора /dev/ttyUSB0 уже существовал, то у новых ttyUSB1 и ttyUSB2 SYSFS{dev} будут уже не :0 и :1, а :1 и :2. И правило добавления симлинка накроется медным тазом. И это, кажется, неизлечимо, потому что у этих девайсов ничего уникального нету.
Sunday, December 10th, 2006 06:49 pm (UTC)
Правда, молодцы работают в компании Palm?:) Это не хэндспрингсовские штучки, это палм придумал такую жудь.

А какие мысли будут по поводу скрипта?
Tuesday, December 12th, 2006 10:36 pm (UTC)
Попробовать запоминать время появления предыдущего аналогичного девайса, и если нынешний почвился вскорости после предыдущего, то приделывать к нему имя /dev/pilot
Tuesday, December 12th, 2006 10:48 pm (UTC)
Да, мысль понятна. хотя как-то гниловато, эвристики какие-то левые... А вообще как в файл с рулезами прописать скрипт?
Tuesday, December 12th, 2006 10:58 pm (UTC)
PROGRAM="/bin/foo %k", SYMLINK+="%c{1}", GROUP="%c{2}"

Параметром туда передается ядреное имя девайса, а на выходе скрипт должен сгенерировать последовательность слов, разделенных пробелами. на которые потом можно ссылаться как %c{i}
Tuesday, December 12th, 2006 11:25 pm (UTC)
Не богато. Но, по идее, достаточно. В общем, небольшая проблема только в том, что надо хранить где-то состояние между запусками foo.
Wednesday, December 13th, 2006 08:02 am (UTC)
Ну да, а я других вариантов не вижу, если у самих девайсов ничего уникального нет. Придется запоминать внешние факторы.
Wednesday, December 13th, 2006 08:08 am (UTC)
Как я их нэнавижу! Нэнатуралы. Даже нокию с ее mrouter, наверное, нэнавижу меньше.
Sunday, December 10th, 2006 07:21 pm (UTC)
Да, про то, что это всего лишь последовательность minor я как-то мощщно стормозил.
Saturday, December 9th, 2006 08:14 pm (UTC)
Не совсем понял. То есть, ты включаешь этот визор в usb-порт, нажимаешь на нем кнопку, и при этом компьютер обнаруживает два usb-serial девайса, так? А нужно из них именно второе?

А скажи
udevinfo -a -p `udevinfo -q path -n /dev/ttyUSB0`
и, соответственно,
udevinfo -a -p `udevinfo -q path -n /dev/ttyUSB1`
Sunday, December 10th, 2006 03:24 pm (UTC)
Я посмотрел на результаты и нашел разницу в SYSFS{dev}. Спасибо за идею. Куда б выложить файл - чтоб не приходилось каждому владельцу древнего палма стоять на этих граблях? Есть ли где какая-нибудь библиотечка?
Sunday, December 10th, 2006 03:27 pm (UTC)
В upstream к udev, вероятно. Плюс дистрибутивостроителям.
Sunday, December 10th, 2006 03:31 pm (UTC)
Пожалуй да, в udev его
Saturday, December 9th, 2006 06:52 pm (UTC)
В случае с современными дистрами все гораздо проще. Смотрим label диска и в fstab вместо /dev/sda1 например пишем LABEL=WesternDisk как у меня :)
Saturday, December 9th, 2006 08:07 pm (UTC)
А оно с не-ext[23] файловыми системами работает?
И для сетевых карт это точно не поможет.
Sunday, December 10th, 2006 05:06 am (UTC)
Осталось придумать "что-нибудь достаточно уникальное" для других USB-устройств.
USB-to-Serial, например.
Sunday, December 10th, 2006 10:44 am (UTC)
мне ни разу не приходилось с такими работать. Да еще одновременно. Можно посмотреть на вывод
udevinfo -a -p `udevinfo -q path -n /dev/ttyUSB0`
?
Sunday, December 10th, 2006 03:26 pm (UTC)
У меня usb-to serial (к нему приделан x10 контроллер)

svu@tosha:~$ ls /dev/ttyUSB0
/dev/ttyUSB0
svu@tosha:~$ udevinfo -q path -n /dev/ttyUSB0
no record for 'ttyUSB0' in database
Sunday, December 10th, 2006 04:37 pm (UTC)
Udevinfo starts with the device specified by the devpath and then
walks up the chain of parent devices. It prints for every device
found, all possible attributes in the udev rules key format.
A rule to match, can be composed by the attributes of the device
and the attributes from one single parent device.

  looking at device '/class/tty/ttyUSB0':
    KERNEL=="ttyUSB0"
    SUBSYSTEM=="tty"
    DRIVER==""
    ATTR{dev}=="188:0"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0/ttyUSB0':
    KERNELS=="ttyUSB0"
    SUBSYSTEMS=="usb-serial"
    DRIVERS=="pl2303"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1:1.0':
    KERNELS=="2-1:1.0"
    SUBSYSTEMS=="usb"
    DRIVERS=="pl2303"
    ATTRS{modalias}=="usb:v067Bp2303d0300dc00dsc00dp00icFFisc00ip00"
    ATTRS{bInterfaceProtocol}=="00"
    ATTRS{bInterfaceSubClass}=="00"
    ATTRS{bInterfaceClass}=="ff"
    ATTRS{bNumEndpoints}=="03"
    ATTRS{bAlternateSetting}==" 0"
    ATTRS{bInterfaceNumber}=="00"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1':
    KERNELS=="2-1"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{product}=="USB-Serial Controller"
    ATTRS{manufacturer}=="Prolific Technology Inc."
    ATTRS{maxchild}=="0"
    ATTRS{version}==" 1.10"
    ATTRS{devnum}=="2"
    ATTRS{speed}=="12"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceClass}=="00"
    ATTRS{bcdDevice}=="0300"
    ATTRS{idProduct}=="2303"
    ATTRS{idVendor}=="067b"
    ATTRS{bMaxPower}=="100mA"
    ATTRS{bmAttributes}=="80"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumInterfaces}==" 1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2':
    KERNELS=="usb2"
    SUBSYSTEMS=="usb"
    DRIVERS=="usb"
    ATTRS{configuration}==""
    ATTRS{serial}=="0000:00:1d.0"
    ATTRS{product}=="UHCI Host Controller"
    ATTRS{manufacturer}=="Linux 2.6.18-3-686 uhci_hcd"
    ATTRS{maxchild}=="2"
    ATTRS{version}==" 1.10"
    ATTRS{devnum}=="1"
    ATTRS{speed}=="12"
    ATTRS{bMaxPacketSize0}=="64"
    ATTRS{bNumConfigurations}=="1"
    ATTRS{bDeviceProtocol}=="00"
    ATTRS{bDeviceSubClass}=="00"
    ATTRS{bDeviceClass}=="09"
    ATTRS{bcdDevice}=="0206"
    ATTRS{idProduct}=="0000"
    ATTRS{idVendor}=="0000"
    ATTRS{bMaxPower}=="  0mA"
    ATTRS{bmAttributes}=="e0"
    ATTRS{bConfigurationValue}=="1"
    ATTRS{bNumInterfaces}==" 1"

  looking at parent device '/devices/pci0000:00/0000:00:1d.0':
    KERNELS=="0000:00:1d.0"
    SUBSYSTEMS=="pci"
    DRIVERS=="uhci_hcd"
    ATTRS{broken_parity_status}=="0"
    ATTRS{enable}=="1"
    ATTRS{modalias}=="pci:v00008086d000027C8sv00008086sd0000544Ebc0Csc03i00"
    ATTRS{local_cpus}=="ff"
    ATTRS{irq}=="225"
    ATTRS{class}=="0x0c0300"
    ATTRS{subsystem_device}=="0x544e"
    ATTRS{subsystem_vendor}=="0x8086"
    ATTRS{device}=="0x27c8"
    ATTRS{vendor}=="0x8086"

  looking at parent device '/devices/pci0000:00':
    KERNELS=="pci0000:00"
    SUBSYSTEMS==""
    DRIVERS==""
Sunday, December 10th, 2006 05:25 pm (UTC)
Действительно, ничего уникального не видно. Печально. Если ничего уникального нет, то различить не получится. Совсем никак..
Sunday, December 10th, 2006 10:10 pm (UTC)
ATTRS{idProduct}=="2303"
ATTRS{idVendor}=="067b"

Или у тебя их несколько?
Monday, December 11th, 2006 05:33 am (UTC)
Несколько одинаковых.
Sunday, December 10th, 2006 10:07 pm (UTC)
то почему строем не ходиш то может объяснишь мне, из-за чего может быть такая засада? довольно часто происходит так: usb накопитель включил, устройство в dev появилось, но пока в него не ткнёшься чем нибудь - не появляются устройства под разделы. Ну т.е. /dev/sda есть, а /dev/sda1 - нет. И пока, например, mount /dev/sda не сделаешь - и не появится.
Tuesday, December 12th, 2006 10:39 pm (UTC)
Не знаю, что это у вас за вредность такая.
Вот воткнул свой диск, так оно сразу и сказало:

Dec 12 22:37:14 kernel: SCSI device sda: 195371568 512-byte hdwr sectors (100030 MB)
Dec 12 22:37:14 kernel: sda: Write Protect is off
Dec 12 22:37:14 kernel: sda: sda1
Tuesday, December 12th, 2006 10:56 pm (UTC)
Блин. Вот натурально - иногда нормально срабатывает. иногда - пока не
пнёшь не полетит. :((
Tuesday, December 12th, 2006 11:14 pm (UTC)
А если ты такой умный, то скажи, почему у меня в ноуте тачпад распознается со второй-третьей загрузки модуля psmouse?
То есть, первый раз грузишь - видит стандартную PS/2-мышь. Выгружаешь-загружаешь - обнаруживается Synaptics touchpad. Иногда со второго раза тоже не обнаруживается, а только с третьего. Почему?
Tuesday, December 12th, 2006 11:23 pm (UTC)
Ну в данном случае хоть пашаманить с драйверами можно. Типа
принудительно отключить поддержку обычной мыши.

P.S. Ты чего, обиделся чтоль? Я-ж на полном серьёзе спрашивал - я-то в
эту сторону вообще не копал, думал ты с такой проблемой сталкивался.
Собственно именно это и имел в виду под фразой "такой умный". Если
обидел - извини, не хотел.
Wednesday, December 13th, 2006 07:57 am (UTC)
Дык пробовал - и явно параметры ядру задавал, и модулю вручную тоже. Вот хоть тресни - не обнаруживает тачпад с первой загрузки. А когда обнаруживает, то вместе с обычной мышой, так что ее отключение вряд ли поможет. Да и не уверен я, что он аотключается.

Не, не обиделся, это я с ответной иронией :)
Wednesday, December 13th, 2006 02:19 am (UTC)
1) diskpart

2) diskmgmt.msc

3) Для экстремалов :
HKLM\SYSTEM\MountedDevices

( http://support.microsoft.com/?kbid=307844 )
Wednesday, December 13th, 2006 08:01 am (UTC)
Это всё понятно. Вопрос был в том, как сделать, чтобы для определенного _removable_ диска эта буква сохранялась при последующем подключении. Она сохраняется? Если да, то где ее система хранит - на самом диске (что плохо, потому что он может быть RO), или где-то у себя в реестре?