始めに
FreeBSDのJailを管理するのに、qjailとかを使ってたけど、iocageと言うZFSをベースにしたツールが使いやすかったのでmemo
ほぼ参考サイトに記載されている、Slideshareのままです。
環境
- FreeBSD 13R
- ZFS root(プール名 zroot)
- ZFS rootでなくてもZFSのプールがあれば使える
環境構築
iocageのコマンド郡をインストールして、iocageを有効にします。
# pkg install py38-iocage
# iocage activate zroot
# mount -t fdescfs null /dev/fd
# iocage list
mount コマンドを永続化するため、 fstab に追記
/etc/fstab.
fdescfs /dev/fd fdescfs rw 0 0
Jailを作るとき
iocage create コマンドで作成します。
利用するバージョンを始めて利用する際に、該当バージョンのバイナリファイルがダウンロードされ、freebsd-updateにて最新のパッチが当てられます。
- -n : Jail名
- -r : バージョン
# iocage create -n asterisk -r 13.0-RELEASE
JailにIPv4アドレスを割り当てる
# iocage set ip4=new [Jail名]
# iocage set ip4_addr="lo1|10.100.100.11/24" [Jail名]
# iocage set defaultrouter=10.100.100.254 [Jail名]
// pingを打てるようにするにはこれも必要
# iocage set allow_raw_sockets=1 [Jail名]
- IPアドレス複数割り当てる場合は , で区切る
- iocage set ip4_addr="lo1|10.100.100.11/24, lo1|10.100.100.12/24" [Jail名]
- 複数のパラメタを続けて指定することも可能
- iocage set ip4=new ip4_addr="lo1|10.100.100.11/24" [Jail名]
Jailを起動する
# iocage start [Jail名]
Jailを停止する
# iocage stop [Jail名]
Jailの自動起動
# iocage set boot=on [Jail名]
iocageの自動起動
# sysrc iocage_enable="YES"
スナップショット
スナップショットを取る
- -n : スナップショット名は省略可能でその場合は YYYY-MM-DD_hhss (UTC) となります。
# iocage snapshot [Jail名] -n [スナップショット名]
スナップショット一覧
# iocage snaplist [Jail名] -l
+------------------------------------------------+-----------------------+-------+------+
| NAME | CREATED | RSIZE | USED |
+================================================+=======================+=======+======+
| zroot/iocage/jails/[Jail名]/root@20191004_init | Fri Oct 4 10:45 2019 | 1.37G | 0 |
+------------------------------------------------+-----------------------+-------+------+
| zroot/iocage/jails/[Jail名]@20191004_init | Fri Oct 4 10:45 2019 | 92K | 0 |
+------------------------------------------------+-----------------------+-------+------+
外側のIPアドレスが1つしか無い場合
VPSなどで構築する際に、グローバルIPアドレスが1つしか無い場合があります。
その場合、pfなどでNAPTすれば 外 ・ ホスト ・ jail の通信が出来るようになります。
/etc/rc.conf
pf_enable="YES"
pf_rules="/etc/pf.conf"
pflog_enable="YES"
cloned_interfaces="lo1"
ifconfig_lo1="inet 10.100.100.254 netmask 255.255.255.0"
/etc/pf.conf
ext_if="vtnet0" # 外側のI/F
int_if="lo1"
scrub in all
table <private> const {10.100.100.0/24}
nat on $ext_if inet from ($int_if) to ! <private> -> ($ext_if)
# 必要に応じて、ポートフォワーディングする
rdr on $ext_if proto tcp from any to ($ext_if) port 80-> 10.100.100.11 port 80