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

109

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

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

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

кроличий садок
источник
Используйте libsysfs , рекомендуемый способ запросить ядро ​​о подключенных устройствах всех типов.
Дэвид Шмитт,
Поскольку вы говорите о том, что они, возможно, монтируются, я думаю, вам нужен список разделов, а не только дисков?
Марк Бейкер,
с разделами тоже все в порядке, да :) .. если я знаю разделы, я также буду знать, какие физические устройства доступны,
Уоррен
2
поскольку теперь доступны Unix и Linux , этот вопрос следует перенести туда
Уоррен
3
@warren - о нет. Их еще надо закрыть. Поскольку вы, как владелец сообщения, хотите, чтобы это сообщение было перемещено, вы должны пометить его для внимания модератора. Тот факт, что вы хотите его переместить, будет иметь некоторый вес.
ChrisF

Ответы:

79

/proc/partitionsперечислит все блочные устройства и разделы, которые распознает система. Затем вы можете попробовать использовать, file -s <device>чтобы определить, какая файловая система присутствует в разделе, если таковая имеется.

Стив Бейкер
источник
4
Например, это исключает приводы CD / DVD (я знаю, что они обычно не записываются)
pixelbeat
Есть своего рода предел того, что вы можете делать из оболочки. Большинство других предложений, которые имеют более высокий рейтинг, либо не работают из оболочки, не будут работать, если dbus не запущен, либо будут перечислять устройства, которые на самом деле отсутствуют / настроены. Это быстрее, чем проверять все устройства / dev.
Стив Бейкер,
5
lsblk, этот лучше
emj365
1
/ proc / partitions также дает вам букву диска в Cygwin.
Катриэль
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
Большой! Спасибо. (ОТ: Отстойно видеть, что этот вопрос заблокирован. Должна быть кнопка «проголосовать, чтобы снять блокировку»).
Максим Векслер
1
есть для пользователей от 3к репов и выше (кнопка «открыть»).
Да неужели? Тогда я должен как можно быстрее добраться до 3к.
Максим Векслер
да, посмотрите на страницу привилегий полный список вещей, которые вы можете сделать с большим количеством репутации.
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)

кроме того, file -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)
THESorcerer
источник
9

ls /sys/block

Михай Лимбэцан
источник
не перечисляет разделы. Я не уверен, этого хотел исходный вопрос или нет.
Марк Бейкер,
1
Я никогда не знал о / sys / block - хотя в нем также перечислены устройства, которые не доступны для записи, такие как DVD-привод,
Уоррен
1
На самом деле, он не перечисляет разделы - вы можете проверить подкаталоги, ища все подкаталоги, содержащие как минимум файлы с именами «dev», «stat» и «uevent» и подкаталоги с именами «holders». DVD по-прежнему являются устройствами запоминающего устройства :)
Михай Лимбэцан
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
ZungBang
источник
4

Современные системы Linux обычно имеют записи в / dev только для существующих устройств, поэтому переход через hda * и sda *, как вы предлагаете, будет работать достаточно хорошо.

В противном случае в / proc может быть что-то, что вы можете использовать. Беглый взгляд, я бы сказал, что / proc / partitions может делать то, что вам нужно.

Марк Бейкер
источник
2

libsysfs действительно выглядит потенциально полезным, но не напрямую из сценария оболочки. В комплекте с ним идет программа под названием systool, которая будет делать то, что вы хотите, хотя может быть проще просто заглянуть в / sys напрямую, чем использовать другую программу, которая сделает это за вас.

Марк Бейкер
источник