วิธีการเมานท์สื่อที่ถอดเข้าออกได้ใน / media / <LABEL> โดยอัตโนมัติเมื่อใส่เข้าไปโดยไม่มีสภาพแวดล้อมของเดสก์ทอป?


17

ฉันมีระบบ Debian sid (Wheezy) (และเหมือนกันสำหรับ arch) โดยไม่มีสภาพแวดล้อมบนเดสก์ท็อปใด ๆ (และไม่มี Xorg เลย)

ฉันสามารถติดตั้งการ์ด SD, USB sticks, HDD ภายนอกโดยติดป้ายกำกับลงในไดเรกทอรีที่ระบุ/media/ด้วยตนเองด้วยmount/ umountและรายการที่เหมาะสมใน/etc/fstabหรือโดยอัตโนมัติในเวลาบูต แต่นี่เป็นสิ่งที่น่าดึงดูด หากฉันต้องการให้พวกเขาติดตั้ง/media/<LABEL>อุปกรณ์แต่ละตัวที่มี<LABEL>ความต้องการแตกต่างกันไปและแต่ละ<LABEL>ไดเรกทอรีย่อยจะต้องสร้าง / ลบด้วยตนเองด้วย/media/เช่นกัน)

ดังนั้นวิธีที่ดีที่สุดในการติดตั้งพวกเขาโดยอัตโนมัติใน/media/<LABEL> ที่แทรกคืออะไร (และเพื่อยกเลิกการต่อเชื่อมพวกเขาจากระบบไฟล์ทันทีที่พวกเขาจะถอดปลั๊กไม่ว่าจะมีความเสี่ยงสำหรับข้อมูล )?

ทางออกที่ดีจะ:

  1. ตรวจสอบเมื่อสื่อที่ถอดเสียบใน (เช่นเมื่อเข้ามาอยู่ใน/dev/ฐานะ sdax, sdbx... โดยudev)
  2. สร้างไดเรกทอรี/media/ตามฉลาก (ฉลากของสื่อที่ถอดได้)
  3. ติดตั้งในไดเรกทอรี/media/<LABEL>ในRWโหมด (หากเป็นระบบไฟล์รองรับ) พร้อมflushตัวเลือก (สำหรับ a vfat)
  4. ตรวจสอบว่าได้ถอดปลั๊กสื่อ
  5. ถ้าเป็นเช่นนั้นให้ unmount จากระบบไฟล์
  6. ลบไดเรกทอรีที่เกี่ยวข้องออกจาก /media/

(อุปกรณ์ควรติดตั้งในโหมดซิงโครนัสอย่างหลีกเลี่ยงไม่ให้ข้อมูลสูญหายเมื่อปลั๊กร้อนเนื่องจากการแคชแก้ไข: syncเป็นวิธีที่มากเกินไปสำหรับvfatสื่อแบบถอดflush ได้ดังนั้นจึงถูกสร้างขึ้นเป็นประนีประนอมปลอดภัยน้อยกว่าsyncแต่มีความเสี่ยงน้อยกว่า - หน่วยความจำแฟลช)

ผมพบว่าข้อมูลบางอย่างเกี่ยวกับautofs, HAL, udisks, udisks2, usbmountฯลฯ แต่ก็ไม่มีความชัดเจนในที่หนึ่งที่จะเลิกหรือแนะนำและอย่างไรก็ตามผมไม่ได้คิดออกวิธีการกำหนดค่าได้อย่างง่ายดายในระบบของฉันจะทำอย่างนั้นถึงตอนนี้ ...


ก่อนอื่นคุณค้นหาคำถามที่คล้ายกันหรือไม่ ฉันจำได้ว่ามันถูกถามแล้ว ประการที่สองการถอนติดตั้งควรเกิดขึ้นก่อนถอดปลั๊ก
enzotib

1
แน่นอนฉันทำ: o] ที่นี่และใน superuser ปัญหาคือเครื่องมือวิวัฒนาการ (udisks / udev) หรือเลิกใช้แล้ว (HAL?), อื่น ๆ "ไม่ต้องการ" (udisks2?) และอื่น ๆ อย่างไรก็ตามฉันไม่สามารถหาวิธีทำงานหรือแก้ไขปัญหาที่ชัดเจนได้ ส่วนใหญ่ของสิ่งที่ฉันรู้รู้พึ่งพากลไกสภาพแวดล้อมเดสก์ทอป (Gnome, KDE หรือ XFCE); ฉันไม่ต้องการที่จะติดตั้งใด ๆ เกี่ยวกับการถอดออกไม่จำเป็นต้องเป็น หากตั้งค่าอุปกรณ์เป็นsyncdeamon สามารถยกเลิกการต่อเชื่อมอุปกรณ์จาก fs หากตรวจพบว่าอุปกรณ์ถูกถอดออกโดยไม่มีการสูญหายของข้อมูล เดสก์ท็อป distros ทั้งหมดทำเช่นนั้น ฉันต้องการสิ่งนั้นในเทอร์มินัล
cedbeu

ดูที่นี้แทน halevtเกี่ยวกับการถอนติดตั้งโดยทั่วไป DE คาดว่าคุณจะนำอุปกรณ์ออกจากตัวจัดการไฟล์ก่อนที่จะถอดปลั๊กออก
enzotib

ใช่จริง แต่ฉันเห็นว่า daemons (เคยใช้) บางคนสามารถ unmount อุปกรณ์จาก fs ที่ไม่ได้ถูก unmount ก่อนที่จะถอดปลั๊กและแม้แต่ลบไดเรกทอรีที่เกี่ยวข้องโดยอัตโนมัติจาก / media / และอยู่ในลักษณะปกติของการทำสิ่งต่าง ๆ (ถ้า อุปกรณ์ถูกกำหนดค่าให้เป็นแบบซิงโครนัสแน่นอน) ขอบคุณสำหรับลิงค์ของคุณ ฉันจะดูทันทีที่ฉันกลับบ้านที่ udisksevt ฉันดู devmon และ udiskie แล้ว แต่ไม่ได้อยู่ในแพ็คเกจ Debian ถ้าฉันสามารถหาสิ่งอื่นฉันจะลอง แต่ฉันไม่อยากจะเชื่อเลยว่าไม่มีวิธีแก้ปัญหาแบบดั้งเดิมใน Debian ที่จะทำเช่นนั้น
cedbeu

1
ฉันใน Debian เกินไปและผมใช้fdisk -lแล้วmount- ที่สองคำสั่ง แต่ตกลงถ้าคุณต้องการมัน automatized คุณจะต้องแยกfdisk -lออกแล้วใส่ไว้ในmount- ฉันทำสิ่งดังกล่าวมีhead, tail, tr, cut, เป็นต้น แต่ข้อดีมักทำด้วยawkหรือดีกว่าให้มองหาข้อมูลในตำแหน่งที่ถูกต้อง เกี่ยวกับการลบอย่างน้อยสำหรับฉันเมื่อฉันไป/mntที่นั่นจะทำโดยอัตโนมัติ เกี่ยวกับทริกเกอร์ (เมื่อคุณเสียบ) ฉันไม่มีเงื่อนงำ แต่โปรดบอกเราเมื่อคุณแก้ปัญหานี้
Emanuel Berg

คำตอบ:


10

pmountผมคิดว่าคุณกำลังมองหา

หากคุณต้องการติดตั้งอัตโนมัติเมื่อแทรกดูautomounting แท่ง USB บน Debian

หากระบบของคุณใช้udisks2นั่นเป็นวิธีที่ต้องการในการตอบสนองต่อการใส่อุปกรณ์เก็บข้อมูลแบบถอดได้ ดูArch Wikiสำหรับเคล็ดลับการตั้งค่าสำหรับ Udisks

มิฉะนั้นโปรแกรมที่ตอบสนองเมื่ออุปกรณ์ใหม่จะปรากฏขึ้นเป็นudev , ติดตั้งโดยอัตโนมัติเพื่อจะถูกเรียกโดยกฎ udev usbmountแพคเกจให้กฎ udev จะติดอุปกรณ์จัดเก็บข้อมูล USB และบางคนอื่น ๆ โดยอัตโนมัติ การโทรmountจากกฏ udev นั้นใช้ไม่ได้กับระบบไฟล์ FUSE (เช่น ntfs-3g) ดังนั้นให้ใช้ udisks หากคุณต้องการ

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


ขอบคุณล้านคำตอบ ฉันจะลองโดยเร็วที่สุดและจะให้คนที่นี่รู้ เกี่ยวกับการถอดออก Guys โปรดหยุดบอกฉันว่าเป็นเรื่องของเวรกรรมที่ไม่: o] ยกเลิกการต่อเชื่อมหลังจากที่อุปกรณ์ถูกถอดปลั๊กอย่างสมบูรณ์แบบทำให้รู้สึก (และเป็นไปได้) ทันทีที่กำหนดค่าอุปกรณ์ให้ซิงโครนัส จากนั้นเป็นเพียงเรื่องของระบบไฟล์ หากข้อมูลถูกถ่ายโอนโดยไม่มีการแคช (แบบซิงโครนัส) แสดงว่าไม่มีปัญหาในการถอดออกโดยไม่ต้องถอดออก จากนั้นการยกเลิกการเมานท์สามารถทำได้และมีประโยชน์เพียงเพื่อแจ้งให้ระบบทราบว่าอุปกรณ์ไม่ได้อยู่ที่นั่นอีกต่อไป
cedbeu

1
@cblab คุณกำลังใช้งานเกินจริง หากไฟล์เปิดอยู่สำหรับการเขียนและคุณดึงอุปกรณ์ออกมาไฟล์ดังกล่าวอาจเสียหาย การยกเลิกการต่อเชื่อมทำให้แน่ใจว่าไม่มีไฟล์ใดถูกเปิด ในระบบไฟล์จำนวนมาก (ไม่ใช่ FAT แม้ว่า) การเลิกเมานท์มากกว่าการตั้งค่าบิตสกปรกเป็น 0 พวกเขาจำเป็นต้องเช่นล้างบันทึก สำหรับอุปกรณ์แฟลชความกังวลหลักของการเมาท์ซิงค์คือมันจะทำให้อุปกรณ์เสื่อมเร็วขึ้นมากเพราะมันป้องกันการจัดกลุ่มการเขียน ดูsuperuser.com/questions/180722/…และreadlist.com/lists/vger.kernel.org/linux-kernel/22/111748.html
Gilles 'SO- หยุดความชั่วร้าย'

สวัสดี @Gilles ขอบคุณสำหรับคำตอบของคุณ ฉันไม่คิดว่าฉันจะเข้าใจผิด คุณถูกต้องในบางจุด แต่ผู้ใช้จะตัดสินใจว่าเขาต้องการที่จะเสี่ยงชีวิตหรือไม่ คุณเห็นด้วยกับโพสต์ของคุณคือ 7 ปี; ตอนนี้flushตัวเลือกการเมานต์ที่ออกแบบมาเพื่อvfatหลีกเลี่ยงปัญหาเหล่านี้โดยเฉพาะ: การเขียนไม่ได้ดำเนินการหลังจากแต่ละบล็อก แต่ทันทีที่อุปกรณ์ดูเหมือนจะไม่ทำงาน และความทรงจำแฟลชก็เพิ่มวงจรชีวิตของผู้ตายด้วยเช่นกัน ตอนนี้เห็นได้ชัดว่าผู้ใช้จะต้องระวังไม่ให้ถอดปลั๊กอุปกรณ์ในขณะที่เปิดไฟล์หรือระหว่างการคัดลอก (หรือหลังจากนั้นไม่นาน) แต่มันเป็นการประนีประนอมที่ดี
cedbeu

อย่างไรก็ตาม usbmount อาจเป็นตัวเลือกที่ดีสำหรับฉัน แต่น่าเสียดายที่มันไม่ได้เมานต์อุปกรณ์ในโฟลเดอร์ตามชื่อของฉลาก แต่ใน/media/usb-*ซึ่งไม่ตรงกับความต้องการของฉัน ฉันต้องการที่จะสามารถติดตั้งอุปกรณ์โดยอัตโนมัติ/media/<DEV_LABEL>ด้วยflushพารามิเตอร์เมื่อมีการตรวจพบ (ถ้าเป็นไปได้ด้วยการสร้างไดเรกทอรีแบบไดนามิก) และเพื่อยกเลิกการต่อเชื่อมพวกเขาและลบไดเรกทอรีจาก/media/โดยอัตโนมัติหากพวกเขาจะไม่ถูกตรวจพบอีกต่อไป ความเสี่ยงที่ฉันได้รับนั้นขึ้นอยู่กับฉัน
cedbeu

1
ให้ความสนใจที่usbmountไม่รองรับระบบไฟล์ NTFS jessieอีกต่อไปตั้งแต่: bugs.debian.org/774149
malat

2

นี่คือวิธีที่ฉันทำเมื่อเร็ว ๆ นี้และฉันมีความสุขมากกับวิธีการนี้ในขณะนี้ นี่สำหรับ Ubuntu 12.04 + gentoo แต่ฉันเดาว่า distro ใด ๆ ที่อนุญาตให้ติดตั้ง udev และ autofs น่าจะใช้ได้

สิ่งที่จำเป็นต้องมี: คุณต้องติดตั้ง udev + autofs

ขั้นตอนที่ 1)

สร้างไฟล์ "/etc/udev/rules.d/90-usbsd-auto.rules" ต่อไปนี้ (แน่นอนว่าคุณอาจใช้ชื่อใดก็ได้ตราบใดที่ลงท้ายด้วย ".rules") :

# Add symlink /dev/usbdisks/<label> to /dev/sd[a-z][1-9] 
# if partition has a label
# Add symlink /media/usb/<label> to /media/autousb/<label>
# for automounter support
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}", \
    RUN+="/bin/ln -sf /media/autousb/$env{ID_FS_LABEL_ENC} /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has a NO label, use kernel name (sd[a-z][1-9])
ACTION=="add", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    SYMLINK+="usbdisks/%k", MODE:="0660", \
    RUN+="/bin/rm /media/usb/%k", \
    RUN+="/bin/ln -sf /media/autousb/%k /media/usb/%k"

# Some FileSystems emit a "change" event when they are unmounted.
# UDEV seems to delete the device symlink in this case :-(
# So we need to re-create it here
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    SYMLINK+="usbdisks/$env{ID_FS_LABEL_ENC}", MODE:="0660"

# Fallback: If partition has NO label, use kernel name
ACTION=="change", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    SYMLINK+="usbdisks/%k", MODE:="0660"


# When device is removed, also remove /media/usb/<label>
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}=="?*", \
    RUN+="/bin/rm /media/usb/$env{ID_FS_LABEL_ENC}"

# Fallback: If partition has no label, remove /media/usb/%k
ACTION=="remove", KERNEL=="sd*", ENV{DEVTYPE}=="partition", \
    ENV{ID_BUS}=="usb", ENV{ID_FS_LABEL_ENC}!="?*", \
    RUN+="/bin/rm /media/usb/%k"

สิ่งนี้ทำอะไร: มันสร้าง symlink สองตัวหนึ่งตัวสำหรับพาร์ติชันอุปกรณ์เก็บข้อมูล USB ภายใต้ "/ dev / usbdisks / <... >" มันจะใช้เลเบลของพาร์ติชันหน่วยเก็บข้อมูล USB หรือชื่อเคอร์เนลหากไม่มีเลเบล symlink ที่สองจะเชื่อมโยงจาก "/ media / usb / <... >" ถึง "/ media / autousb / <... >" สิ่งนี้ทำเพื่อการสนับสนุนของ automounter (ดูขั้นตอนที่ 2)

หมายเหตุ: เดิมฉันไม่ได้ใช้กฎกับตัวแปร ID_FS_LABEL_ENC เนื่องจากสิ่งนี้เป็นอันตรายในความคิดของฉัน จะเกิดอะไรขึ้นถ้าคุณเสียบ USB แท่งสองอันที่ใช้ฉลากเดียวกัน

แต่โปสเตอร์ต้องการใช้ฉลากของดิสก์ USB โดยเฉพาะดังนั้นฉันจึงปรับเปลี่ยนกฎตามนั้น

เพื่อให้แน่ใจว่า udev อ่านกฎเหล่านี้ใช้

sudo udevadm control --reload-rules

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

ขั้นตอนที่ 2)

ตั้งค่า autofs เป็น automount / media / autousb / <... >: ฉันเพิ่มบรรทัดต่อไปนี้ในไฟล์ "/etc/auto.master" ของฉัน (สำหรับ Ubuntu 12.04):

/media/autousb /etc/auto.usb --timeout=60

ซึ่งหมายความว่า AutoFS จะยกเลิกการต่อเชื่อมอุปกรณ์หลังจากไม่มีกิจกรรมใด ๆ เป็นเวลา 60 วินาที คุณอาจต้องการใช้น้อยหรือมากขึ้นอยู่กับรสนิยมของคุณ

สำหรับ Gentoo คุณต้องแก้ไข "/etc/autofs/auto.master" ดังนั้นจึงเหมาะสมที่จะใช้

/media/autousb /etc/autofs/auto.usb --timeout=60

ตอนนี้ฉันสร้าง "auto.usb" ด้วยเนื้อหาต่อไปนี้:

#!/bin/bash

key=${1}
fstype=$(/sbin/blkid -o value -s TYPE /dev/usbdisks/${key})
if [ "${fstype}" = "vfat" ] ; then
  echo "-fstype=vfat,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ntfs" ] ; then
  echo "-fstype=fuse.ntfs-3g,sync,uid=0,gid=plugdev,umask=007 :/dev/usbdisks/${key}"
  exit 0
fi
if [ "${fstype}" = "ext4" ] ; then
  echo "-fstype=ext4,sync,nocheck :/dev/usbdisks/${key}"
  exit 0
fi

exit 1

auto.usb นี้ต้องสามารถเรียกใช้งานได้ดังนั้น autofs จึงใช้สคริปต์นี้เป็น (ทุบตี) ตัวอย่างเช่น

sudo chmod 0755 /etc/auto.usb

สิ่งนี้ทำอะไร: สคริปต์นี้จะบอก AutoFS (/ usr / sbin / automount) วิธีติดตั้งพาร์ติชันอุปกรณ์เก็บข้อมูล usb

สคริปต์จะใช้ "/ sbin / blkid" ก่อนเพื่อค้นหาว่าระบบไฟล์ประเภทใดอยู่ในพาร์ติชัน

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

หมายเหตุ: ฉันรวมรหัสตัวอย่างสำหรับ "vfat" (อาจเป็นเรื่องธรรมดาสำหรับ usb sticks), "ntfs" และ "xfs" ระบบไฟล์ แน่นอนว่ามันเป็นการขยายที่ง่ายมากเพื่อรองรับระบบไฟล์ที่มากขึ้น

ขั้นตอนที่ 3) ตัวเลือก ... ในการ "นำออก" == เลิกเมานท์ usb ของคุณ (หรือพาร์ติชันบนแท่ง usb ของคุณ) สร้างสคริปต์ภายใต้ / sbin / usbeject:

#!/bin/bash
killall -s SIGUSR1 /usr/sbin/automount

ด้วยสคริปต์นี้คุณอาจใช้ "sudo usbeject" เพื่อ unmount พาร์ติชันอุปกรณ์ USB ที่เมาท์ทั้งหมด (โดยบอกให้ automount ยกเลิกการเมานท์)

แน่นอนคุณสามารถตรวจสอบให้แน่ใจว่าพาร์ทิชันไม่ได้ใช้ทุกที่ automounter จะยกเลิกการต่อเชื่อมพาร์ติชั่นหลังจากหมดเวลา 60 วินาที ...

เคล็ดลับที่แท้จริงที่นี่คือการใช้ symlink จาก "/ media / usb" ถึง "/ media / autousb":

  • ลิงก์ "/ media / usb" จะถูกสร้างโดย udev ทำให้ผู้ใช้มีภาพรวมอย่างง่าย ๆ ซึ่งมีพาร์ทิชันอุปกรณ์เก็บข้อมูล usb
  • AutoFS จะทำการติดตั้งพาร์ติชั่นอัตโนมัติตามต้องการถ้าคุณใช้มันผ่าน / media / usb
  • ด้วยไฟล์ "auto.usb" สคริปต์คุณอาจสนับสนุนระบบไฟล์ทุกประเภทและนอกจากนี้คุณยังสามารถรองรับรูปแบบการตั้งชื่อประเภทใดก็ได้
  • วิธีนี้รองรับ USB sticks ที่มีหลายพาร์ติชันแม้ว่าพาร์ทิชันเหล่านี้จะใช้ระบบไฟล์ประเภทต่างกัน

2

ตกลงมันใช้เวลานานมาก แต่ฉันจะตอบคำถามของฉันด้วยตัวเลือกที่ดีที่สุดที่ฉันพบในตอนนี้ เพื่อสรุป: สร้างudevกฎที่เกี่ยวข้องกับบางสคริปต์ (ที่จะสร้างไดเรกทอรี / ลบและยกเลิก / ติดตั้งอุปกรณ์ที่ถอดออก) และติดอยู่กับudevประเภทของเหตุการณ์อุปกรณ์partition=

1 - การสร้างสคริปต์เพิ่ม / ลบ

บันทึกต่อไปนี้สคริปต์storage-automount.shไป/lib/udev/และทำให้มันปฏิบัติการ ( sudo chmod a+x /lib/udev/storage-automount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# if a plugdev group exist, retrieve it's gid set & it as owner of mountpoint
plugdev_gid="$(grep plugdev /etc/group|cut -f3 -d:)"
if [ -z $plugdev_gid ]; then
    gid=''
else
    chown root:plugdev $mount_point
    gid=",gid=$plugdev_gid"
fi

# create the mountpoint directory in /media/ (if not empty)
if [ -n $mount_point ]; then
    mkdir -p /media/$mount_point
    # other options (breaks POSIX): noatime,nodiratime,nosuid,nodev
    mount -t $ID_FS_TYPE \
      -o rw,flush,user,uid=0$gid,umask=002,dmask=002,fmask=002 \
      $DEVNAME /media/$mount_point
fi

บันทึกต่อไปนี้สคริปต์storage-autounmount.shไป/lib/udev/และทำให้มันปฏิบัติการ ( sudo chmod a+x /lib/udev/storage-autounmount.sh):

#!/bin/sh

# set the mountpoint name according to partition or device name
mount_point=$ID_FS_LABEL
if [ -z $mount_point ]; then
    mount_point=${DEVNAME##*/}
fi

# remove the mountpoint directory from /media/ (if not empty)
if [ -n $mount_point ]; then
    umount -l /media/$mount_point
    rm -R /media/$mount_point
fi

2 - การสร้างudevกฎเพื่อแนบสคริปต์เหล่านั้นกับเหตุการณ์

และสุดท้ายเพิ่มudevกฎเข้า/etc/udev/rules.d/ตัวอย่างเช่น85-storage-automount.rules:

ENV{DEVTYPE}=="partition", RUN+="/lib/udev/storage-automount.sh", ENV{REMOVE_CMD}="/lib/udev/storage-autounmount.sh"

และทำให้มีสิทธิ์เช่นเดียวกับกฎอื่น ๆ ใน dir / โฟลเดอร์

ตอนนี้เมื่อคุณเสียบอุปกรณ์เก็บข้อมูลในไดเรกทอรีจะถูกสร้างขึ้น/media/ตามชื่อพาร์ทิชัน (ฉันจำไม่ได้ แต่ฉันคิดว่ามันทำงานกับพาร์ทิชัน NTFS เช่นกัน) และพาร์ทิชันของคุณจะถูกติดตั้งเข้าไป เป็น R / W สำหรับผู้ใช้หากคุณมีplugdevกลุ่มในระบบของคุณ นอกจากนี้อุปกรณ์ยังติดตั้งในโหมดซิงโครนัสเพื่อจำกัดความเสี่ยงของการสูญหายของข้อมูลในกรณีที่ปลั๊กร้อน

เมื่ออุปกรณ์ถูกลบมันจะถูก unmount และไดเรกทอรีจะถูกลบออก /media

นอกจากนี้เครื่องมือในการตรวจสอบudevเหตุการณ์คือudevadm monitorมีตัวเลือกเช่น--envหรือ--property:

$ udevadm monitor --env

นี้มีการทดสอบและปรับการทำงานได้ทั้งบนเดเบียนและซุ้มประตู udevแต่อาจทำงานในการกระจายทุกที่พึ่งพา


ฉันคิดว่า + r ควรถูกแทนที่ด้วย + x ใน "ตั้งเป็นปฏิบัติการ (sudo chmod + r /lib/udev/storage-autounmount.sh)"
Jeremy

ฉันมีการติดตั้ง jessie ใหม่ซึ่งฉันทำตามคำแนะนำของคุณอย่างใกล้ชิด แต่ไม่สามารถทำให้ automount เกิดขึ้นได้จาก tty1 แม้หลังจากรีสตาร์ท (ซึ่งไม่ได้อยู่ในคำแนะนำของคุณ แต่ฉันยังไม่รีสตาร์ทอัตโนมัติ automount) ตรวจพบการแทรกไดรฟ์ USB (ฉันได้รับข้อความคอนโซล) แต่ไม่มีสิ่งใดปรากฏใน / media / (ยกเว้น cdrom) ฉันสามารถติดตั้งไดรฟ์ USB ได้ด้วยตนเองดังนั้นฉันจึงรู้ว่าใช้งานได้เช่นกัน [ดำเนินการต่อในความคิดเห็นต่อไปนี้]
TomRoche

[ดำเนินการต่อจากความคิดเห็นก่อนหน้านี้] ฉันมี package = udev ติดตั้งแล้วมี dirs = {/ etc / udev / rules.d /, / lib / udev /} มีการเติมข้อมูลไว้ล่วงหน้าและมี executable = udevadm ใน $ PATH ฉันต้องการที่จะรู้ (1) ในรุ่นเดเบียนที่คุณทำงานนี้ (ฉันถือว่าเสียงดัง) (2) คุณติดตั้งแพ็คเกจ Debian อะไรอีกudev?
TomRoche

@ TomRoche เป็นเสียงฮืด ๆ ในตอนนั้นและฉันไม่มีแพ็คเกจพิเศษติดตั้งฉันพยายามทำการติดตั้งแบบเรียบง่ายและพยายามหลีกเลี่ยงการใช้แพ็คเกจที่ไม่ได้ติดตั้งไว้ให้น้อยที่สุด ฉันไม่จำเป็นต้องเริ่มต้นใหม่เพราะเหตุนี้จึงไม่อยู่ในคำแนะนำของฉัน มันค่อนข้างนานแล้วที่ฉันไม่ได้ดำดิ่งลงไป ... ฉันอาจลองอีกครั้งในไม่ช้า
cedbeu

1

ฉันคิดว่ามันค่อนข้างช้า แต่ฉันจะโพสต์สิ่งนี้หากใครต้องการ: (เช่นคำตอบ StackExchange แรกของฉัน)

หลังจากตรวจสอบวิธีแก้ปัญหาในหลาย ๆ ที่ฉันพบวิธีแก้ปัญหาง่ายๆใน Arch Wiki:

เชื่อมโยงไปยังประตูชัยวิกิพีเดีย

เราสามารถเพิ่มกฎ udisks2 เพื่อเปลี่ยนไดเรกทอรีเมานต์เริ่มต้น/run/media/$USER/เป็น/media/<Label>เป็น

เพิ่มกฎต่อไปนี้/etc/udev/rules.d/ด้วยชื่อเช่น99-udisks2.rules:

ENV{ID_FS_USAGE}=="filesystem|other|crypto", ENV{UDISKS_FILESYSTEM_SHARED}="1"

จากนั้นเราสามารถติดตั้งเครื่องมือง่ายๆเช่นUdiskieสำหรับ automount


สวัสดีและยินดีต้อนรับที่นี่ ขอบคุณสำหรับตัวเลือกของคุณ สำหรับ Udiskie ฉันต้องการตัวเลือกบรรทัดคำสั่งแบบเต็ม (ไม่มี Xorg หรือส่วนต่อประสานกราฟิกใด ๆ ที่มีอยู่ในระบบ) และ ... คำถามคืออายุ 6.5 ปี (โอ้ววววววววววฉันเดาว่าสิ่งต่าง ๆ ได้เปลี่ยนไปแล้ว :) แต่อย่างไรก็ตาม +1 สำหรับคำตอบแรกของคุณขอบคุณ
cedbeu

1

โปรดดูหน้า ArchWiki udev คุณไม่ควรดำเนินการmountจากกฎ Udev หรือจากสคริปต์ที่ดำเนินการโดยกฎ Udev

อย่างไรก็ตามดังที่แสดงในโครงการudev-media-automountมันค่อนข้างง่ายที่จะทำโดยเรียกใช้หน่วย Systemd จากกฎ Udev ซึ่งจะเรียกสคริปต์ที่ติดตั้ง แตกต่างจาก udisks2 และโซลูชั่นอื่น ๆ udev-media-automount นั้นมุ่งเน้นไปที่เคสแบบง่ายที่คุณต้องการติดตั้งบางสิ่งบางอย่างในฐานะrootผู้ใช้โดยไม่จำเป็นต้องรอสภาพแวดล้อมเดสก์ท็อปหรือ "เซสชันผู้ใช้" ดูเหมือนจะเป็นสิ่งที่ OP ต้องการและฉันพบว่ามันใช้งานได้และเข้าใจง่าย


ดีมากขอบคุณ เป็นคำถามเก่าที่ฉันถาม (เกือบ 7 ปีที่แล้ว…ไม่ทำให้ฉันรู้สึกอ่อนเยาว์ ^^) แต่ถึงกระนั้นฉันจะดูข้อเสนอของคุณ ฉันเดาว่าสภาพแวดล้อมของ systemd นั้นโตขึ้นมากแล้ว ขอบคุณฉันจะตรวจสอบนี้!
cedbeu

0

ฉันพบวิธีในการทำเช่นนี้โดยแก้ไขไฟล์ / etc / fstab รายการง่าย ๆ ดูเหมือนว่า:

/dev/sdb1 /media/robot/hdd1 ntfs defaults 0 0

<file system> <mount point> <type> <options> <dump> <pass>


การเมาท์เข้า/etc/fstabจะติดตั้งโดยอัตโนมัติเมื่อบูตเท่านั้น
แกรม

@ Graeme ฉันมี sdcard ที่ฉันติดตั้งผ่าน / etc / fstab จากการทดสอบฉันลองยกเลิกการต่อเชื่อมและถอด sdcard ออกจากคอมพิวเตอร์ ฉันตรวจสอบว่าการเมานต์ไม่แสดงผ่าน 'df' อีกต่อไป เมื่อฉันใส่ sdcard ของฉันอีกครั้งการเมานก็ปรากฏขึ้นอีกครั้งแม้ว่าฉันจะไม่ได้ติดตั้งซ้ำ นี่คือบน Ubuntu 16.04
Gino

@Gino, Ubuntu ได้ทำการติดตั้งอัตโนมัติตามค่าเริ่มต้นในขณะนี้
แกรม

@ Graeme ดูเหมือนว่าตัวนับอัตโนมัติของ Ubuntu กำลังเลือกตัวยึดที่ถูกต้องจาก / etc / fstab หากมีอยู่ ดังนั้นอย่างน้อยบน Ubuntu 16.04, ภูเขาติดตั้งโดยอัตโนมัติในการบูตและหลังจากที่ตามมาอีกแทรกเข้ากับพอร์ต USB ถ้ามีใด ๆ ..
จีโน่

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