---
tags: Jetson Nano, Basic, NVIDIA, 基礎, 教學, 環境安裝, 設定, Mac, 勇哥, Yungger
Refs:
- http://baijiahao.baidu.com/s?id=1646393833889121079&wfr=spider&for=pc
- https://zh-hant.hotbak.net/key/%E7%8E%A9%E8%BD%89JetsonNano%E4%B8%80%E9%96%8B%E6%A9%9F%E6%BA%96%E5%82%99%E8%88%87%E9%81%A0%E7%A8%8B.html
- https://blog.csdn.net/bbc2005/article/details/80034065
- https://blog.csdn.net/bbc2005/article/details/80034065
- https://blog.csdn.net/qianbin3200896/article/details/103760640?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-2.control
- https://medium.com/@yanweiliu/nvidia-jetson-nano%E5%AD%B8%E7%BF%92%E7%AD%86%E8%A8%98-%E4%B8%80-%E5%88%9D%E6%AC%A1%E4%BD%BF%E7%94%A8-4dce57a0b2b1
- https://www.digikey.com/en/maker/projects/getting-started-with-the-nvidia-jetson-nano-part-1-setup/2f497bb88c6f4688b9774a81b80b8ec2
- https://www.rs-online.com/designspark/jetson-nano-1-cn
---
# Jetson Nano - 遠端連線


[TOC]
---
IP 與 MAC address
--
首先, 須先知道 Jetson Nano 的網卡 IP 與 MAC address, 後續的網路連線服務 (例如 Telnet, SFTP, VNC, ...) 都會用到 (例如我的 Jetson Nano 是 IP 為 192.168.31.222 與 MAC address 為 ...:0C:D0:40)
:::success
提供服務的主機, 通常建議不使用動態配發 IP, 而是在內網的 DHCP Server (例如 WiFi AP 上) 上直接指定一個固定 IP 與主機的網卡 MAC address (例如 192.168.0.222 => 1c:xx.xx.xx.xx:94) 綁定, 如此, 用戶才不需要每次都需要在連線前, 特別花功夫去確認目前主機的 IP 是哪一個?
:::
查詢的最簡單常見的方式有兩種:
- 終端機指令
`$ ifconfig`

- IP Scanner 類的軟體來掃描區域網路

---
終端機連線: SSH (Secure Shell)
---
要如何從遠端登入 Jetson Nano 呢?最簡單普遍使用的方式就是在遠端主機上先架好並啟動 SSH Server, 然後用戶電腦再透過 SSH Client 軟體來連上遠端主機。
:::success
使用遠端連線的主要好處:
- 不使用螢幕, 可少掉畫面顯示運算上吃掉 GPU 資源。
- 避免因外接設備而產生電流供應上的不足, 所造成系統不穩或當機的風險。
- 不需要多餘的實體設備與有線連線, 減少所佔空間, 與多工開發上的方便。
:::
:::info
### OpenSSH Server
Ubuntu 系统預設只安裝了 openssh-client,但若要由用戶透過 SFTP Client 軟體上傳資料到 Jetson Nano 的 SFTP Server 主機上, 就還需要安裝並啟動 openssh-server。
:::
- 檢查 Jetson Nano 主機上是否已安装 sftp
`$ dpkg --get-selections | grep ssh`

:::success
Jetson Nano 預設是已安裝並啟動了 SSH Server. 所以, 只要透過慣用的 SSH Client (例如 [PuTTY](https://www.putty.org/) 或 [MobaXterm](https://mobaxterm.mobatek.net/download.html)), 就可以輕易從遠端筆電/桌機連上 Jetson Nano。
:::
- 上圖顯示均已安裝, 無須再安裝, 只需啟動它, 但若是沒有則自行安裝即可
- 安裝 openssh-server
`$ sudo apt update -y`
`$ sudo apt-get upgrade -y`
`$ sudo apt-get install openssh-server`
- 安裝完後會自動啟動, 可以查詢目前狀態
`$ sudo systemctl status ssh`
- 先檢查 SSH 服務是否已啟動
`$ sudo ps -e | grep ssh`
若尚未啟動
`$ sudo service ssh start`
- 修改設定檔
`$ sudo nano /etc/ssh/sshd_config`
將 PermitRootLogin without-password 或 prohibit-password 加上註解符號, 再加上一行 PermitRootLogin yes
- 安裝 chrony 来保持時間同步
`$ sudo apt-get install chrony`
:::danger
#### Ubutun 的防火牆 UFW 若是啟用時, 記得要開放 SSH 埠
`$ sudo ufw allow ssh`
:::
:::info
### SSH Clients
:::
- 在用戶端, 開啟 SSH client 軟體
Windows: PuTTY 或 [MobaXterm](https://mobaxterm.mobatek.net/)
MacOS: [Termius](https://termius.com/mac-os)
- 輸入遠端主機 Jetson Nano 的登入用戶帳密

- 連上 Jetson Nano 主機的終端機畫面如下

:::danger
若使用 SSH Client 軟體無法連線到 Jeston Nano 時, 先確認登入的帳密是否有誤 (尤其是大小寫 or 語系的切換錯誤) 或再輸入以下指令試試
`$ sudo ssh-keygen -A`
`$ /etc/init.d/ssh restart`
:::
#### 雖然透過 SSH 連上 Jetson Nano 是最簡單與快速的方式, 但卻限制於文字的終端機方式. 因此, 若需要的是圖形化桌面視窗的操作方式, 就可能需要使用 VNC 或 RDP 的遠端共享桌面的方式來連線。
---
桌面分享連線:VNC
---
:::info
### VINO (VNC Server)
VINO 是 Jetson Nano 所預設內建的 VNC Server, 但使用上卻有幾項缺點必須先克服。
- 官方版映像檔與 Gnome 桌面有不相容的情況,必須要先修正後才能使用。
- 必須在本機上的系統設定, 設定桌面分享, 以及將 VINO 加入初始啟動程式中。
- 最大的缺點就是登出或重新開機後, 又必須到 Jetson Nano 本機上登入, VINO VNC Server 被啟動後, 才能再允許由遠端連線桌面。
:::
:::warning
### 移除與重新安裝 VINO VNC Server
:::
- 先移除 VINO
`$ sudo apt remove vino`
- 重新安裝 VINO
`$ sudo apt-get install vino`

- 設定 VINO 登入選項 (VNC 密碼假設為 x123456789x)
`$ export DISPLAY=:0`
`$ gsettings set org.gnome.Vino prompt-enabled false`
`$ gsettings set org.gnome.Vino require-encryption false`
`$ gsettings set org.gnome.Vino authentication-methods "['vnc']"`
`$ gsettings set org.gnome.Vino lock-screen-on-disconnect false`
`$ gsettings set org.gnome.Vino vnc-password $(echo -n "x123456789x"|base64)` => 若登入VNC需先經認證, 可修改此處密碼
`$ sudo reboot`
:::danger
- 需要注意的是,不要用 sudo 来執行上面的指令,否則修改的不是當前的配置。
- 若出現錯誤訊息: failed to commit changes to dconf: 沒有 X11 $ DISPLAY 不能自動執行 D-Bus, 則需要先在終端機內輸入以下指令
`$ export DISPLAY=:0`
`$ gsettings set org.gnome.login-screen disable-user-list true`
重新啟動
`$ sudo reboot`
再重新執行之前發生錯誤的指令, 應該就沒有錯誤發生了

:::
- 修正共享桌面的錯誤, 編輯「 org.gnome.Vino.gschema.xml 」補上缺少的 enable 選項
`$ sudo nano /usr/share/glib-2.0/schemas/org.gnome.Vino.gschema.xml`
- 在檔案的最下方的</schema>之前, 補上以下內容至 xml檔中
```xml=
<key name='enabled' type='b'>
<summary>Enable remote access to the desktop</summary>
<description>
If true, allows remote access to the desktop via the RFB
protocol. Users on remote machines may then connect to the
desktop using a VNC viewer.
</description>
<default>false</default>
</key>
```
:::danger
:star: :star: [常用的 Nano 編輯器指令](https://www.itread01.com/content/1548258701.html)
:::
- 確認無誤, 存檔後離開 (Ctrl+O => Enter => Ctrl+X)

- 接著再重新編譯 Gnome schemas
`$ sudo glib-compile-schemas /usr/share/glib-2.0/schemas`
- 開啟 VNC Server
`$ /usr/lib/vino/vino-server`
- 執行過程若不再出現錯誤訊息, 表 VINO 一切均已正常安裝與設定完畢
:::info
### VNC Viewer (VNC Client)
:::
#### 遠端用戶可使用 [VNC Viewer](https://www.realvnc.com/en/connect/download/viewer/) 來連到 Jetson Nano 的 VNC Server, 控制其桌面

- 若有設登入前的認證密碼時, 需先輸入

- 遠端連上 Jetson Nano 的桌面畫面

- 若想確認系統是否已有正確啟動 VNC Server,可先安裝 nmap,再用這個工具來檢查。
`$ sudo apt-get install nmap`
`$ nmap 主機名稱或IP`
- 若正常的話,應會看到下面資訊
5900/tcp open vnc
- 若無, 表示尚未啟動

#### 到此為止, 遠端透過 VNC 來連上 Jetson Nano 的桌面似乎以沒問題。但實際作業卻又會碰到一個新的問題, 因為當您登出 or 重新開機後, VNC Server 因沒有自動啟動, 所以, 下一次又變成無法由遠端連線, 除非先在本機登入才會啟動 VNC Server, 然後才能透過 VNC Client 進行遠端桌面的連線。
:::warning
### <font color=red>設定 VINO VNC Server 登入後自動啟動</font>
:::
- 系统設定 VINO 自動啟用
`$ gsettings set org.gnome.Vino enabled true`
- 編輯 vino-server.desktop
`$ mkdir -p ~/.config/autostart`
`$ sudo nano ~/.config/autostart/vino-server.desktop`
- 填入以下內容
```
[Desktop Entry]
Type=Application
Name=Vino VNC server
Exec=/usr/lib/vino/vino-server
NoDisplay=true
```
- Ctrl+O 存檔 => Enter 確認 => Ctrl+X 離開
:::warning
### <font color=red>設定 Jetson Nano 開機後自動登入</font>
:::
雖然, 我們將系統設為登入後自動啟動, 如此可以省下一些啟動 VNC Server 的指令作業, 但卻必須 "登入後才會被啟動"。因此, 若要一開機就自動能由遠端 VNC Client 連上 Jetson Nano, 建議直接設定使用者為自動登入到桌面。
#### 作業方式: 登入 => 系統設置=> 使用者 => 解除鎖定 => 輸入密碼 => 勾選 自動登入 => x 離開

---
:::danger
### 若出現了 Unable to init server: 無法連接: 連線被拒絕
表示須先在 [系統設定值] 中, 啟動 [桌面分享]
- 勾選「允許其它使用者觀看及控制你的桌面」
- 點選桌面左上角 [綠色 ubuntu 圖示]按右鍵, 選擇[應用程式], 搜尋[初始啟動程式]
- 在偏好設定畫面按「加入」, 開啟新增始動程式
- 名稱:Vino
- 指令:/usr/lib/vino/vino-server
- 註解:VNC Server
- 存檔完成設定


:::
---
桌面分享連線:RDP
---
:::info
### 另一種遠端桌面分享連線: RDP (Remote Desktop Protocol)
:::
雖然 Jetson Nano 已內建 VINO VNC Server, 但卻因官方版映像檔與舊的 Gnome 桌面不相容,必須經過上述複雜的程序重新設定後才能使用。所以, 另一個方式是改為 <Font color=green>透過 RDP 來連線會更方便簡單些</font>。
- Server 端安裝
$ sudo apt update
$ sudo apt install -y xrdp
$ sudo reboot
- Client 端連線
<Font color=red>直接使用 Microsoft Remote Desktop 軟體連線</Font>

:::danger
#### 問題排除: 若剛一連線, 好像已登入但卻畫面立即閃退, 則必須在 Jetson Nano 的 RDP Server 上還須進一步安裝 xfce4 與一些設定
:::
- 安裝 xfce4
$ sudo apt-get install xfce4
- 設定 xfce4
$ echo xfce4-session > ~/.xsession
$ touch .session
$ sudo nano /etc/xrdp/startwm.sh
在 ./etc/X11/Xsession 的上面加一行
xfce4-session

- 重新啟動後, 再由用戶端連線, 應該就可連上
$ sudo service xrdp restart
:::success
#### 一些 xRDP 的指令:
:::
- 查詢 xrdp 目前的運行狀態
$ systemctl status xrdp
- 重啟 xrdp 服務
$ sudo systemctl restart xrdp
- 啟用 xrdp 服務
systemctl enable xrdp
- 若系統是禁用 ufw, 造成 xrdp 的端口 3389 被防火牆檔下時
$ sudo ufw enable
$ sudo ufw allow 3389/tcp
---
檔案傳輸: sFTP
---
當遠端連上 Jetson Nano 的桌面後, 就可以讓用戶操控它就像在本機上操作一般, 但若想要將資料上傳或下載呢 ? 最普遍的方式就是透過 FTP 或 SFTP 來傳送。
:::success
SFTP 是 Secure File Transfer Protocol 的縮寫,在傳送文件的過程中會以加密的方式傳輸,它相對於傳統的FTP 是一種較安全的文件傳輸協定。
:::
:::warning
### 新增群组與用戶
:::
- 新增 SFTP 群组, 名稱自訂, 此處範例為 sftp-users
`$ sudo addgroup sftp-users`
- 新增 SFTP 用戶, 名稱自訂, 此處範例為 sftp
`$ sudo adduser sftp`
- 將 sftp 加入 sftp-users 群組, 並移出其他群組,且關閉 Shell 的權限
`$ sudo usermod -G sftp-users -s /bin/false sftp`
- 新增 SSH 群組, 名稱自訂, 此處範例為 ssh-users
`$ sudo addgroup ssh-users
- 將連線用戶 (例如 vincent) 加入 SSH 用戶群組
`$ sudo usermod -a -G ssh-users vincent`
:::danger
其他常用指令:
- 將用戶將入 sudo 群組
`$ sudo usermod -a -G sudo 用戶帳號`
參數 -a , 表示僅加入但不從既有的群組中移除
- 將用戶從群組中移除
`$ sudo deluser 用戶帳號 群組名稱`
例如 sudo deluser kevin sftp-users
:::
:::warning
### 新增共享目錄
:::
- 在 home 目錄下新增 sftp_root 目錄與 shared 子目錄
`$ sudo mkdir /home/sftp_root`
`$ sudo mkdir /home/sftp_root/shared`
- 更改 sftp_root 目錄權限, 並限制 ChrootDirectory 存取
`$ sudo chown root:sftp-users /home/sftp_root`
- 設定 shared 目錄權限, 並加入要存取
`$ sudo chown sftp:sftp-users /home/sftp_root/shared`
`$ sudo chmod 770 /home/sftp_root/shared`
:::warning
### 修改 OpenSSH 設定
只讓 ssh-uers 及 sftp-users 可通過 SSH 登入
:::
- 編輯 sshd_config 設定檔
`$ sudo nano /etc/ssh/sshd_config`
- 註解 Subsystem sftp /usr/lib/openssh/sftp-server
- 新增 Subsystem sftp internal-sftp
- 在檔案的尾端加上下面的片段
```
AllowGroups ssh-users sftp-users
Match group sftp-users
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
```
:::danger
經以上設定後, SSH 與 SFTP 用户均可使用 SSH 來連上主機,但使用SFTP 連上後, 會被限制存取的目錄僅限於 /home/sftp_root/shared。
:::
- 文件畫面修改如下圖:

- 最後, 重啟 SSH 服務
$ sudo service ssh restart
:::info
### SFTP Clients
:::
- 下載與安裝 SFTP Client 軟體
- Windows: [WinSCP](https://winscp.net/eng/download.php) 或 [MobaXterm](https://mobaxterm.mobatek.net/)
- MacOS: [ForkLift](https://apps.apple.com/tw/app/forklift-file-manager-and-ftp-sftp-webdav-amazon-s3-client/id412448059?mt=12) 或 [Cyberduck](https://cyberduck.io/download/)
- 開啟 SFTP Client 軟體, 輸入主機 IP 與連線用戶帳密

- 連上 Jetson Nano 主機

### 完成此文的實作, 接下來就可以隨時開關機, 控制主機, 共享檔案與桌面, ... 等開發與管理的工作了 !!