在 Linux 上,USB 驱动器被检测为字符设备(而非块设备)?

在 Linux 上,USB 驱动器被检测为字符设备(而非块设备)?

我有一台金士顿的 DataTraveler SE9(8G,序列号:0014785448B4BCA13728002A),我自己正在运行 Pop!_OS,我似乎无法弄清楚为什么它没有被检测到。在 Windows 系统中也没有。在 GNOME 的disks实用程序中也没有检测到它。我试过了lsusb,它确实出现在那里:

 Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
 Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
 Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
 Bus 001 Device 003: ID 0bda:2852 Realtek Semiconductor Corp. Bluetooth Radio
 Bus 001 Device 002: ID 04f2:b735 Chicony Electronics Co., Ltd HP Wide Vision HD Camera
*Bus 001 Device 008: ID 0951:1689 Kingston Technology DataTraveler SE9*
 Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub

(记住它是总线 001 和设备 008,以后会用到)

但它没有出现在fdisk输出中:

Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: MTFDHBA512TDV-1AZ1AABHA                 
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: F244FCA0-47AE-4C49-B585-B9F2437DBCEC

Device              Start        End   Sectors  Size Type
/dev/nvme0n1p1       2048    3678206   3676159  1.8G EFI System
/dev/nvme0n1p2    3678208  379082751 375404544  179G Linux filesystem
/dev/nvme0n1p3  798515200  894152703  95637504 45.6G Microsoft basic data
/dev/nvme0n1p4  894152704  999010301 104857598   50G Linux filesystem
/dev/nvme0n1p5  999010304 1000202239   1191936  582M Windows recovery environmen
/dev/nvme0n1p6 1000202240 1000214526     12287    6M BIOS boot


Disk /dev/zram0: 7.09 GiB, 7617904640 bytes, 1859840 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

lsblk的输出中也没有:

NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
zram0       252:0    0   7.1G  0 disk [SWAP]
nvme0n1     259:0    0 476.9G  0 disk 
├─nvme0n1p1 259:1    0   1.8G  0 part /boot/efi
├─nvme0n1p2 259:2    0   179G  0 part /home
├─nvme0n1p3 259:3    0  45.6G  0 part 
├─nvme0n1p4 259:4    0    50G  0 part /
├─nvme0n1p5 259:5    0   582M  0 part 
└─nvme0n1p6 259:6    0     6M  0 part 

输出sudo dmesg -w确实表明至少它在某些低级别被识别为 USB:

[458632.136596] usb 1-2: new high-speed USB device number 8 using xhci_hcd
[458632.292668] usb 1-2: New USB device found, idVendor=0951, idProduct=1689, bcdDevice= 1.00
[458632.292685] usb 1-2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[458632.292691] usb 1-2: Product: DataTraveler SE9
[458632.292697] usb 1-2: Manufacturer: Kingston
[458632.292703] usb 1-2: SerialNumber: 0014785448B4BCA13728002A

最后,由于某种奇怪的原因,如果我搜索所有 /dev/ 条目,我会发现这个!( sudo ls /dev/*):

<...>
/dev/char:
<...>
lrwxrwxrwx 1 root root 18 Dec 11 11:51 189:7 -> ../bus/usb/001/008
<...>

嗯?它被检测为字符设备了吗?

我不知道这是否可以工作,但我尝试了一下 sudo mount /dev/bus/usb/001/008 /mnt ,得到了输出: mount: /mnt: /dev/bus/usb/001/008 is not a block device. 不确定这是否意味着它无法挂载,因为它不是堵塞设备,或者因为它不再是一个设备(死机)。

哦,忘了补充,它也没有分配块设备地址(没有像 /dev/sd* 这样的地址,事实上我的系统中没有带有该前缀的块设备)。

知道这里发生什么事吗?

编辑:根据@u1686_grawity的建议,以下是输出lsusb.py -ci

WARNING: Failure to read usb.ids
usb1              1d6b:0002 09 1IF  [USB 2.00,   480 Mbps,   0mA] (xhci-hcd 0000:08:00.3) hub
  1-2               0951:1689 00 1IF  [USB 2.00,   480 Mbps, 200mA] (Kingston DataTraveler SE9 0014785448B4BCA13728002A)
    1-2:1.0           (IF) 08:06:50 2EPs (Mass Storage:SCSI:Bulk-Only)  
  1-3               04f2:b735 ef 3IFs [USB 2.01,   480 Mbps, 500mA] (Chicony Electronics Co.,Ltd. HP Wide Vision HD Camera 0001)
    1-3:1.0           (IF) 0e:01:00 1EP  (Video:Video Control:None) uvcvideo video4linux/video1 video4linux/video0 
    1-3:1.1           (IF) 0e:02:00 0EPs (Video:Video Streaming:None) uvcvideo 
    1-3:1.2           (IF) fe:01:01 0EPs (Application Specific Interface:Device Firmware Update:None)  
  1-4               0bda:2852 e0 2IFs [USB 1.00,    12 Mbps, 500mA] (Realtek Bluetooth Radio 00e04c000001)
    1-4:1.0           (IF) e0:01:01 3EPs (Wireless:Radio Frequency:Bluetooth) btusb bluetooth/hci0 
    1-4:1.1           (IF) e0:01:01 2EPs (Wireless:Radio Frequency:Bluetooth) btusb 
usb2              1d6b:0003 09 1IF  [USB 3.10, 10000 Mbps,   0mA] (xhci-hcd 0000:08:00.3) hub
usb3              1d6b:0002 09 1IF  [USB 2.00,   480 Mbps,   0mA] (xhci-hcd 0000:08:00.4) hub
usb4              1d6b:0003 09 1IF  [USB 3.10, 10000 Mbps,   0mA] (xhci-hcd 0000:08:00.4) hub

答案1

如果这种情况仅发生在 Linux 上,最常见的答案就是缺少必要的驱动模块(例如内核升级不完整)。

但考虑到它也发生在 Windows 上,可以安全地假设故障出在 USB 驱动器的固件中;也就是说,闪存驱动器处于死机状态,你可能对此无能为力。

嗯?它被检测为字符设备了吗?

它同时被“检测为”字符设备低等级lsusb 正在处理此问题。/dev/bus 中的设备节点允许您访问“原始”USB 设备,您可以在其中发送自定义 USB 请求块。这是并不互相排斥它被检测为上层的 USB 大容量存储设备,以及上几层的 SCSI 块设备;如果您连接任何可以正常工作的 USB 记忆棒 - 或者 USB 鼠标,您将拥有相同的 /dev/bus。

(“检测为”是因为这绝对不是 USB 设备的工作方式 - 它们不会说“我是字符设备”或“我是块设备”;两者之间可能有五层。USB 设备被询问以列出它支持的“接口”,然后每个接口都会分配一个适当的驱动程序,然后驱动程序根据需要创建一个设备节点 - 或连接到更高层的驱动程序。因此,您会得到一个块设备,因为这是“SCSI 磁盘”驱动程序使用的,而 SCSI 驱动程序的存在是因为“大容量存储”USB 接口。)

您可以使用它lsusb.py -ci来获取每个 USB 设备声称公开的所有接口的列表。(该程序是 usbutils 的一部分,与 lsusb 相同,但您可能需要直接从 GitHub 下载它,因为某些发行版不喜欢它是 Python,但它提供了非常方便的 USB 设备和接口概述。)

USB 设备切换到报告 0 大小介质或根本没有介质的模式是很常见的(就像没有 CD 的 CD 驱动器一样)。这些设备仍会创建 SCSI 块设备,但“lsblk”工具会故意将其视为空设备而跳过。但完全无法显示为块设备的情况也并非闻所未闻。

分区错误的驱动器是否也无法工作

否;典型的分区是在块设备之上的一层进行的。整个 USB 棒呈现为单个线性存储设备,其中操作系统存储分区表以供其自身使用(使用几种格式之一)并在其上创建更多块设备。当您在 diskmgmt.msc 或 GNOME Disks 中编辑分区时,您实际上所做的只是更改磁盘扇区 0 或 1 中的数据。

(有一种不同的分区方式,会导致驱动器暴露几个单独的块设备(SCSI LUN),某些 USB 驱动器(包括金士顿的一些产品)有一个“制造商”工具可以实现这一点。但这是不是通过 GNOME 磁盘进行的分区类型。

相关内容