天天看點

記一次系統磁盤隻讀錯誤

作者:GavinDjp

問題現象

應用系統在建立檔案失敗,檢視報錯日志,錯誤資訊為檔案系統隻讀。

排查過程

1、 檢查磁盤空間是否占滿;

通過 df -h 檢視各分區使用情況。

分區磁盤使用率在50% 以下,排除。

2、 确認是否應該主備切換導緻的隻讀;

确認系統是否類keepalive 主備模式,排除因master節點異常,導緻slave 節點切主但沒有修改寫權限成功。

經排查,該系統不存在主從,為多台伺服器高可用。

3、 檢查系統message 日志;

在發現問題時間點,對照message日志檢視,發現報錯如下

kernel: sd 2:0:1:0: [sdb] Unhandled sense code

kernel: sd 2:0:1:0: [sdb] Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE

kernel: sd 2:0:1:0: [sdb] Sense Key : Medium Error [current]

kernel: sd 2:0:1:0: [sdb] Add. Sense: Unrecovered read error

kernel: sd 2:0:1:0: [sdb] CDB: Write(10): 2a

kernel: Aborting journal on device sdb1-8.

kernel: EXT4-fs (sdb1): delayed block allocation failed for inode 25 at logical offset 0 with

max blocks 23 with error -30

kernel: kernel: This should not happen!! Data will be lost

kernel: EXT4-fs error (device sdb1) in ext4_da_writepages: Journal has aborted

kernel: EXT4-fs error (device sdb1): ext4_journal_start_sb: Detected aborted journal

kernel: EXT4-fs (sdb1): Remounting filesystem read-only

kernel: EXT4-fs (sdb1): ext4_da_writepages: jbd2_start: 1016 pages, ino 25035545; err -30

EXT4-fs分區錯誤,導緻系統将分區置為隻讀。

Linux 核心對EXT4的錯誤處理主要有三種:繼續(不處理);核心panic(挂起);将錯誤分區設定為隻讀(繼續)。

處理模式設定主要是在檔案系統實體分區上或者通過mount 參數配置。前者可以通過tune2fs -l /dev/sdb1 檢視Errors behavior;後者可以通過mount指令幫助文檔了解設定。具體的情況可通過核心源碼進确認。

可能原因

可能由于磁盤掉電,檔案系統錯誤,壞道,驅動,HBA卡、RAID卡故障,磁盤老舊長期大量的讀寫、檔案系統檔案被破壞、磁盤碎片檔案、異常斷電、讀寫中斷等。

錯誤處理思路

1、通過fdisk -l 檢視分區具體資訊;

2、通過tune2fs -l /dev/sdb1 檢視有無錯誤相關資訊。

3、将該節點踢出應用叢集,确認該分區的資料,備份該分區資料,避免修複中出現無法mount的情況。

4、嘗試使用fsck修複磁盤。

# 1、确認出問題分區編号
$ fdisk -l

# 2、解除安裝分區
$ unmount /dev/sdb1

# 3、檢查并修複分區
$fsck /dev/sdb1
## 注:fsck 可能會導緻磁盤損壞或者資料丢失

# 4、重新挂載
$ mount -a 

## fsck 退出碼如下:
# 0:沒有錯誤
# 1:修複了一些檔案系統錯誤
# 2:系統需要被重新開機
# 4:檔案系統錯誤未被修複
# 8:操作錯誤
# 16:使用或文法錯誤
# 32:fsck 被使用者取消
# 128:共享庫出錯

# fsck 常用參數:
-t : 給定檔案系統的型式,若在 /etc/fstab 中已有定義或 kernel 本身已支援的則不需加上此參數
-s : 依序一個一個地執行 fsck 的指令來檢查
-A : 對/etc/fstab 中所有列出來的 分區(partition)做檢查
-C : 顯示完整的檢查進度
-d : 列印出 e2fsck 的 debug 結果
-p : 同時有 -A 條件時,同時有多個 fsck 的檢查一起執行
-R : 同時有 -A 條件時,省略 / 不檢查
-V : 詳細顯示模式
-a : 如果檢查有錯則自動修複
-r : 如果檢查有錯則由使用者回答是否修複
-y : 選項指定檢測每個檔案是自動輸入yes,在不确定那些是不正常的時候,可以執行 # fsck -y 全部檢查修複。           
記一次系統磁盤隻讀錯誤

相關概念

  • EXT4:第四代擴充檔案系統(Fourth EXtended filesystem,EXT4)是Linux系統下的日志檔案系統,是EXT3檔案系統的後繼版本;EXT4分别支援1EB(1EB=1024PB,1PB=1024TB)的檔案系統,以及16TB的單個檔案;EXT4磁盤結構的inode個數支援40億,而且EXT4的單個檔案大小支援到16T(4K block size) 。EXT3類型檔案系統支援最大16TB檔案系統和最大2TB檔案;EXT3隻支援32,000個子目錄,而EXT4支援無限數量的子目錄。
  • xfs:XFS是一個64位檔案系統,最大支援8EB減1位元組的單個檔案系統,實際部署時取決于宿主作業系統的最大塊限制,常用語64位作業系統,發揮更好的性能。
  • SuperBlock:在硬碟分區中,還有一個超級區塊 (SuperBlock) ,SuperBlock會記錄整個檔案系統的整體資訊,包括 Inode、Block 總量、使用大小、剩餘大小等資訊,每個 inode 與 block 都有編号對應,友善Linux系統快速定位查找檔案。
  • inode:記錄檔案的屬性,權限,同時會記錄該檔案的資料所在的block編号。
  • block:存儲檔案的内容,如果檔案超過預設Block大小,會自動占用多個Block。

繼續閱讀