首先,情况是这样的:我有一台 Linux 计算机,它有两个 eSATA 驱动器托架,可以安装可移动 SSD 驱动器。我正在尝试编写一个小型 GUI 应用程序,让用户可以更轻松地安装/卸载/格式化/备份/等放入这些托架中的驱动器。
基本上一切都正常。不过有一个小问题,就是在驱动器成功安装之前,我不知道如何找到有关插入的驱动器上有什么的信息。
因此,例如,如果用户插入我无法安装的驱动器(例如,因为它未格式化,或者使用意外的文件系统格式化),我的应用程序只能说“驱动器无法安装”。
这不是很令人满意,因为如果驱动器未格式化,用户可能会想要格式化它...但如果驱动器包含来自无法识别的文件系统的数据,用户可能不会想要格式化它....或者至少,我希望能够警告他,这样做他将删除潜在的有价值的数据。
所以我的问题是:是否有任何方法可以从驱动器查询一些基本信息(尤其是文件系统类型),而无需驱动器已安装?或者我是否只需要尝试使用各种已知文件系统进行安装,直到其中一次安装尝试成功,如果没有成功,则给出一个模糊的“小心”消息?
如果有关系的话,我在驱动器托架中安装驱动器的路径是:
/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
答案1
如果驱动器已卸载,您可以执行几件事。
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
针对分区返回一些有用的详细信息(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
将为您提供有关驱动器类型的一些详细信息。如果您对驱动器的实际序列号感到好奇,则可能需要使用此功能。
# 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
如果你已经安装了 part,你可以运行如下命令
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
答案2
另一个有用的命令是blkid
- 它返回类似的信息,vol_id
但也可以扫描系统中的所有设备,而不需要传入一个设备。
要强制blkid
扫描所有设备而不是使用缓存信息,请运行blkid -c /dev/null
(您需要对块设备的读取权限,因此通常需要以 root 身份运行它)
答案3
以下是来自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
答案4
内核找到的所有分区的简单概述如下
cat /proc/partitions