サイズ: 8850
コメント:
|
サイズ: 48447
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 2: | 行 2: |
以下の環境にFreeBSD 13.0-RELEASEをインストールする。 | FreeBSD 13.0-RELEASEをインストールしてみる。 本記述は13.0-BEATA3時点での内容であるが、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) を使用する。 * adan: SATA接続のHDDおよびSSD * dan: USB/SAS/SCSI接続の(マスストレージ)HDDおよびSSD * nvdn: NVMe接続SSD * mmscdn: eMMC(内蔵メモリカード) * vtbdn: バーチャルI/Oストレージ(QEMU、BHyVe環境他) * xbdn: Xen準仮想化ドライバ(Xen環境) |
* 搭載ストレージもできれば50GB以上は欲しいところ。 * 30GB程度では一通りのセットアップで埋まってしまう程度の容量なので、大きめに欲しいところ。 * 用途にもよるがログ保存等を考慮すると100GB程度あれば安心である。 * インストール先メディア(ストレージ)に応じてデバイス名を読み替えること。今回、ここでは vtbd''n''(''n''≧0) を使用する。 * ada''n'': SATA接続のHDDおよびSSD * da''n'': USB/SAS/SCSI/NVMe接続の(マスストレージ)HDDおよびSSD * nvd''n'': NVMe接続SSD(旧式) * mmscd''n'': eMMC(内蔵メモリカード) * vtbd''n'': バーチャルI/Oストレージ(KVM、QEMU、BHyVe環境他) * xbd''n'': Xen準仮想化ドライバ(Xen環境) * NIC(ネットワークインターフェース)は実機に応じてデバイス名に応じて読み替えること。ここでは vtnet''n''(''n''≧0)を使用する。 * 典型的なNICはたくさんあるのでここでは有名どころをいくつか。 * vtnet''n'': バーチャルI/Oネットワーク(KVM、QEMU、BHyVe環境他) * ena''n'': AWSの仮想化ネットワーク(`Elastic Network Adapter`) * re''n'': リアルテック社製GbEネットワークカード == 設定目標 == |
行 29: | 行 43: |
* ブートパーティション: BIOS環境=1024KB弱、UEFI環境=200MB * UFSパーティション: 4GB ※実用512KB・2倍の1GB程度はあった方がよい |
* ブートパーティション: BIOS環境=512KB弱、UEFI環境=200MB程度 * UFSパーティション: 4GB弱 ※実用512MB・最低でも2倍の1GB程度はあった方がよい |
行 32: | 行 46: |
* スワップパーティション: 8GB ※搭載メモリの2倍で最大8GB程度に * またパーティション境界を可能な限り「各種」境界を考慮して割り当てるが、とりあえず1MB境界を目指す。 * 最初は1ブロック512バイトであるが、 |
* スワップパーティション: 8GB程度 ※搭載メモリの2倍で最大8GB程度に * スワップについてメモ: * スワップはおおよそ「搭載メモリの2倍」で確保だが、一定量を超えると使用しなく(て良いように)なるため、この辺りで打ち止めしておくのがよい。 * またどれほど搭載メモリが多くてもゼロスワップ運用はお勧めしない。 * カーネルがメモリのガベージコレクトする時にスワップを使用することがあるので、巨大な連続領域を確保できなくなることがありうる。 * またパーティション境界を可能な限り「各種」境界を考慮して割り当てることを目指す。とりあえず1MB境界で設定する。 * 1ブロック512バイトが最小単位であるが、 |
行 37: | 行 55: |
* HDD SMRのブロック単位(256MB)を考慮した結果、 | * HDD SMRのブロック単位(256MB)を考慮しての結果。 |
行 39: | 行 57: |
== インストール目標 == 以下のパーティション構成を組む。 ||||||||||<#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に対応してないことを意味する。 == インストール設定 == 以下のパーティション構成を組む。ブート環境に応じて選択する。 ||||||||||<#DDDDDD> 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+補正分。 || ||||||||||<#DDDDDD> 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+補正分。 || ||||||||||<#DDDDDD> 両用ブート環境(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: | 行 107: |
OS起動後になるが、以下のコマンドで環境を確認できる。 | OS起動後になるが、以下のコマンドで環境を確認できる。実際にインストール時に確認すること。 以下はある環境での実行結果である。 {{attachment:check-list-environment.png||width="50%",height="50%"}} |
行 65: | 行 113: |
{{{ sysctl machdep.bootmethod }}} この時「BIOS」と表示されればBIOSブート環境、「UEFI」とあればUEFIブート環境である。 === ディスク一覧 === {{{ geom disk status }}} ディスク一覧が表示される(この時 Status と Components が N/A となるのは無視して良い)。<<BR>> 下記は実行例であるが、下記の実効例の場合、インストール先メディアを選ぶこと(mmcsd0 または ada0)。 |
|
行 66: | 行 128: |
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: | 行 136: |
=== 時刻 === {{{ |
=== 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: | 行 161: |
=== 起動時チューニング === === ランタイムチューニング === == 検証環境 == |
`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`」を入力してエンターキーを押す(パスワード入力は求められない)。 == コマンド操作によるインストール作業 == 先に情報収集が成されているものとして以下のコマンドを実行する。 コマンド入力に当り、デフォルトで英語キーボードモードになっているので、日本語キーボードモードに変更したい場合は下記のコマンドを実行する。 {{{#!highlight shell numbers=disable kbdcontrol -l jp < /dev/console }}} 英語キーボードモードに戻したい場合は `-l` オプションに与えるキーボード種別に `us` を指定する。 === パーティションを切る === 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対応の場合、以下の手順でフォーマットする。 {{{#!highlight shell numbers=disable # BIOSブート環境またはUEFIブート環境の場合はこちら newfs -U -j -E -t /dev/vtbd0p2 # 両用ブート環境の場合はこちら newfs -U -j -E -t /dev/vtbd0p3 }}} TRIM/UNMAPに未対応の場合、以下の手順でフォーマットする。 {{{#!highlight shell numbers=disable # BIOSブート環境またはUEFIブート環境の場合はこちら newfs -U -j /dev/vtbd0p2 # 両用ブート環境の場合はこちら newfs -U -j /dev/vtbd0p3 }}} 更にUEFIブート環境または両用ブート環境の場合、以下の手順でフォーマットする。 {{{#!highlight shell numbers=disable # UEFIブート環境の場合はこちら newfs_msdos -F 32 -c 1 -L EFISYS /dev/vtbd0p1 # 両用ブート環境の場合はこちら newfs_msdos -F 32 -c 1 -L EFISYS /dev/vtbd0p2 }}} === フォーマットしたファイルシステムをマウントしてディレクトリを準備する === 以下の手順を実施する。 {{{#!highlight shell numbers=disable # 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ブート環境または両用ブート環境の場合、以下の手順を実施する。 {{{#!highlight shell numbers=disable # 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 }}} === ブートローダーをインストールする === 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)する === BIOSブート環境またはUEFIブート環境の場合、以下の手順でZFSパーティションを暗号化(GELI)を施す。 {{{#!highlight shell numbers=disable 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)を施す。 {{{#!highlight shell numbers=disable 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 と置き換えること。 {{{#!highlight shell numbers=disable mkdir -p /tmp/zroot # 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 # 両用ブート環境の場合はこちら zpool create -o cachefile=/mnt/boot/zfs/zpool.cache -o altroot=/tmp/zroot -O atime=off -O compression=lz4 -m legacy zroot vtbd0p4.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 }}} === 配布物のインストール === {{{#!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 === ※TRIM/UNMAP対応環境ではスワップタイプのオプション `sw` を `sw,trimonce` に変更すること(コメント参照) BIOSブート環境の場合、以下の内容でファイルを作成する。 {{{ # 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ブート環境の場合、以下の内容でファイルを作成する。 {{{ # 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 }}} 両用ブート環境の場合、以下の内容でファイルを作成する。 {{{ # 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" # 両用ブート環境ではこちらの設定を使用する #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" }}} * キーマップは日本語キーボードの場合 `jp` で、英語キーボードの場合は `us` で設定する。 * IPv4が無い環境では `defaultrouter` と `ifconfig_vtnet0` の設定は不要。 * IPv6が無い環境では `ipv6_defaultrouter` と `ifconfig_vtnet0_ipv6` の設定は不要。 * IPv6については指定されたインターフェースのみIPv6が設定されるようになっている。 * 設定のあるインターフェース以外で、後から追加されるようなインターフェース(ng''n''など)で自動的にIPv6を使用したい場合、`ipv6_activate_all_interfaces="YES"` という設定を追加で入れる。 * 通常 `ipv6_activate_all_interfaces` の設定は不要である。 ==== 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 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-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 }}} * 指定された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 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,20 +58,20 @@ #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 +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 }}} === 再起動する === {{{#!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 == Q.何故ISOイメージではなくメモリスティックを使わないのですか? == A.メモリスティック、つまりOSからは `da0` で見えることになるのですが、これがインストール対象の メディアによっては、`da0` で被る場合があり、数字がズレる場合があります(`da1` など)。 よってISOイメージの場合 `cd0` で認識されることから、明確にインストールメディアとは区別されるため、 積極的に使用しています。 == Q.後日のメディア拡張のことを考慮するとスワップパーティションは前の方にあった方がいいのでは? == A.趣味です。完全に惰性なのでOSパーティション(`freebsd-ufs`)より前に移動することに異存ありません。 BSDパーティション時代では、ルートパーティション(aパーティション)の次に スワップパーティション(bパーティション)が置かれていましたが、<<BR>> GPTパーティションになって、BSDパーティションを使用しなくなったことから、<<BR>> ルートパーティションの次に無くてもよいことになりました。<<BR>> その当時の空気感(?)のまま惰性で割り当てています。 == Q.境界にアライメントするなら多少のフリー領域があってもいいのでは? 誤差ではかと == A.趣味です。今時のディスクサイズ(TB単位)を考えるとMB単位の調整は誤差と言えます(1/1000000)。 なので気にしないなら気にしないでもかまいせん。<<BR>> 自分は `gpart show` コマンド実行された際にフリー領域の表示が邪魔なので消し込んでいます。 == Q.インストール時に kern.geom.label.disk_ident.enable を設定しているけど、loader.conf に指定しない理由は? == A.マウントしているデバイスについてはディスクラベルは表示対象になりません。 <<BR>> インストール時にはまだマウントされないため、`gpart show` を実行すると二重表示されます。 <<BR>> またディスクラベル、UUID、その他指定可能であっても、デバイス名の指定ほど短く入力できません。<<BR>> 以上から、自分はセットアップ時にディスクラベルを参照しないことにしています。 インストールメディアに依存しないでパーティションを指定できたりするメリットはありますが、 <<BBR>> そう思う人が積極的に使用する分にはかまわないと思っています。 = 参考文献 = * 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-BEATA3時点での内容であるが、13.0がリリースされた後、微調整する。
目次
前提条件
- CMOS(BIOS)クロックのタイムゾーンをUTCとする。
- ほとんどのクラウド環境では本設定を変更することができないか、極めて困難である。
- 物理環境では変更しやすいし、メンテナンス性も高いのだが、設定の統一性から見なかったことにする。
- よく出来た物理環境では、内部時間と表示時間(タイムゾーン情報を有す)を変えられるものも出てきたので、昔ほどJSTにこだわらなくてもよい。
- CPUについては特に明記しないし、1コアからでも使用できるが、2コア以上をお勧めしたい。
- 使用する用途に応じてCPU数や動作周波数、アーキテクチャを選ぶこと。
- 基本的には「時間」に影響出るが、投入したリソースに応じて反比例(少ないと時間がかかる、多いと時間が短縮される)する。
- 搭載メモリはできれば4GB以上にしておきたい。
- カツっカツにチューニングすれば512MBでも動作するが、その後はあまりできることが少ない。
- FreeBSD本体のビルドに6GBは必要なので、3GBや2GBの環境だとスワップアウトがキツイ。
- これはC++のコンパイル負荷によるものなので、搭載メモリが少ない環境でのビルド(サードパーティ製含む)は諦めた方がよい。
- 良好に使用するなら8GB以上は欲しいところではある。
- 搭載ストレージもできれば50GB以上は欲しいところ。
- 30GB程度では一通りのセットアップで埋まってしまう程度の容量なので、大きめに欲しいところ。
- 用途にもよるがログ保存等を考慮すると100GB程度あれば安心である。
インストール先メディア(ストレージ)に応じてデバイス名を読み替えること。今回、ここでは vtbdn(n≧0) を使用する。
adan: SATA接続のHDDおよびSSD
dan: USB/SAS/SCSI/NVMe接続の(マスストレージ)HDDおよびSSD
nvdn: NVMe接続SSD(旧式)
mmscdn: eMMC(内蔵メモリカード)
vtbdn: バーチャルI/Oストレージ(KVM、QEMU、BHyVe環境他)
xbdn: Xen準仮想化ドライバ(Xen環境)
NIC(ネットワークインターフェース)は実機に応じてデバイス名に応じて読み替えること。ここでは vtnetn(n≧0)を使用する。
- 典型的なNICはたくさんあるのでここでは有名どころをいくつか。
vtnetn: バーチャルI/Oネットワーク(KVM、QEMU、BHyVe環境他)
enan: AWSの仮想化ネットワーク(Elastic Network Adapter)
ren: リアルテック社製GbEネットワークカード
設定目標
- 全て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起動後になるが、以下のコマンドで環境を確認できる。実際にインストール時に確認すること。 以下はある環境での実行結果である。
ブート環境
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」を押す。あるいはスペースキーを押すとカウントダウンが止まる。
3を押すと下記のようにプロンプトが表示されるので、
以下のコマンドを入力して起動する(実施しなかったとしてもペナルティは無い)。
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 を実行したときに同じストレージをラベルで参照することを止める(結果として二重表示になる)。
環境によっては、下記の追加設定を実施しても良い。ただしキー入力を受け付けなくなることがあるので、要動作確認のこと。
set hint.atkbdc.0.disabled="1" set hint.atkbd.0.disabled="1
今時のハードウェアだと、この手のレガシー(PS/2接続)デバイスのエミュレーションの互換性が低い(遅い等)ことがあるので、可能な限り積極的に設定してみることをお勧めする。
上記画面が表示されるので、「<Live CD>」を選択(カーソルキーで→に移動、エンターキーを押す)する。
ログインプロンプトが表示されるので「root」を入力してエンターキーを押す(パスワード入力は求められない)。
コマンド操作によるインストール作業
先に情報収集が成されているものとして以下のコマンドを実行する。
コマンド入力に当り、デフォルトで英語キーボードモードになっているので、日本語キーボードモードに変更したい場合は下記のコマンドを実行する。
kbdcontrol -l jp < /dev/console
英語キーボードモードに戻したい場合は -l オプションに与えるキーボード種別に us を指定する。
パーティションを切る
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対応の場合、以下の手順でフォーマットする。
# BIOSブート環境またはUEFIブート環境の場合はこちら
newfs -U -j -E -t /dev/vtbd0p2
# 両用ブート環境の場合はこちら
newfs -U -j -E -t /dev/vtbd0p3
TRIM/UNMAPに未対応の場合、以下の手順でフォーマットする。
# BIOSブート環境またはUEFIブート環境の場合はこちら
newfs -U -j /dev/vtbd0p2
# 両用ブート環境の場合はこちら
newfs -U -j /dev/vtbd0p3
更にUEFIブート環境または両用ブート環境の場合、以下の手順でフォーマットする。
# 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
ブートローダーをインストールする
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)する
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
# 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
# 両用ブート環境の場合はこちら
zpool create -o cachefile=/mnt/boot/zfs/zpool.cache -o altroot=/tmp/zroot -O atime=off -O compression=lz4 -m legacy zroot vtbd0p4.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対応環境ではスワップタイプのオプション sw を sw,trimonce に変更すること(コメント参照)
BIOSブート環境の場合、以下の内容でファイルを作成する。
# 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ブート環境の場合、以下の内容でファイルを作成する。
# 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
両用ブート環境の場合、以下の内容でファイルを作成する。
# 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" # 両用ブート環境ではこちらの設定を使用する #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"
キーマップは日本語キーボードの場合 jp で、英語キーボードの場合は us で設定する。
IPv4が無い環境では defaultrouter と ifconfig_vtnet0 の設定は不要。
IPv6が無い環境では ipv6_defaultrouter と ifconfig_vtnet0_ipv6 の設定は不要。
- IPv6については指定されたインターフェースのみIPv6が設定されるようになっている。
設定のあるインターフェース以外で、後から追加されるようなインターフェース(ngnなど)で自動的にIPv6を使用したい場合、ipv6_activate_all_interfaces="YES" という設定を追加で入れる。
通常 ipv6_activate_all_interfaces の設定は不要である。
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 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-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
指定された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 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,20 +58,20 @@
#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
+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
再起動する
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
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、その他指定可能であっても、デバイス名の指定ほど短く入力できません。
以上から、自分はセットアップ時にディスクラベルを参照しないことにしています。
インストールメディアに依存しないでパーティションを指定できたりするメリットはありますが、 <<BBR>> そう思う人が積極的に使用する分にはかまわないと思っています。
参考文献
- FreeBSD13
- マニュアル
adjkerntz(8) ※CMOSクロックの取り扱いに関するマニュアル
gpart(8) ※パーティションの取り扱いに関するマニュアル
gptboot(8) ※freebsd-boot パーティションにインストールするブートローダ(UFS専用)に関するマニュアル
gptzfsboot(8) ※freebsd-boot パーティションにインストールするブートローダ(ZFS専用)に関するマニュアル
geli(8) ※GEOM層における暗号処理機能に関するマニュアル
loader.conf(5) ※/boot/loader.confに関するマニュアル
rc.conf(5) ※/etc/rc.confに関するマニュアル
- パーティショニング・ブート処理に関する参考文献
- ハードウェア情報