วิธีใช้ 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
ช่วยให้มั่นใจได้ว่าอุปกรณ์ได้รับการกำหนดค่าทันทีที่เสียบปลั๊กและค้นพบ เผยแพร่ข้อมูลเกี่ยวกับอุปกรณ์ที่ได้รับการประมวลผลหรือการเปลี่ยนแปลงสถานะไปยังพื้นที่ผู้ใช้
หากคุณมีคำถามหรือความคิดที่จะแบ่งปันในหัวข้อนี้ ให้ใช้แบบฟอร์มคำติชม