2つのハードディスクがあるとしましょう。
1つの内部(GNU/Linux(Debian)を起動します);
1つの外部(USB)。
fdisk -l
は両方を検出しますが、どちらが/dev/sda
で、どちらが/dev/sdb
であるかはわかりません。 lsusb
は、外部USBデバイスが接続されていることを通知しますが、それが/dev/sda
または/dev/sdb
にマップされているかどうかは通知しません。
システムからそのような情報をどのように取得できますか?
ls -l /sys/class/block/sd?
sd?
エントリは、ディスクがコンピュータに接続されている方法を示すシンボリックリンクです。 USBディスク用の/usb
があります。
udevadm info -a -n sda
これは、カーネルがsda
に対して直接取得できるすべての識別情報を示しています。ディスクがどのように接続されているかが詳しくわかります。 Intelコントローラー上のSATAディスクの場合はSUBSYSTEMS=="scsi"
からSUBSYSTEMS=="pci", DRIVERS=="ahci"
に直接移動するか、USBディスクの場合はSUBSYSTEMS=="scsi"
からSUBSYSTEMS=="usb", DRIVERS=="usb-storage"
に移動します。
ls -l /dev/disk/by-*
/dev/disk/by-*
の下で、ハードウェア接続(by-path
)、グローバル一意識別子(by-uuid
)、人間が選択したラベル(by-label
)、またはによってディスクを見つけることができます。メーカーID(by-id
)。
私のDebianボックス(現在はLubuntu)では、この目的のためにtestdisk -l
(read: 'minus small L')をよく使用していました。 。すべてのディストリビューションにtestdisk
(よく知られたリカバリツール)がプリインストールされているわけではないことは承知していますが、ほとんどのディストリビューションにはプリインストールされているはずです。
私が少し前に学んだもう1つの優れたツールは、lsblk
です。
$ lsblk -d -io KNAME,TYPE,SIZE,MODEL
または、HDDのみを表示したい場合:
$ lsblk -d -io KNAME,TYPE,SIZE,MODEL | grep 'sd\w'
(\ wは、必須ではありませんが、デフォルト構成でgrep
がgrep --color=auto
にエイリアスされているディストリビューションでの醜い「半色」出力を回避します。)
私の(実際には非常に複雑な)スクリプトを使用して、この1つの小さな目的だけを果たすためにトリミングすることにしました。
多くの場合、最も速いのは/proc/scsi/scsi
を猫にすることです。これは、どれがどれであるかを示すのに十分です。
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi2 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST95005620AS Rev: SD23
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi4 Channel: 00 Id: 00 Lun: 00
Vendor: 2.0 Model: USB Flash Drive Rev: 1.00
Type: Direct-Access ANSI SCSI revision: 02
したがって、私の場合、最初の(sda)はSeagate ST95005620ASであり、2番目の(sdb)はUSBフラッシュドライブです。
より詳細で具体的な情報を入手するには、/sys/block/sda
と/sys/block/sdb
、および/sys/class/scsi_disk
を調べてください。
/sys/class/scsi_disk
には、特にPCIアドレスツリーへのシンボリックリンクが含まれており、USBホストとSATAホストが表示されます。
$ ls -l /sys/class/scsi_disk
total 0
lrwxrwxrwx 1 root root 0 2012-02-28 23:50 2:0:0:0 -> ../../devices/pci0000:00/0000:00:1f.2/Host2/target2:0:0/2:0:0:0/scsi_disk/2:0:0:0
lrwxrwxrwx 1 root root 0 2012-02-28 23:50 4:0:0:0 -> ../../devices/pci0000:00/0000:00:1d.7/usb1/1-8/1-8:1.0/Host4/target4:0:0/4:0:0:0/scsi_disk/4:0:0:0
$ cat /sys/block/sd[ab]/device/model
ST95005620AS
USB Flash Drive
詳細については、find /sys -name 'scsi*'
およびfind /sys/block/sd[a-z]/
も試してください。
最良の答えはわかりませんが、いくつかのアイデアがあります。
/sys/class/block/sdX/device/model
を見ると、デバイスによって報告されたメーカー/モデル情報を取得できます。例えば:
cat /sys/class/block/sda/device/model
SAMSUNG HD161GJ
これだけで、どちらが外部デバイスで、どちらが内部デバイスであるかを識別するのに十分な場合があります。 dmesg
からの出力を見ることができます。これには、USBデバイスの場合は次のようなものが含まれます。
[ 2073.412999] scsi12 : usb-storage 2-1.8:1.0
これは、SCSIバス12をUSBストレージバスとして識別します。次に、バス12でSCSIデバイスを探すことができます。
# dmesg | grep scsi12
[ 2074.488651] sd 12:0:0:0: Attached scsi generic sg6 type 0
[ 2076.592154] sd 12:0:0:0: [sdf] 30481152 512-byte logical blocks: (15.6 GB/14.5 GiB)
[ 2076.592639] sd 12:0:0:0: [sdf] Write Protect is off
[ 2076.592645] sd 12:0:0:0: [sdf] Mode Sense: 23 00 00 00
[ 2076.593142] sd 12:0:0:0: [sdf] No Caching mode page present
[ 2076.593147] sd 12:0:0:0: [sdf] Assuming drive cache: write through
[ 2076.596270] sd 12:0:0:0: [sdf] No Caching mode page present
[ 2076.596276] sd 12:0:0:0: [sdf] Assuming drive cache: write through
[ 2076.619078] sd 12:0:0:0: [sdf] No Caching mode page present
[ 2076.619084] sd 12:0:0:0: [sdf] Assuming drive cache: write through
[ 2076.619088] sd 12:0:0:0: [sdf] Attached SCSI removable disk
Gillesの答えが一番だと思いますが、完全を期すためにこれを追加します。
hdparm -i /dev/sda
これにより、コントローラードライバーがドライブから取得した基本情報(モデルとシリアル番号を含む)が表示されます。 /dev
デバイスへの読み取りアクセス権がある場合(グループ権限など)、このコマンドはrootを必要としません。
hdparm -I /dev/sda
これにより、ドライブに関する大量の高度な情報(モデル、シリアル番号、および可能なすべてのもの)が表示されます。このコマンドにはrootが必要です。
このような状況で私が通常使用する2つのコマンドは、lsblk
とblkid
です。前者は、各ディスクブロックデバイスに、パーティション、サイズ、マウントポイント(マウントされている場合)のリストを出力します(ボリュームラベルが存在する場合は、ボリュームラベルが存在する場合もありますが、現時点ではボリュームラベルが接続されているデバイスはありません。これを確認してください)。後者は、ファイルシステムタイプ、UUID、およびボリュームラベル(存在する場合)とともに各パーティションを出力します。
mount
は、各デバイスがマウントされている場所も示します。したがって、ファイルシステムのルートにマウントされているデバイスがブートデバイスです。内蔵ハードドライブも外付けハードドライブの前に列挙されると思うので、/dev/sda
は内蔵ハードドライブである必要があります。