[Raspberry Pi]如何用VNC遠端控制樹莓派(Ubuntu desktop 23.04)?

之前曾利用VMware探索CentOS,熟悉Linux操作系統的指令和配置運作方式,後來在樹莓派價格飛漲的時期,遇到貴人贈送Raspberry Pi 4 model B / 8GB,這下工具到位了,索性跳過樹莓派官方系統(Raspberry Pi OS),直接裝起Ubuntu做實機測試和應用。
當時利用Ubuntu 22.04做了些簡單的應用,包含配置Apache和MySQL等等伺服器,並讓使用者在BS架構(Bowser-server)下,可用網頁簡易操作開發版並取得感測器數據。近期打算用樹莓派做一個通信協定的模擬數據測試,其在開關機的過程出現死當,剛好可以重做映像檔,試試Ubuntu 23.04。
關於遠端控制樹莓派的方式,一般有CLI(Command Line Interface)和GUI(Graphical User Interface)兩種方式,簡言之,可理解為分別遠端到樹莓派的終端機(terminal),用文字傳送指令,以及遠端樹莓派的GNOME桌面。其中遠端桌面方式又可分為RDP(Remote Desktop Protocol)和VNC(Virtual Network Computing); 而遠端到樹莓派終端機的方式一般用SSH(Secure SHell)。以前將樹莓派作為Apache和MySQL伺服器,用SSH遠端並輸入命令行指令即足以啟用或停止伺服器和防火牆,同時只要其開機並連上網路,即可用SSH遠端。然而,若使用window系統內建的遠端桌面軟體(RDP),需登入用戶桌面後,才能順利連線。
此次趁安裝Ubuntu desktop 23.04,一併安裝VNC遠端桌面,期望讓樹莓派重新開機後且尚未登入用戶桌面時,亦能順利遠端樹莓派並登入用戶桌面。在安裝VNC遠端桌面前,先來檢視SSH和RDP是否能順利遠端連線。在Ubuntu desktop 23.04中,SSH和RDP的設定與22.04沒有差異,簡單紀錄如下:
SSH:
樹莓派端(被控端)
sudo apt update #取得update清單
sudo apt install openssh-server #安裝ssh server
sudo systemctl start ssh #啟用ssh服務
sudo service ssh status #查看ssh服務是否為active狀態
電腦端(控制端)
ssh 樹莓派用戶帳號@樹莓派IP
RDP:
樹莓派端(被控端)


電腦端(控制端)
 
 
來到本文主軸,VNC遠端桌面的安裝方式如下:
 1. 連結到RealVNC官網下載VNC安裝程式到樹莓派中,其中選擇arm64版本,表示適用於64bits。 

2.下載的檔案為.tar.gz壓縮檔,可在終端機中先解壓縮,語法如下。
 tar -xvf VNC-Connect-Installer-1.3.0-Linux-ARM64.tar.gz
3.接下來點擊解壓縮後的檔案,進到安裝畫面如下。樹莓派為被控端,所以應安裝的軟體為VNC Server。
 


4.完成上述的安裝過程後,接著在終端機輸入下列查看指令,確認VNC是否為啟動狀態(active)。
systemctl status vncserver-x11-serviced.service
systemctl status vncserver-virtuald.service
5.請仔細查看是否有下列異常訊息,若有,請繼續執行第6個步驟。
/usr/bin/vncserver-x11-core: error while loading shared libraries: libbcm_host.so.0: cannot open shared object file: No such file or directory.
vncserver-x11-serviced: Server exited with status 127, restarting in 5s
6.第5步驟說明找不到libbcm_host.so.0,需要在/usr/lib/aarch64-linux-gnu中建立函式庫連結,語法如下。
cd /usr/lib/aarch64-linux-gnu
sudo ln libvcos.so /usr/lib/libvcos.so.0
sudo ln libvchiq_arm.so /usr/lib/libvchiq_arm.so.0
sudo ln libbcm_host.so /usr/lib/libbcm_host.so.0
sudo ln libmmal.so /usr/lib/libmmal.so.0
sudo ln libmmal_core.so /usr/lib/libmmal_core.so.0
sudo ln libmmal_components.so /usr/lib/libmmal_components.so.0
sudo ln libmmal_util.so /usr/lib/libmmal_util.so.0
sudo ln libmmal_vc_client.so /usr/lib/libmmal_vc_client.so.0
sudo ln libvcsm.so /usr/lib/libvcsm.so.0
sudo ln libcontainers.so /usr/lib/libcontainers.so.0
過程中,可能會出現類似下列幾條失敗的回應訊息,不影響,只要libbcm_host.so.0順利建立即可。
 ln: 存取 'libmmal.so' 失敗: 沒有此一檔案或目錄
 ln: 存取 'libmmal_core.so' 失敗: 沒有此一檔案或目錄
 ln: 存取 'libmmal_components.so' 失敗: 沒有此一檔案或目錄
7.接著在終端機輸入下列啟動VNC服務指令,可搭配上述的查看指令,確認其啟動狀態。
 sudo systemctl enable vncserver-virtuald.service 
 sudo systemctl enable vncserver-x11-serviced.service  
 sudo systemctl start vncserver-virtuald.service   
 sudo systemctl start vncserver-x11-serviced.service
8.若有出現該VNC的icon,即是VNC Server已經安裝成功。另外,對該icon點擊右鍵,可看到功能清單,包含常用於Viewer端和Server端的File Transfer功能。
 
9.安裝完樹莓派端的VNC Server後,接著只要在電腦端安裝VNC Viewer,若電腦端的操作系統為window系統,可直接點擊該RealVNC官網連結,下載安裝後,即可看到VNC Viewer介面。如此一來,當樹莓派重新開機後且尚未登入用戶桌面時,亦能順利遠端樹莓派並登入用戶桌面,達到無需對樹莓派插接螢幕,鍵盤和滑鼠的真正本地(LAN or VPN)遠端操控。(OS:初步達到減少機房和電腦桌之間的來回奔波,降低運動量...)

然而,上述僅限於同一個本地網域的使用場景。若要進一步做到跨網域的遠端桌面,可進一步設定RealVNC cloud connection, 步驟如下:
1.用帳號登入Lite-RealVNC官網,選擇LITE版本和點擊Active,其可支持一位使用者操控三台遠端裝置的服務。
 
2.回到安裝VNC server的被控端裝置,點擊VNC icon, 並在清單中選擇Licensing,會出現如下圖對話視窗等等,依序填上VNC的帳號和密碼,並選擇Next.

3.選擇允許cloud和direct connection,並選擇Next,其中可依據個人需求自行設定密碼(VNC password),不一定要使用操作系統的密碼。

 

4.完成設定後,應可看到下圖摘要內容。

5.此時檢視剛已登入官網的畫面,應可看到下圖已設定的裝置狀態,點擊connect,其會啟動電腦端(控制端)的VNC Viewer軟體,並將該被控端設定在Viewer中,往後跨網域的遠端連線只要點選Viewer軟體中的被控端裝置,不用再進到官網中。


參考資料:
1. #installing-vnc-on-raspberry-pi
2. #What-are-cloud-connections-and-direct-connections
3. #establishing-a-direct-connection
4. #Lite-RealVNC
相关文章:
 
[Raspberry Pi]如何用VNC遠端控制樹莓派(Ubuntu desktop 23.04)?
之前曾利用VMware探索CentOS,熟悉Linux操作系統的指令和配置運作方式,後來在樹莓派價格飛漲的時期,遇到貴人贈送Raspberry Pi 4 model B / 8GB,這下工具到位了,索性跳過樹莓派官方系統(Raspberry Pi OS),直…...
 
17.HPA和rancher
文章目录 HPA部署 metrics-server部署HPA Rancher部署Rancherrancher添加集群仪表盘创建 namespace仪表盘创建 Deployments仪表盘创建 service 总结 HPA HPA(Horizontal Pod Autoscaling)Pod 水平自动伸缩,Kubernetes 有一个 HPA 的资源&…...
 
VS2022远程Linux使用cmake开发c++工程配置方法
文章目录 远程连接CMakePresets.json的配置Task.vs.json配置launch.vs.json配置最近使用别人在VS2015上使用visualgdb搭建的linux开发环境,各种不顺手,一会代码不能调转了,一会行号没了,调试的时候断不到正确的位置,取消的断点仍然会进。因此重新摸索了一套使用vs的远程开…...
 
《强化学习:原理与Python实战》——可曾听闻RLHF
前言: RLHF(Reinforcement Learning with Human Feedback,人类反馈强化学习)是一种基于强化学习的算法,通过结合人类专家的知识和经验来优化智能体的学习效果。它不仅考虑智能体的行为奖励,还融合了人类专家…...
 
STM32——RTC实时时钟
文章目录 Unix时间戳UTC/GMT 时间戳转换BKP简介BKP基本结构读写BKP备份寄存器电路设计关键代码 RTC简介RTC框图RTC基本结构硬件电路RTC操作注意事项读写实时时钟电路设计关键代码 Unix时间戳 Unix 时间戳(Unix Timestamp)定义为从UTC/GMT的1970年1月1日…...
 
webSocket 开发
1 认识webSocket WebSocket_ohana!的博客-CSDN博客 一,什么是websocket WebSocket是HTML5下一种新的协议(websocket协议本质上是一个基于tcp的协议)它实现了浏览器与服务器全双工通信,能更好的节省服务器资源和带宽…...
 
c#设计模式-结构型模式 之 代理模式
前言 由于某些原因需要给某对象提供一个代理以控制对该对象的访问。这时,访问对象不适合或者不能直接 引用目标对象,代理对象作为访问对象和目标对象之间的中介。在学习代理模式的时候,可以去了解一下Aop切面编程AOP切面编程_aop编程…...
 
openpnp - 自动换刀的设置
文章目录 openpnp - 自动换刀的设置概述笔记采用的openpnp版本自动换刀库的类型选择自动换刀设置前的注意事项先卸掉吸嘴座上所有的吸嘴删掉所有的吸嘴设置自动换刀的视觉识别设置吸嘴座为自动换刀 - 以N1为例备注补充 - 吸嘴轴差个0.3mm, 就有可能怼坏吸嘴END openpnp - 自动换…...
 
《HeadFirst设计模式(第二版)》第十章代码——状态模式
如下图所示,这是一个糖果机的状态机图,要求使用代码实现: 初始版本: package Chapter10_StatePattern.Origin;/*** Author 竹心* Date 2023/8/19**/public class GumballMachine {final static int SOLD_OUT 0;final static int…...
 
day-25 代码随想录算法训练营(19)回溯part02
216.组合总和||| 思路:和上题一样,差别在于多了总和,但是数字局限在1-9 17.电话号码的字母组合 思路:先纵向遍历第i位电话号码对于的字符串,再横向递归遍历下一位电话号码 93.复原IP地址 画图分析: 思…...
PG逻辑备份与恢复
文章目录 创建测试数据pg_dump 备份pg_restore 恢复pg_restore 恢复并行备份的文件PG 只导出指定函数 创建测试数据 drop database if exists test; create database test ; \c test create table t1(id int primary key); create table t2(id serial primary key, name varch…...
 
图数据库_Neo4j和SpringBoot整合使用_实战创建明星关系图谱---Neo4j图数据库工作笔记0010
然后我们再来看一下这个明星关系图谱 可以看到这里 这个是原来的startRelation 我们可以写CQL去查询对应的关系 可以看到,首先查询出来以后,然后就可以去创建 我们可以把写的创建明星关系的CQL,拿到 springboot中去执行 可以看到,这里我们先写一个StarRelationRepository,然…...
 
Linux网络编程:Socket套接字编程(Server服务器 Client客户端)
文章目录: 一:定义和流程分析 1.定义 2.流程分析 3.网络字节序 二:相关函数 IP地址转换函数inet_pton inet_ntop(本地字节序 网络字节序) socket函数(创建一个套接字) bind函数(给socket绑定一个服务器地址结…...
 
Mac OS下应用Python+Selenium实现web自动化测试
在Mac环境下应用PythonSelenium实现web自动化测试 在这个过程中要注意两点: 1.在终端联网执行命令“sudo pip install –U selenium”如果失败了的话,可以尝试用命令“sudo easy_install selenium”来安装selenium; 2.安装好PyCharm后新建project&…...
 
每天一道leetcode:934. 最短的桥(图论中等广度优先遍历)
今日份题目: 给你一个大小为 n x n 的二元矩阵 grid ,其中 1 表示陆地,0 表示水域。 岛 是由四面相连的 1 形成的一个最大组,即不会与非组内的任何其他 1 相连。grid 中 恰好存在两座岛 。 你可以将任意数量的 0 变为 1 &#…...
 
【学习日记】【FreeRTOS】FreeRTOS 移植到 STM32F103C8
前言 本文基于野火 FreeRTOS 教程,内容是关于 FreeRTOS 官方代码的移植的注意事项,并将野火例程中 STM32F103RC 代码移植到 STM32F103C8。 一、FreeRTOS V9.0.0 源码的获取 两个下载链接: 官 网 代码托管 二、源码文件夹内容简介 Source…...
 
Qt 屏幕偶发性失灵
项目场景: 基于NXP i.mx7的Qt应用层项目开发,通过goodix使用触摸屏,走i2c协议。 问题描述 触摸屏使用过程中意外卡死,现场分为多种: i2c总线传输错误,直观表现为触摸屏无效,任何与触摸屏挂接在同一总线上的i2c设备,均受到干扰,并且在传输过程中内核报错以下代码: G…...
 
如何在pycharm中指定GPU
如何在pycharm中指定GPU 作者:安静到无声 个人主页 目录 如何在pycharm中指定GPU打开编辑配置点击环境变量添加GPU配置信息推荐专栏在Pycharm运行程序的时候,有时候需要指定GPU,我们可以采用以下方式进行设置: 打开编辑配置 点击环境变量 添加GPU配置信息 添加名称:CU…...
C#判断字符串中有没有字母,正则表达式、IsLetter
要判断字符串中是否包含字母,可以使用正则表达式或者循环遍历字符串的方式。 方法一:使用正则表达式 using System.Text.RegularExpressions;string input "Hello123"; bool containsLetter Regex.IsMatch(input, "[a-zA-Z]");上…...
Jtti:Ubuntu怎么限制指定端口和IP访问
在 Ubuntu 系统中,可以使用防火墙规则来限制特定的端口和IP访问。常用的防火墙管理工具是 iptables,以下是使用 iptables 来限制指定端口和IP访问的步骤: 安装 iptables: 如果系统中没有安装 iptables,可以使用以下命…...
 
地震勘探——干扰波识别、井中地震时距曲线特点
目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波:可以用来解决所提出的地质任务的波;干扰波:所有妨碍辨认、追踪有效波的其他波。 地震勘探中,有效波和干扰波是相对的。例如,在反射波…...
基于大模型的 UI 自动化系统
基于大模型的 UI 自动化系统 下面是一个完整的 Python 系统,利用大模型实现智能 UI 自动化,结合计算机视觉和自然语言处理技术,实现"看屏操作"的能力。 系统架构设计 #mermaid-svg-2gn2GRvh5WCP2ktF {font-family:"trebuchet ms",verdana,arial,sans-…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
 
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
 
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
 
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
 
GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...
 
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
