配置轻量级 Linux 远程开发环境(Fedora 38)

首先选一个发行版,需要软件源够全够新,但不一定每天都用,所以不要滚动更新。这次选择 Fedora Workstation 38,然后精简 GNOME 等服务,最终实现:

  • 空闲时内存占用低于 300MB
  • 桌面环境随用随开

基础配置

  • 开启 sshd:
sudo systemctl start sshd
sudo systemctl enable sshd
  • 修改主目录文件名为英文:
export LANG=en_US
xdg-user-dirs-gtk-update

转换后重新设置系统语言为 zh_CN,重启,登录时选中不转换和不再提示。

sudo rm /etc/yum.repos.d/_copr\:copr.fedorainfracloud.org\:phracek\:PyCharm.repo
sudo rm /etc/yum.repos.d/rpmfusion-nonfree-steam.repo
  • 安装 Go + nvim 开发工具:
sudo dnf install vim neovim go gcc-c++

删除软件更新服务

刚开机的内存占用就有 1.5GB,其中 packagekitd 占很大一部分。

PackageKit 是一个 dnf、apt 之类包管理工具的通用抽象层。但是我只用 dnf,不需要 gnome-software 等“高级”工具,更何况还有大量资源占用等问题。

所以把这两个组件删掉:

sudo dnf remove gnome-software PackageKit

节省了 600MB 内存。

关闭 GNOME 桌面环境

大部分时间是 SSH 使用,只有特殊情况才会 RDP 远程桌面连接。所以关闭 gdm(GNOME Display Manager) 来节省资源占用(参考):

sudo systemctl stop gdm
sudo systemctl disable gdm

需要时再手动开启:

sudo systemctl start gdm

节省了 600MB+ 内存。

远程桌面

需要使用桌面环境时,先启动 gdm,再远程连接。

自动登陆+解锁远程登陆密码

这个版本的远程桌面由 GNOME 内置实现,需要有一个正在运行的用户会话,所以要先用 VNC 登陆。

为了方便,可以设置 GNOME 自动登陆(文档):

# /etc/gdm/custom.conf

[daemon]
AutomaticLoginEnable=True
AutomaticLogin={{ username }}

但会发现每次自动登陆后远程桌面密码都被重置为了随机密码。这是由于系统上服务的密码是以加密形式存储于密钥环(keyring),默认密钥环的解锁密码就是登陆密码,在用户正常登录时会一起解锁。但自动登陆没有输入密码来解锁,所以 GNOME 读取不到其中中加密的远程登陆密码,就会随机生成一个新密码。

如果把默认的密钥环密码设置为空,系统上所有存储的密码都会是明文,不安全。

参考网友的方法,创建一个无密码的不安全密钥环来单独存放 RDP 密码:

  1. 安装密钥环管理工具,安装后可以找到「密码和密钥」应用:
sudo dnf install seahorse
  1. 在工具中,查看默认的「登陆」密钥环,里面应该已经存放了名为「GNOME Remote Desktop RDP credentials」的远程桌面密码,删除这条记录
  2. 创建一个新的密钥环,密钥环的密码设为空,将该密钥环设为默认
  3. 重启系统以应用新的默认密钥环
  4. 设置远程桌面密码,再次查看之前创建的新密钥环,里面应该已经有了「GNOME Remote Desktop RDP credentials」这条记录。之后远程桌面会使用该密钥环读取和设置密码
  5. 恢复默认密钥环为原先的「登陆」,重启系统

注意:要修改默认密钥环来让 GNOME 创建密码条目,这种记录会显示为「密码或密钥」,而手动创建的密码记录显示的是「已保存的便签」,测试发现不会被 GNOME 使用。

锁屏时使用远程桌面

根据 GNOME 远程桌面的设计,远程和本地的屏幕是同步的,本地屏幕锁定时,远程桌面的连接就会断开。

这与 Windows 接入远程桌面后就会让本地桌面自动进入锁定的运作方式不同。并且 GNOME 官方没有对这个功能请求做正式回复。

目前暂时关闭了自动锁屏。