12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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使うなら絶対覚えるべき
  • ezjailiocageで簡単に管理できる

Dockerに疲れたらjailを試してみて。シンプルさに感動するよ。

次回予告

Part4: ZFS、最強ファイルシステムの使い方

FreeBSDといえばZFS。スナップショット、圧縮、重複排除、RAID-Z...機能てんこ盛りの最強ファイルシステムを使いこなそう。

この記事が役に立ったら、いいね・ストックしてもらえると嬉しいです!

12
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?