Tìm tất cả các thiết bị lưu trữ được gắn vào máy Linux [đã đóng]


109

Tôi cần tìm tất cả các thiết bị lưu trữ có thể ghi được gắn vào một máy nhất định, cho dù chúng có được gắn hay không .

Cách khó xử để làm điều này là thử mọi mục nhập /devtương ứng với thiết bị có thể ghi ( hd* and sd*) ......

Có giải pháp nào tốt hơn không, hay tôi nên gắn bó với giải pháp này?


Sử dụng libsysfs , cách được khuyến nghị để truy vấn hạt nhân về các loại thiết bị đính kèm.
David Schmitt

Vì bạn nói về chúng có thể được gắn kết, tôi đoán bạn muốn có một danh sách các phân vùng, không chỉ các đĩa?
Mark Baker

phân vùng cũng tốt, vâng :) .. nếu tôi biết các phân vùng, tôi cũng sẽ biết những thiết bị vật lý nào khả dụng
warren

2
Unix & Linux hiện đã có sẵn, câu hỏi này nên được chuyển sang đó
warren

3
@warren - ồ không. Chúng vẫn nên được đóng lại. Khi bạn là chủ sở hữu bài đăng muốn điều này được di chuyển, bạn nên gắn cờ nó để người kiểm duyệt chú ý. Thực tế là bạn muốn nó di chuyển sẽ mang một số trọng lượng.
ChrisF

Câu trả lời:


79

/proc/partitionssẽ liệt kê tất cả các thiết bị khối và phân vùng mà hệ thống nhận dạng được. Sau đó, bạn có thể thử sử dụng file -s <device>để xác định loại hệ thống tệp nào hiện có trên phân vùng, nếu có.


4
Ví dụ: tính năng này ẩn các ổ đĩa CD / DVD (tôi biết chúng thường không thể ghi)
pixelbeat

Có một loại giới hạn về những gì bạn có thể làm từ một cái vỏ. Hầu hết các đề xuất khác được đánh giá cao hơn đều không hoạt động từ shell, sẽ không hoạt động trừ khi dbus đang chạy hoặc sẽ liệt kê các thiết bị không thực sự hiện diện / được định cấu hình. Điều này chỉ nhanh hơn việc kiểm tra tất cả các thiết bị / dev.
Steve Baker

5
lsblk này là tốt hơn
emj365

1
/ proc / phân vùng cũng cung cấp cho bạn ký tự ổ đĩa trong Cygwin.
katriel

72

Bạn luôn có thể làm điều fdisk -lnày dường như hoạt động khá tốt, ngay cả trên các thiết lập lạ như thiết bị xvda EC2.

Đây là một kết xuất cho một phiên bản 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

Trong khi mountnói:

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/partitionsnói:

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

Ghi chú bên lề

Làm thế nào fdisk -lhoạt động là một cái gì đó tôi muốn biết bản thân mình.


9
Không chắc bạn đã bao giờ tìm hiểu cách thức fdisk -lhoạt động chưa, nhưng tôi nghĩ bạn có thể muốn biết: nó đọc /proc/partitionsvà sau đó lặp lại qua /sys/dev/block/*đó chứa một tập hợp các liên kết tượng trưng đến đại diện thực của thiết bị trong sysfs. Bạn có thể tìm thấy thông tin này ra bằng cách chạy fdiskdưới strace:)

1
Tuyệt quá! Cảm ơn. (OT: Rất tiếc khi thấy câu hỏi này bị khóa. Nên có nút "bỏ phiếu để hoàn nguyên khóa").
Maxim Veksler

1
dành cho người dùng từ 3k đại diện trở lên (nút "mở lại").

ồ vậy hả? Sau đó, tôi phải đạt được 3k càng nhanh càng tốt.
Maxim Veksler

vâng, hãy xem trang đặc quyền để biết danh sách đầy đủ những điều bạn có thể làm với nhiều đại diện hơn.

35

bạn cũng có thể thử lsblk ... là trong dùng-linux ... nhưng tôi cũng có một câu hỏi

fdisk -l /dev/sdl

không kết quả

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 tốt nhưng không tốt như vậy ... có vẻ như nó không thể "nhìn thấy" mọi thứ

trong ví dụ cụ thể của tôi, tôi có một thanh cũng có tích hợp đầu đọc thẻ và tôi chỉ có thể nhìn thấy thanh đó bằng cách sử dụng 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)

nhưng không phải thẻ (thẻ là / dev / sdl)

ngoài ra, tệp -s không hiệu quả ...

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)

thật tuyệt ... NHƯNG

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

để xem thông tin về đĩa mà fdisk không thể gia nhập, bạn có thể sử dụng 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


không liệt kê các phân vùng. Tôi không chắc liệu đó có phải là những gì câu hỏi ban đầu muốn hay không.
Mark Baker

1
Tôi chưa bao giờ biết về / sys / block - mặc dù nó cũng liệt kê các thiết bị mà không ghi được, giống như ổ đĩa DVD
warren

1
Thật vậy, nó không liệt kê các phân vùng - mặc dù vậy, bạn có thể kiểm tra các thư mục con, tìm kiếm tất cả các mã con chứa các tệp tối thiểu có tên là "dev", "stat" và "uevent" và các mã con có tên là "holders". DVD vẫn là thiết bị lưu trữ thuộc lớp :)
Mihai Limbășan. 14/10/08

3
moocha, tại sao bạn không mở rộng câu trả lời của bạn một chút?
SpoonMeiser

2
@warren - có lẽ / dev / dvd sẽ chỉ là bí danh cho thiết bị / dev / sd * hoặc / dev / hd *, vì vậy dù sao thì bạn cũng đã gặp sự cố này.
SpoonMeiser

7

Sử dụng HAL (kernel 2.6.17 trở lên):


#! /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

Các hệ thống linux hiện đại thông thường sẽ chỉ có các mục nhập / dev cho các thiết bị tồn tại, vì vậy việc chuyển qua hda * và sda * như bạn đề xuất sẽ hoạt động khá tốt.

Nếu không, có thể có thứ gì đó trong / proc mà bạn có thể sử dụng. Từ một cái nhìn nhanh trong đó, tôi đã nói / proc / phân vùng có vẻ như nó có thể làm những gì bạn cần.


2

libsysfs trông có vẻ hữu ích, nhưng không phải trực tiếp từ tập lệnh shell. Có một chương trình đi kèm với nó được gọi là systool sẽ làm những gì bạn muốn, mặc dù có thể dễ dàng hơn nếu chỉ trực tiếp xem trong / sys hơn là sử dụng một chương trình khác để làm điều đó cho bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.