目前我在 Linux/Ubuntu 上使用循环设备做了一些测试。在一个小测试脚本中,我有以下命令:
#!/bin/sh
rm testfile.x
dd if=/dev/zero of=testfile.x bs=1M count=1200
losetup /dev/loop0 testfile.x
cryptsetup --batch-mode --key-file k.kf --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 --use-random luksFormat /dev/loop0
losetup -d /dev/loop0
现在我的问题是:
有时cryptsetup 行失败,因为循环设备消失(就像魔术一样)......在脚本运行期间。
我收到一个错误:
设备 /dev/loop0 太小。
那么,有没有办法防止/禁用这种情况呢?
更新1:
这是我的脚本的完整输出(2 次运行:1 次成功,1 次失败):
root@test:/home/tester/test# ./x.sh
1200+0 records in
1200+0 records out
1258291200 bytes (1.3 GB) copied, 0.954065 s, 1.3 GB/s
Device /dev/loop0 is too small.
loop: can't delete device /dev/loop0: No such device or address
root@test:/home/tester/test# ./x.sh
1200+0 records in
1200+0 records out
1258291200 bytes (1.3 GB) copied, 0.953886 s, 1.3 GB/s
更新2:
如果我将 更改count
为dd
100 (~105MB) 就没有问题(测试了 10 次成功)。所以必须有任何自动清除/超时或其他东西。
更新3(解决方案):
#!/bin/sh
FILE=testfile.x
cryptsetup --batch-mode --key-file k.kf --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 --use-random luksFormat $FILE
cryptsetup luksOpen -d k.kf $FILE hellohello
cryptsetup luksClose hellohello
这个工作没有任何错误,谢谢@frostschutz。
答案1
循环设备有一些缺陷。许多操作不是即时的,例如,当您losetup -d
循环设备将保持活动状态直到不再使用为止。即使您不知道,设备也可能正在使用中,因为后台进程会扫描设备中的 uuid 和其他内容。
losetup
也许您应该使用来选择循环设备--find --show
。如果一个循环设备因任何原因无法使用,则应选择另一个循环设备。然后,您必须调整脚本以将其存储在变量中。
lodev=$(losetup --find --show textfile.x)
cryptsetup ... $lodev
cryptsetup
也完全能够创建自己的循环设备,因此您可以完全放弃losetup
并使用cryptsetup
文件本身。这应该不太容易出错。
cryptsetup ... testfile.x
这也适用于luksOpen
并且循环设备将保留直到luksClose
(再次,直到它不再使用)。