目前这个问题还没有答案。
通常在读取或写入块设备出现一些问题后,内核决定将整个设备的标志切换为只读。此后,对该设备上的任何分区/文件系统的任何写入都会导致将其与设备状态一起切换为只读,因为任何写入都是不可能的。
来自 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 是只读的。
根据我的经验,这种情况会发生在以下情况:
- 硬盘确实损坏了。返回的写入问题取决于硬盘状况
- 主机过载,然后linux guest虚拟硬盘写入超时
- FC 电缆或 SAN 设备(基于光纤通道的阵列磁盘)过载
- 通过 FC 或 FCoE 暂时丢失连接。可能丢失/超时 FC 数据包
在这种情况下,设备实际上是可读写的,但Linux内核在内部将该设备标记为只读,并以只读方式使用。这是为防止损坏而设计的内核功能,但仅在第 1 点可用。
问题是。如何手动告诉内核,hdd块设备运行正常?
如果没有这个,内核将设备视为只读,如“CD-ROM”,并且其他命令都没有机会正常工作,包括 mount/remount -o read-write 、 fsck 等。
无法使用的答案,确实是来自想要提供帮助但不了解问题本质的人的垃圾邮件:
- 尝试重新挂载为读写(不可能,设备是 RO)
- fsck 这个(有什么用?设备是 RO,无法修复)
- “我不知道”(首先有道理,但无用)
- “更换您的设备”*(通常问题是其他原因)
有人有上面问题的公式吗?可写块设备的切换标志,将其从只读状态恢复为读写状态?这个时候似乎没人知道怎么办。
这是一些解决方法,但通常是半可用或不可用:
- 删除模块支持访问指定的硬盘或存储阵列。不幸的是,通常损坏的设备会保留 rootfs,或者驱动程序同时保留损坏的设备和保留 rootfs 的设备
- 删除对设备的 FC 访问并再次加入 (fctools),并非总是可行,也并非总是有效。
- 重新启动整个机器。通常只有这才是可能的,而我们总是被迫这样做。
在第 1 点和第 2 点,我们告诉内核我们完全断开设备连接并再次连接到它。内核将此识别为加入新的正常运行设备。我们可以使用 USB 设备来模拟这一点并暂时断开电源。第 3 点是最后机会,通常有效。但为什么我们要重新启动一切呢?不幸的是,我们在所有方面都丢失了所有日志更新和脏缓冲区。
请注意,在相同的情况下,我使用 Windows(桌面和服务器)没有任何问题。
答案1
尝试使用blockdev --setrw
或hdparm -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
###您好,以下命令可以提供帮助。但是,卸载或尝试修改正在运行的驱动器的根文件系统并不安全。相反,从可启动设备启动系统。
- 在系统上找到驱动器
$ mount | grep /dev/
- 卸载驱动器
$ sudo umount <your-mount-point-name>
- 使用以下任意命令检查并修复文件系统
###对于 ext4 设备
$ sudo fsck.ext4 -f /dev/sda1
###对于 dos 设备
$ sudo dosfsck -a /dev/sda1
###或者您可以简单地运行fsck
命令。
$ sudo fsck /dev/sda1
- 重新安装设备
$ 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>
你可以走了。但是,有关命令的更多详细信息,您可以查看拜尔东