ความแตกต่างระหว่าง / dev และ / sys / class?


30

อะไรคือความแตกต่างระหว่างการเป็นตัวแทนของอุปกรณ์ใน/devและหนึ่งใน/sys/class?

เป็นที่ต้องการมากกว่าหนึ่งอื่น ๆ ? มีสิ่งหนึ่งที่เสนอและอื่น ๆ ไม่ได้?


1
คุณอ่านไหม serverfault.com/questions/65261/…
Rahul Patil

ดู libudev & sysfs บทช่วยสอนนี้: signal11.us/oss/udev
slm

คำตอบ:


26

ไฟล์ใน/devนั้นเป็นไฟล์อุปกรณ์จริงซึ่ง UDEV สร้างขึ้นในขณะใช้งาน ไดเรกทอรี/sys/classมีการส่งออกโดย kernel sysfsในเวลาทำงานเผยให้เห็นลำดับชั้นของฮาร์ดแวร์ผ่าน

จากการสอนแบบ libudev และ Sysfs

สิ่งที่สกัดมา

บนระบบ Unix และ Unix like อุปกรณ์ฮาร์ดแวร์จะถูกเข้าถึงผ่านไฟล์พิเศษ (หรือที่เรียกว่าไฟล์อุปกรณ์หรือโหนด) ที่อยู่ในไดเร็กทอรี / dev ไฟล์เหล่านี้อ่านและเขียนได้เช่นเดียวกับไฟล์ปกติ แต่แทนที่จะเขียนและอ่านข้อมูลบนดิสก์พวกเขาสื่อสารโดยตรงกับเคอร์เนลไดรเวอร์ซึ่งจะสื่อสารกับฮาร์ดแวร์ มีแหล่งข้อมูลออนไลน์มากมายที่อธิบาย / dev ไฟล์โดยละเอียด ตามปกติแล้วไฟล์พิเศษเหล่านี้จะถูกสร้างขึ้นในเวลาติดตั้งโดยการกระจายโดยใช้คำสั่ง mknod ในปีที่ผ่านมาระบบ Linux เริ่มใช้ udev เพื่อจัดการไฟล์ / dev เหล่านี้ที่รันไทม์ ตัวอย่างเช่น udev จะสร้างโหนดเมื่อตรวจพบอุปกรณ์และลบออกเมื่ออุปกรณ์ถูกลบ (รวมถึงอุปกรณ์ hotplug ตอนรันไทม์) ทางนี้,

ตัดตอนมาอีก

ไดเรกทอรีใน Sysfs มีลำดับชั้นของอุปกรณ์ตามที่แนบมากับคอมพิวเตอร์ ตัวอย่างเช่นบนคอมพิวเตอร์ของฉันอุปกรณ์ hidraw0 อยู่ภายใต้:

/sys/devices/pci0000:00/0000:00:12.2/usb1/1-5/1-5.4/1-5.4:1.0/0003:04D8:003F.0001/hidraw/hidraw0

ขึ้นอยู่กับเส้นทางอุปกรณ์เชื่อมต่อกับ (ประมาณเริ่มต้นจากจุดสิ้นสุด) การกำหนดค่า 1 (: 1.0) ของอุปกรณ์ที่ต่อกับหมายเลขพอร์ต 4 ของอุปกรณ์ 1-5 เชื่อมต่อกับคอนโทรลเลอร์ USB 1 (usb1) เชื่อมต่อกับ บัส PCI ในขณะที่น่าสนใจเส้นทางไดเรกทอรีนี้ไม่ได้ทำให้เราดีนักเนื่องจากขึ้นอยู่กับว่าฮาร์ดแวร์เชื่อมต่อกับคอมพิวเตอร์อย่างไร

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

การใช้งาน?

โดยทั่วไปคุณใช้กฎใน/etc/udev/rules.dเพื่อเพิ่มระบบของคุณ สามารถสร้างกฎเพื่อเรียกใช้สคริปต์เมื่อมีฮาร์ดแวร์ต่างๆ

เมื่อระบบหยุดทำงานคุณสามารถเขียนสคริปต์เพื่อทำงานต่อต้าน/devหรือ/sysและมันลงมาในการตั้งค่าส่วนตัว แต่จริงๆแล้วฉันมักจะลองและทำงานกับ/sysและใช้เครื่องมือเช่นudevadmแบบสอบถาม UDEV สำหรับสถานที่ของทรัพยากรระบบต่างๆ

$ udevadm info -a -p  $(udevadm info -q path -n /dev/sda) | head -15

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/pci0000:00/0000:00:1f.2/ata1/host0/target0:0:0/0:0:0:0/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{ro}=="0"
    ATTR{size}=="976773168"
    ATTR{stat}==" 6951659  2950164 183733008 41904530 16928577 18806302 597365181 580435555        0 138442293 622621324"
    ATTR{range}=="16"
...

ไม่แน่ใจว่าฉันเข้าใจคุณถูกต้อง ดังนั้นขอให้ชี้แจงให้แน่ชัด ไม่ว่าคุณจะตัดสินใจที่จะเชื่อมต่อกับอุปกรณ์ภายนอก (เช่นผ่าน i2c หรือ mipi) โดยการสร้างรายการใน / dev หรือ / sys ขึ้นอยู่กับการตั้งค่าส่วนตัวอย่างหมดจด? ถ้าไม่ใช่ในกรณีใด / เหตุใดคนเราจึงเลือกที่จะเลือกอดีตให้เป็นตัวแทนหลัง (และรอง verca)?
LandonZeKepitelOfGreytBritn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.