/dev/sdX
はローカルHDDまたはUSBキーですか? root権限なしでこれを行う方法が望ましいです。
OK、udevadm
は大いに役立ちました:
ローカルHDDの場合:
udevadm info --query=all --name=sdb | grep ID_BUS
E: ID_BUS=ata
USBキーの場合:
udevadm info --query=all --name=sdc | grep ID_BUS
E: ID_BUS=usb
Root権限なしで通知する方法はいくつかあり、その多くはトリッキー/ハックです。
/dev/disk/by-id
の使用:
find /dev/disk/by-id/ -lname '*sdX'
これが/dev/disk/by-id/usb-blah-blah-blah
のようなもので応答する場合、それはUSBディスクです。その他の接頭辞には、ata
、dm
、memstick
、scsi
などがあります。
/dev/disk/by-path
の使用には大きな違いはありません。
find /dev/disk/by-path/ -lname '*sdX'
/dev/disk/by-path/pci-0000:00:1d.7-usb-0:1:1.0-scsi-0:0:0:0
のようなものが表示されます。これは、ディスクにつながるデバイスパスを示しています。この場合、大まかなパスはPCI→USB→ディスクです。 (-usb-
に注意してください)。
Udevを使用する(私はDebianを実行しています。私のudevadm
は/sbin
にありませんが、_$PATH
にはありません。あなたの$PATH
はオンまたはオフになっている可能性があります):
/sbin/udevadm info --query=all --name=sdX | grep ID_BUS
デバイスのバスタイプが表示されます。情報の完全なリストを表示するには、| grep ID_BUS
を削除します(|less
の追加が必要になる場合があります)。
lshw
がインストールされている場合、ホイヘンスの回答mayも機能します:
lshw -class disk -class storage | less
そして、ディスクの出力を確認します。 less
で、 / sdXと上記のbus info
行を見てください。最初の行はscsi@…
とだけ表示されますが、その前の数行はさらにわかりやすくなります。ただし、実際にはすべきこれをスーパーユーザーとして実行するので、適切ではない可能性があります。 (症状:私が試したラップトップでは、SATAディスクは表示されましたが、USBディスクは表示されませんでした— Sudo
で実行すると、両方が表示されました)
他のものもあり、これらのものより多かれ少なかれ直接的です。
解決策は知っていますが、悲しいことに、root権限が必要です。とにかく、あなたはそれがまだ役に立つかもしれません:
Sudo lshw -class disk -class storage
デバイスごとに論理名を出力します(例:/dev/sda
)およびバス情報。USBデバイスの場合は「usb @ 1:2」のようなものになります。
出力例:
[...]
*-storage
description: SATA controller
physical id: d
bus info: pci@0000:00:0d.0
configuration: driver=ahci latency=64
[...]
*-disk:0
description: ATA Disk
physical id: 0
bus info: scsi@2:0.0.0
logical name: /dev/sda
[...]
*-scsi
physical id: 3
bus info: usb@1:2
configuration: driver=usb-storage
*-disk
description: SCSI Disk
physical id: 0.0.0
bus info: scsi@6:0.0.0
logical name: /dev/sdc
[...]
lsblk
を使用できます:
lsblk -do name、tran
NAME TRAN
sda sata
sdb sata
sdd usb
どこ -d
または--nodeps
はスレーブを印刷しないことを意味し、-o name,tran
または--output name,tran
は、デバイス名とデバイス転送タイプのみをリストすることを意味します。 rm
を出力列のリストに追加して、取り外し可能なデバイスを確認します(1
if true
):
lsblk --nodeps --output NAME、TRAN、RM
NAME TRAN RM
sda sata 0
sdb sata 0
sdd usb 1
これにはroot権限は必要ありません(ただし、これらのコマンドの多くはbashismを使用および依存しているため、すべてのPOSIX準拠シェルで機能するわけではありません)。
sdX
について質問する簡単な方法があります:
grep -H . /sys/block/sda/{capability,uevent,removable,device/{model,type,vendor,uevent}}
/sys/block/sda/capability:52
/sys/block/sda/uevent:MAJOR=8
/sys/block/sda/uevent:MINOR=0
/sys/block/sda/uevent:DEVNAME=sda
/sys/block/sda/uevent:DEVTYPE=disk
/sys/block/sda/removable:0
/sys/block/sda/device/model:WDC WD360Gd-00FN
/sys/block/sda/device/type:0
/sys/block/sda/device/vendor:ATA
/sys/block/sda/device/uevent:DEVTYPE=scsi_device
/sys/block/sda/device/uevent:DRIVER=sd
/sys/block/sda/device/uevent:MODALIAS=scsi:t-0x00
really興味深いファイルはcapability
です。私のDebianにはgenhd.h
ファイルがあるので、
eval $(sed -ne '
s/#define.*GENHD_FL_\([A-Z0-9_]*\)[ \t]*\([0-9]*\) \?.*$/GENHD_FLAGS[\2]="\1"/p
' /usr/src/linux-headers-2.6.32-5-common-openvz/include/linux/genhd.h)
diskCapa=$(</sys/block/sda/capability)
for i in ${!GENHD_FLAGS[@]};do
(( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
done
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO
diskCapa=$(</sys/block/sdd/capability)
for i in ${!GENHD_FLAGS[@]};do
(( diskCapa & i )) && echo ${GENHD_FLAGS[i]}
done
REMOVABLE
MEDIA_CHANGE_NOTIFY
UP
SUPPRESS_PARTITION_INFO
フラグremovable
が設定されているかどうかを知るためだけです:
grep REMOVABL /usr/src/linux-headers-3.2.0-4-common/include/linux/genhd.h
#define GENHD_FL_REMOVABLE 1
そう
for disk in sd{a,b,c,d,e,f,g,h} ; do
(( $(< /sys/block/$disk/capability ) & 1 )) && echo $disk is removable
done
capability
値(上記のsda
の例では52)に1
ビットが設定されているかどうか(つまり、奇数かどうか)をテストすることで機能します。
ただし、Linuxはすべてのフラグを/sys
でレンダリングするため、/sys/block/sdX/removable
を要求するほうがはるかに簡単です。 ;-)
したがって、USBキーはremovable
になる可能性がありますが、removableデバイスが多数あるため、メディアのsizeが次の値よりも大きいことを確認します0(サンプルのアンロードされたCD-ROMトレイのように)とdeviceがnot使用中:sdX/trace/enable
がバインドされていないことを監視する場合:
注意:これらはすべてbash v4.2以降で十分にテストされています。
bash の下では、これを非常に迅速かつ効率的な方法で使用できます。
for disk in /sys/block/* ; do
[ -f "$disk/removable" ] && [ $(<"$disk/removable") -gt 0 ] &&
[ -f "$disk/size" ] && [ $(<"$disk/size") -gt 0 ] &&
[ -f "$disk/trace/enable" ] && [ -z "$(<"$disk/trace/enable")" ] &&
echo "${disk##*/} $(($(<"$disk/size")/1953125))G $(<"$disk/device/model")"
done
私のシステムには4つのUSBキーがありますが、そのうちの1つ(sde
)はすでにマウントされているため、前のコマンドの出力は次のとおりです。
sdd 8G Trans-It Drive
sdf 7G Storage Media
sdg 4G silicon-power
私のスクリプト:
アップグレード bash 関数が少しありますが、アップグレードされたDebian Liveをインストールするために作成しました。
#!/bin/bash
txtsize() {
local _c=$1 _i=0 _a=(b K M G T P)
while [ ${#_c} -gt 3 ] ; do
((_i++))
_c=$((_c>>10))
done
_c=000$(( ( $1*1000 ) >> ( 10*_i ) ))
((_i+=${3:-0}))
printf -v ${2:-REPLY} "%.2f%s" ${_c:0:${#_c}-3}.${_c:${#_c}-3} ${_a[_i]}
}
#最初の部分は人間が読めるサイズのみをレンダリングします。関数はそこから始まります。
chooseFreeUsbKey() {
local _lUdisk _lUsize _lUdialog=dialog # whiptail # gdialog
local -A _lUdevices
unset ${1:-REPLY}
for _lUdisk in /sys/block/*; do
[ -f $_lUdisk/removable ] && [ $(<$_lUdisk/removable) -gt 0 ] &&
[ -f $_lUdisk/size ] && [ $(<$_lUdisk/size) -gt 0 ] &&
txtsize $(<$_lUdisk/size)*512 _lUsize &&
[ -f $_lUdisk/trace/enable ] && [ -z "$(<$_lUdisk/trace/enable)" ] &&
_lUdevices[${_lUdisk##*/}]="$_lUsize $(<$_lUdisk/device/model)"
done
case ${#_lUdevices[@]} in
0 ) ;; # echo Sorry no key found. ;;
1 ) IFS=§ read -a ${1:-REPLY} \
<<< "${!_lUdevices[@]}§${_lUdevices[@]%% *}§${_lUdevices[@]#* }";;
* ) declare -a menu
for _lUdisk in ${!_lUdevices[@]}; do
menu+=($_lUdisk "${_lUdevices[$_lUdisk]}")
done
_lUdisk=$($_lUdialog --menu "Choose a USB stick" \
$((LINES-3)) $((COLUMNS-3)) $((LINES-8)) \
"${menu[@]}" 2>&1 >/dev/tty)
IFS=§ read -a ${1:-REPLY} \
<<< "$_lUdisk§${_lUdevices[$_lUdisk]%% *}§${_lUdevices[$_lUdisk]#* }"
esac
}
これは、arrayとして、最初の引数として指定された変数または変数$REPLY
に回答を割り当てます。
chooseFreeUsbKey stick
echo "$stick"
sdf
echo "${stick[1]}"
7.26G
echo "${stick[2]}"
Storage Media
(最後のフィールドにはスペースを含めることができます。)
dmesg
が最も簡単な方法です。
dmesg | grep sdバツ
(sdX
はデバイスの名前です(例:sda
)
上記のコマンドから、次のようになります。
私は怠惰です、inxiはこれを簡単に教えてくれます:
inxi -D
Drives: HDD Total Size: 1220.3GB (33.2% used)
ID-1: /dev/sda model: ST380817AS size: 80.0GB
ID-2: /dev/sdb model: WDC_WD1003FZEX size: 1000.2GB
ID-3: USB /dev/sdc model: USB_Flash_Drive size: 140.0GB
FireWireと他のタイプの1つであるかどうかもわかると思いますが、しばらくの間これらのタイプを使用していないため、再確認する必要があります。
また、sambaやnfsマウントのように、パーティションがリモートの場合は-pを使用するように指示されます。
/sys/block/sdX/removable
の値を読み取るだけです。
例えば:
$ cat /sys/block/sda/removable
0
$ cat /sys/block/sdc/removable
1
/dev/sdc
はUSBキーです(SDカードやその他のリムーバブルメディアの場合があります)。
hdparm
またはlshw
(インストールが必要な場合があります)を使用し、Sudo
を使用してrootとして実行することをお勧めします。
Sudo hdparm -I /dev/sda
Sudo lshw -short -C disk
Sudo lshw -class disk -class storage
すべての情報を提供する必要があります。
以下のコマンドを使用して、SD、USB、およびSATAデバイスノードを取得できます。
usb_device="/dev/`ls -lR /dev/disk/by-id/ | grep ^l | grep 'usb' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"
sata_device="/dev/`ls -lR /dev/disk/by-id/ | grep ^l | grep 'ata' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"
sd_device="/dev/`ls -lR /dev/disk/by-id/ | grep ^l | grep 'mmc' | awk '{print $NF}' | cut -d '/' -f 3 | awk 'NR == 1'`"