Linux,如何在暂时崩溃后将硬盘状态从只读更改为只读?

Linux,如何在暂时崩溃后将硬盘状态从只读更改为只读?

目前这个问题还没有答案。

通常在读取或写入块设备出现一些问题后,内核决定将整个设备的标志切换为只读。此后,对该设备上的任何分区/文件系统的任何写入都会导致将其与设备状态一起切换为只读,因为任何写入都是不可能的。

来自 dmesg 的示例,这是当 defrag 获取来宾设备映像时使用 VirtualBox 对 Windows8 上的来宾 Linux 进行的模拟:

[11903.002030] ata3.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x6 frozen
[11903.003179] ata3.00: failed command: READ FPDMA QUEUED
[11903.003364] ata3.00: cmd 60/08:00:a8:77:57/00:00:00:00:00/40 tag 0 ncq 4096 in
[11903.003385]          res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[11903.004074] ata3.00: status: { DRDY }
[11903.004248] ata3: hard resetting link
[11903.325703] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[11903.327097] ata3.00: configured for UDMA/133
[11903.328025] ata3.00: device reported invalid CHS sector 0
[11903.329664] ata3: EH complete
[11941.000472] ata3.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x6 frozen
[11941.000769] ata3.00: failed command: READ FPDMA QUEUED
[11941.000952] ata3.00: cmd 60/08:00:c8:77:57/00:00:00:00:00/40 tag 0 ncq 4096 in
[11941.000961]          res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
[11941.001353] ata3.00: status: { DRDY }
[11941.001504] ata3: hard resetting link
[11941.320297] ata3: SATA link up 3.0 Gbps (SStatus 123 SControl 300)
[11941.321252] ata3.00: configured for UDMA/133
[11941.321379] ata3.00: device reported invalid CHS sector 0
[11941.321553] ata3: EH complete
[11980.001746] ata3.00: exception Emask 0x0 SAct 0x11fff SErr 0x0 action 0x6 frozen
[11980.002070] ata3.00: failed command: WRITE FPDMA QUEUED
[11980.002255] ata3.00: cmd 61/18:00:28:23:59/00:00:00:00:00/40 tag 0 ncq 12288 out
[11980.002265]          res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)
-------------------
There are many other errors, like "lost write page", "Journal has aborted", "Buffer I/O error", "hard resetting link" and many others.

之后,重新安装原因:

mount / -o remount,rw
mount: cannot remount block device /dev/sda1 read-write, is write-protected

因为保留 rootfs sda1 的整个设备 sda 是只读的。

根据我的经验,这种情况会发生在以下情况:

  1. 硬盘确实损坏了。返回的写入问题取决于硬盘状况
  2. 主机过载,然后linux guest虚拟硬盘写入超时
  3. FC 电缆或 SAN 设备(基于光纤通道的阵列磁盘)过载
  4. 通过 FC 或 FCoE 暂时丢失连接。可能丢失/超时 FC 数据包

在这种情况下,设备实际上是可读写的,但Linux内核在内部将该设备标记为只读,并以只读方式使用。这是为防止损坏而设计的内核功能,但仅在第 1 点可用。

问题是。如何手动告诉内核,hdd块设备运行正常?

如果没有这个,内核将设备视为只读,如“CD-ROM”,并且其他命令都没有机会正常工作,包括 mount/remount -o read-write 、 fsck 等。

无法使用的答案,确实是来自想要提供帮助但不了解问题本质的人的垃圾邮件:

  1. 尝试重新挂载为读写(不可能,设备是 RO)
  2. fsck 这个(有什么用?设备是 RO,无法修复)
  3. “我不知道”(首先有道理,但无用)
  4. “更换您的设备”*(通常问题是其他原因)

有人有上面问题的公式吗?可写块设备的切换标志,将其从只读状态恢复为读写状态?这个时候似乎没人知道怎么办。

这是一些解决方法,但通常是半可用或不可用:

  1. 删除模块支持访问指定的硬盘或存储阵列。不幸的是,通常损坏的设备会保留 rootfs,或者驱动程序同时保留损坏的设备和保留 rootfs 的设备
  2. 删除对设备的 FC 访问并再次加入 (fctools),并非总是可行,也并非总是有效。
  3. 重新启动整个机器。通常只有这才是可能的,而我们总是被迫这样做。

在第 1 点和第 2 点,我们告诉内核我们完全断开设备连接并再次连接到它。内核将此识别为加入新的正常运行设备。我们可以使用 USB 设备来模拟这一点并暂时断开电源。第 3 点是最后机会,通常有效。但为什么我们要重新启动一切呢?不幸的是,我们在所有方面都丢失了所有日志更新和脏缓冲区。

请注意,在相同的情况下,我使用 Windows(桌面和服务器)没有任何问题。

答案1

尝试使用blockdev --setrwhdparm -r 0

答案2

就像 Jose Luis Martin 建议使用 blockdev 一样,我的 2cent 是重新挂载 rw 和 forcefsck

(假设sda是你的磁盘)

blockdev --setrw /dev/sda
mount /dev/sda -o remount,rw
touch /forcefsck

答案3

检查此 wiki 页面,它解释了 libata 引发的错误:

https://ata.wiki.kernel.org/index.php/Libata_error_messages

从我上面看到的,您遇到了超时问题,并且根据提到的文档:

控制器无法响应活动的 ATA 命令。这可能有多种原因。大多数情况下,这是由于不相关的中断子系统错误(尝试使用“pci=nomsi”或“acpi=off”或“noapic”启动),当我们期望来自硬件的中断时,该错误未能提供中断。

您可能想要禁用 ACPI(根据您的发行版检查如何操作)或检查内核是否存在已知错误,如果不是最新的,则可能需要更新它(或降级)。

答案4

###您好,以下命令可以提供帮助。但是,卸载或尝试修改正在运行的驱动器的根文件系统并不安全。相反,从可启动设备启动系统。

  1. 在系统上找到驱动器
$ mount | grep /dev/
  1. 卸载驱动器
$ sudo umount <your-mount-point-name>
  1. 使用以下任意命令检查并修复文件系统

###对于 ext4 设备

$ sudo fsck.ext4 -f /dev/sda1

###对于 dos 设备

$ sudo dosfsck -a /dev/sda1

###或者您可以简单地运行fsck命令。

$ sudo fsck /dev/sda1
  1. 重新安装设备
$ sudo mkdir <your-mount-point-name>

这将创建一个新的安装点。然后运行:

$ sudo mount -o rw,uid=1000,gid=1000,user,exec,umask=003,blksize=4096 /dev/sdc1 /media/<your-mount-point-name>

你可以走了。但是,有关命令的更多详细信息,您可以查看拜尔东

相关内容