我目前正在尝试设置一个小型(部分)Ubuntu 镜像。在这样做的时候,我偶然发现了gpgv
。由于我需要 gpgv 来验证镜像文件的签名,我尝试通过以下方式将 Ubuntu 密钥环文件导入我的密钥环:
gpg --no-default-keyring --keyring trustedkeys.gpg --import /usr/share/keyrings/ubuntu-archive-keyring.gpg
当我运行时gpgv
,出现一个错误:
gpgv: can't allocate lock for '/home/sync_user/.gnupg/trustedkeys.gpg'
但是,当我刚刚cp /usr/share/keyrings/ubuntu-archive-keyring.gpg ~/.gnupg/trustedkeys.gpg
运行的时候gpgv
,没有任何错误消息。
即使我有完全相同的权限等,错误在第一种情况下仍然存在,但在第二种情况下不存在:
- 导入的密钥:
sync_user@machine:~/.gnupg$ ls -lah
total 20K
drwx------ 2 sync_user sync_user 4.0K Aug 22 12:01 .
drwxr-xr-x 6 sync_user sync_user 4.0K Aug 21 16:59 ..
-rw------- 1 sync_user sync_user 1.2K Aug 22 11:55 trustdb.gpg
-rw-r--r-- 1 sync_user sync_user 7.8K Aug 22 11:55 trustedkeys.gpg
- 复制的钥匙圈:
sync_user@machine:~/.gnupg$ ls -lah
total 20K
drwx------ 2 sync_user sync_user 4.0K Aug 22 12:01 .
drwxr-xr-x 6 sync_user sync_user 4.0K Aug 21 16:59 ..
-rw------- 1 sync_user sync_user 1.2K Aug 22 11:55 trustdb.gpg
-rw-r--r-- 1 sync_user sync_user 7.3K Aug 22 12:03 trustedkeys.gpg
另一个注意事项:同一台机器和其他机器上的不同用户也会发生同样的情况。我已经尝试使用 ubuntu 20.04 和 arch linux 安装 - 结果相同。
sgpgv --version
是:gpgv (GnuPG) 2.2.19 libgcrypt 1.8.5
在 ubuntu 上和gpgv (GnuPG) 2.2.21 libgcrypt 1.8.6
在 arch 上。
有谁知道这种行为的根源在哪里?
我将感谢每一条评论。
答案1
我发现,如果我在导入之前触摸一下文件,就不会出现错误。
那么,touch ~/.gnupg/trustedkeys.kbx
然后gpg --export <key id> | gpg --no-default-keyring --keyring ~/.gnupg/trustedkeys.kbx --import
答案2
触摸该文件对我来说不起作用。
不过,我在 strace 下运行了 gpgv,看到了以下情况:
11857 close(3) = 0
11857 access("/var/cache/debmirror/.gnupg/trustedkeys.kbx", F_OK) = 0
11857 access("/var/cache/debmirror/.gnupg/trustedkeys.kbx", R_OK) = 0
11857 access("/var/cache/debmirror/.gnupg/trustedkeys.kbx", W_OK) = 0
11857 write(2, "gpgv: can't allocate lock for '/"..., 74) = 74
11857 write(2, "'\n", 2) = 2
11857 openat(AT_FDCWD, "Release.gpg", O_RDONLY) = 3
11857 read(3, "-----BEGIN PGP SIGNATURE-----\n\ni"..., 8192) = 1760
11857 read(3, "", 8192) = 0
11857 openat(AT_FDCWD, "Release", O_RDONLY) = 4
11857 read(4, "Origin: Debian\nLabel: Debian\nSui"..., 8192) = 8192
11857 read(4, "\n 345032ae178d52433929ef4b76962a"..., 8192) = 8192
由此,我推断,它抱怨的不是它不能做什么,而是它能做什么。
从文件中删除写权限会消除(误导性的)“错误”消息......这也不会阻止程序继续运行。