Try   HackMD

Ubuntu (desktop) 實驗平台搭建紀錄

咳咳,美觀調整紀錄。

略過使用 live cd/usb 安裝 Ubuntu。

SSH 設定

ssh 方便我們在遠端控制電腦,可依此使用 SSHFS, VSCode remote service 等方便功能。

  • 安裝

    ​​​​sudo apt install openssh-server -y
    
  • 啟用

    ​​​​sudo systemctl enable ssh # enable ssh server
    ​​​​sudo ufw allow ssh # make ubuntu firewall enable ssh connections
    
  • 確認伺服器端狀態是否正常

    ​​​​sudo systemctl status ssh# you should see 
    

    應該看到類似以下結果。確認 ssh.servicevendor presetenable,前者表當前是否啟用服務,後者表啟動時是否自動啟用本服務 (ssh)。

    ​​​​● ssh.service - OpenBSD Secure Shell server
    ​​​​ Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
    ​​​​ Active: active (running) since ...
    
  • (Optional) 將本地 ssh 公鑰加入 Ubuntu 伺服器

    ​​​​ssh-copy-id IP_OF_UBUNTU
    

VNC server

圖形界面真香,參考本網站

優雅終端機設定 oh my zsh

提升開發效率 X, 心情愉快 O

建置目標

主體

Item Target Feature
Shell zsh 比起 bash 有更多開箱即用的功能,且更能輕鬆客製化
Framework oh my zsh 能裝更多主題、外掛的 zsh 框架
Theme powerlevel10k 極其美妙的終端機主題,內建許多外觀設定

外掛

  • zsh completion: 根據當前的輸入自動補全命令。
  • auto suggestion: 根據過往的命令與當前的輸入自動建議輸入。輸入時在背後會浮現淺色的提示。
  • syntax highlighting: 對命令加上顏色標註。合法的命令顯示綠色、不合法的為紅色、字串為黃色

下載並安裝必要套件

先安裝等等要用到的套件

# 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 內管理的命令自動化。

# 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 官方建議,使用 Meslo Nerd Font 連體字型最合適,該網站列敘該如何安裝此字型,並在終端機中使用。

調整 zsh 客製化設定

接著進入 zsh 設定檔 ~/.zshrc

請使用 vim, nano, emacs, gedit 之類的文字編輯器,依照前面的命令的話,應該已經裝好 vim 了。

  1. powerlevel10k 主題加入設定

    找到 ZSH_THEME 參數,修改設定。

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

    ​​​​# 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 的修改,並用以下命令使其生效。

    ​​​​source ~/.zshrc
    

    此時 powerlevel10k 會根據當前終端機的字型提示我們跟如何完成此主題的快速調整。若對調整的結果不滿意,可使用 powerlevel10k 內建命令 p10k configure 來啟動快速設定程式。

  4. (Optional) 使用 neofetch

    neofetch 加入 .zshrc 的第一行,即可在每次開啟終端機時印出系統基本訊息。

Wake On LAN 網路喚醒

WOL (Wake On LAN) 介紹

原理是特殊的網卡在電腦關機時,仍能接收 Magic Packet (魔法封包),接收到時透過 PCI 通知主機板開機。默認接收 Magic Packet 的 Port 為 97

魔法封包

魔法封包的內容為 6 bytes 的 F 和 96 bytes 的目標網卡 MAC 地址 (48 bits) 重複 16 遍。故封包大小為

6+488bit×16=102 (bytes)

魔法封包的細節原文,引自維基百科

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 功能。

    比如本主機板華碩官網說要啟動 Power On By PCI-E 選項。

  2. 作業系統

    不同作業系統設定的方法不一。

    • Ubuntu
    • Debian/TrueNAS
    • Arch Linux

    由於 TrueNAS Scale 是以 Debian 為基礎打造,若在此之上是以乙太網連接的話,可以參考本網站
    Ubuntu 雖然作為魔改版的 Debian,卻不可直接使用 Debian 的方法,具體可以參考本網站,下面也會說明差別。
    以下簡單說明作法。

    1. 確認 ethtool 是否已安裝

      ​​​​​​​​sudo apt install ethtool
      
    2. 確認乙太網設備名稱

      ​​​​​​​​ip a # 列出所有網路設備與相應的連線資訊
      

      找到狀態為 UP 的乙太網卡,其名稱通常以 e 開頭,比如 ethX, enpXsY (X, Y 為某數字)。找到後,以下暫稱該乙太網卡為 ethX

    3. 確認乙太網設備狀態

      ​​​​​​​​sudo ethtool ethX
      

      會列出 ethX 的一系列狀態,其中 g 表有啟用 WOL;d 表未啟用。若只想單次設置 WOL,用以下命令即可。

      ​​​​​​​​sudo ethtool -s ethX wol g # 設定 ethX 的 wol 項目為 g (enable)
      
    4. 為網路介面設定自動啟用 WOL

      • Ubuntu
        Ubuntu 要讓每次開機時都運行上方指令,可以透過新增系統服務完成。

        • 新增系統服務

          ​​​​​​​​​​​​​​​​sudo --preserve-env systemctl edit --force --full wol-enable.service
          
        • 新增以下內容

          ​​​​​​​​​​​​​​​​[Unit]
          ​​​​​​​​​​​​​​​​Description=Enable Wake-up on LAN
          
          ​​​​​​​​​​​​​​​​[Service]
          ​​​​​​​​​​​​​​​​Type=oneshot
          ​​​​​​​​​​​​​​​​ExecStart=/sbin/ethtool -s ethX wol g
          
          ​​​​​​​​​​​​​​​​[Install]
          ​​​​​​​​​​​​​​​​WantedBy=basic.target
          

          別忘記替換 ethX 為自己的網卡名稱 :)

        • 重新載入守衛行程

          ​​​​​​​​​​​​​​​​sudo systemctl daemon-reload
          
        • 啟用剛創建之 WOL 服務

          ​​​​​​​​​​​​​​​​sudo systemctl enable wol-enable.service
          
      • TrueNAS
        可以針對單獨某網卡或全域設定。若是前者,新增 /etc/network/interfaces.d/ethX,若是全域,則新增 /etc/network/interfaces 檔案,內部為:

        ​​​​​​​​​​​​auto ethX
        ​​​​​​​​​​​​iface ethX inet dhcp
        ​​​​​​​​​​​​        ethernet-wol g
        

        別忘記替換 ethX 為自己的網卡名稱 :)

    • Arch Linux
      • 以 yay 安裝 wol-systemd
        ​​​​​​​​​​​​yay -S wol-systemd
        
      • 啟動系統服務

        @ 後面為監視 WOL 的網路介面

        ​​​​​​​​​​​​sudo systemctl enable wol@enp4s0
        

    以上方法即可一勞永逸。

    另外無線網卡的情況較複雜,而且 NAS 比較建議是走乙太網才較穩定且高速,故不特別介紹,有興趣者可參見本網站

  3. 啟動

    此時 NAS 已經準備好被喚醒。我們需將 Magic Packet 送至網卡所在之主機的 Port 9 (or 7)。

    可以使用手機、電腦等喚醒。比如 Andriod 手機的 WolOn、Linux/macOS 的 wakeonlan 套件 (macOS 可使用 brew 下載使用)。

    • 區域網路喚醒

      wakeonlan 套件為例。預設會將 MAC_ADDRESS 發送至 255.255.255.255:9 (也就是 braodcast)。套件使用細節可用 wakeonlan 命令查詢。

      ​​​​​​​​wakeonlan MAC_ADDRESS
      
    • 網際網路喚醒

      除了要知道 MAC 地址,還需要知道 IP 位置。

      只要扯上網際網路,一切就麻煩起來了 :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

    ​​​​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 的狀態,沒給參數會列出所有儲存持狀態。

    ​​​​zpool status [POOL_NAME]
    
  • 加入、移除與刪除

    加入/移除/刪除 POOL_NAME 儲存池。

    ​​​​zpool [import | export | destroy] POOL_NAME
    
  • 取得、改變掛載資料夾

    ​​​​zfs get mountpoint POOL_NAME
    ​​​​zfs set mountpoint=/NEW_MOUNT_POINT POOL_NAME