Во-первых, ситуация: у меня есть компьютер с 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
Если диски отключены, вы можете сделать несколько вещей.
Вы можете использовать такую команду, как fdisk -l
или sfdisk -l
чтобы перечислить разделы. Только тип раздела может дать вам некоторую полезную информацию, если разделы, на которых установлены правильные настройки. Y
# 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, вы можете запустить такую команду
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 или расстались источник.
Еще одна полезная команда: blkid
- возвращает аналогичную информацию в vol_id
но также может сканировать все устройства в системе, вместо того, чтобы требовать передачи устройства.
Заставить blkid
для сканирования всех устройств вместо использования кэшированной информации запустите blkid -c /dev/null
(вам нужно разрешение на чтение на блочных устройствах, поэтому вам обычно нужно запускать его как root)
Вот одно предложение от 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
Простой обзор всех разделов, найденных ядром, дает
cat /proc/partitions