1と46のリビジョン間の差分 (その間の編集: 45回)
2021-02-11 23:15:38時点のリビジョン1
サイズ: 8850
コメント:
2021-02-19 21:50:53時点のリビジョン46
サイズ: 44009
コメント:
削除された箇所はこのように表示されます。 追加された箇所はこのように表示されます。
行 2: 行 2:
以下の環境にFreeBSD 13.0-RELEASEをインストールする。 FreeBSD 13.0-RELEASEをインストールしてみる。
本記述は13.0-BEATA2時点での内容であるが、13.0がリリースされた後、微調整
する。
行 8: 行 9:
   * ほとんどのクラウド環境では変更不可能か、変更が困難であるため
   * 物理環境では変更しやすいし、メンテナンス性も高いが、設定の統一性から見なかったことにする。
   * 高度な物理環境では、内部時間と表示時間(タイムゾーン情報を有す)を変えられるものもてきたので、昔ほどJSTにこだわらなくてもよい。
   * ほとんどのクラウド環境では本設定を変更することができないか、極めて困難である。
   * 物理環境では変更しやすいし、メンテナンス性も高いのだが、設定の統一性から見なかったことにする。
   * よく出来た物理環境では、内部時間と表示時間(タイムゾーン情報を有す)を変えられるものもてきたので、昔ほどJSTにこだわらなくてもよい。
 * CPUについては特に明記しないし、1コアからでも使用できるが、2コア以上をお勧めしたい。
   * 使用する用途に応じてCPU数や動作周波数、アーキテクチャを選ぶこと。
   * 基本的には「時間」に影響出るが、投入したリソースに応じて反比例(少ないと時間がかかる、多いと時間が短縮される)する。
行 12: 行 16:
   * カツっカツにチューニングすれば512MBでも動作するが、その後何もできない。
   * FreeBSD本体のビルドに6GBは必要なので、3GBや2GBだとスワップアウトがキツイ。
   * カツっカツにチューニングすれば512MBでも動作するが、その後はあまりできることが少ない。
   * FreeBSD本体のビルドに6GBは必要なので、3GBや2GBの環境だとスワップアウトがキツイ。
行 16: 行 20:
 * インストール先メディア(ストレージ)に応じてデバイス名を読み替えること。今回、ここでは vtbdn(n≧0) を使用する。
   * ada: SATA接続のHDDおよびSSD
   * da: USB/SAS/SCSI接続の(マスストレージ)HDDおよびSSD
   * nvd: NVMe接続SSD
   * mmscd: eMMC(内蔵メモリカード)
   * vtbd: バーチャルI/Oストレージ(QEMU、BHyVe環境他)
   * xbd: Xen準仮想化ドライバ(Xen環境)
 * 搭載ストレージもできれば50GB以上は欲しいところ。
   * 30GB程度では一通りのセットアップで埋まってしまう程度の容量なので、大きめに欲しいところ。
   * 用途にもよるがログ保存等を考慮すると100GB程度あれば安心である。
* インストール先メディア(ストレージ)に応じてデバイス名を読み替えること。今回、ここでは vtbd''n''(''n''≧0) を使用する。
   * ada''n'': SATA接続のHDDおよびSSD
   * da''n'': USB/SAS/SCSI接続の(マスストレージ)HDDおよびSSD
   * nvd''n'': NVMe接続SSD
   * mmscd''n'': eMMC(内蔵メモリカード)
   * vtbd''n'': バーチャルI/Oストレージ(QEMU、BHyVe環境他)
   * xbd''n'': Xen準仮想化ドライバ(Xen環境)

== 設定目標 ==
行 29: 行 38:
   * ブートパーティション: BIOS環境=1KB弱、UEFI環境=200MB
   * UFSパーティション: 4GB ※実用512B・2倍の1GB程度はあった方がよい
   * ブートパーティション: BIOS環境=12KB弱、UEFI環境=200MB程度
   * UFSパーティション: 4GB ※実用512B・最低でも2倍の1GB程度はあった方がよい
行 32: 行 41:
   * スワップパーティション: 8GB ※搭載メモリの2倍で最大8GB程度に
 * またパーティション境界を可能な限り「各種」境界を考慮して割り当てるが、とりあえず1MB境界を目指す。
   * 最初は1ブロック512バイトであるが、
   * スワップパーティション: 8GB程度 ※搭載メモリの2倍で最大8GB程度に
 * スワップについてメモ:
   * スワップはおおよそ「搭載メモリの2倍」で確保だが、一定量を超えると使用しなく(て良いように)なるため、この辺りで打ち止めしておくのがよい。
   * またどれほど搭載メモリが多くてもゼロスワップ運用はお勧めしない。
   * カーネルがメモリのガベージコレクトする時にスワップを使用することがあるので、巨大な連続領域を確保できなくなることがありうる。
 * またパーティション境界を可能な限り「各種」境界を考慮して割り当てることを目指す。とりあえず1MB境界で設定する。
   * 1ブロック512バイトが最小単位であるが、
行 37: 行 50:
   * HDD SMRのブロック単位(256MB)を考慮し結果    * HDD SMRのブロック単位(256MB)を考慮しての結果
行 39: 行 52:

== インストール目標 ==
以下のパーティション構成を組む。

||||||||||<#777777> BIOSブート環境 ||
||<#FFFF00> パーティション番号 ||<#FFFF00> パーティション種別 ||<#FFFF00> 用途 ||<#FFFF00> サイズ ||<#FFFF00> 注意 ||
|| - || GPTヘッダー || Protected MBR ブート || 32 ブロック  || UEFIブート環境では使用しない。またエントリ数(128)は変更しない(起動しない)。 ||
|| - || フリー領域 || 境界補正 || 8 ブロック  || 次のパーティションの開始を4KB境界に補正する(無い環境もある)。 ||
|| 1 || freebsd-boot || BIOS用FreeBSDブート領域 || 984 ブロック  || UFS領域を512KB境界に補正するためのサイズを指定。 ||
|| 2 || freebsd-ufs || UFS領域(/boot として使用) || 8387584 ブロック  || ZFS領域を1MB境界に補正するために、4GBに-512KB(ブート領域分)を指定。 ||
|| 3 || freebsd-zfs || ZFS領域(/ として使用) || ※都度計算※ || スワップを 2048 ブロック(=1MB)境界に補正するためのサイズを指定。 ||
|| 4 || freebsd-swap || スワップ領域(搭載メモリの2倍≦8GB) || 16777216 ブロック~ || 8GB+補正分。 ||
||||||||||<#777777> UEFIブート環境 ||
||<#FFFF00> パーティション番号 ||<#FFFF00> パーティション種別 ||<#FFFF00> 用途 ||<#FFFF00> サイズ ||<#FFFF00> 注意 ||
|| - || GPTヘッダー || Protected MBR ブート || 32 ブロック  || UEFIブート環境では使用しない。またエントリ数(128)は変更しない(起動しない)。 ||
|| - || フリー領域 || 境界補正 || 8 ブロック  || 次のパーティションの開始を4KB境界に補正する(無い環境もある)。 ||
|| 1 || uefi || UEFI領域(FAT32フォーマット) || 409560 ブロック  || UFS領域を200MB境界に補正した(-40ブロック)サイズを指定。 ||
|| 2 || freebsd-ufs || UFS領域(/boot として使用) || 8388608 ブロック  || 4GBフルサイズを指定(自動的に境界配置となるため)。 ||
|| 3 || freebsd-zfs || ZFS領域(/ として使用) || ※都度計算※ || スワップを 2048 ブロック(=1MB)境界に補正するためのサイズを指定。 ||
|| 4 || freebsd-swap || スワップ領域(搭載メモリの2倍≦8GB) || 16777216 ブロック~ || 8GB+補正分。 ||
   * SMRの256MBについては、実運用とのバランスを考えると考慮に値しなくてよい(OS用に使うべきで無い)。
   * SSDのページ、ブロックの単位は大容量化にともない大きくなっていくので、この数字が正しいとは限らない。
 * UFSブート、ZFSルート構成についてのメリットとデメリット。
   * 構造がシンプルでないので若干の小細工が必要。
   * インストーラーからインストールできないので、全ての手順でコマンドを叩く必要がある。
   * その代わりブートローダーがZプールの最新に対応してなくてよいので安心して `zpool upgrade` ができる。
   * パスフレーズとキーファイルによるZFS領域の暗号化(GELI)が可能(パスフレーズのみでいいならブートローダーからでも可)。
 * ZFS領域とスワップ領域については暗号化を施す。
   * ブート時点からセキュアでは無いが、セキュアブートの仕組みが今のところ確立されてないので、この辺りが限界。
   * クラウド環境でセキュアブートの仕組みが提供されていることがないので、頑張る余地があるか微妙。
   * 逆にクラウド環境では暗号化の仕組みが用意されているのでそちらを利用すること。
   * 個別に本手順を実施する分には問題無いが、イメージそのままでデプロイすると、同じ暗号化鍵を使ったイメージがコピーされるのでよろしい運用では無い。
   * 当然暗号鍵の変更をオンザフライでできるが、どれくらい時間がかかるかは不明。
   * 本手順の場合、キーファイルを消去(参照不能なレベルで)するだけで廃棄可能。パスフレーズは同じでも問題ない。
   * 今時のCPUは、AES-NI対応については疑義は無いが、SHA-NI対応については限定的なので、その点を考慮した設定を行う。
 * TRIM/UNMAPを考慮(最適化)する。
   * `sysctl kern.geom.disk.デバイス名.flags` を実行して `CANDELETE` の表示があれば、TRIM/UNMAPに対応している。
   * この表示が無ければTRIM/UNMAPに対応してないことを意味する。

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

||||||||||<#CCCCCC> BIOSブート環境 ||
||<#FFFF00> パーティション番号 ||<#FFFF00> パーティション種別 ||<#FFFF00> 用途 ||<#FFFF00> サイズ ||<#FFFF00> 注意 ||
||<:> - || 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+補正分。 ||
||||||||||<#CCCCCC> UEFIブート環境 ||
||<#FFFF00> パーティション番号 ||<#FFFF00> パーティション種別 ||<#FFFF00> 用途 ||<#FFFF00> サイズ ||<#FFFF00> 注意 ||
||<:> - || 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+補正分。 ||
||||||||||<#CCCCCC> BIOSブート環境・UEFIブート環境ともに共存する環境(両用ブート環境と呼称) ||
||<#FFFF00> パーティション番号 ||<#FFFF00> パーティション種別 ||<#FFFF00> 用途 ||<#FFFF00> サイズ ||<#FFFF00> 注意 ||
||<:> - || 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+補正分。 ||

 * `freebsd-boot` パーティションのサイズ制限は [[https://www.freebsd.org/cgi/man.cgi?gpart(8)|gpart(8) のマニュアル]] の `BOOTSTRAPPING` 節に記述がある。
 * BIOSおよびUEFIどちらの環境でもブート可能なよう構成することは可能だが、実機環境の切り替え動作は未検証。
 * GPTエントリ数(デフォルト128)は変更しない。変更すると起動しないことが [[https://www.freebsd.org/cgi/man.cgi?gptboot(8)|gptboot(8)]] と [[https://www.freebsd.org/cgi/man.cgi?gptzfsboot(8)|gptzfsboot(8)]] のマニュアルに明記されている。
行 62: 行 102:
OS起動後になるが、以下のコマンドで環境を確認できる。 OS起動後になるが、以下のコマンドで環境を確認できる。実際にインストール時に確認すること。
以下はある環境での実行結果である。

{{attachment:check-list-environment.png||width="50%",height="50%"}}
行 65: 行 108:
{{{
sysctl machdep.bootmethod
}}}

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

=== ディスク一覧 ===
{{{
geom disk status
}}}

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

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

=== ディスク一覧 ===
{{{
geom disk status
}}}

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

{{{#!highlight console numbers=disable
# geom disk status
root@:~ # geom disk status
行 88: 行 131:
=== 時刻 ===
{{{
=== TRIM/UNMAP対応の確認 ===
{{{
sysctl kern.geom.disk.デバイス名.flags
}}}

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

{{{#!highlight console numbers=disable
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
行 93: 行 156:
=== 起動時チューニング ===

=== ランタイムチューニング ===

== 検証環境 ==
`sysctl machdep.wall_cmos_clock` の結果が0であること。`date` の結果が日本時間から9時間前で「UTC」を含むこと。

= インストール =

== インストールメディアの入手 ==
 * [[https://download.freebsd.org/ftp/releases/ISO-IMAGES/13.0/|Index of /ftp/releases/ISO-IMAGES/13.0]]より、`FreeBSD-13.0-amd64-disc1.iso` というISOイメージファイルをダウンロードする。
   * 今回 amd64 環境、いわゆる x86_64 環境にインストールするものとする。
   * arm64 と名称が似ているが、こちらは arm64-aarch64 環境と別物なので注意。
   * また dvd1 ではなく disc1 である。幸い dvd1 は disc1 を内包しているので、無駄を承知で使用してもよい。
   * その代わり bootonly では必要なものが足りないので、ネットにアクセスできる必要がある(ここでは詳細を取り上げない)。
 * このISOイメージをCDメディアとして認識させる。
   * 物理的にはもちろん、CD-Rに焼いてもかまわない。
   * 個人的には [[https://www.hagisol.co.jp/products/usb_cdmemory2/|Hagiwara Solutions 社製 CD Memory2]] の使用をお勧めする。
   * 入手性については [[https://online.plathome.co.jp/|ぷらっとオンライン]] が一番確実である。
   * ISOイメージの書き込みに専用ソフト([[https://www.hagisol.co.jp/download/cd_memory/cdm2_writer/|CDM2 Writer]])を必要とするが、
   * 読み取り処理はCDROMドライブのエミュレーションしか行わないので、非常に互換性が高い。
   * 似たようなハードは売られているので、使い慣れた物を使用しても問題無い。

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

{{attachment:beastie-on-boot.png||width="50%",height="50%"}}

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

{{attachment:prompt-on-boot.png||width="50%",height="50%"}}

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

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

 * `hint.psm.0.disabled`: PS/2マウス(USB接続ではない)の識別(1秒かかる)を止める。
 * `kern.geom.label.disk_ident.enable`: `gpart show` を実行したときに同じストレージをラベルで参照することを止める(結果として二重表示になる)。

{{attachment:setting-on-boot.png||width="50%",height="50%"}}

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

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

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

{{attachment:start-bsdinstall.png||width="50%",height="50%"}}

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

{{attachment:start-console-login.png||width="50%",height="50%"}}

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

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

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

=== パーティションを切る ===
BIOSブート環境の場合、以下の手順でパーティションを切る(設定状態を都度 `gpart show` で確認できる)。

{{{#!highlight shell numbers=disable
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
}}}

UEFIブート環境の場合、以下の手順でパーティションを切る(設定状態を都度 `gpart show` で確認できる)。

{{{#!highlight shell numbers=disable
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
}}}

両用ブート環境の場合、以下の手順でパーティションを切る(設定状態を都度 `gpart show` で確認できる)。

{{{#!highlight shell numbers=disable
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
}}}

=== ファイルシステムをフォーマットする ===
TRIM/UNMAP対応の場合、以下の手順でフォーマットする(両用ブート環境では vtbd0p2 → vtbd0p3 と置き換えること)。

{{{#!highlight shell numbers=disable
newfs -U -j -E -t /dev/vtbd0p2
}}}

TRIM/UNMAPに未対応の場合、以下の手順でフォーマットする(両用ブート環境では vtbd0p2 → vtbd0p3 と置き換えること)。

{{{#!highlight shell numbers=disable
newfs -U -j /dev/vtbd0p2
}}}

更にUEFIブート環境の場合、以下の手順でフォーマットする(両用ブート環境では vtbd0p1 → vtbd0p2 と置き換えること)。

{{{#!highlight shell numbers=disable
newfs_msdos -F 32 -c 1 -L EFISYS /dev/vtbd0p1
}}}

=== フォーマットしたファイルシステムをマウントしてディレクトリを準備する ===
以下の手順を実施する(両用ブート環境では vtbd0p2 → vtbd0p3 と置き換えること)。

{{{#!highlight shell numbers=disable
mount -t ufs -o rw,async,noatime /dev/vtbd0p2 /mnt
mkdir -p /mnt/boot/efi
}}}

更にUEFIブート環境の場合、以下の手順を実施する(両用ブート環境では vtbd0p1 → vtbd0p2 と置き換えること)。

{{{#!highlight shell numbers=disable
mount -t msdosfs /dev/vtbd0p1 /mnt/boot/efi
mkdir -p /mnt/boot/efi/EFI/BOOT
}}}

=== ブートローダーをインストールする ===
BIOSブート環境の場合、以下の手順でブートローダーをインストールする。

{{{#!highlight shell numbers=disable
gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 vtbd0
}}}

UEFIブート環境の場合、以下の手順でブートローダーをインストールする。

{{{#!highlight shell numbers=disable
cp -a /boot/loader.efi /mnt/boot/efi/EFI/BOOT/BOOTX64.efi

}}}

=== パーティションを暗号化(GELI)する ===
SHA-NIに対応している場合、以下の手順でZFSパーティションを暗号化(GELI)を施す(両用ブート環境では vtbd0p3 → vtbd0p4 と置き換えること)。

{{{#!highlight shell numbers=disable
kldload geom_eli

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

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に未対応の場合、以下の手順でZFSパーティションを暗号化(GELI)を施す(両用ブート環境では vtbd0p3 → vtbd0p4 と置き換えること)。

{{{#!highlight shell numbers=disable
kldload geom_eli

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

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ファイルシステムの構築 ===
両用ブート環境では vtbd0p3 → vtbd0p4 と置き換えること。

{{{#!highlight shell numbers=disable
mkdir -p /tmp/zroot
zpool create -R /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/src
zfs create zroot/usr/obj
zfs create zroot/usr/ports
zfs create zroot/usr/ports/distfiles
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
}}}

=== 配布物のインストール ===
{{{#!highlight shell numbers=disable
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 ===
BIOSブート環境の場合、以下の内容でファイルを作成する(TRIM/UNMAP対応環境では sw → sw,trimonce に置き換えること)。

{{{
# 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
}}}

UEFIブート環境の場合、以下の内容でファイルを作成する(TRIM/UNMAP対応環境では sw → sw,trimonce に置き換えること)。

{{{
# 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
}}}

両用ブート環境の場合、以下の内容でファイルを作成する(TRIM/UNMAP対応環境では sw → sw,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
}}}

=== /tmp/zroot/boot/loader.conf ===
両用ブート環境では vtbd0p3 → vtbd0p4 と置き換えること。

{{{
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"

geli_vtbd0p3_keyfile0_load="YES"
geli_vtbd0p3_keyfile0_type="vtbd0p3:geli_keyfile0"
geli_vtbd0p3_keyfile0_name="/vtbd0p3.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"
}}}

 * キーマップは日本語キーボードの場合 `jp` で、英語キーボードの場合は `us` で設定する。
 * IPv4が無い環境では `defaultrouter` と `ifconfig_vtnet0` の設定は不要。
 * IPv6が無い環境では `ipv6_defaultrouter` と `ifconfig_vtnet0_ipv6` の設定は不要。
 * IPv6については指定されたインターフェースのみIPv6が設定されるようになっている。
 * 設定のあるインターフェース以外でも「積極的に」IPv6を使用したい場合、`ipv6_activate_all_interfaces="YES"` という設定を追加で入れる。

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

{{{
ifconfig_vtnet0="SYNCDHCP"
}}}

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

 * ホスト名(`hostname` 設定相当)
 * 指定したNIC(`vtnet0`)に対するIPv4アドレス(`ifconfig_vtnet0` 設定相当)
 * デフォルトゲートウェイ(`defaultrouter` 設定相当)
 * DNSキャッシュサーバー情報(`/etc/resolv.conf` 置き換え)
   * DHCPを使用する場合 `/etc/resolv.conf` の事前設定された内容は保証されない(消えることがある)。
   * よってDHCPで置き換えて欲しくない設定や、足りない設定の付与等については、`/etc/resolvconf.conf` にて制御する。
 * その他
   * インターフェースのメディア設定
   * インターフェースのMTU設定
   * 静的ルーティング設定(クラスレスまたはクラスフル)

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

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

{{{
ifconfig_vtnet0_ipv6="inet6 accept_rtadv"
}}}

以下の設定が行われる。

 * 指定したNIC(`vtnet0`)に対するIPv6アドレス(`ifconfig_vtnet0_ipv6` 設定相当)
 * デフォルトゲートウェイ(`ipv6_defaultrouter` 設定相当)
 * DNSキャッシュサーバー情報(`/etc/resolv.conf` 置き換え)
   * RAを使用する場合 `/etc/resolv.conf` の事前設定された内容は保証されない(消えることがある)。
   * よってRAで置き換えて欲しくない設定や、足りない設定の付与等については、`/etc/resolvconf.conf` にて制御する。

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

=== /tmp/zroot/etc/resolv.conf ===
{{{
nameserver DNSキャッシュサーバー1
nameserver DNSキャッシュサーバー2
nameserver DNSキャッシュサーバー3
options edns0 timeout:2 attempts:5
}}}

 * DNSキャッシュサーバーを複数指定する(最低でも2台)。
 * デフォルトのタイムアウト値は5秒、繰り返し回数は2回(サーバー台数×繰り返し回数がリトライ回数となる)なので調整する。
 * 具体的にはタイムアウト値は2秒(最大30秒)、繰り返し回数を5回(最大5回)に設定する。
 * これはDNSキャッシュサーバーの障害に対して早期に回復を図るための設定である。

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

=== /tmp/zroot/etc/localtime ===
{{{#!highlight shell numbers=disable
tzsetup -s -C /tmp/zroot Asia/Tokyo
}}}

=== /tmp/zroot/etc/ntp.conf ===
{{{#!highlight udiff numbers=disable
--- /etc/ntp.conf.orig 2021-02-12 15:31:56.000000000 +0900
+++ /etc/ntp.conf 2021-02-14 17:49:37.089165000 +0900
@@ -29,7 +29,7 @@
 #
 # The option `iburst' is used for faster initial synchronization.
 #
-pool 0.freebsd.pool.ntp.org iburst
+pool NTPサーバー iburst

 #
 # If you want to pick yourself which country's public NTP server
@@ -95,6 +95,8 @@
 #
 #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
}}}

 * 指定されたNTPサーバーが3台以上で「なければ」、追加で `pool ntp.nict.jp iburst` 行を追加すること。
 * NTPサーバーの台数はIPアドレス単位でカウントするので `drill NTPサーバー` を実行して、`ANSWER SECTION` 以下のIPアドレスの個数を数えること。
 * また指定されたサーバーのIPが1つなら、`pool` ではなく `server NTPサーバー` と指定してもよい。
 * NTPサーバーは最低でも3台(=3IP)を指定すべき。

=== /tmp/zroot/etc/ssh/sshd_config ===
{{{#!highlight udiff numbers=disable
--- /etc/ssh/sshd_config.orig 2021-02-12 06:26:33.000000000 +0000
+++ /etc/ssh/sshd_config 2021-02-14 10:26:06.896045000 +0000
@@ -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

@@ -50,7 +50,7 @@
 #AuthorizedKeysCommandUser nobody

 # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
-#HostbasedAuthentication no
+HostbasedAuthentication no
 # Change to yes if you don't trust ~/.ssh/known_hosts for
 # HostbasedAuthentication
 #IgnoreUserKnownHosts no
@@ -58,20 +58,20 @@
 #IgnoreRhosts yes

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

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

 # Kerberos options
-#KerberosAuthentication no
+KerberosAuthentication no
 #KerberosOrLocalPasswd yes
 #KerberosTicketCleanup yes
 #KerberosGetAFSToken no

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

 # Set this to 'no' to disable PAM authentication, account processing,
@@ -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 ===
{{{#!highlight shell numbers=disable
mkdir -p /tmp/zroot/root/.ssh
# /tmp/zroot/root/.ssh/authorized_keys ファイルを編集 #
}}}

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

{{{#!highlight shell numbers=disable
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
}}}

=== /mnt/boot/zfs/zpool.cache ===
{{{#!highlight shell numbers=disable
umount /tmp/zroot/boot

zpool export zroot
zpool import -o cachefile=/mnt/boot/zfs/zpool.cache -o altroot=/tmp/zroot zroot
zpool export zroot
zpool import zroot
}}}

=== 再起動する ===
{{{#!highlight shell numbers=disable
reboot
}}}

= よくある質問とその答え =

== Q.SHA-NIに対応したCPUなんてあるんですか? ==
A.2021年2月現在のIntel製CPU(Cooper Lake、Comet Lake、Tiger Lake、Tremont)において、サーバー(Ice Lake-SP 以降)・デスクトップ(Rocket Lake 以降)向けでは存在しない。<<BR>>
モバイル(Ice Lake 以降)向けおよび組み込み(Goldmont 以降)向けのCPUでのみ対応している状況である。<<BR>>
またAMD製CPUにおいてZENアーキテクチャから対応してるので、RYZENシリーズ(EPICシリーズ)では当たり前に対応してると言える。

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

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

== Q.ZFSパーティションを確保するときの計算式が意味不明です。説明求む! ==
A.LBAは0から始まるので、次の開始位置は領域のサイズ(の累計)となる。まずこれが前提。<<BR>>
512KB境界は1024ブロック、1MB境界は2048ブロック、1GBは2097152ブロックとなるので、
パーティションの開始位置が各境界のブロックで割った余りが0であることを確認する。

TODO

= 参考文献 =
 * FreeBSD13
   * [[https://www.freebsd.org/releases/13.0R/announce/|FreeBSD 13.0-RELEASE Announcement]]
   * [[https://www.freebsd.org/releases/13.0R/relnotes/|FreeBSD 13.0-RELEASE Release Notes]]
 * マニュアル
   * [[https://www.freebsd.org/cgi/man.cgi?adjkerntz(8)|adjkerntz(8)]] ※CMOSクロックの取り扱いに関するマニュアル
   * [[https://www.freebsd.org/cgi/man.cgi?gpart(8)|gpart(8)]] ※パーティションの取り扱いに関するマニュアル
   * [[https://www.freebsd.org/cgi/man.cgi?gptboot(8)|gptboot(8)]] ※`freebsd-boot` パーティションにインストールするブートローダ(UFS専用)に関するマニュアル
   * [[https://www.freebsd.org/cgi/man.cgi?gptzfsboot(8)|gptzfsboot(8)]] ※`freebsd-boot` パーティションにインストールするブートローダ(ZFS専用)に関するマニュアル
   * [[https://www.freebsd.org/cgi/man.cgi?geli(8)|geli(8)]] ※GEOM層における暗号処理機能に関するマニュアル
   * [[https://www.freebsd.org/cgi/man.cgi?loader.conf(5)|loader.conf(5)]] ※`/boot/loader.conf`に関するマニュアル
   * [[https://www.freebsd.org/cgi/man.cgi?rc.conf(5)|rc.conf(5)]] ※`/etc/rc.conf`に関するマニュアル
 * パーティショニング・ブート処理に関する参考文献
   * [[https://qiita.com/nanorkyo/items/429d7382a418b38de4d3|BIOSブートとUEFIブートでGPTパーティションの違いと作り方]]
   * [[https://qiita.com/mzaki/items/76acac14c16ac6789e68|FreeBSDのブートプロセス]]
   * [[https://decomo.info/wiki/blog/2021/2021-01-09|loader.efiで任意のパーティションのFreeBSDをブートする]]
   * [[https://decomo.info/wiki/blog/2021/2021-01-07|FreeBSDのboot1.efiがもう使われていなかった件]]
   * [[https://decomo.info/wiki/blog/2021/2021-01-12|LinuxがGPTを1MB確保するのはWindowsとの互換性のため]]
   * [[https://freebsdfoundation.org/freebsd-uefi-secure-boot/|FreeBSD UEFI Secure Boot]]
 * ハードウェア情報
   * [[https://pc.watch.impress.co.jp/docs/topic/spec/intel_cpu_spec.html|デスクトップ向けIntelプロセッサー・ナンバー一覧表]]
   * [[https://pc.watch.impress.co.jp/docs/topic/spec/intel_mobile_spec.html|モバイル向けIntelプロセッサー・ナンバー一覧表]]
   * [[https://pc.watch.impress.co.jp/docs/topic/spec/amd_cpu_spec.html|AMDモデルナンバー一覧表]]
   * [[https://pc.watch.impress.co.jp/docs/news/1290259.html|Intel、「Ice Lake世代の32コアXeonは64コアEPYCを上回る性能」]]
   * [[https://pc.watch.impress.co.jp/docs/news/1286191.html|Intel、デスクトップ向け第11世代Core「Rocket Lake-S」の詳細を発表]]
   * [[https://pc.watch.impress.co.jp/docs/news/1274802.html|第11世代Core「Tiger Lake」の新要素まとめ]]
   * [[https://pc.watch.impress.co.jp/docs/news/1270784.html|Intel、2021年にCore/Atom両系統のCPUを搭載したクライアントPC向けCPU「Alder Lake」を投入へ]]
   * [[https://pc.watch.impress.co.jp/docs/news/1260063.html|Intel、bfloat16対応の第3世代Xeon SP「Cooper Lake」を投入]]

FreeBSD13のインストール

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

前提条件

  • CMOS(BIOS)クロックのタイムゾーンをUTCとする。
    • ほとんどのクラウド環境では本設定を変更することができないか、極めて困難である。
    • 物理環境では変更しやすいし、メンテナンス性も高いのだが、設定の統一性から見なかったことにする。
    • よく出来た物理環境では、内部時間と表示時間(タイムゾーン情報を有す)を変えられるものも出てきたので、昔ほどJSTにこだわらなくてもよい。
  • CPUについては特に明記しないし、1コアからでも使用できるが、2コア以上をお勧めしたい。
    • 使用する用途に応じてCPU数や動作周波数、アーキテクチャを選ぶこと。
    • 基本的には「時間」に影響出るが、投入したリソースに応じて反比例(少ないと時間がかかる、多いと時間が短縮される)する。
  • 搭載メモリはできれば4GB以上にしておきたい。
    • カツっカツにチューニングすれば512MBでも動作するが、その後はあまりできることが少ない。
    • FreeBSD本体のビルドに6GBは必要なので、3GBや2GBの環境だとスワップアウトがキツイ。
    • これはC++のコンパイル負荷によるものなので、搭載メモリが少ない環境でのビルド(サードパーティ製含む)は諦めた方がよい。
    • 良好に使用するなら8GB以上は欲しいところではある。
  • 搭載ストレージもできれば50GB以上は欲しいところ。
    • 30GB程度では一通りのセットアップで埋まってしまう程度の容量なので、大きめに欲しいところ。
    • 用途にもよるがログ保存等を考慮すると100GB程度あれば安心である。
  • インストール先メディア(ストレージ)に応じてデバイス名を読み替えること。今回、ここでは vtbd≧0) を使用する。

    • ada: SATA接続のHDDおよびSSD

    • da: USB/SAS/SCSI接続の(マスストレージ)HDDおよびSSD

    • nvd: NVMe接続SSD

    • mmscd: eMMC(内蔵メモリカード)

    • vtbd: バーチャルI/Oストレージ(QEMU、BHyVe環境他)

    • xbd: Xen準仮想化ドライバ(Xen環境)

設定目標

  • 全てGPTパーティション(領域)で組むものとして、BIOSまたはUEFI環境での起動を前提とする(マルチブートは考えない)。
    • BIOSまたはUEFIがブート用に認識するパーティション
    • /boot 用パーティション(UFSで構成する)
    • / 用のパーティション(ZFSで構成する)
    • スワップパーティション
  • またこの時以下のサイズを割り当てる。
    • ブートパーティション: BIOS環境=512KB弱、UEFI環境=200MB程度
    • UFSパーティション: 4GB弱 ※実用512MB・最低でも2倍の1GB程度はあった方がよい
    • ZFSパーティション: 残りサイズを計算して割り当て
    • スワップパーティション: 8GB程度 ※搭載メモリの2倍で最大8GB程度に
  • スワップについてメモ:
    • スワップはおおよそ「搭載メモリの2倍」で確保だが、一定量を超えると使用しなく(て良いように)なるため、この辺りで打ち止めしておくのがよい。
    • またどれほど搭載メモリが多くてもゼロスワップ運用はお勧めしない。
    • カーネルがメモリのガベージコレクトする時にスワップを使用することがあるので、巨大な連続領域を確保できなくなることがありうる。
  • またパーティション境界を可能な限り「各種」境界を考慮して割り当てることを目指す。とりあえず1MB境界で設定する。
    • 1ブロック512バイトが最小単位であるが、
    • 4KBセクタードライブであったり、
    • SSDのページ単位(2KB~)・ブロック単位(128KB~)を考慮したり、
    • HDD SMRのブロック単位(256MB)を考慮しての結果。
    • 容量とのバランスで1MB程度にしておく。そのうち1GB単位にしてもいいかもしれない。
    • SMRの256MBについては、実運用とのバランスを考えると考慮に値しなくてよい(OS用に使うべきで無い)。
    • SSDのページ、ブロックの単位は大容量化にともない大きくなっていくので、この数字が正しいとは限らない。
  • UFSブート、ZFSルート構成についてのメリットとデメリット。
    • 構造がシンプルでないので若干の小細工が必要。
    • インストーラーからインストールできないので、全ての手順でコマンドを叩く必要がある。
    • その代わりブートローダーがZプールの最新に対応してなくてよいので安心して zpool upgrade ができる。

    • パスフレーズとキーファイルによるZFS領域の暗号化(GELI)が可能(パスフレーズのみでいいならブートローダーからでも可)。
  • ZFS領域とスワップ領域については暗号化を施す。
    • ブート時点からセキュアでは無いが、セキュアブートの仕組みが今のところ確立されてないので、この辺りが限界。
    • クラウド環境でセキュアブートの仕組みが提供されていることがないので、頑張る余地があるか微妙。
    • 逆にクラウド環境では暗号化の仕組みが用意されているのでそちらを利用すること。
    • 個別に本手順を実施する分には問題無いが、イメージそのままでデプロイすると、同じ暗号化鍵を使ったイメージがコピーされるのでよろしい運用では無い。
    • 当然暗号鍵の変更をオンザフライでできるが、どれくらい時間がかかるかは不明。
    • 本手順の場合、キーファイルを消去(参照不能なレベルで)するだけで廃棄可能。パスフレーズは同じでも問題ない。
    • 今時のCPUは、AES-NI対応については疑義は無いが、SHA-NI対応については限定的なので、その点を考慮した設定を行う。
  • TRIM/UNMAPを考慮(最適化)する。
    • sysctl kern.geom.disk.デバイス名.flags を実行して CANDELETE の表示があれば、TRIM/UNMAPに対応している。

    • この表示が無ければTRIM/UNMAPに対応してないことを意味する。

インストール設定

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

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+補正分。

  • freebsd-boot パーティションのサイズ制限は gpart(8) のマニュアルBOOTSTRAPPING 節に記述がある。

  • BIOSおよびUEFIどちらの環境でもブート可能なよう構成することは可能だが、実機環境の切り替え動作は未検証。
  • GPTエントリ数(デフォルト128)は変更しない。変更すると起動しないことが gptboot(8)gptzfsboot(8) のマニュアルに明記されている。

環境確認方法

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

sysctl machdep.wall_cmos_clock の結果が0であること。date の結果が日本時間から9時間前で「UTC」を含むこと。

インストール

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

  • Index of /ftp/releases/ISO-IMAGES/13.0より、FreeBSD-13.0-amd64-disc1.iso というISOイメージファイルをダウンロードする。

    • 今回 amd64 環境、いわゆる x86_64 環境にインストールするものとする。
    • arm64 と名称が似ているが、こちらは arm64-aarch64 環境と別物なので注意。
    • また dvd1 ではなく disc1 である。幸い dvd1 は disc1 を内包しているので、無駄を承知で使用してもよい。
    • その代わり bootonly では必要なものが足りないので、ネットにアクセスできる必要がある(ここでは詳細を取り上げない)。
  • このISOイメージをCDメディアとして認識させる。
    • 物理的にはもちろん、CD-Rに焼いてもかまわない。
    • 個人的には Hagiwara Solutions 社製 CD Memory2 の使用をお勧めする。

    • 入手性については ぷらっとオンライン が一番確実である。

    • ISOイメージの書き込みに専用ソフト(CDM2 Writer)を必要とするが、

    • 読み取り処理はCDROMドライブのエミュレーションしか行わないので、非常に互換性が高い。
    • 似たようなハードは売られているので、使い慣れた物を使用しても問題無い。

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

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
  • hint.psm.0.disabled: PS/2マウス(USB接続ではない)の識別(1秒かかる)を止める。

  • kern.geom.label.disk_ident.enablegpart show を実行したときに同じストレージをラベルで参照することを止める(結果として二重表示になる)。

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」を入力してエンターキーを押す(パスワード入力は求められない)。

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

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

パーティションを切る

BIOSブート環境の場合、以下の手順でパーティションを切る(設定状態を都度 gpart show で確認できる)。

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

UEFIブート環境の場合、以下の手順でパーティションを切る(設定状態を都度 gpart show で確認できる)。

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

両用ブート環境の場合、以下の手順でパーティションを切る(設定状態を都度 gpart show で確認できる)。

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

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

TRIM/UNMAP対応の場合、以下の手順でフォーマットする(両用ブート環境では vtbd0p2 → vtbd0p3 と置き換えること)。

newfs -U -j -E -t /dev/vtbd0p2

TRIM/UNMAPに未対応の場合、以下の手順でフォーマットする(両用ブート環境では vtbd0p2 → vtbd0p3 と置き換えること)。

newfs -U -j /dev/vtbd0p2

更にUEFIブート環境の場合、以下の手順でフォーマットする(両用ブート環境では vtbd0p1 → vtbd0p2 と置き換えること)。

newfs_msdos -F 32 -c 1 -L EFISYS /dev/vtbd0p1

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

以下の手順を実施する(両用ブート環境では vtbd0p2 → vtbd0p3 と置き換えること)。

mount -t ufs -o rw,async,noatime /dev/vtbd0p2 /mnt
mkdir -p /mnt/boot/efi

更にUEFIブート環境の場合、以下の手順を実施する(両用ブート環境では vtbd0p1 → vtbd0p2 と置き換えること)。

mount -t msdosfs /dev/vtbd0p1 /mnt/boot/efi
mkdir -p /mnt/boot/efi/EFI/BOOT

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

BIOSブート環境の場合、以下の手順でブートローダーをインストールする。

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

UEFIブート環境の場合、以下の手順でブートローダーをインストールする。

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

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

SHA-NIに対応している場合、以下の手順でZFSパーティションを暗号化(GELI)を施す(両用ブート環境では vtbd0p3 → vtbd0p4 と置き換えること)。

kldload geom_eli

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

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に未対応の場合、以下の手順でZFSパーティションを暗号化(GELI)を施す(両用ブート環境では vtbd0p3 → vtbd0p4 と置き換えること)。

kldload geom_eli

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

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ファイルシステムの構築

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

mkdir -p /tmp/zroot
zpool create -R /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/src
zfs create zroot/usr/obj
zfs create zroot/usr/ports
zfs create zroot/usr/ports/distfiles
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

BIOSブート環境の場合、以下の内容でファイルを作成する(TRIM/UNMAP対応環境では sw → sw,trimonce に置き換えること)。

# 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

UEFIブート環境の場合、以下の内容でファイルを作成する(TRIM/UNMAP対応環境では sw → sw,trimonce に置き換えること)。

# 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

両用ブート環境の場合、以下の内容でファイルを作成する(TRIM/UNMAP対応環境では sw → sw,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

/tmp/zroot/boot/loader.conf

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

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"

geli_vtbd0p3_keyfile0_load="YES"
geli_vtbd0p3_keyfile0_type="vtbd0p3:geli_keyfile0"
geli_vtbd0p3_keyfile0_name="/vtbd0p3.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"
  • キーマップは日本語キーボードの場合 jp で、英語キーボードの場合は us で設定する。

  • IPv4が無い環境では defaultrouterifconfig_vtnet0 の設定は不要。

  • IPv6が無い環境では ipv6_defaultrouterifconfig_vtnet0_ipv6 の設定は不要。

  • IPv6については指定されたインターフェースのみIPv6が設定されるようになっている。
  • 設定のあるインターフェース以外でも「積極的に」IPv6を使用したい場合、ipv6_activate_all_interfaces="YES" という設定を追加で入れる。

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

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

ifconfig_vtnet0="SYNCDHCP"

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

  • ホスト名(hostname 設定相当)

  • 指定したNIC(vtnet0)に対するIPv4アドレス(ifconfig_vtnet0 設定相当)

  • デフォルトゲートウェイ(defaultrouter 設定相当)

  • DNSキャッシュサーバー情報(/etc/resolv.conf 置き換え)

    • DHCPを使用する場合 /etc/resolv.conf の事前設定された内容は保証されない(消えることがある)。

    • よってDHCPで置き換えて欲しくない設定や、足りない設定の付与等については、/etc/resolvconf.conf にて制御する。

  • その他
    • インターフェースのメディア設定
    • インターフェースのMTU設定
    • 静的ルーティング設定(クラスレスまたはクラスフル)

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

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

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

ifconfig_vtnet0_ipv6="inet6 accept_rtadv"

以下の設定が行われる。

  • 指定したNIC(vtnet0)に対するIPv6アドレス(ifconfig_vtnet0_ipv6 設定相当)

  • デフォルトゲートウェイ(ipv6_defaultrouter 設定相当)

  • DNSキャッシュサーバー情報(/etc/resolv.conf 置き換え)

    • RAを使用する場合 /etc/resolv.conf の事前設定された内容は保証されない(消えることがある)。

    • よってRAで置き換えて欲しくない設定や、足りない設定の付与等については、/etc/resolvconf.conf にて制御する。

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

/tmp/zroot/etc/resolv.conf

nameserver      DNSキャッシュサーバー1
nameserver      DNSキャッシュサーバー2
nameserver      DNSキャッシュサーバー3
options         edns0 timeout:2 attempts:5
  • DNSキャッシュサーバーを複数指定する(最低でも2台)。
  • デフォルトのタイムアウト値は5秒、繰り返し回数は2回(サーバー台数×繰り返し回数がリトライ回数となる)なので調整する。
  • 具体的にはタイムアウト値は2秒(最大30秒)、繰り返し回数を5回(最大5回)に設定する。
  • これはDNSキャッシュサーバーの障害に対して早期に回復を図るための設定である。

※/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-14 17:49:37.089165000 +0900
@@ -29,7 +29,7 @@
 #
 # The option `iburst' is used for faster initial synchronization.
 #
-pool 0.freebsd.pool.ntp.org iburst
+pool NTPサーバー iburst

 #
 # If you want to pick yourself which country's public NTP server
@@ -95,6 +95,8 @@
 #
 #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
  • 指定されたNTPサーバーが3台以上で「なければ」、追加で pool ntp.nict.jp iburst 行を追加すること。

  • NTPサーバーの台数はIPアドレス単位でカウントするので drill NTPサーバー を実行して、ANSWER SECTION 以下のIPアドレスの個数を数えること。

  • また指定されたサーバーのIPが1つなら、pool ではなく server NTPサーバー と指定してもよい。

  • NTPサーバーは最低でも3台(=3IP)を指定すべき。

/tmp/zroot/etc/ssh/sshd_config

--- /etc/ssh/sshd_config.orig   2021-02-12 06:26:33.000000000 +0000
+++ /etc/ssh/sshd_config        2021-02-14 10:26:06.896045000 +0000
@@ -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

@@ -50,7 +50,7 @@
 #AuthorizedKeysCommandUser nobody

 # For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
-#HostbasedAuthentication no
+HostbasedAuthentication no
 # Change to yes if you don't trust ~/.ssh/known_hosts for
 # HostbasedAuthentication
 #IgnoreUserKnownHosts no
@@ -58,20 +58,20 @@
 #IgnoreRhosts yes

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

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

 # Kerberos options
-#KerberosAuthentication no
+KerberosAuthentication no
 #KerberosOrLocalPasswd yes
 #KerberosTicketCleanup yes
 #KerberosGetAFSToken no

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

 # Set this to 'no' to disable PAM authentication, account processing,
@@ -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

/mnt/boot/zfs/zpool.cache

umount /tmp/zroot/boot

zpool export zroot
zpool import -o cachefile=/mnt/boot/zfs/zpool.cache -o altroot=/tmp/zroot zroot
zpool export zroot
zpool import zroot

再起動する

reboot

よくある質問とその答え

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

A.2021年2月現在のIntel製CPU(Cooper Lake、Comet Lake、Tiger Lake、Tremont)において、サーバー(Ice Lake-SP 以降)・デスクトップ(Rocket Lake 以降)向けでは存在しない。
モバイル(Ice Lake 以降)向けおよび組み込み(Goldmont 以降)向けのCPUでのみ対応している状況である。
またAMD製CPUにおいてZENアーキテクチャから対応してるので、RYZENシリーズ(EPICシリーズ)では当たり前に対応してると言える。

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

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

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

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

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

TODO

参考文献

FreeBSD/FreeBSD13-install (最終更新日時 2021-05-30 15:13:44 更新者 NorikatsuShigemura)