查找连接到 Linux 机器的所有存储设备

我有一个需要找到所有的可写存储设备连接到一个给定的机器,不管他们是安装。

愚蠢的方法是对 试试看进行 /dev中对应于可写设备(hd* and sd*)的每个条目... ..。

有没有更好的解决办法,还是我应该坚持这个?

469813 次浏览

现代 Linux 系统通常只在/dev 中为已存在的设备提供条目,因此按照您的建议使用 hda * 和 sda * 会工作得相当不错。

否则,可能在/proc 中有一些您可以使用的东西。在这里快速查看一下,我会说/proc/分区看起来可以满足您的需要。

ls /sys/block

Libsysfs 看起来确实很有用,但不是直接从 shell 脚本看出来的。有一个程序叫做 syool,它可以做你想做的事情,尽管直接查看/sys 可能比使用其他程序更容易。

/proc/partitions将列出系统识别的所有块设备和分区。然后,您可以尝试使用 file -s <device>来确定分区上存在什么类型的文件系统(如果有的话)。

使用 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

You can always do fdisk -l which seems to work pretty well, even on strange setups such as EC2 xvda devices.

下面是一个 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是如何工作的,我自己也很想知道。

您也可以尝试 伊斯贝克... 是在 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 is good but not that good ... seems like it cannot "see" everything

在我的特殊例子中,我有一个棍子,其中也有一个读卡器,我可以看到只有棍子使用 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)