# 實驗室交接
### MailServer 管理
先登入 [NAS](https://nckuvisionlab.myqnapcloud.com/cgi-bin/)
找到 data > 歷屆資料備份 > 郭振鵬 > 其他備份 > 助教 > routine > 實驗室系上信箱.txt

打開後第一行是帳號、第二行是密碼(**密碼從左括號開始複製到斷行符號前面**)
接著登入 **實驗室zimbra** [mailserver](https://web.csie.ncku.edu.tw/),如資工系辦公告所示已於 2022 採用目前新的郵件系統[link](https://www.csie.ncku.edu.tw/zh-hant/news/12252)
前往喜好設定把新進學弟妹的信箱加入實驗室轉發名單。

### 凱予學長 Server
開啟 MobaXterm ,Sessions 是 140.116.247.102
id : p76094266
password : ********
大部分的東西都在 /home/p76094266/PoseFormer/ 路徑底下,demo 跟 inference 都已經透過 .sh 寫好。
至於筆電 window 的 demo 則是放在 /Reconstruction UI 這裡,先打開 demo.bash 選資料集預測。 接著透過 UI.bash 來視覺化預測結果(資料夾 result_ 是事先做好的 , result 下則是剛剛用 demo 預測的)
### 新 server 建立:
細節步驟可以參考 [學長 notion 筆記](https://greenwu.notion.site/Copy-of-Server-setup-475b1d3177084ed787e37d3bd19b968b) 來一步步建立 server 。
記得使用 Linux 為 **20.04** 那個隨身碟或是自備。
步驟:
1. **install nvidia-driver**
:::spoiler 流程
```
$ sudo add-apt-repository ppa:graphics-drivers/ppa <- Automatic Install Nvidia drivers on Ubuntu 20.04 using PPA repository (Using graphics-drivers PPA repository allows us to install bleeding edge Nvidia beta drivers at the risk of an unstable system. To proceed first add the ppa:graphics-drivers/ppa repository into your system)
$ sudo apt-get update <- upgrade system
$ sudo apt-get upgrade
$ ubuntu-drivers devices
******************************************************* <- 輸出 log 可能如下
# == /sys/devices/pci0000:00/0000:00:01.1/0000:02:00.0 ==
# modalias : pci:v000010DEd00001E07sv00001458sd000037BDbc03sc00i00
# vendor : NVIDIA Corporation
# model : TU102 [GeForce RTX 2080 Ti Rev. A]
# manual_install: True
# driver : nvidia-driver-440 - distro non-free recommended <- 通常會選 recommended 的
# driver : nvidia-driver-418-server - distro non-free
# driver : nvidia-driver-440-server - distro non-free
# driver : nvidia-driver-435 - distro non-free
# driver : xserver-xorg-video-nouveau - distro free builtin
```
接著:
```
$ sudo ubuntu-drivers autoinstall <- 或是根據 recommended版本 $sudo apt install nvidia-driver-440
$ sudo reboot
```
:::info
關於第一行指令的 PPA 是甚麼?
Ubuntu Linux 系統下的軟體都是以 apt 的方式來管理的,一般來說絕大部分的套件都來自於 Ubuntu 官方的套件庫,而如果我們需要的套件沒有被官方的套件庫收錄,或是官方收錄的套件版本過舊,就可能會採用 PPA 個人套件庫的套件。
PPA 是 Personal Package Archive 的縮寫,軟體開發者將原始碼上傳至 Launchpad 後,透過其線上編譯服務,產生預先編譯好的套件,提供使用者使用。由於 PPA 是屬於非官方的套件庫,所以通常軟體版本比較新,但穩定性也較差。
當然除了用 PPA ,[安裝說明文章](https://linuxconfig.org/how-to-install-the-nvidia-drivers-on-ubuntu-20-04-focal-fossa-linux)還可以使用其他方式來安裝 Nvidia 驅動
[參考文章](https://blog.gtwang.org/linux/ubuntu-linux-add-and-remove-ppa-command-tutorial/)
:::
___
2. **install CUDA**
```
sudo apt install nvidia-cuda-toolkit
```
然後檢查一下:
```
nvcc --version
```
___
3. **install ssh and activate**
:::spoiler 安裝 ssh 流程
```
$ sudo apt install ssh
$ sudo nano /etc/ssh/sshd_config <- Modify /etc/ssh/sshd_config
********************************** <-In sshd_config
...
# Port [custom_port(1025~)] <-改port
# LoginGraceTime 2m -- login period
MaxAuthTries 3 <- 改試錯幾次
...
***********************************
$ sudo ufw allow [custom_port]/tcp <- 防火牆允許哪個 port 通過 tcp 接收封包
$ sudo systemctl enable --now ssh
$ systemctl status ssh
```
比如當我們修改完 ssh 的 config /etc/ssh/sshd_config 的 port 之後,
ex:
```
Port 2023
```
就需要透過 restart 來使 ssh 改變 port(default 是 22)
```
$ sudo service ssh restart
```
可參考[教學文章](https://www.hostinger.com/tutorials/how-to-change-ssh-port-vps)了解更多 sshd_config 的設定,當然也可以**從實驗室現有運行主機上 copy 下來直接複製貼上 config 省事**。
然後記得把密碼加密
```
# /etc/sssd/sssd.conf
ldap_default_authtok_type = password
ldap_default_authtok = $ThisIsMyPassword$ <- 不用填入
# bash
$ sudo apt-get install sssd-tools
$ sudo sss_obfuscate -d default <- Domain selected from sssd.conf
# Enter password = $ThisIsMyPassword$ <- Console 會請你輸入密碼
# Enter again = $ThisIsMyPassword$
```
然後重新回 sssd.conf 的 ldap_default_authtok 欄位看, 它就會變成亂碼了。
:::
___
4. **link to LDAP server (through SSSD)**
```
$ sudo apt install sssd libpam-sss libnss-sss
```
接著修改 config ,一樣建議可以從連好的主機 copy 一份一樣的過來(因為這份文件是沒有 default 的,第一次建立為空):
```
$ sudo vim /etc/sssd/sssd.conf
```
接著取得驗證連上 LDAP:
```
openssl s_client -connect nckuvisionlab.myqnapcloud.com:389 -starttls ldap -showcerts < /dev/null | openssl x509 -text | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
```
:::spoiler 錯誤可能如下 :
基本上這步比較容易產生問題,因為我們需要通過憑證來連上我們的ldap(our lab qnap data) :
```
vision@vision-System-Product-Name:~$ sudo openssl s_client -connect nckuvisionlab.myqnapcloud.com:389 -starttls ldap -showcerts < /dev/null | openssl x509 -text | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
depth=0 CN = nckuvisionlab.myqnapcloud.com
verify error:num=20:unable to get local issuer certificate <-Error!
verify return:1
depth=0 CN = nckuvisionlab.myqnapcloud.com
verify error:num=21:unable to verify the first certificate <-Error!
verify return:1
DONE
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
```
or
```
vision@vision-System-Product-Name:~$ openssl s_client -connect nckuvisionlab.myqnapcloud.com:389 -showcerts < /dev/null | openssl x509 -text | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
write:errno=0
unable to load certificate
140658395555136:error:0909006C:PEM routines:get_name:no start line:../crypto/pem/pem_lib.c:745:Expecting: TRUSTED CERTIFICATE
```
[error to get cerification](https://stackoverflow.com/questions/11548336/openssl-verify-return-code-20-unable-to-get-local-issuer-certificate)
[憑證產生](https://blog.cssuen.tw/create-a-self-signed-certificate-using-openssl-240c7b0579d3)
成功的話,會出現 Verification: OK
並且 id 自己在QNAP的帳號會出現 uid ,因此當我們憑證失效的時候也是透過更新LDAP憑證來重新啟用
```
vision@vision-System-Product-Name:~$ openssl s_client -showcerts -CAfile ~/cert.pem -connect nckuvisionlab.myqnapcloud.com:389
CONNECTED(00000003)
write:errno=0
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 0 bytes and written 321 bytes
Verification: OK
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
No ALPN negotiated
Early data was not sent
Verify return code: 0 (ok)
---
vision@vision-System-Product-Name:~$ id P76******
uid=1000031(P76******) gid=1000000(Domain Users) groups=1000000(Domain Users),1000002(rtxs)
```
:::
---
### Server 資訊與 SSL 更新
通常三個月要更新一次,當有使用者使用正確的帳號密碼無法登入後就要更新憑證。
先以 root 的帳號登入系統,
下指令查看 SSSD (System Security Services Daemon) 狀態:
```
$sudo systemctl status sssd
```

取得新的 ssh keys :
```
$sudo openssl s_client -connect nckuvisionlab.myqnapcloud.com:389 -starttls ldap -showcerts < /dev/null | openssl x509 -text | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p'
```
複製產生的 ssh key 後,去下面的檔案覆蓋舊的 ssh key :
```
$sudo nano /etc/ssl/certs/ldapcacert.crt
```
最後重新啟動服務試試看:
```
$sudo systemctl restart sssd
```

### LDAP 更新
1. Run System Update (基本有更新)
2. Configure SSSD for OpenLDAP Authentication on Ubuntu 20.04 (基本已經裝好)
3. cat /etc/sssd/sssd.conf

範例應如下
```
[sssd]
services = nss, pam
config_file_version = 2
domains = default
[nss]
[pam]
offline_credentials_expiration = 60
[domain/default]
ldap_id_use_start_tls = True
cache_credentials = True
ldap_search_base = dc=nckuvisionlab,dc=myqnapcloud,dc=com
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
access_provider = simple
ldap_uri = ldap://nckuvisionlab.myqnapcloud.com:389
# ldap_uri = ldap://140.116.247.104
# ldap_uri = ldap://[2001:288:7001:271f:265e:beff:fe29:57da]:389
ldap_default_bind_dn = cn=admin,dc=nckuvisionlab,dc=myqnapcloud,dc=com
ldap_default_authtok = $ThisIsMyPassword$
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/ssl/certs/ldapcacert.crt
ldap_tls_cacertdir = /etc/ssl/certs
ldap_search_timeout = 50
ldap_network_timeout = 60
# ldap_access_order = filter
# ldap_access_filter = (objectClass=posixAccount)
# ldap_access_filter = (|(cn=ag)(uid=p76084295))
simple_allow_groups = rtxs
default_shell = /bin/bash
override_shell = /bin/bash
sudo_provider = ldap
autofs_provider = ldap
ldap_default_authtok_type = obfuscated_password
```
假如有部分地方打錯或誤打可能出現ParseError,要注意一下有發生過。

ldap_default_authtok 很重要,我們會利用指令來產生加密過的文字:
```
$sudo apt-get install sssd-tools
$sudo sss_obfuscate -d default # Domain selected from sssd.conf
# Enter password = $ThisIsMyPassword$ ->這裡就是輸入LDAP密碼的地方
# Enter again = $ThisIsMyPassword$ -> 再輸入一次
```
4. Install OpenLDAP Server CA Certificate on Ubuntu 20.04 LDAP client (基本已驗證)
5. 重啟服務

6. 驗證是否有吃到 NAS 資料
輸入 ldapsearch 指令 , 其中 uid 就是你的學號(在 NAS 上面的):
```
$ldapsearch -x -b "dc=nckuvisionlab,dc=myqnapcloud,dc=com" -H ldap://140.116.247.104 -D "cn=admin,dc=nckuvisionlab,dc=myqnapcloud,dc=com" -W '(|(cn=ag)(uid=p76084295))'
```

以及 id 自己的 uid:
```
$id pXXXXXXXXXXX
```
若為 no such user 代表未成功:

這樣有顯示表示設定成功:

### Dash 轉 Bash
由於使用 shell來撰寫腳本時使用bash會比較方便,因此應該將預設連結到的shell改成bash。
[教學](https://clay-atlas.com/blog/2020/07/08/linux-cn-note-sh-bash-dash-point/)
### 出現無法安裝或更新的狀況
[參考文章](https://ubuntuqa.com/zh-tw/article/1125.html)


若內部IP無問題則可能是DNS Nameserver 出狀況。
可以在 /etc/resolv.conf 設定 Nameserver 8.8.8.8 試試
更新,因為 /etc/resolv.conf 是 NetworkManager 的設定顯示檔,因此設定在重新開機之後還是會被重製。
[參考文章](https://serverfault.com/questions/810636/how-to-manage-dns-in-networkmanager-via-console-nmcli)
透過
```
$ nmcli con
```
找出 connectionName , 接著:
```
$ sudo nmcli con mod $connectionName ipv4.dns "8.8.8.8 1.1.1.1"
```
最後重新啟動 NetworkManager:
```
$ sudo service NetworkManager restart
```
再去查看 /etc/resolv.conf 是否有設置成功
### 出現無法用 tab 自動補全命令的情況
設定新使用者時未對其指定 shell 路徑而是使用預設的 shell。
可於建立時指定或是建立後指定也可以
[參考文章](https://www.itread01.com/articles/1502359204.html)
### Mount Through CIFS
共享 Windows local 資料夾可以使用