![支持不使用 O_EXCL 打开的循环设备的文件](https://linux22.com/image/6542/%E6%94%AF%E6%8C%81%E4%B8%8D%E4%BD%BF%E7%94%A8%20O_EXCL%20%E6%89%93%E5%BC%80%E7%9A%84%E5%BE%AA%E7%8E%AF%E8%AE%BE%E5%A4%87%E7%9A%84%E6%96%87%E4%BB%B6.png)
循环设备是 Linux 中将普通文件视为块设备的主要方式(也许是唯一的方式)。奇怪的是,后备文件不受O_EXCL
标志保护。这是为什么?为什么没人抱怨?
例如,该工具wipefs
没有注意到文件已安装:
[il@reallin ~]$ touch me
[il@reallin ~]$ truncate -s10G me
[il@reallin ~]$ mkfs.ext3 me
...
Writing superblocks and filesystem accounting information: done
[il@reallin ~]$ sudo mount -oloop me /mnt
[il@reallin ~]$ mount | grep /mnt
/home/il/me on /mnt type ext3 (rw,relatime,data=ordered)
[il@reallin ~]$ wipefs -a /dev/loop0
wipefs: error: /dev/loop0: probing initialization failed: Device or resource busy
[il@reallin ~]$ wipefs -a me
me: 2 bytes were erased at offset 0x00000438 (ext2): 53 ef
[il@reallin ~]$ uname -a
Linux reallin.basin 4.2.4-1-ARCH #1 SMP PREEMPT Fri Oct 23 07:32:38 CEST 2015 x86_64 GNU/Linux
如果要让同一文件多次挂载,则应losetup
首先尝试独占模式,然后打印警告并回退到不使用此标志。