装好 CachyOS + COSMIC 之后,开机后第一次打开 Chrome,或者在设置里点开网络配置,都会弹框要求解锁 “Default keyring”,每次开机都得输一遍密码。

环境:CachyOS,COSMIC 1.9.0(cosmic-greeter 1:1.9.0-1.1),gnome-keyring 50.0。

原因

查下来是两个问题:

  1. cosmic-greeter 跑在 greetd 上,Arch 的包在 /etc/greetd/cosmic-greeter.toml 里配的 PAM 服务是 login,所以登录走的是 /etc/pam.d/login,而不是 /etc/pam.d/greetd。这个文件里没有 pam_gnome_keyring.so,登录密码就没有交给 gnome-keyring。
  2. gnome-keyring 登录时只会自动解锁叫 login 的钥匙环(~/.local/share/keyrings/login.keyring),而现有的钥匙环叫 Default_Keyring。

解决

顺序是先改名、再改 PAM。锁屏也走 login 服务,如果先改了 PAM,中途锁一次屏,就会自动生成一个空的 login.keyring,和要改名的文件撞车。

另外,钥匙环密码得和登录密码一样才能自动解锁,不一样的话要先用 Seahorse 改过来。

1. 备份并改名

改名前先关掉 Chrome、系统设置这些会用到钥匙环的程序:

1
2
3
4
5
6
7
cp -a ~/.local/share/keyrings ~/keyrings-backup

systemctl --user stop gnome-keyring-daemon.socket gnome-keyring-daemon.service
pgrep -a gnome-keyring # 确认没有输出

mv -n ~/.local/share/keyrings/Default_Keyring.keyring ~/.local/share/keyrings/login.keyring
echo login > ~/.local/share/keyrings/default

改名不会丢数据。不建议直接删掉钥匙环重来,Chrome 保存的密码和 Cookie 都要靠里面的密钥解密。

2. 修改 PAM

在 /etc/pam.d/login 里加两行,改完是这样的:

1
2
3
4
5
6
7
8
9
#%PAM-1.0

auth requisite pam_nologin.so
auth include system-local-login
auth optional pam_gnome_keyring.so
account include system-local-login
session include system-local-login
session optional pam_gnome_keyring.so auto_start
password include system-local-login

3. 重启验证

1
2
3
busctl --user get-property org.freedesktop.secrets \
/org/freedesktop/secrets/collection/login \
org.freedesktop.Secret.Collection Locked

重启后输出是 b false,说明登录时已经自动解锁了,再打开 Chrome 也不弹窗了。

PS

  • 为什么改 login 而不是新建一个 PAM 文件。 COSMIC 上游其实在 ef1253a 里处理过这个问题,给 greeter 和锁屏单独建了一个 cosmic-greeter PAM 服务,里面配好了 keyring。但 Arch 的 PKGBUILD 目前把这个提交 revert 掉了(revert pam config for now),所以才走 login。上面加的两行就是照抄上游的。没有另建 /etc/pam.d/cosmic-greeter,是因为以后 Arch 恢复上游做法时,包里会带同名文件,pacman 会报文件冲突。

  • 升级会不会失效。 /etc/pam.d/login 属于 util-linux,升级时不会被覆盖,只会生成 .pacnew。如果以后 Arch 取消了 revert,greeter 会改用包里自带的 /etc/pam.d/cosmic-greeter,上游版本本身就带 keyring 配置,login 里这两行留着也没影响。哪天升级后要是又开始弹窗,多半是 cosmic-greeter.toml 里的 service 变了。

  • 重启后的日志(journalctl -b | grep gkr-pam):

    1
    2
    3
    4
    greetd[858]: gkr-pam: couldn't unlock the login keyring.
    greetd[988]: gkr-pam: unable to locate daemon control file
    greetd[988]: gkr-pam: stashed password to try later in open session
    greetd[988]: gkr-pam: unlocked login keyring

    第一行是登录界面自己的会话(cosmic-greeter 用户,没有密码),可以忽略。后面三行是用户登录的过程:认证时用户会话还没建立,找不到守护进程,模块先把密码存起来,等会话建好后再解锁。如果看到的是 the password for the login keyring was invalid,说明钥匙环密码和登录密码不一致。

  • 以后改登录密码时,钥匙环密码也得跟着改,不然又会弹窗。备份留在 ~/keyrings-backup,想回退的话,删掉那两行再把它拷回去就行。