怎样在 Vultr VPS 上安装 NixOS

在 Vultr 上安装 NixOS

NixOS 是一个纯功能的 Linux 发行版,构建在 Nix 包管理器之上。 NixOS 及其模块系统使得构建完全可复制的系统成为可能,这样在给定机器上的配置,部署在任何其他机器上,将产生相同的系统状态。

安装介质

公共 Vultr ISO 库包含 NixOS 20.09。 如果您正在寻找更高版本,您可以 将 NixOS ISO 添加到 Vultr. 选择一个 minimal x86_64 分布从 https://channels.nixos.org/. 例如,版本 21.05 将使用此链接:

https://channels.nixos.org/nixos-21.05/latest-nixos-minimal-x86_64-linux.iso

部署服务器

转到 Vultr 仪表板 部署实例。 选择任何服务器计划和位置。

对于服务器类型选择,您有两个选项。

如果您上传了 ISO,则可以在 上传 ISO 标签。 否则,找到 Vultr 的 NixOS ISO库.

选择您想要的 NixOS 版本,配置服务器设置,然后单击 立即部署.

打开控制台

VPS 启动完成后,您应该在 你的门户. 接下来,单击 VPS 条目并打开控制台(控制台图标或 3 点菜单条目,具体取决于您的屏幕布局。)

您应该自动登录为 nixos 帐户。

通过 SSH 登录(可选)

如果您更喜欢 SSH 而不是 Vultr Web 控制台,可以临时授权一个 SSH 密钥用于 nixos 在安装过程中将帐户添加到 /home/nixos/.ssh/authorized_keys.

例如,如果您将公共 SSH 密钥上传到 GitHub,则可以执行以下操作:

$ mkdir ~/.ssh
$ curl -L https://github.com/<username>.keys >~/.ssh/authorized_keys

通过 SSH 登录为 nixos 用户。

创建文件系统

跑步 sudo -s 为以下步骤获取 root shell。

使用磁盘分区 parted 命令行界面。

# parted /dev/vda

你应该得到类似这样的输出:

GNU Parted 3.4
Using /dev/vda
Welcome to GNU Parted! Type' help' to view a list of commands.
(parted)

如果您运行的实例的 RAM 少于 4 GB,则需要一个交换分区才能成功完成安装过程。 在这种情况下,请在 parted 命令行界面。

# mklabel msdos
# mkpart primary 1MiB -1GiB
# mkpart primary linux-swap -1GiB 100%

否则,仅创建主分区。

# mklabel msdos
# mkpart primary 1MiB 100%

一旦你完成了 parted,发出 quit 命令。 您应该会看到常规的 root 提示,类似于 [[email protected]:/home/nixos]#.

使用文件系统格式化您的新分区。

# mkfs.btrfs -L root /dev/vda1

可以使用 ext4 代替 btrfs:

# mkfs.ext4 -L root /dev/vda1

从 Linux 5.0 开始,Btrfs 对于大多数工作负载来说比 Ext4 慢,但它具有 Ext4 所缺乏的功能,例如通过写时复制设计启用的快照。 决定权在你。

如果您选择添加交换分区,请使用以下内容对其进行初始化。

# mkswap -L swap /dev/vda2
# swapon /dev/vda2

挂载磁盘。

# mount /dev/disk/by-label/root /mnt

配置 NixOS

现在您已经完成了启动和磁盘格式化,是时候做出有关配置的决定了。

Nix Channels 或 Nix Flakes

Nix Channels 是 NixOS 升级的原始分发机制。 对于 Nix 频道,有几个关键点值得考虑。

不需要配置文件的版本控制没有“锁定文件”。 来自同一频道版本的 NixOS 上的两台 NixOS 机器的系统配置可能具有不同的软件包版本和模块 升级由 nix-channel --upgrade

Nix Flkes 是下一代 Nix 包管理器。 与 Nix Channels 相比,Nix Flakes 具有以下属性。

需要对您的配置进行版本控制; 通常是 Git。 Nixpkgs 版本通过锁定文件固定, flake.lock. 在多台机器上分发基于 Flake 的系统配置时,您可以保证始终获得相同的软件包版本和模块行为 升级由命令处理,例如 nix flake update
Nix Flakes 带有下一代 Nix CLI,它整合并简化了 Nix 相关命令

对于通道或薄片,在触发重建之前不会应用升级。 对于频道,这需要运行 nixos-rebuild switch,而使用 Flakes 时,它就像 nixos-rebuild switch--flake 旗帜。

然而,由于 Nix Flakes 不稳定,其行为可能会发生变化。

您的决定归结为两个关键点:

为了获得最大的稳定性,并且如果您不介意稍微不同的软件版本和跨多个虚拟机的偶尔损坏,请使用 Nix 通道。 如果您喜欢试验并希望在多台机器上具有完美的再现性,请使用 Nix Flakes。

本指南提供了一个通用配置。 还提供了该配置之上的起始片。

生成初始配置

使用此命令生成从硬件信息和已安装磁盘派生的配置。

# nixos-generate-config --root /mnt

编辑新生成的配置。

# nano /mnt/etc/nixos/configuration.nix

更改以下值。 它们可能已经存在于注释掉的配置中。 随意取消对它们的注释或添加新语句。 仔细阅读评论。

# Set a hostname. Replace machineName with your desired name.
networking.hostName = "machineName";

# Set the boot device.
boot.loader.grub.device = "/dev/vda";

# Enable SSH server.
services.openssh.enable = true;

# Disable SSH root login.
services.openssh.permitRootLogin = "no";

# Using an SSH key for authentication is STRONGLY RECOMMENDED.
# Password authentication is known to be less secure and
# leaves you vulnerable to brute-force attacks and drive-by
# password scanning by botnets.
# Comment this out to enable password authentication.
# If you are using the web console thus far to configure
# your VM, comment this out until after installation.
services.openssh.passwordAuthentication = false;

# Manage users declaratively.
users.mutableUsers = false;

# Add a user.
users.users.nixos = {
  isNormalUser = true;

  # Set an initial password. This will be overridden.
  initialPassword = "ChangeMeVultr";

  # Add a hashed password, overrides initialPassword.
  # See below.
  # hashedPassword = "";

  extraGroups = [ "wheel" ];
  openssh.authorizedKeys.keys = [
    # Authorize the SSH public key from `key.pub`.
    # Remove this statement if you use password
    # authentication.
    (builtins.readFile ./key.pub)
  ];
};

SSH 密钥(推荐)

一种 key.pub SSH 公钥应该放在 /mnt/etc/nixos/ 旁边的目录 configuration.nix. 如果您之前将 SSH 密钥添加到 authorized_keys,你可以复制过去。

    # cp /home/nixos/.ssh/authorized_keys /mnt/etc/nixos/key.pub

生成散列密码(可选)

如果您在 Web 控制台中工作,请跳过此步骤,直到安装完成。 无法复制输出 mkpasswd 从 Vultr 控制台。

可以将用户帐户的密码以明文形式存储在配置文件中 initialPassword 属性。 尽管如此,强烈建议您以散列形式存储它。 这使得将来更容易对您的配置进行版本控制,因为无法从其正确散列的版本中恢复密码。

要生成散列密码,请运行以下命令。

# nix-shell -p mkpasswd --run 'mkpasswd -m sha-512'

此调用暂时下载 mkpasswd 实用程序并运行命令, mkpasswd -m sha-512 在具有效用的环境中 PATH. 该实用程序将一直可用到下一个 垃圾收集.

取消注释 hashedPassword 分配并粘贴输出 mkpasswd 入字符串。

添加薄片(可选)

确保您仍在 root shell 中。

# id
uid=0(root) gid=0(root) groups=0(root)

重新运行 sudo -s 如果不是这种情况。

设置flakes所需的shell环境。

# nix-shell -p nixUnstable git

将此文件写入 /mnt/etc/nixos/flake.nix.

{
  description = "system configuration flake";

  inputs = {
    # Replace this with any nixpkgs revision you want to use.
    # See a list of potential revisions at
    # https://github.com/NixOS/nixpkgs/branches/active
    nixpkgs.url = "nixpkgs/release-21.05";
  };

  outputs = [email protected]{ self, nixpkgs }:
    let
      lib = nixpkgs.lib;
      nixConf = pkgs: {
        environment.systemPackages = [ pkgs.git ];
        nix = {
          package = pkgs.nixFlakes;
          extraOptions=""
            experimental-features = nix-command flakes
          ";
          autoOptimiseStore = true;
          gc = {
            automatic = true;
            dates = "weekly";
          };
        };
      };
    in
    {
      # Replace machineName with your desired hostname.
      nixosConfigurations.machineName = nixpkgs.lib.nixosSystem rec {
        system = "x86_64-linux";

        modules = [
          (nixConf nixpkgs.legacyPackages.${system})
          ./configuration.nix
        ];
      };
    };
}

Flakes 需要版本控制。 初始化一个 Git 仓库 /mnt/etc/nixos.

# cd /mnt/etc/nixos
# git init .

Flake 引用的所有文件都必须由 Git 跟踪。

跟踪目录中所有现有的 nix 文件。

git add *.nix

如果您添加了 SSH 密钥,请运行此命令:

git add key.pub

安装

如果您选择不使用 Flake,运行以下命令。

nixos-install --no-root-passwd

不需要 root 密码,因为大多数操作应该作为 nixos 用户。 可以通过以下方式获得根访问权限 sudonixos 用户的密码。

如果您使用 Flake,改为运行此命令。 请注意,如果您的实例很小,初始 Flake 安装可能需要很长时间。 在此阶段可以通过运行先前给定的命令来安装基于 Channel 的系统。

nixos-install --no-root-passwd --flake /etc/nixos#machineName

flake.nix 上面定制,替换 machineName 在使用您选择的主机名的调用中。

如果过程中出现错误 nixos-install, 这 configuration.nix 可以编辑文件以更正错误。 nixos-install 可以根据需要运行多次。

重新启动并验证

返回仪表板
选择您的服务器。 点击 设置 标签。 找出 自定义 ISO 选项卡中的侧边栏。 删除 ISO。 这将重新启动实例。 启动后通过 SSH 进入机器。

如果您还没有并且想设置您的散列密码,请立即设置。 为此,您应该能够运行 sudo -s 得到一个root shell。 密码就是你设置的 initialPassword, 如 ChangeMeVultr.

更新

维护系统并在安装后保持最新状态非常重要。 通过更新,您会收到针对安全问题和错误的补丁。

所有更新操作都应该以 root 身份运行, 要么 sudo 或在根外壳中 sudo -s. 本指南将假设后者。

渠道系统

改成 /etc/nixos.

# cd /etc/nixos

更新固定的 Nixpkgs 修订版

# nix flake update

从新的 Nixpkgs 修订版生成并切换到新系统。 将 machineName 替换为您的主机名。

# nixos-rebuild switch --flake .#machineName

片状系统

改成 /etc/nixos.

# cd /etc/nixos

更新 NixOS。

# nix-channel --update

从新的 Nixpkgs 修订版生成并切换到新系统。

# nixos-rebuild switch

快照您的新机器

创建 NixOS 安装的快照。 从现在开始,您可以从快照部署 NixOS。

注:本教程在Vultr VPS上测试通过,如需部署请前往Vultr.com