ใช้ UUID ในกฎ udev และเชื่อมต่อไดรฟ์ usb บน / media / $ UUID


13

ฉันต้องการติดตั้งไดรฟ์ usb /mediaตาม UUID ของดิสก์ ฉันจะใช้ UUID ของไดรฟ์ usb ในไฟล์กฎของ udev ได้อย่างไรและอะไรคือกฎของ udev ในการติดตั้งไดรฟ์ usb ด้วยหมายเลข UUID เป็นชื่อโฟลเดอร์

blkidคำสั่ง outputs UUID ของดิสก์ แต่เฉพาะเมื่อการติดตั้ง


1
Caveat 2019: บนระบบ Linux บนเดสก์ท็อปสมัยใหม่ที่ใช้ systemd กฎ udev ไม่เมาต์ระบบไฟล์ในเนมสเปซผู้ใช้ปกตินั่นคือคุณไม่สามารถเมาท์ระบบไฟล์โดยใช้คำสั่ง mount ในกฎ udev นอกจากนี้ในระบบเหล่านี้ระบบฟิวส์ (ระบบไฟล์ผู้ใช้) ได้รับการกำหนดค่าให้จัดการการเมาท์ USB ผ่านไอคอนเดสก์ท็อปดังนั้นการติดตั้งด้วยมือโดยใช้กฎ fstab เพื่อความขัดแย้งในระดับหนึ่งกับระบบฟิวส์ สำหรับการติดตั้งระบบไฟล์ USB โดย UUID โดยอัตโนมัติบนเซิร์ฟเวอร์ headless คุณควรลบการกำหนดค่าฟิวส์ systemd และใช้กฎ udev เพื่อทริกเกอร์บริการ one-shot mount
Jonathan Ben-Avraham

ดูโซลูชันนี้โดยใช้ fstab, systemd และ automount ทดสอบบน Debian ล่าสุด: unix.stackexchange.com/a/347007/31228
Jonathan Ben-Avraham

คำตอบ:


14

แม้ว่า UUID จะไม่สามารถเข้าถึงได้โดยตรงโดย udev อย่างน้อยใน Fedora และ Ubuntu พวกเขาถูกตั้งค่าเป็นตัวแปรสภาพแวดล้อม ( ENV) udevadm info /dev/sdcคุณสามารถอ่านออกตัวแปรสภาพแวดล้อมทั้งหมดของอุปกรณ์โดยการเรียก เช่นสำหรับ NTFS ในไดรฟ์ภายนอกฉันได้รับ:

$ udevadm info /dev/sdc2
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/block/sdc/sdc2
N: sdc2
[…]
E: ID_FS_TYPE=ntfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=4A6F2ABC1232FA37
[…]

ทุกสิ่งที่E:อยู่ด้านหน้าถูกตั้งค่าเป็นตัวแปรสภาพแวดล้อม

จับคู่กับ UUID

ENV{ID_FS_UUID}=="4A6F2ABC1232FA37"คุณสามารถจับคู่กับมันด้วย ในฐานะที่เป็นตัวกรองแรกฉันตรงกับKERNEL=="sd?2"เพื่อให้แน่ใจว่าฉันจัดการอุปกรณ์บล็อกด้วยหมายเลขพาร์ติชันที่ถูกต้องเท่านั้น กฎที่สมบูรณ์จะมีลักษณะเช่นนี้:

KERNEL=="sd?2", ENV{ID_FS_UUID}=="4A6F2ABC1232FA37", RUN+="/usr/bin/logger --tag my-manual-usb-mount Mounting the device with UUID 4A6F2ABC1232FA37", RUN+="/usr/bin/mount [Your mount options here]"

คำสั่ง logger มีประโยชน์ในการยืนยันว่ากฎนั้นทำงานจริง ถัดไปคุณควรตรวจสอบว่ากฎไม่ได้มีข้อผิดพลาดใด ๆ udevadm test /dev/sdc2กับไวยากรณ์ ไฟล์กฎของคุณควรอยู่ในผลลัพธ์และไม่มีข้อความแสดงข้อผิดพลาดปรากฏขึ้นถัดจากไฟล์ sudo udevadm trigger /dev/sdc2ตอนนี้คุณสามารถเรียกกฎทั้งหมดสำหรับอุปกรณ์ของคุณเพื่อตรวจสอบว่ากฎของคุณทำงานได้ตามที่วางแผนไว้: หากกฎของคุณตรงกันคุณจะพบข้อความบันทึกที่กำหนดเองในบันทึกของระบบ ( /var/log/syslogหรือผ่านjournalctl -b)

แก้ไข: ali_mได้ชี้ให้เห็นว่าตัวแปรสภาพแวดล้อมที่มีการตั้งค่าตามกฎก่อนหน้านี้และจึงเพียง accessibly ถ้า.rulesไฟล์มีการสั่งซื้อ lexicographical ที่สูงพอสมควร เริ่มต้นด้วย "60" ควรจะเพียงพอ ส่วนตัวฉันเริ่มกฎของฉันด้วย "zz" (ถ้าเป็นไปได้) เพื่อแยกพวกเขาออกจากกฎที่กำหนดไว้ล่วงหน้าได้อย่างรวดเร็ว

การใช้ UUID ในRUNคำสั่งและที่อื่น ๆ

udev มีประสิทธิภาพมากตัวแปรและแอตทริบิวต์เปลี่ยนตัวไวยากรณ์ โดยเฉพาะทุกสิ่งที่เกิดขึ้น$env{ID_FS_UUID}จะถูกแทนที่ด้วย UUID ของไดรฟ์ ดังนั้นในการติดตั้งอุปกรณ์ภายใต้/media/UUIDคุณสามารถใช้กฎนี้:

KERNEL=="sd??", RUN+="/usr/bin/mkdir /media/$env{ID_FS_UUID}", RUN+="/usr/bin/mount $devpath /media/$env{ID_FS_UUID}"

คุณอาจต้องการกำหนดค่า udisks แทน แต่มันเป็นพิเศษสำหรับพื้นที่ปัญหาที่คุณต้องการแก้ไข ดูhttps://wiki.archlinux.org/index.php/udisks#udisks2:_mount_to_.2Fmediaเป็นจุดเริ่มต้น

กรณีการใช้งานจริงของฉันสำหรับการติดตั้งอุปกรณ์ที่มี udev แทน/etc/fstabหรือ udisks คือการเมานต์ระบบไฟล์ zfs ซึ่งมีนิสัยแปลก ๆ บางอย่างทำให้พวกมันไม่พอดีกับเครื่องมือปกติ


1
จุดสำคัญอย่างหนึ่งที่ทำให้ฉันต้องใช้เวลาพอสมควรในการพิจารณา: เพื่อให้สอดคล้องกับตัวแปรสภาพแวดล้อมกฎของคุณจะต้องถูกนำไปใช้หลังจากตั้งค่าตัวแปรเหล่านั้นแล้ว เพื่อให้บรรลุนี้ของคุณ.rulesชื่อไฟล์ความต้องการที่จะเริ่มต้นด้วยตัวเลข> 60
ali_m

@ali_m: ขอบคุณฉันได้เพิ่มข้อมูลของคุณไปยังคำตอบแล้ว
Perseids

Ubuntu 18.04 คำสั่ง udevadm บางคำสามารถชี้ไปที่ / dev / sdXX (เช่นข้อมูล udevadm) คนอื่น ๆ จะต้องชี้ไปที่ / sys / block / sdXX ด้วยเหตุผลบางอย่าง (เช่นการทดสอบ udevadm)
Greg Bell

0

มีคำตอบคร่าวๆอยู่ในใจฉัน ตั้งค่ารายการ fstab ที่ไม่ตรงตาม IDUU และในกฎ udev ดำเนินการmount -aทุกครั้งที่มีอุปกรณ์ sd * ใหม่เพิ่ม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.