问题概述
在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 [...]
从内核源码来看,0x1277
ioctl 对应于BLKDISCARD
:
include/linux/fs.h:
------------------
344 #define BLKDISCARD _IO(0x12,119) [...]
该mkfs
命令向磁盘发出块丢弃命令,但磁盘设备不支持该命令,这导致在第一个片段中观察到 IO 错误,然后将其记录下来。