获取有关当前未安装驱动器的信息的最佳方式是什么?

首先,情况:我有一台配有两个可插拔SSD硬盘的eSATA硬盘托架的Linux电脑。 我正在尝试编写一个小的GUI应用程序,使得用户可以更轻松地安装/卸载/格式化/备份/等他放入这些海湾的驱动器。

这一切主要是有用的。 然而,一个小问题是,我不知道如何find有关插入驱动器上的内容的任何信息,直到驱动器成功挂载

所以,例如,如果用户插入一个我无法安装的驱动器(例如,因为它是未格式化的,或者用一个意外的文件系统格式化的),我的应用程序可以说它是“Drive failed to mount”。

这是不是很令人满意,因为如果驱动器是未格式化的,用户可能会想要格式化它…但是如果驱动器包含来自无法识别的文件系统的数据,用户可能不想格式化….或至less,我希望能够警告他,这样做会消除潜在的有价值的数据。

所以我的问题是:是否有任何方法来查询一些基本的信息(特别是文件系统types)的驱动器,不需要已经安装驱动器? 或者,我只需要尝试使用各种已知的文件系统挂载它,直到其中一个挂载尝试成功为止,并且如果它们中的任何一个都不成功,则会给出一个模糊的“小心”消息?

如果重要的话,我用来在驱动器托架中安装驱动器的path是:

/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 -lsfdisk -l这样的命令列出分区。 只要分区types可以给你一些有用的信息,如果分区设置correct.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对付一个分区来返回一些有用的细节(Debian的udev软件包的一部分)。 这通常会告诉你什么文件系统正在被使用。

     # 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会给你一些关于驱动器types的细节。 如果您对驱动器的实际序列号感到好奇,则可能需要使用它。

     # 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 

    无论如何,我build议你看看udev或parted的来源。

    另一个有用的命令是blkid – 它返回与vol_id类似的信息,但也可以扫描系统中的所有设备,而不需要传入设备。

    要强制blkid扫描所有设备而不是使用caching信息,请运行blkid -c /dev/null (您需要在块设备上具有读取权限,以便通常需要以root用户身份运行它)

    下面是IBM的一个build议: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