为什么 pumount 会关闭它未打开的 luks 设备?

为什么 pumount 会关闭它未打开的 luks 设备?

我有一个 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 的地方。

相关内容