Nixos-shell: Difference between revisions

imported>Onny
mNo edit summary
Onny (talk | contribs)
 
(8 intermediate revisions by 4 users not shown)
Line 1: Line 1:
[https://github.com/Mic92/nixos-shell Nixos-shell] is a small helper script for spawning lightweight NixOS virtual machines in a shell.
{{DISPLAYTITLE:{{#if:{{NAMESPACE}}|{{NAMESPACE}}:|}}{{lcfirst:{{PAGENAME}}}}}}
[https://github.com/Mic92/nixos-shell nixos-shell] is a small helper script for spawning lightweight NixOS virtual machines in a shell.


== Installation ==
== Installation ==
Line 16: Line 17:
{{file|myvm.nix|nix|<nowiki>
{{file|myvm.nix|nix|<nowiki>
{ pkgs, ... }: {
{ pkgs, ... }: {
   services.dokuwiki.sites."localhost" = {
   services.dokuwiki.sites."localhost" = {
     enable = true;
     enable = true;
     settings.title = "My Wiki";
     settings.title = "My Wiki";
   };
   };
};
}
</nowiki>}}
</nowiki>}}


Line 31: Line 31:


After the VM is successfully booted, DokuWiki will be available on http://localhost:8080
After the VM is successfully booted, DokuWiki will be available on http://localhost:8080
=== Reference local nixpkgs folder ===
Using the <code>-I nixpkgs</code> parameter, you could choose to use a local ''nixpkgs'' repository, for example to test unfinished packages or modules:<syntaxhighlight lang="bash">
nixos-shell -I nixpkgs=/home/myuser/projects/nixpkgs myvm.nix
</syntaxhighlight>
=== Graphical session ===
Following snippet will spawn a QEMU session with a graphical screen running GNOME, configured to auto login the user <code>nixos</code>.{{file|myvm.nix|nix|<nowiki>
{ ... }: {
  virtualisation.memorySize = 8096;
  virtualisation.cores = 8;
  virtualisation.graphics = true;
  services.displayManager.gdm.enable = true;
  services.desktopManager.gnome.enable = true;
  services.displayManager.autoLogin = {
    enable = true;
    user = "nixos";
  };
  users.users.nixos = {
    isNormalUser = true;
    initialPassword = "nixos";
  };
};
</nowiki>|name=|lang=}}


=== Mounting host directories ===
=== Mounting host directories ===
Line 37: Line 65:


{{file|myvm.nix|nix|<nowiki>
{{file|myvm.nix|nix|<nowiki>
{ pkgs, ... }: {
{ ... }: {
   nixos-shell.mounts.extraMounts = {
   nixos-shell.mounts.extraMounts = {
     "/var/lib/nextcloud/store-apps/calendar" = {
     "/var/lib/nextcloud/store-apps/calendar" = {
Line 43: Line 71:
       cache = "none";
       cache = "none";
     };
     };
  };
};
};
</nowiki>|name=|lang=}}
Mounting is done through the network filesystem protocol 9p. Currently [https://github.com/Mic92/nixos-shell/issues/71 it's not possible] to mount the target directory with a specific UID/GID, so you'll have to change the permissions on the host directory according to your needs.
=== Inside Nix Flake ===
Using following [[Flakes]] example, you can start a virtual machine using nixos-shell by just typing <code>nix run</code>
{{file|flake.nix|nix|<nowiki>
{
  description = "Spawns lightweight nixos vm in a shell";
  inputs = {
    nixpkgs.url = "nixpkgs/nixos-23.11";
    nixos-shell.url = "github:Mic92/nixos-shell";
  };
  outputs = { self, nixpkgs, nixos-shell }: let
    pkgs = nixpkgs.legacyPackages.x86_64-linux;
    start =
      pkgs.writeShellScriptBin "start" ''
        set -e
        export QEMU_NET_OPTS="hostfwd=tcp::8080-:80"
        ${pkgs.nixos-shell}/bin/nixos-shell --flake .
      '';
  in {
    nixosConfigurations.vm = nixpkgs.lib.nixosSystem {
      system = "x86_64-linux";
      modules = [
        (import ./myvm.nix)
        nixos-shell.nixosModules.nixos-shell
      ];
    };
    packages = { inherit start; };
    defaultPackage.x86_64-linux = start;
  };
}
</nowiki>}}
</nowiki>}}


Mounting is done through the network filesystem protocol 9p. Currently [https://github.com/Mic92/nixos-shell/issues/71 it's not possible] to mount the target directory with a specific UID/GID, so you'll have to change the permissions on the host directory according to your needs.
The configuration of the virtual machine is inside the file <code>myvm.nix</code> in the same directory. The virtual machine will use the nixpkgs source defined in the flake inputs.
 
[[Category:Container]]