Как лучше всего получить информацию о дисках, которые в настоящий момент не подключены?


38

Во-первых, ситуация: у меня есть компьютер Linux с двумя отсеками для дисководов eSATA, которые принимают съемные SSD-диски. Я пытаюсь написать небольшое приложение с графическим интерфейсом, которое облегчает пользователю монтирование / размонтирование / форматирование / резервное копирование / и т.д. дисков, которые он вставляет в эти отсеки.

Все это в основном работает. Одна небольшая проблема, однако, заключается в том, что я не знаю, как узнать какую-либо информацию о том, что находится на вставленных дисках, до тех пор, пока диски не будут успешно смонтированы.

Так, например, если пользователь вставляет диск, который я не могу смонтировать (например, из-за того, что он не отформатирован или отформатирован с использованием неожиданной файловой системы), все мое приложение может сказать об этом: «Не удалось смонтировать диск».

Это не очень удовлетворительно, потому что если диск не отформатирован, пользователь, вероятно, захочет отформатировать его ... но если диск содержит данные из нераспознанной файловой системы, пользователь, вероятно, НЕ захочет отформатировать его .... или по крайней мере, я хочу предупредить его, что таким образом он сотрет потенциально ценные данные.

Итак, мой вопрос: существует ли какой-либо метод для запроса некоторой базовой информации (особенно типа файловой системы) с диска, который не требует, чтобы диск уже был смонтирован? Или мне просто нужно попытаться смонтировать его с различными известными файловыми системами, пока одна из попыток монтирования не удастся, и дать неопределенное сообщение «будьте осторожны», если ни одна из них не делает?

В случае, если это имеет значение, пути, которые я использую для установки дисков в отсеки для дисков:

/dev/disk/by-path/pci-0000:00:1f.2-scsi-2:0:0:0
/dev/disk/by-path/pci-0000:00:1f.2-scsi-1:0:0:0

Ответы:


55

Если диски отключены, вы можете сделать несколько вещей.

Вы можете использовать команду как fdisk -lили sfdisk -lдля вывода списка разделов. Просто тип раздела может дать вам некоторую полезную информацию, если настройки разделов правильны.

# sfdisk -l

Disk /dev/sda: 4177 cylinders, 255 heads, 63 sectors/track
Units = cylinders of 8225280 bytes, blocks of 1024 bytes, counting from 0

   Device Boot Start     End   #cyls    #blocks   Id  System
/dev/sda1   *      0+     30      31-    248976   83  Linux
/dev/sda2         31    4176    4146   33302745   8e  Linux LVM
/dev/sda3          0       -       0          0    0  Empty
/dev/sda4          0       -       0          0    0  Empty

Если он присутствует в вашей системе, вы можете использовать команду vol_idдля раздела, чтобы получить некоторые полезные сведения (часть пакета udev в Debian). Как правило, это скажет вам, какая файловая система на самом деле используется.

# vol_id /dev/sda1

ID_FS_USAGE=filesystem
ID_FS_TYPE=ext3
ID_FS_VERSION=1.0
ID_FS_UUID=32c44d53-9025-4d10-8f36-75c166547bd5
ID_FS_UUID_ENC=32c44d53-9025-4d10-8f36-75c166547bd5
ID_FS_LABEL=
ID_FS_LABEL_ENC=
ID_FS_LABEL_SAFE=

Команда lshw -class diskдаст вам некоторые подробности о типе диска. Возможно, вы захотите использовать это, если вам интересно узнать фактический серийный номер привода.

# lshw -class disk

  *-disk
       description: ATA Disk
       product: VBOX HARDDISK
       physical id: 0.0.0
       bus info: scsi@0:0.0.0
       logical name: /dev/sda
       version: 1.0
       serial: VB169e93fb-d1e0fd97
       size: 32GiB (34GB)
       capabilities: partitioned partitioned:dos
       configuration: ansiversion=5 signature=000d39f8

Если вы уверены, что на нем есть определенная файловая система, такая как ext2 / 3, вы можете использовать инструмент tune2fs для конкретной файловой системы , чтобы изучить больше деталей.

# tune2fs -l /dev/sda1

tune2fs 1.41.3 (12-Oct-2008)
Filesystem volume name:   <none>
Last mounted on:          <not available>
Filesystem UUID:          8cbdf102-05c7-4ae4-96ea-681cf9b11914
Filesystem magic number:  0xEF53
Filesystem revision #:    1 (dynamic)
Filesystem features:      filetype sparse_super
Default mount options:    (none)
Filesystem state:         not clean
Errors behavior:          Continue
Filesystem OS type:       Linux
Inode count:              124496
Block count:              248976
Reserved block count:     12448
Free blocks:              212961
Free inodes:              124467
First block:              1
Block size:               1024
Fragment size:            1024
Blocks per group:         8192
Fragments per group:      8192
Inodes per group:         4016
Inode blocks per group:   502
Last mount time:          Thu Oct  7 15:34:42 2010
Last write time:          Thu Oct  7 15:34:42 2010
Mount count:              4
Maximum mount count:      30
Last checked:             Wed Sep 15 09:29:03 2010
Check interval:           0 (<none>)
Reserved blocks uid:      0 (user root)
Reserved blocks gid:      0 (group root)
First inode:              11
Inode size:           128

Еще один полезный инструмент - lsblk .

# lsblk 

NAME                MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda                   8:0    0    30G  0 disk 
└─sda1                8:1    0    30G  0 part 
  ├─vg1-root (dm-0) 254:0    0  23.3G  0 lvm  /
  └─vg1-swap (dm-1) 254:1    0   1.9G  0 lvm  [SWAP]
sr0                  11:0    1  1024M  0 rom  

Если вы расстались, вы можете запустить такую ​​команду

parted /dev/sda print all

Model: ATA VBOX HARDDISK (scsi)
Disk /dev/sda: 34.4GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      32.3kB  255MB   255MB   primary  ext2         boot 
 2      255MB   34.4GB  34.1GB  primary               lvm  

Model: Linux device-mapper (linear) (dm)
Disk /dev/mapper/vg1root: 32.6GB
Sector size (logical/physical): 512B/512B
Partition Table: loop

Number  Start  End     Size    File system  Flags
 1      0.00B  32.6GB  32.6GB  ext3              

В любом случае, я рекомендую вам взглянуть на источник udev или parted .


12
С тех пор «vol_id» был переименован в «blkid» для тех, кто случайно наткнулся на этот великий ответ.
Дейв С.

lsblk -i -o kname,mountpoint,fstype,size,maj:min,name,state,rm,rota,ro,type,label,model,serial
Sjas

прекрасный ответ !!
Суфиян Гори

5

Еще одна полезная команда blkid- она ​​возвращает похожую информацию, vol_idно также может сканировать все устройства в системе, вместо того, чтобы требовать передачи устройства.

Чтобы заставить blkidсканировать все устройства вместо использования кэшированной информации, запустите blkid -c /dev/null(вам нужно разрешение на чтение на блочных устройствах, поэтому вам обычно нужно запускать его как root)


Анонимный пользователь хотел добавить: это все полезно, но «vol-id» теперь полностью заменен на «blkid»; ни SuSE, ни Debian больше не имеют vol-id в своих репозиториях. Запустите whereis blockidиз командной строки (или man blockid), вы найдете, если он загружен. Запуск от имени root: blkid /dev/sdb1дает (например): /dev/sdb1: SEC_TYPE="msdos" LABEL="DR-05" UUID="8031-5963" TYPE="vfat"страницу man тоже стоит посмотреть.
Крис С

1

Вот одно предложение от IBM: SCSI - Горячее добавление, удаление, повторное сканирование устройств SCSI: Повторное сканирование устройства SCSI . Это повторно отсканирует этот адрес SCSI для новых устройств, и вы сможете прочитать информацию в / var / log / messages. Некоторые другие дисковые инструменты также будут работать без установки диска.

echo 1 > /sys/bus/scsi/drivers/sd/<SCSI-ID>/block/device/rescan

Я вчера попробовал что-то немного другое, и это сработало (система RHEL4):

cd /sys/bus/scsi/devices
echo > 0\:0\:0\:0/rescan

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