###### 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)