Install NixOS on a Free Oracle Cloud VM

Michael Lynch

在免费的 Oracle Cloud 虚拟机上安装 NixOS

Oracle 并不是一家非常受欢迎的云托管服务商,但他们提供异常诱人的免费套餐。你可以全天候免费运行以下两台虚拟机:

  • 2 核 CPU / 12 GB 内存的 Ampere A1 ARM 虚拟机
  • 1 核 CPU / 1 GB 内存的 AMD 虚拟机

更新(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 就以不明原因多次关闭了我的账号,我不得不通过邮件联系客服才得以恢复。

请注意,你只能在家乡区域创建免费套餐的虚拟机,我不确定哪些区域的容量最充足。

我选择的家乡区域是 US-ASHBURN,该区域提供免费套餐的虚拟机。

步骤 2:创建免费套餐虚拟机

登录到你的 Oracle Cloud 账号后,创建免费虚拟机:

  1. 前往Create compute instance
  2. 将名称改为你想要的任意名称。
  3. 在“Image and shape”下,选择镜像 Ubuntu > Canonical Ubuntu 24.04 Minimal aarch64
  4. 在“Image and shape”下,选择机型 VM.Standard.A1.Flex 并将 OCPUs 数量增加到 2。内存应会自动更新为 12 GB。

“Image and shape”界面应如下所示:

确认“Shape”的显示费用为 $0。

注意:Oracle 对启动卷显示每月 $2 的费用,但据我所读到的信息,这是一个估算错误,因为免费套餐已包含 200 GB 的启动卷存储。即使真的收费我也不在意,为这样高性能的虚拟机每月付 $2 也是值得的。

在“Add SSH keys”下,上传你的 SSH 公钥。

最后,点击“Create”来创建虚拟机。

步骤 3:通过 SSH 登录

等待虚拟机显示为运行中:

虚拟机运行后,在本地系统上打开终端。

复制虚拟机的公网 IP 地址:

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

使用 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 密钥添加到虚拟机上。

如果你已在 Github 上注册了 SSH 密钥,一种简便的配置方法是运行以下命令:

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 进行翻译