Bundle Nix derivations to run anywhere!
Go to file
Matthew Bauer 1b9cffd972 Fix appimage stuff
Wasn't working since v0.1.1
2017-04-30 02:32:58 -05:00
.gitignore Mod .gitignore. 2016-06-15 18:53:25 +00:00
appdir.nix Update apprun and appimagetool hashes. 2017-02-12 14:54:23 -06:00
appdir.sh Fix appimage stuff 2017-04-30 02:32:58 -05:00
appimage-top.nix Fix appimage stuff 2017-04-30 02:32:58 -05:00
appimage.nix Use generated name from appimagetool. 2017-02-06 18:21:18 -06:00
appimagetool.nix Update apprun and appimagetool hashes. 2017-02-12 14:54:23 -06:00
closure.nix Add some scripts to deal with closures. 2017-02-12 18:21:51 -06:00
closure.sh Fix closure.sh 2017-02-12 18:26:09 -06:00
default.nix Fixup for bzip2-less environs 2017-04-30 02:09:34 -05:00
install-nix-from-closure.sh Add nix installer. 2016-06-15 18:53:47 +00:00
LICENSE Create LICENSE 2017-02-07 00:43:47 -06:00
Makefile Fixup nix_file locaiton 2017-04-26 01:51:16 -05:00
nix2appimage.sh Fix appimage stuff 2017-04-30 02:32:58 -05:00
nix-bundle.sh Allow multiple targets in nix-bundle 2017-04-29 19:54:09 -05:00
nix-installer.nix Add nix-bundle.sh. 2016-11-26 01:05:43 -06:00
nix-strace.sh Add nix-strace.sh (wip) 2017-04-29 19:54:09 -05:00
README.md Update README.md 2017-04-30 02:26:52 -05:00

nix-bundle

nix-bundle is a way to package Nix attributes into single-file executables.

Benefits

  • Single-file output
  • Can be run by non-root users
  • No runtime
  • Distro agnostic
  • Completely portable
  • No installation

Getting started

Make sure you have installed Nix already. See http://nixos.org/nix/ for more details.

Once you have a working Nix install, you can run:

$ ./nix-bundle.sh hello /bin/hello

hello indicates the Nix derivation from NixPkgs that you want to use, while /bin/hello indicates the path of the executable relative to hello that you want to run. This will create the file "hello". Running it:

$ ./hello
Hello, world!

This is a standalone file that is completely portable! As long as you are running a same architecture Linux kernel and have a shell interpreter it will run. No external dependencies are required besides a compatible Linux kernel and a shell interpreter.

Some others to try:

./nix-bundle.sh nano /bin/nano
./nix-bundle.sh firefox /bin/firefox
./nix-bundle.sh emacs /bin/emacs

Self-bundling

Startin with v0.1.3, you can bundle nix-bundle! To do this, just use nix-bundle normally:

NIX_PATH="nixpkgs=https://github.com/matthewbauer/nixpkgs/archive/nix-bundle.tar.gz" ./nix-bundle.sh nix-bundle /bin/nix-bundle

[Experimental] Create AppImage executables from Nix expressions

"nix-bundle.sh" tends to create fairly large outputs. This is largely because nix-bundle.sh uses gzip compression and AppImage uses lzma compression. Anyway, you can create a compliant "AppImage" using the "nix2appimage.sh" script:

./nix2appimage.sh emacs

This will create a file at Emacs-x86_64.AppImage which you can execute.

Notice that there is only one argument for nix2appimage.sh. This is because the target executable will be detected from the .desktop file in /share/applications/*.desktop. As a side-effect, AppImage requires your package to have a .desktop file, so packages like "hello", "coreutils", etc. will not work.

Some other examples to try:

./nix2appimage.sh firefox
./nix2appimage.sh vlc
./nix2appimage.sh 0ad
./nix2appimage.sh wireshark-gtk

These may take a while because of the large closure size.

Comparison with AppImage, FlatPak, Snappy

Name Distro-agnostic Runtime required Root required Storage
nix-bundle yes no no Arx tarball
AppImage yes no no Squashfs w/ lzma compression
FlatPak yes yes no ?
Snappy yes yes no squashFS

How it works

Nix-bundle glues together four different projects to work correctly:

  • Arx - an archive execution tool
  • Creates single-file archive executable that can unpack themselves and then run some command. nix-bundle calls nix-user-chroot to bootstrap the Nix environment. It outputs a "./nix" folder.
  • nix-user-chroot - a small bootstrap that uses Linux namespaces to call chroot
    • This will create sub namespace and bind mount the "./nix" to "/nix" so that the Nix references function properly.
  • Nix - a functional package manager
    • Used to build runtime closures that are self-contained.
  • nixpkgs
    • Provides lots of different packages to choose from.

Drawbacks

Nix-bundle has some drawbacks that need to be worked on:

  • Slow startup
  • Large files (Firefox 150MB)
  • Only compatible Linux
  • Outputs built on x86-64 will not run on i386
  • Requires Linux kernel with CAP_SYS_USER_NS on and permissions setup correctly