parent
92eb472d40
commit
043df13c1c
|
@ -0,0 +1,35 @@
|
||||||
|
source $stdenv/setup
|
||||||
|
|
||||||
|
set -o pipefail
|
||||||
|
|
||||||
|
# basic file system layout
|
||||||
|
mkdir -p $out/etc $out/proc $out/sys $out/dev $out/run $out/tmp $out/var/tmp $out/var/lib $out/var/log
|
||||||
|
|
||||||
|
# empty files to mount over with host's version
|
||||||
|
touch $out/etc/resolv.conf $out/etc/machine-id
|
||||||
|
|
||||||
|
# required for portable services
|
||||||
|
cp ${osRelease} $out/etc/os-release
|
||||||
|
|
||||||
|
|
||||||
|
# units must be copied to /etc/…
|
||||||
|
mkdir -p $out/etc/systemd/system
|
||||||
|
units=($units)
|
||||||
|
unitNames=($unitNames)
|
||||||
|
for ((n = 0; n < ${#units[*]}; n++)); do
|
||||||
|
unit=${units[$n]}
|
||||||
|
unitName=${unitNames[$n]}
|
||||||
|
cp $unit $out/etc/systemd/system/$unitName
|
||||||
|
done
|
||||||
|
|
||||||
|
|
||||||
|
# symlinks
|
||||||
|
objects=($objects)
|
||||||
|
targets=($targets)
|
||||||
|
for ((n = 0; n < ${#objects[*]}; n++)); do
|
||||||
|
object=${objects[$n]}
|
||||||
|
target=${targets[$n]}
|
||||||
|
|
||||||
|
mkdir -p $(dirname $out/$target)
|
||||||
|
ln -s $object $out/$target
|
||||||
|
done
|
|
@ -0,0 +1,82 @@
|
||||||
|
{ pkgs, lib, stdenv }:
|
||||||
|
/*
|
||||||
|
Create a systemd portable service image
|
||||||
|
https://systemd.io/PORTABLE_SERVICES/
|
||||||
|
|
||||||
|
Example:
|
||||||
|
…
|
||||||
|
pkgs.portableService {
|
||||||
|
name = "hello";
|
||||||
|
version = "2.4.3";
|
||||||
|
description = "hello portable";
|
||||||
|
|
||||||
|
units = [ hello-service ./files/hello.socket ];
|
||||||
|
|
||||||
|
symlinks = [
|
||||||
|
{ object = "${pkgs.cacert}/etc/ssl"; symlink = "/etc/ssl"; }
|
||||||
|
{ object = "${pkgs.bash}/bin/bash"; symlink = "/bin/sh"; }
|
||||||
|
];
|
||||||
|
}
|
||||||
|
…
|
||||||
|
*/
|
||||||
|
{ name
|
||||||
|
, version ? "dev"
|
||||||
|
, description ? null
|
||||||
|
, homepage ? null
|
||||||
|
, units ? [ ]
|
||||||
|
, symlinks ? [ ]
|
||||||
|
, contents ? [ ]
|
||||||
|
, squashfsTools ? pkgs.squashfsTools
|
||||||
|
, squash-compression ? "xz -Xdict-size 100%"
|
||||||
|
, squash-block-size ? "1M"
|
||||||
|
}:
|
||||||
|
|
||||||
|
let
|
||||||
|
image-name = "${name}_${version}";
|
||||||
|
|
||||||
|
os-release-params = lib.filterAttrs (n: v: v != null) {
|
||||||
|
PORTABLE_ID = name;
|
||||||
|
PORTABLE_PRETTY_NAME = description;
|
||||||
|
HOME_URL = homepage;
|
||||||
|
ID = "nixos";
|
||||||
|
PRETTY_NAME = "NixOS";
|
||||||
|
BUILD_ID = "rolling";
|
||||||
|
};
|
||||||
|
|
||||||
|
os-release = pkgs.writeText "os-release" (lib.generators.toKeyValue {} os-release-params);
|
||||||
|
|
||||||
|
getUnitName = u:
|
||||||
|
if lib.isDerivation u then u.name
|
||||||
|
else if builtins.isPath u then baseNameOf u
|
||||||
|
else throw "unit must be either derivation or path";
|
||||||
|
|
||||||
|
rootfs = stdenv.mkDerivation {
|
||||||
|
name = "rootfs";
|
||||||
|
builder = ./build-rootfs.sh;
|
||||||
|
inherit units;
|
||||||
|
unitNames = map getUnitName units;
|
||||||
|
osRelease = os-release;
|
||||||
|
objects = map (x: x.object) symlinks;
|
||||||
|
targets = map (x: x.symlink) symlinks;
|
||||||
|
};
|
||||||
|
in
|
||||||
|
|
||||||
|
stdenv.mkDerivation {
|
||||||
|
name = "${image-name}.raw";
|
||||||
|
nativeBuildInputs = [ squashfsTools ];
|
||||||
|
|
||||||
|
buildCommand = ''
|
||||||
|
closureInfo=${pkgs.closureInfo { rootPaths = contents ++ [rootfs]; }}
|
||||||
|
|
||||||
|
mkdir -p nix/store
|
||||||
|
for i in $(< $closureInfo/store-paths); do
|
||||||
|
cp -a "$i" "''${i:1}"
|
||||||
|
done
|
||||||
|
|
||||||
|
mksquashfs nix ${rootfs}/* $out \
|
||||||
|
-quiet -noappend \
|
||||||
|
-keep-as-directory \
|
||||||
|
-all-root -root-mode 755 \
|
||||||
|
-b ${squash-block-size} -comp ${squash-compression}
|
||||||
|
'';
|
||||||
|
}
|
Loading…
Reference in New Issue