ค้นหาเว็บไซต์

วิธีใช้ Udev สำหรับการตรวจจับและการจัดการอุปกรณ์ใน Linux


Udev (พื้นที่ผู้ใช้ /dev) เป็นระบบย่อย Linux สำหรับการตรวจจับและการจัดการอุปกรณ์แบบไดนามิก เนื่องจากเคอร์เนลเวอร์ชัน 2.6 เป็นการแทนที่ devfs และ hotplug

โดยจะสร้างหรือลบโหนดอุปกรณ์แบบไดนามิก (อินเทอร์เฟซไปยังไดรเวอร์อุปกรณ์ที่ปรากฏในระบบไฟล์ราวกับว่าเป็นไฟล์ธรรมดาที่จัดเก็บไว้ในไดเร็กทอรี /dev) ในเวลาบูตหรือหากคุณเพิ่ม อุปกรณ์ไปยังหรือถอดอุปกรณ์ออกจากระบบ จากนั้นจะเผยแพร่ข้อมูลเกี่ยวกับอุปกรณ์หรือการเปลี่ยนแปลงสถานะไปยังพื้นที่ผู้ใช้

หน้าที่ของมันคือ 1) จัดหากิจกรรมของอุปกรณ์ให้กับแอปพลิเคชันระบบ 2) จัดการสิทธิ์ของโหนดอุปกรณ์ และ 3) อาจสร้างลิงก์สัญลักษณ์ที่เป็นประโยชน์ในไดเร็กทอรี /dev สำหรับการเข้าถึงอุปกรณ์ หรือแม้แต่เปลี่ยนชื่ออินเทอร์เฟซเครือข่าย .

ข้อดีประการหนึ่งของ udev คือสามารถใช้ชื่ออุปกรณ์ถาวรเพื่อรับประกันการตั้งชื่ออุปกรณ์ที่สอดคล้องกันตลอดการรีบูต แม้ว่าจะเรียงลำดับการค้นพบก็ตาม คุณลักษณะนี้มีประโยชน์เนื่องจากเคอร์เนลจะกำหนดชื่ออุปกรณ์ที่ไม่สามารถคาดเดาได้ตามลำดับการค้นพบ

ในบทความนี้ เราจะเรียนรู้วิธีใช้ Udev สำหรับการตรวจจับและการจัดการอุปกรณ์บนระบบ Linux โปรดทราบว่า Linux สมัยใหม่ส่วนใหญ่หรือไม่ใช่กระแสหลักทั้งหมดจะมาพร้อมกับ Udev เป็นส่วนหนึ่งของการติดตั้งเริ่มต้น

เรียนรู้พื้นฐานของ Udev ใน Linux

udev daemon, systemd-udevd (หรือ systemd-udevd.service) สื่อสารกับเคอร์เนลและรับอุปกรณ์ uevents ได้โดยตรงจากแต่ละครั้งที่คุณเพิ่มหรือลบอุปกรณ์ออกจากระบบ หรืออุปกรณ์เปลี่ยนสถานะ

Udev เป็นไปตามกฎ – กฎมีความยืดหยุ่นและมีประสิทธิภาพมาก กิจกรรมอุปกรณ์ที่ได้รับทั้งหมดจะถูกจับคู่กับชุดกฎที่อ่านจากไฟล์ที่อยู่ใน /lib/udev/rules.d และ /run/udev/rules.d

คุณสามารถเขียนไฟล์กฎที่กำหนดเองได้ในไดเร็กทอรี /etc/udev/rules.d/ (ไฟล์ควรลงท้ายด้วยนามสกุล .rules) เพื่อประมวลผลอุปกรณ์ โปรดทราบว่าไฟล์กฎในไดเร็กทอรีนี้มีลำดับความสำคัญสูงสุด

ในการสร้างไฟล์โหนดอุปกรณ์ udev จำเป็นต้องระบุอุปกรณ์โดยใช้คุณลักษณะบางอย่าง เช่น ป้ายกำกับ หมายเลขซีเรียล หมายเลขหลักและหมายเลขรองที่ใช้ หมายเลขอุปกรณ์บัส และอื่นๆ ล้นหลาม. ข้อมูลนี้ส่งออกโดยระบบไฟล์ sysfs

เมื่อใดก็ตามที่คุณเชื่อมต่ออุปกรณ์เข้ากับระบบ เคอร์เนลจะตรวจจับและเริ่มต้นอุปกรณ์นั้น และไดเร็กทอรีที่มีชื่ออุปกรณ์จะถูกสร้างขึ้นภายใต้ไดเร็กทอรี /sys/ ซึ่งจัดเก็บคุณลักษณะของอุปกรณ์

ไฟล์การกำหนดค่าหลักสำหรับ udev คือ /etc/udev/udev.conf และหากต้องการควบคุมพฤติกรรมรันไทม์ของ udev daemon คุณสามารถใช้ยูทิลิตี udevadm ได้

หากต้องการแสดง เหตุการณ์ เคอร์เนลที่ได้รับ (uevents) และ เหตุการณ์ udev (ซึ่ง udev ส่งออกหลังจากการประมวลผลกฎ) ให้เรียกใช้ udevadm ด้วยคำสั่งมอนิเตอร์ จากนั้นเชื่อมต่ออุปกรณ์เข้ากับระบบของคุณและรับชมวิธีจัดการเหตุการณ์ของอุปกรณ์จากเทอร์มินัล

ภาพหน้าจอต่อไปนี้แสดงข้อความที่ตัดตอนมาจากเหตุการณ์ ADD หลังจากเชื่อมต่อ USB แฟลชดิสก์เข้ากับระบบทดสอบ:

udevadm monitor 

หากต้องการค้นหาชื่อที่กำหนดให้กับดิสก์ USB ของคุณ ให้ใช้ยูทิลิตี้ lsblk ซึ่งจะอ่านระบบไฟล์ sysfs และ udev db เพื่อรวบรวมข้อมูลเกี่ยวกับอุปกรณ์ที่ประมวลผล

 
lsblk

จากเอาต์พุตของคำสั่งก่อนหน้า ดิสก์ USB จะมีชื่อว่า sdb1 (เส้นทางสัมบูรณ์ควรเป็น /dev/sdb1) หากต้องการสอบถามคุณลักษณะของอุปกรณ์จากฐานข้อมูล udev ให้ใช้ คำสั่งข้อมูล

udevadm info /dev/sdb1

วิธีทำงานกับกฎ Udev ใน Linux

ในส่วนนี้ เราจะพูดคุยสั้นๆ ถึงวิธีเขียนกฎ udev กฎประกอบด้วยรายการคู่คีย์-ค่าที่คั่นด้วยเครื่องหมายจุลภาค กฎอนุญาตให้คุณเปลี่ยนชื่อโหนดอุปกรณ์จากชื่อเริ่มต้น แก้ไขสิทธิ์และความเป็นเจ้าของโหนดอุปกรณ์ ทริกเกอร์การทำงานของโปรแกรมหรือสคริปต์เมื่อมีการสร้างหรือลบโหนดอุปกรณ์ และอื่นๆ อีกมากมาย

เราจะเขียนกฎง่ายๆ เพื่อเรียกใช้สคริปต์เมื่อมีการเพิ่มอุปกรณ์ USB และเมื่อถูกลบออกจากระบบที่รันอยู่

เริ่มต้นด้วยการสร้างสคริปต์ทั้งสอง:

sudo vim /bin/device_added.sh

เพิ่มบรรทัดต่อไปนี้ในสคริปต์ device_added.sh

#!/bin/bash
echo "USB device added at $(date)" >>/tmp/scripts.log

เปิดสคริปต์ที่สอง

sudo vim /bin/device_removed.sh

จากนั้นเพิ่มบรรทัดต่อไปนี้ในสคริปต์ device_removed.sh

#!/bin/bash
echo "USB device removed  at $(date)" >>/tmp/scripts.log

บันทึกไฟล์ ปิดและทำให้ทั้งสองสคริปต์สามารถเรียกใช้งานได้

sudo chmod +x /bin/device_added.sh
sudo chmod +x /bin/device_removed.sh

ต่อไป เรามาสร้างกฎเพื่อทริกเกอร์การทำงานของสคริปต์ด้านบนที่เรียกว่า /etc/udev/rules.d/80-test.rules

vim /etc/udev/rules.d/80-test.rules

เพิ่มกฎสองข้อต่อไปนี้ลงไป

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device",  RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

ที่ไหน :

  • "==": เป็นตัวดำเนินการเปรียบเทียบเพื่อความเท่าเทียมกัน
  • "+=": เป็นตัวดำเนินการเพื่อเพิ่มค่าให้กับคีย์ที่เก็บรายการรายการ
  • ระบบย่อย: จับคู่ระบบย่อยของอุปกรณ์เหตุการณ์
  • ACTION: ตรงกับชื่อของการทำงานของเหตุการณ์
  • ENV{DEVTYPE}: จับคู่กับค่าคุณสมบัติของอุปกรณ์ ประเภทอุปกรณ์ในกรณีนี้
  • RUN: ระบุโปรแกรมหรือสคริปต์เพื่อดำเนินการเป็นส่วนหนึ่งของการจัดการเหตุการณ์

บันทึกไฟล์และปิด จากนั้นในฐานะรูท ให้สั่ง systemd-udevd ให้โหลดไฟล์กฎใหม่ (ซึ่งจะโหลดฐานข้อมูลอื่น ๆ เช่นดัชนีโมดูลเคอร์เนลด้วย) โดยการรัน

sudo udevadm control --reload

ตอนนี้เชื่อมต่อไดรฟ์ USB เข้ากับเครื่องของคุณและตรวจสอบว่าสคริปต์ device_added.sh ถูกเรียกใช้งานหรือไม่ ก่อนอื่น ไฟล์ scripts.log ควรถูกสร้างขึ้นภายใต้ /tmp

ls -l /tmp/scripts.log

จากนั้นไฟล์ควรมีรายการเช่น “อุปกรณ์ USB ถูกลบเมื่อ date_time ” ดังที่แสดงในภาพหน้าจอ

cat /tmp/scripts.log

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเขียนกฎ udev และจัดการ udev โปรดดูรายการคู่มือ udev และ udevadm ตามลำดับ โดยเรียกใช้:

man udev
man udevadm
สรุป

Udev เป็นตัวจัดการอุปกรณ์ที่โดดเด่นซึ่งมอบวิธีไดนามิกในการตั้งค่าโหนดอุปกรณ์ในไดเร็กทอรี /dev ช่วยให้มั่นใจได้ว่าอุปกรณ์ได้รับการกำหนดค่าทันทีที่เสียบปลั๊กและค้นพบ เผยแพร่ข้อมูลเกี่ยวกับอุปกรณ์ที่ได้รับการประมวลผลหรือการเปลี่ยนแปลงสถานะไปยังพื้นที่ผู้ใช้

หากคุณมีคำถามหรือความคิดที่จะแบ่งปันในหัวข้อนี้ ให้ใช้แบบฟอร์มคำติชม