抱歉都吃完隔天早餐了才上来回,以下为试图理解作业系统在说什么仅供参考
另外很抱歉的事情是我看错数字所以也不知道问题是出在哪里,以下是分析资料
※ 引述《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 授权条款或其任意更近期版本释出供大众在授权范围内自由使用