问题概述
在lvm卷上创建新的文件系统时,mkfs.xfs和mkfs.ext4命令都会在ioctl()系统调用上暂停。操作系统挂起,没有响应。
解决办法
在创建文件系统时候,加入-K的参数,在创建时禁止用块丢弃,详细的参数说明参考如下:
-K Keep, do not attempt to discard blocks at mkfs time
(discarding blocks initially is useful on solid
state devices and sparse / thin-provisioned storage).
命令示例如下:
mkfs.ext4 -K </dev/mapper/path_to_lvm_volume> # For ext4 filesystem
mkfs.xfs -K </dev/mapper/path_to_lvm_volume> # For XFS filesystem
根本原因
mkfs命令在磁盘上发出块丢弃命令,但底层存储设备无法处理它。
诊断步骤
收集 mkfs 命令的 strace 日志:
*strace -f -tt -y -T -v -x -o /tmp/mkfs.out -s 4096 <mkfs command>
mkfs.xfs命令的 strace 日志mkfs.ext4显示该命令在发出 ioctl 后挂起0x1277:
tail -2 mkfs.txt
1538 08:59:41.724086 write(1, "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08", 13) = 13 <0.000053> 1538 08:59:41.724209 ioctl(3, 0x1277 <-------- hung after this [...]
从内核源码来看,0x1277ioctl 对应于BLKDISCARD:
include/linux/fs.h:
------------------
344 #define BLKDISCARD _IO(0x12,119) [...]
该mkfs命令向磁盘发出块丢弃命令,但磁盘设备不支持该命令,这导致在第一个片段中观察到 IO 错误,然后将其记录下来。

