装好 CachyOS + COSMIC 之后,开机后第一次打开 Chrome,或者在设置里点开网络配置,都会弹框要求解锁 “Default keyring”,每次开机都得输一遍密码。
环境:CachyOS,COSMIC 1.9.0(cosmic-greeter 1:1.9.0-1.1),gnome-keyring 50.0。
原因
查下来是两个问题:
- 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。 - gnome-keyring 登录时只会自动解锁叫
login的钥匙环(~/.local/share/keyrings/login.keyring),而现有的钥匙环叫Default_Keyring。
解决
顺序是先改名、再改 PAM。锁屏也走 login 服务,如果先改了 PAM,中途锁一次屏,就会自动生成一个空的 login.keyring,和要改名的文件撞车。
另外,钥匙环密码得和登录密码一样才能自动解锁,不一样的话要先用 Seahorse 改过来。
1. 备份并改名
改名前先关掉 Chrome、系统设置这些会用到钥匙环的程序:
1 | cp -a ~/.local/share/keyrings ~/keyrings-backup |
改名不会丢数据。不建议直接删掉钥匙环重来,Chrome 保存的密码和 Cookie 都要靠里面的密钥解密。
2. 修改 PAM
在 /etc/pam.d/login 里加两行,改完是这样的:
1 | #%PAM-1.0 |
3. 重启验证
1 | busctl --user get-property org.freedesktop.secrets \ |
重启后输出是 b false,说明登录时已经自动解锁了,再打开 Chrome 也不弹窗了。
PS
为什么改
login而不是新建一个 PAM 文件。 COSMIC 上游其实在 ef1253a 里处理过这个问题,给 greeter 和锁屏单独建了一个cosmic-greeterPAM 服务,里面配好了 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
4greetd[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,想回退的话,删掉那两行再把它拷回去就行。