bsdinstallを使用したFreeBSDの自動インストールについて


bsdinstallについて最近ブログでいろいろ書いてたので、Qiitaにもまとめて書き残しておきます。

# bsdinstallとは？？？
FreeBSD 9.0から登場した、FreeBSDのインストーラです。
Linuxで言うところのAnacondaのようなものでしょうか。

「FreeBSDのインストール」というと、Gentoo LinuxやArch Linuxのような難しいものを想像されるかもしれませんが、bsdinstallを使用すると非常に簡単にインストールできます。

自動インストールする場合の呼び出し方は、以下のようになっています。

```bash
bsdinstall script スクリプトファイル
```

このポストでは、この呼び出しで使用するスクリプトファイルについて書きます。


# 基本形
マニュアルに記載されているサンプルは以下の内容となっています。

```bash
PARTITIONS=ada0
DISTRIBUTIONS="kernel.txz base.txz"

#!/bin/sh
echo "ifconfig_em0=DHCP" >> /etc/rc.conf
echo "sshd_enable=YES" >> /etc/rc.conf
pkg install puppet
```

このスクリプトは、シバン行(#!/bin/sh)によって、前半(preamble)と後半(setup script)に分かれます。

## 前半(PREAMBLE)
前半では、インストールで使用する環境変数の設定を行います。

```bash
PARTITIONS=ada0
DISTRIBUTIONS="kernel.txz base.txz"
```

* PARTITIONS=ada0
インストール先のパーテイションはada0
※PARTITIONSはscriptedpartターゲットで使用する環境変数
* DISTRIBUTIONS="kernel.txz base.txz"
インストールするディストリビューションは kernel と base

## 後半(SETUP SCRIPT)
後半は、インストールが終わった後、新環境で実行されるシェルスクリプトです。

```bash
#!/bin/sh
echo "ifconfig_em0=DHCP" >> /etc/rc.conf
echo "sshd_enable=YES" >> /etc/rc.conf
pkg install puppet
```

サンプルではrc.confの設定とpuppetのインストールを行っています。
普通のシェルスクリプトなので、パスワードの設定や他の設定ファイルへの書き込みなど色々することができます。

# 任意にパーティション分割してインストールする
前半(PREAMBLE)で定義している環境変数 <i>PARTITIONS</i> に、基本形では「ada0」のみを定義しています。ここにscriptedpartで使用するパーティション定義を記述すれば、任意の形でパーティション分割することができます。

## 前半(PREAMBLE)

```bash
PARTITIONS="ada0 { 512M freebsd-ufs /, 1G freebsd-swap, 512M freebsd-ufs /var, auto freebsd-ufs /usr }"
DISTRIBUTIONS="base.txz kernel.txz"
```

上記の設定では以下のようにパーティション分割されます。
- ufs / 1G
- swap 512M
- ufs /var 512M
- ufs /usr 残り

# パスワードの設定やユーザーの追加などを行う
後半(SETUP SCRIPT)は普通のシェルスクリプトになっているので、そこに初期設定を行うコマンドを記述すれば自由にプロビジョニングできます。

## 後半(SETUP SCRIPT)
vagrant用のマシンを作成したときの設定の一部です。

```bash
echo 'vagrant' | pw usermod root -h 0 -s /bin/tcsh
echo 'vagrant' | pw useradd -n vagrant -h 0 -m -s /bin/tcsh

export ASSUME_ALWAYS_YES=yes
cat <<EOS | xargs pkg install
  sudo
  curl
  bash
EOS
```

上記の設定では以下の設定を行っています
- rootユーザーにパスワード「vagrant」を設定
- 一般ユーザー「vagrant」を作成。パスワードは「vagrant」、ログインシェルは「tcsh」
- pkg installを使って、sudo・curl・bashをインストール


# ZFSへ、自動レイアウトでインストールする
前半(PREAMBLE)へ、環境変数 <i>PARTITIONS</i> の代わりに <i>ZFSBOOT_DISKS</i> を記述すればZFSへインストールすることができます。

ただし、以下の2点の注意が必要です。
- 自動インストールする場合は、環境変数 <i>nonInteractive</i> の設定も行う
- 環境変数 <i>ZFSBOOT_DISKS</i> と <i>nonInteractive</i> はexportする

特に2点目については注意が必要です。

([scriptターゲットのソース](https://github.com/freebsd/freebsd/blob/master/usr.sbin/bsdinstall/scripts/script)を見てみた感じではおそらく、 <i>DISTRIBUTIONS</i> はexportされていたのに <i>ZFSBOOT_DISKS</i> などはexportされていなかったので、それが原因かと……)

## 前半(PREAMBLE)

```bash
export ZFSBOOT_DISKS=ada0
export nonInteractive="YES"
DISTRIBUTIONS="base.txz kernel.txz"
```

上記の設定では、デフォルト設定でZFSパーティションが作成されました。
- ディスク：ada0
- デバイスタイプ：stripe
- プール名：zroot
- パーティションスキーム：GPT
- スワップサイズ：2G
- マウントポイント
```
zroot                 none
zroot/ROOT            none
zroot/ROOT/default    /
zroot/tmp             /tmp
zroot/usr             /usr
zroot/usr/home        /usr/home
zroot/usr/ports       /usr/home
zroot/usr/src         /usr/home
zroot/var             /var
zroot/var/crash       /var/crash
zroot/var/log         /var/log
zroot/var/mail        /var/mail
zroot/var/tmp         /var/tmp
```

# ZFSへ、カスタムレイアウトでインストールする
環境変数 <i>ZFSBOOT_DATASETS</i> を設定することで、自由にZFSレイアウトを作成できるようです。

とりあえず、/・/tmp・/usr・/varで分割してみます。

## 前半(PREAMBLE)

```bash
export ZFSBOOT_DISKS=ada0
export ZFSBOOT_DATASETS="
    /ROOT                mountpoint=none
    /ROOT/default        mountpoint=/

    /tmp        mountpoint=/tmp,exec=on,setuid=off
    /usr        mountpoint=/usr,canmount=off
    /var        mountpoint=/var,canmount=off
" 
export nonInteractive="YES"
DISTRIBUTIONS="base.txz kernel.txz"
```

上記の設定では、以下の設定でZFSパーティションが作成されました。
- マウントポイント
```
zroot                 none
zroot/ROOT            none
zroot/ROOT/default    /
zroot/tmp             /tmp
zroot/usr             /usr
zroot/var             /var
```

※ZFSへの自動インストール時に使用する環境変数については、[zfsbootのソースコード](https://github.com/freebsd/freebsd/blob/master/usr.sbin/bsdinstall/scripts/zfsboot)にわかりやすく記述されているので、確認してみるのも良いと思います。


# 軽いまとめ
見てきたように、bsdinstallを使用すると非常に簡単な記述でもってFreeBSDをインストールすることができます。

FreeBSDはGUI環境を作るのは難しいですがCUIでしか使用しないのであればとても素直でいい子ですし、また、最近はpkgngなど、入門者でも使いやすくなってきています。

この機会に是非入れて使って遊んでみる人がふえてくれればなぁ…なんて思って〼。


# 参考URL
- [BSDInstall - FreeBSD Wiki](https://wiki.freebsd.org/BSDInstall)
- [bsdinstall(8)](https://www.freebsd.org/cgi/man.cgi?bsdinstall(8))
- [BSDINSTALL(8) - システム管理コマンド - YOS OPENSONAR](http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man8/bsdinstall.8.html?l=ja)
- [freebsd/script at master · freebsd/freebsd · GitHub](https://github.com/freebsd/freebsd/blob/master/usr.sbin/bsdinstall/scripts/script)
- [freebsd/zfsboot at master · freebsd/freebsd · GitHub](https://github.com/freebsd/freebsd/blob/master/usr.sbin/bsdinstall/scripts/zfsboot)