ค้นหาอุปกรณ์จัดเก็บข้อมูลทั้งหมดที่เชื่อมต่อกับเครื่อง Linux [ปิด]


109

ฉันมีความต้องการที่จะค้นหาอุปกรณ์จัดเก็บข้อมูลที่เขียนได้ทั้งหมดที่เชื่อมต่อกับเครื่องที่กำหนดไม่ว่าจะติดตั้งหรือไม่ก็ตาม

วิธีที่น่าเบื่อในการทำเช่นนี้คือลองทุกรายการ/devที่สอดคล้องกับอุปกรณ์ที่เขียนได้ ( hd* and sd*) ......

มีวิธีแก้ปัญหาที่ดีกว่านี้หรือฉันควรใช้วิธีนี้


ใช้libsysfsซึ่งเป็นวิธีที่แนะนำในการสืบค้นเคอร์เนลเกี่ยวกับอุปกรณ์ที่เชื่อมต่อทุกชนิด
David Schmitt

เนื่องจากคุณพูดถึงพวกเขาอาจถูกเมาท์ฉันเดาว่าคุณต้องการรายการพาร์ติชันไม่ใช่เฉพาะดิสก์?
Mark Baker

พาร์ติชั่นก็ดีเช่นกันใช่ :) .. ถ้าฉันรู้พาร์ติชั่นฉันจะรู้ด้วยว่ามีอุปกรณ์อะไรบ้าง
warren

2
เนื่องจากUnix & Linuxพร้อมให้บริการแล้วคำถามนี้ควรถูกย้ายไปที่นั่น
warren

3
@warren - โอ้ไม่ พวกเขายังควรปิด ในฐานะที่คุณเป็นเจ้าของโพสต์ต้องการให้ย้ายสิ่งนี้คุณควรตั้งค่าสถานะเพื่อให้ผู้ดูแลตรวจสอบ ความจริงที่ว่าคุณต้องการให้มันเคลื่อนย้ายจะมีน้ำหนัก
ChrisF

คำตอบ:


79

/proc/partitionsจะแสดงรายการอุปกรณ์บล็อกและพาร์ติชันทั้งหมดที่ระบบรู้จัก จากนั้นคุณสามารถลองใช้file -s <device>เพื่อกำหนดชนิดของระบบไฟล์ที่มีอยู่บนพาร์ติชันถ้ามี


4
ตัวอย่างเช่นไดรฟ์ซีดี / ดีวีดีนี้ (ฉันรู้ว่ามักจะเขียนไม่ได้)
pixelbeat

มีข้อ จำกัด เกี่ยวกับสิ่งที่คุณสามารถทำได้จากเปลือกหอย คำแนะนำอื่น ๆ ส่วนใหญ่ที่ได้รับการจัดอันดับสูงกว่าไม่สามารถใช้งานได้จากเชลล์จะไม่ทำงานเว้นแต่ว่า dbus กำลังทำงานอยู่หรือจะแสดงรายการอุปกรณ์ที่ไม่ได้แสดง / กำหนดค่าไว้ นี่เร็วกว่าการตรวจสอบอุปกรณ์ / dev ทั้งหมด
Steve Baker

5
lsblk อันนี้ดีกว่า
emj365

1
/ proc / partitions ให้อักษรระบุไดรฟ์ใน Cygwin ด้วย
katriel

72

คุณสามารถทำสิ่งfdisk -lที่ดูเหมือนจะทำงานได้ดีแม้ในการตั้งค่าแปลก ๆ เช่นอุปกรณ์ EC2 xvda

นี่คือดัมพ์สำหรับอินสแตนซ์ m1.large:

root@ip-10-126-247-82:~# fdisk -l

Disk /dev/xvda1: 10.7 GB, 10737418240 bytes
255 heads, 63 sectors/track, 1305 cylinders, total 20971520 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda1 doesn't contain a valid partition table

Disk /dev/xvda2: 365.0 GB, 365041287168 bytes
255 heads, 63 sectors/track, 44380 cylinders, total 712971264 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda2 doesn't contain a valid partition table

Disk /dev/xvda3: 939 MB, 939524096 bytes
255 heads, 63 sectors/track, 114 cylinders, total 1835008 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/xvda3 doesn't contain a valid partition table

ในขณะที่mountพูดว่า:

root@ip-10-126-247-82:~# mount
/dev/xvda1 on / type ext4 (rw)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
fusectl on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
/dev/xvda2 on /mnt type ext3 (rw)

และ/proc/partitionsพูดว่า:

root@ip-10-126-247-82:~# cat /proc/partitions
major minor  #blocks  name

 202        1   10485760 xvda1
 202        2  356485632 xvda2
 202        3     917504 xvda3

หมายเหตุด้านข้าง

วิธีการfdisk -lทำงานเป็นสิ่งที่ฉันอยากจะรู้ด้วยตัวเอง


9
ไม่แน่ใจว่าคุณเคยหาวิธีการfdisk -lทำงานอย่างไร แต่ฉันคิดว่าคุณอาจอยากรู้: มันอ่าน/proc/partitionsแล้ววนซ้ำ/sys/dev/block/*ซึ่งมีชุดของลิงก์สัญลักษณ์ไปยังตัวแทนที่แท้จริงของอุปกรณ์ใน sysfs คุณสามารถค้นหาข้อมูลนี้ได้โดยทำงานfdiskภายใต้strace:)

1
เยี่ยมมาก! ขอบคุณ. (OT: แย่มากที่เห็นคำถามนี้ถูกล็อกควรมีปุ่ม "โหวตเพื่อคืนล็อก")
Maxim Veksler

1
มีไว้สำหรับผู้ใช้งาน 3k ขึ้นไป (ปุ่ม "เปิดใหม่")

จริงๆเหรอ? จากนั้นฉันต้องไปที่ 3k ให้เร็วที่สุด
Maxim Veksler

ใช่ดูหน้าสิทธิพิเศษสำหรับรายการทั้งหมดที่คุณสามารถทำได้ด้วยตัวแทนเพิ่มเติม

35

คุณยังสามารถลองlsblk ... อยู่ใน util-linux ... แต่ฉันก็มีคำถามเช่นกัน

fdisk -l /dev/sdl

ไม่มีผลลัพธ์

grep sdl /proc/partitions      
   8      176   15632384 sdl
   8      177   15628288 sdl1

lsblk | grep sdl
sdl       8:176  1  14.9G  0 disk  
`-sdl1    8:177  1  14.9G  0 part  

fdisk ดี แต่ไม่ดีขนาดนั้น ... ดูเหมือนว่ามันไม่สามารถ "เห็น" ทุกอย่างได้

ในตัวอย่างเฉพาะของฉันฉันมีแท่งไม้ที่มีตัวอ่านการ์ดอยู่ด้วยและฉันเห็นเฉพาะแท่งที่ใช้ fdisk:

fdisk -l /dev/sdk

Disk /dev/sdk: 15.9 GB, 15931539456 bytes
255 heads, 63 sectors/track, 1936 cylinders, total 31116288 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xbe24be24

   Device Boot      Start         End      Blocks   Id  System
/dev/sdk1   *        8192    31116287    15554048    c  W95 FAT32 (LBA)

แต่ไม่ใช่การ์ด (การ์ดเป็น / dev / sdl)

เช่นกันไฟล์ -s ไม่มีประสิทธิภาพ ...

file -s /dev/sdl1
/dev/sdl1: sticky x86 boot sector, code offset 0x52, OEM-ID "NTFS    ", sectors/cluster 8, reserved sectors 0, Media descriptor 0xf8, heads 255, hidden sectors 8192, dos < 4.0 BootSector (0x0)

ดี ... แต่

fdisk -l /dev/sdb
/dev/sdb1            2048   156301487    78149720   fd  Linux raid autodetect
/dev/sdb2       156301488   160086527     1892520   82  Linux swap / Solaris

file -s /dev/sdb1
/dev/sdb1: sticky \0

หากต้องการดูข้อมูลเกี่ยวกับดิสก์ที่ fdisk ไม่สามารถเข้าถึงได้คุณสามารถใช้ parted:

parted /dev/sdl print

Model: Mass Storage Device (scsi)
Disk /dev/sdl: 16.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  16.0GB  16.0GB  primary  ntfs




arted /dev/sdb print 
Model: ATA Maxtor 6Y080P0 (scsi)
Disk /dev/sdb: 82.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system     Flags
 1      1049kB  80.0GB  80.0GB  primary                  raid
 2      80.0GB  82.0GB  1938MB  primary  linux-swap(v1)

9

ls /sys/block


ไม่แสดงรายการพาร์ติชัน ฉันไม่แน่ใจว่านั่นคือสิ่งที่คำถามเดิมต้องการหรือไม่
Mark Baker

1
ฉันไม่เคยรู้เกี่ยวกับ / sys / block - แม้ว่ามันจะแสดงรายการอุปกรณ์ที่ไม่สามารถเขียนได้เช่นไดรฟ์ดีวีดีก็ตาม
warren

1
อันที่จริงมันไม่ได้แสดงรายการพาร์ติชัน - คุณสามารถตรวจสอบไดเร็กทอรีย่อยได้โดยมองหาไดเร็กทอรีย่อยทั้งหมดที่มีไฟล์ขั้นต่ำที่ชื่อว่า "dev", "stat" และ "uevent" และ subdirs ชื่อ "holders" ดีวีดียังคงเป็นอุปกรณ์คลาสสตอเรจ :)
Mihai Limbășan

3
moocha ทำไมคุณไม่ขยายคำตอบของคุณสักหน่อย?
SpoonMeiser

2
@warren - สันนิษฐานว่า / dev / dvd จะเป็นนามแฝงสำหรับอุปกรณ์ / dev / sd * หรือ / dev / hd * ดังนั้นคุณจะมีปัญหานี้อยู่ดี
SpoonMeiser

7

การใช้ HAL (เคอร์เนล 2.6.17 ขึ้นไป):


#! /bin/bash
hal-find-by-property --key volume.fsusage --string filesystem |
while read udi ; do
    # ignore optical discs
    if [[ "$(hal-get-property --udi $udi --key volume.is_disc)" == "false" ]]; then
        dev=$(hal-get-property --udi $udi --key block.device)   
        fs=$(hal-get-property --udi $udi --key volume.fstype) 
        echo $dev": "$fs
    fi 
done

4

โดยปกติระบบ linux สมัยใหม่จะมีเฉพาะรายการใน / dev สำหรับอุปกรณ์ที่มีอยู่ดังนั้นการใช้ hda * และ sda * ตามที่คุณแนะนำจะทำงานได้ดีพอสมควร

มิฉะนั้นอาจมีบางอย่างใน / proc ที่คุณสามารถใช้ได้ จากการดูอย่างรวดเร็วในนั้นฉันได้พูดว่า / proc / partitions ดูเหมือนว่ามันสามารถทำสิ่งที่คุณต้องการได้


2

libsysfs อาจมีประโยชน์ แต่ไม่ใช่โดยตรงจากเชลล์สคริปต์ มีโปรแกรมที่มาพร้อมกับเรียกว่า systool ซึ่งจะทำในสิ่งที่คุณต้องการแม้ว่าอาจจะง่ายกว่าที่จะมองเข้าไปใน / sys โดยตรงแทนที่จะใช้โปรแกรมอื่นเพื่อทำเพื่อคุณ

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