6.7 KiB
created:: 2023-12-10T12:53:42 (UTC -05:00) tags:: nixos source:: https://gist.github.com/misuzu/89fb064a2cc09c6a75dc9833bb3995bf author:: 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.nixfile with following contents (do not add any packages toenvironment.systemPackagesor 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.nixCopy tarball to remote machine using
scpand 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@somehostRepartition your drive, format, mount file systems, create swap(file) and activate it as soon as possible. Check manual for more info.