Поиск всех устройств хранения, подключенных к машине Linux


32

Мне нужно найти все записываемые устройства хранения данных, подключенные к данной машине, независимо от того, смонтированы они или нет.

Допустимый способ сделать это - попробовать каждую запись /dev, соответствующую записываемым устройствам (hd * и sd *).

Есть ли лучшее решение, или я должен придерживаться этого?


переосмысливая старый вопрос SO
Уоррен

2
Возможно, вы хотите использовать удиски?
Дероберт

Я не просто хочу найти, какие жесткие диски находятся в системе - я ищу все устройства хранения данных
Warren

Я думаю, что мы все предполагали жесткие диски и тому подобное. Вы на самом деле имеете в виду что-то еще? Мол, должно ли оно включать ленточные накопители, принтеры и т. Д.?
Дероберт

2
@derobert - да, отсюда и название «все устройства хранения» :)
Уоррен

Ответы:


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и извлекать подробности об устройствах в классе diskили tape(и, возможно, в других - storageкласс дает вам подробности о контроллерах хранения, scsi, sata, sas и т. Д.).

например

lshw -class disk -class tape

-shortВариант дает хорошее компактное резюме. Например, на моем домашнем сервере / рабочей станции / экспериментальной коробке zfsonlinux (к сожалению, нет ленточных устройств):

# lshw -class tape -class disk -class storage -short
H / W путь Класс устройства Описание
================================================== =======
/ 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 [Сокол]
/0/100/b/0/0.0.0 / dev / sdd диск 1 ТБ WDC WD10EARS-00Y
/0/100/b/0/0.1.0 / dev / sde диск 1 ТБ WDC WD10EACS-00Z
/0/100/b/0/0.2.0 / dev / sdf диск 1 ТБ WDC WD10EACS-00Z
/0/100/b/0/0.3.0 / dev / sdg диск 1 ТБ ST31000528AS
/0/100/b/0/0.4.0 / dev / sdh диск 1 ТБ ST31000528AS
/0/100/b/0/0.5.0 / dev / sdi диск 1 ТБ ST31000528AS
/0/100/b/0/0.6.0 / dev / sdj диск 1 ТБ ST31000528AS
/ 0/100/11 хранилище scsi2 Контроллер SATA SB7x0 / SB8x0 / SB9x0 [режим AHCI]
/ 0/100/11/0 / dev / sda диск 128ГБ Patriot Torqx 2
/ 0/100/11/1 / dev / sdb диск 1 ТБ ST31000528AS
/ 0/1 хранилище scsi11     
/0/1/0.0.0 / dev / sdk disk 1967MB SCSI Disk
/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 disk 4057MB SCSI Disk

Устройства / 0/1 на самом деле представляют собой USB-кард-ридер (к одному из слотов подключена SD-карта емкостью 2 ГБ), а устройство / 0/2 - это мой телефон Android, подключенный только для зарядки. Устройство 0/3 - это флэш-накопитель USB объемом 4 ГБ.

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'}

это большое расширение предыдущего ответа
Уоррен

4

lsblk перечислит все блочные устройства хранения.

fdisk -l перечислит все разделы на всех устройствах, которые перечислены в /proc/partitions

lshw -short предоставит вам информацию обо всем аппаратном обеспечении (кроме, возможно, FireWire) в системе.


3

Если, в соответствии с вашим ответом на derobert, вы ищете что - то , что списки ленточных накопителей и принтеров , вы можете быть заинтересованы в lsdev, lsusbи lspci.


Конечно, найти хранилище, подключенное к сети, не удастся :-(
derobert

1
Тогдаfdisk -l
двоеточие

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, таких как Ubuntus 14.04 и выше, hwinfo отсутствует в официальном репозитории .


0

Я обнаружил, что fdiskи lsblkне доступен в виртуальном терминале для установщика Debian. В этом случае я использую blkid, который получает UUID для блочных устройств хранения.


-1

Если вы имеете в виду устройства RAID, то вы не сможете получить правильный результат, используя hdparm smartctl и т. Д., Потому что такого рода инструменты ищут уровень / dev на уровне ОС, если вы хотите знать об этом на аппаратном уровне, тогда вам нужен инструмент типа 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+ лет назад?
Уоррен

Потому что ОС изменилась и теперь вы получаете много loopи tmpfsразделов. Так что лучше очистить вывод, используя grep, как указано выше.
Миан Асбат Ахмад

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.