我有一个 luks 设备,它在启动时由 /etc/crypttab 打开。 lsblk 看起来像这样:
sdc 8:32 1 114,6G 0 disk
└─luks-672dcc74-d002-47dc-b61b-525baf91dc7c 253:2 0 114,6G 0 crypt
我像这样安装设备:
pmount /dev/mapper/luks-672dcc74-d002-47dc-b61b-525baf91dc7c
我像这样卸载它(两者都有效):
pumount /dev/mapper/luks-672dcc74-d002-47dc-b61b-525baf91dc7c
pumount /media/mapper_luks-672dcc74-d002-47dc-b61b-525baf91dc7c
但是 pumount lsblk 看起来像这样:
sdc 8:32 1 114,6G 0 disk
为什么pumount关闭了luks设备?从 pumount 的手册页中可以看出:
Normally, pumount will not luksClose (see cryptsetup(1)) a device pmount did not open.
luks 设备是在启动时由 /etc/crypttab 打开的,而不是由 pmount 打开的!为什么pumount会关闭luks设备?这是一个错误吗?
我在 Debian Bullseye 上。
答案1
笔记:我完全不熟悉pumount
,而且我什至没有可用于测试的 Debian 安装,所以我刚刚从 Debian 获取了源代码并根据我在那里发现的内容做出疯狂的假设……
pumount
有一个选项,--luks-force
可以关闭它未打开的 LUKS 设备(正如您已经从联机帮助页中引用的那样)。
但从源代码来看,执行过程中似乎存在错误。
所以这里pumount.c
有一些选项解析:
int luks_force = 0;
[...]
{ "luks-force", 0, NULL, 'L'},
[...]
case 'L': luks_force = 1; break;
...就是这样!该选项设置luks_force = 1
变量。否则初始化为0。
但这一点也不重要,因为……该变量没有在任何地方使用。
里面luks.c
有这么一段代码:
void
luks_release( const char* device, int force )
{
if(force || luks_has_lockfile(device)) {
spawnl( CRYPTSETUP_SPAWN_OPTIONS,
CRYPTSETUP, CRYPTSETUP, "luksClose", device, NULL );
luks_remove_lockfile(device);
[...]
luksClose
因此,如果存在锁定文件,或者如果force
为 true,则会发生这种情况。
这个函数是pumount.c
这样调用的:
/* release LUKS device, if appropriate */
luks_release( device, 1 );
所以不管你做什么,force
总是设置为 1,所以它会关闭 LUKS 设备。
最后一行可能是应该使用luks_force
变量而不是 1 的地方。