Install NixOS on a Free Oracle Cloud VM

Michael Lynch

在免費的 Oracle Cloud 虛擬機上安裝 NixOS

Oracle 並不是非常熱門的雲端代管服務,但他們提供了異常吸引人的免費方案。你可以 24 小時全年無休免費執行以下兩台虛擬機:

  • 2 核心 / 12 GB 記憶體 Ampere A1 ARM 虛擬機
  • 1 核心 / 1 GB 記憶體 AMD CPU

更新(2026-07-04):我最初在 2025 年撰寫本文時,Oracle 提供了 4 顆 ARM CPU 與 24 GB 記憶體。他們後來將其減半,所以這項優惠已不像當初那麼吸引人。

挑戰:在 Oracle Cloud 虛擬機上安裝 NixOS

Oracle 並未將 NixOS 列為其虛擬機的作業系統選項之一,而且我也看過回報指出上傳 NixOS 映像檔也無法運作。

我找到了數篇教學,內容是關於在 Oracle 的 ARM 虛擬機上安裝 NixOS,但它們看起來都很複雜,而且需要大量手動步驟。

Prithu Goswami(普里圖·戈斯瓦米)透過 netboot 使用 NixOS 安裝程式想出一個巧妙的捷徑,簡化了整個過程。普里圖·戈斯瓦米的說明相當簡略,所以我想分享我對他的方法的完整步驟解析。

更新(2026-03-04):Erik Parawell(艾瑞克·帕拉威爾)撰寫了一份指南,省去了我這份指南中一些手動步驟,不過我個人還沒有測試過他的解法。

需求條件

除了需要在本地系統上安裝 SSH 用戶端之外,沒有其他先決條件。

  • ssh

步驟 1:取得 Oracle Cloud 帳號

很可惜,這個步驟我幫不上太多忙,因為我是幾個月前完成的,已經不記得過程了。

我只記得在還沒嘗試任何雲端服務之前,Oracle 就以不明原因不斷關閉我的帳號,我必須寫信給客服才能將帳號復原。

請注意,你只能在家鄉區域(home region)建立免費層級的虛擬機,而且我不確定哪個區域的容量最充足。

我選擇的家鄉區域是 US-ASHBURN,該區域有提供免費層級的虛擬機。

步驟 2:建立免費層級虛擬機

登入 Oracle Cloud 帳號後,建立你的免費虛擬機:

  1. 前往建立運算執行個體
  2. 將名稱改為你想要的任何名稱。
  3. 在「映像檔與形狀(Image and shape)」下方,選擇映像檔 Ubuntu > Canonical Ubuntu 24.04 Minimal aarch64
  4. 在「映像檔與形狀(Image and shape)」下方,選擇形狀 VM.Standard.A1.Flex 並將 OCPUs 數量增加至 2。記憶體應會自動更新為 12 GB。

映像檔與形狀的畫面應該會如下所示:

確認「形狀(Shape)」顯示的費用為 $0。

注意:Oracle 會顯示開機磁碟區每月 $2 美元的費用,但根據我查到的資料,這項估算是個錯誤,因為免費方案包含了 200 GB 的開機磁碟區儲存空間。不過我並不在意,因為即使每月要付 $2 美元,能用到這麼強大的虛擬機還是很值得。

在「新增 SSH 金鑰(Add SSH keys)」下方,上傳你的 SSH 公開金鑰。

最後,點擊「建立(Create)」來建立虛擬機。

步驟 3:透過 SSH 登入

等待你的虛擬機顯示為執行中:

虛擬機開始執行後,在本地系統上開啟終端機。

複製你的虛擬機的公開 IP 位址:

VM_IP='1.2.3.4' # Replace with your VM's IP.

使用你的 SSH 金鑰透過 SSH 連線到剛建立的虛擬機:

ssh "ubuntu@${VM_IP}"

步驟 4:下載 netboot

在你與虛擬機的 SSH 連線中,下載netboot,這是一個用於安裝其他作業系統的精簡 meta-OS。

首先,切換為 root 使用者:

sudo su

將 netboot ARM64 映像檔下載至 /boot/efi/netboot.efi

wget https://boot.netboot.xyz/ipxe/netboot.xyz-arm64.efi && \
  sudo install \
    --owner=root \
    --group=root \
    --mode=664 \
    netboot.xyz-arm64.efi \
    /boot/efi/netboot.efi

步驟 5:使用 Cloud Shell 開機進入 EFI 開機管理員

回到網頁瀏覽器中 Oracle Cloud 上的執行個體虛擬機頁面。

點擊「OS management」

向下捲動,然後點擊「Launch Cloud Shell connection」。

當 Cloud Shell 初始化完成後,你應該會看到這一行:

Instance Console Connection reached state: ACTIVE

注意:接下來的兩個步驟必須快速連續執行。如果錯過了,只要透過 SSH 重新連線再試一次即可。

在你的 SSH 連線中,重新啟動虛擬機:

reboot

快速切換到瀏覽器中的 Cloud Shell。點擊遠端畫面,然後在系統重新開機時持續按鍵盤上的 Escape 鍵。

如果操作正確,你應該會看到 EFI 開機管理員:

在開機畫面中,前往 Boot Manager > EFI Internal Shell。

按任意鍵跳過 startup.nsh

在 EFI Shell 提示字元中輸入:

fs0:netboot.efi

當 netboot 啟動後,選擇以下選項:

  1. Distributions > Linux Network Installs (arm64)
  2. NixOS
  3. NixOS nixos-24.11

接著 netboot 會將你載入 NixOS 即時安裝程式。

步驟 7:為 NixOS 安裝程式設定 SSH 存取

從 netboot 選擇 NixOS 後,系統應該會自動以使用者 nixos 登入,且不會要求輸入密碼。

理論上你可以透過 Cloud Shell 完成剩下的步驟,但使用平常的終端機工具透過 SSH 連線可能會更方便。

很可惜,NixOS 安裝程式並不知道你在建立虛擬機時上傳的 SSH 公開金鑰,因此你需要再次將 SSH 金鑰放到虛擬機上。

如果你的 SSH 金鑰已註冊在 Github 上,一個簡便的佈建方式是執行以下指令:

GITHUB_USERNAME='your-github-username'
mkdir -p ~/.ssh && \
  curl "https://github.com/${GITHUB_USERNAME}.keys" > ~/.ssh/authorized_keys

或者,你也可以直接將任何 SSH 公開金鑰貼到 ~/.ssh/authorized_keys 中。

設定好 SSH 金鑰後,回到你平常的終端機,再次透過 SSH 連線,這次是連到 NixOS 安裝環境:

ssh "nixos@${VM_IP}"

步驟 8:重新分割雲端虛擬機的磁碟

此時你已經進入 NixOS 安裝程式,但磁碟上仍安裝著 Ubuntu。你需要清除並重新分割磁碟以安裝 NixOS。

在與虛擬機的 SSH 連線中,切換為 root。

sudo su

接著,切換到暫存目錄:

cd "$(mktemp --directory)"

在此下載我建立的磁碟設定檔。它會保留 500 MB 作為開機分割區,並將磁碟剩餘空間用於 NixOS。

curl \
  --show-error \
  --fail \
  https://mtlynch.io/notes/nix-oracle-cloud/disk-config.nix \
  > disk-config.nix

接著,使用disko將磁碟分割設定套用到虛擬機的磁碟:

nix \
  --experimental-features 'nix-command flakes' \
  run \
  github:nix-community/disko/v1.11.0 \
  -- \
  --mode destroy,format,mount \
  disk-config.nix

出現提示時,輸入「yes」以刪除所有資料。

步驟 9:安裝 NixOS

此時,你已經有一個重新分割好的磁碟。接下來就是安裝 NixOS。

首先,產生一個預留設定的組態檔:

nixos-generate-config --no-filesystems --root /mnt

將你在上一個步驟中建立的磁碟設定檔移至 /mnt/etc/nixos/,與其他 NixOS 設定檔放在一起:

mv disk-config.nix /mnt/etc/nixos/

接著,下載我為這台 Oracle Cloud 虛擬機準備的 Nix 設定檔:

curl \
  --show-error \
  --fail \
  https://mtlynch.io/notes/nix-oracle-cloud/configuration.nix \
  > /mnt/etc/nixos/configuration.nix && \
  curl \
    --show-error \
    --fail \
    https://mtlynch.io/notes/nix-oracle-cloud/vars.nix \
    > /mnt/etc/nixos/vars.nix

我已將你可能會修改的所有數值獨立到名為 vars.nix 的檔案中:

{
  hostname = "cloudnix";        # Replace with your desired hostname.
  username = "mike";            # Replace with your desired username.
  sshKey = "ssh-rsa AAAAB3..."; # Replace with your SSH public key.
  locale = "en_US.UTF-8";
  timezone = "America/New_York";
}

下載 vars.nix

開啟 vars.nix 並將設定改為你想要的值。

nano /mnt/etc/nixos/vars.nix

你也可以隨意調整 configuration.nix,或者等完成初始安裝後再修改這些檔案。

自訂完 configuration.nixvars.nix 後,開始安裝 NixOS:

nixos-install --no-root-password

安裝完成後,重新啟動虛擬機:

shutdown --reboot now

步驟 10:登入你全新的 NixOS 系統

首次開機大約需要一分鐘。準備就緒後,回到你的終端機,使用稍早相同的 IP 位址透過 SSH 登入:

ssh "${VM_IP}"

完成了!你現在在 Oracle 雲端上擁有一台已安裝 NixOS 的免費 4 核心虛擬機。

如果你執行neofetch,應該會看到如下方截圖所示的輸出:

nix-shell -p neofetch --command neofetch

步驟 11:(選用)安裝套件

到此,一切都已完成,但你可能會想測試一下,以確認 NixOS 設定處於正常狀態。

在文字編輯器中開啟你的 configuration.nix

sudo nano /etc/nixos/configuration.nix

找到 environment.systemPackages 設定,並嘗試將 ffmpeg 加入清單中:

curl
ffmpeg  # Add this line
git
vim

接著,使用 nixos-rebuild 套用設定:

sudo nixos-rebuild switch

現在,你應該會看到系統上已經可以使用 ffmpeg:

$ ffmpeg -version | head -n 2
ffmpeg version 7.1 Copyright (c) 2000-2024 the FFmpeg developers
built with gcc 13.3.0 (GCC)

原文由 Michael Lynch 發布

本文章由 muse-spark-1.2-contributor 進行翻譯