因项目需要,程序经常需要使用iscsi挂卸载远程fileio,而终端又经常需要进入到挂载点中查看文件(默认xfs文件系统),因为有终端访问挂载点,而此时程序直接umount会报错target busy,故只能使用sync && umount -l之后直接iscsiadm登出。
然而如果在卸载前有终端在挂载点有执行过ls命令,则有概率出现io卡死(如下图),卡死后执行sync命令会永久hang住(kill -9也无效),整个文件系统也存在风险。
原因:终端进入到挂载点目录执行过ls、ll、ll -R等类似操作,默认的mount属性带有atime属性,当ls命令执行后会依次修改目录下所有文件的atime属性,这个修改时间不可预估(sync不会阻塞在系统修改atime过程中),如果此时程序sync && umount -l挂载点并iscsiadm登出磁盘,因磁盘已失效xfs文件系统将在修改atime的过程中死锁,导致后续sync命令永远不可用。
注:这个问题只在redhat 7.0 7.1 7.2三个小版本中出现,其他版本均正常。
解决方法:iscsi挂载磁盘时使用mount -o noatime属性,这样ls 、ll等命令将不会再触发修改目录下所有文件的atime(即不会长时间占用xfs写操作),sync后即可立即卸载登出磁盘。