我的系统上的输出ls /dev/sd*
是 -
sda sda1 sda2 sda3 sda4 sda5 sda6 sda7 sdb sdc sdc1 sdc2
我应该如何确定哪个驱动器是哪个?
答案1
假设您使用的是 Linux。
尝试:
sudo /lib/udev/scsi_id --page=0x80 --whitelisted --device=/dev/sdc
或者:
cat /sys/block/sdc/device/{vendor,model}
您还可以使用以下命令从不同分区上的文件系统获取信息(包括标签)
sudo blkid /dev/sdc1
pathid 将有助于确定设备的类型:
readlink -f /sys/class/block/sdc/device
也可以看看:
find /dev/disk -ls | grep /sdc
如果工作正常,它将udev
为您提供上述其他命令的所有信息。
的内容将为您提供有关大小的信息(尽管不是@Max已经提到的/proc/partitions
友好格式)。lsblk
sudo blockdev --getsize64 /dev/sdc
将为您提供相应块设备的大小(以字节为单位)。
sudo smartctl -i /dev/sdc
(跨平台),还将为您提供大量信息,包括品牌、型号、尺寸、序列号、固件版本...
答案2
最终确定巴什样本
我编写了一小部分脚本来创建和安装实时 USB 密钥,(双启动 ubuntu - debian):
第一部分USBKEYS=...
是这个问题的答案
简而言之,这:
列表可拆卸的设备,由驱动
sd
并拥有非零尺寸。
笔记这个脚本dialog
似乎在 Ubuntu 上默认没有安装。但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
...
重要组成部分
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"
详细解释
这使用一些巴什主义:
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
在我的桌子上插入三个 U 盘后:
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
(即 not sr
,nor 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)) <(:))) <(:))))
(注意:<(:)
通过 fork 执行伪空文件,:
这比它短,/dev/null
但并不真正等效)
两行和一个变量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
答案3
在最新版本的 Linux 上,有些/dev/disk/by-{id,label,path,uuid}
目录包含指向各种 /dev/sdX 和 /dev/sdXN 条目的自动符号链接(我相信所有这些都是由 udev 设置的)。这些为您的磁盘和分区提供更稳定且信息丰富的名称。我发现/dev/disk/by-label/
最有用(特别是如果您标记文件系统分区),但by-path
可能对您的用例更有用。
答案4
您还可以使用lsscsi
命令打印有关连接的 SCSI 设备的各种信息(从 /proc 和 /sys 获取)。您对传输信息感兴趣,因此lsscsi -t | grep usb
会告诉您哪个设备正在使用 USB 传输。