Làm thế nào để tải lại các quy tắc udev mà không cần khởi động lại?


209

Làm thế nào một người nên tải lại các quy tắc udev, để người mới được tạo có thể hoạt động?

Tôi đang chạy Arch Linux và tôi không có udevstartlệnh ở đây.

Cũng đã kiểm tra /etc/rc.d, không có dịch vụ udev ở đó.


1
Xin lưu ý rằng các phiên bản gần đây của udev đã bỏ hỗ trợ inotify để việc tải lại các quy tắc về thay đổi là cần thiết thường xuyên hơn trong những ngày này.
Colin Guthrie

udevgì Có phải là người quản lý của /dev?
Sandburg

1
@Sandburg có, nó xử lý plug-n-play trên các hệ thống Linux.
Aaron D. Marasco

Câu trả lời:


230
# udevadm control --reload-rules && udevadm trigger

4
Bạn có cần udevtriggersau đó không?
Nils

38
@Nils Trên thực tế, bạn có thể cần udevtrigger(hoặc đúng hơn là udevadm triggertrên hầu hết các bản phân phối) thay vào đó (hoặc cắm thiết bị ra và sao lưu thiết bị). --reload-ruleshầu như luôn luôn vô dụng vì nó xảy ra tự động.
Gilles

12
udevadm triggerđã lừa tôi trên CentOS 6.
astrostl

3
udevtriggerhoặc udevadm triggerkhông làm việc cho tôi. Tôi tìm thấy một số thiết bị sẽ hoạt động sau khi dỡ và tải mô-đun cho cùng (giả sử đó là mô-đun có thể tải). Những gì tôi phát hiện ra là không nhất thiết phải khởi động lại hệ thống. Ví dụ đối với một thiết bị mạng, tôi làm rmmod ixgbe, rmmod tg3, rmmod e1000sau đó modprobe ixgbe, modprobe tg3, modprobe e1000tùy thuộc vào loại trình điều khiển mạng.
nhiệt tình

1
Không có điều gì được đề cập trong số các câu trả lời có hiệu quả với tôi trên Debian Jessie (8.0). Điều làm việc được ip link set $oldname name $newnameđề cập ở đây . Trong trường hợp của tôi, tôi cần thay thế một iface được đặt tên lanbằng iface cầu nối (đối với KVM), và do đó, bản gốc - bây giờ nằm ​​bên dưới - iface phải lấy lại tên cũ của nó eth1. Vì vậy, mẹo là: 1) mang iface xuống; 2) sửa cấu hình mạng lên; 3) cập nhật tập tin quy tắc đặt tên udev; 4) đổi tên iface bằng cách sử dụng ip link...; 5) đưa cây cầu lên.
kostix 20/03/2015

69

Udev sử dụng cơ chế inotify để theo dõi các thay đổi trong thư mục quy tắc, trong cả thư viện và trong các cây cấu hình cục bộ (thường nằm ở /lib/udev/rules.d/etc/udev/rules.d). Vì vậy, hầu hết thời gian bạn không cần làm gì khi thay đổi tệp quy tắc.

Bạn chỉ cần thông báo rõ ràng cho daemon udev nếu bạn đang làm điều gì đó bất thường, ví dụ nếu bạn có một quy tắc bao gồm các tệp trong thư mục khác. Sau đó, bạn có thể sử dụng quy ước thông thường để yêu cầu trình nền tải lại cấu hình của chúng: gửi SIGHUP ( pkill -HUP udevd). Hoặc bạn có thể sử dụng udevadmlệnh : udevadm control --reload-rules.

Tuy nhiên, hãy cẩn thận rằng các phiên bản khác nhau của udev trong lịch sử có các kích hoạt khác nhau để tự động tải lại các quy tắc. Vì vậy, nếu nghi ngờ, hãy gọi udevadm control --reload-rules: dù sao nó cũng không gây hại gì.

Các quy tắc udev chỉ được áp dụng khi một thiết bị được thêm vào. Nếu bạn muốn áp dụng lại các quy tắc cho một thiết bị đã được kết nối, bạn cần thực hiện việc này một cách rõ ràng, bằng cách gọi udevadm triggervới các tùy chọn phù hợp để khớp với (các) thiết bị có cấu hình đã thay đổi, ví dụ udevadm trigger --attr-match=vendor='Yoyodyne' --attr-match=model='Frobnicator 300'.


1
Có phải systemd udev sử dụng inotify để theo dõi các thay đổi quy tắc?
Craig McQueen

inotifychế không phải lúc nào cũng bắt được sự thay đổi của tệp quy tắc udev. Ví dụ: khi tôi sử dụng cat > 10-name.rulesđể thay đổi tệp quy tắc bằng cách dán nội dung, tôi phải tải lại quy tắc theo cách thủ công bằng cách sử dụng udevadm. Đã thử nghiệm trên Raspbian Stretch.
Daniel K.

@DanielK. Điều này đã thay đổi gần đây? IIRC Tôi đã kiểm tra cả udev systemd và udev không systemd khi tôi đăng câu trả lời này và cả hai đều sử dụng inotify, vì vậy --reload-ruleschỉ cần trong các trường hợp không phổ biến.
Gilles

@Gilles: có thể ví dụ của tôi ở trên (ghi đè tệp quy tắc hiện có bằng cách sử dụng chuyển hướng shell) có thể được coi là "trường hợp không phổ biến". Khi tôi sửa đổi tệp này bằng cách chỉnh sửa, ví dụ, vi, inotifycơ chế hoạt động.
Daniel K.

@DanielK. Ah, thật tốt khi biết điều đó. Đây không phải là trường hợp hiếm gặp: một số biên tập viên sẽ lưu tệp bằng cách viết lại (với Vim và Emacs, nó phụ thuộc vào cách chúng được cấu hình). Thật kỳ lạ khi udev chỉ xử lý một trong những trường hợp - nó có vẻ như là một lỗi đối với tôi, vì tôi không thể nghĩ ra lý do để đối xử với họ khác nhau.
Gilles

19

Tôi đang thêm điều này bởi vì một ngày nào đó tôi sẽ cần nó ... một lần nữa.

Đôi khi bạn nhận được kết hợp không chính xác số thiết bị ethernet và địa chỉ MAC. Đôi khi điều này thực sự quan trọng, như khi chạy trong VM và mỗi thiết bị được gán cho một Vlan khác nhau.

  1. Đưa giao diện mạng xuống, sau đó
  2. sửa đổi /etc/udev/rules.d/70-persistent-net.rules(hoặc tương đương)
  3. tải lại với udevadm control --reload-rules
  4. kích hoạt lại với udevadm trigger --attr-match=subsystem=net
  5. đưa các giao diện mạng lên.

Tôi đã ngạc nhiên khi điều này làm việc tốt.


6
trên Red Hat:service network stop && udevadm control --reload-rules; udevadm trigger --attr-match=subsystem=net; service network start
Alexander Torstling 19/2/2015

1
Trong thử nghiệm Debian 'udevadm kích hoạt --attr-match = subsystem = net' không hoạt động. Tôi đã phải rút và cắm thẻ USB ethernet chỉ sau đó udev kích hoạt quy tắc mới.
Trismegistos

Tôi sẵn sàng đặt cược, Trismegistos, rằng việc rút / cắm giống như gỡ bỏ và tải lại trình điều khiển mạng, theo câu trả lời của Clayton Dukes.
Mike S

12

Tôi không chắc chắn nếu điều này áp dụng, và đây chắc chắn là một bài viết cũ hơn nhưng nó đã xuất hiện khá cao tìm kiếm trên web của tôi cho thông tin udev vì vậy tôi nghĩ rằng tôi có thể chia sẻ một số kiến ​​thức.

Bạn có thể kích hoạt quy tắc udev bằng tay cho các thiết bị cụ thể. Điều này chỉ áp dụng cho các distro liên quan đến redhat (centos fedora, v.v.)

Khi bạn thực hiện các thay đổi có liên quan trong tệp quy tắc của mình ( /etc/udev/rules.d/whateveryoucalledyourrules), bạn có thể lặp lại changevới hiệu quả của thiết bị.

echo change > /sys/block/devname/partname1/uevent

Điều này sẽ buộc đọc quy tắc udev cho CHỈ thiết bị này. Theo tôi, tốt hơn nhiều, và nhắm mục tiêu hơn.


4

Đối với tôi, chuỗi lệnh dưới đây đã làm việc như mong muốn.

Tôi đã thực hiện sửa đổi /etc/udev/rules.d/70-persistent-net.rulesđể thay đổi ethsố lượng và tải lại chúng mà không cần khởi động lại.

/etc/init.d/networking stop
/etc/init.d/udev stop
udevadm control --reload-rules
/etc/init.d/udev start
/etc/init.d/networking start

Bằng cách này, nó đã được tải thành công trong thời gian chạy mà không cần khởi động lại máy.

Bất kỳ đề nghị hoặc đề xuất nào về điều này đều được chào đón, vì tôi đã tự mình khám phá điều này bằng cách đọc các trang hướng dẫn.


2

Tôi đang thêm câu trả lời đúng ở đây vì tôi phải mất một thời gian để nhận thấy nó trong phần bình luận từ @enthusiasticgeek. Tất cả những gì bạn cần làm (giả sử bạn đang ở trên bảng điều khiển của máy chủ - rõ ràng điều này rất tệ để làm nếu bạn đang ở trong!):

  1. Lấy danh sách (các) mô-đun giao diện đang được sử dụng:

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | perl -pe 's/.*\((\w+)\).*/$1/g'| uniq

Trong trường hợp của tôi, nó igb, vì vậy nó chỉ in như vậy.

  1. loại sudo rmmod igb(thay thế igbbằng trình điều khiển thẻ của bạn thu được từ bước 1.

tiếp theo, chỉnh sửa /etc/udev/rules.d/70-persistent-net.ruleskhi cần, sau đó tải lại mô-đun bằng cách sử dụng modprobe igb, thay thế lại bằng mô-đun igbcủa bạn.


Điều này, kết hợp với câu trả lời của Otheus, là loại nước sốt bí mật cho phép tôi sửa cấu hình card mạng Mellanox mà không cần khởi động lại máy. Tôi tin rằng việc tải trình điều khiển và đọc udevadm của tệp net.rules liên tục gần giống với những gì hệ thống làm khi khởi động.
Mike S

0

trong trường hợp nhiều mạng

cat /etc/udev/rules.d/70-persistent-net.rules | grep "PCI device" | awk '{print $NF}'|sed -e 's/(//g' -e 's/)//g'| uniq > /tmp/listnet
rm -rf /etc/udev/rules.d/70-persistent-net.rules 
for i in $(cat /tmp/listnet); do rmmod $i; modprobe $i;done
service network restart
rm -rf /tmp/listnet
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.