mirror of
https://github.com/BastilleBSD/bastille.git
synced 2025-12-11 09:29:55 +01:00
doc: reformat and reflow documentation for consistent 80-column text
This commit is contained in:
@@ -1,20 +1,21 @@
|
||||
Centralized Assets
|
||||
==================
|
||||
|
||||
Sometimes it is preferable to share applications, libraries, packages or even directories
|
||||
and files across multiple jails.
|
||||
Sometimes it is preferable to share applications, libraries, packages or even
|
||||
directories and files across multiple jails.
|
||||
|
||||
Or perhaps we just want to avoid all the time it takes to create a jail, and manully configure
|
||||
it with the packages we normally use.
|
||||
Or perhaps we just want to avoid all the time it takes to create a jail, and
|
||||
manually configure it with the packages we normally use.
|
||||
|
||||
Bastille offers a number of ways to do the above.
|
||||
|
||||
Templates
|
||||
---------
|
||||
|
||||
A template is a predefined file containing instructions to execute on a targeted jail. This
|
||||
is one of the easiest ways to create a repeatable environment for your Bastille jails. Simply
|
||||
create your template, the execute it on as many jails as you prefer.
|
||||
A template is a predefined file containing instructions to execute on a targeted
|
||||
jail. This is one of the easiest ways to create a repeatable environment for your
|
||||
Bastille jails. Simply create your template, the execute it on as many jails as
|
||||
you prefer.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -25,12 +26,12 @@ See the chapter on templates for details on how to create your own templates.
|
||||
Mounting
|
||||
--------
|
||||
|
||||
On of the fastest ways to share directories and files across multiple jails is with
|
||||
the ``bastille mount`` command.
|
||||
On of the fastest ways to share directories and files across multiple jails is
|
||||
with the ``bastille mount`` command.
|
||||
|
||||
The following command will mount ``/my/host/directory`` into ``jail1`` and ``jail2``
|
||||
at ``/my/jail/directory`` with read and write access. To mount with read only access,
|
||||
simply use ``ro`` instead of ``rw`` as the option.
|
||||
at ``/my/jail/directory`` with read and write access. To mount with read only
|
||||
access, simply use ``ro`` instead of ``rw`` as the option.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -39,8 +40,8 @@ simply use ``ro`` instead of ``rw`` as the option.
|
||||
Cloning
|
||||
-------
|
||||
|
||||
Bastille allows you to create a full duplicate of your jail using ``bastille clone``. To clone
|
||||
your jail, use the following command.
|
||||
Bastille allows you to create duplicate of your jail using ``bastille clone``.
|
||||
To clone your jail, use the following command.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -51,29 +52,30 @@ This will create an exact duplicate of ``myjail`` at ``mynewjail``.
|
||||
Custom Releases
|
||||
---------------
|
||||
|
||||
Bastille allows creating custom releases from jails, then using those releases to create
|
||||
more jails.
|
||||
Bastille allows creating custom releases from jails, then using those releases to
|
||||
create more jails.
|
||||
|
||||
To start, we must first create our jail. Make sure it is a thick jail, as this process will
|
||||
not work with any other jail types.
|
||||
To start, we must first create our jail. Make sure it is a thick jail, as this
|
||||
process will not work with any other jail types.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
ishmael ~ # bastille create -T myjail 14.2-RELEASE 10.0.0.1
|
||||
|
||||
Once the jail is up and running, configure it to your liking, then run the following commmand
|
||||
to create a custom release based on your jail.
|
||||
Once the jail is up and running, configure it to your liking, then run the
|
||||
following commmand to create a custom release based on your jail.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
ishmael ~ # bastille convert myjail myrelease
|
||||
|
||||
Once this process completes, you will be able to run the following command to create a jail
|
||||
based off your newly created release.
|
||||
Once this process completes, you will be able to run the following command to
|
||||
create a jail based off your newly created release.
|
||||
|
||||
Please note that using this approach is experimental. It will be up to the end user to keep
|
||||
track of which official FreeBSD release their custom release is based on. The ``osrelease``
|
||||
config variable will be set to your custom release name inside the ``jail.conf`` file.
|
||||
Please note that using this approach is experimental. It will be up to the end
|
||||
user to keep track of which official FreeBSD release their custom release is
|
||||
based on. The ``osrelease`` config variable will be set to your custom release
|
||||
name inside the ``jail.conf`` file.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
|
||||
@@ -112,11 +112,13 @@ as a list of popular managers and their status on each option.
|
||||
| Support | | | | | |
|
||||
+--------------+-------------+--------------+-----------+-----------+-----------+
|
||||
|
||||
We do our best to stay true and honest as to what other jail managers do and don't do.
|
||||
We do our best to stay true and honest as to what other jail managers do and
|
||||
don't do.
|
||||
If you see an error, you can open a PR on the BastillBSD github repo.
|
||||
|
||||
We also realize that each jail manger does certain things better than other, and perhaps
|
||||
certain things worse. Some do this, others do that. They are all different, and each user
|
||||
should choose the one they want to use based on their needs.
|
||||
We also realize that each jail manger does certain things better than other, and
|
||||
perhaps certain things worse. Some do this, others do that. They are all
|
||||
different, and each user should choose the one they want to use based on their
|
||||
needs.
|
||||
|
||||
Thanks for using BastilleBSD!
|
||||
|
||||
@@ -12,10 +12,11 @@ will attempt to configure the networking, storage, and firewall on your system
|
||||
for use with Bastille.
|
||||
|
||||
By default the setup command will configure a loopback interface, storage (ZFS if
|
||||
enabled, otherwise UFS) and the pf firewall if you run it as below without any options.
|
||||
enabled, otherwise UFS) and the pf firewall if you run it as below without any
|
||||
options.
|
||||
|
||||
Alternatively, you can run the ``setup`` command with any of the supported options to
|
||||
configure the selected option by itself.
|
||||
Alternatively, you can run the ``setup`` command with any of the supported
|
||||
options to configure the selected option by itself.
|
||||
|
||||
To see a list of available options and switches, see the ``setup`` subcommand.
|
||||
|
||||
@@ -103,7 +104,8 @@ Linux Jail
|
||||
^^^^^^^^^^
|
||||
|
||||
Linux jails are still considered experimental, but they seem to work. First we
|
||||
must bootstrap a linux distro (Linux distros are bootstrapped with the Debian tool debootstrap).
|
||||
must bootstrap a linux distro (Linux distros are bootstrapped with the Debian
|
||||
tool debootstrap).
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
|
||||
@@ -1,33 +1,39 @@
|
||||
Jail Startup Configuration
|
||||
==========================
|
||||
|
||||
Bastille can start jails on system startup, and stop them on system shutdown. To enable this functionality, we
|
||||
must first enable Bastille as a service using ``sysrc bastille_enable=YES``. Once you reboot your host, all jails
|
||||
with ``boot=on`` will be started when the host boots.
|
||||
Bastille can start jails on system startup, and stop them on system shutdown.
|
||||
To enable this functionality, we must first enable Bastille as a service using
|
||||
``sysrc bastille_enable=YES``. Once you reboot your host, all jails with
|
||||
``boot=on`` will be started when the host boots.
|
||||
|
||||
If you have certain jails that must be started before other jails, you can use the priority option. Jails will start
|
||||
in order starting at the lowest value, and will stop in order starting at the highest value. So, jails with a priority
|
||||
value of 1 will start first, and stop last.
|
||||
If you have certain jails that must be started before other jails, you can use
|
||||
the priority option. Jails will start in order starting at the lowest value, and
|
||||
will stop in order starting at the highest value. So, jails with a priority value
|
||||
of 1 will start first, and stop last.
|
||||
|
||||
See the chapter on targeting for more info.
|
||||
|
||||
Boot
|
||||
----
|
||||
|
||||
The boot setting controls whether a jail will be started on system startup. If you have enabled bastille
|
||||
with ``sysrc bastille_enable=YES``, all jails with ``boot=on`` will start on system startup. Any jail(s)
|
||||
with ``boot=off`` will not be started on system startup.
|
||||
The boot setting controls whether a jail will be started on system startup. If
|
||||
you have enabled bastille with ``sysrc bastille_enable=YES``, all jails with
|
||||
``boot=on`` will start on system startup. Any jail(s) with ``boot=off`` will not
|
||||
be started on system startup.
|
||||
|
||||
By default, when jails are created with Bastille, the boot setting is set to ``on`` by default. This can be overridden using
|
||||
the ``--no-boot`` flag. See ``bastille create --no-boot TARGET...``.
|
||||
By default, when jails are created with Bastille, the boot setting is set to ``on``
|
||||
by default. This can be overridden using the ``--no-boot`` flag.
|
||||
See ``bastille create --no-boot TARGET...``.
|
||||
|
||||
You can also use ``bastille start --boot TARGET`` to make Bastille respect the boot setting. If ``-b|--boot`` is not
|
||||
used, the targeted jail(s) will start, regardless of the boot setting.
|
||||
You can also use ``bastille start --boot TARGET`` to make Bastille respect the
|
||||
boot setting. If ``-b|--boot`` is not used, the targeted jail(s) will start,
|
||||
regardless of the boot setting.
|
||||
|
||||
Jails will still shut down on system shutdown, regardless of this setting.
|
||||
|
||||
The ``-b|--boot`` can also be used with the ``stop`` command. Any jails with ``boot=off`` will
|
||||
not be touched if ``stop`` is called with ``-b|--boot``. Same goes for the ``restart`` command.
|
||||
The ``-b|--boot`` can also be used with the ``stop`` command. Any jails with
|
||||
``boot=off`` will not be touched if ``stop`` is called with ``-b|--boot``. Same
|
||||
goes for the ``restart`` command.
|
||||
|
||||
This value can be changed using ``bastille config TARGET set boot [on|off]``.
|
||||
|
||||
@@ -36,39 +42,49 @@ This value will be shown using ``bastille list all``.
|
||||
Depend
|
||||
------
|
||||
|
||||
Bastille supports configuring jails to depend on each other when started and stopped. If jail1 "depends" on jail2, then
|
||||
jail2 will be started if it is not running when ``bastille start jail1`` is called. Any jail that jail1 "depends" on will
|
||||
first be verified running (started if stopped) before jail1 is started.
|
||||
Bastille supports configuring jails to depend on each other when started and
|
||||
stopped. If jail1 "depends" on jail2, then jail2 will be started if it is not
|
||||
running when ``bastille start jail1`` is called. Any jail that jail1 "depends"
|
||||
on will first be verified running (started if stopped) before jail1 is started.
|
||||
|
||||
For example, I have 3 jails called nginx, mariadb and nextcloud. I want to ensure that nginx and mariadb are running before
|
||||
nextcloud is started.
|
||||
For example, I have 3 jails called nginx, mariadb and nextcloud. I want to
|
||||
ensure that nginx and mariadb are running before nextcloud is started.
|
||||
|
||||
First we must add both jails to nextcloud's depend property with ``bastille config nextcloud set depend "mariadb nginx"``.
|
||||
Then, when we start nextcloud with ``bastille start nextcloud`` it will verify that nginx and mariadb are running (start if stopped) before
|
||||
starting nextcloud.
|
||||
First we must add both jails to nextcloud's depend property with
|
||||
``bastille config nextcloud set depend "mariadb nginx"``.
|
||||
Then, when we start nextcloud with ``bastille start nextcloud`` it will verify
|
||||
that nginx and mariadb are running (start if stopped) before starting nextcloud.
|
||||
|
||||
When stopping a jail, any jail that "depends" on it will first be stopped. For example, if we run ``bastille stop nginx``, then
|
||||
nextcloud will first be stopped because it "depends" on nginx.
|
||||
When stopping a jail, any jail that "depends" on it will first be stopped.
|
||||
For example, if we run ``bastille stop nginx``, then nextcloud will first be
|
||||
stopped because it "depends" on nginx.
|
||||
|
||||
Note that if we do a ``bastille restart nginx``, however, nextcloud will be stopped, because it "depends" on nginx, but will not be started again, because the jail we just restarted, nginx, does not depend on nextcloud.
|
||||
Note that if we do a ``bastille restart nginx``, however, nextcloud will be
|
||||
stopped, because it "depends" on nginx, but will not be started again, because
|
||||
the jail we just restarted, nginx, does not depend on nextcloud.
|
||||
|
||||
Parallel Startup
|
||||
----------------
|
||||
|
||||
Bastille supports starting, stopping and restarting jails in parallel mode using the ``rc`` service script. To enable this functionality, set
|
||||
Bastille supports starting, stopping and restarting jails in parallel mode using
|
||||
the ``rc`` service script. To enable this functionality, set
|
||||
``bastille_parallel_limit`` to a numeric value.
|
||||
|
||||
For example, if you run ``sysrc bastille_parallel_limit=4``, then Bastille will start 4
|
||||
jails at a time on system startup, as well as stop or restart 4 jails at a time when ``service bastille...`` is called.
|
||||
For example, if you run ``sysrc bastille_parallel_limit=4``, then Bastille will
|
||||
start 4 jails at a time on system startup, as well as stop or restart 4 jails at
|
||||
a time when ``service bastille...`` is called.
|
||||
|
||||
This value is set to 1 by default, to only start/stop/restart jails one at a time.
|
||||
|
||||
Startup Delay
|
||||
-------------
|
||||
|
||||
Sometimes it is necessary to let a jail start fully before continuing to the next jail.
|
||||
Sometimes it is necessary to let a jail start fully before continuing to the
|
||||
next jail.
|
||||
|
||||
We can do this with another sysrc value called ``bastille_startup_delay``. Setting ``bastille_startup_delay=5`` will
|
||||
tell Bastille to wait 5 seconds between starting each jail.
|
||||
We can do this with another sysrc value called ``bastille_startup_delay``.
|
||||
Setting ``bastille_startup_delay=5`` will tell Bastille to wait 5 seconds between
|
||||
starting each jail.
|
||||
|
||||
You can also use ``bastille start -d|--delay 5 all`` or ``bastille restart -d|--delay 5 all`` to achieve the same thing.
|
||||
You can also use ``bastille start -d|--delay 5 all`` or
|
||||
``bastille restart -d|--delay 5 all`` to achieve the same thing.
|
||||
|
||||
@@ -9,54 +9,61 @@ Bastille supports migrations to a remote system using the ``migrate`` subcommand
|
||||
Prerequisites
|
||||
^^^^^^^^^^^^^
|
||||
|
||||
There are a couple of things that need to be in place before running the ``migrate`` command.
|
||||
There are a couple of things that need to be in place before running the
|
||||
``migrate`` command.
|
||||
|
||||
First, you must have bastille configured both locally and remotely to use the same filesystem
|
||||
configuration. ZFS on both, or UFS on both.
|
||||
First, you must have bastille configured both locally and remotely to use the
|
||||
same filesystem configuration. ZFS on both, or UFS on both.
|
||||
|
||||
Second, you must create a user on the remote system that will be used to migrate the jail. The user
|
||||
must be able to log in via SSH using either key-based authentication, or password based authentication.
|
||||
The user also needs ``sudo`` permissions on the remote system. This user should then be given as the
|
||||
``USER`` arg in the ``migrate`` command.
|
||||
Second, you must create a user on the remote system that will be used to migrate
|
||||
the jail. The user must be able to log in via SSH using either key-based
|
||||
authentication, or password based authentication.
|
||||
The user also needs ``sudo`` permissions on the remote system. This user should
|
||||
then be given as the ``USER`` arg in the ``migrate`` command.
|
||||
|
||||
If you don't want to use ``sudo``, we support using ``doas`` as the super-user command. Simply set ``--doas`` as
|
||||
one of the options when running the ``migrate`` command.
|
||||
If you don't want to use ``sudo``, we support using ``doas`` as the super-user
|
||||
command. Simply set ``--doas`` as one of the options when running the ``migrate`` command.
|
||||
|
||||
If you are using key-based auth, the keys should be stored in the default location at ``$HOME/.ssh/id_rsa``,
|
||||
where ``$HOME`` is the users home directory. This is the default location for ssh keys, and where Bastille
|
||||
will try to load them from.
|
||||
If you are using key-based auth, the keys should be stored in the default
|
||||
location at ``$HOME/.ssh/id_rsa``, where ``$HOME`` is the users home directory.
|
||||
This is the default location for ssh keys, and where Bastille will try to load
|
||||
them from.
|
||||
|
||||
If you want to use password based authentication, simply run ``bastille migrate -p TARGET USER@HOST``. This
|
||||
will prompt you to enter the password for the remote system, which Bastille will then use during the migration
|
||||
If you want to use password based authentication, simply run
|
||||
``bastille migrate -p TARGET USER@HOST``. This will prompt you to enter the
|
||||
password for the remote system, which Bastille will then use during the migration
|
||||
process.
|
||||
|
||||
Migration
|
||||
^^^^^^^^^
|
||||
|
||||
To migrate a jail (or multiple jails) we can simply run
|
||||
``bastille migrate TARGET USER@HOST``. This will export the jail(s), send them to the
|
||||
remote system, and import them.
|
||||
``bastille migrate TARGET USER@HOST``. This will export the jail(s), send them
|
||||
to the remote system, and import them.
|
||||
|
||||
The ``migrate`` sub-command includes the ``-a|--auto`` option, which will auto-stop the old jail,
|
||||
migrate it, and attempt to start the migrated jail on the remote system after importing it. See the
|
||||
warning below about auto-starting the migrated jail.
|
||||
The ``migrate`` sub-command includes the ``-a|--auto`` option, which will
|
||||
auto-stop the old jail, migrate it, and attempt to start the migrated jail on
|
||||
the remote system after importing it. See the warning below about auto-starting
|
||||
the migrated jail.
|
||||
|
||||
WARNING: Every system is unique, has different interfaces, bridges, and network configurations.
|
||||
It is possible, with the right configuration, for jails to start and work normally. But for some
|
||||
systems, it will be necessary to edit the ``jail.conf`` file of the migrated jail to get it working
|
||||
properly.
|
||||
WARNING: Every system is unique, has different interfaces, bridges, and network
|
||||
configurations. It is possible, with the right configuration, for jails to start
|
||||
and work normally. But for some systems, it will be necessary to edit the
|
||||
``jail.conf`` file of the migrated jail to get it working properly.
|
||||
|
||||
Using ``-l|--live`` mode (ZFS only) will leave the local jail running, and the remote jail stopped.
|
||||
Using ``-l|--live`` mode (ZFS only) will leave the local jail running, and the
|
||||
remote jail stopped.
|
||||
|
||||
Using ``-a|--auto`` mode will stop the local jail, and start the remote jail.
|
||||
|
||||
Using the ``-l|--live`` and ``-a|--auto`` options together will migrate the jail while it is running,
|
||||
then stop the local jail, and start the remote jail.
|
||||
Using the ``-l|--live`` and ``-a|--auto`` options together will migrate the jail
|
||||
while it is running, then stop the local jail, and start the remote jail.
|
||||
|
||||
You can optionally set ``-d|--destroy`` to have Bastille destroy the old jail on completion.
|
||||
You can optionally set ``-d|--destroy`` to have Bastille destroy the old jail on
|
||||
completion.
|
||||
|
||||
You can also set ``-b|--backup`` to retain the archives remotely. They will be copied into
|
||||
``${bastille_backupsdir}``.
|
||||
You can also set ``-b|--backup`` to retain the archives remotely. They will be
|
||||
copied into ``${bastille_backupsdir}``.
|
||||
|
||||
iocage
|
||||
------
|
||||
@@ -89,7 +96,7 @@ Import the iocage backup file (use zip file name)
|
||||
bastille import jailname_$(date +%F).zip
|
||||
|
||||
Bastille will attempt to configure your interface and IP from the
|
||||
``config.json`` file, but if you have issues you can configure it manully.
|
||||
``config.json`` file, but if you have issues you can configure it manually.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
|
||||
@@ -13,10 +13,10 @@ different types of jail network configurations.
|
||||
whatever your interface is called. This will be used for the host/jail epairs.
|
||||
Bastille will create/destroy these epairs as the jail is started/stopped.
|
||||
|
||||
* Bridged VNET mode: For bridged VNET jails (``-B``) you must manually create a bridge
|
||||
interface to attach your jail to. Bastille will then create and attach the
|
||||
host/jail epairs to this interface when the jail starts, and remove them when
|
||||
it stops.
|
||||
* Bridged VNET mode: For bridged VNET jails (``-B``) you must manually create a
|
||||
bridge interface to attach your jail to. Bastille will then create and attach
|
||||
the host/jail epairs to this interface when the jail starts, and remove them\
|
||||
when it stops.
|
||||
|
||||
* Alias mode: For classic/standard jails that use an IP that is accessible
|
||||
within your local subnet (alias mode) Bastille will add the IP to the
|
||||
@@ -24,10 +24,10 @@ different types of jail network configurations.
|
||||
|
||||
* NAT mode: For classic/standard jails that use an IP not reachable in your local
|
||||
subnet, Bastille will add the IP to the specified interface as an alias, and
|
||||
additionally, add it to the pf firewall table (if available) to allow the jail outbound
|
||||
access. If you do not specify an interface, Bastille will assume you have run
|
||||
the ``bastille setup`` command and will attempt to use ``bastille0`` (which
|
||||
is created using the setup command) as its interface. If you have not run
|
||||
additionally, add it to the pf firewall table (if available) to allow the jail
|
||||
outbound access. If you do not specify an interface, Bastille will assume you
|
||||
have run the ``bastille setup`` command and will attempt to use ``bastille0``
|
||||
(which is created using the setup command) as its interface. If you have not run
|
||||
``bastille setup`` and do not specify an interface, Bastille will error.
|
||||
|
||||
* Inherit mode: For classic/standard jails that are set to ``inherit`` or
|
||||
@@ -38,9 +38,9 @@ different types of jail network configurations.
|
||||
bastille will simply set ``ip4`` to ``ip_hostname`` inside the jail config.
|
||||
The jail will then function according the jail(8) documentation.
|
||||
|
||||
You cannot use ``-V|--vnet`` with any interface that is already a member of another
|
||||
bridge. For example, if you create a bridge, and assign ``vtnet0`` as a member, you
|
||||
will not be able to use ``vtnet0`` with ``-V|--vnet``.
|
||||
You cannot use ``-V|--vnet`` with any interface that is already a member of
|
||||
another bridge. For example, if you create a bridge, and assign ``vtnet0`` as a
|
||||
member, you will not be able to use ``vtnet0`` with ``-V|--vnet``.
|
||||
|
||||
IP Address Options
|
||||
------------------
|
||||
@@ -95,8 +95,9 @@ For the ``inherit`` and ``ip_hostname`` options, you can also specify
|
||||
Shared Interface
|
||||
----------------
|
||||
|
||||
This scenario works best when you have just one computer, or a home or small office network
|
||||
that is separated from the rest of the internet by a router. So you are free to use
|
||||
This scenario works best when you have just one computer, or a home or small
|
||||
office network that is separated from the rest of the internet by a router. So
|
||||
you are free to use
|
||||
`private IP addresses
|
||||
<https://www.lifewire.com/what-is-a-private-ip-address-2625970>`_.
|
||||
|
||||
@@ -118,9 +119,10 @@ reach services at that address.
|
||||
This method is the simplest. All you need to know is the name of your network
|
||||
interface and a free IP on your local network.
|
||||
|
||||
We can also run ``bastille setup shared`` to configure our primary interface as a default
|
||||
interface for Bastille to use. Once we have run the command and chosen our interface, it will
|
||||
not be necessary to specify an interface in our create command.
|
||||
We can also run ``bastille setup shared`` to configure our primary interface as
|
||||
a default interface for Bastille to use. Once we have run the command and chosen
|
||||
our interface, it will not be necessary to specify an interface in our create
|
||||
command.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -128,8 +130,8 @@ not be necessary to specify an interface in our create command.
|
||||
|
||||
This will automatically use the interface we selected during the setup command.
|
||||
|
||||
Note that we cannot use the ``shared`` option together with the ``loopback`` option. Configuring
|
||||
one using the ``bastille setup`` command will disable the other.
|
||||
Note that we cannot use the ``shared`` option together with the ``loopback``
|
||||
option. Configuring one using the ``bastille setup`` command will disable the other.
|
||||
|
||||
Shared Interface on IPV6 network (vultr.com)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -259,8 +261,8 @@ bridge, use the ``-B`` option, an IP/netmask and external bridge.
|
||||
|
||||
bastille create -B azkaban 13.2-RELEASE 192.168.1.50/24 bridge0
|
||||
|
||||
Bastille will automagically create the needed interface(s), attach it to the specified
|
||||
bridge and connect/disconnect containers as they are started and stopped.
|
||||
Bastille will automagically create the needed interface(s), attach it to the
|
||||
specified bridge and connect/disconnect containers as they are started and stopped.
|
||||
The bridge needs to be created/enabled before creating and starting the jail.
|
||||
|
||||
Below are the steps to creating a bridge for this purpose.
|
||||
@@ -309,21 +311,23 @@ on your system is.
|
||||
VLAN Configuration
|
||||
------------------
|
||||
|
||||
Bastille supports VLANs to some extent when creating jails. When creating a jail, use
|
||||
the ``--vlan ID`` options to specify a VLAN ID for your jail. This will set the proper
|
||||
variables inside the jails `rc.conf` to add the jail to the specified VLAN. When using this method,
|
||||
the interface being assigned must carry tagged VLAN packets, e.g. you can bridge a VLAN trunk to
|
||||
the jail and in the jail you then can access all VLANs. But be careful: This may have
|
||||
security implications.
|
||||
Bastille supports VLANs to some extent when creating jails. When creating a jail,
|
||||
use the ``--vlan ID`` options to specify a VLAN ID for your jail. This will set
|
||||
the proper variables inside the jails `rc.conf` to add the jail to the specified
|
||||
VLAN. When using this method, the interface being assigned must carry tagged VLAN
|
||||
packets, e.g. you can bridge a VLAN trunk to the jail and in the jail you then can
|
||||
access all VLANs. But be careful: This may have security implications.
|
||||
|
||||
You cannot use the ``-V|--vnet`` options with interfaces that have dots (.) in the name, which is the
|
||||
standard way of naming a VLAN interface. This is due to the limitations
|
||||
of the JIB script that Bastille uses to manage VNET jails.
|
||||
You cannot use the ``-V|--vnet`` options with interfaces that have dots (.) in the
|
||||
name, which is the standard way of naming a VLAN interface. This is due to the
|
||||
limitations of the JIB script that Bastille uses to manage VNET jails.
|
||||
|
||||
You can however use ``-B|--bridge`` with VLAN interfaces (even with dots in the name).
|
||||
Using this method you create bridge interfaces in ``rc.conf`` and only add VLANs that are needed
|
||||
for the jail. The jail only has access to these VLANs and not to the whole trunk.
|
||||
Below is an ``rc.conf`` snippet that was provided by a user who has such a configuration.
|
||||
You can however use ``-B|--bridge`` with VLAN interfaces (even with dots in the
|
||||
name). Using this method you create bridge interfaces in ``rc.conf`` and only
|
||||
add VLANs that are needed for the jail. The jail only has access to these VLANs
|
||||
and not to the whole trunk.
|
||||
Below is an ``rc.conf`` snippet that was provided by a user who has such a
|
||||
configuration.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -397,11 +401,13 @@ To enable netgraph, run `bastille setup netgraph`. This will load and persist th
|
||||
required kernel modules. Once netgraph is configured, any VNET jails
|
||||
you create will be managed with netgraph.
|
||||
|
||||
Note that you should only enable netgraph on a new system. Bastille is set up to use either
|
||||
`netgraph` or `if_bridge` as the VNET management, and uses `if_bridge` as the default, as it
|
||||
always has. The `netgraph` option is new, and should only be used with new systems.
|
||||
Note that you should only enable netgraph on a new system. Bastille is set up to
|
||||
use either `netgraph` or `if_bridge` as the VNET management, and uses `if_bridge`
|
||||
as the default, as it always has. The `netgraph` option is new, and should only
|
||||
be used with new systems.
|
||||
|
||||
This value is set with the `bastille_network_vnet_type` option inside the config file.
|
||||
This value is set with the `bastille_network_vnet_type` option inside the config
|
||||
file.
|
||||
|
||||
loopback (bastille0)
|
||||
^^^^^^^^^^^^^^^^^^^^
|
||||
@@ -423,9 +429,9 @@ traffic out of containers and can selectively redirect traffic into containers
|
||||
based on connection ports (ie; 80, 443, etc.)
|
||||
|
||||
To set up the loopback address automatically, we can simply run ``bastille setup``.
|
||||
This will configure the storage, pf firewall, and loopback addresses for us. To set
|
||||
these up individually, we can run ``bastille setup storage``, ``bastille setup firewall``,
|
||||
and ``bastille setup loopback`` respectively.
|
||||
This will configure the storage, pf firewall, and loopback addresses for us.
|
||||
To set these up individually, we can run ``bastille setup storage``,
|
||||
``bastille setup firewall``, and ``bastille setup loopback`` respectively.
|
||||
|
||||
Alternatively, you can do it all manually, as shown below.
|
||||
|
||||
@@ -512,8 +518,8 @@ ssh session and continue.
|
||||
|
||||
This step only needs to be done once in order to prepare the host.
|
||||
|
||||
Note that we cannot use the ``loopback`` option together with the ``shared`` option. Configuring
|
||||
one using the ``bastille setup`` command will disable the other.
|
||||
Note that we cannot use the ``loopback`` option together with the ``shared``
|
||||
option. Configuring one using the ``bastille setup`` command will disable the other.
|
||||
|
||||
local_unbound
|
||||
-------------
|
||||
|
||||
@@ -18,7 +18,8 @@ RELEASE as args.
|
||||
|
||||
ishmael ~ # bastille convert azkaban myrelease
|
||||
|
||||
This release can then be used to create a thick jail using the ``--no-validate`` flag.
|
||||
This release can then be used to create a thick jail using the ``--no-validate``
|
||||
flag.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -33,4 +34,4 @@ This release can then be used to create a thick jail using the ``--no-validate``
|
||||
|
||||
-a | --auto Auto mode. Start/stop jail(s) if required.
|
||||
-y | --yes Do not prompt. Just convert.
|
||||
-x | --debug Enable debug mode.
|
||||
-x | --debug Enable debug mode.
|
||||
|
||||
@@ -11,29 +11,30 @@ To add a limit, use ``bastille limits TARGET add OPTION VALUE``.
|
||||
To clear the limits from the system, use ``bastille limits TARGET clear``.
|
||||
|
||||
To clear the limits, and remove the rctl.conf, so that limits will not be loaded
|
||||
on a restart, use ``bastille limits TARGET reset``. This removes the ``rctl.conf`` file,
|
||||
and removes any active limits from the system.
|
||||
on a restart, use ``bastille limits TARGET reset``. This removes the ``rctl.conf``
|
||||
file, and removes any active limits from the system.
|
||||
|
||||
To remove a limit, use ``bastille limits TARGET remove OPTION``.
|
||||
|
||||
This file can be edited manually using ``bastille edit TARGET rctl.conf``.
|
||||
|
||||
Supported actions are ``add``, ``remove``, ``clear``, ``reset``, ``list``, ``show``, and
|
||||
``stats``.
|
||||
Supported actions are ``add``, ``remove``, ``clear``, ``reset``, ``list``,
|
||||
``show``, and ``stats``.
|
||||
|
||||
cpuset
|
||||
------
|
||||
|
||||
Bastille supports limiting CPUs using ``cpuset``. To limit a jail to a specific CPU, use
|
||||
``bastille limits TARGET cpu 2,3,4``` where the value (2,3,4) is a comma-separated list of CPUs on
|
||||
your system. Bastille will validate the CPUs, and error if they are not available to be used.
|
||||
Bastille supports limiting CPUs using ``cpuset``. To limit a jail to a specific
|
||||
CPU, use ``bastille limits TARGET cpu 2,3,4``` where the value (2,3,4) is a
|
||||
comma-separated list of CPUs on your system. Bastille will validate the CPUs, and
|
||||
error if they are not available to be used.
|
||||
|
||||
To adjust the CPU limits, run ``bastille limits TARGET cpu 1,2,3`` again with a new set of CPU
|
||||
values. This will overwrite the ``cpuset.conf`` file. This will restrict the targetted jail(s) to
|
||||
the specified CPUs.
|
||||
To adjust the CPU limits, run ``bastille limits TARGET cpu 1,2,3`` again with a
|
||||
new set of CPU values. This will overwrite the ``cpuset.conf`` file. This will
|
||||
restrict the targetted jail(s) to the specified CPUs.
|
||||
|
||||
CPU limits are cleared when the jail is stopped, and loaded again on jail start, providing the CPU
|
||||
values are present in ``cpuset.conf`` inside the jail directory.
|
||||
CPU limits are cleared when the jail is stopped, and loaded again on jail start,
|
||||
providing the CPU values are present in ``cpuset.conf`` inside the jail directory.
|
||||
|
||||
Supported actions are ``add``, ``remove``, ``reset``, ``list`` and ``show``.
|
||||
|
||||
@@ -51,4 +52,4 @@ This file can be edited manually using ``bastille edit TARGET cpuset.conf``.
|
||||
|
||||
-a | --auto Auto mode. Start/stop jail(s) if required.
|
||||
-l | --log Enable logging for the specified rule (rctl only).
|
||||
-x | --debug Enable debug mode.
|
||||
-x | --debug Enable debug mode.
|
||||
|
||||
@@ -1,13 +1,14 @@
|
||||
list
|
||||
====
|
||||
|
||||
List jails, ports, releases, templates, logs, limits, exports and imports and much more
|
||||
managed by bastille. See the ``help`` output below.
|
||||
List jails, ports, releases, templates, logs, limits, exports and imports and
|
||||
much more managed by bastille. See the ``help`` output below.
|
||||
|
||||
Using `bastille list` without args will print all jails with the info we feel is most important.
|
||||
Using `bastille list` without args will print all jails with the info we feel is
|
||||
most important.
|
||||
|
||||
Most options can be printed in JSON format by including the ``-j|--json`` flag. Use ``-p|--pretty``
|
||||
to print in columns instead of rows.
|
||||
Most options can be printed in JSON format by including the ``-j|--json`` flag.
|
||||
Use ``-p|--pretty`` to print in columns instead of rows.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -21,4 +22,4 @@ to print in columns instead of rows.
|
||||
-p | --pretty Print JSON in columns.
|
||||
-s | --sort VALUE Print info in VALUE order.
|
||||
-u | --up List running jails only.
|
||||
-x | --debug Enable debug mode.
|
||||
-x | --debug Enable debug mode.
|
||||
|
||||
@@ -68,8 +68,8 @@ The options can be used together, as seen above.
|
||||
If you have multiple interfaces assigned to your jail, ``bastille rdr`` will
|
||||
only redirect using the default one.
|
||||
|
||||
It is also possible to specify a pf table as the source, providing it exists. Simply use the table
|
||||
name instead of an IP address or subnet.
|
||||
It is also possible to specify a pf table as the source, providing it exists.
|
||||
Simply use the table name instead of an IP address or subnet.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
|
||||
@@ -25,38 +25,41 @@ Below is a list of available options that can be used with the ``setup`` command
|
||||
-y | --yes Assume always yes on prompts.
|
||||
-x | --debug Enable debug mode.
|
||||
|
||||
The ``loopback`` option will configure a loopback interface called ``bastille0`` that
|
||||
will be used as a default when not specifying an interface with the ``create`` command.
|
||||
The ``loopback`` option will configure a loopback interface called ``bastille0``
|
||||
that will be used as a default when not specifying an interface with the
|
||||
``create`` command.
|
||||
|
||||
The ``shared`` option will configure the interface you choose to also be used as the default
|
||||
when not specifying an interface with the ``create`` command.
|
||||
The ``shared`` option will configure the interface you choose to also be used as
|
||||
the default when not specifying an interface with the ``create`` command.
|
||||
|
||||
Please note. You CANNOT run both a loopback and a shared interface with Bastille. Only one
|
||||
should be configured. If you configure one, it will disable the other.
|
||||
Please note. You CANNOT run both a loopback and a shared interface with Bastille.
|
||||
Only one should be configured. If you configure one, it will disable the other.
|
||||
|
||||
The ``loopback`` option is the default, and is enough for most use cases. It is simply an ``lo`` interface
|
||||
that jails will get linked to on creation. It is not attached to any specific interface. This is the simplest
|
||||
networking option. The ``loopback`` and ``shared`` options are only for cases where the ``interface``
|
||||
is not specified during the ``create`` command. If an interface is specified, these options have no effect.
|
||||
Instead, the specified interface will be used.
|
||||
The ``loopback`` option is the default, and is enough for most use cases. It is
|
||||
simply an ``lo`` interface that jails will get linked to on creation. It is not
|
||||
attached to any specific interface. This is the simplest networking option. The
|
||||
``loopback`` and ``shared`` options are only for cases where the ``interface``
|
||||
is not specified during the ``create`` command. If an interface is specified,
|
||||
these options have no effect. Instead, the specified interface will be used.
|
||||
|
||||
The ``shared`` option is for cases where you want an actual interface to use with bastille as
|
||||
opposed to a loopback. Jails will be linked to the shared interface on creation.
|
||||
The ``shared`` option is for cases where you want an actual interface to use with
|
||||
Bastille as opposed to a loopback. Jails will be linked to the shared interface
|
||||
on creation.
|
||||
|
||||
The ``pf|firewall`` option will configure the pf firewall by enabling the service and creating the
|
||||
default ``pf.conf`` file. Once this is done, you can use the ``rdr`` command to forward traffic into
|
||||
a jail.
|
||||
The ``pf|firewall`` option will configure the pf firewall by enabling the service
|
||||
and creating the default ``pf.conf`` file. Once this is done, you can use the
|
||||
``rdr`` command to forward traffic into a jail.
|
||||
|
||||
The ``storage`` option will attempt to configure a pool and dataset for Bastille, but only
|
||||
if ZFS in enabled on your system. Otherwise it will use UFS.
|
||||
The ``storage`` option will attempt to configure a pool and dataset for Bastille,
|
||||
but only if ZFS in enabled on your system. Otherwise it will use UFS.
|
||||
|
||||
The ``vnet`` option will configure your system for use with VNET ``-V`` jails.
|
||||
|
||||
The ``bridge`` options will attempt to configure a bridge interface for use with bridged VNET
|
||||
``-B`` jails.
|
||||
The ``bridge`` options will attempt to configure a bridge interface for use with
|
||||
bridged VNET ``-B`` jails.
|
||||
|
||||
Running ``bastille setup`` without any options will attempt to auto-configure the ``filesystem``, ``loopback``, ``firewall`` and
|
||||
``storage`` options.
|
||||
Running ``bastille setup`` without any options will attempt to auto-configure the
|
||||
``filesystem``, ``loopback``, ``firewall`` and ``storage`` options.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
|
||||
@@ -22,14 +22,18 @@ quotes, as seen below.
|
||||
Priority
|
||||
--------
|
||||
|
||||
The priority value determines in what order commands are executed if multiple jails are targetted, including the ALL target.
|
||||
The priority value determines in what order commands are executed if multiple
|
||||
jails are targetted, including the ALL target.
|
||||
|
||||
It also controls in what order jails are started and stopped on system startup and shutdown. This requires Bastille to be enabled
|
||||
with ``sysrc bastille_enable=YES``. Jails will start in order starting at the lowest value, and will stop in order starting
|
||||
at the highest value. So, jails with a priority value of 1 will start first, and stop last.
|
||||
It also controls in what order jails are started and stopped on system startup
|
||||
and shutdown. This requires Bastille to be enabled with ``sysrc bastille_enable=YES``.
|
||||
Jails will start in order starting at the lowest value, and will stop in order
|
||||
starting at the highest value. So, jails with a priority value of 1 will start
|
||||
first, and stop last.
|
||||
|
||||
When jails are created with Bastille, this value defaults to ``99``, but can be overridden with ``-p|--priority VALUE`` on
|
||||
creation. See ``bastille create --priority 90 TARGET...``.
|
||||
When jails are created with Bastille, this value defaults to ``99``, but can be
|
||||
overridden with ``-p|--priority VALUE`` on creation.
|
||||
See ``bastille create --priority 90 TARGET...``.
|
||||
|
||||
This value can be changed using ``bastille config TARGET set priority VALUE``.
|
||||
|
||||
@@ -38,14 +42,15 @@ This value will be shown using ``bastille list all``.
|
||||
Parallel Mode
|
||||
-------------
|
||||
|
||||
Any command that supports multiple targets, also supports parallel mode. This means that
|
||||
Bastille will run the command on multiple jails at a single time, depending on the value
|
||||
given.
|
||||
Any command that supports multiple targets, also supports parallel mode. This
|
||||
means that Bastille will run the command on multiple jails at a single time,
|
||||
depending on the value given.
|
||||
|
||||
To use parallel mode, run ``bastille -p 4 pkg ALL update``, for example, to start
|
||||
updating packages in all jails, 4 processes at a time.
|
||||
|
||||
Note that the ``-p`` option should follow the main ``bastille`` command, and not the sub-command.
|
||||
Note that the ``-p`` option should follow the main ``bastille`` command, and not
|
||||
the sub-command.
|
||||
|
||||
Examples: Containers
|
||||
--------------------
|
||||
|
||||
@@ -65,15 +65,15 @@ Template Hook Descriptions
|
||||
ARGS will default to the value set inside the template, but can be changed by
|
||||
including ``--arg ARG=VALUE`` when running the template.
|
||||
|
||||
Multiple ARGS can also be specified as seen below. If no ARG value is given, Bastille
|
||||
will show a warning, but continue on with the rest of the template.
|
||||
Multiple ARGS can also be specified as seen below. If no ARG value is given,
|
||||
Bastille will show a warning, but continue on with the rest of the template.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
ishmael ~ # bastille template azkaban sample/template --arg ARG=VALUE --arg ARG1=VALUE
|
||||
|
||||
The ``ARG`` hook has a wide range of functionality, including passing KEY=VALUE pairs
|
||||
to any templates called with the ``INCLUDE`` hook. See the following example...
|
||||
The ``ARG`` hook has a wide range of functionality, including passing KEY=VALUE
|
||||
pairs to any templates called with the ``INCLUDE`` hook. See the following example...
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
@@ -82,14 +82,15 @@ to any templates called with the ``INCLUDE`` hook. See the following example...
|
||||
|
||||
INCLUDE other/template --arg JAIL=${JAIL} --arg IP=${IP}
|
||||
|
||||
If the above template is called with ``--arg JAIL=myjail --arg IP=10.3.3.3``, these values will
|
||||
be passed along to ``other/template`` as well, with the matching variable. So ``${JAIL}`` will be
|
||||
``myjail`` and ``${IP}`` will be ``10.3.3.3``.
|
||||
If the above template is called with ``--arg JAIL=myjail --arg IP=10.3.3.3``,
|
||||
these values will be passed along to ``other/template`` as well, with the
|
||||
matching variable. So ``${JAIL}`` will be ``myjail`` and ``${IP}`` will be
|
||||
``10.3.3.3``.
|
||||
|
||||
The ARG hook has three values that are built in, and will differ for every jail. The values
|
||||
are ``JAIL_NAME``, ``JAIL_IP``, and ``JAIL_IP6``. These can be used inside any template without
|
||||
setting the values at the top of the Bastillefile. The values are automatically retrieved from
|
||||
the targeted jails configuration.
|
||||
The ARG hook has three values that are built in, and will differ for every jail.
|
||||
The values are ``JAIL_NAME``, ``JAIL_IP``, and ``JAIL_IP6``. These can be used
|
||||
inside any template without setting the values at the top of the Bastillefile.
|
||||
The values are automatically retrieved from the targeted jails configuration.
|
||||
|
||||
``CMD`` - run the specified command
|
||||
|
||||
|
||||
@@ -63,46 +63,55 @@ If this is not desirable, you can change it at the top of the config file.
|
||||
Altroot
|
||||
-------
|
||||
|
||||
If a ZFS pool has been imported using ``-R`` (altroot), your system will automatically add whatever the ``altroot`` is to
|
||||
any ``zfs mount`` commands. Bastille supports using an ``altroot``, and there should be no issues using this feature.
|
||||
If a ZFS pool has been imported using ``-R`` (altroot), your system will
|
||||
automatically add whatever the ``altroot`` is to any ``zfs mount`` commands.
|
||||
Bastille supports using an ``altroot``, and there should be no issues using this feature.
|
||||
|
||||
One thing to note though, is that you MUST NOT include your ``altroot`` path in the ``bastille_prefix``. For example, if
|
||||
you imported your pool with ``zpool import -R /mnt poolname``, and you wish for your jails to live at ``/mnt/poolname/bastille``
|
||||
then ``bastille_prefix`` should be set to ``/poolname/bastille`` without the ``/mnt`` part.
|
||||
One thing to note though, is that you MUST NOT include your ``altroot`` path in
|
||||
the ``bastille_prefix``. For example, if you imported your pool with
|
||||
``zpool import -R /mnt poolname``, and you wish for your jails to live at
|
||||
``/mnt/poolname/bastille`` then ``bastille_prefix`` should be set to
|
||||
``/poolname/bastille`` without the ``/mnt`` part.
|
||||
|
||||
If you do accidentally add the ``/mnt`` part, your datasets will be mounted at ``/mnt/mnt/poolname/bastille`` and Bastille will
|
||||
throw all kinds of errors due to not finding the proper paths.
|
||||
If you do accidentally add the ``/mnt`` part, your datasets will be mounted at
|
||||
``/mnt/mnt/poolname/bastille`` and Bastille will throw all kinds of errors due
|
||||
to not finding the proper paths.
|
||||
|
||||
Jailing a Dataset
|
||||
-----------------
|
||||
|
||||
It is possible to "jail" a dataset. This means mounting a datset into a jail, and being
|
||||
able to fully manage it from within the jail.
|
||||
It is possible to "jail" a dataset. This means mounting a datset into a jail,
|
||||
and being able to fully manage it from within the jail.
|
||||
|
||||
To add a dataset to a jail, we can run ``bastille zfs TARGET jail pool/dataset /path/inside/jail``.
|
||||
This will mount ``pool/dataset`` into the jail at ``/path/inside/jail`` when the jail is started, and
|
||||
unmount and unjail it when the jail is stopped.
|
||||
To add a dataset to a jail, we can run
|
||||
``bastille zfs TARGET jail pool/dataset /path/inside/jail``.
|
||||
This will mount ``pool/dataset`` into the jail at ``/path/inside/jail`` when the
|
||||
jail is started, and unmount and unjail it when the jail is stopped.
|
||||
|
||||
You can manually change the path where the dataset will be mounted by ``bastille edit TARGET zfs.conf`` and
|
||||
adjusting the path after you have added it, bearing in mind the warning below.
|
||||
You can manually change the path where the dataset will be mounted by
|
||||
``bastille edit TARGET zfs.conf`` and adjusting the path after you have added it,
|
||||
bearing in mind the warning below.
|
||||
|
||||
WARNING: Adding or removing datasets to the ``zfs.conf`` file can result in permission errors with your jail. It is
|
||||
important that the jail is first stopped before attempting to manually configure this file. The format inside
|
||||
the file is simple.
|
||||
WARNING: Adding or removing datasets to the ``zfs.conf`` file can result in
|
||||
permission errors with your jail. It is important that the jail is first stopped
|
||||
before attempting to manually configure this file. The format inside the file is
|
||||
simple.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
pool/dataset /path/in/jail
|
||||
pool/other/dataset /other/path/in/jail
|
||||
|
||||
To remove a dataset from being jailed, we can run ``bastille zfs TARGET unjail pool/dataset``.
|
||||
To remove a dataset from being jailed, we can run
|
||||
``bastille zfs TARGET unjail pool/dataset``.
|
||||
|
||||
Template Approach
|
||||
^^^^^^^^^^^^^^^^^
|
||||
|
||||
While it is possible to "jail" a dataset using a template, it is a bit more "hacky" than the above apporach.
|
||||
Below is a template that you can use that will add the necessary bits to the ``jail.conf`` file to "jail" a
|
||||
dataset.
|
||||
While it is possible to "jail" a dataset using a template, it is a bit more
|
||||
"hacky" than the above apporach.
|
||||
Below is a template that you can use that will add the necessary bits to the
|
||||
``jail.conf`` file to "jail" a dataset.
|
||||
|
||||
.. code-block:: shell
|
||||
|
||||
|
||||
Reference in New Issue
Block a user