├── .gitattributes
├── .gitignore
├── Makefile
├── README.md
├── install.sh
├── man
├── ik-update-release.1.md
├── ik.1.md
├── index.ini
├── isolatekit.7.md
├── isolatekit.index.7.md
├── isolatekit.rc.5.md
└── isolatekit.tutorial.7.md
├── misc
├── com.refi64.isolatekit.policy
├── ik-update-release
└── isolatekit-tmpfiles.conf
├── share
└── isolatekit
│ ├── bin
│ ├── aria2c
│ ├── bsdtar
│ ├── pv
│ └── rc
│ ├── sbin
│ ├── ikextract
│ └── ikget
│ └── scripts
│ ├── createunit.rc
│ ├── queryunit.rc
│ ├── rununit.rc
│ └── utils.rc
├── src
└── main.vala
└── units
├── alpine.rc
├── alpine
├── sdk.rc
└── sdk
│ ├── gnome-static.rc
│ └── gnome.rc
├── build
├── isolatekit.rc
└── isolatekit
│ ├── aria2c.rc
│ ├── bsdtar.rc
│ ├── pv.rc
│ └── rc.rc
├── centos.rc
├── fedora.rc
└── ubuntu.rc
/.gitattributes:
--------------------------------------------------------------------------------
1 | share/isolatekit/bin/* filter=lfs diff=lfs merge=lfs -text
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | bin/
2 | !share/isolatekit/bin/
3 | man/out/
4 | man/html/
5 | config.mk
6 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | $(shell mkdir -p bin man/out man/html)
2 |
3 | VALAC=valac
4 | override VALAFLAGS += \
5 | --pkg gio-2.0 \
6 | --pkg linux \
7 | --pkg posix \
8 | --pkg gee-0.8 \
9 | -X -D_GNU_SOURCE \
10 | -g
11 |
12 | MRKD=mrkd
13 |
14 | DESTDIR=
15 | PREFIX=/usr
16 |
17 | -include config.mk
18 |
19 | export CC
20 |
21 | override MAN=$(patsubst man/%.md,man/out/%,$(wildcard man/*.md))
22 | override HTML=$(patsubst man/%.md,man/html/%.html,$(wildcard man/*.md))
23 |
24 | .PHONY: all c clean install man
25 |
26 | all: bin/ik
27 |
28 | bin/ik: src/*.vala
29 | $(VALAC) $(VALAFLAGS) -o $@ $<
30 |
31 | c:
32 | rm -rf bin/*.vala
33 | cp src/*.vala bin
34 | $(VALAC) $(VALAFLAGS) -C bin/*.vala
35 |
36 | man: $(MAN)
37 | html: $(HTML)
38 |
39 | $(MAN): man/out/%: man/%.md
40 | $(MRKD) -index man/index.ini $^ $@
41 |
42 | $(HTML): man/html/%.html: man/%.md
43 | $(MRKD) -index man/index.ini -format html $^ $@
44 |
45 | clean:
46 | rm -rf bin man/out man/html
47 |
48 | install: bin/ik
49 | @sh install.sh $(DESTDIR)$(PREFIX)
50 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # IsolateKit
2 |
3 | ## What is IsolateKit?
4 |
5 | IsolateKit is a lightweight Docker/rkt/containerization alternative, designed
6 | specifically for creating reproducible development environment, vs Docker and rkt's
7 | general-purpose usage.
8 |
9 | ## What's wrong with Docker?
10 |
11 | Docker is great, but it wasn't designed for containers. For instance:
12 |
13 | - The only way to use multiple images at once is through multi-stage builds, which,
14 | though great, make it difficult to install multiple dependencies. Have a project that
15 | needs to be built on CentOS and depends on devtoolset-7, Python, and Ruby in one
16 | build stage? Tough luck; you'll have to pick one image and then install everything
17 | else onto it manually.
18 | - It's a bit unintuitive to run an image directly using a temporary container. Want to
19 | run the Alpine image just once? Try `docker run -t -i --rm alpine ash`. Ouch.
20 | - The new mount syntax makes bind mounts (which is what you'll almost always be using
21 | for building binaries) painful: `--mount type=bind,source=xyz,destination=xyz`.
22 | - You can only depend on already-built images, not unbuilt Dockerfiles. This makes
23 | creating multiple images harder than it needs to be.
24 |
25 | ## What's wrong with rkt?
26 |
27 | - acbuild combines everything wrong with state machines and everything wrong with
28 | declarative build formats into one.
29 | - AppC is dead, and rkt doesn't support OCI yet. Oh, as as a result of OCI,
30 | acbuild is unmaintained.
31 |
32 | ## What's wrong with Rootbox?
33 |
34 | [Rootbox](https://project-rootbox.github.io), IsolateKit's predecessor, was great, but
35 | it had a lot of problems:
36 |
37 | - I wrote it in Bash. Seemed like a good idea at the time, ended up being an epic
38 | disaster.
39 | - There was no concept of proper dependency management, so creating new boxes required
40 | running all of the factories it depended on...even if there was no need.
41 | - It was hard-coded to Alpine Linux and wasn't designed in a way to make it easily
42 | extensible. Alpine is great for building static binaries, but you can't use it to
43 | build other things like AppImages.
44 |
45 | ## IsolateKit Highlights
46 |
47 | - Lightweight. GLib is the only runtime dependency, and Vala is the only built-time
48 | dependency.
49 | - Built on top of systemd-nspawn.
50 | - Designed to make generating environments from source scripts insanely easy. IsolateKit
51 | in its current state isn't really designed around using binary images.
52 |
53 | ## Examples
54 |
55 | ```bash
56 | # Create a new target that depends on the Alpine unit.
57 | $ ik target set test -a ik:alpine.rc
58 | # Run the new target.
59 | $ ik target run test
60 | # Run the new target, but also add the SDK unit.
61 | $ ik target run test -a ik:alpine/sdk.rc
62 | # Run the Alpine unit, but with no target.
63 | # This will discard any changes made (think docker run --rm).
64 | $ ik target run null -a ik:alpine.rc,alpine/sdk.rc
65 | ```
66 |
--------------------------------------------------------------------------------
/install.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | set -e
4 |
5 | PREFIX="$1"
6 | cd "`dirname "$0"`"
7 |
8 | inst() {
9 | case "$1" in
10 | exec) local mode=755 ;;
11 | data) local mode=644 ;;
12 | *) echo "Invalid mode: $mode"; exit 1 ;;
13 | esac
14 |
15 | if [ -n "$3" ]; then
16 | target="$PREFIX/$3/`basename $2`"
17 | else
18 | target="$PREFIX/$2"
19 | fi
20 | echo " inst ($mode) $2 -> $target"
21 | install -Dm $mode "$2" "$target"
22 | }
23 |
24 | if touch "$PREFIX" >/dev/null 2>&1; then
25 | inst exec bin/ik
26 | inst exec misc/ik-update-release bin
27 | inst data misc/isolatekit-tmpfiles.conf lib/tmpfiles.d
28 | inst data misc/com.refi64.isolatekit.policy share/polkit-1/actions
29 | for dir in share/isolatekit/*; do
30 | base=`basename $dir`
31 | if [ "$base" = "bin" ] || [ "$base" = "sbin" ]; then
32 | mode=exec
33 | else
34 | mode=data
35 | fi
36 |
37 | for file in $dir/*; do
38 | inst $mode $file
39 | done
40 | done
41 |
42 | if [ -d man/out ]; then
43 | for file in man/out/*; do
44 | sect=`echo $file | sed 's/.*\.//'`
45 | inst data $file share/man/man$sect
46 | done
47 | fi
48 | else
49 | exec pkexec sh "`realpath "$0"`" "$PREFIX"
50 | fi
51 |
--------------------------------------------------------------------------------
/man/ik-update-release.1.md:
--------------------------------------------------------------------------------
1 | # ik-update-release -- Helper for updating IsolateKit unit script releases
2 |
3 | ## SYNOPSIS
4 |
5 | **ik-update-release** [files...]
6 |
7 | ## DESCRIPTION
8 |
9 | **ik-update-release** is a helper script that updates the releases in IsolateKit unit
10 | scripts. As mentioned in isolatekit.rc(5), releases are ISO 8061 dates, containing
11 | the 4-digit year, month, day, hour, minute, and second, respectively.
12 |
13 | When called with no arguments, **ik-update-release** will print the current time in the
14 | proper format.
15 |
16 | When called with a list of file arguments, **ik-update-release** will search for the
17 | rel= variable assignment in each file and replace it with the properly-formatted
18 | current time.
19 |
--------------------------------------------------------------------------------
/man/ik.1.md:
--------------------------------------------------------------------------------
1 | # ik -- Create isolated development environments
2 |
3 | ## SYNOPSIS
4 |
5 | **ik** [options...] command
6 |
7 | ## DESCRIPTION
8 |
9 | IsolateKit is a tool that lets you easily create isolated development environments.
10 | For more information, see isolatekit(7).
11 |
12 | ## COMMON OPTIONS
13 |
14 | The following options are understood by all commands:
15 |
16 | **-h, --help**
17 |
18 | > Show a help screen.
19 |
20 | **-R, --resolve**
21 |
22 | > Any relative **file:** unit paths will be resolved relative to the given directory
23 | instead of the current directory.
24 |
25 | ## TARGET COMMANDS
26 |
27 | **target set** [target]
28 |
29 | > Set the units used by a target. You may either add units using **--add** or remove units
30 | using **--remove**. If the target does not exist, you may only use **--add**, and the
31 | first unit added *must* be a base unit. All the other units passed must be
32 | builder units. The **--bind-ro** and **--bind-rw** options are ignored in this form.
33 |
34 | **target run** [target]
35 |
36 | > Run a target. If **--add** and/or **--remove** are passed, the units described by those
37 | commands will be added or removed prior to running the target. Passing **null** as the
38 | target name will simply run the units passed to **--add** inside a temporary target that
39 | will be removed once the command exits.
40 |
41 | The following options are understood by the above two commands:
42 |
43 | **-a, --add**
44 |
45 | > A comma-separated list of unit paths to add to the target before executing the
46 | command. If running on either a nonexistent target or the null target, then the first
47 | unit must be a base, and all others must be builder. Otherwise, they all must be
48 | builders.
49 |
50 | **-r, --remove**
51 |
52 | > A comma-separated list of unit paths to remove from the target before executing the
53 | command. You cannot remove the base unit from a target. It is invalid to use this on
54 | nonexistent targets or the null target.
55 |
56 | **-b, --bind-ro**
57 |
58 | > A comma-separated list of read-only bind mounts to add to the target when running it.
59 | The format of each bind mount is *local-path:target-path*, where *local-path* is the host
60 | operating sytem path, and *target-path* is the target mountpoint inside of the target.
61 | Any colons in either path may be escaped by prefixing the colon with a backslash.
62 |
63 | **-B, --bind-rw**
64 |
65 | > Same as above, except the bind mount is read-write instead of read-only.
66 |
67 | ## INFORMATION COMMANDS
68 |
69 | **info target** [target]
70 |
71 | **info unit** [unit]
72 |
73 | > Show information on the given targets or units.
74 |
75 | **list all**
76 |
77 | **list targets**
78 |
79 | **list units**
80 |
81 | > List everything, targets, or units, respectively.
82 |
83 | The following options are understood by the above two commands:
84 |
85 | **-t, --terse**
86 |
87 | > Show terse output.
88 |
89 | ## TARGET AND UNIT COMMANDS
90 |
91 | **update** [units...]
92 |
93 | > Checks for any updates for the given units. If no units are passed, then all the units
94 | will be checked for updates.
95 |
96 | **remove targets** [targets...]
97 |
98 | **remove units** [units...]
99 |
100 | > Remove the given targets or units.
101 |
102 | ## SEE ALSO
103 |
104 | isolatekit.index(7)
105 |
--------------------------------------------------------------------------------
/man/index.ini:
--------------------------------------------------------------------------------
1 | [Index]
2 | isolatekit.index(7)=isolatekit.index.7.html
3 | isolatekit(7)=isolatekit.7.html
4 | isolatekit.tutorial(7)=isolatekit.tutorial.7.html
5 | ik(1)=ik.1.html
6 | ik-update-release(1)=ik-update-release.1.html
7 | isolatekit.rc(5)=isolatekit.rc.5.html
8 |
9 | rc(1)=http://manpages.ubuntu.com/manpages/xenial/man1/rc.1.html
10 |
--------------------------------------------------------------------------------
/man/isolatekit.7.md:
--------------------------------------------------------------------------------
1 | # isolatekit -- Guide on IsolateKit basic concepts
2 |
3 | ## DESCRIPTION
4 |
5 | IsolateKit is a tool that lets you easily create isolated development environments.
6 |
7 | ## TERMINOLOGY
8 |
9 | An **isolate** is a runnable "container", for lack of a better analogy. It consists of a
10 | set of layered **units**, each describing one portion of the isolate.
11 |
12 | There are two types of units: bases and builders. Base units are a base Linux root,
13 | and builder units "build" on top of that base to add more functionality.
14 |
15 | For example, two of the units available for IsolateKit are the alpine and alpine/sdk
16 | units. The former is a base unit that creates a minimal Alpine Linux installation root,
17 | and the latter is a builder unit that installs the alpine-sdk package.
18 |
19 | When any of these units are run, the changes they make to the root filesystem are
20 | stored individually as layers, like Docker does. That way, if the alpine/sdk unit is
21 | updated, the alpine unit won't have to be re-run.
22 |
23 | **targets** are a combination of an isolate (a set of units) and a working directory
24 | where any changes made to the root filesystem will be saved to. These are the build
25 | environments that can be created with IsolateKit.
26 |
27 | All these units are built using **unit scripts**, which are just rc(1) scripts that
28 | create the units. These end in .rc. For more information, see isolatekit.rc(5).
29 |
30 | Unit scripts are referenced via **unit paths**, which describe the path to a unit script.
31 |
32 |
33 | ## UNIT PATHS
34 |
35 | There are 4 types of unit paths:
36 |
37 | **file:**file-path
38 |
39 | > A path to a file on the local file system. Example: *file:my-unit.rc*
40 |
41 | **git:**git-repo//file-path
42 |
43 | > A path to a Git repo, and a file within that repo. If git-repo is looks like a
44 | repository (e.g. myuser/myrepo), then this does the same thing as github:. You can drop
45 | the .rc suffix on file-path.
46 |
47 | **github:**git-repo//file-path
48 |
49 | > Same as the above, but shorthand for GitHub repos. Again, the the .rc suffix on the file
50 | path can be dropped. Example: *git:kirbyfan64/isolatekit//units/alpine*, or
51 | *git:kirbyfan64/isolatekit//units/alpine.rc*.
52 |
53 | **ik:**file-path
54 |
55 | > *ik:xyz* is shorthand for *github:kirbyfan64/isolatekit//units/xyz*. This is a shortcut for
56 | using units included with the IsolateKit repository.
57 |
58 | ## SEE ALSO
59 |
60 | isolatekit.index(7), isolatekit.tutorial(7), ik(1)
61 |
--------------------------------------------------------------------------------
/man/isolatekit.index.7.md:
--------------------------------------------------------------------------------
1 | # isolatekit.index -- IsolateKit documentation index
2 |
3 | ## TUTORIAL
4 |
5 | isolatekit(7) - Guide on IsolateKit basic concepts
6 |
7 | isolatekit.tutorial(7) - A brief tutorial on using IsolateKit
8 |
9 | ## REFERENCE
10 |
11 | ik(1) - Create isolated development environments
12 |
13 | ik-update-release(1) - Helper for updating IsolateKit unit script releases
14 |
15 | isolatekit.rc(5) - IsolateKit unit syntax
16 |
--------------------------------------------------------------------------------
/man/isolatekit.rc.5.md:
--------------------------------------------------------------------------------
1 | # isolatekit.rc -- IsolateKit unit syntax
2 |
3 | ## SYNOPSIS
4 |
5 | *unit*.rc
6 |
7 | ## DESCRIPTION
8 |
9 | Unit files in IsolateKit are simply shell scripts written for the rc(1) shell. They
10 | define variables regarding the unit, as well as functions that are run to set up the
11 | unit.
12 |
13 | ## SYNTAX
14 |
15 | Te variant of rc used by IsolateKit is close in spirit to the original Plan 9 rc,
16 | with a few minor changes. Therefore, you can mostly use the
17 | [original rc manual](http://doc.cat-v.org/plan_9/4th_edition/papers/rc), with some
18 | minor exceptions. These are documented in rc(1) but repeated here for clarity:
19 |
20 | - **if not** has been replaced with **else**.
21 | - The $" operator is now the $^ operator.
22 |
23 | ## UNITS
24 |
25 | There are two types of units:
26 |
27 | **base units**
28 |
29 | > These units are distro bases. They will download and create a minimal OS image.
30 | For instance, the alpine unit is a base unit.
31 |
32 | **builder units**
33 |
34 | > These units extend/add functionality on top of base units. For instance, the alpine/sdk
35 | unit extends the alpine unit to add the alpine-sdk package.
36 |
37 | ## VARIABLES
38 |
39 | Both unit types must define the following variables:
40 |
41 | **name**
42 |
43 | > A unique name for the unit.
44 |
45 | **type**
46 |
47 | > The type of the unit; either *base* or *builder*.
48 |
49 | **rel**
50 |
51 | > The release version of the unit. This is an ISO 8061-formatted date, in UTC time,
52 | containing:
53 |
54 | > - 4-digit year (e.g. 2000)
55 | - A dash.
56 | - 2-digit, 1-indexed month (e.g. 01 for January)
57 | - A dash.
58 | - 2-digit, 1-indexed day (e.g. 11 for the 11th)
59 | - The letter T.
60 | - 2-digit hour.
61 | - A colon.
62 | - 2-digit minute.
63 | - A colon.
64 | - 2-digit second.
65 |
66 | > Example: *2018-03-09T22:08:07*. This value can be retrieved and/or updated via
67 | ik-update-release(1).
68 |
69 | In addition, the following variables are optional:
70 |
71 | **props**
72 |
73 | > A list of words, each defining a property that may be passed to the unit file on the
74 | ik(1) command line. The value passed to a prop can be retrieved from within the
75 | functions in the unit file using the variable **prop_NAME**. As props are only assigned
76 | *after* the unit file is loaded but before any functions are called, default values
77 | may be given by assigning to the prop variables in the top-level script code.
78 |
79 | Builder units must also define the following variable:
80 |
81 | **deps**
82 |
83 | > A list of units that the builder depends on. The first *must* be a base unit.
84 |
85 | ## FUNCTIONS
86 |
87 | Base units must define the following functions:
88 |
89 | **create**
90 |
91 | > Called from the host operating system to create a unit. The following vaiables are
92 | already defined inside this function:
93 |
94 | > - **$target**
95 |
96 | > > The target directory where the unit operating system data should be placed.
97 |
98 | **setup**
99 |
100 | > Called from inside the isolate to install packages/set anything else up.
101 |
102 | Builder units must define the following functions:
103 |
104 | **run**
105 |
106 | > Called from inside the isolate to install packages or set anything up that should be
107 | for this unit.
108 |
109 | ## EXAMPLES
110 |
111 | See **units/alpine.rc** and **units/alpine/sdk.rc** for two simple examples of a base unit
112 | and a builder unit, respectively.
113 |
114 | ## SEE ALSO
115 |
116 | isolatekit.index(7), isolatekit(7)
117 |
--------------------------------------------------------------------------------
/man/isolatekit.tutorial.7.md:
--------------------------------------------------------------------------------
1 | # isolatekit.tutorial -- A brief tutorial on using IsolateKit
2 |
3 | ## INTRODUCTION
4 |
5 | IsolateKit is a tool that lets you easily create reproducible development environments.
6 | This man page is a tutorial to quickly get you up-to-speed.
7 |
8 | ## BASICS
9 |
10 | Read isolatekit(7) first. That will explain some basic terminology and concepts behind
11 | using IsolateKit.
12 |
13 | As an example, let's say you want to create a build environment to statically compile
14 | aria2c binaries. You can create a target named aria2c-build, that contains the units
15 | alpine and alpine/sdk. (Alpine is great for building static binaries). Then, when you
16 | want to work in your build environment, you just "run" the target.
17 |
18 | ## COMMAND LINE USAGE
19 |
20 | The ik(1) tool is the main tool used for working with IsolateKit. Re-iterating the above
21 | use case of an aria2c target, you could try something like this:
22 |
23 | ```bash
24 | # Create a target named aria2c, containing the alpine and alpine/sdk units.
25 | # -a/--add adds units to a target, creating it if it doesn't already exist.
26 | # Note that the base unit (ik:alpine) must ALWAYS come first.
27 | $ ik target set aria2c -a ik:alpine,ik:alpine/sdk
28 | # Actually, maybe we don't want the alpine/sdk unit.
29 | # -r/--remove removes units from a target.
30 | $ ik target set aria2c -r ik:alpine/sdk
31 | # Wait, I take that back.
32 | $ ik target set aria2c -a ik:alpine/sdk
33 | # Now run the target. This will open up a shell inside the target.
34 | $ ik target run aria2c
35 | # Maybe we want to run it without alpine/sdk.
36 | # The -a/--add and -r/--remove flags can be passed to 'target run', too.
37 | $ ik target run aria2c -r ik:alpine/sdk
38 | # Run the target, but pass a read-only bind mount, mounting $PWD as /workspace.
39 | $ ik target run aria2c -b $PWD:/workspace
40 | # Same as above, but with a read-write bind mount.
41 | $ ik target run aria2c -B $PWD:/workspace
42 | # List info about the target we just created.
43 | $ ik info target aria2c
44 | # List all the targets and units we've downloaded.
45 | $ ik list all
46 | $ ik list targets
47 | # Delete the target.
48 | $ ik remove aria2c
49 |
50 | # If you want to play around with units without actually creating a target, just
51 | # run the 'null' target:
52 | $ ik run null -a ik:alpine,ik:alpine/sdk
53 | ```
54 |
55 | ## CREATING UNIT SCRIPTS
56 |
57 | See isolatekit.rc(5).
58 |
59 | ## SEE ALSO
60 |
61 | isolatekit.index(7), isolatekit(7), ik(1)
62 |
--------------------------------------------------------------------------------
/misc/com.refi64.isolatekit.policy:
--------------------------------------------------------------------------------
1 |
2 |
4 |
5 |
6 | re:fi.64
7 | https://github.com/kirbyfan64/isolatekit
8 |
9 |
10 | Run IsolateKit
11 | Authentication is required to use IsolateKit
12 | audio-x-generic
13 |
14 | no
15 | no
16 | auth_admin_keep
17 |
18 | /usr/bin/ik
19 |
20 |
21 |
22 |
--------------------------------------------------------------------------------
/misc/ik-update-release:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
4 | echo 'usage: ik-update-release []'
5 | exit
6 | fi
7 |
8 | date=`date -u +'%Y-%m-%dT%H:%M:%S'`
9 |
10 | if [ -n "$1" ]; then
11 | for arg in "$@"; do
12 | sed -i "s/^rel=.*/rel='$date'/" "$arg"
13 | done
14 | else
15 | echo "$date"
16 | fi
17 |
--------------------------------------------------------------------------------
/misc/isolatekit-tmpfiles.conf:
--------------------------------------------------------------------------------
1 | f /run/isolatekit/script 0600 root root
2 | d /run/isolatekit/tmp 0600 root root
3 | d /run/isolatekit/data 0600 root root
4 |
--------------------------------------------------------------------------------
/share/isolatekit/bin/aria2c:
--------------------------------------------------------------------------------
1 | version https://git-lfs.github.com/spec/v1
2 | oid sha256:7895cbba4a1fad1077b400d636e3d6657a0c69345c5b172608312602239b5d3c
3 | size 87200504
4 |
--------------------------------------------------------------------------------
/share/isolatekit/bin/bsdtar:
--------------------------------------------------------------------------------
1 | version https://git-lfs.github.com/spec/v1
2 | oid sha256:1f5303c34c1784b810d94ff3ca4e3ccec15c4db0f8de25a7da9855014f3c7396
3 | size 4692720
4 |
--------------------------------------------------------------------------------
/share/isolatekit/bin/pv:
--------------------------------------------------------------------------------
1 | version https://git-lfs.github.com/spec/v1
2 | oid sha256:332eb87ecc267b702fe2d31a904435dbadfc231122fa30714ea01904491f8e79
3 | size 593776
4 |
--------------------------------------------------------------------------------
/share/isolatekit/bin/rc:
--------------------------------------------------------------------------------
1 | version https://git-lfs.github.com/spec/v1
2 | oid sha256:d0daff32bf732871466ac57a9f2e9e628898bc59ce83d632e7d78e1c2ea12602
3 | size 417792
4 |
--------------------------------------------------------------------------------
/share/isolatekit/sbin/ikextract:
--------------------------------------------------------------------------------
1 | #!/run/isolatekit/data/bin/rc
2 |
3 | usage='Usage: ikextract [-u|-f]