FreeBSD入門シリーズ
| Part1 導入 | Part2 pkg/ports | Part3 jail | Part4 ZFS | Part5 bhyve |
|---|---|---|---|---|
| ✅ Done | ✅ Done | 👈 Now | - | - |
はじめに
「コンテナ技術といえばDocker」
...と思ってる人、多いよね。
でもFreeBSDのjailは2000年リリース。Dockerは2013年。
13年も先を行ってたんだ。
今回はそのjailを触ってみる。
jailとは
jailは、FreeBSDのプロセスを隔離環境で実行する技術。
┌─────────────────────────────────────────────────────────────┐
│ FreeBSD ホスト │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Jail A │ │ Jail B │ │ Jail C │ │
│ │ (Web) │ │ (DB) │ │ (Cache) │ │
│ │ │ │ │ │ │ │
│ │ /var/jail/a │ │ /var/jail/b │ │ /var/jail/c │ │
│ │ 192.168.1.10 │ │ 192.168.1.11 │ │ 192.168.1.12 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ FreeBSD カーネル (共有) │
└─────────────────────────────────────────────────────────────┘
Dockerとの違い:
- カーネルを共有するのは同じ
- イメージの仕組みがない(フルのユーザーランドをコピー)
- ネットワーク周りがシンプル
- FreeBSD専用
手動でjailを作る
まず手動で作って仕組みを理解しよう。
ベースシステムの展開
# jail用ディレクトリ作成
mkdir -p /var/jail/myjail
# ベースシステムをダウンロード・展開
fetch https://download.freebsd.org/releases/amd64/14.2-RELEASE/base.txz
tar -xf base.txz -C /var/jail/myjail
最低限の設定
# resolv.confをコピー(DNS解決用)
cp /etc/resolv.conf /var/jail/myjail/etc/
# localtimeをコピー(タイムゾーン)
cp /etc/localtime /var/jail/myjail/etc/
jail.confに設定を追加
vi /etc/jail.conf
# グローバル設定
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.clean;
mount.devfs;
allow.raw_sockets;
# myjailの設定
myjail {
host.hostname = "myjail";
path = "/var/jail/myjail";
ip4.addr = "lo0|127.0.1.1"; # ループバックにIPを追加
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
}
jailの起動
# 起動
service jail start myjail
# 確認
jls
# JID IP Address Hostname Path
# 1 127.0.1.1 myjail /var/jail/myjail
jail内に入る
jexec myjail /bin/sh
# jail内で確認
hostname
# myjail
uname -a
# FreeBSD myjail 14.2-RELEASE ...
# rootディレクトリを確認
ls /
# bin boot dev etc lib libexec media mnt net proc rescue root sbin sys tmp usr var
ホストと完全に分離された環境ができた!
jailの操作コマンド
# jail一覧
jls
# JID IP Address Hostname Path
# 1 127.0.1.1 myjail /var/jail/myjail
# 詳細表示
jls -v
# jail内でコマンド実行
jexec myjail pkg install nginx
# jailを停止
service jail stop myjail
# jailを再起動
service jail restart myjail
自動起動設定
# /etc/rc.confに追加
sysrc jail_enable="YES"
sysrc jail_list="myjail" # 複数あるときはスペース区切り
VNETでネットワークを強化
デフォルトのIPエイリアスだと制限がある。VNETを使うとjail専用のネットワークスタックが使える。
vi /etc/jail.conf
myjail {
host.hostname = "myjail";
path = "/var/jail/myjail";
# VNET有効化
vnet;
vnet.interface = "epair0b";
# 起動・停止時のネットワーク設定
exec.prestart = "ifconfig epair0 create up";
exec.prestart += "ifconfig bridge0 addm epair0a";
exec.start = "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.poststop = "ifconfig epair0a destroy";
}
# ブリッジを作成(ホスト側)
ifconfig bridge0 create
ifconfig bridge0 addm em0 # 物理NICを追加
ifconfig bridge0 up
nullfsでホストとファイル共有
vi /etc/jail.conf
myjail {
# ... 他の設定 ...
# ホストの/dataをjailの/mntにマウント
mount += "/data /var/jail/myjail/mnt nullfs rw 0 0";
}
# ホスト側でディレクトリ作成
mkdir /data
echo "Hello from host" > /data/test.txt
# jailを再起動
service jail restart myjail
# jail内で確認
jexec myjail cat /mnt/test.txt
# Hello from host
ezjail - 簡単にjailを管理
毎回手動は面倒なので、ezjailを使おう。
pkg install ezjail
ezjailの初期設定
# ベースシステムをインストール
ezjail-admin install
これで/usr/jails/basejailにベースシステムがインストールされる。
jailの作成
# Webサーバー用jail
ezjail-admin create web 'lo0|127.0.1.1'
# DB用jail
ezjail-admin create db 'lo0|127.0.1.2'
jail一覧
ezjail-admin list
# STA JID IP Hostname Root Directory
# --- ---- --------------- ------------------------------ ------------------------
# DS N/A 127.0.1.1 web /usr/jails/web
# DS N/A 127.0.1.2 db /usr/jails/db
jailの起動
# 全部起動
ezjail-admin start
# 特定のjailだけ起動
ezjail-admin start web
jailの削除
ezjail-admin stop web
ezjail-admin delete -w web # -wでファイルも削除
iocage - より現代的なjail管理
ezjailより新しいiocageもある。ZFSと連携して効率的に管理できる。
pkg install py311-iocage
# ZFSプールを有効化
iocage activate zroot
# jailを作成
iocage create -n web -r 14.2-RELEASE
# jail一覧
iocage list
# +-----+------+-------+--------------+------+
# | JID | NAME | STATE | RELEASE | IP4 |
# +=====+======+=======+==============+======+
# | - | web | down | 14.2-RELEASE | - |
# +-----+------+-------+--------------+------+
# 起動
iocage start web
# コンソール接続
iocage console web
iocageのスナップショット
# スナップショット作成
iocage snapshot web@before-update
# スナップショット一覧
iocage snaplist web
# スナップショットからロールバック
iocage rollback web@before-update
ZFSのスナップショットと連携してるので超高速。
Dockerとjailの比較
| 項目 | Docker | jail |
|---|---|---|
| リリース年 | 2013 | 2000 |
| イメージ管理 | Docker Hub | なし(ベースシステム) |
| オーバーヘッド | 小 | 極小 |
| ポータビリティ | 高い | FreeBSD限定 |
| ネットワーク | 複雑 | シンプル |
| セキュリティ | ◯ | ◎(実績豊富) |
jailの利点:
- カーネルレベルの隔離で歴史が長い
- セキュリティ監査の実績が豊富
- シンプルで理解しやすい
Dockerの利点:
- エコシステムが充実
- イメージの配布が簡単
- どこでも動く
実用例: Webサーバーをjailで動かす
# jail作成
ezjail-admin create www 'lo0|127.0.1.1'
ezjail-admin start www
# jail内でnginxインストール
jexec www pkg install nginx
# jail内で設定
jexec www sysrc nginx_enable="YES"
jexec www service nginx start
# ホストからポートフォワード(PFを使う)
echo "rdr pass on em0 proto tcp from any to any port 80 -> 127.0.1.1 port 80" >> /etc/pf.conf
pfctl -f /etc/pf.conf
まとめ
jailは:
- 2000年からある老舗コンテナ技術
- Dockerより軽量でシンプル
- FreeBSD限定だけど、FreeBSD使うなら絶対覚えるべき
-
ezjailやiocageで簡単に管理できる
Dockerに疲れたらjailを試してみて。シンプルさに感動するよ。
次回予告
Part4: ZFS、最強ファイルシステムの使い方
FreeBSDといえばZFS。スナップショット、圧縮、重複排除、RAID-Z...機能てんこ盛りの最強ファイルシステムを使いこなそう。
この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!