# Ubuntu (desktop) 實驗平台搭建紀錄
> ~~咳咳,美觀調整紀錄。~~
略過使用 live cd/usb 安裝 Ubuntu。
## `SSH` 設定
> ssh 方便我們在遠端控制電腦,可依此使用 `SSHFS`, `VSCode remote service` 等方便功能。
* 安裝
```bash
sudo apt install openssh-server -y
```
* 啟用
```bash
sudo systemctl enable ssh # enable ssh server
sudo ufw allow ssh # make ubuntu firewall enable ssh connections
```
* 確認伺服器端狀態是否正常
```bash
sudo systemctl status ssh# you should see
```
應該看到類似以下結果。確認 `ssh.service` 和 `vendor preset` 為 `enable`,前者表當前是否啟用服務,後者表啟動時是否自動啟用本服務 (`ssh`)。
```bash
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since ...
```
* (Optional) 將本地 ssh 公鑰加入 Ubuntu 伺服器
```bash
ssh-copy-id IP_OF_UBUNTU
```
## VNC server
> 圖形界面真香,參考[本網站](https://ailog.tw/lifelog/2022/11/19/ubuntu-vnc/)
## 優雅終端機設定 `oh my zsh`
> ~~提升開發效率 X, 心情愉快 O~~
### 建置目標
#### 主體
| Item | Target | Feature|
| ------------- | ----------- |--|
| Shell | [`zsh`](https://zh.wikipedia.org/zh-tw/Z_shell) | 比起 `bash` 有更多開箱即用的功能,且更能輕鬆客製化 |
| Framework | [`oh my zsh`](https://ohmyz.sh/) | 能裝更多主題、外掛的 `zsh` 框架 |
| Theme| [`powerlevel10k`](https://github.com/romkatv/powerlevel10k) | 極其美妙的終端機主題,內建許多外觀設定 |
#### 外掛
* [`zsh completion`](https://github.com/zsh-users/zsh-completions): 根據當前的輸入自動補全命令。
* [`auto suggestion`](https://github.com/zsh-users/zsh-autosuggestions): 根據過往的命令與當前的輸入自動建議輸入。輸入時在背後會浮現淺色的提示。
* [`syntax highlighting`](https://github.com/zsh-users/zsh-syntax-highlighting): 對命令加上顏色標註。合法的命令顯示綠色、不合法的為紅色、字串為黃色...
### 下載並安裝必要套件
先安裝等等要用到的套件...
```bash
# first package update
sudo apt update -y && sudo apt upgrade -y
# install mostly used modules
sudo apt install git curl vim neofetch zsh -y
```
然後進入 `zsh` (輸入 `zsh` 從當前 shell 進入 `zsh`),安裝 `oh my zsh`,接著下載 `zsh` 相關外掛於 `oh my zsh` 內。
> 使用 ZSH 變數將外掛放入 `oh my zsh` 內管理的命令自動化。
```bash
# install oh my zsh and zsh plugins
yes | sh -c "$(curl -fsSL https://raw.github.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"
# zsh-completion
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions
# zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
# zsh-syntax-highlighting
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
# powerlevel10k
git clone --depth=1 https://github.com/romkatv/powerlevel10k.git ${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k
# after this, go into zsh
zsh
```
(以下為讓 `powerlevel10k` 能大展身手的等寬字型的安裝,非必要。)
由 [powerlevel10k 官方](https://github.com/romkatv/powerlevel10k#fonts)建議,使用 `Meslo Nerd Font` 連體字型最合適,該網站列敘該如何安裝此字型,並在終端機中使用。
### 調整 `zsh` 客製化設定
接著進入 `zsh` 設定檔 `~/.zshrc`。
> 請使用 `vim`, `nano`, `emacs`, `gedit` 之類的文字編輯器,依照前面的命令的話,應該已經裝好 `vim` 了。
1. 將 `powerlevel10k` 主題加入設定
找到 `ZSH_THEME` 參數,修改設定。
```bash
# Set name of the theme to load --- if set to "random", it will
# load a random theme each time oh-my-zsh is loaded, in which case,
# to know which specific one was loaded, run: echo $RANDOM_THEME
# See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes
ZSH_THEME="powerlevel10k/powerlevel10k"
```
2. 將前面 clone 進來的外掛程式庫加入設定
注意 `zsh complition` 不應該直接加入 `plugins` 列表中。詳見 [issue 603](https://github.com/zsh-users/zsh-completions/issues/603#issuecomment-967116106)。
```bash
# auto suggestion, syntax highlighting
plugins=(git zsh-autosuggestions zsh-syntax-highlighting)
# zsh completion
fpath+=${ZSH_CUSTOM:-${ZSH:-~/.oh-my-zsh}/custom}/plugins/zsh-completions/src
```
另外,以上設定必須在 `source $ZSH/oh-my-zsh.sh` 這行以前,因為該行即是啟動 `oh my zsh` 與其管理之所有外掛。
3. 啟用 `powerlevel10k` 主題
儲存對 `~./zshrc` 的修改,並用以下命令使其生效。
```bash
source ~/.zshrc
```
此時 `powerlevel10k` 會根據當前終端機的字型提示我們跟如何完成此主題的快速調整。若對調整的結果不滿意,可使用 `powerlevel10k` 內建命令 `p10k configure` 來啟動快速設定程式。
4. (Optional) 使用 `neofetch`
將 `neofetch` 加入 `.zshrc` 的第一行,即可在每次開啟終端機時印出系統基本訊息。
## Wake On LAN 網路喚醒
### WOL (Wake On LAN) 介紹
原理是特殊的網卡在電腦關機時,仍能接收 Magic Packet (魔法封包),接收到時透過 PCI 通知主機板開機。默認接收 Magic Packet 的 Port 為 `9` 或 `7`。
### 魔法封包
魔法封包的內容為 6 bytes 的 `F` 和 96 bytes 的目標網卡 MAC 地址 (48 bits) 重複 16 遍。故封包大小為
$$
6 + \dfrac{48}{8 \rm{bit}} \times 16 = 102 \ (\rm{bytes})
$$
> 魔法封包的細節原文,引自[維基百科](https://en.wikipedia.org/wiki/Wake-on-LAN)。
>
> The magic packet is a frame that is most often sent as a broadcast and that contains anywhere within its payload 6 bytes of all 255 (FF FF FF FF FF FF in hexadecimal), followed by sixteen repetitions of the target computer's 48-bit MAC address, for a total of 102 bytes.
### 設定 WOL
有三方面的設定要完成。
1. 硬體
首先確認**主機板**與**網卡**是否支援 WOL (當今網卡基本上都支援)。
接著進 BIOS,依照各個主機板不同的方式開啟 WOL 功能。
:::success
比如[本主機板](https://www.asus.com/tw/motherboards-components/motherboards/prime/prime-b660m-k-d4-csm/techspec/),[華碩官網](https://www.asus.com/tw/support/FAQ/1045950/)說要啟動 Power On By PCI-E 選項。
:::
2. 作業系統
不同作業系統設定的方法不一。
* Ubuntu
* Debian/TrueNAS
* Arch Linux
由於 TrueNAS Scale 是以 Debian 為基礎打造,若在此之上是以乙太網連接的話,可以[參考本網站](https://wiki.debian.org/WakeOnLan)。
Ubuntu 雖然作為魔改版的 Debian,卻不可直接使用 Debian 的方法,具體可以參考[本網站](https://www.golinuxcloud.com/wake-on-lan-ubuntu/),下面也會說明差別。
以下簡單說明作法。
1. 確認 `ethtool` 是否已安裝
```bash
sudo apt install ethtool
```
2. 確認乙太網設備名稱
```bash
ip a # 列出所有網路設備與相應的連線資訊
```
找到狀態為 `UP` 的乙太網卡,其名稱通常以 `e` 開頭,比如 `ethX`, `enpXsY` (`X`, `Y` 為某數字)。找到後,以下暫稱該乙太網卡為 `ethX`。
3. 確認乙太網設備狀態
```bash
sudo ethtool ethX
```
會列出 `ethX` 的一系列狀態,其中 `g` 表有啟用 WOL;`d` 表未啟用。若只想單次設置 WOL,用以下命令即可。
```bash
sudo ethtool -s ethX wol g # 設定 ethX 的 wol 項目為 g (enable)
```
4. 為網路介面設定自動啟用 `WOL`
* Ubuntu
Ubuntu 要讓每次開機時都運行上方指令,可以透過新增系統服務完成。
* 新增系統服務
```bash
sudo --preserve-env systemctl edit --force --full wol-enable.service
```
* 新增以下內容
```bash
[Unit]
Description=Enable Wake-up on LAN
[Service]
Type=oneshot
ExecStart=/sbin/ethtool -s ethX wol g
[Install]
WantedBy=basic.target
```
:::info
別忘記替換 `ethX` 為自己的網卡名稱 :)
:::
* 重新載入守衛行程
```bash
sudo systemctl daemon-reload
```
* 啟用剛創建之 WOL 服務
```bash
sudo systemctl enable wol-enable.service
```
* TrueNAS
可以針對單獨某網卡或全域設定。若是前者,新增 `/etc/network/interfaces.d/ethX`,若是全域,則新增 `/etc/network/interfaces` 檔案,內部為:
```txt
auto ethX
iface ethX inet dhcp
ethernet-wol g
```
:::info
別忘記替換 `ethX` 為自己的網卡名稱 :)
:::
* Arch Linux
* 以 yay 安裝 `wol-systemd`
```bash
yay -S wol-systemd
```
* 啟動系統服務
> `@` 後面為監視 WOL 的網路介面
```bash
sudo systemctl enable wol@enp4s0
```
以上方法即可一勞永逸。
另外無線網卡的情況較複雜,而且 NAS 比較建議是走乙太網才較穩定且高速,故不特別介紹,有興趣者可參見[本網站](https://www.cyberciti.biz/faq/configure-wireless-wake-on-lan-for-linux-wifi-wowlan-card/)。
3. 啟動
此時 NAS 已經準備好被喚醒。我們需將 Magic Packet 送至網卡所在之主機的 Port `9` (or `7`)。
可以使用手機、電腦等喚醒。比如 Andriod 手機的 [WolOn](https://play.google.com/store/apps/details?id=com.bitklog.wolon&hl=zh_TW&gl=US)、Linux/macOS 的 `wakeonlan` 套件 (macOS 可使用 `brew` 下載使用)。
* 區域網路喚醒
以 `wakeonlan` 套件為例。預設會將 `MAC_ADDRESS` 發送至 `255.255.255.255:9` (也就是 braodcast)。套件使用細節可用 `wakeonlan` 命令查詢。
```bash
wakeonlan MAC_ADDRESS
```
* 網際網路喚醒
除了要知道 MAC 地址,還需要知道 IP 位置。
:::warning
只要扯上網際網路,一切就麻煩起來了 :p
:::
為此要解決兩個問題:
* 家用環境下,可能會遇到浮動 IP 的議題,此時可使用 DDNS 服務,或者將 IP 轉為固定 IP。
* 要調整 Port Forwarding,將封包傳遞至正確的 LAN IP + Port。(常見是 External Port `9` 傳遞至`Host_LAN_IP:9`)
## Ubuntu 外觀客製化
# 動手搭建 NAS
## Ubuntu x ZFS
Ubuntu 22.04 主動加入對 ZFS 的支援,不仿使用 ZFS 來搭建伺服器。
### 儲存池操作
* 創建
* Basic (raid 0)
以數顆硬碟構建 raid 0 儲存池 `POOL_NAME`。
```bash
zpool create POOL_NAME [parameter] DISK_PATH [ DISK_PATH ... ]
```
其中 `parameter` 可為以下。
| type | Basic | Mirror | Raid-z | Raid-z2 |
|:---------:|:------:|:------:|:------:|:-------:|
| meaning | raid 0 | raid 1 | raid 5 | raid 6 |
| parameter | - | mirror | raidz | raidz2 |
* 查看儲存持狀態
查看 `POOL_NAME` 的狀態,沒給參數會列出所有儲存持狀態。
```bash
zpool status [POOL_NAME]
```
* 加入、移除與刪除
加入/移除/刪除 `POOL_NAME` 儲存池。
```bash
zpool [import | export | destroy] POOL_NAME
```
* 取得、改變掛載資料夾
```bash
zfs get mountpoint POOL_NAME
zfs set mountpoint=/NEW_MOUNT_POINT POOL_NAME
```