Инструменты пользователя

Инструменты сайта


linux_device

Устройства

Файлы устройств

  • Блочное устройство. Программы получают доступ к данным на блочном устройстве в виде фиксированных порций. В приведенном примере sda1 является дисковым устройством — одним из типов блочных устройств. Диски можно легко разделить на блоки данных. Поскольку общий объем блочного устройства фиксирован и легко поддается индексации, процессы с помощью ядра получают случайный доступ к любому блоку устройства.
  • Символьное устройство. Символьные устройства работают с потоками данных. Вы можете лишь считывать символы с таких устройств или записывать символы на них, как было показано в примере с /dev/null. Символьные устройства не обладают размером. Когда выполняется чтение или запись, ядро обычно осуществляет операцию чтения или записи на устройство. Принтеры, напрямую подключенные к компьютеру, представлены символьными устройствами. Важно отметить следующее: при взаимодействии с символьным устройством ядро не может выполнить откат данных и повторную их проверку после того, как данные переданы устройству или процессу.
  • Канал. Именованные каналы подобны символьным устройствам, но у них на другом конце потока ввода-вывода располагается другой процесс, а не драйвер ядра.
  • Сокет. Сокеты являются специализированными интерфейсами, которые часто используются для взаимодействия между процессами. Часто они располагаются вне каталога /dev. Файлы сокетов представляют сокеты домена Unix.

Путь устройств sysfs

Традиционный каталог /dev в системе Unix является удобным способом, с помощью которого пользовательские процессы могут обращаться к устройствам, поддерживаемым ядром, а также предоставлять интерфейс для них. Однако такая схема также и слишком упрощена. Название устройства в каталоге /dev даст вам некоторую информацию об устройстве, но далеко не всю. Кроме того, ядро назначает устройства в порядке их обнаружения, поэтому они могут получать различные имена после перезагрузки.

Чтобы обеспечить унифицированный обзор присоединенных устройств, взяв за основу их действительные аппаратные характеристики, ядро системы Linux предлагает интерфейс sysfs для обозначения файлов и каталогов. Основным путем для устройств является /sys/devices. Например, жесткий диск SATA в файле /dev/sda мог бы получить следующий путь в интерфейсе sysfs:

/sys/devices/pci0000:00/0000:00:1f.2/host0/target0:0:0/0:0:0:0/block/sda

Менеджер устройств udev

Файловая система devtmpfs

Файловая система devtmpfs была разработана для решения проблемы с доступностью устройств во время загрузки. Эта файловая система подобна старой devfs, но является упрощенной. Ядро создает файлы устройств по мере надобности, а также уведомляет менеджер udevd о том, что доступно новое устройство. После получения такого сигнала менеджер udevd не создает файлы устройств, а выполняет инициализацию устройства и отправляет уведомление процессу. Кроме того, он создает несколько символических ссылок в каталоге /dev для дальнейшей идентификации устройств. Примеры вы можете отыскать в каталоге /dev/disk/by-id, в котором каждому присоединенному диску соответствует одна или несколько записей.

Работа и настройка менеджера udevd

Демон udevd работает следующим образом.

  1. Ядро отправляет демону udevd событие-уведомление, называемое uevent, через внутреннюю сетевую ссылку.
  2. Демон udevd загружает все атрибуты, содержащиеся в уведомлении uevent.
  3. Демон udevd проводит разбор правил, а затем предпринимает действия или устанавливает дополнительные атрибуты на основе правил.

Файлы правил расположены в каталогах /lib/udev/rules.d и /etc/udev/rules.d. Правила из каталога /lib являются правилами по умолчанию, а правила из каталога /etc переопределяют их.

Команда udevadm

Команда udevadm является инструментом администрирования менеджера udevd. С ее помощью можно перезагрузить правила для udevd, а также события-триггеры. Однако, вероятно, самыми мощными функциями команды udevadm являются возможность поиска и обнаружения системных устройств, а также способность отслеживать уведомления uevents, когда демон udevd получает их от ядра.

root@uba64:/dev# udevadm info --query=all  --name=sda1
P: /devices/pci0000:00/0000:00:0d.0/ata3/host2/target2:0:0/2:0:0:0/block/sda/sda1
N: sda1
S: disk/by-id/ata-VBOX_HARDDISK_VBfc1c9566-5d5a3e62-part1
S: disk/by-uuid/e80ff622-9c30-4a17-ac23-780a6e37bdd8
E: DEVLINKS=/dev/disk/by-id/ata-VBOX_HARDDISK_VBfc1c9566-5d5a3e62-part1 /dev/disk/by-uuid/e80ff622-9c30-4a17-ac23-780a6e37bdd8
E: DEVNAME=/dev/sda1
E: DEVPATH=/devices/pci0000:00/0000:00:0d.0/ata3/host2/target2:0:0/2:0:0:0/block/sda/sda1
E: DEVTYPE=partition
E: ID_ATA=1
E: ID_ATA_FEATURE_SET_PM=1
E: ID_ATA_FEATURE_SET_PM_ENABLED=1
E: ID_ATA_ROTATION_RATE_RPM=0
E: ID_ATA_SATA=1
E: ID_ATA_SATA_SIGNAL_RATE_GEN2=1
E: ID_ATA_WRITE_CACHE=1
E: ID_ATA_WRITE_CACHE_ENABLED=1
E: ID_BUS=ata
E: ID_FS_TYPE=ext4
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=e80ff622-9c30-4a17-ac23-780a6e37bdd8
E: ID_FS_UUID_ENC=e80ff622-9c30-4a17-ac23-780a6e37bdd8
E: ID_FS_VERSION=1.0
E: ID_MODEL=VBOX_HARDDISK
E: ID_MODEL_ENC=VBOX\x20HARDDISK\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
E: ID_PART_ENTRY_DISK=8:0
E: ID_PART_ENTRY_FLAGS=0x80
E: ID_PART_ENTRY_NUMBER=1
E: ID_PART_ENTRY_OFFSET=2048
E: ID_PART_ENTRY_SCHEME=dos
E: ID_PART_ENTRY_SIZE=15726592
E: ID_PART_ENTRY_TYPE=0x83
E: ID_PART_TABLE_TYPE=dos
E: ID_REVISION=1.0
E: ID_SERIAL=VBOX_HARDDISK_VBfc1c9566-5d5a3e62
E: ID_SERIAL_SHORT=VBfc1c9566-5d5a3e62
E: ID_TYPE=disk
E: MAJOR=8
E: MINOR=1
E: SUBSYSTEM=block
E: USEC_INITIALIZED=8648

Префикс в каждой строке указывает на атрибут или другую характеристику устройства.

  • P: содержит путь устройства в файловой системе sysfs
  • N: является узлом устройства (то есть именем, которое присвоено файлу /dev)
  • S: указывает символическую ссылку на узел устройства, которую демон udevd поместил в каталог /dev в соответствии со своими правилами
  • E: содержит дополнительную информацию об устройстве, извлеченную из правил udevd

Отслеживание устройств

Чтобы отслеживать уведомления uevents с помощью инструмента udevadm, используйте команду monitor:

root@uba64:~# udevadm monitor
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent
 
KERNEL[687954.872907] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2 (usb)
KERNEL[687954.879597] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0 (usb)
KERNEL[687954.894422] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002 (hid)
KERNEL[687954.894456] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7 (input)
KERNEL[687954.948304] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7/event6 (input)
KERNEL[687954.948506] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/hidraw/hidraw1 (hidraw)
KERNEL[687954.948690] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1 (usb)
KERNEL[687954.968290] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003 (hid)
KERNEL[687954.975258] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8 (input)
KERNEL[687955.028367] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8/event7 (input)
KERNEL[687955.028396] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/hidraw/hidraw2 (hidraw)
UDEV  [687955.162011] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2 (usb)
UDEV  [687955.270187] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1 (usb)
UDEV  [687955.270897] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0 (usb)
UDEV  [687955.309541] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002 (hid)
UDEV  [687955.309583] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003 (hid)
UDEV  [687955.310787] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8 (input)
UDEV  [687955.311205] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/hidraw/hidraw2 (hidraw)
UDEV  [687955.311749] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7 (input)
UDEV  [687955.312694] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/hidraw/hidraw1 (hidraw)
UDEV  [687955.441358] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7/event6 (input)
UDEV  [687955.441382] add      /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8/event7 (input)
KERNEL[687974.324411] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7/event6 (input)
UDEV  [687974.325118] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7/event6 (input)
KERNEL[687974.328277] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7 (input)
KERNEL[687974.328291] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/hidraw/hidraw1 (hidraw)
KERNEL[687974.328299] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002 (hid)
KERNEL[687974.328305] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0 (usb)
UDEV  [687974.328817] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/input/input7 (input)
UDEV  [687974.329307] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002/hidraw/hidraw1 (hidraw)
UDEV  [687974.329765] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0/0003:04D9:1702.0002 (hid)
UDEV  [687974.330375] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.0 (usb)
KERNEL[687974.337418] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8/event7 (input)
UDEV  [687974.337628] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8/event7 (input)
KERNEL[687974.356324] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8 (input)
KERNEL[687974.356344] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/hidraw/hidraw2 (hidraw)
KERNEL[687974.356352] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003 (hid)
KERNEL[687974.356358] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1 (usb)
UDEV  [687974.356856] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/hidraw/hidraw2 (hidraw)
UDEV  [687974.356876] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003/input/input8 (input)
UDEV  [687974.357189] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1/0003:04D9:1702.0003 (hid)
UDEV  [687974.357709] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2/1-2:1.1 (usb)
KERNEL[687974.364291] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2 (usb)
UDEV  [687974.364570] remove   /devices/pci0000:00/0000:00:06.0/usb1/1-2 (usb)

*Подключение и отключение USB клавиатуры

linux_device.txt · Последние изменения: 2016/01/20 02:49 — sander