ฉันจะทราบได้อย่างไรว่า / dev คือแฟลชไดรฟ์ USB


160

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

(ฉันใช้ ArchLinux ถ้าช่วยได้ ... /dev/sdaเป็นฮาร์ดไดรฟ์ตัวแรก/dev/sr0คือไดรฟ์ดีวีดี ฯลฯ )

แก้ไข: ไดรฟ์ USB เชื่อมต่อกับฮับ USB ฉันมองผ่านdmesgมันบอกว่าฮับเชื่อมต่ออยู่และสแกนหาอุปกรณ์ 3 ชิ้นที่เชื่อมต่อ ยังไม่สามารถดูได้ว่าไดรฟ์ USB ของฉันอยู่ที่ไหน


1
ไม่เห็นใช่ไหม อาจจะรอสักครู่ หรือลองพอร์ต USB อื่น ดูว่ามีความแตกต่างใน 'lsusb' อย่างไรบ้าง
Nick Devereaux

อาจต้องการที่จะเรียบเรียงคำถามใหม่อีกครั้ง - ไม่ใช่อุปกรณ์ usb ทั้งหมดที่เป็นดิสก์หลังจากทั้งหมด
Arafangion

3
dfคำสั่งแสดงให้คุณเห็นว่ามันอยู่ที่ไหนติด
Will Sheppard

คำตอบ:


83

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


2
dmesgใช้งานได้ดี แต่ฉันมีกรณีที่dmesgไม่แสดง/devโหนด: [421963.864281] usb 3-6: new high-speed USB device number 32 using xhci_hcdสิ่งนี้หมายความว่าอย่างไร ฉันจะติดตั้งอุปกรณ์นี้ได้อย่างไร? อุปกรณ์แสดงขึ้นในlsusb...
modulitos

1
ที่จริงฉันคิดออก มีการอัพเดตเคอร์เนลตั้งแต่การรีบูตครั้งล่าสุดของฉันที่ทำให้เกิดปัญหานี้ หลังจากรีบู๊ตแล้ว usb ของฉันก็ใช้ได้ หวังว่านี่จะช่วยให้ใครบางคน!
modulitos

54

ตราบใดที่คุณกำลังทำงานudevคุณสามารถทำเช่นนี้ได้อย่างง่ายดายโดยการอ้างอิง / dev / ดิสก์ / โดย-ID / USB- ManufacturerName _ SerialNumber สิ่งเหล่านี้จะปรากฏเป็นลิงค์สัญลักษณ์ซึ่งคุณสามารถอ้างอิงโดยตรงภายใน fstab ของคุณหรือที่คุณสามารถอ้างอิงโดยใช้readlink -eเพื่อกำหนดอุปกรณ์บล็อกที่เกี่ยวข้อง

นี่คือตัวอย่างโลกแห่งความจริง ในเครื่องของฉันฉันมีฮาร์ดไดรฟ์ USB 3 ตัวเชื่อมต่ออยู่ แต่ละรายการจะแสดงใน / dev / disk / by-id ด้วยหมายเลขซีเรียลที่ไม่ซ้ำกัน (แม้ว่าพวกเขาแบ่งปันสตริงผู้ผลิตทั่วไป) ผมได้สร้างการเชื่อมโยงสัญลักษณ์แต่ละเหล่านี้สามรายการที่ไม่ซ้ำกันและตอนนี้ได้อย่างรวดเร็วสามารถตรวจสอบว่าไดรฟ์เป็นที่ (และอุปกรณ์ที่มีความเกี่ยวข้องกับแต่ละไดรฟ์) โดยการทำงาน-e readlink linkname ตัวอย่างเช่นการรันreadlink -e / root / disk2บนเครื่องของฉันจะแสดง " / dev / sde " ในขณะที่readlink -e / root / disk3จะไม่สร้างเอาต์พุตใด ๆ


15
สั้นและง่าย:for devlink in /dev/disk/by-id/usb*; do readlink -f ${devlink}; done
เฟลิเป้อัลคาซิบาร์

54

ทั้งหมดนี้เป็นคำแนะนำที่ดี แต่วิธีที่เร็วที่สุดและน้อยที่สุดคือการพิมพ์สิ่งต่อไปนี้ในเทอร์มินัล:

mount

ซึ่งจะให้รายการอุปกรณ์ที่ติดตั้งทั้งหมด (ซึ่งถือว่าเป็นไดรฟ์ USB ที่ติดตั้งซึ่งมักจะเป็นกรณีที่มี distros Linux ที่ทันสมัย)


5
ไม่มันไม่ได้ติดอุปกรณ์ของคุณอย่างน่าอัศจรรย์ คุณต้องระบุด้วยmount /dev/id /mount/pointดังนั้นจึงใช้งานไม่ได้
polym

9
คำตอบของฉันตอบคำถามของผู้ใช้ 'มีวิธีดู dmesg หรือ / proc หรือที่อื่นเพื่อค้นหาว่าโหนดอุปกรณ์ใดเป็นไดรฟ์ USB' และไม่ได้มีไว้เพื่อให้คำแนะนำเกี่ยวกับการใช้งานจริงของการติดตั้งไดรฟ์ภายใต้ Linux .
AnotherLongUsername

คำตอบนี้แก้ไขคำถามที่เหมือนกันเกือบสำหรับฉัน
Matthew Brown หรือที่รู้จักว่า Lord Matt

1
ฉันคิดว่าพฤติกรรม automount ขึ้นอยู่กับประเภท distro เป็นอย่างมาก
jiggunjer

1
dfฉันก็คิดเช่นกัน
Alexey

24

ลองใช้คำสั่งudevinfo -q all -n /dev/sdaซึ่ง/dev/sdaพา ธ ไปยังดิสก์ของคุณอยู่ที่ไหน สิ่งนี้จะให้ข้อมูลเกี่ยวกับดิสก์ที่คุณกำลังดูมีรายการที่บอกคุณเกี่ยวกับรถบัสที่เชื่อมต่ออยู่

แน่นอนนี้ช่วยให้คุณไม่ต้อง grep ผ่าน dmesg และ / หรือบันทึก

ปรับปรุง

udevadm info --query=all -n /dev/sda 

จากอย่างน้อย ก.ค. 2010 [ 1 ] udevinfoถูกแทนที่ใน Debian (และที่ได้รับ) โดยudevadm infoชั่วคราวเล็กน้อยซึ่งมี symlink เร็ว ๆ นี้เลิกใช้และลบออก (คุณยังสามารถพบพวกเขาในเครื่องเก่าที่ไม่ได้ปรับปรุง) จาก [ 1 ] เราสามารถอ่านได้เสมอ:

ใน udev 117 udevadmได้เปิดตัวและudevinfoและโปรแกรมอื่น ๆ กลายเป็น symlink ที่เข้ากันได้ symlinks ถูกคัดค้านในudev 128และลบออกสำหรับการที่ดีในudev 147


8
ในเดมีการเปลี่ยนชื่อudevinfo udevadm
Steve Pomeroy

8
บน Ubuntu คำสั่งน่าจะเป็น "udevadm info --query = all -n / dev / sda"
machineghost

ฉันคิดว่าพวกเขาเปลี่ยนชื่อคำสั่งในบางจุด - เมื่อฉันเขียนคำตอบ (อายุที่ผ่านมา) คำสั่งทำงานบนระบบอูบุนตูที่ฉันโพสต์ไว้จาก;)
Eltariel

คำสั่งยังคงทำงานใน Ubuntu,udevadm info --query=all -n /dev/ttyUSB1
Siddharth

1
udevadm info --query=all -n /dev/ttyUSBใน Fedora ด้วย
slm

22

วิธีที่ง่ายที่สุดในการดูว่าเกิดอะไรขึ้นเพียงแค่พิมพ์ (ตามรูท):

blkid -c /dev/null

สิ่งนี้จะให้ภาพรวมที่สมบูรณ์เกี่ยวกับอุปกรณ์บล็อกทั้งหมดแม้ว่าจะไม่ได้ติดตั้งก็ตาม


ไม่ใช่ distro ทั้งหมดที่มีสิ่งนี้ คุณใช้อันไหน
ใหม่ Alexandria

สิ่งนี้ไม่มีผลกับ Raspbian distro ของฉัน
IgorGanapolsky

ไม่พบคำสั่ง: blkid
IgorGanapolsky

ไม่มีเอาต์พุตจากคำสั่งนี้บน Ubuntu 14.04 64-bit
gbmhunter

11

/dev/disk/by-* เป็นวิธีที่ง่ายที่สุดในกรณีนี้ถ้าด้วยเหตุผลบางอย่างที่คุณต้องการทำให้ชีวิตน่าสนใจยิ่งขึ้นคุณสามารถใช้ HAL

ในการแสดงรายการอุปกรณ์ทั้งหมดที่คุณใช้:

hal-device

ในการรับคุณสมบัติเฉพาะที่คุณใช้ (สิ่งนี้จะส่งคืน/dev/sd*บนอุปกรณ์เก็บข้อมูล USB):

hal-get-property --udi $UDI --key block.device

นอกจากนี้ยังมี:

hal-find-by-capability
hal-find-by-property

หากคุณต้องการทำให้มันซับซ้อนยิ่งขึ้นคุณสามารถเขียนตัวนับอัตโนมัติของ HAL ที่ค่อนข้างง่ายซึ่งเป็นประโยชน์ถ้าคุณต้องการทำให้สิ่งต่าง ๆ เป็นไปโดยอัตโนมัติ

และเพื่อความสมบูรณ์นอกจากนี้ยังมี:

lsusb -v
lshw

ซึ่งให้ข้อมูลทั่วไปเกี่ยวกับ USB และฮาร์ดแวร์ของคุณโดยทั่วไป


2
/ dev / disk / by-id / * usb * มีประโยชน์มาก
Rob

/ dev / disk / by-label ftw ขอบคุณ :)
Triptych

10
sudo fdisk -l

และเพียงแค่วิเคราะห์ผลลัพธ์


1
fdisk man page "หากไม่ได้รับอุปกรณ์จะใช้อุปกรณ์ที่กล่าวถึงใน / proc / พาร์ติชั่น (ถ้ามี)" การรัน fdisk อาจไม่ใช่ตัวเลือก ... ขึ้นอยู่กับระบบ Debian ที่ฉันรู้ว่ามันไม่ได้ติดตั้งไว้ฉันเดาว่าระบบ GPT บางระบบอาจไม่ติดตั้งซอฟต์แวร์ที่ไม่จำเป็น ยังคงตรวจสอบ / proc / พาร์ทิชันควรเป็นตัวเลือก
TOOGAM

นี่เป็นตัวเลือกเดียวที่ทำงานได้ดีสำหรับฉัน ฉันขอโทษถ้ามันไม่ได้ผลสำหรับคุณ!
เฟลิเป้

8

ใช้

ls -l /dev/disk/by-id/usb*

ภายใต้กฎ udev เริ่มต้นที่จะแสดงอุปกรณ์ usb ส่วนใหญ่และจะแสดง symlink ให้กับชื่ออุปกรณ์บล็อกของพวกเขาในระบบ

หากไม่ได้ผลให้ดูที่/dev/disk/by-id/โดยตรง


6

สำหรับอุปกรณ์ USB คุณสามารถทำได้

REMOVABLE_DRIVES=""
for _device in /sys/block/*/device; do
    if echo $(readlink -f "$_device")|egrep -q "usb"; then
        _disk=$(echo "$_device" | cut -f4 -d/)
        REMOVABLE_DRIVES="$REMOVABLE_DRIVES $_disk"
    fi
done
echo Removable drives found: "$REMOVABLE_DRIVES"

1
+1 สคริปต์ที่เรียบง่ายและรัดกุมในการทำงานโดยอัตโนมัติ
leesei

2

/dev/diskลองดูที่ต้นไม้ภายใต้การ มันแสดงรายการดิสก์และพาร์ติชันของพวกเขา (ระบบไฟล์) โดยแผนการต่าง ๆ


2

/ var / log / ข้อความถ้า dmesg ไม่มีข้อมูลอีกต่อไป



0

ขึ้นอยู่กับคำตอบที่ดีเยี่ยมจาก Stormlash และด้วยการพึ่งพา udev เพื่อเติมทรีอุปกรณ์ "/ dev / disk / by-id / usb" คุณสามารถกำหนดเพรดิเคต (Bash) ดังนี้:

is_usb_device() {
    local device_path=$1        # such as /dev/sdc
    for devlink in /dev/disk/by-id/usb*; do
        if [ "$(readlink -f "$devlink")" = "$device_path" ]; then
            return 0
        fi
    done
    return 1
}

แล้วใช้มัน:

if is_usb_device "/dev/sdg"; then
    echo "/dev/sdg is a usb device"
else
    echo "/dev/sdg is not a usb device"
fi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.