Добрый день!
В процессе переименования устройств в /dev путем создания плавил udev столкнулся с недопониманием.
Правила udev меняют имя устройства в ФС /dev, но не меняется имя в sysfs (/sys).
Например,
Имеется устройство в системе /dev/sr0 (оптический привод)
Создаю правило:
KERNEL=="sr*", SUBSYSTEM=="block", ATTR{removable}=="1", ATTR{size}=="130904", NAME="sr99"
После применения правила (echo change > /sys/block/sr0/uevent или reboot) имя устройства успешно изменилось:
# ls /dev/sr*
/dev/sr99
Но, в /sys оно осталось в старом виде:
# ls -ld /sys/block/sr*
/sys/block/sr0 -> ../devices/pci0000:00/.../2:0:0:0/block/sr0
Тоже самое показывает lsscsi - файл устройства новый, а само устройство старое:
[2:0:0:0] cd/dvd NECVMWar VMware IDE CDR10 1.00 /dev/sr99
dir: /sys/bus/scsi/devices/2:0:0:0 [/sys/devices/pci0000:00/.../2:0:0:0]
Iostat так же ссылается на старое имя, при том, что его нет в /dev
# iostat | grep sr
sr0 0.00 0.00 0.00 1016 0
Отсюда возникает вопрос:
Можно ли изменить имя в sysfs или как пользоваться системой при работе с подобным шаблоном, где устройства в /dev и /sys не совпадают ?
udev & sysfs (переименование устройства)
Модераторы: SLEDopit, Модераторы разделов
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: udev & sysfs
дык само устройство в /sys, а в /dev его псевдоним.
AFAIK можно, но не нужно.
как обычно. Они и не должны совпадать. А вот eth* так вообще в /dev/ нету.
AFAIK можно, но не нужно.
как обычно. Они и не должны совпадать. А вот eth* так вообще в /dev/ нету.
-
IMB
- Сообщения: 2567
- ОС: Debian
Re: udev & sysfs
Имя в sysfs формируется ядром на основе информации от драйвера, например:
Код создает файл ov2715_model, который можно будет обнаружить в /sys/devices/platform/imx-i2c.0/i2c-0/0-005c и /sys/bus/i2c/devices/0-005c, устройство зарегестрировано как I2C-устройство с адресом 0x5C.
Код: Выделить всё
static ssize_t show_model(struct device *dev, struct device_attribute *attr,
char *buf)
{
return sprintf(buf, "%s\n",
ov2715_data.fake_lupa ? "FakeLUPA300" : "OV2715 HD");
}
static DEVICE_ATTR(ov2715_model, S_IRUGO, show_model, NULL);Код создает файл ov2715_model, который можно будет обнаружить в /sys/devices/platform/imx-i2c.0/i2c-0/0-005c и /sys/bus/i2c/devices/0-005c, устройство зарегестрировано как I2C-устройство с адресом 0x5C.
-
minder
- Сообщения: 331
- ОС: AIX, Solaris,RHEL,SLES,Gentoo
Re: udev & sysfs
Ну, устройство не в /sys, оно в железной коробке, в разъеме, на плате
/sys - это отражение ядра, его драйверов, атрибутов объекта и прочее.
Технически, согласен, могут не совпадать, но работать неудобно. Допустим, диски переименованы в /dev как disk_alpha, disk_beta, disk_gamma. Администратор работает именно с этими именами, а в /sys они sdy, sdx, sdw. В момент просмотра дисковой активности получается неразбериха - неясно где какой диск. Настройка значений атрибутов неудобная: /sys/block/<devnode>/[queue/scheduler,quqeue_depth,...] - приходится делать лишнюю работу по сопоставлению дисков, что отнимает время.
Тот же сетевой интерфейс, на сколько я понимаю, в /sys переименовывается.
IMB писал(а): ↑17.12.2013 08:46Имя в sysfs формируется ядром на основе информации от драйвера, например:
Код: Выделить всё
static ssize_t show_model(struct device *dev, struct device_attribute *attr, char *buf) { return sprintf(buf, "%s\n", ov2715_data.fake_lupa ? "FakeLUPA300" : "OV2715 HD"); } static DEVICE_ATTR(ov2715_model, S_IRUGO, show_model, NULL);
Код создает файл ov2715_model, который можно будет обнаружить в /sys/devices/platform/imx-i2c.0/i2c-0/0-005c и /sys/bus/i2c/devices/0-005c, устройство зарегистрировано как I2C-устройство с адресом 0x5C.
Является ли эта связь двусторонней? Ведь если ядро имя формирует, то может учесть и данные с userspace
Вообще, в документации о sysfs пишется о возможности переименования kernel object, но не нигде не нашел примера как это делается и реального использования.
С другой стороны, если нет инструментов для пользователя переименовать объект, зачем тогда в udev имеет возможность переименовывать файл устройства (ведь и так понятно, что работать с одним и тем же устройством с разными именами в каждой виртуальной ФС неудобно)?
-
Bizdelnick
- Модератор
- Сообщения: 21499
- Статус: nulla salus bello
- ОС: Debian GNU/Linux
Re: udev & sysfs
А зачем вообще понадобилось переименовывать устройство? Так никто не делает. В абсолютном большинстве случаев достаточно симлинка. И путаницы не будет.
Пишите правильно:
| в консоли вку́пе (с чем-либо) в общем вообще | в течение (часа) новичок нюанс по умолчанию | приемлемо проблема пробовать трафик |
-
IMB
- Сообщения: 2567
- ОС: Debian
-
minder
- Сообщения: 331
- ОС: AIX, Solaris,RHEL,SLES,Gentoo
Re: udev & sysfs
Bizdelnick писал(а): ↑17.12.2013 10:42А зачем вообще понадобилось переименовывать устройство? Так никто не делает. В абсолютном большинстве случаев достаточно симлинка. И путаницы не будет.
Необходимости сильной нет, и симлинк вполне устраивает почти всегда. Меня лишь заинтересовал сам вопрос, ибо возможность переименования файлов устройств в руководствах по написанию правил UDEV имеется и как пример приводится, но не говориться, что это не является best practices. Сам udev на сетевые устройства генерирует правила переименования для привязки имен сетевым интерфейсам, но на другие устройства он уже генерирует симлинки, оставляя в покое оригинальное имя.
В общем, вопрос скорее для общего понимания как работает и как лучше делать, чем необходимость.
-
drBatty
- Сообщения: 8735
- Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
- ОС: Slackware-current
Re: udev & sysfs
драйверу удобнее, когда оно "в /sys".
minder писал(а): ↑17.12.2013 10:35Технически, согласен, могут не совпадать, но работать неудобно. Допустим, диски переименованы в /dev как disk_alpha, disk_beta, disk_gamma. Администратор работает именно с этими именами, а в /sys они sdy, sdx, sdw. В момент просмотра дисковой активности получается неразбериха - неясно где какой диск.
неразберихи никакой нет, ибо все утилиты и программы работают исключительно с /dev/*.
Вы берёте какие-то специальные случаи, когда возможна неоднозначность. К примеру устройство /sys/xyz разделено на два логических /dev/zzz1 /dev/zzz2. При этом вся работа идёт с /dev/zzz{1,2}, и тем не менее, "активность" отдельно /dev/zzz1 не имеет никакого смысла, т.к. такого устройства не существует IRL.