私のシステムでのls /dev/sd*
の出力は-
sda sda1 sda2 sda3 sda4 sda5 sda6 sda7 sdb sdc sdc1 sdc2
どのドライブがどれであるかをどのように判断すればよいですか?
Linuxを使用していると仮定します。
試してください:
Sudo /lib/udev/scsi_id --page=0x80 --whitelisted --device=/dev/sdc
または:
cat /sys/block/sdc/device/{vendor,model}
また、さまざまなパーティションのファイルシステムから情報(ラベルを含む)を取得することもできます。
Sudo blkid /dev/sdc1
パスIDは、デバイスのタイプを判別するのに役立ちます。
readlink -f /sys/class/block/sdc/device
以下も参照してください。
find /dev/disk -ls | grep /sdc
正しく機能するudev
を使用すると、上記の他のコマンドからのすべての情報が得られます。
/proc/partitions
のコンテンツは、サイズに関する情報を提供します(ただし、@ Maxですでに言及されているlsblk
ほどわかりやすい形式ではありません)。
Sudo blockdev --getsize64 /dev/sdc
対応するブロックデバイスのサイズをバイト単位で示します。
Sudo smartctl -i /dev/sdc
(クロスプラットフォーム)、メーカー、モデル、サイズ、シリアル番号、ファームウェアのリビジョンなどの多くの情報も提供します...
私が作成してインストールするために記述したスクリプトの一部があります live usb key 、(dual boot ubuntu-debian):
最初の部分_USBKEYS=...
_はこの質問に対する答えです
要するに、これ:
リスト取り外し可能デバイス、
sd
および非ゼロのサイズ。
注このスクリプトは、Ubuntuにデフォルトでインストールされていないように見えるdialog
を使用します。ただし、dialog
はgdialog
、whiptail
または 'zenity _or even
_ easybashbui`に置き換えることができます。
_#!/bin/bash
export USBKEYS=($(
grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
))
export STICK
case ${#USBKEYS[@]} in
0 ) echo No USB Stick found; exit 0 ;;
1 ) STICK=$USBKEYS ;;
* )
STICK=$(
bash -c "$(
echo -n dialog --menu \
\"Choose wich USB stick have to be installed\" 22 76 17;
for dev in ${USBKEYS[@]} ;do
echo -n \ $dev \"$(
sed -e s/\ *$//g </sys/block/$dev/device/model
)\" ;
done
)" 2>&1 >/dev/tty
)
;;
esac
[ "$STICK" ] || exit 0
echo $STICK...
_
サンプル(3つのハードディスクに加えて、3つのUSBスティックを接続したところ):
dialog
をgdialog
(24行目)で置き換えると、次のようになります。
しかし、構文はwhiptail
...のような他のdialogユーティリティで使用できます。
_export USBKEYS=($(
grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
))
for dev in ${USBKEYS[@]} ;do
echo $dev \"$(
sed -e s/\ *$//g </sys/block/$dev/device/model
)\" ;
done
sdd "Storage Media"
sde "Freecom Databar"
sdf "silicon-power"
_
これはいくつかのbashismsを使用します:
_export USBKEYS=($( # Declaration of *array* 'USBKEYS'
grep -Hv ^0$ /sys/block/*/removable | # search for *not 0* in `removable` flag of all devices
sed s/removable:.*$/device\\/uevent/ | # replace `removable` by `device/uevent` on each line of previous answer
xargs grep -H ^DRIVER=sd | # search for devices drived by `SD`
sed s/device.uevent.*$/size/ | # replace `device/uevent` by 'size'
xargs grep -Hv ^0$ | # search for devices having NOT 0 size
cut -d / -f 4 # return only 4th part `/` separated
))
for dev in ${USBKEYS[@]} ;do # for each devices in USBKEY...
echo $dev \"$(r # echo device name and content of model file
sed -e s/\ *$//g </sys/block/$dev/device/model
)\" ;
done
_
私の机に3本のUSBスティックを挿入した後:
_grep -H . /sys/block/*/removable
/sys/block/loop0/removable:0
/sys/block/loop1/removable:0
...
/sys/block/sdc/removable:0
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1
_
(はい、私のデスクには3つの物理ハードドライブがあります:sda
、sdb
およびsdc
。最初のリムーバブルディスクはsdd
およびsde
になります)。
そう:
_grep -Hv ^0$ /sys/block/*/removable
/sys/block/sdd/removable:1
/sys/block/sde/removable:1
/sys/block/sdf/removable:1
/sys/block/sr0/removable:1
_
取り外し可能なデバイスのリストがあります、
_grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/
/sys/block/sdd/device/uevent
/sys/block/sde/device/uevent
/sys/block/sdf/device/uevent
/sys/block/sr0/device/uevent
_
_grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd
/sys/block/sdd/device/uevent:DRIVER=sd
/sys/block/sde/device/uevent:DRIVER=sd
/sys/block/sdf/device/uevent:DRIVER=sd
_
sd
ドライバーによって駆動されるリムーバブルデバイスのリストがあります(つまり、sr
でもfloppy
でもありません)
_grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/
/sys/block/sdd/size
/sys/block/sde/size
/sys/block/sdf/size
_
_grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$
/sys/block/sdd/size:15224832
/sys/block/sde/size:7834944
/sys/block/sdf/size:7831552
_
_grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
sdd
sde
sdf
_
また:
_export USBKEYS=($(
grep -Hv ^0$ /sys/block/*/removable |
sed s/removable:.*$/device\\/uevent/ |
xargs grep -H ^DRIVER=sd |
sed s/device.uevent.*$/size/ |
xargs grep -Hv ^0$ |
cut -d / -f 4
))
set | grep ^USBKEYS=
USBKEYS=([0]="sdd" [1]="sde" [2]="sdf")
_
そして最後に:
_cat /sys/block/$USBKEYS/device/model
Storage Media
cat /sys/block/${USBKEYS[2]}/device/model
silicon-power
_
だが
_printf "|%s|\n" "$(</sys/block/$USBKEYS/device/model)"
|Storage Media |
_
それは私が書いたからです:
_echo ${USBKEYS[2]} \"$(sed -e s/\ *$//g </sys/block/${USBKEYS[2]}/device/model)\"
sde "silicon-power"
_
短縮版があります
_US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))
_
(注意:<(:)
_:
_へのフォークによって疑似空のファイルを作成しますこれは_/dev/null
_より短いですが、実際には同等ではありません)
2行と1つの変数UsbSticks
の保持:
_set | grep ^US=
US=([0]="sde" [1]="sdf" [2]="sdg")
_
したがって、(私の始めの)スクリプトは次のようになります。
_#/bin/bash
US=($(cut -d/ -f4 <(grep -vl ^0$ $(sed s@device/.*@size@ <(grep -l ^DRIVER=sd $(
sed s+/rem.*$+/dev*/ue*+ <(grep -Hv ^0$ /sys/block/*/removable)) <(:))) <(:))))
case ${#US[@]} in 0)echo "No USB stick found.";exit 0;;1)S=$US;;*)S=$(sh -c "$(
sed -nre 's@/sys/block/(.*)/device/model:(.*)$@\1 "\2"@;H;${x;s/\n/ /g;
s/^/whiptail --menu "Choose an USB stick" 22 76 14/;p}' <(grep -H . $(
printf /sys/block/%s/device/model\\n ${US[@]})))" 2>&1 >/dev/tty) ;; esac
whiptail --defaultno --yesno "Could I destroy content of $S!?" 10 70 6 || exit 0
_
最近のバージョンのLinuxには、さまざまな/ dev/sdXおよび/ dev/sdXNエントリへのオートマジックシンボリックリンクを含む/dev/disk/by-{id,label,path,uuid}
ディレクトリがあります(これらはすべてudevによって設定されていると思います)。これらは、ディスクとパーティションに、より安定した有益な名前を提供します。私は/dev/disk/by-label/
が最も便利だと思います(特にファイルシステムパーティションにラベルを付ける場合)が、by-path
の方がユースケースに役立つ場合があります。
udev
はシステムを認識しています。 /sys/
の下でudevadm
を介してこのように情報を取得できます(rootとして実行するか、ディストリビューションに応じてSudoを使用して)
udevadm info -a -p /sys/block/sdb
udevadm info -a -p /sys/block/sdc
出力を読むと、次のような意味のある結果が出てきます。
ATTRS{vendor}
ATTRS{model}
あなたはどれがUSBであるかについていくつかの情報を得ることができるはずです。さらに、変数
SUBSYSTEM=="usb"
私たちがUSBについて話している素敵な大きなヒントをあなたに与えるはずです。
次に、KERNEL
変数を読んで、どのsd *デバイスがUSBであるかを理解します。
役立つ他のコマンドは、すべてのハードウェアを接続別に一覧表示するlshw
です。lsusb
は、USBデバイスを一覧表示しますが、提供されたsd *文字は表示しません。また、dmesg
は、USBをコンピューターに接続した直後に入力すると、必要なすべての情報を提供します。
これらはすべてCLIコマンドです。他の若者のようなGUIを使用すると、その方向でより多くのことを支援できます。
接続されたSCSIデバイス(/ procおよび/ sysから取得)に関するさまざまな情報を出力するlsscsi
コマンドを使用することもできます。あなたは輸送情報に興味があるので、lsscsi -t | grep usb
は、USBトランスポートを使用しているデバイスを通知します。
パーティションの数が多い場合、システムドライブがsda
である可能性が非常に高いです。これを確認するには、mount
、df -h
、またはlsblk
の出力を使用して、/
の場所を探すことができます。そのドライブを避けてください。
それ以外は、sdb
とsdc
の両方が有効な候補です。それらをマウントして内容を確認するのが最も安全な方法です。スティックを引き、どれが消えるかを監視する(または、再挿入した後のdmesg
の出力と比較する)と同じくらい簡単です(取得した/dev/
の名前がわかるはずです)。
ドライブがシステムの実行を維持するために必要ではないと想定した私のお気に入りは、システム内のUSBドライブがある場合とない場合のディレクトリ一覧を比較することです。
簡単な方法の1つは、/ dev/disk/by-id /を調べることです。これには、システム内のすべての実際のドライブおよびパーティションデバイスノードを指すシンボリックリンクファームが含まれます。シンボリックリンク名は、ドライブのインターフェースタイプ、ブランドとモデル、およびシリアル番号を識別し、各ドライブの永続的な一意の識別子として使用できます。
例えば
$ ls -lF /dev/disk/by-id/usb-Generic_Flash_Disk*
lrwxrwxrwx 1 root root 9 Jan 5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0 -> ../../sdo
lrwxrwxrwx 1 root root 10 Jan 5 11:10 /dev/disk/by-id/usb-Generic_Flash_Disk_CAAE91F7-0:0-part1 -> ../../sdo1
もちろんこれはワイドカラムターミナルではるかに良く見えます:)
次のエイリアスは、システム内のすべてのディスク(パーティションではない)のクイックリストを取得するのに役立ちます。
alias list_disks='ls -lF /dev/disk/by-id/{scsi,usb}-* | grep sd.$'
私のホームzfsonlinuxファイルサーバーからの出力例を含めたはずですが、ここでは見苦しいように見えます。テキストフィールドの幅が十分に広くありません。