定位读写的扇区的编号

背景

最近有碰到扇区的错误,引起osd的无法启动,经过处理,系统可以恢复了,但是扇区的错误为什么导致了osd down,怎么去模拟这个删除的问题,就需要做一些定位的工作了

我们需要模拟扇区的问题,就需要去精确的模拟到损坏的扇区,也就是比如我需要模拟某个文件的扇区损坏,那么就需要定位到这个文件属于哪些扇区

方法

定位扇区

通过blktrace进行模拟,这个操作是去读取文件就行,”C”是完成的请求,下面是过滤的,避免太多其它信息干扰

对磁盘的文件进行读取的请求

1
blktrace -d /dev/sdb -o - | blkparse -i - | awk '$6 == "C" {print $1, $2, $6, $7, $8, $9, $10}'

输出类似下面的信息

1
2
3
4
5
6
7
8
8,80 8 C R 17152 + 512
8,80 8 C R 17664 + 512
8,80 8 C R 18176 + 512
8,80 8 C R 18688 + 512
8,80 8 C R 19200 + 512
8,80 8 C R 19712 + 512
8,80 8 C R 20224 + 512
8,80 8 C R 20736 + 512

模拟坏扇区

后面接的就是扇区的编号

1
2
我们尝试破坏比较后面的扇区试试 20737
[root@lab101 ~]# hdparm --yes-i-know-what-i-am-doing --make-bad-sector 20737 /dev/sdf

系统应该会报

1
2
# blk_update_request: critical medium error, dev sdf, sector 20737
# print_seq_error: critical medium error, dev sdf, sector 20737

不同版本的内核有不同的输出,3.10是blk_update_request,4.14是print_seq_error

1
2
3
4
5
6
[root@lab101 ~]# dmesg 
[ 527.575584] sd 0:0:20:0: [sdc] tag#8 FAILED Result: hostbyte=DID_OK driverbyte=DRIVER_SENSE
[ 527.575598] sd 0:0:20:0: [sdc] tag#8 Sense Key : Medium Error [current]
[ 527.575602] sd 0:0:20:0: [sdc] tag#8 Add. Sense: Unrecovered read error
[ 527.575609] sd 0:0:20:0: [sdc] tag#8 CDB: Read(16) 88 00 00 00 00 00 00 00 50 20 00 00 02 00 00 00
[ 527.575614] print_req_error: critical medium error, dev sdc, sector 20737

完整信息

然后观察现象即可

恢复扇区

1
[root@lab101 ~]#  hdparm --yes-i-know-what-i-am-doing --repair-sector  20737 /dev/sdf

都测试完成后,进行环境的恢复,避免后面触发其它的问题

总结

本篇记录了模拟破坏指定扇区的方法,触发一些问题,并寻找解决方法