IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    How to Install NixOS on Oracle ARM machine

    Orchestr发表于 2023-08-11 15:32:58
    love 0
    How to Install NixOS on Oracle ARM machine

    After much persistence, I finally registered for Oracle Cloud's always-free tier and set up a powerful machine. But soon, I faced challenges.

    For three years, my work computer has run on NixOS, with its nix flakes feature boosting my productivity, aided by workplace IT support. However, for my home setups, Ubuntu has been the clear choice due to its extensive resources and tutorials. While NixOS offers robust capabilities, its steep learning curve often leads me to devise custom solutions.

    Despite the initial hurdles, I'm growing fond of NixOS's efficiency. I'm contemplating transitioning most of my systems to it, especially given the ease of deployment with a single nix flake.

    Below, I've detailed the steps I undertook to transition from Ubuntu to NixOS on an Oracle ARM machine.

    Step 0: Log in to Ubuntu

    When setting up your Oracle server, remember to add your key or download the auto-generated keys. This ensures you can SSH into the machine:

    ssh ubuntu@${your oracle machine ip}

    Step 1: Install Nix(Not OS, just a command line tool)

    Run the following command. When prompted, answer with n, y, y.

    sh <(curl -L https://nixos.org/nix/install) --daemon   

    After this, you can either log out and log back in or just type bash and press enter. Next, add the NixOS channels (as of this writing, the latest stable channel is 23.05):

    nix-channel --add https://nixos.org/channels/nixos-23.05 nixpkgs
    nix-channel --update

    Step 2: Prepare an In-memory NixOS

    Following the NixOS Wiki, use cleverca22's scripts to create the installation system:

    git clone https://github.com/cleverca22/nix-tests.git
    cd nix-tests/kexec
    vim myconfig.nix

    Here's an example of myconfig.nix, ensure you include your SSH public key.

    {
      imports = [
        ./configuration.nix
      ];
    
      # Make it use predictable interface names starting with eth0
      boot.kernelParams = [ "net.ifnames=0" ];
    
      networking.useDHCP = true;
    
      kexec.autoReboot = false;
    
      users.users.root.openssh.authorizedKeys.keys = [
        "{your id_rsa.pub file content}"
      ];
    }

    You can now build a full kexec-capable NixOS system from this configuration. This will produce a tarball.tar.xz file. Once this process completes, you can untar the file and run kexec to initiate the installation. In the meantime, take a break, perhaps brew yourself a cup of coffee, or gaze up at the sky for a moment of reflection. Once the process is finished, you will be automatically logged out from the current terminal session.

    nix-build '<nixpkgs/nixos>' -A config.system.build.kexec_tarball -I nixos-config=./myconfig.nix
    tar -xf ./result/tarball/nixos-system-aarch64-linux.tar.xz
    sudo ./kexec_nixos

    Step 3: Installing NixOS to disk

    First, remove the old SSH known host since the system has changed, and then SSH in again:

    ssh-keygen -R ${your oracle machine ip}
    ssh root@${your oracle machine ip}

    This will make you the root on an in-memory NixOS system. If you restart now, it reverts to Ubuntu. So, to stick with NixOS, follow the disk setup steps provided.
    Once done, initiate the installation with:

    # parted
    (parted) rm 1
    (parted) rm 15
    (parted) mkpart
    Partition name?  []? boot
    File system type?  [ext2]? fat32
    Start? 2048s
    End? 10GB
    (parted) print all
    Model: ORACLE BlockVolume (scsi)
    Disk /dev/sda: 50.0GB
    Sector size (logical/physical): 512B/4096B
    Partition Table: gpt
    Disk Flags:
    
    Number  Start   End     Size    File system  Name  Flags
     1      1049kB  10.0GB  9999MB  fat32        boot  msftdata
    
    
    (parted) set 1 boot on
    (parted) set 1 esp on
    (parted) mkpart
    Partition name?  []?
    File system type?  [ext2]? ext4
    Start? 10GB
    End? -1s
    Warning: You requested a partition from 10.0GB to 50.0GB (sectors 19531250..97677311).
    The closest location we can manage is 10.0GB to 50.0GB (sectors 19531776..97677278).
    Is this still acceptable to you?
    Yes/No? yes
    (parted) quit

    We can now make filesystems on our brand new partitions, mount them, and configure NixOS to use them, You want to at least set openssh.enable = true; and add an ssh key for root, like we did in the temporary system above.

    mkfs.fat -F 32 /dev/sda1
    mkfs.ext4 /dev/sda2
    mkdir -p /mnt/boot
    mount /dev/sda2 /mnt/
    mount /dev/sda1 /mnt/boot/
    nixos-generate-config --root /mnt
    vim /mnt/etc/nixos/configuration.nix 

    Once done, initiate the installation with:

    nixos-install

    Then, reboot the system.

    Step 4: All done

    As before, remove the old SSH known host entry and SSH back in:

    ssh-keygen -R ${your oracle machine ip}
    ssh root@${your oracle machine ip}

    Congratulations! Your Oracle machine now runs NixOS. I'll be testing more NixOS features and will organize my findings in a subsequent post.



沪ICP备19023445号-2号
友情链接