888888ba .d88888b 8b
88 `8b 88. "' `8b
88 88 dP dP `Y88888b. 88d888b. .d8888b. dP dP dP 88d888b. `8b
88 88 88 88 `8b 88' `88 88' `88 88 88 88 88' `88 .8P
88 88 88. .88 d8' .8P 88. .88 88. .88 88.88b.88' 88 88 .8P
dP dP `88888P' Y88888P 88Y888P' `88888P8 8888P Y8P dP dP 8P
88
dP
A Nushell wrapper over systemd-nspawn and machinectl initially inspired by the the nspawn nspawnhub wrapper script meant to make usage easier and more integrated with nspawn.org (nspawnhub)
We aim to make this as self-contained with as few dependencies as possible, using just the nushell and few binaries like machinectl, gpg and GNU tar (optionally).
This project, as of release 0.7.5, requires nushell 0.93 and systemd v256 to work properly due to utility functions and unprivileged systemd-nspawn containers, it will work fine on other versions, but youll need to confirm every time you run your container
nuspawn remote list # Table of all the available distros
# This should be the minimum necessary to pull your image, from there you can use machinectl.
nuspawn init
machinectl start debian-sid-tar
machinectl login debian-sid-tar
# Advanced usage example: Importing a nspawn configuration to the container and verifiying using the nspawnhub gpg key
nuspawn init debian sid --name "mydebbox" --config=./distrobox-like.nspawn.ini
You can also declare your Nspawn machines in YAML manifests to have them automatically configured by running nuspawn compose create $MANIFEST_PATH
# Version is required due to future breaking changes, it will not let you use old versions on newer versions, not letting you just break the application
version: '0.7'
# Notice that you can declare multiple machines here!
machines:
- name: debox
image: debian
tag: sid
type: raw
config: null # Configuration file copied from $PWD/$FILE
nspawnhub_url: null # You can also specify a custom URL for a specific image
env: # Environment variables for init_commands
- DEBIAN_FRONTEND=noninteractive
init_commands: # Will run when creating the container, not when logging in through machinectl login
- rm -f /etc/apt/apt.conf.d/docker-gzip-indexes /etc/apt/apt.conf.d/docker-no-languages
- apt update -y && apt upgrade -y
- apt install -y cockpit
inline_config: | # Will be copied to /etc/systemd/nspawn/$MACHINE.nspawn before anything runs, more info in `systemd.nspawn(5)`
[Network]
VirtualEthernet=no
properties: # Systemd service properties, see `systemd.exec(5)`
- MemoryMax=2G
More examples in the example/
directory.
You can configure your machines through the config
subcommands, by edit
ing, apply
ing, or remove
ing nspawn configurations
nuspawn init debian sid --name debox # You can also specify --config=(path) to set up a configuration when initializing
nuspawn config list # To check every configuration already applied to images
nuspawn config apply ./example/config/distrobox-like.ini debox # Creates a configuration for the machine after install
nuspawn config edit debox # Will open nano (by default) for editing the machine's configuration file
nuspawn config show debox # Shows every property specified in your configuration in a fancy table
nuspawn config remove debox # Removes any configuration set for `[email protected]`
You can fetch images locally without adding them to the systemd-nspawn machine directory by using nuspawn fetch
nuspawn fetch debian sid # From here you can either extract a tarball, or use mount.ddi to check the image contents
nuspawn fetch --extract --type=tar debian sid .
nuspawn fetch --type=raw debian sid .
systemd-dissect ./debian-sid-raw.raw
~/opt/tulilirockz/nuspawn/src> nuspawn remove debox
Do you wish to delete all your local images? [N]:
You can also Prune, which will delete every image from your system, including configurations if specified.
~/opt/tulilirockz/nuspawn/src> nuspawn prune
[nuspawn] THIS COMMAND WILL CLEAR ALL IMAGES IN LOCAL STORAGE, type YES if you agree to delete everything
Do you wish to delete all your local images? [N]:
Most of the packaging is still yet to be done, tracking issue at #3
Available in my COPR @ tulilirockz/nuspawn
!
TODO!
TODO!
TODO! (maybe), since like... they dont exactly have systemd in them, right?
nix profile install github:tulilirockz/nuspawn#
{
inputs = {
#...
nuspawn = {
url = "github:tulilirockz/nuspawn";
inputs.nixpkgs.follows = "nixpkgs";
};
#...
}
outputs = {
#...
# Install the NuSpawn binary in your NixOS configuration by using inputs.nuspawn.packages.${pkgs.system}.nuspawn in environment.systemPackages
#...
}
}
You should be able to install this project by using the install.nu
script on your system. If you want to live dangerously, you can run:
curl -fsSL "https://raw.githubusercontent.com/tulilirockz/nuspawn/main/install.nu" | nu
It is NOT recommended to do that, though!
If you are trying to run your container and cant seem to get networking working, make sure that your configuration doesnt have the VirtualEthernet option enabled, like this:
[Network]
VirtualEthernet=no