Вопрос или проблема
Я запутался, как настроить правила udev для /dev/xxx.
Вопрос 1: Не могу найти, где определяется /dev/random?
#ll /dev/
total 0
lrwxrwxrwx 1 root root 11 Aug 4 17:57 core -> /proc/kcore
lrwxrwxrwx 1 root root 13 Aug 4 17:57 fd -> /proc/self/fd
crw-rw-rw- 1 root root 1, 7 Aug 4 17:57 full
crw-rw-rw- 1 root root 10, 229 Aug 4 17:57 fuse
drwxr-xr-x 2 root root 0 Aug 4 17:57 hugepages
lrwxrwxrwx 1 root root 25 Aug 4 17:57 initctl -> /run/systemd/initctl/fifo
srw-rw-rw- 1 root root 0 Aug 4 17:57 log
drwxrwxrwt 2 root root 40 Aug 4 17:57 mqueue
crw-rw-rw- 1 root root 1, 3 Aug 4 17:57 null
lrwxrwxrwx 1 root root 8 Aug 4 17:57 ptmx -> pts/ptmx
drwxr-xr-x 2 root root 0 Aug 4 17:57 pts
crw-rw-rw- 1 root root 1, 8 Aug 4 17:57 random
drwxrwxrwt 2 root root 40 Aug 4 17:57 shm
lrwxrwxrwx 1 root root 15 Aug 4 17:57 stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Aug 4 17:57 stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Aug 4 17:57 stdout -> /proc/self/fd/1
crw-rw-rw- 1 root root 5, 0 Aug 4 17:57 tty
crw-rw-rw- 1 root root 1, 9 Aug 4 17:57 urandom
crw-rw-rw- 1 root root 1, 5 Aug 4 17:57 zero][1]
[root@xxxxx /]
#cat /lib/udev/rules.d/* | grep mqueue
[root@xxxxx /]
#cat /lib/udev/rules.d/* | grep random
# Правило для прав доступа к устройству символа prandom
KERNEL=="prandom", MODE="0644"
[root@xxxxxx /]
#cat /etc/udev/rules.d/* | grep random
также не могу найти стандартное правило
#cat /lib/udev/rules.d/* | grep "KERNEL==\"*\""
KERNEL=="device-mapper", NAME="mapper/control"
ACTION=="add", SUBSYSTEM=="module", KERNEL=="bridge", RUN+="/usr/lib/systemd/systemd-sysctl --prefix=/proc/sys/net/bridge"
KERNEL=="prandom", MODE="0644"
SUBSYSTEM=="virtio-ports", KERNEL=="vport*", ATTR{name}=="?*", SYMLINK+="virtio-ports/$attr{name}"
SUBSYSTEM=="rtc", KERNEL=="rtc0", SYMLINK+="rtc", OPTIONS+="link_priority=-100"
SUBSYSTEM=="tty", KERNEL=="ptmx", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty", GROUP="tty", MODE="0666"
SUBSYSTEM=="tty", KERNEL=="tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="sclp_line[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="ttysclp[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="tty", KERNEL=="3270/tty[0-9]*", GROUP="tty", MODE="0620"
SUBSYSTEM=="vc", KERNEL=="vcs*|vcsa*", GROUP="tty"
KERNEL=="tty[A-Z]*[0-9]|pppox[0-9]*|ircomm[0-9]*|noz[0-9]*|rfcomm[0-9]*", GROUP="dialout"
SUBSYSTEM=="mem", KERNEL=="mem|kmem|port", GROUP="kmem", MODE="0640"
SUBSYSTEM=="input", KERNEL=="js[0-9]*", MODE="0664"
SUBSYSTEM=="misc", KERNEL=="agpgart", GROUP="video"
KERNEL=="parport[0-9]*", GROUP="lp"
SUBSYSTEM=="printer", KERNEL=="lp*", GROUP="lp"
KERNEL=="lp[0-9]*", GROUP="lp"
KERNEL=="irlpt[0-9]*", GROUP="lp"
SUBSYSTEM=="block", KERNEL=="sr[0-9]*", GROUP="cdrom"
KERNEL=="sch[0-9]*", GROUP="cdrom"
KERNEL=="pktcdvd[0-9]*", GROUP="cdrom"
KERNEL=="pktcdvd", GROUP="cdrom"
KERNEL=="qft[0-9]*|nqft[0-9]*|zqft[0-9]*|nzqft[0-9]*|rawqft[0-9]*|nrawqft[0-9]*", GROUP="disk"
KERNEL=="loop-control", GROUP="disk", OPTIONS+="static_node=loop-control"
KERNEL=="btrfs-control", GROUP="disk"
KERNEL=="rawctl", GROUP="disk"
SUBSYSTEM=="raw", KERNEL=="raw[0-9]*", GROUP="disk"
SUBSYSTEM=="aoe", KERNEL=="err", MODE="0440"
KERNEL=="rfkill", MODE="0664"
KERNEL=="tun", MODE="0666", OPTIONS+="static_node=net/tun"
KERNEL=="fuse", MODE="0666", OPTIONS+="static_node=fuse"
KERNEL=="loop*|ram*", GOTO="log_end"
KERNEL=="sr[0-9]*", ENV{ID_CDROM}="1"
KERNEL=="sr0", SYMLINK+="cdrom", OPTIONS+="link_priority=-100"
KERNEL=="mouse*|js*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", ATTRS{bInterfaceNumber}=="|00", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-$env{.INPUT_CLASS}"
KERNEL=="mouse*|js*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", ATTRS{bInterfaceNumber}=="?*", ATTRS{bInterfaceNumber}!="00", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$attr{bInterfaceNumber}-$env{.INPUT_CLASS}"
KERNEL=="event*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", ATTRS{bInterfaceNumber}=="|00", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-event-$env{.INPUT_CLASS}"
KERNEL=="event*", ENV{ID_BUS}=="?*", ENV{.INPUT_CLASS}=="?*", ATTRS{bInterfaceNumber}=="?*", ATTRS{bInterfaceNumber}!="00", SYMLINK+="input/by-id/$env{ID_BUS}-$env{ID_SERIAL}-if$attr{bInterfaceNumber}-event-$env{.INPUT_CLASS}"
SUBSYSTEMS=="usb", ENV{ID_BUS}=="?*", KERNEL=="event*", ENV{.INPUT_CLASS}=="", ATTRS{bInterfaceNumber}=="?*", \
ENV{ID_PATH}=="?*", KERNEL=="mouse*|js*", ENV{.INPUT_CLASS}=="?*", SYMLINK+="input/by-path/$env{ID_PATH}-$env{.INPUT_CLASS}"
ENV{ID_PATH}=="?*", KERNEL=="event*", ENV{.INPUT_CLASS}=="?*", SYMLINK+="input/by-path/$env{ID_PATH}-event-$env{.INPUT_CLASS}"
SUBSYSTEMS=="usb|platform", ENV{ID_PATH}=="?*", KERNEL=="event*", ENV{.INPUT_CLASS}=="", \
ACTION=="add", SUBSYSTEM=="module", KERNEL=="block", ATTR{parameters/events_dfl_poll_msecs}=="0", ATTR{parameters/events_dfl_poll_msecs}="2000"
KERNEL=="fd*|mtd*|nbd*|gnbd*|btibm*|dm-*|md*|zram*|mmcblk[0-9]*rpmb", GOTO="persistent_storage_end"
KERNEL=="vd*[!0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/virtio-$env{ID_SERIAL}"
KERNEL=="vd*[0-9]", ATTRS{serial}=="?*", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/virtio-$env{ID_SERIAL}-part%n"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{vendor}=="ATA", IMPORT{program}="ata_id --export $devnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", ATTRS{type}=="5", ATTRS{scsi_level}=="[6-9]*", IMPORT{program}="ata_id --export $devnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", ATTR{removable}=="0", SUBSYSTEMS=="usb", IMPORT{program}="ata_id --export $devnode"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
KERNEL=="sd*[!0-9]|sr*", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --export --whitelisted -d $devnode", ENV{ID_BUS}="scsi"
KERNEL=="cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --export --whitelisted -d $devnode", ENV{ID_BUS}="cciss"
KERNEL=="sd*|sr*|cciss*", ENV{DEVTYPE}=="disk", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
KERNEL=="sd*|cciss*", ENV{DEVTYPE}=="partition", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/$env{ID_BUS}-$env{ID_SERIAL}-part%n"
KERNEL=="sd*[!0-9]|sr*", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}"
KERNEL=="sd*[0-9]", ATTRS{ieee1394_id}=="?*", SYMLINK+="disk/by-id/ieee1394-$attr{ieee1394_id}-part%n"
KERNEL=="mmcblk[0-9]", SUBSYSTEMS=="mmc", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}"
KERNEL=="mmcblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/mmc-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
KERNEL=="mspblk[0-9]", SUBSYSTEMS=="memstick", ATTRS{name}=="?*", ATTRS{serial}=="?*", ENV{ID_NAME}="$attr{name}", ENV{ID_SERIAL}="$attr{serial}", SYMLINK+="disk/by-id/memstick-$env{ID_NAME}_$env{ID_SERIAL}"
KERNEL=="mspblk[0-9]p[0-9]", ENV{ID_NAME}=="?*", ENV{ID_SERIAL}=="?*", SYMLINK+="disk/by-id/memstick-$env{ID_NAME}_$env{ID_SERIAL}-part%n"
KERNEL=="sr*", ENV{DISK_EJECT_REQUEST}!="?*", ENV{ID_CDROM_MEDIA_TRACK_COUNT_DATA}=="?*", ENV{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}=="?*", \
KERNEL=="sr*", ENV{DISK_EJECT_REQUEST}!="?*", ENV{ID_CDROM_MEDIA_TRACK_COUNT_DATA}=="?*", ENV{ID_CDROM_MEDIA_SESSION_LAST_OFFSET}=="", \
KERNEL=="st*[0-9]|nst*[0-9]", ATTRS{ieee1394_id}=="?*", ENV{ID_SERIAL}="$attr{ieee1394_id}", ENV{ID_BUS}="ieee1394"
KERNEL=="st*[0-9]|nst*[0-9]", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="usb", IMPORT{builtin}="usb_id"
KERNEL=="st*[0-9]|nst*[0-9]", ENV{ID_SERIAL}!="?*", SUBSYSTEMS=="scsi", KERNELS=="[0-9]*:*[0-9]", ENV{.BSG_DEV}="$root/bsg/$id"
KERNEL=="st*[0-9]|nst*[0-9]", ENV{ID_SERIAL}!="?*", IMPORT{program}="scsi_id --whitelisted --export --device=$env{.BSG_DEV}", ENV{ID_BUS}="scsi"
KERNEL=="st*[0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="tape/by-id/$env{ID_BUS}-$env{ID_SERIAL}"
KERNEL=="nst*[0-9]", ENV{ID_SERIAL}=="?*", SYMLINK+="tape/by-id/$env{ID_BUS}-$env{ID_SERIAL}-nst"
KERNEL=="st*[0-9]|nst*[0-9]", IMPORT{builtin}="path_id"
KERNEL=="st*[0-9]", ENV{ID_PATH}=="?*", SYMLINK+="tape/by-path/$env{ID_PATH}"
KERNEL=="nst*[0-9]", ENV{ID_PATH}=="?*", SYMLINK+="tape/by-path/$env{ID_PATH}-nst"
KERNEL=="video*", ENV{ID_SERIAL}=="?*", SYMLINK+="v4l/by-id/$env{ID_BUS}-$env{ID_SERIAL}-video-index$attr{index}"
ENV{ID_PATH}=="?*", KERNEL=="video*|vbi*", SYMLINK+="v4l/by-path/$env{ID_PATH}-video-index$attr{index}"
ENV{ID_PATH}=="?*", KERNEL=="audio*", SYMLINK+="v4l/by-path/$env{ID_PATH}-audio-index$attr{index}"
# ACTION=="add", KERNEL=="sda", RUN+="/usr/bin/raw /dev/raw/raw1 %N"
KERNEL=="dm-*", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="linux_raid_member", \
KERNEL=="md*", SUBSYSTEM=="block", ENV{ID_FS_TYPE}=="linux_raid_member", \
ACTION=="add", KERNEL=="md[0-9]*p[0-9]*", GOTO="lvm_scan"
SUBSYSTEM=="input", KERNEL=="event*", SUBSYSTEMS=="acpi", TAG+="power-switch"
SUBSYSTEM=="input", KERNEL=="event*", KERNELS=="thinkpad_acpi", TAG+="power-switch"
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="twl4030_pwrbutton", TAG+="power-switch"
SUBSYSTEM=="input", KERNEL=="event*", ATTRS{name}=="tps65217_pwr_but", TAG+="power-switch"
SUBSYSTEM=="drm", KERNEL=="card*|renderD*", TAG+="uaccess"
SUBSYSTEM=="misc", KERNEL=="kvm", TAG+="uaccess"
SUBSYSTEM=="sound", KERNEL=="card*", TAG+="seat"
SUBSYSTEM=="input", KERNEL=="input*", TAG+="seat"
SUBSYSTEM=="graphics", KERNEL=="fb[0-9]*", TAG+="seat", TAG+="master-of-seat"
KERNEL=="mtd*ro", IMPORT{program}="mtd_probe $devnode"
ACTION=="add|change", KERNEL=="controlC*", ATTR{../uevent}="change"
SUBSYSTEM=="module", KERNEL=="parport_pc", RUN{builtin}+="kmod load ppdev"
KERNEL=="mtd*ro", ENV{MTD_FTL}=="smartmedia", RUN{builtin}+="kmod load sm_ftl"
KERNEL=="regulatory*", ACTION=="change", SUBSYSTEM=="platform", RUN+="/sbin/crda"
ACTION=="add", SUBSYSTEM=="vtconsole", KERNEL=="vtcon*", RUN+="/usr/lib/systemd/systemd-vconsole-setup"
KERNEL=="controlD[0-9]*", SUBSYSTEM=="drm", MODE="0600"
SUBSYSTEM=="module", KERNEL=="cxgb*", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="rdma.service"
SUBSYSTEM=="module", KERNEL=="ib_*", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="rdma.service"
SUBSYSTEM=="module", KERNEL=="mlx*", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="rdma.service"
SUBSYSTEM=="module", KERNEL=="iw_*", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="rdma.service"
SUBSYSTEM=="module", KERNEL=="be2net", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="rdma.service"
SUBSYSTEM=="module", KERNEL=="enic", ACTION=="add", TAG+="systemd", ENV{SYSTEMD_WANTS}="rdma.service"
SUBSYSTEM=="infiniband", KERNEL=="*", ACTION=="add", TEST!="/usr/sbin/rdma-ndd", RUN+="/bin/bash -c 'sleep 1; echo -n `hostname -s` %k > /sys/class/infiniband/%k/node_desc'"
SUBSYSTEM=="tty", KERNEL=="tty[a-zA-Z]*|hvc*|xvc*|hvsi*|ttysclp*|sclp_line*|3270/tty[0-9]*", TAG+="systemd"
KERNEL=="vport*", TAG+="systemd"
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", TEST!="md/array_state", ENV{SYSTEMD_READY}="0"
SUBSYSTEM=="block", ENV{DEVTYPE}=="disk", KERNEL=="md*", ATTR{md/array_state}=="|clear|inactive", ENV{SYSTEMD_READY}="0"
SUBSYSTEM=="block", KERNEL=="loop[0-9]*", ENV{DEVTYPE}=="disk", TEST!="loop/backing_file", ENV{SYSTEMD_READY}="0"
ACTION=="add", SUBSYSTEM=="block", KERNEL=="nbd*", ENV{SYSTEMD_READY}="0"
SUBSYSTEM=="sound", KERNEL=="card*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sound.target"
SUBSYSTEM=="usb", KERNEL=="lp*", TAG+="systemd", ENV{SYSTEMD_WANTS}+="printer.target"
SUBSYSTEM=="leds", KERNEL=="*kbd_backlight", TAG+="systemd", IMPORT{builtin}="path_id", ENV{SYSTEMD_WANTS}+="systemd-backlight@leds:$name.service"
SUBSYSTEM=="module", KERNEL=="fuse", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sys-fs-fuse-connections.mount"
SUBSYSTEM=="module", KERNEL=="configfs", TAG+="systemd", ENV{SYSTEMD_WANTS}+="sys-kernel-config.mount"
Вопрос 2: Если я добавлю это правило, я надеюсь, что доступ к /dev/random станет 0777, но, к сожалению, после перезагрузки я обнаруживаю, что эта настройка недействительна. Доступ к /dev/random по-прежнему 0666. Эта настройка неправильная?
это просто пример, я хочу проверить синтаксис. Этот пример может быть неуместным, я не действительно хочу изменить доступ к /dev/random с 0666 на 0777
[root@xxxxxx /]
#cat /etc/udev/rules.d/70-muahao.rules
KERNEL=="random", GROUP="root", MODE="0777", OPTIONS="last_rule"
Ответ 1:
Не все устройства в /dev/
происходят от udev.
Например, /dev/random
является символическим устройством, поддерживаемым ядром Linux (подробности см. по ссылке https://www.kernel.org/doc/Documentation/admin-guide/devices.txt). Фактическая запись mknod
в devtmpfs заполняется вашим выбранным начальным образцом ramdisk вашей дистрибуции.
Ответ 2: См. Ответ 1. Поскольку устройство никогда не обрабатывается udev, правило не будет применяться.
Ответ или решение
Как настроить синтаксис правил udev в /etc/udev/rules.d/
Введение
Настройка правил udev является важной частью конфигурации системы Linux, обеспечивающей управление устройствами, подключаемыми к системе. Однако не все устройства, доступные в каталоге /dev/
, управляются через udev. В данной статье мы подробно рассмотрим синтаксис правил udev, а также ответим на часто задаваемые вопросы, касающиеся конфигурации устройств, таких как /dev/random
.
Синтаксис правил udev
Правила udev описаны в текстовых файлах, которые могут находиться в каталогах /etc/udev/rules.d/
или /lib/udev/rules.d/
. Формат правил имеет следующий общий вид:
ACTION=="<действие>", KERNEL=="<имя_устройства>", SUBSYSTEM=="<подсистема>", ATTR{"<атрибут>"}=="<значение>", MODE="0<n>", GROUP="<группа>", OPTIONS="<параметры>"
- ACTION: то, что должно произойти (например, "add" для добавления устройства).
- KERNEL: имя (шаблон) устройства, к которому применяется правило (например, "sda").
- SUBSYSTEM: категория устройства, например, "block" или "net".
- ATTR: атрибуты устройства, которые можно проверить (
ATTR{name}
). - MODE: задает права доступа к устройству.
- GROUP: указывает группу пользователей, к которой принадлежит устройство.
- OPTIONS: дополнительные параметры, которые могут быть заданы, такие как
last_rule
, которые позволяют комбинировать правила.
Ответы на вопросы
Вопрос 1: Где определяется /dev/random
?
Ответ: Устройства, подобные /dev/random
, не всегда управляются через udev. Они часто представляют собой специальные символические устройства, созданные ядром Linux. В большинстве случаев такие устройства, как /dev/random
и /dev/urandom
, инициализируются при загрузке системы через образ начального загрузчика (initramfs). Таким образом, для их создания используется команда mknod
, которая создает узел устройства.
Вопрос 2: Почему правило для изменения доступа к /dev/random
не сработало?
Ответ: Правило, добавленное в файл /etc/udev/rules.d/70-muahao.rules
, не сработает для /dev/random
, поскольку это устройство не обрабатывается udev. В Linux недостаточно просто создать правило; система ожидает, что устройство будет управляться udev. Права доступа к /dev/random
установлены на уровне ядра и инициализируются при старте системы, и поэтому, даже если вы пытаетесь задать им новые права доступа, это не приведет к изменениям.
Пример правила udev
Если вы хотите протестировать синтаксис правил udev, вот пример правила, которое можно использовать для другого устройства (вместо /dev/random
):
# Пример для изменения прав доступа к устройству ttyUSB0
SUBSYSTEM=="tty", KERNEL=="ttyUSB0", MODE="0666"
Это правило будет изменять права доступа к устройству ttyUSB0
, когда оно добавляется в систему. Однако вам нужно помнить, что для применения изменений необходимо перезагрузить сервис udev или систему.
Заключение
Настройка udev требует точности и понимания взаимодействия между устройствами Linux и системой. Мы рассмотрели основные правила написания конфигурационных файлов для udev и ответили на распространенные вопросы, касающиеся устройств, таких как /dev/random
. При правильной настройке udev значительно упрощает управление устройствами и их атрибутами в системе Linux.