Creating jails from pkgbase packages

Martin Jakob mj-mailinglist at
Tue Apr 30 11:24:16 UTC 2019

My first attempt seems to be empty when its arrived at the maillinglist, so i try it again in pure text format (i hope). Sorry, if there are unwanted duplicates. 

Since a few days i was experimenting with jails build from pkgbase (i got the idea from Michael W. Lucas Freebsd Jails book). Now there is some discussion about pkgbase again :)
So i want to share my experience, i hope this is not offtopic to this conversation and my writing style is not too offputting...
This experiments were made on an resently updated 12-stable system. Sorry, i dont have a system with head available right now.
Anyway, this is what i did:
- I first set the variable "REPODIR=/usr/repo" in /etc/make.conf, to have a nonvolatile repository (is this the right place/variable to do this?).
- then after the standard "make buildworld|installworld|buildkernel|installkernel" in /usr/src, i created the pkgbase packages with the command "make packages".
  the files are placed in "/usr/repo/FreeBSD:12:amd64/latest" where latest is a symlink to the, well latest build.
  drwxr-xr-x  2 root  wheel  805 14 Apr. 14:59 12.0.s20190414123806/
  drwxr-xr-x  2 root  wheel  805 21 Apr. 09:27 12.0.s20190419155807/
  drwxr-xr-x  2 root  wheel  805 22 Apr. 13:53 12.0.s20190422094219/
  drwxr-xr-x  2 root  wheel  805 27 Apr. 14:12 12.0.s20190427084356/
  lrwxr-xr-x  1 root  wheel   20 27 Apr. 11:04 latest@ -> 12.0.s20190427084356
- this repo is published via the file "/usr/local/etc/pkg/repos/FreeBSD-base.conf"which has this content:
root at betablock:~ # cat "/usr/local/etc/pkg/repos/FreeBSD-base.conf"
# FreeBSD base system repository
FreeBSD-base: {
  url: "file:///usr/repo/${ABI}/latest",
  mirror_type: "none",
  enabled: yes
now to the jail stuff:
- this command installs the FreeBSD-runtime and the 72 neccesary dependencies in the jails root directory /jails/test03:
root at betablock:~ # pkg --rootdir /jails/test03 -o 'ASSUME_ALWAYS_YES=true' install -r FreeBSD-base FreeBSD-runtime
- the newly created jail "test03" (an entry in /etc/jail.conf already exists) is started with the command:
root at betablock:~ # jail -vc test03
sadly the jail wont start, it exits with this message:
test03: created
test03: run command in jail: /bin/sh /etc/rc
jail: test03: getpwnam: No such file or directory
jail: test03: /bin/sh /etc/rc: failed
test03: removed
This happens, because there are no user-database files (like master.passwd, pwd.db, spwd.db) and no group files in the jails /etc/ directory. hmmm...
I saw in the pkg install output of the FreeBSD-runtime  pkg this message:
[2/72] Extracting FreeBSD-runtime-12.0.s20190414123806: 100%
pwd_mkdb: /jails/test03/etc/master.passwd: No such file or directory
so pkg tries to run the pwd_mkdb as defined in the runtime.ucl file, or embedded in the pkg file, it is viewable with this command:
root at betablock:~ # pkg info --raw --file /usr/repo/FreeBSD:12:amd64/latest/FreeBSD-runtime-12.0.s20190414123806.txz
scripts: {
    post-install: "cap_mkdb -l ${PKG_ROOTDIR}/etc/login.conf\n\tpwd_mkdb -i -p -d  ${PKG_ROOTDIR}/etc ${PKG_ROOTDIR}/etc/master.passwd\n\tservices_mkdb -l -q -o ${PKG_ROOTDIR}/var/db/services.db ${PKG_ROOTDIR}/etc/services\n\tchmod 1777 ${PKG_ROOTDIR}/tmp"
- so for a quick fix, i copied the "missing" files (master.passwd, pwd.db, spwd.db, group) from a FreeBSD base.txz package to my jails etc directory and tried to start the jail again. Read below for a "better" solution.
Now the jail starts:
root at betablock:~ # jls
     JID  IP Address      Hostname                      Path
     5   test03.local                  /jails/test03
i can "enter" it with this command:
root at betablock:~ # jexec -l test03
now to some more experiments with the jail which results in some questions (also, see below)
- trying to ping something:
root at test03:~ # ping Shared object "" not found, required by "ping"
the required library is in the file FreeBSD-libcasper-12.0.s20190414123806.txz, so lets install it:
Outside of the jail:
root at betablock:~ # pkg --rootdir /jails/test03 -o 'ASSUME_ALWAYS_YES=true' install -r FreeBSD-base FreeBSD-libcasper
and inside the jail:
root at test03:~ # ping
PING ( 56 data bytes
64 bytes from icmp_seq=0 ttl=52 time=23.398 ms
64 bytes from icmp_seq=1 ttl=52 time=23.975 ms
64 bytes from icmp_seq=2 ttl=52 time=23.252 ms
The size of this freshly installed jail:
du -h -d 1 /jails/
90M    /jails/test03
- now lets install some packages from outside of the jail:
root at betablock:~ # pkg --rootdir /jails/test03 install nginx-full
Updating FreeBSD repository catalogue...
pkg: Repository FreeBSD load error: access repo file(/jails/test03/var/db/pkg/repo-FreeBSD.sqlite) failed: No such file or directory
Fetching meta.txz: 100%    944 B   0.9kB/s    00:01
Fetching packagesite.txz: 100%    6 MiB   2.2MB/s    00:03
Processing entries: 100%
FreeBSD repository update completed. 31883 packages processed.
Updating Synth repository catalogue...
Synth repository is up to date.
Updating FreeBSD-base repository catalogue...
FreeBSD-base repository is up to date.
All repositories are up to date.
The following 146 package(s) will be affected (of 0 checked):
New packages to be INSTALLED:
        nginx-full: 1.16.0_2,2 [FreeBSD]
        apache24: 2.4.39 [FreeBSD]
        libnghttp2: 1.38.0 [FreeBSD]
        libdrizzle: 0.8_6 [FreeBSD]
        brotli: 1.0.7_1,1 [FreeBSD]
Number of packages to be installed: 146
The process will require 953 MiB more space.
232 MiB to be downloaded.
Funfact - the jailsize after this installation:
1,0G    /jails/test03
- lets enable the nginx service
root at betablock:~ # sysrc -R /jails/test03 nginx_enable=YES
nginx_enable:  -> YES
- and start it (after a jail restart, without it nginx does not find its libraries, installed above)
root at test03:~ # service nginx start
Performing sanity check on nginx configuration: Shared object "" not found, required by ""
- lets install this missing library with the command 
root at betablock:~ # pkg --rootdir /jails/test03 -o 'ASSUME_ALWAYS_YES=true' install -r FreeBSD-base FreeBSD-libexecinfo
- and lets also install vi:
root at betablock:~ # pkg --rootdir /jails/test03 -o 'ASSUME_ALWAYS_YES=true' install -r FreeBSD-base FreeBSD-vi
- so lets try again (after creating the missing config files nginx.conf and mime.types):
root at betablock:~ # jexec -l test03 service nginx start
Starting nginx.
nginx: [emerg] gethostbyname() failed in /usr/local/etc/nginx/nginx.conf:122
- and the check:
root at betablock:~ # jexec -l test03 service nginx status
nginx is running as pid 41359.
(Browser access works too...)
- Now Lets work with packages within the jail:
root at test03:~ # pkg update
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+, please wait...
pkg: Error loading revoked certificates
- Hm, this is because the directory "/usr/share/keys/pkg/revoked/" is missing, lets create it:
root at test03:~ # mkdir /usr/share/keys/pkg/revoked/
- and now:
root at test03:~ # pkg update
The package management tool is not yet installed on your system.
Do you want to fetch and install it now? [y/N]: y
Bootstrapping pkg from pkg+[], please wait...
Verifying signature with trusted certificate done
[test03.local] Installing pkg-1.10.5_5...
[test03.local] Extracting pkg-1.10.5_5: 100%
Updating FreeBSD repository catalogue...
FreeBSD repository is up to date.
All repositories are up to date.
root at test03:~ # pkg info
FreeBSD-casper-12.0.s20190414123806 casper package
FreeBSD-clibs-12.0.s20190414123806 Core C Libraries
FreeBSD-jail-12.0.s20190414123806 Jail Utilities
FreeBSD-lib-12.0.s20190414123806 lib package
FreeBSD-lib80211-12.0.s20190414123806 lib80211 package
x265-3.0                       H.265/High Efficiency Video Coding (HEVC) format
xorg-fonts-truetype-7.7_1      X.Org TrueType fonts
xorgproto-2018.4               xorg protocol headers
xvid-1.3.5,1                   Opensource MPEG-4 codec, based on OpenDivx
yajl-2.1.0                     Portable JSON parsing and serialization library in ANSI C
Btw. The missing "revoked" directory problem shoud be fixed with[]
So this is a basic jail installation with pkgbase, now to some further experiments and resulting questions:
- i looked into why the userdatabase was missing in the newly created jail. Well, it is, because the files are not included in the default Freebsd-runtime package.
  To check if it would work, i built my own Freebsd-runtime package with these files added. to do this, i copied the runtime.plist file from the $WSTAGEDIR and modified it.
  - first i removed a lot of duplicated directory entries like
  @dir(root,wheel,0755,) /boot
  @dir(root,wheel,0755,) /boot
  @dir(root,wheel,0755,) /boot
  @dir(root,wheel,0755,) /boot
  ... (and many more)
  - then i added the "missing" files and directory
  @config(root,wheel,0600,) /etc/master.passwd
  @config(root,wheel,0644,) /etc/group
  @dir(root,wheel,0755,) /usr/share/keys/pkg/revoked
  - after that i rebuild the Freebsd-runtime package with these changes (found in /usr/src/Makefile.inc1):
  root at betablock:~ # pkg -o ABI_FILE=/usr/obj/usr/src/amd64.amd64/worldstage/usr/bin/uname -o ALLOW_BASE_SHLIBS=yes create -M /usr/obj/usr/src/amd64.amd64/worldstage/runtime.ucl -p /root/pkgs/runtime.plist -r /usr/obj/usr/src/amd64.amd64/worldstage --output-dir /usr/repo/FreeBSD:12:amd64/latest
  and rebuilding the repo metadata with:
  root at betablock:~ # pkg repo /usr/repo/FreeBSD:12:amd64/latest
  a jail created with this Freebsd-runtime starts directly, without the steps mentioned above.
  My Question: Is the ommission of these files intentional? 
  - one last experiment: i deleted the manpages, the examples, and the /boot directory (i guessed a jail has no need for it), the jail build from this file is 75M, the installation of packages like nginx works like in the original file.
  - should the FreeBSD-libcasper package be installed as a dependency of the FreeBSD-casper package?
  - i did not observe more missing libraries like libcasper above, but depending on the tasks that are executed or packages that are installed, there might be more that are missing.

So that was my pkgbase-jail experiment, it was fun and i learned some things about pkgbase. Any comments, tips, tricks and (mild) critique are welcome.

More information about the freebsd-stable mailing list