可移动 U 盘在 /sys/block 中列为不可移动?

Mou*_*inX 5 automounting usb-drive removable-storage

在我的问题Bash 脚本输出到 USB 闪存棒的路径中,我遇到了一个似乎没有其他人遇到的问题。(这个问题也阻碍了我使用这个答案的愿望。)

所以我把那个具体问题变成了这个新问题。

显然/sys/block以 1 结尾的可移动设备。这里和本站点的其他几个地方都说明了这一点,我在上面引用的答案中使用了这一原则。

我的可移动设备 Sandisk 64GB 闪存棒被列为:

/sys/block/sdl/removable:0
Run Code Online (Sandbox Code Playgroud)

显然,可移动设备应该以 1 结尾(我的其他人也是如此)。为什么我的 U 盘不符合规则?

它是由 Dolphin 自动安装的。我正在运行 Kubuntu 12.04。

Dolphin 将其显示为“59.6GiB 可移动媒体”。

它安装(自动)在 /media/me/70E8-1567

sudo blkid 显示为:

/dev/sdl1: UUID="70E8-1567" TYPE="vfat".
Run Code Online (Sandbox Code Playgroud)

lsblk -do name,rm 显示:

sdl   0
Run Code Online (Sandbox Code Playgroud)

lsusb -vv显示:

Bus 001 Device 008: ID 0781:5530 SanDisk Corp. Cruzer
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0 (Defined at Interface level)
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0        64
  idVendor           0x0781 SanDisk Corp.
  idProduct          0x5530 Cruzer
  bcdDevice            2.01
  iManufacturer           1 
  iProduct                2 
  iSerial                 3 
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           32
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              200mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           2
      bInterfaceClass         8 Mass Storage
      bInterfaceSubClass      6 SCSI
      bInterfaceProtocol     80 Bulk-Only
      iInterface              0 
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               1
Run Code Online (Sandbox Code Playgroud)

F. *_*uri 2

USB 可移动存储选择器:USBKeyChooser

重写于 2022 年 1 月 5 日:

USBKEYS=()
while read _{,,,,,,} dev _ rdev;do
    [[ $rdev == */usb[0-9]* ]] &&
    grep -q '^DRIVER=sd$' /sys/block/$dev/device/uevent &&
    (( $(</sys/block/$dev/size) )) &&
    (( $(</sys/block/$dev/removable) )) &&
    USBKEYS+=($dev)
done < <(/bin/ls --color=never -g /sys/block)
Run Code Online (Sandbox Code Playgroud)

倒带:

在这个我

  • 确保这是USB

  • 确保设备可拆卸

  • 确保它作为硬盘驱动器(而不是 CD-Rom)工作

  • 确保它们的大小大于 0(不是空的读卡器)

细则:usbKeyChooser

我的实时安装程序中有usbKeyChooser子例程的最终版本:

#!/bin/bash
DIALOG=whiptail

usbKeyChoose() {
    while [ ! -b /dev/$STICK ] ;do
        USBKEYS=()
        while read _{,,,,,,} dev _ rdev;do
            [[ $rdev == */usb[0-9]* ]] &&
            grep -q '^DRIVER=sd$' /sys/block/$dev/device/uevent &&
            (( $(</sys/block/$dev/size) )) &&
            (( $(</sys/block/$dev/removable) )) &&
            USBKEYS+=($dev)
        done < <(/bin/ls --color=never -g /sys/block)

        (( ${#USBKEYS[@]} )) &&
            title="Choose wich USB stick have to be installed" ||
            title="No key found"

        menu=(R "Re scan devices")
        for dev in ${USBKEYS[@]} ;do
            read model </sys/block/$dev/device/model
            menu+=($dev "$model")
        done
        ans=$($DIALOG --menu "$title" 21 72 14 "${menu[@]}" 2>&1 >/dev/tty)
        if [ ! "$ans" ]; then echo "User aborted."; return 1; fi
        [[ $ans == R ]] || STICK=$ans
    done
} 
usbKeyChoose
[[ $0 == "$BASH_SOURCE" ]] && [[ $STICK ]] && echo $STICK
true
Run Code Online (Sandbox Code Playgroud)

我喜欢这个循环解决方案,因为它们

  • 让我们插入许多键,
  • 等待内核注册,
  • 有效的选择,
  • 默认为空并且
  • 允许用户中止。

无论如何,即使用户做了错误的ok选择,下一个屏幕也是另一个选择,询问用户必须在默认创建新图像的键上写入哪个图像,这是一个非常漫长的过程,用户可以点击+Ctrlc