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


32

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

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

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


重新提出一个旧的SO问题
沃伦(

2
也许您想使用udisk?
derobert

我不只是想找个什么样的硬盘在系统上-我找所有的存储设备
沃伦

我认为我们都假设硬盘和类似硬盘。你真的是其他意思吗?像,它应该包括磁带机,打印机等吗?
derobert 2012年

2
@derobert-是的,因此是“所有存储设备”的标题:)
沃伦(

Answers:


47

如果仅对存储设备感兴趣,则可以lsblk从广泛使用的util-linux软件包中使用:

$ lsblk -o KNAME,TYPE,SIZE,MODEL
KNAME TYPE   SIZE MODEL
sda   disk 149.1G TOSHIBA MK1637GS
sda1  part  23.3G 
sda2  part    28G 
sda3  part  93.6G 
sda4  part   4.3G 
sr0   rom   1024M CD/DVDW TS-L632M

它非常适合与许多其他可用列一起编写脚本。


13

您可以浏览或类的lshw设备的输出并提取有关设备的详细信息(也许还有其他类- 类为您提供有关存储控制器,scsi,sata,sas等的详细信息)。disktapestorage

例如

lshw -class disk -class tape

-short选项给出了一个很好的紧凑摘要。例如在我的家用zfsonlinux服务器/工作站/实验箱上(不幸的是没有磁带设备):

#lshw-类磁带-类磁盘-类存储-short
硬件路径设备类别描述
================================================== =======
/ 0/100/4/0存储JMB362 SATA控制器
/ 0/100/5/0 scsi10存储JMB362 SATA控制器
/0/100/5/0/0.0.0 / dev / sdc磁盘120GB Patriot Wildfire
/ 0/100 / b / 0 scsi1存储SAS2008 PCI-Express Fusion-MPT SAS-2 [Falcon]
/0/100/b/0/0.0.0 / dev / sdd磁盘1TB WDC WD10EARS-00Y
/0/100/b/0/0.1.0 / dev / sde磁盘1TB WDC WD10EACS-00Z
/0/100/b/0/0.2.0 / dev / sdf磁盘1TB WDC WD10EACS-00Z
/0/100/b/0/0.3.0 / dev / sdg磁盘1TB ST31000528AS
/0/100/b/0/0.4.0 / dev / sdh磁盘1TB ST31000528AS
/0/100/b/0/0.5.0 / dev / sdi磁盘1TB ST31000528AS
/0/100/b/0/0.6.0 / dev / sdj磁盘1TB ST31000528AS
/ 0/100/11 scsi2存储SB7x0 / SB8x0 / SB9x0 SATA控制器[AHCI模式]
/ 0/100/11/0 / dev / sda磁盘128GB Patriot Torqx 2
/ 0/100/11/1 / dev / sdb磁盘1TB ST31000528AS
/ 0/1 scsi11存储     
/0/1/0.0.0 / dev / sdk磁盘1967MB SCSI磁盘
/0/1/0.0.1 / dev / sdl磁盘SCSI磁盘
/0/1/0.0.2 / dev / sdm磁盘SCSI磁盘
/0/1/0.0.3 / dev / sdn磁盘SCSI磁盘
/ 0/2 scsi66存储     
/0/2/0.0.0 / dev / sdo磁盘SCSI磁盘
/ 0/3 scsi67存储     
/0/3/0.0.0 / dev / sdp磁盘4057MB SCSI磁盘

/ 0/1设备实际上是一个USB读卡器(其中一个插槽中插入了2GB SD卡),而/ 0/2设备是我的Android手机,仅用于充电。0/3设备是4GB USB闪存驱动器。

lshw可以产生纯文本,html,xml和json输出。它还可以将硬件详细信息转储为sqlite数据库格式。

它是为debian和大多数其他发行版打包的。主页和资源位于http://ezix.org/project/wiki/HardwareLiSter


5

请尝试此命令

ls -l /dev /dev/mapper |grep '^b'

它将列出您系统中的所有阻止设备


5

您可以lsblk用来列出所有块设备,以及每个设备是否都是只读的。

然后grep,您可以使用和awk打印非只读的块设备的名称:

lsblk -d -n -oNAME,RO | grep '0$' | awk {'print $1'}

这是对先前答案
沃伦2014年

4

lsblk 将列出所有块存储设备。

fdisk -l 将列出列出的所有设备上的所有分区 /proc/partitions

lshw -short 将为您提供有关系统上所有硬件(也许是火线除外)的信息。


3

如果按你的回应derobert,你要找的东西,列出磁带驱动器和打印机,您可能感兴趣的lsdevlsusblspci


当然,将无法找到网络连接的存储设备:-(
derobert 2012年

1
然后fdisk -l
冒号2012年

2

您可以尝试以下命令:

file /dev/disk/by-id/* | awk -F'/' 'NR>1{print "\047/dev/"$NF}' | sort | uniq

1
它的作用是什么?与使用lshw列出块和磁带设备类相比,它又如何?
n611x007

2

您可以使用hwinfo列出所有磁盘(文档)。

hwinfo --block --short 给出了一个概述:

disk:
  /dev/sdb             WDC WD3200AAKS-7
  /dev/sda             SAMSUNG HD103UJ
partition:
  /dev/sdb1            Partition
  /dev/sdb2            Partition
  /dev/sda1            Partition
cdrom:
  /dev/sr1             TSSTcorp DVD+-RW TS-H653B
  /dev/sr0             HL-DT-ST DVD-ROM GDRH20N

hwinfo --disk 提供每个磁盘的更多详细信息。

仅供参考:在某些Linux发行版(例如Ubuntu 14.04和更高版本)上,hwinfo不在官方存储库中


0

我发现了这一点,fdisk并且lsblk在Debian安装程序的虚拟终端中不可用。在这种情况下,我使用blkid,它获取块存储设备的UUID。


-1

如果您要使用RAID设备,那么您将无法使用hdparm smartctl等获得正确的结果,因为如果您想在硬件级别上了解这些工具,则它们查找/ dev,即OS级别,那么您需要使用megacli之类的工具我以前用megacli调试

    [root@ns3539186 ~]# /opt/megaraid/megacli -LDPDInfo -aAll |grep "Virtual Disks\|RAID Level\|State"
Number of Virtual Disks: 2
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
State               : Optimal
Foreign State: None
Media Type: Solid State Device
Foreign State: None
Media Type: Solid State Device
RAID Level          : Primary-1, Secondary-0, RAID Level Qualifier-0
State               : Optimal
Foreign State: None
Foreign State: None

获取磁盘的序列号

[root@ns3539186 ~]# /opt/megaraid/megacli -PDList -aAll | egrep 'Slot\ Number|Device\ Id|Inquiry\ Data|Raw|Firmware\ state' | sed 's/Slot/\nSlot/g' |grep "Da                    ta\|Slot\|Raw"
Slot Number: 0
Raw Size: 447.130 GB [0x37e436b0 Sectors]
Inquiry Data: PHYS733402Z0480BGN  INTEL SSDSC2KB480G7                     SCV10100
Slot Number: 1
Raw Size: 447.130 GB [0x37e436b0 Sectors]
Inquiry Data: PHYS733402YV480BGN  INTEL SSDSC2KB480G7                     SCV10100
Slot Number: 2
Raw Size: 3.638 TB [0x1d1c0beb0 Sectors]
Inquiry Data: K3GJTYMB            HGST HUS726040ALA610                    A5GNT920
Slot Number: 3
Raw Size: 3.638 TB [0x1d1c0beb0 Sectors]
Inquiry Data: K3GHW57B            HGST HUS726040ALA610                    A5GNT920

在上面的输出中,查询数据包含序列号


-1

这是我用来查找本地和共享存储的两个命令。

用于本地存储

lsblk | grep -v '^loop'

对于共享存储

findmnt -D | grep -v '^tmpfs' | grep -v '^/'

OR

df -kh | grep -v '^tmpfs' | grep -v '^/'

为什么要对6年前已经建议(并接受)的相同工具表示怀疑?
沃伦

因为OS改变,现在你得到了很多looptmpfs分区。因此,最好如上所述使用grep清理输出。
Mian Asbat Ahmad

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.