FreeBSD13のインストール

FreeBSD 13.0-RELEASEをインストールしてみる。 本記述は13.0-RC2時点での内容であるが、13.0がリリースされた後でも調整は入る可能性がある。

インストールが終った後は 初期設定 を参考にして欲しい。 さらに よくある設定 で典型的な設定をまとめた。 (サーバー)アプリケーション別については別途まとめる予定。

目次

  1. FreeBSD13のインストール
    1. FreeBSD13での特徴
      1. KTLS(4)対応
      2. VMware環境
      3. VirtIO環境
    2. 前提条件
    3. 設定目標
    4. インストール設定
    5. 環境確認方法
      1. ブート環境
      2. ディスク一覧
      3. TRIM/UNMAP対応の確認
      4. AES-NI/SHA-NI対応の確認
      5. 時刻およびCMOSクロックのタイムゾーンの確認
  2. インストール
    1. インストールメディアの入手
    2. インストールメディアの起動とコンソールへ
    3. コマンド操作によるインストール作業
      1. パーティションを切る
      2. ファイルシステムをフォーマットする
      3. フォーマットしたファイルシステムをマウントしてディレクトリを準備する
      4. ブートローダーをインストールする
      5. パーティションを暗号化(GELI)する
      6. ZFSファイルシステムの構築
      7. 配布物のインストール
    4. 起動に必要な最低限の設定の実施
      1. /tmp/zroot/etc/fstab
      2. /tmp/zroot/boot/loader.conf
      3. /tmp/zroot/etc/rc.conf
      4. /tmp/zroot/etc/resolv.conf
      5. /tmp/zroot/etc/localtime
      6. /tmp/zroot/etc/ntp.conf
      7. /tmp/zroot/etc/ssh/sshd_config
      8. /tmp/zroot/root/.ssh/authorized_keys
      9. 再起動する
  3. よくある質問とその答え
    1. Q.SHA-NIに対応したCPUなんてあるんですか?
    2. Q.これ全部手で入力するんですか?
    3. Q.ZFSパーティションを確保するときの計算式が意味不明です。説明求む!
    4. Q.何故ISOイメージではなくメモリスティックを使わないのですか?
    5. Q.後日のメディア拡張のことを考慮するとスワップパーティションは前の方にあった方がいいのでは?
    6. Q.境界にアライメントするなら多少のフリー領域があってもいいのでは? 誤差ではかと
    7. Q.インストール時に kern.geom.label.disk_ident.enable を設定しているけど、loader.conf に指定しない理由は?
  4. 参考文献

FreeBSD13での特徴

詳しくはリリースノートを読んでもらうとして「環境」における気がついた点を紹介する。

KTLS(4)対応

VMware環境

いわゆるvSphere、ESXi、VMwareワークステーション等といった環境上で稼動する上での特徴について述べる。

VirtIO環境

いわゆるKVM、QEMU、BHyVe等の環境上で稼動する上での特徴について述べる。

前提条件

設定目標

インストール設定

以下のパーティション構成を組む。ブート環境に応じて選択する。

BIOSブート環境

パーティション番号

パーティション種別

用途

サイズ

注意

-

GPTヘッダー

Protected MBR ブート

40 ブロック 

UEFIブート環境では Protected MBR は参照されない。

1

freebsd-boot

BIOS用FreeBSDブート領域

984 ブロック 

UFS領域を512KB境界(※)に設置するためのサイズを指定。

2

freebsd-ufs

UFS領域(/boot として使用)

8387584 ブロック 

ZFS領域を4GB境界に設置するためのサイズを指定。

3

freebsd-zfs

ZFS領域(/ として使用)

※都度計算※

スワップ領域を1GB境界に設置するためのサイズを指定。

4

freebsd-swap

スワップ領域(搭載メモリの2倍≦8GB)

16777216 ブロック~

8GB+補正分。

UEFIブート環境

パーティション番号

パーティション種別

用途

サイズ

注意

-

GPTヘッダー

-

40 ブロック 

1

efi

UEFI領域(FAT32フォーマット)

409560 ブロック 

UFS領域を200MB境界に設置するためのサイズを指定。

2

freebsd-ufs

UFS領域(/boot として使用)

7979008 ブロック 

ZFS領域を4GB境界に設置するためのサイズを指定。

3

freebsd-zfs

ZFS領域(/ として使用)

※都度計算※

スワップ領域を1GB境界に設置するためのサイズを指定。

4

freebsd-swap

スワップ領域(搭載メモリの2倍≦8GB)

16777216 ブロック~

8GB+補正分。

両用ブート環境(BIOSおよびUEFIともに共存するブート環境)

パーティション番号

パーティション種別

用途

サイズ

注意

-

GPTヘッダー

Protected MBR ブート

40 ブロック 

UEFIブート環境では Protected MBR は参照されない。

1

freebsd-boot

BIOS用FreeBSDブート領域

984 ブロック 

EFI領域を512KB境界(※)に設置するためのサイズを指定。

2

efi

UEFI領域(FAT32フォーマット)

408576 ブロック 

UFS領域を200MB境界に設置するためのサイズを指定。

3

freebsd-ufs

UFS領域(/boot として使用)

7979008 ブロック 

ZFS領域を4GB境界に設置するためのサイズを指定。

4

freebsd-zfs

ZFS領域(/ として使用)

※都度計算※

スワップ領域を1GB境界に設置するためのサイズを指定。

5

freebsd-swap

スワップ領域(搭載メモリの2倍≦8GB)

16777216 ブロック~

8GB+補正分。

環境確認方法

OS起動後になるが、以下のコマンドで環境を確認できる。実際にインストール時に確認すること。 以下はある環境での実行結果である。

check-list-environment.png

ブート環境

sysctl machdep.bootmethod

この時「BIOS」と表示されればBIOSブート環境、「UEFI」と表示されればUEFIブート環境である。

ディスク一覧

geom disk status

ディスク一覧が表示される(この時 Status と Components が N/A となるのは無視して良い)。
下記は実行例であるが、下記の実効例の場合、インストール先メディアを選ぶこと(mmcsd0 または ada0)。

root@:~ # geom disk status
       Name  Status  Components
     mmcsd0     N/A  N/A
mmcsd0boot0     N/A  N/A
mmcsd0boot1     N/A  N/A
       ada0     N/A  N/A

TRIM/UNMAP対応の確認

sysctl kern.geom.disk.デバイス名.flags

先に確認したインストール先メディア(デバイス)に対して上記コマンドを実行する。下記の実行例のように CANDELETE の表示があれば、対応している。

root@:~ # sysctl kern.geom.disk.ada0.flags
kern.geom.disk.ada0.flags: be<OPEN,CANDELETE,CANFLUSHCACHE,UNMAPPEDBIO,DIRECTCOMPLETION,CANZONE>

AES-NI/SHA-NI対応の確認

sysctl dev.aesni.0.%desc

この時「AES-XTS」の表示があること(あればAES-NIに対応)。「SHA256」の表示があること(あればSHA-NIに対応)。

時刻およびCMOSクロックのタイムゾーンの確認

sysctl machdep.wall_cmos_clock
date

インストール

インストールメディアの入手

インストールメディアの起動とコンソールへ

ISOイメージからシステムがブートすると下記の画面が表示される。表示されない場合は起動順序に問題がある(ほぼこれ)、認識してない(挿入ミス、接続されてないなど、希に)ので確認する(確認手順は難しいのでここでは省略)。
10秒カウントダウンの後、OSが起動するので、その前に「3」を押す。あるいはスペースキーを押すとカウントダウンが止まる。

beastie-on-boot.png

3を押すと下記のようにプロンプトが表示されるので、

prompt-on-boot.png

以下のコマンドを入力して起動する(実施しなかったとしてもペナルティは無い)。

set hint.psm.0.disabled="1"
set kern.geom.label.disk_ident.enable="0"
boot

setting-on-boot.png

環境によっては、下記の追加設定を実施しても良い。ただしキー入力を受け付けなくなることがあるので、要動作確認のこと。

set hint.atkbdc.0.disabled="1"
set hint.atkbd.0.disabled="1"

今時のハードウェアだと、この手のレガシー(PS/2接続)デバイスのエミュレーションの互換性が低い(遅い等)ことがあるので、可能な限り積極的に設定してみることをお勧めする。

start-bsdinstall.png

上記画面が表示されるので、「<Live CD>」を選択(カーソルキーで→に移動、エンターキーを押す)する。

start-console-login.png

ログインプロンプトが表示されるので「root」を入力してエンターキーを押す(パスワード入力は求められない)。

コマンド操作によるインストール作業

先に情報収集が成されているものとして以下のコマンドを実行する。

コマンド入力に当り、デフォルトで英語キーボードモードになっているので、日本語キーボードモードに変更したい場合は下記のコマンドを実行する。

kbdcontrol -l jp < /dev/console

英語キーボードモードに戻したい場合は -l オプションに与えるキーボード種別に us を指定する。

パーティションを切る

gpart destroy -F vtbd0
gpart create -s GPT vtbd0
gpart add -t freebsd-boot -s     984 vtbd0
gpart add -t efi          -s  408576 vtbd0
gpart add -t freebsd-ufs  -s 7979008 vtbd0
gpart add -t freebsd-zfs  -s `gpart show vtbd0 | awk '/- free -/{ st = $1; sz = $2; sw = ( 8 * 1024 * 1024 * 1024 ) / 512; aln = ( 1024 * 1024 * 1024 ) / 512; sz -= sw; sz -= ( st + sz ) % aln; print sz }'` vtbd0
gpart add -t freebsd-swap            vtbd0

gpart destroy -F vtbd0
gpart create -s GPT vtbd0
gpart add -t freebsd-boot -s     984 vtbd0
gpart add -t freebsd-ufs  -s 8387584 vtbd0
gpart add -t freebsd-zfs  -s `gpart show vtbd0 | awk '/- free -/{ st = $1; sz = $2; sw = ( 8 * 1024 * 1024 * 1024 ) / 512; aln = ( 1024 * 1024 * 1024 ) / 512; sz -= sw; sz -= ( st + sz ) % aln; print sz }'` vtbd0
gpart add -t freebsd-swap            vtbd0

gpart destroy -F vtbd0
gpart create -s GPT vtbd0
gpart add -t efi          -s  409560 vtbd0
gpart add -t freebsd-ufs  -s 7979008 vtbd0
gpart add -t freebsd-zfs  -s `gpart show vtbd0 | awk '/- free -/{ st = $1; sz = $2; sw = ( 8 * 1024 * 1024 * 1024 ) / 512; aln = ( 1024 * 1024 * 1024 ) / 512; sz -= sw; sz -= ( st + sz ) % aln; print sz }'` vtbd0
gpart add -t freebsd-swap            vtbd0

ファイルシステムをフォーマットする

# BIOSブート環境またはUEFIブート環境の場合はこちら #
newfs -U -j -E -t /dev/vtbd0p2

# 両用ブート環境の場合はこちら #
newfs -U -j -E -t /dev/vtbd0p3

# BIOSブート環境またはUEFIブート環境の場合はこちら #
newfs -U -j /dev/vtbd0p2

# 両用ブート環境の場合はこちら #
newfs -U -j /dev/vtbd0p3

# UEFIブート環境の場合はこちら #
newfs_msdos -F 32 -c 1 -L EFISYS /dev/vtbd0p1

# 両用ブート環境の場合はこちら #
newfs_msdos -F 32 -c 1 -L EFISYS /dev/vtbd0p2

フォーマットしたファイルシステムをマウントしてディレクトリを準備する

以下の手順を実施する。

# BIOSブート環境またはUEFIブート環境の場合はこちら #
mount -t ufs -o rw,async,noatime /dev/vtbd0p2 /mnt
mkdir -p /mnt/boot/efi /mnt/boot/zfs

# 両用ブート環境の場合はこちら #
mount -t ufs -o rw,async,noatime /dev/vtbd0p3 /mnt
mkdir -p /mnt/boot/efi /mnt/boot/zfs

更にUEFIブート環境または両用ブート環境の場合、以下の手順を実施する。

# UEFIブート環境の場合はこちら #
mount -t msdosfs /dev/vtbd0p1 /mnt/boot/efi
mkdir -p /mnt/boot/efi/EFI/BOOT

# 両用ブート環境の場合はこちら #
mount -t msdosfs /dev/vtbd0p2 /mnt/boot/efi
mkdir -p /mnt/boot/efi/EFI/BOOT

ブートローダーをインストールする

gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 vtbd0

cp -a /boot/loader.efi /mnt/boot/efi/EFI/BOOT/BOOTX64.efi

# UEFI環境では下記のコマンドを実行できる ※BIOS環境では実行できない #
efibootmgr --verbose --create --activate --label FreeBSD --loader /boot/efi/EFI/BOOT/BOOTX64.efi

パーティションを暗号化(GELI)する

BIOSブート環境またはUEFIブート環境の場合、以下の手順でZFSパーティションを暗号化(GELI)を施す。

kldload geom_eli

dd if=/dev/random of=/mnt/vtbd0p3.key bs=64 count=1
chmod 0400 /mnt/vtbd0p3.key

# SHA-NI対応CPUではこちら
geli init -b -B none -e AES-XTS -l 256 -a HMAC/SHA256 -s 4096 -K /mnt/vtbd0p3.key /dev/vtbd0p3
geli attach -k /mnt/vtbd0p3.key /dev/vtbd0p3

# SHA-NIに未対応のCPUではこちら
geli init -b -B none -e AES-XTS -l 256                -s 4096 -K /mnt/vtbd0p3.key /dev/vtbd0p3
geli attach -k /mnt/vtbd0p3.key /dev/vtbd0p3

両用ブート環境の場合、以下の手順でZFSパーティションを暗号化(GELI)を施す。

kldload geom_eli

dd if=/dev/random of=/mnt/vtbd0p4.key bs=64 count=1
chmod 0400 /mnt/vtbd0p4.key

# SHA-NI対応CPUではこちら
geli init -b -B none -e AES-XTS -l 256 -a HMAC/SHA256 -s 4096 -K /mnt/vtbd0p4.key /dev/vtbd0p4
geli attach -k /mnt/vtbd0p4.key /dev/vtbd0p4

# SHA-NIに未対応のCPUではこちら
geli init -b -B none -e AES-XTS -l 256                -s 4096 -K /mnt/vtbd0p4.key /dev/vtbd0p4
geli attach -k /mnt/vtbd0p4.key /dev/vtbd0p4

ZFSファイルシステムの構築

両用ブート環境では vtbd0p3 → vtbd0p4 と置き換えること。

mkdir -p /tmp/zroot

# 両用ブート環境の場合はこちら #
zpool create -o cachefile=/mnt/boot/zfs/zpool.cache -o altroot=/tmp/zroot -O atime=off -O compression=lz4 -m legacy zroot vtbd0p4.eli

# BIOSブート環境またはUEFIブート環境の場合はこちら #
zpool create -o cachefile=/mnt/boot/zfs/zpool.cache -o altroot=/tmp/zroot -O atime=off -O compression=lz4 -m legacy zroot vtbd0p3.eli

mount -t zfs -o rw,noatime zroot /tmp/zroot

zfs create -o mountpoint=/home zroot/home
zfs create -o mountpoint=/tmp  zroot/tmp
zfs create -o mountpoint=/usr  zroot/usr
zfs create -o mountpoint=/var  zroot/var
zfs create zroot/usr/local
zfs create zroot/var/empty
zfs create zroot/var/log
zfs create zroot/var/spool
zfs create zroot/var/spool/mqueue
zfs create zroot/var/tmp

mkdir -p /tmp/zroot/boot /tmp/zroot/bootdir
mount -t nullfs /mnt/boot /tmp/zroot/boot

配布物のインストール

tar -xpf /usr/freebsd-dist/base.txz   -C /tmp/zroot
tar -xpf /usr/freebsd-dist/kernel.txz -C /tmp/zroot
tar -xpf /usr/freebsd-dist/lib32.txz  -C /tmp/zroot

zfs set readonly=on zroot/var/empty

起動に必要な最低限の設定の実施

/tmp/zroot/etc/fstab

※TRIM/UNMAP対応環境ではスワップタイプのオプション swsw,trimonce に変更すること(コメント参照)

# Device                Mountpoint      FStype  Options                 Dump    Pass #
zroot                   /               zfs     rw,noatime              0       0
/dev/vtbd0p3            /bootdir        ufs     rw,noatime              1       1
/bootdir/boot           /boot           nullfs  rw                      0       0
/dev/vtbd0p2            /boot/efi       msdosfs rw                      0       0
/dev/vtbd0p5.eli        none            swap    sw                      0       0
#/dev/vtbd0p5.eli       none            swap    sw,trimeonce            0       0

# Device                Mountpoint      FStype  Options                 Dump    Pass #
zroot                   /               zfs     rw,noatime              0       0
/dev/vtbd0p2            /bootdir        ufs     rw,noatime              1       1
/bootdir/boot           /boot           nullfs  rw                      0       0
/dev/vtbd0p4.eli        none            swap    sw                      0       0
#/dev/vtbd0p4.eli       none            swap    sw,trimeonce            0       0

# Device                Mountpoint      FStype  Options                 Dump    Pass #
zroot                   /               zfs     rw,noatime              0       0
/dev/vtbd0p2            /bootdir        ufs     rw,noatime              1       1
/bootdir/boot           /boot           nullfs  rw                      0       0
/dev/vtbd0p1            /boot/efi       msdosfs rw                      0       0
/dev/vtbd0p4.eli        none            swap    sw                      0       0
#/dev/vtbd0p4.eli       none            swap    sw,trimeonce            0       0

/tmp/zroot/boot/loader.conf

autoboot_delay="5"
beastie_disable="YES"

#hint.atkbdc.0.disabled="1"
#hint.atkbd.0.disabled="1"
hint.psm.0.disabled="1"

zfs_load="YES"
nullfs_load="YES"
geom_eli_load="YES"

vfs.root.mountfrom="zfs:zroot"
vfs.root.mountfrom.options="rw,noatime"

# UEFIブート環境またはBIOSブート環境ではこちらの設定を使用する #
geli_vtbd0p3_keyfile0_load="YES"
geli_vtbd0p3_keyfile0_type="vtbd0p3:geli_keyfile0"
geli_vtbd0p3_keyfile0_name="/vtbd0p3.key"

# 両用ブート環境ではこちらの設定を使用する #
#geli_vtbd0p4_keyfile0_load="YES"
#geli_vtbd0p4_keyfile0_type="vtbd0p4:geli_keyfile0"
#geli_vtbd0p4_keyfile0_name="/vtbd0p4.key"

/tmp/zroot/etc/rc.conf

keymap="jp"
keyrate="fast"
zfs_enable="YES"
clear_tmp_enable="YES"
moused_nondefault_enable="NO"

hostname="ホスト名"

defaultrouter="IPv4デフォルトゲートウェイ"
ifconfig_vtnet0="inet IPv4アドレス/ネットマスク値 up"

ipv6_defaultrouter="IPv6デフォルトゲートウェイ"
ifconfig_vtnet0_ipv6="inet6 IPv6アドレス prefixlen 64"

sshd_enable="YES"
ntpd_enable="YES"
ntpd_sync_on_start="YES"

IPv4アドレスをDHCPで取得する場合

IPv4アドレスをDHCPで動的に取得する場合、設定は下記の通りとなる。

ifconfig_vtnet0="SYNCDHCP"

この時、DHCPサーバーからの設定内容を受け取るまで待った後(待たなくていいなら ifconfig_vtnet0="DHCP" でもよいがお勧めしない)、以下の設定が行われる。

DHCPサーバーから送られてくるこれ以外の情報(例えばNTPサーバーの指定など)については標準的には処理されない。

IPv6アドレスをRAで取得する場合

IPv6アドレスをRAで動的に取得する場合、設定は下記の通りとなる。

ifconfig_vtnet0_ipv6="inet6 accept_rtadv"

以下の設定が行われる。

RAを受けてDHCP6サーバーからの追加の情報を受信したい場合(例えばNTPサーバーの指定など)については標準的には処理されない。

/tmp/zroot/etc/resolv.conf

nameserver      DNSキャッシュサーバー1
nameserver      DNSキャッシュサーバー2
nameserver      DNSキャッシュサーバー3
options         timeout:2 attempts:5

※/etc/resolv.conf の変更後、デフォルトで2秒以内に反映される(options reload-period:2 相当)。 これはDHCP等によるネームサーバーの変更を、反映させるための設定である。

/tmp/zroot/etc/localtime

tzsetup -s -C /tmp/zroot Asia/Tokyo

/tmp/zroot/etc/ntp.conf

--- /etc/ntp.conf.orig  2021-02-12 15:31:56.000000000 +0900
+++ /etc/ntp.conf       2021-02-22 18:55:21.248244000 +0900
@@ -29,8 +29,11 @@
 #
 # The option `iburst' is used for faster initial synchronization.
 #
-pool 0.freebsd.pool.ntp.org iburst
+pool NTPサーバー iburst

+interface ignore all
+interface listen vtnet0
+
 #
 # If you want to pick yourself which country's public NTP server
 # you want to sync against, comment out the above pool, uncomment
@@ -93,8 +96,8 @@
 # http://support.ntp.org/bin/view/Support/UndisciplinedLocalClock
 # The use of Orphan Mode may be preferable.
 #
-#server 127.127.1.0
-#fudge 127.127.1.0 stratum 10
+server 127.127.1.0
+fudge 127.127.1.0 stratum 10

 # See http://support.ntp.org/bin/view/Support/ConfiguringNTP#Section_6.14.
 # for documentation regarding leapfile. Updates to the file can be obtained

/tmp/zroot/etc/ssh/sshd_config

--- /etc/ssh/sshd_config.orig   2021-02-12 15:26:33.000000000 +0900
+++ /etc/ssh/sshd_config        2021-02-22 18:44:31.961963000 +0900
@@ -28,21 +28,21 @@

 # Logging
 #SyslogFacility AUTH
-#LogLevel INFO
+LogLevel VERBOSE

 # Authentication:

 #LoginGraceTime 2m
-#PermitRootLogin no
+PermitRootLogin prohibit-password
 #StrictModes yes
 #MaxAuthTries 6
 #MaxSessions 10

-#PubkeyAuthentication yes
+PubkeyAuthentication yes

 # The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
 # but this is overridden so installations will only check .ssh/authorized_keys
-AuthorizedKeysFile     .ssh/authorized_keys
+#AuthorizedKeysFile    .ssh/authorized_keys

 #AuthorizedPrincipalsFile none

@@ -58,11 +58,11 @@
 #IgnoreRhosts yes

 # Change to yes to enable built-in password authentication.
-#PasswordAuthentication no
-#PermitEmptyPasswords no
+PasswordAuthentication no
+PermitEmptyPasswords no

 # Change to no to disable PAM authentication
-#ChallengeResponseAuthentication yes
+ChallengeResponseAuthentication no

 # Kerberos options
 #KerberosAuthentication no
@@ -71,8 +71,8 @@
 #KerberosGetAFSToken no

 # GSSAPI options
-#GSSAPIAuthentication no
-#GSSAPICleanupCredentials yes
+GSSAPIAuthentication yes
+GSSAPICleanupCredentials yes

 # Set this to 'no' to disable PAM authentication, account processing,
 # and session processing. If this is enabled, PAM authentication will
@@ -97,9 +97,9 @@
 #TCPKeepAlive yes
 #PermitUserEnvironment no
 #Compression delayed
-#ClientAliveInterval 0
-#ClientAliveCountMax 3
-#UseDNS yes
+ClientAliveInterval 120
+ClientAliveCountMax 30
+UseDNS no
 #PidFile /var/run/sshd.pid
 #MaxStartups 10:30:100
 #PermitTunnel no

/tmp/zroot/root/.ssh/authorized_keys

mkdir -p /tmp/zroot/root/.ssh
# /tmp/zroot/root/.ssh/authorized_keys ファイルを編集 #

authorized_keys ファイルを設置すること。またこの時ネットワークからダウンロードできるようにしておくと便利。
ネットワークに接続して authrized_keys ファイルを取得、設置する場合は下記のような手順となる。

chroot /tmp/zroot service netif start
chroot /tmp/zroot service routing start

mount -t devfs devfs /tmp/zroot/dev
chroot /tmp/zroot fetch -o /root/.ssh/authorized_keys https://....
umount /tmp/zroot/dev

再起動する

reboot

よくある質問とその答え

Q.SHA-NIに対応したCPUなんてあるんですか?

A.2021年3月現在のIntel製CPUでは下記の状況にある。

よって事実上、サーバー・デスクトップ向けでは存在していない。モバイル向けおよび組み込み向けのCPUでのみ対応している状況である。
またAMD製CPUにおいてZENアーキテクチャから対応してるので、RYZENシリーズ(EPICシリーズ)では当たり前に対応してる。

Q.これ全部手で入力するんですか?

A.ここまでコマンドで手順化できてるなら、自動化は難しくない!と思われ。
最初から用意してくれ、という向きがあるかもしれないけど、コードだけ読まされても理解できないなら意味ないし。

クラウド環境だとシングルディスク構成がほとんどだろうから、ここに書いた手順で十分だとは思うけど、 物理環境だとマルチディスク構成を組むとして、どう設計するかは自分で考えないといけないから、
ここでの手順は参考になると思う。どこに何をどう挟み込めばいいのか、という議論はあるけど。

あくまでもFreeBSDをインストールするための基本的な振る舞いを解説したものなので、 インストーラーで完結するならば、ここまでの手順は踏まなくてよい。

何かしら調査が必要になった時の参考にしてもらえればよい。

Q.ZFSパーティションを確保するときの計算式が意味不明です。説明求む!

A.LBAは0から始まるので、次の開始位置は領域のサイズ(の累計)となる。まずこれが前提。
512KB境界は1024ブロック、1MB境界は2048ブロック、1GBは2097152ブロックとなるので、 パーティションの開始位置が各境界のブロックで割った余りが0であることを確認する。

TODO

Q.何故ISOイメージではなくメモリスティックを使わないのですか?

A.メモリスティック、つまりOSからは da0 で見えることになるのですが、これがインストール対象の メディアによっては、da0 で被る場合があり、数字がズレる場合があります(da1 など)。

よってISOイメージの場合 cd0 で認識されることから、明確にインストールメディアとは区別されるため、 積極的に使用しています。

Q.後日のメディア拡張のことを考慮するとスワップパーティションは前の方にあった方がいいのでは?

A.趣味です。完全に惰性なのでOSパーティション(freebsd-ufs)より前に移動することに異存ありません。 BSDパーティション時代では、ルートパーティション(aパーティション)の次に スワップパーティション(bパーティション)が置かれていましたが、
GPTパーティションになって、BSDパーティションを使用しなくなったことから、
ルートパーティションの次に無くてもよいことになりました。
その当時の空気感(?)のまま惰性で割り当てています。

Q.境界にアライメントするなら多少のフリー領域があってもいいのでは? 誤差ではかと

A.趣味です。今時のディスクサイズ(TB単位)を考えるとMB単位の調整は誤差と言えます(1/1000000オーダー)。 なので気にしないなら気にしないでもかまいせん。
自分は gpart show コマンド実行された際にフリー領域の表示が邪魔なので消し込んでいます。

Q.インストール時に kern.geom.label.disk_ident.enable を設定しているけど、loader.conf に指定しない理由は?

A.マウントしているデバイスについてはディスクラベルは表示対象になりません。
インストール時にはまだマウントされないため、gpart show を実行すると二重表示されます。
またディスクラベル、UUID、その他指定可能であっても、デバイス名の指定ほど短く入力できません。
以上から、自分はセットアップ時にディスクラベルを参照しないことにしています。

インストールメディアに依存しないでパーティションを指定できたりするメリットはありますが、
そう思う人が積極的に使用する分にはかまわないと思っています。

参考文献