Trong /dev
thư mục của tôi , tôi muốn các tệp sau đây có thể được người dùng đọc và ghi được:
/dev/ttyUSB0
/dev/gpib0
Làm thế nào để tôi làm điều này mà không sử dụng chgrp
? Tôi có thể chỉnh sửa /etc/udev/rules.d
nhưng tôi không biết cú pháp.
Trong /dev
thư mục của tôi , tôi muốn các tệp sau đây có thể được người dùng đọc và ghi được:
/dev/ttyUSB0
/dev/gpib0
Làm thế nào để tôi làm điều này mà không sử dụng chgrp
? Tôi có thể chỉnh sửa /etc/udev/rules.d
nhưng tôi không biết cú pháp.
Câu trả lời:
Đối với các thiết bị rơi vào hệ thống con tty, bạn có thể đặt nhóm của chúng như sau:
SUBSYSTEM=="tty", GROUP="dialout"
Lưu ý rằng, giống như trong lập trình thông thường, ==
là một bài kiểm tra cho sự bình đẳng trong khi =
là một bài tập. Vì vậy, câu lệnh trên có nghĩa là "nếu SUBSYSTEM=="tty"
sau đó gán GROUP="dialout"
. Một câu lệnh có thể có nhiều phép thử, được ghép và ghép với nhau và nhiều phép gán.
Nếu bạn muốn thay đổi quyền đọc-ghi-thực thi, thì hãy gán MODE thay vì NHÓM trong đó MODE tuân theo ký hiệu bát phân Unix thông thường, ví dụ: MODE="0660"
cấp cho chủ sở hữu và quyền đọc-ghi của nhóm. man udev
có tất cả các chi tiết.
Bạn có thể tìm thấy nhiều ví dụ về các quy tắc như vậy trong /lib/udev/rules.d/91-permissions.rules
Một khi bạn đã giải quyết được những gì bạn muốn quy tắc của mình, nó đủ đơn giản để thêm nó. Trên hệ thống có nguồn gốc từ debian, hãy vào thư mục /etc/udev/rules.d
và tạo một tệp. Các tập tin được chạy theo thứ tự sắp xếp. Vì vậy, để làm cho tệp quy tắc của bạn cuối cùng được đọc, ghi đè lên các quy tắc trước đó, hãy thử một tên như thế nào 99-instruments.rules
. Sau đó đặt quy tắc của bạn trong tệp đó, mỗi dòng trên một dòng. (Nếu cần bởi, các dòng có thể được mở rộng bằng cách đặt dấu gạch chéo ngược ở cuối dòng, giống như trong shell.)
Vì vậy, nếu bạn muốn thay đổi nhóm và quyền trên các thiết bị tty, tệp của bạn /etc/udev/rules.d/99-instruments.rules
có thể bao gồm một dòng duy nhất:
SUBSYSTEM=="tty", GROUP="dialout", MODE="0660"
Để đảm bảo rằng tệp mới của bạn có các quyền thông thường:
sudo chown root:root /etc/udev/rules.d/99-instruments.rules
sudo chmod 0644 /etc/udev/rules.d/99-instruments.rules
Sau khi bạn đã tạo tệp của mình, udevd có thể tự động đọc nó. Nếu không, bạn có thể buộc nó đọc lại các tệp của nó bằng:
udevadm control --reload-rules
Nếu bạn muốn có được quyền kiểm soát tốt hơn đối với thiết bị nào đáp ứng quy tắc nào, bạn có thể tìm hiểu thêm về cách udev nhìn thấy thiết bị của mình bằng cách đọc / sys /. Tại thời điểm này, tôi không có quyền truy cập vào một máy có ttyUSB hoặc HPIB, vì vậy hãy làm ví dụ về sda đĩa. Chạy:
udevadm info --attribute-walk --path=/sys/block/sda
Điều này cung cấp rất nhiều thông tin trông giống như:
. . . .
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{range}=="16"
ATTR{ext_range}=="256"
ATTR{removable}=="0"
. . . .
Các dòng này đều ở dạng thích hợp để sử dụng như if
các mệnh đề trong các quy tắc. Vì vậy, ví dụ, để thay đổi quyền sở hữu trên tất cả các thiết bị khối được đánh dấu là không thể tháo rời, chúng tôi sẽ sử dụng quy tắc:
SUBSYSTEM=="block", ATTR{removable}=="0", OWNER=john1024
Với thông tin từ udevadm
, người ta có thể phát triển các quy tắc có thể nhắm mục tiêu cụ thể các thiết bị quan tâm.
Tôi nghĩ rằng tôi sẽ đề nghị đưa ra quy tắc hạn chế hơn một chút so với John. Ví dụ: tạo một tệp như /etc/udev/rules.d/99-tty-dialout.rules
:
SUBSYSTEM=="tty", KERNEL=="ttyUSB0", GROUP="dialout", MODE="0660"
Bạn có thể sử dụng udevadm
để xác định một thiết bị SUBSYSTEM==
và KERNEL==
giá trị. Ví dụ:
$ udevadm info -a -n /dev/tty0
Udevadm info 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 '/devices/virtual/tty/tty0':
KERNEL=="tty0"
SUBSYSTEM=="tty"
DRIVER==""
ATTR{active}=="tty1"