如果我插入 USB 并修改文件然后拔掉它,我不会丢失数据。但是,如果我使用mount
USB 上的文件,我将丢失数据。这是怎么回事?我可以采取什么措施来防止数据丢失?奇怪的是,我可以编写一个文件并将我的 USB 拔出而不会丢失数据,但在使用挂载时我会丢失数据。这是例子
echo "Data Data Data" > /media/your-usb/data
#unplug your usb. plug into another computer
#you'll see you didn't lose any data
#Create a file, put ext4 filesystem on it
dd if=/dev/zero of='/media/your-usb/test.bin' count=100000;
losetup /dev/loop0 /media/your-usb/test.bin
mkfs.ext4 /dev/loop0
losetup -d /dev/loop0
#Mount FS
mkdir m
mount -o loop /media/your-usb/test.bin m
echo Test > m/test
umount m
#No loss of data
mount -o loop ./test.bin m
echo Test2 > m/test2
#wait a moment. You'd think the data will flush
#unplug your USB
umount m
#plug your USB
mount -o loop ./test.bin m
cat m/test2 #error test2 is not a file
答案1
当 Linux 检测到可移动驱动器时,它足够聪明,知道它应该经常刷新数据。当您安装环回时,它不知道支持设备是一个可以随时删除的文件。
您可以使用以下命令强制系统不缓存写入:
mount -o loop,sync /media/your-usb/test.bin m
这将导致性能变慢,并且还要注意有关页面磨损的警告man mount
:
sync All I/O to the filesystem should be done synchronously. In case
of media with limited number of write cycles (e.g. some flash
drives) "sync" may cause life-cycle shortening.
sync
如果您出于某种原因不想这样做,另一种方法是至少在删除设备之前运行umount
。
答案2
如果我插入 USB 并修改文件然后拔掉它,我不会丢失数据。
更正:您没有丢失数据然而。你已经注意到了。
据推测,您、您的发行版或您使用的自动挂载程序的维护者已将可移动 USB 存储设备配置为使用该选项挂载sync
,这会导致数据立即写出。该sync
选项的优点是可以写出所有数据,这样如果存储介质突然拔出或系统崩溃,数据就不会丢失,但它有很多缺点:
- 闪存类型的存储会磨损得更快,因为数据一次写入几个字节,但每次只能通过写入相当大的块来更新存储,因此每个块最终都会被重写很多次。这会很快杀死基本的 USB 驱动器。
- 未正确卸载的文件系统将被标记为脏。您无法区分被标记为脏但包含一致数据的文件系统与在写入过程中拉出并包含不一致数据的文件系统。这不适用于 FAT 等没有“脏”指示符的文件系统。
- 它更慢——可能慢很多。
不要使用sync
.在拔掉设备插头之前先卸载它们。