---
# System prepended metadata

title: 'Ubuntu 18.04 LTS 的 LXD, SSH 安裝'
tags: [lab]

---

###### tags: `lab`

# Ubuntu 18.04 LTS 的 LXD, SSH 安裝

實驗室建置伺服器時的紀錄

## 0. 懶人包
1. 登入 Server
2. `lxc copy demo-ins <你的Container名稱>`，已經設定好GPU、SSH、Shared folder。
3. `lxc list`，記下你的Container instance的 IPV4 位置 -> `<ContainerIP>`
![](https://i.imgur.com/Q3c20V1.png)

5. `lxc start <你的Container名稱>`
6. 輸入`sudo iptables -L PREROUTING -t nat`檢查被使用的port number，待會要選的`<PortNumber>`不能被使用過
![](https://i.imgur.com/NYSVcOs.png)
7. `sudo iptables -t nat -A PREROUTING -i eno1 -p tcp --dport <PortNumber> -j DNAT --to <ContainerIP>:22`，將ssh連線封包轉傳至container
8. `sudo dpkg-reconfigure iptables-persistent`，皆選擇Yes，保存iptables的設定
9. `lxc shell <你的Container名稱>`
10. `su ubuntu`，**離開root模式**
11. 依照[用憑證讓SSH遠端連線不用打密碼](https://medium.com/feveral%E7%9A%84%E7%A8%8B%E5%BC%8F%E7%AD%86%E8%A8%98/%E7%94%A8%E6%86%91%E8%AD%89%E8%AE%93ssh%E9%81%A0%E7%AB%AF%E9%80%A3%E7%B7%9A%E4%B8%8D%E7%94%A8%E6%89%93%E5%AF%86%E7%A2%BC-3d187cd9f354)的說明，(可利用lxc的push或是share folder)將public key放入container內的~/.ssh/authorized_key內並重啟ssh server。
12. 接下來就可以用遠端SSH連線至Container囉(IP：`<SERVER_IP>:5xxxx`，Username：`ubuntu`)
13. 安裝顯卡驅動（於Container內）：
`sudo sh /share-nvidia-driver/NVIDIA-Linux-x86_64-470.103.01.run --no-kernel-module`
    * 確認GPU驅動版本：`ubuntu-drivers devices` or `nvidia-smi`
* **NOTE**: 務必確認Container內的顯卡驅動版本與Host系統一致


## 1. 設置SSH, UFW => 為了不要被資安通報
1. 依照[在ubuntu上允許SSH連線並設定黑白名單](https://medium.com/feveral%E7%9A%84%E7%A8%8B%E5%BC%8F%E7%AD%86%E8%A8%98/%E5%9C%A8ubuntu%E4%B8%8A%E5%85%81%E8%A8%B1ssh%E9%80%A3%E7%B7%9A%E4%B8%A6%E8%A8%AD%E5%AE%9A%E9%BB%91%E7%99%BD%E5%90%8D%E5%96%AE-6ea4031a00c5)設置SSH連線(`PasswordAuthentication`也設置為`no`)

2. 依照[[教學] UFW 防火牆設定軟體操作指南](https://xenby.com/b/258-%E6%95%99%E5%AD%B8-ufw-%E9%98%B2%E7%81%AB%E7%89%86%E8%A8%AD%E5%AE%9A%E8%BB%9F%E9%AB%94%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97)文章說明，僅開啟port22供SSH使用

## 2. Host端安裝Nvidia驅動、LXD
1. 於terminal安裝Nvidia驅動
`sudo ubuntu-drivers devices` (確認顯卡型號與推薦的驅動版本)
`sudo apt purge nvidia*`
`sudo add-apt-repository ppa:graphics-drivers/ppa`
`sudo apt update`
`sudo apt install nvidia-driver-470` (GTX 1080適用470版本的驅動)

2. 重開機

3. 在terminal輸入`nvidia-smi`或`nvidia-settings`檢查顯卡是否正常顯示

4. 依照[LXD官網指南](https://linuxcontainers.org/lxd/getting-started-cli/#LXD)安裝並建立第一個LXC container
    * 安裝時使用的設置：LXD 4.0 LTS、初始化全預設選項、test-ins為第一個container的名稱

## 3. Container初始設定
1. 新增Container(若你剛剛沒有新增)：`lxc launch ubuntu:18.04 <YourInstanceName>`

2. 讓Container使用所有GPU：
`sudo lxc config device add <YourInstanceName> gpu gpu`，`<YourInstanceName>`在此即為test-ins

3. 設定共享目錄：
`lxc config set test-ins security.privileged true`
`lxc config device add <YourInstanceName> <ShareName> disk source=<path1> path=<path2>`
其中path1為host端的資料夾路徑，path2為container內的路徑，範例如下：
`lxc config device add test-ins share-nvidia disk source=~/nvidia-driver-470 path=/nvidia-470`
    * **顯卡驅動的共享目錄為`~/nvidia-driver-470`**
    
4. 加入`lxd`群組取得權限：
    ```
    sudo adduser <YourUserName> lxd
    newgrp lxd
    ```
    
3. ```
    sudo lxc start test-ins
    sudo lxc shell test-ins
    ```
    進入test-ins的CLI
    
7. 安裝顯卡驅動：
`sudo sh /share-nvidia-driver/NVIDIA-Linux-x86_64-470.103.01.run --no-kernel-module`
確認GPU驅動版本：`ubuntu-drivers devices` or `nvidia-smi`

## 4. 設置Container的ssh連線
以下以 **C!** 代表container端， **H!** 代表Host端
1. 【**C!**】 依照[在ubuntu上允許SSH連線並設定黑白名單](https://medium.com/feveral%E7%9A%84%E7%A8%8B%E5%BC%8F%E7%AD%86%E8%A8%98/%E5%9C%A8ubuntu%E4%B8%8A%E5%85%81%E8%A8%B1ssh%E9%80%A3%E7%B7%9A%E4%B8%A6%E8%A8%AD%E5%AE%9A%E9%BB%91%E7%99%BD%E5%90%8D%E5%96%AE-6ea4031a00c5)這篇文章設置，其中`/etc/ssh/sshd_config`需要更改的部分如下
    1. `PermitRootLogin`不更動
    
    **※ Container內使用者預設是root，記得一定要鎖校內IP！不然就改用其他用戶登入！**
    
2. 【**C!**】
    ```
    /etc/init.d/ssh restart
    exit
    ```

2. 為了可以ssh連接container，我們需要利用PREROUTING的方式轉送ssh封包，選定一個任意Port數字 `<PortNumber>`(建議使用50000~51000)
    **※ 先在host端以 `sudo iptables -L PREROUTING -n -t nat` 檢查已經被用掉的Port!**

4. 【**H!**】 `sudo iptables -t nat -A PREROUTING -i eno1 -p tcp --dport <PortNumber> -j DNAT --to <ContainerIP>:22`，ContainerIP可用`lxc list`查詢。

6. 【**H!**】 `sudo dpkg-reconfigure iptables-persistent`，皆選擇Yes，保存iptables的設定
7. 【**C!**】 依照[用憑證讓SSH遠端連線不用打密碼](https://medium.com/feveral%E7%9A%84%E7%A8%8B%E5%BC%8F%E7%AD%86%E8%A8%98/%E7%94%A8%E6%86%91%E8%AD%89%E8%AE%93ssh%E9%81%A0%E7%AB%AF%E9%80%A3%E7%B7%9A%E4%B8%8D%E7%94%A8%E6%89%93%E5%AF%86%E7%A2%BC-3d187cd9f354)的說明，(可利用lxc的push或是share folder)將public key放入container內的~/.ssh/authorized_key內並重啟ssh server。
8. 【**YOUR PC**】 利用ssh連線，port設定為`<PortNumber>`，使用者名稱為`root` (default)，即可成功連線

## 5. VNC or  (Future Work)

## 6. ZFS擴充
* 這次LXD中安裝的檔案系統是ZFS，當我們的容器空間不足時，可以利用ZFS的套件"zpool"擴展ZFS pool

* LXD內的ZFS pool可以用`lxd storage list`查詢pool的名稱與來源檔案路徑
* 下面舉例以新增10GB空間為範例，並以`default`舉例
```
sudo truncate -s +10G /var/snap/lxd/common/lxd/disks/default.img
sudo zpool set autoexpand=on default
sudo zpool online -e default /var/snap/lxd/common/lxd/disks/default.img
sudo zpool set autoexpand=off default
```
* 新增後，用`sudo zpool list`可以查看是否擴充成功。
```
NAME      SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
default   138G  20.6G   117G         -     4%    14%  1.00x  ONLINE  -
```

## Reference
1. [搭建多人共用的GPU服务器](https://blog.csdn.net/wangke0809/article/details/80235989)
1. [在Ubuntu 18.04 中安裝NVIDIA RTX系列顯示卡驅動程式與Tensorflow](https://ivan-eng-murmur.medium.com/%E5%9C%A8ubuntu-18-04-%E4%B8%AD%E5%AE%89%E8%A3%9Dnvidia-rtx%E7%B3%BB%E5%88%97%E9%A1%AF%E7%A4%BA%E5%8D%A1%E9%A9%85%E5%8B%95%E7%A8%8B%E5%BC%8F%E8%88%87tensorflow-6eb58a5da818)
1. [LXD - Installation](https://linuxcontainers.org/lxd/getting-started-cli/#LXC)
1. [如何在Ubuntu 16.04或18.04上安裝與設定VNC server](https://peterli.website/%E5%A6%82%E4%BD%95%E5%9C%A8ubuntu-16-04%E6%88%9618-04%E4%B8%8A%E5%AE%89%E8%A3%9D%E8%88%87%E8%A8%AD%E5%AE%9Avnc-server/)
1. [Linux Ubuntu安装vnc并解决花屏问题](https://blog.csdn.net/humanking7/article/details/105203744)
1. [使用lxc与VNC来获得桌面环境（Crostini）](https://pixelbook.silentselene.com/index.php/archives/77/)
1. [How to make iptables rules persistent after reboot on Linux](https://linuxconfig.org/how-to-make-iptables-rules-persistent-after-reboot-on-linux)
1. [修复Ubuntu下因indicator applet的bug导致VNC客户端无法输入s和m的方法](https://blog.csdn.net/rheostat/article/details/7869774)