Files
LogSeqDB/pages/Tech/NixOS/Articles/Install NixOS on Oracle Cloud over Ubuntu 18.04.sync-conflict-20250817-085627-UULL5XD.md
2025-12-11 06:26:12 -08:00

6.6 KiB

created, tags, source, author
created tags source author
2023-12-10T12:53:42 (UTC -05:00)
nixos
https://gist.github.com/misuzu/89fb064a2cc09c6a75dc9833bb3995bf misuzu
  • Install NixOS on Oracle Cloud over Ubuntu 18.04

    Excerpt

    Install NixOS on Oracle Cloud over Ubuntu 18.04. GitHub Gist: instantly share code, notes, and snippets.


  • Install NixOS on Oracle Cloud over Ubuntu 18.04 (make sure to use Ubuntu 18.04 or this may not work)

    # install useful tools
    sudo apt-get update
    sudo apt-get install --no-install-recommends -y nano mc git
    
    # prepare /boot
    sudo umount /boot/efi
    sudo mv /boot /boot.bak
    sudo mkdir /boot/
    sudo mount /dev/sda15 /boot
    sudo mv /boot/* /boot.bak/efi/
    
    # use swap file
    sudo dd if=/dev/zero of=/swapfile bs=1M count=1024 status=progress
    sudo chmod 600 /swapfile
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
    # install nix
    sh <(curl -L https://nixos.org/nix/install)
    . $HOME/.nix-profile/etc/profile.d/nix.sh
    nix-channel --add https://nixos.org/channels/nixos-21.11 nixpkgs
    nix-channel --update
    
    # install nixos-generate-config and nixos-install
    nix-env -f '<nixpkgs>' -iA nixos-install-tools
    
    # generate config
    sudo `which nixos-generate-config` --root /
    
    # remove lxc mounts
    sudo nano /etc/nixos/hardware-configuration.nix
    # set hostname, add users and ssh-keys, enable openssh
    sudo nano /etc/nixos/configuration.nix
    
    # build config
    nix-env -p /nix/var/nix/profiles/system -f '<nixpkgs/nixos>' -I nixos-config=/etc/nixos/configuration.nix -iA system
    
    # prepare target
    sudo chown -R 0.0 /nix
    sudo touch /etc/NIXOS
    sudo touch /etc/NIXOS_LUSTRATE
    echo etc/nixos | sudo tee -a /etc/NIXOS_LUSTRATE
    
    # install NixOS
    sudo NIXOS_INSTALL_BOOTLOADER=1 /nix/var/nix/profiles/system/bin/switch-to-configuration boot
    
    sudo reboot
    
  • Recommended configuration options

    {
      # Oracle Cloud uses EFI boot
      boot.loader.systemd-boot.enable = true;
      boot.loader.efi.canTouchEfiVariables = true;
    
      # Kernel cmdline from Ubuntu config
      boot.kernelParams = [
        "console=ttyS0"
        "console=tty1"
        "nvme.shutdown_timeout=10"
        "libiscsi.debug_libiscsi_eh=1"
      ];
    
      # Load graphics driver in stage 1
      boot.initrd.kernelModules = [ "bochs_drm" ];
    
      # swap file is recommended
      swapDevices = [
        {
          device = "/swapfile";
          priority = 0;
        }
      ];
    }
    
  • Repartitioning target system from kexec image

    Create kexec.nix file with following contents (do not add any packages to environment.systemPackages or it won't boot on 1GB system):

    { config, pkgs, ... }:
    {
      imports = [
        # this will work only under qemu, uncomment next line for full image
        # <nixpkgs/nixos/modules/installer/netboot/netboot-minimal.nix>
        <nixpkgs/nixos/modules/installer/netboot/netboot.nix>
        <nixpkgs/nixos/modules/profiles/qemu-guest.nix>
      ];
    
      # stripped down version of https://github.com/cleverca22/nix-tests/tree/master/kexec
      system.build = rec {
        image = pkgs.runCommand "image" { buildInputs = [ pkgs.nukeReferences ]; } ''
          mkdir $out
          cp ${config.system.build.kernel}/${config.system.boot.loader.kernelFile} $out/kernel
          cp ${config.system.build.netbootRamdisk}/initrd $out/initrd
          nuke-refs $out/kernel
        '';
        kexec_script = pkgs.writeTextFile {
          executable = true;
          name = "kexec-nixos";
          text = ''
            #!${pkgs.stdenv.shell}
            set -e
            ${pkgs.kexectools}/bin/kexec -l ${image}/kernel --initrd=${image}/initrd --append="init=${builtins.unsafeDiscardStringContext config.system.build.toplevel}/init ${toString config.boot.kernelParams}"
            sync
            echo "executing kernel, filesystems will be improperly umounted"
            ${pkgs.kexectools}/bin/kexec -e
          '';
        };
        kexec_tarball = pkgs.callPackage <nixpkgs/nixos/lib/make-system-tarball.nix> {
          storeContents = [
            {
              object = config.system.build.kexec_script;
              symlink = "/kexec_nixos";
            }
          ];
          contents = [ ];
          compressCommand = "cat";
          compressionExtension = "";
        };
        kexec_tarball_self_extract_script = pkgs.writeTextFile {
          executable = true;
          name = "kexec-nixos";
          text = ''
            #!/bin/sh
            set -eu
            ARCHIVE=`awk '/^__ARCHIVE_BELOW__/ { print NR + 1; exit 0; }' $0`
            tail -n+$ARCHIVE $0 | tar x -C /
            /kexec_nixos $@
            exit 1
            __ARCHIVE_BELOW__
          '';
        };
        kexec_bundle = pkgs.runCommand "kexec_bundle" { } ''
          cat \
            ${kexec_tarball_self_extract_script} \
            ${kexec_tarball}/tarball/nixos-system-${kexec_tarball.system}.tar \
            > $out
          chmod +x $out
        '';
      };
    
      boot.initrd.availableKernelModules = [ "ata_piix" "uhci_hcd" ];
      boot.kernelParams = [
        "panic=30" "boot.panic_on_fail" # reboot the machine upon fatal boot issues
        "console=ttyS0" # enable serial console
        "console=tty1"
      ];
      boot.kernel.sysctl."vm.overcommit_memory" = "1";
    
      environment.systemPackages = with pkgs; [ cryptsetup ];
      environment.variables.GC_INITIAL_HEAP_SIZE = "1M";
    
      networking.hostName = "kexec";
    
      services.getty.autologinUser = "root";
      services.openssh = {
        enable = true;
        challengeResponseAuthentication = false;
        passwordAuthentication = false;
      };
    
      documentation.enable = false;
      documentation.nixos.enable = false;
      fonts.fontconfig.enable = false;
      programs.bash.enableCompletion = false;
      programs.command-not-found.enable = false;
      security.polkit.enable = false;
      security.rtkit.enable = pkgs.lib.mkForce false;
      services.udisks2.enable = false;
      i18n.supportedLocales = [ (config.i18n.defaultLocale + "/UTF-8") ];
    
      users.users.root.openssh.authorizedKeys.keys = [
        # add your ssh key here
        "ssh-ed25519 ...."
      ];
    }
    

    Build kexec image (you'll need nix/NixOS installed on your machine):

    nix-build '<nixpkgs/nixos>' -A config.system.build.kexec_bundle -I nixos-config=./kexec.nix
    

    Copy tarball to remote machine using scp and reboot into kexec image:

    scp ./result ubuntu@somehost:/tmp/kexec
    ssh ubuntu@somehost -t sudo /tmp/kexec
    # wait for machine to boot and then connect
    ssh root@somehost
    

    Repartition your drive, format, mount file systems, create swap(file) and activate it as soon as possible. Check manual for more info.