抱歉都吃完隔天早餐了才上來回,以下為試圖理解作業系統在說什麼僅供參考
另外很抱歉的事情是我看錯數字所以也不知道問題是出在哪裡,以下是分析資料
※ 引述《junorn (威廉華勒斯)》之銘言:
: 在/var/log/message裡面紀錄是每五分鐘左右跳一次
: localhost kernel: sda: sda
: localhost kernel: attempt to access beyond end of device
: localhost kernel: sdc1: rw=0, want=3907027088, limit=3907027087
作業系統核心:「/dev/sdc1的地址只有到3907027087,那個叫我讀3907027088地址的程式是在叫三小。」
: 爬Google是有看到說partition有問題,所以用fdisk -l
: sdc部分顯示如下
: Disk /dev/sdc: 2000.4 GB, 2000398934016 bytes, 3907029168 sectors
磁碟有3907029168個磁區(定址從0到3907029167)
: Units = sectors of 1 * 512 = 512 bytes
: Sector size (logical/physical): 512 bytes / 4096 bytes
: I/O 大小 (最小/最佳化):4096 位元組 / 4096 位元組
: Disk label type: gpt
: # Start End Size Type Name
: 1 2048 3907029134 1.8T Linux filesyste Linux filesystem
1. (八成是由 libparted 所切出之)第0~2047磁區前1MiB的空間為保護用MBR(Protective MBR)、主GUID分區表表頭(Primary GPT Header)、與磁區對齊(sector alignment)之用
2. 第2048~3907029134磁區為/dev/sdc1分區
* 第2048磁區為/dev/sdc1分區的第0磁區
* 分區最後一磁區為第3907029134-2048+1=3907027087磁區
3. 第3907029135~3907029167磁區為GUID分區表的次GUID分區表表頭(Secondary GPT Header),
* 此區域大小為3907029167-3907029135+1=33個磁區,與次GUID分區表表頭應該要有的大小吻合
原本我以為作業系統核心的訊息是針對/dev/sdc而非/dev/sdc1,而3907029134>3907027088代表磁碟分割表登錄之/dev/sdc1分區的邊界超出/dev/sdc的磁碟有效磁區範圍造成系統在試圖存取/dev/sdc1時觸發錯誤訊息
但是實際上磁區編號是從分區開頭算(要扣掉2048再加一)所以是完全錯誤的推論
個人推測可能造成錯誤訊息的原因:
* 有有權限可直接存取磁碟的程式試圖讀取超過分區有效磁區範圍的磁區
* 解決方式:找到它,幹掉它
* 作業系統核心有程式缺陷造成誤存取錯誤的磁區(範例:https://github.com/stec-inc/EnhanceIO/issues/9 )
* 解決方式
* 試試看用更新版本的 Linux 作業系統核心啟動看看還會不會觸發相同的問題
* 如果有使用 Linux 作業系統核心來源碼樹外的第三方作業系統核心模組請試著停用看看能不能重現該問題
* /dev/sdc1 檔案系統(的 superblock?)設定有問題讓檔案系統誤以為其範圍有超過分區有效磁區範圍
* 檢查方式:EXT 檔案系統應有工具可以檢查 EXT 檔案系統的詳細狀態
※本文章由 Creative Commons BY-SA 4.0 授權條款或其任意更近期版本釋出供大眾在授權範圍內自由使用