引言
最近伺服器出現一些硬體異常就順便剛好重灌 Linux 伺服器,本篇文章將介紹如何安裝 Ubuntu 作為自己的工作伺服器。
擁有一台 Linux 伺服器可以做很多事情,例如:
- DNS 伺服器:用來阻擋廣告等相關應用。
- 遠端開發:可隨時在信任的電腦上連線進行不中斷的開發。
- 網頁伺服器:使用 Nginx 或 Apache 架設網站,並搭配資料庫服務。
- 代理伺服器:實現翻牆或 NAT 穿透等行為。
- 簡易檔案伺服器:不建議作為標準 NAS,資料維護成本高,建議使用現成的 NAS 方案。
根據個人需求來決定伺服器性能。例如,若要架設網站伺服器,需考慮防火牆等安全性因素。
市面上有一些現成的虛擬主機方案
,通常相關服務都已經建立好,使用者只須要把檔案上傳即可。大多都是透過網頁端已經撰寫好的程式進行設定,操作起來非常輕鬆。會更傾向於完全不懂系統的新手。
需要進階一點的話,更多是虛擬私有伺服器(virtual private server,VPS)
,即放在一些信任的第三方供應商下的主機,這些主機上可能安裝了 Linux 或是 Windows,使用者可以透過 SSH 進行遠端連線、架設服務、或是遠端重置等操作。
常見的第三方供應商有:
- 亞馬遜雲服務(Amazon Web Services,AWS)
- Google 雲端平台(Google Cloud Platform,GCP)
- 微軟 Azure(Microsoft Azure)
- DigitalOcean
- Vultr
- Linode
這些服務依照使用量或按月度進行計費。費用大約為每小時 USD $0.15 或每月 USD $30。
選擇 Linux 發行版
由於我主要用於進行服務、網頁等架設與開發,因此選擇了 Ubuntu Server 24.04 進行安裝。然而,有些 SDK 要求開發環境使用 Ubuntu 18.04。在選擇發行版時,應根據個人的開發需求和環境來決定。
對比於不同的發行版,有像是 Ubuntu, Debian, Fedora, CentOS 等,以下是它們的特點:
發行版 | 特點 |
---|
Ubuntu | 適合新手,提供直觀的安裝過程和預設配置。 |
Ubuntu Server | 專為伺服器設計,無圖形界面,包含伺服器相關工具,支持遠程管理。 |
Debian | 穩定且安全,適合需要高度穩定性的工作環境。 |
Fedora | 前沿技術,適合希望體驗最新軟體的開發者。 |
CentOS | 企業級發行版,適合企業環境中的伺服器部署。 |
使用 Ubuntu 的主要原因是它對新手友好,可以避免遇到許多僅專業人士才會遇到的困難。此外,大多數工作在任何發行版上基本上都能正常進行開發。因此,在選擇發行版時,不需要過於糾結,只需選擇自己喜歡的即可。
當前文章為 2024/6,如果要開發 NVIDIA Optimized Deep Learning Framework,官方僅支援 Ubuntu 22.04,所以一定要確認想開發的框架是否支援你預期的 Linux 發行版本。
安裝 Ubuntu Server 24.04 時的磁碟分割
在安裝 Ubuntu Server 24.04 的過程中,介面主要依靠鍵盤進行互動,因此操作相對簡單。
安裝過程會遇到硬碟的磁碟分割,可以參考 Ubuntu 磁碟空間建議與策略。
分區 | 容量 | 我的分割 |
---|
/ | 至少 15 GB | 30 GB, ext4 |
/boot | 250 MB ~ 1 GB | 500 MB, ext4 |
/var | 2 GB | 2 GB, ext4 |
swap | RAM 的大小 | 8 GB, ext4 |
/home | 剩餘硬碟空間 | 151.34 GB, ext4 |
/ 是根分區,官方建議分配至少 15 GB。但由於日誌文件、臨時文件和安裝包等因素,根分區可能會逐漸變滿,導致系統操作出現部分錯誤。為防止此類情況發生,我這邊使用了兩倍的大小以降低錯誤的發生,主要還是建議定期清理根分區的文件,或者在空間不夠時調整根分區的大小。
/boot 大多數的 UEFI 為 500 MB ~ 1 GB。
一般桌面系統使用時,可以將 /var 分配 1-2 GB 就足夠了。如果是伺服器系統,特別是會產生大量系統日誌(如網頁伺服器),建議 /var 分區分配 5 GB 或更大的空間,以防止日誌文件佔滿根目錄。使用 Docker 時,建議為 /var 分配至少 20 到 50 GB 的磁碟空間。如果一開始規劃的空間過小,可以修改 /etc/docker/daemon.json,將預設路徑 /var/lib/docker/ 更改到其他目錄,或是使用符號連結來解決。
swap 使用與系統 RAM 約 1.5 ~ 2 倍的配置,例如 4 GB 的 RAM,可以將 SWAP 設為 6 GB。或是如果是 8 GB 以上的 RAM,則 SWAP 可以配置 1 倍即可。
其餘的空間都留給 /home,或者根據需要特別規劃其他分區。
系統設定與安裝
配置網路設定
⚠️ 進入系統沒有網路很難進行遠端操作,所以首要任務先確認網路是否正常。
1
2
| # 顯示網路介面的詳細資訊
ip addr show
|
在輸出結果中,可以看到有線網路的裝置名稱為 enp8s0
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: enp8s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:11:22:33:44:55 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.107/24 metric 100 brd 192.168.0.255 scope global dynamic enp8s0
valid_lft 123456sec preferred_lft 123456sec
inet6 fd3f:1234:5678:9abc:0011:22ff:fe33:4455/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 1688sec preferred_lft 1688sec
inet6 fe80::0011:22ff:fe33:4455/64 scope link
valid_lft forever preferred_lft forever
|
從 Ubuntu 17.10 開始,網路管理工具統一使用 netplan。您可以使用 ls /etc/netplan
檢查配置檔,通常檔案名稱為 01-netcfg.yaml
或 50-cloud-init.yaml
。其中,01-netcfg.yaml 具有更高的配置優先權,若存在,將優先配置。
我的伺服器上僅有 50-cloud-init.yaml 配置檔案。使用 sudo nano /etc/netplan/50-cloud-init.yaml
來編輯該檔案,填入有線網路的裝置名稱,並設定為自動取得 IP 或固定 IP。在我的配置中,使用動態 IP 並設定 DNS 伺服器。
以下是設定範例,請根據自身網路環境進行配置:
1
2
3
4
5
6
7
8
9
| network:
version: 2
ethernets:
enp8s0: # 需要根據自身的網卡名稱
dhcp4: true
nameservers:
addresses:
- 1.1.1.1
- 8.8.8.8
|
這樣的設定會使網路裝置 enp8s0 透過 DHCP 自動取得 IP,並使用 1.1.1.1 和 8.8.8.8 作為 DNS 伺服器。
如果使用的是固定 IP,可以參照以下配置:
1
2
3
4
5
6
7
8
9
10
| network:
version: 2
ethernets:
enp0s31f6: # 需要根據自身的網卡名稱
dhcp4: no
addresses:
- 192.168.66.123/24 # 填入想要的固定 IP
gateway4: 192.168.88.254 # 填入閘道
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
|
確定配置檔案正確無誤後,執行以下指令應用設定:
此指令會使 netplan 重新載入並應用新設定,確保網路配置生效。
接著,可以藉由 ping 指令檢查網路是否正常:
輸出如下:
1
2
3
| PING google.com (173.194.174.101) 56(84) bytes of data.
64 bytes from td-in-f101.1e100.net (173.194.174.101): icmp_seq=1 ttl=103 time=17.7 ms
64 bytes from td-in-f101.1e100.net (173.194.174.101): icmp_seq=2 ttl=103 time=21.9 ms
|
透過以上步驟,可以確認網路連線是否正常。
設定系統的時間與日期
更改為 Asia/Taipei
1
| sudo timedatectl set-timezone Asia/Taipei
|
設定中文語系
編輯 locale 語言環境文件
1
| sudo nano /etc/default/locale
|
在裡面新增以下內容後,儲存離開
1
2
3
4
5
6
7
8
9
10
| LANG="zh_TW.UTF-8"
LC_NUMERIC="zh_TW.UTF-8"
LC_TIME="zh_TW.UTF-8"
LC_MONETARY="zh_TW.UTF-8"
LC_PAPER="zh_TW.UTF-8"
LC_NAME="zh_TW.UTF-8"
LC_ADDRESS="zh_TW.UTF-8"
LC_TELEPHONE="zh_TW.UTF-8"
LC_MEASUREMENT="zh_TW.UTF-8"
LC_IDENTIFICATION="zh_TW.UTF-8"
|
執行以下指令以更新語言配置:
1
2
3
| # 產生繁體中文(臺灣)的語言環境文件並更新
sudo locale-gen zh_TW.UTF-8
sudo update-locale
|
確保系統的軟體和套件都是最新的
1
2
| # 更新套件清單後,升級已安裝的套件。
sudo apt update && sudo apt upgrade
|
安裝 Tailscale
如果有需要在外存取此電腦,強烈建議安裝而不是直接將伺服器暴露於整個網際網路中。
詳細的安裝可以參考:使用 Tailscale 輕鬆建立安全且私密的通道
1
2
3
4
5
| # 安裝
curl -fsSL https://tailscale.com/install.sh | sh
# 啟動伺服器
sudo tailscale up
|
此時會跳出網址,使用手機或是第三方裝置前往該網址並登入。
Linux 就會自動取得 Token,加入 tailnet 個人內網中。
自己在安裝 Tailscale 後有遇到網卡名稱跑掉,或是 DNS 被 Tailscale 搶走而導致 ping 不出去的問題。
安裝 Tailscale 後,務必要重新開機檢查是否能夠正常上網。如果有需要再更新網路配置檔。
配置 SSH
可參考使用SSH 金鑰進行無密碼遠端連線。
Net-tools 可以提供一系列網絡管理和故障排除工具,建議安裝。不過部分指令已經被更現代的工具(如 ip 命令)取代。
安裝網絡管理和故障排除工具:
1
| sudo apt install net-tools
|
安裝建置工具包
部分開發工具依賴以下工具,建議安裝以具備基礎的建置環境。
1
| sudo apt install build-essential
|
設定 Ubuntu Pro 安全性
啟動 Ubuntu Pro 可以更加即時修正系統漏洞,提升系統的安全性和穩定性。
首先在 Ubuntu 官網上註冊並獲取一個 Ubuntu Pro 免費訂閱。可以在 Ubuntu Pro 頁面上進行註冊。
註冊後,透過sudo pro attach <YOUR_TOKEN>
Ubuntu Pro 訂閱:
1
| sudo pro attach YGBDmwR6Y2S
|
輸出如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| Enabling Ubuntu Pro: ESM Apps
Ubuntu Pro: ESM Apps enabled
Enabling Ubuntu Pro: ESM Infra
Ubuntu Pro: ESM Infra enabled
Enabling Livepatch
Livepatch enabled
This machine is now attached to 'Ubuntu Pro - free personal subscription'
SERVICE ENTITLED STATUS DESCRIPTION
anbox-cloud yes disabled Scalable Android in the cloud
esm-apps yes enabled Expanded Security Maintenance for Applications
esm-infra yes enabled Expanded Security Maintenance for Infrastructure
landscape yes disabled Management and administration tool for Ubuntu
livepatch yes enabled Canonical Livepatch service
realtime-kernel* yes disabled Ubuntu kernel with PREEMPT_RT patches integrated
* Service has variants
NOTICES
Operation in progress: pro attach
For a list of all Ubuntu Pro services and variants, run 'pro status --all'
Enable services with: pro enable <service>
Account: xxxxx@xxx.com
Subscription: Ubuntu Pro - free personal subscription
|
安裝 ble.sh
ble.sh 是一個為 Bash 提供即時語法高亮和更強大功能(如自動完成等)的腳本。
1
2
3
4
| # 透過 git 複製 ble.sh 後,編譯並安裝
git clone --recursive --depth 1 --shallow-submodules https://github.com/akinomyoga/ble.sh.git
make -C ble.sh install PREFIX=~/.local
echo 'source ~/.local/share/blesh/ble.sh' >> ~/.bashrc
|
安裝 Homebrew
Homebrew 為 macOS 提供了一種更快速的軟體包安裝方式,能夠方便地安裝、更新和管理軟體包。同樣,它也支援 Ubuntu 等 Linux 系統。
1
2
3
4
5
6
7
| # 安裝 Homebrew
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
# ==> Next steps:
# - Run these two commands in your terminal to add Homebrew to your PATH:
# (echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/使用者/.bashrc
# eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
安裝後,會要求在執行額外兩行指令,使其 Bash 自動載入 Homebrew 的安裝目錄。
1
2
3
| # 設定每次打開 Bash 都會載入 homebrew 的安裝路徑
(echo; echo 'eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"') >> /home/使用者/.bashrc
eval "$(/home/linuxbrew/.linuxbrew/bin/brew shellenv)"
|
安裝 fzf
fzf 是一個命令行模糊查找工具,可以用來高效地從文件、命令歷史、Git 提交記錄等中進行模糊搜索。極大地提高開發者在命令行中的工作效率。
1
2
3
4
5
| # 使用 Homebrew 安裝
brew install fzf
# 未來更新可透過
brew update; brew upgrade fzf
|
安裝 Node.js
JavaScript 執行環境,有需要開發前後端再進行安裝。
官網的安裝教學寫得非常清楚。建議使用 nvm 進行安裝。
1
2
3
4
5
6
7
8
| # 安裝 nvm (Node 版本管理器)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/
# 下載並安裝 Node.js(可能需要重新啟動終端)
nvm install 20
# 驗證正確的 Node.js 版本是否在環境中
node -v # 應顯示 `v20.14.0`
# 驗證正確的 NPM 版本是否在環境中
npm -v # 應顯示 `10.7.0`
|
安裝 tldr
tldr 提供簡明易懂的命令行工具說明和實用範例,比起 Linux 下的 man 指令更加直觀。
1
2
3
4
5
| brew install tlrc
# 或是有安裝 Node.js,可以用 npm 進行安裝。
# npm install -g tldr
# tldr --update
|
使用方法只要 tldr 即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
| tldr zip
zip
Package and compress (archive) files into a Zip archive.
See also: unzip.
More information: https://manned.org/zip.
- Add files/directories to a specific archive:
zip -r path/to/compressed.zip path/to/file_or_directory1 path/to/file_or_directory2 ...
- Remove files/directories from a specific archive:
zip --delete path/to/compressed.zip path/to/file_or_directory1 path/to/file_or_directory2 ...
- Archive files/directories e[x]cluding specified ones:
zip path/to/compressed.zip path/to/file_or_directory1 path/to/file_or_directory2 ... --exclude path/to/excluded_files_or_directories
- Archive files/directories with a specific compression level (0 - the lowest, 9 - the highest):
zip -r -0..9 path/to/compressed.zip path/to/file_or_directory1 path/to/file_or_directory2 ...
- Create an encrypted archive with a specific password:
zip -r --encrypt path/to/compressed.zip path/to/file_or_directory1 path/to/file_or_directory2 ...
- Archive files/directories to a multi-part [s]plit Zip archive (e.g. 3 GB parts):
zip -r -s 3g path/to/compressed.zip path/to/file_or_directory1 path/to/file_or_directory2 ...
- Print a specific archive contents:
zip -sf path/to/compressed.zip
See also: unzip
|
更新 Git 到最新版本
Git 不一定要更新到最新版本,部分工具版本太舊,需要配合舊版的 Git,如果安裝最新版的 Git 可能會遇到版本相容的問題。
git-core/ppa 是一個 Personal Package Archive (PPA),由 Git 社區維護,提供 Git 軟體的最新版本。
1
2
3
4
| # 新增 PPA
sudo add-apt-repository ppa:git-core/ppa
# Git 更新到最新版本
sudo apt update && sudo apt upgrade
|
設定 Git 使用者
1
2
| git config --global user.name "USER"
git config --global user.email "USER_MAIL"
|
結論
以上基本環境配置好後就可以快樂的進行遠端開發了🥳。
參考文獻
- 什麼是 VPS?
- Ubuntu Server documentation
- DiskSpace - Community Help Wiki
- Ubuntu Bionic: Netplan
- ble.sh
- fzf
- tldr-pages/tldr
- 初次設定 Git
- Use UFW to lock down an Ubuntu server