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>

你可以走了。但是,有關命令的更多詳細信息,您可以查看拜爾東

相關內容