view docs/man/man8/ftjail.rst @ 649:4ee9a8042f4a

common.subr: _get_jail_from_path() now just returns when the jail is dying. But it prints the name of the jail if it is yet dying. Real error reporting must not consistently be done in the caller.
author Franz Glasner <fzglas.hg@dom66.de>
date Fri, 27 Sep 2024 21:21:34 +0200
parents c65a79d84e9e
children 260a81d769a6
line wrap: on
line source

.. -*- coding: utf-8; indent-tabs-mode: nil; -*-

ftjail
======

Synopsis
--------

**ftjail -hV**

**ftjail subcommand**


Description
-----------

Management tool for Thin Jails: creation of base and skeleton datasets,
mount and population helpers.

The following global options are implemented:

.. program:: ftjail

.. option:: -h

   Print a short usage message to stdout and exit.

.. option:: -V

   Print the program name and version number to stdout and exit.


Subcommands
-----------

:manpage:`ftjail-build-etcupdate-current-tmpl(8)`

    Build a "current" tree suitable for the default and extract mode
    of \"etcupdate\"

:manpage:`ftjail-copy-skel(8)`

    Recursively copy template skeleton contents into jail-specific datasets

:manpage:`ftjail-datasets-tmpl(8)`

    Create ZFS template datasets for new Thin Jails using base and skeleton

:manpage:`ftjail-freebsd-update(8)`

    A :manpage:`freebsd-update(8)` implementation for Thin Jails

:manpage:`ftjail-mount-tmpl(8)`

    Canonically mount the RO base and the RW skeleton of a Thin Jail

:manpage:`ftjail-umount-tmpl(8)`

    Unmount mounted Thin Jail template datasets

:manpage:`ftjail-interlink-tmpl(8)`

    Create proper symlinks for "skeleton" style Thin Jails

:manpage:`ftjail-populate-tmpl(8)`

    Populate a prepared directory structure with the contents of a
    FreeBSD base system

:manpage:`ftjail-snapshot-tmpl(8)`

    Recursively create ZFS snapshots of the RO base datasets and the RW
    skeleton datasets


Implementation Notes
--------------------

All commands with the exception of :command:`ftjail populate-tmpl` and
:command:`ftjail interlink-tmpl` require ZFS as filesystem.


Environment
-----------

All environment variables that affect :command:`zfs` are effective also.


Examples
--------

Prepare the containers for the template datasets
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Container for templates::

   zfs create -o canmount=off -o mountpoint=/jail/ttmpl zpool/jail/ttmpl

Sub-container for all read-only bases::

  zfs create -o canmount=off zpool/jail/ttmpl/base-ro

Sub-container for all read-write volumes::

   zfs create -o canmount=off zpool/jail/ttmpl/skel-rw


Create a new complete template for a FreeBSD distribution
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Create new template datasets and populate them from a distribution archive.
The example is for FreeBSD 13.3-RELEASE::

  # prepare empty datasets
  ftjail datasets-tmpl -P zpool/jail/ttmpl/base-ro zpool/jail/ttmpl/skel-rw 13.3-RELEASE

  #
  # Here you can adjust some properties (``canmount``) or create some additional
  # datasets manually.
  #

  # mount at a temporary mountpoint
  mkdir /var/tmp/13.3
  ftjail mount-tmpl -P zpool/jail/ttmpl/base-ro/13.3-RELEASE zpool/jail/ttmpl/skel-rw/13.3-RELEASE /var/tmp/13.3

  # populate the contents from the distribution archive
  ftjail populate-tmpl -P /var/tmp/13.3 base-13.3-RELEASE.txz

  # If the kernel is wanted also then extract it like this
  ftjail populate-tmpl -P -b /var/tmp/13.3 base-13.3-RELEASE.txt kernel-13.3-RELEASE.txz

Make a named snapshot named "base" for the original::

  ftjail snapshot-tmpl zpool/jail/ttmpl/base-ro/13.3-RELEASE zpool/jail/ttmpl/skel-rw/13.3-RELEASE base

Also prepare the :command:`etcupdate`::

  ftjail build-etcupdate-current-tmpl /var/tmp/13.3 etcupdate-current-13.3@base.tbz

Update to the current patch level and tag accordingly (e.g. "p5")::

  # Update
  freebsd-update -b /var/tmp/13.3 -d /var/tmp/13.3/var/db/freebsd-update/ --currently-running 13.3-RELEASE fetch
  freebsd-update -b /var/tmp/13.3 -d /var/tmp/13.3/var/db/freebsd-update/ --currently-running 13.3-RELEASE install

  # Snapshot
  ftjail snapshot-tmpl zpool/jail/ttmpl/base-ro/13.3-RELEASE zpool/jail/ttmpl/skel-rw/13.3-RELEASE p5

  # Do not forget to prepare for etcupdate
  ftjail build-etcupdate-current-tmpl /var/tmp/13.3 etcupdate-current-13.3@p5.tbz

Unmount::

  ftjail umount-tmpl zpool/jail/ttmpl/base-ro/13.3-RELEASE zpool/jail/ttmpl/skel-rw/13.3-RELEASE


Container and Common Location for instantiated Thin Jails
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

All thin jails are located at :file:`/jail/TROOT`::

  zfs create -o mountpoint=/jail/TROOT zpool/jail/TROOT

Create the variable datasets (read-write) with the same mountpoint as above::

  zfs create -o canmount=off -o mountpoint=/jail/TROOT zpool/jail/TVAR


Creation of a real Thin Jail
~~~~~~~~~~~~~~~~~~~~~~~~~~~~

Clone the read-only root filesystem base::

  zfs clone -o readonly=on zpool/jail/ttmpl/base-ro/13.3-RELEASE@p5 zpool/jail/TROOT/build13

If you want some additional directory (e.g. for :file:`/srv` et al.) do this
instead::

  zfs clone -o readonly=off zpool/jail/ttmpl/base-ro/13.3-RELEASE@p5 zpool/jail/TROOT/build13
  # change before making it read-only
  mkdir /jail/TROOT/build13/srv
  zfs set readonly=on zpool/jail/TROOT/build13

Copy -- not clone -- the variable parts::

  ftjail copy-skel -P  zpool/jail/ttmpl/skel-rw/13.3-RELEASE p5 zpool/jail/TVAR/build13

Configure some important parts (as in "normal" jails)::

  mount -t devfs devfs /jail/TROOT/build13/dev
  fjail configure /jail/TROOT/build13
  umount /jail/TROOT/build13/dev