まず、状況:リムーバブルSSDドライブを受け入れる2つのeSATAドライブベイを備えたLinuxコンピューターがあります。ユーザーがこれらのベイに挿入するドライブのマウント/アンマウント/フォーマット/バックアップなどを簡単に行えるようにする小さなGUIアプリケーションを作成しようとしています。
ほとんどすべてが機能します。ただし、小さな問題の1つは、ドライブが正常にマウントされるまで、挿入されたドライブの内容に関する情報を見つける方法がわからないことです。
そのため、たとえば、ユーザーがマウントできないドライブを挿入した場合(ドライブがフォーマットされていない、または予期しないファイルシステムでフォーマットされているなど)、アプリがそれを「ドライブのマウントに失敗しました」としか言えません。
ドライブがフォーマットされていない場合、ユーザーはおそらくフォーマットする必要があるため、これは非常に満足できるものではありません。しかし、ドライブに認識されないファイルシステムのデータが含まれている場合、ユーザーはおそらくフォーマットしたくないでしょう...または少なくとも、そうすることで彼は潜在的に価値のあるデータを消去することになると警告できるようにしたいです。
だから私の質問は、ドライブがすでにマウントされていることを必要としない、ドライブからいくつかの基本情報(特にファイルシステムタイプ)をクエリする方法はありますか?それとも、マウントの試みの1つが成功するまで、さまざまな既知のファイルシステムでマウントを試み、どれも実行しない場合は、漠然とした「注意」メッセージを表示する必要がありますか?
問題がある場合、ドライブをドライブベイにマウントするために使用するパスは次のとおりです。
/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
のようなコマンドを使用して、パーティションを一覧表示できます。セットアップが正しいパーティションである場合、パーティションタイプだけでいくつかの有用な情報が得られることがあります。
# 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
別にインストールした場合は、次のようなコマンドを実行できます
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
もう1つの便利なコマンドはblkid
です。これはvol_id
と同様の情報を返しますが、デバイスを渡さなくてもシステム内のすべてのデバイスをスキャンできます。
キャッシュされた情報を使用する代わりにblkid
にすべてのデバイスをスキャンさせるには、blkid -c /dev/null
を実行します(ブロックデバイスの読み取り権限が必要なため、通常はルートとして実行する必要があります)
カーネルが見つけたすべてのパーティションの簡単な概要は、
cat /proc/partitions
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