USB 关闭写保护

noo*_*oob 103 usb

我有一个写保护的 USB:

dmesg | tail

[10098.126089] sd 7:0:0:0: [sdb] Write Protect is on
[10098.126098] sd 7:0:0:0: [sdb] Mode Sense: 23 00 80 00
[10098.126779] sd 7:0:0:0: [sdb] No Caching mode page present
[10098.126788] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[10098.131418] sd 7:0:0:0: [sdb] No Caching mode page present
[10098.131425] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[10098.133335]  sdb: sdb1
[10098.135509] sd 7:0:0:0: [sdb] No Caching mode page present
[10098.135515] sd 7:0:0:0: [sdb] Assuming drive cache: write through
[10098.135521] sd 7:0:0:0: [sdb] Attached SCSI removable disk
Run Code Online (Sandbox Code Playgroud)

如何关闭写保护?

我试过的

  1. 检查它是否有硬件开关 - 没有
  2. 尝试在 Windows 和 Linux 上对其进行格式化(也通过终端)
  3. 试过fdisk|chmod
  4. 尝试使用 Ubuntu 软件中心的多种工具解决此问题
  5. 使用谷歌,已经看到大约 10,000 个关于这个问题的讨论,但他们从未解决过

附加信息

fsck -n /dev/sdb1

fsck from util-linux 2.19.1
dosfsck 3.0.9, 31 Jan 2010, FAT32, LFN
There are differences between boot sector and its backup.
Differences: (offset:original/backup)
  65:01/00
  Not automatically fixing this.
Free cluster summary wrong (968250 vs. really 911911)
  Auto-correcting.
Leaving file system unchanged.
/dev/sdb1: 50 files, 93653/1005564 clusters
Run Code Online (Sandbox Code Playgroud)

fdisk -l

   Device  boot.   Start        End      Blocks   Id  System
/dev/sdb1            32     8060927     4030448    b  W95 FAT32
Run Code Online (Sandbox Code Playgroud)

umount /dev/sdb1

mkfs -t vfat /dev/sdb1

mkfs.vfat 3.0.9 (31 Jan 2010)
mkfs.vfat: unable to open /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

小智 93

要关闭磁盘设备的写保护,我们使用低级系统实用程序 hdparm,如下所示:

sudo hdparm -r0 /dev/sdb
Run Code Online (Sandbox Code Playgroud)

我们假设这/dev/sdb是我们正在处理的物理磁盘设备。如果设备有以只读方式挂载的分区,您应该将它们重新挂载为可读写,以便向它们写入数据。

希望有帮助。

  • 它显示“只读 = 0(关闭)”,但我仍然无法写入或格式化。 (104认同)
  • 您可以通过在此处键入该命令来找到解释 > http://explainshell.com/ (4认同)
  • @lliseil 很可能是读卡器的写保护开关被插入其中的卡压住了,通常是卡上的卡舌,但开关(不是卡舌)可能会弯曲并卡住。您可以通过切断写保护开关引脚来固定 SD 卡读卡器,这些引脚与卡上的锁片有物理接触。当读卡器中的开关打开时,写保护关闭,当它关闭时(通过按下卡上的标签)写保护打开。移除一个或两个开关金属臂将永久禁用阅读器上的写保护。 (3认同)
  • @OP我和你有一样的,那就是:sdxc卡安装为只读,无论计算机是什么;`hdparm -r` 显示“1 - on”,然后使用“r0”解锁后:“0 - off”,但无论如何都以只读方式挂载。但是将我的 SanDisk SD 卡安装在*另一个*适配器中,我可以将其安装为读写。事实证明,我的两个 microSD 转 SD 适配器的两个连接器之间的插针已损坏。无论我做什么,这两个都会以只读方式安装。感谢@Angel_Genchev,他的回答最具权威性。 (2认同)

Chu*_*k R 36

在研究了您的问题后,这似乎是某些品牌的 USB 闪存驱动器(一些较旧的三星、金士顿型号)的一个并不少见的问题,它基本上会无缘无故地“胡说八道”。人们曾尝试打开它们并跳过两条引线(可能是从一个片状开关?)无济于事。如果你还有这个驱动器并且它还在保修期内,我会把它退回并更换。

我不想告诉你这个坏消息 =\ 但在这种情况下你似乎不太走运,因为我读到的所有内容都指向硬件故障。

2016 年 5 月 27 日编辑:我个人遇到了一个问题,最近我的闪存驱动器脱落。就我而言,这是一个 Corsair Flash Voyager 128GB,它开始显着降低我的速度。虽然它没有显示这里提到的症状,但它偶尔不会安装并显示为“硅电源”设备。这是由于驱动器累积了大量坏扇区并进入诊断/编程模式的结果。由于这是我更受欢迎的答案之一,而且这也属于“闪存驱动器故障”的范畴,我想我会将它包含在这里以供参考。

更新 2:关于 Corsair Flash Voyager,我把我的送去进行 RMA,结果我的第二个以同样的方式失败了。问题实际上是机械问题。滑动机构似乎对PCB施加了少量压力。通常,这不会对设备的正常使用寿命造成问题。但是对于这个特殊的模型,它的焊点似乎很弱,滑动动作产生的压力会加剧——导致裂纹接头氧化并最终失效。我没有再做一次 RMA,而是将事情掌握在自己手中。我打开外壳,刮掉一些塑料外壳,给 PCB 一些摆动空间,然后回流 NAND 芯片以修复损坏的焊点。直到今天它都很好用!

  • @AboobackerMk 如果是答案,那就是答案。:) (8认同)
  • @Tachyons“是否允许这种类型的答案?” stackexchange 上的人们一直试图诋毁其他人的问题或答案是怎么回事?这个答案显然是一个有效的答案;因为 jrg 说的原因。 (7认同)
  • @admins:我想知道是否允许这种类型的答案:) (5认同)

Rin*_*ail 26

使用fdisk -l定位驱动器,即:/dev/sdc1

现在

umount /dev/sdc1
Run Code Online (Sandbox Code Playgroud)

最后,重新格式化闪存驱动器

sudo mkfs -t vfat /dev/sdc1

我发现这又快又容易。在尝试格式化之前,请务必卸载驱动器。

  • 已卸载...但是`mkfs.vfat 3.0.9(2010 年 1 月 31 日)mkfs.vfat:无法打开 /dev/sdb1` (10认同)
  • 它说`mkfs.vfat:无法打开/dev/sdc:只读文件系统` (3认同)
  • sudo mkfs -t vfat /dev/sdc1 > 大多数博客都这么说,但人们说它不起作用,让我们看看它是否起作用。 (2认同)

and*_*ien 21

Angel 的回答很好,但实际的命令对我来说并不那么容易。这是有效的:插入卡(我的是一张带有手动写保护开关的 SD 卡,但开关是关闭的,它可以在 Windows 机器上写入)。Ubuntu 自动将其挂载在 /media/andrew/6AB0-1FD91 上,dmesg 显示该分区为 /dev/sdb1。

卸载它,并使其可写

sudo umount /dev/sdb1
sudo hdparm -r0 /dev/sdb
Run Code Online (Sandbox Code Playgroud)

创建一个新的挂载点并将其挂载在那里(/etc/passwd 中我的用户 ID 为 1000)

sudo mkdir /media/andrew/temp
sudo mount -o uid=1000 /dev/sdb1 /media/andrew/temp
Run Code Online (Sandbox Code Playgroud)

它仍然会抱怨它是只读的。我不知道为什么我必须在安装之前和之后更改此标志,但这是对我有用的唯一方法。再次将其设置为可写,并在同一位置重新安装

sudo hdparm -r0 /dev/sdb1
sudo mount -o remount,rw /dev/sdb1
Run Code Online (Sandbox Code Playgroud)

现在我可以以普通用户的身份写入磁盘。我对它非常小心,以防它实际上失败了,但是这些命令使我能够完成我正在做的事情。

  • 这对我有用,上面没有其他... (2认同)

kri*_*ous 18

到目前为止提供的这些答案都不正确。

要真正使其工作,您可以使用 USB quirks 设置覆盖宣布其为只读的 USB 磁盘的检测。这是它的工作原理。

1)插入USB设备并执行lsusb,例如:

$ lsusb
Bus 002 Device 012: ID 0781:5583 SanDisk Corp. 
Run Code Online (Sandbox Code Playgroud)

2) 记下冒号之间的那两个代码(称为idVendoridProduct)。拔下 USB 设备。

3)删除usb_storage内核模块(假设它被编译为一个模块)

$ sudo modprobe -r $(lsmod | sed -n 's:,: :g ; s,^usb_storage[ 0-9]*,,p') usb_storage
Run Code Online (Sandbox Code Playgroud)

4) 现在我们将使用 quirks 模式设置将模块放回原处,以覆盖设备只写标志的检测。

从来自 v4.19 的source/drivers/usb/storage/usb.c# L572 中,您可以看到我们正在寻找的 quirks 模式设置是w. 下面是我们将如何重新加载内核模块:

$ sudo modprobe usb_storage quirks=0781:5583:w
Run Code Online (Sandbox Code Playgroud)

将冒号之间的数字替换为您在上述步骤 (1) 中看到的数字。

5) 重新插入 USB 存储设备。我们现在可以使用 dmesg 确认这有效:

前: 坏了只写

之后: 工作读/写

同样在发出 mount 命令后,您将看到:

/dev/sdb1 on /usb type ext4 (rw,relatime)

现在马上把你的东西从那个磁盘上拿下来,它失败了。