需通过badblocks扫描精确定位坏道物理扇区:先用lsblk识别并umount目标分区,若busy则用lsof+kill终止进程;再执行sudo badblocks -v -s /dev/sdb1 > /tmp/bad_sectors.txt 2>&1获取扇区编号;ext4系统可用e2fsck -l屏蔽,xfs仅作定位参考。

银河麒麟V10系统中,当出现文件读写卡顿、复制失败或dmesg频繁报“I/O error”时,需准确定位硬盘坏道所在物理扇区位置,而非仅判断是否存在异常。仅靠SMART状态无法给出具体扇区编号,必须通过底层块设备扫描实现精确定位。
确认目标分区并卸载
执行sudo lsblk -o NAME,MODEL,SIZE,FSTYPE,MOUNTPOINT,识别待测数据盘分区(如/dev/sdb1);若该分区已挂载在/data等路径,必须先卸载:sudo umount /dev/sdb1。
若提示“target is busy”,说明有进程正在访问该分区,需用sudo lsof +D /data查出进程PID后执行kill -9 PID终止,否则badblocks将拒绝操作——【未卸载直接扫描会导致结果不可信甚至损坏文件系统】。
执行只读坏块扫描并记录位置
运行命令:sudo badblocks -v -s /dev/sdb1 > /tmp/bad_sectors.txt 2>&1。
该命令以只读方式逐扇区验证,-v输出详细过程,-s实时刷新进度条;扫描结果会将所有无法读取的扇区逻辑块号(block number)按行写入/tmp/bad_sectors.txt。注意:此过程不修改磁盘任何数据,但耗时较长,1TB磁盘约需3~5小时。
将坏扇区写入文件系统坏块表
第一步:确认文件系统类型,执行sudo blkid /dev/sdb1,若输出含TYPE="ext4"则继续;若为xfs,则跳过本节,badblocks结果仅作定位参考,xfs不支持内核级坏块屏蔽。
第二步:对ext4分区执行屏蔽:sudo e2fsck -l /tmp/bad_sectors.txt /dev/sdb1。此操作会将坏块列表注入文件系统预留区,使后续分配避开这些扇区。
第三步:验证是否生效,运行sudo dumpe2fs -h /dev/sdb1 | grep -i "bad",输出中Bad blocks count值应大于0,且与/tmp/bad_sectors.txt行数一致。











