如何确定哪个 sd* 是 USB?

Ksh*_*rma 27 linux block-device disk

可能的重复:
如何知道 /dev/sdX 是连接的 USB 还是 HDD?

ls /dev/sd*在我的系统上的输出是 -

sda  sda1  sda2  sda3  sda4  sda5  sda6  sda7  sdb  sdc  sdc1  sdc2
Run Code Online (Sandbox Code Playgroud)

我应该如何确定哪个驱动器是哪个?

Sté*_*las 26

假设您使用的是 Linux。

尝试:

sudo /lib/udev/scsi_id --page=0x80 --whitelisted --device=/dev/sdc
Run Code Online (Sandbox Code Playgroud)

或者:

cat /sys/block/sdc/device/{vendor,model}
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下命令从不同分区上的文件系统获取信息(包括标签)

sudo blkid /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

pathid 将有助于确定设备的类型:

readlink -f /sys/class/block/sdc/device
Run Code Online (Sandbox Code Playgroud)

也可以看看:

find /dev/disk -ls | grep /sdc
Run Code Online (Sandbox Code Playgroud)

哪个正常工作udev将为您提供来自上述其他命令的所有信息。

的内容/proc/partitions将为您提供有关大小的信息(尽管不是lsblk@Max 已经提到的友好格式)。

sudo blockdev --getsize64 /dev/sdc
Run Code Online (Sandbox Code Playgroud)

将为您提供相应块设备的大小(以字节为单位)。

sudo smartctl -i /dev/sdc
Run Code Online (Sandbox Code Playgroud)

(跨平台),还会为您提供很多信息,包括品牌、型号、尺寸、序列号、固件版本...


F. *_*uri 12

最终的bash示例

我编写了一小部分脚本来创建和安装实时 USB 密钥(双引导 ubuntu - debian):

第一部分USBKEYS=...是这个问题的答案

简而言之,这:

列出可移动装置,通过驱动sd和具有非零大小。

注意这个脚本使用dialog似乎没有默认安装在 Ubuntu 上。但dialog可以替换为gdialog,whiptail或 'zenity or eveneasybashbui`。

#!/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...
Run Code Online (Sandbox Code Playgroud)

示例(我刚刚连接了 3 个 U 盘——除了我的 3 个硬盘):

对话预览

替换dialoggdialog(在第 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"
Run Code Online (Sandbox Code Playgroud)

详细说明

这使用了一些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
Run Code Online (Sandbox Code Playgroud)

在我的桌子上插入三个 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
Run Code Online (Sandbox Code Playgroud)

(是我的办公桌上保持3个物理硬盘驱动器:sdasdbsdc首先移动变得sddsde)。

所以:

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
Run Code Online (Sandbox Code Playgroud)

我有可移动设备的列表,

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
Run Code Online (Sandbox Code Playgroud)

 

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
Run Code Online (Sandbox Code Playgroud)

我有由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
Run Code Online (Sandbox Code Playgroud)

 

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
Run Code Online (Sandbox Code Playgroud)

 

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
Run Code Online (Sandbox Code Playgroud)

还:

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")
Run Code Online (Sandbox Code Playgroud)

最后:

cat /sys/block/$USBKEYS/device/model
Storage Media   

cat /sys/block/${USBKEYS[2]}/device/model
silicon-power   
Run Code Online (Sandbox Code Playgroud)

printf "|%s|\n" "$(</sys/block/$USBKEYS/device/model)"
|Storage Media   |
Run Code Online (Sandbox Code Playgroud)

那是因为我写道:

echo ${USBKEYS[2]} \"$(sed -e s/\ *$//g </sys/block/${USBKEYS[2]}/device/model)\"
sde "silicon-power"
Run Code Online (Sandbox Code Playgroud)

收缩 - 打高尔夫球:

有一个缩短版

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)) <(:))) <(:))))
Run Code Online (Sandbox Code Playgroud)

(注意:<(:)通过 fork 做伪空文件:比这短/dev/null但不是真的等价)

两行和一个变量UsbSticks保存:

set | grep ^US=
US=([0]="sde" [1]="sdf" [2]="sdg")
Run Code Online (Sandbox Code Playgroud)

所以(我的开始)脚本可以变成:

#/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
Run Code Online (Sandbox Code Playgroud)


P.T*_*.T. 9

在最新版本的 Linux 上,有些/dev/disk/by-{id,label,path,uuid}目录包含指向各种 /dev/sdX 和 /dev/sdXN 条目的自动符号链接(我相信所有这些都是由 udev 设置的)。这些为您的磁盘和分区提供了更稳定和信息更丰富的名称。我发现/dev/disk/by-label/最有用的(特别是如果你标记你的文件系统分区),但by-path可能对你的用例更有用。


nas*_*ass 7

udev知道你的系统。这样你就可以打通信息udevadm,下/sys/(取决于你的发行版运行为根,或使用sudo)这样的

udevadm info -a -p /sys/block/sdb

udevadm info -a -p /sys/block/sdc
Run Code Online (Sandbox Code Playgroud)

通读输出,您会发现一些有意义的结果,例如

ATTRS{vendor}
ATTRS{model}
Run Code Online (Sandbox Code Playgroud)

你应该能够得到一些关于哪个是usb的信息。另外变量

SUBSYSTEM=="usb"
Run Code Online (Sandbox Code Playgroud)

应该给你一个很好的提示,我们正在谈论 USB。

然后读取KERNEL变量以了解哪个 sd* 设备是 USB。

其他可能有帮助的命令是lshw按连接列出所有硬件,lsusb其中列出 USB 设备但不显示已提供的 sd* 字母。同时dmesg会给你所有必要的信息,如果你键入你的USB连接到电脑之后。

这些都是 CLI 命令,如果您更喜欢像其他小伙子一样的更多 GUI,将能够在该方向上为您提供更多帮助。