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


109

我需要查找连接到给定计算机的所有可写存储设备,无论它们是否已安装。

最糟糕的方法是尝试/dev与可写设备(hd* and sd*)相对应的每个条目。

有更好的解决方案,还是我应该坚持呢?


使用libsysfs,这是查询内核有关各种连接设备的推荐方法。
David Schmitt,

由于您谈论的是它们可能正在挂载,所以我想您需要一个分区列表,而不仅仅是磁盘?
Mark Ba​​ker

分区也很好,是的:) ..如果我知道分区,我也将知道可用的物理设备
Warren

2
由于现在可以使用Unix&Linux,因此应该在此迁移问题
Warren

3
@warren-哦,不。他们仍然应该关闭。当您作为帖子所有者希望移动时,您应该对其进行标记以引起管理员注意。您希望它移动的事实会带来一些负担。
克里斯·

Answers:


79

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


4
例如,这会省略CD / DVD驱动器(我知道它们通常不可写)
pixelbeat

从shell可以执行的操作有一定的限制。其他大多数建议较高的建议要么无法通过外壳运行,要么无法运行,除非dbus正在运行,否则将列出实际上不存在/未配置的设备。这仅比检查所有/ dev设备快。
史蒂夫·贝克

5
lsblk这个人是更好
emj365

1
/ proc / partitions也为您提供Cygwin中的驱动器号。
卡特里尔(Katriel),2015年

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 2013年

1
适用于3k和更高版本的用户(“重新打开”按钮)。

真的吗?然后,我必须尽快达到3k。
Maxim Veksler 2013年

是的,请参阅特权页面,以获取更多代表可以完成的操作的完整列表。

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 Ba​​ker

1
我从不知道/ sys / block-尽管它还列出了不可写的设备,例如DVD驱动器
-warren,

1
实际上,它没有列出分区-但是您可以检查子目录,查找所有子目录,这些子目录保存在名为“ dev”,“ stat”和“ uevent”的最小文件和名为“ holders”的子目录中。DVD仍然是存储级设备:)
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看起来确实很有用,但不是直接从shell脚本中获取。它附带有一个名为systool的程序,该程序可以执行您想要的操作,尽管直接查看/ sys可能比使用其他程序为您执行操作更容易。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.