OverRainbow

raspberrypi realvnc

☕️ 1 min read

准备工作

主要的参考就是这篇官方教程

以下指的成功的定义是:

  • 开机自动启动vnc服务

官方指导100%成功的场景是这样的:

  • 开机默认启动到桌面模式
  • 树莓派配置的interface中开启vnc开关

以下情况下100%失败:

  • 开机默认启动到文本模式

研究了一会,跳了几次坑之后,终于明白为什么官方教程主推service mode而晦涩的掩盖了virtual mode。

探索

  • 在首次安装完realvnc后出现这一行字,也就是说有两种模式,分别对应两个service

    Installed systemd unit for VNC Server in Service Mode daemon
    Start or stop the service with:
      systemctl (start|stop) vncserver-x11-serviced.service
    Mark or unmark the service to be started at boot time with:
      systemctl (enable|disable) vncserver-x11-serviced.service
    Installed systemd unit for VNC Server in Virtual Mode daemon
    Start or stop the service with:
      systemctl (start|stop) vncserver-virtuald.service
    Mark or unmark the service to be started at boot time with:
      systemctl (enable|disable) vncserver-virtuald.service
    

service模式详解

  • 服务名:vncserver-x11-serviced.service
  • 连接地址:直接就是ip
  • 树莓派的interface中的VNC控制的即该服务的开关
  • 是可以直接使用的(自带授权),用于以service模式启动vncserver,即通过转发到x11桌面服务来连接。
  • 依赖关系:必须启用lightdm服务(启动到桌面模式会自动带起该服务,但启动到CLI模式则不会带起该服务),否则能连接,但是黑屏。
  • 该模式特殊作用:具有在root权限下运行vncserver的能力,realvnc的托盘区图标也会有所不同来指示这种区别:在该模式下托盘区的图标是黑底,非root模式下托盘区的图标是白底。

virtual模式详解

  • 服务名:vncserver-virtuald.service:
  • 连接地址:ip:<虚拟桌面号>
  • 是不能直接使用的(需要企业授权),
  • 用于以virtual 模式启动vncserver,即通过创建virtual desktop来连接,
  • 具有按需创建的优点。

vncserver的本质

  • 可以看到vncserver是软链接到vncserver-virtual的,也就是运行vncserver创建的是virtual desktop

在headless模式下的完美方案

说了那么多,探索这些背后关联的目的就是为了在没有授权的情况下,尽可能的实现virtual模式的自动启动。

  • 主要包括以下两点:
    • 上面两个服务都不需要启用。(通过树莓派配置界面中interface的vnc可以直接关闭service模式)
    • 编写systemd服务来保持virtual desktop的开机启动

新建vncserver自启服务

有人已经写好了服务模板,可以直接拿来用。

  • 新建文件 /etc/systemd/system/vncserver@.service 内容如下:

    [Unit]
    Description=Remote desktop service (VNC)
    After=syslog.target network.target
    
    [Service]
    Type=forking
    User=pi
    PAMName=login
    PIDFile=/home/pi/.vnc/%H:%i.pid
    ExecStartPre=-/usr/bin/vncserver -kill :%i > /dev/null 2>&1
    ExecStart=/usr/bin/vncserver -depth 24 -geometry 1280x800 :%i
    ExecStop=/usr/bin/vncserver -kill :%i
    
    [Install]
    WantedBy=multi-user.target
    
  • 添加可执行权限:

    sudo chmod +x  /etc/systemd/system/vncserver@.service
  • 测试:

    sudo systemctl start vncserver@1.service
  • 自启服务:

    sudo systemctl daemon-reload && sudo systemctl enable vncserver@1.service