背景:
最近在解决一个22TB大小的Raid5的阵列分区信息消失的问题的时候,按照既定的策略对写入分区信息的阵列位置进行清零操作 --- 即在①阵列节点头部从LAB0的位置往后2MB进行写0操作,同时,②对阵列尾部最后2MB进行写0操作。这个两个位置是写入GPT分区的位置,清零操作的原因是:gpt信息的大小不够一个Raid条带,当其中某些磁盘存在脏数据时,掉盘之后,Raid5无法通过校验盘来恢复正确的数据。
操作:
open一下阵列节点md0,ope属性是RW,然后用一个longlong类型来记录偏移,便于lseek64到阵列末尾,写入2MB大小的0数据。为了确认数据确实写入到对应的位置,放开了blockdump和内核打印信息。
echo 1 > /proc/sys/vm/block_dump /*开始记录IO*/
echo 0 > /proc/sys/vm/block_dump /*关闭blockdump*/
echo 9 > /proc/sys/kernel/printk /*放开最高等级内核打印*/
放开信息之后,开始执行清零操作,通过打印信息发现头部写入的数据和偏移是正确的,而尾部写入的数据偏移总是在6TB的位置,加打印确认偏移大小是没有问题的。lseek64返回的信息也是正确的,仔细想了一下应该是32位系统seek寻址最大是16TB的问题导致的,16TB+6TB正好是阵列大小。可是,为什么32位系统只能寻址到16TB呢?难道无法支持16TB以上的写入?显然,这个问题是常见问题,不可能是我第一个发现的,一定是哪里没有了解清楚。
<