サイズ: 21764
コメント:
|
サイズ: 22350
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 39: | 行 39: |
* UFSパーティション: 4GB ※実用512KB・2倍の1GB程度はあった方がよい | * UFSパーティション: 4GB ※実用512MB・最低でも2倍の1GB程度はあった方がよい |
行 259: | 行 259: |
ZFSパーティションにGELIで暗号化を施す。 | SHA-NIに対応している場合は以下の手順でZFSパーティションを暗号化(GELI)を施す。 |
行 264: | 行 265: |
dd if=/dev/random of=/mnt/boot/geli.key bs=4096 count=1 chmod 0400 /mnt/boot/geli.key geli init -b -B none -e AES-XTS -l 256 -a HMAC/SHA256 -s 4096 -K /mnt/boot/geli.key /dev/vtbd0p3 }}} |
dd if=/dev/random of=/mnt/boot/vtbd0p3.key bs=64 count=1 chmod 0400 /mnt/boot/vtbd0p3.key geli init -b -B none -e AES-XTS -l 256 -a HMAC/SHA256 -s 4096 -K /mnt/boot/vtbd0p3.key /dev/vtbd0p3 geli attach -k /mnt/boot/vtbd0p3.key /dev/vtbd0p3 }}} SHA-NIに未対応の場合は以下の手順でZFSパーティションを暗号化(GELI)を施す。 {{{#!highlight shell numbers=disable kldload geom_eli dd if=/dev/random of=/mnt/boot/vtbd0p3.key bs=64 count=1 chmod 0400 /mnt/boot/vtbd0p3.key geli init -b -B none -e AES-XTS -l 256 -a HMAC/SHA256 -s 4096 -K /mnt/boot/vtbd0p3.key /dev/vtbd0p3 geli attach -k /mnt/boot/vtbd0p3.key /dev/vtbd0p3 }}} |
FreeBSD13のインストール
FreeBSD 13.0-RELEASEをインストールしてみる。 本記述は13.0-BEATA1時点での内容であるが、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接続の(マスストレージ)HDDおよびSSD
nvdn: NVMe接続SSD
mmscdn: eMMC(内蔵メモリカード)
vtbdn: バーチャルI/Oストレージ(QEMU、BHyVe環境他)
xbdn: 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プールの最新に対応してなくてよいので安心してアップグレードができる。
- パスフレーズとキーファイルによるZFS領域の暗号化(GELI)が可能(通常パスフレーズのみ)。
- ZFS領域とスワップ領域については暗号化を施す。
- ブート時点からセキュアでは無いが、セキュアブートの仕組みが今のところ確立されてないので、この辺りが限界。
- クラウド環境でセキュアブートの仕組みが提供されていることがないので、頑張る余地があるか微妙。
- 逆にクラウド環境では暗号化の仕組みが用意されているのでそちらを利用すること。
- 個別に本手順を実施する分には問題無いが、イメージそのままでデプロイすると、同じ暗号化鍵を使ったイメージがコピーされるのでよろしい運用では無い。
- 今時のCPUは、AES-NI対応については疑義は無いが、SHA-NI対応については限定的なので、考慮した設定を行う。
TRIM/UNMAPに最適化する。sysctl kern.geom.disk.デバイス名.flags を実行して CANDELETE の表示があれば、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+補正分。 |
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 の表示があれば、対応している。
AES/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」を入力してエンターキーを押す(パスワードは無い)。
コマンド操作によるインストール作業
先に情報収集が成されているものとして以下のコマンドを実行する。
パーティションを切る
BIOSブート環境の場合、以下の手順でパーティションを切る。
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 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
ファイルシステムをフォーマットする
TRIM/UNMAP対応の場合、以下の手順でフォーマットする。
newfs -U -j -E -t /dev/vtbd0p2
TRIM/UNMAPに未対応の場合、以下の手順でフォーマットする。
newfs -U -j /dev/vtbd0p2
更にUEFIブート環境の場合、以下の手順でフォーマットする。
newfs_msdos -F 32 -c 1 -L EFISYS /dev/vtbd0p1
フォーマットしたファイルシステムをマウントしてディレクトリを準備する
以下の手順を実施する。
mount -t ufs -o rw,noatime /dev/vtbd0p2 /mnt
mkdir -p /mnt/boot/efi
更にUEFIブート環境の場合、以下の手順を実施する。
mount -t msdosfs /dev/vtbd0p1 /mnt/boot/efi
mkdir -p /mnt/boot/efi/EFI/BOOT
パーティションを暗号化(GELI)する
SHA-NIに対応している場合は以下の手順でZFSパーティションを暗号化(GELI)を施す。
kldload geom_eli
dd if=/dev/random of=/mnt/boot/vtbd0p3.key bs=64 count=1
chmod 0400 /mnt/boot/vtbd0p3.key
geli init -b -B none -e AES-XTS -l 256 -a HMAC/SHA256 -s 4096 -K /mnt/boot/vtbd0p3.key /dev/vtbd0p3
geli attach -k /mnt/boot/vtbd0p3.key /dev/vtbd0p3
SHA-NIに未対応の場合は以下の手順でZFSパーティションを暗号化(GELI)を施す。
kldload geom_eli
dd if=/dev/random of=/mnt/boot/vtbd0p3.key bs=64 count=1
chmod 0400 /mnt/boot/vtbd0p3.key
geli init -b -B none -e AES-XTS -l 256 -a HMAC/SHA256 -s 4096 -K /mnt/boot/vtbd0p3.key /dev/vtbd0p3
geli attach -k /mnt/boot/vtbd0p3.key /dev/vtbd0p3
ブートローダーをインストールする
BIOSブート環境の場合、以下の手順で。 UEFIブート環境の場合、以下の手順で。
インストール後初期設定
よくある質問とその答え
Q.SHA-NIに対応したCPUなんてあるんですか?
A.2021年2月現在のIntel製CPUにおいて、サーバー・デスクトップ向けでは存在しない。 AMD製CPUにおいてZENアーキテクチャから対応してるので、RYZENシリーズ(EPICシリーズ)では当たり前に対応してると言える。
参考文献
adjkerntz(8) ※CMOSクロックの取り扱いに関するマニュアル
gpart(8) ※パーティションの取り扱いに関するマニュアル
gptboot(8) ※freebsd-boot パーティションにインストールするブートローダ(UFS専用)に関するマニュアル
gptzfsboot(8) ※freebsd-boot パーティションにインストールするブートローダ(ZFS専用)に関するマニュアル