LoginSignup
1

FreeBSD を Oracle Cloud Infrastructure 環境にインストールしてみた

Last updated at Posted at 2022-11-14

はじめに

FreeBSD(13.1-RELEASE および 14-current)をOCI(Oracle Cloud Infrastructure)環境にインストールしてみた。だけだと、できて当たり前なので、色々と触ってみた感想を残しておきます。

今回のテーマはOCI Cloud Free Tierの「Always Freeクラウド・サービス」にて売り文句の下記の仮想マシンサービスで、FreeBSD/aarch64 をインストール、その動きについて調べてみました。

最大4インスタンスのArm Ampere A1 Computeを1か月あたり3,000 OCPU時間と18,000GB時間で使用可能

ここに書かれた内容が省略しすぎと感じた場合は、参考文献をご覧ください。参考文献で示した内容を読んでる前提で書いています。
またOCIに関する基礎的な内容についても省略します。アカウント、権限、果てはVCN(仮想クラウドネットワーク)の話から始めると本一冊分の分量になってしまうからです。
とりあえずアカウント作ったら、すぐに仮想マシン(インスタンス)作成する、という想定のため、各種権限については管理者権限(Administratorsグループ)で作業するものとします。

なお 14-current はセットアップ後、ソースコードからビルド(make world kernel)して入れ替えています。

Arm Ampere A1 Compute インスタンスとは

OCIにて Ampere社のAltraコア(CPU)を採用した、ARMベースプロセッサの第一世代環境(A1)の仮想マシンです。

OCIではインスタンス種別を「シェイプ」と表現しており、下記のルールで命名・運用されています。

インスタンスタイプ.シェイプタイプ.シェイプサイズ
  • インスタンスタイプ
    • VM(仮想マシン・バーチャルマシン)
    • BM(物理マシン・ベアメタル)
  • シェイプタイプ ※はハードウェア・プロセッサの世代
    • Standardn (Intel Xeon)
    • Standard.En (AMD EPYC)
    • Standard.An (Ampere Altra)
    • 他にも DenseIOGPUOptimized があるがここでは省略
  • シェイプサイズ
    • 割り当てられるCPUコア数(とコア数に相応するメモリサイズ) ※委細省略
    • Flex が付いてるシェイプは割り当てられるCPUコア数とメモリサイズを個別に指定することができる構成を意味します。

本件では VM.Standard.A1.Flex を使用するのでこの命名規則に慣れておくことをオススメします。

仮想マシンの立ち上げ

今時点でテンプレートイメージの完成度が低いため、軽く紹介程度に留めておきます。下記図において赤丸でくくった箇所の選択・入力することで、セットアップできます。

image-and-shape.png

ホスト環境(仮想化基盤)

  • ゲスト(OS)から見たところ、QEMUであることから、ホスト環境はKVMと思われます。
  • CPUタイプは neoverse-n1 で、このCPUタイプに合わせてコンパイルすると少しは速くなると思われます(評価中)。
  • ストレージ種別は vtscsi(4) でCAMの管理下にあります。ただし、
    • UNMAP(いわゆるTRIM、SCSIなのでUNMAP)コマンドに未対応
    • camcontrol identify に未対応
    • camcontrol tags は対応してるらしい(正確な情報かは不明)
  • ネットワークインターフェースは vtnet(4) です。特に言うことは無いです。
  • シリアルコンソールの利用が可能です。uart(4) のため、/dev/ttyu0 の設定がそのまま使えます。
    • シリアルコンソールの利用が非常に簡単なため、積極的に利用しましょう(後述)。
  • USBが有効になってますが、使うことは無いので切った方がいいとは思います(未チューニング)。
    • とは言え GENERIC カーネルで無効にするような話でないので、若干のチューニングが必要です(あまりやる気は無い)。
    • ukbd(4)uhid0ums0 が認識されています。いずれもビデオコンソールが無いと恩恵は受けられません。
    • ビデオコンソールについては未評価です(VNCコンソール接続について未検証)。

感想

現時点(2022/11/13)での、色々と試行錯誤した感想について述べます。単純に言えば、実用には若干問題があります。ただ工夫で回避できる部分もあります。
ただし現在、UFS(ブート)+ZFS(ルート)の、自分的にはマジ運用モード構成で検証しているため、デフォルトのUFSオンリーの構成だと、評価が変る可能性があります。

テンプレートイメージの問題

  • UFSのみ構成で提供される(許容)。できればZFS構成それもUFS+ZFSの構成があると嬉しいです。
  • パーティション構成がアライメントを考慮していません。これは特にI/Oパフォーマンスにおけるペナルティが怖いです。
    • 現時点では、もっと悪いボトルネックがあると思われるので、このペナルティが現実的かは不明です。
    • 各ファイルシステム毎に(セクターサイズが)512バイトと4096バイトとバラバラです。ただ致命的ではありません。
    • パーティションの区切り(特に開始)が1MB(どの辺りで切るかは要検討)境界にありません。ただアライメントが不要なパーティションもあるため全面的に悪いわけではありません。
  • ESP(EFIシステムパーティション)のサイズが32MB強となっています。
    • アライメントを考慮して32MB弱にするのが良いと思います。
    • その場合FAT32にはできないので(サイズ不足)、FAT16で構成することになります。
    • 32MBも必要か?とか、200MB、500MBだろ?という議論についてはノーコメントで。
  • クワーク(quirk)が不足しているため、警告が表示されます。
    • 6バイトコマンドには対応していないので、最小コマンドサイズを10バイトに設定する必要があります(DA_Q_NO_6_BYTE)。
    • キャッシュ同期コマンドに対応していないので、本機能をオフにする必要があります(DA_Q_NO_SYNC_CACHE)。
    • 両者とも、一度だけ表示される警告を無視すれば、設定無しでも問題ありません(警告後その処理が無効になる)。
    • ただし前者については /boot/loader.conf にて kern.cam.da.0.minimum_cmd_size="10" という設定を実施すれば警告を回避できます。
  • 実際 sysctl kern.geom.disk.da0.flags の結果は b2<OPEN,UNMAPPEDBIO,DIRECTCOMPLETION,CANZONE> となります。
    • UNMAPコマンドに未対応のため CANDELETE フラグがありません。
    • キャッシュ同期コマンドに未対応のため CANFLUSHCACHE フラグがありません。
  • cloud-init についてはノーコメントで(未活用)。
  • ちゃんと評価してないけど、IPv6対応がよろしくないと思われます(デフォルトで…という話で net/dhcp6のインストールが必要)。
  • なおIPv6についてはOCI環境側でも事前セットアップが必要(デフォルト無効)なため、一概に「よろしくない」わけではないです。

イメージの作り替え

オンザフライで作り直してしまえばいいので、先の問題はほぼ気にならなくなります(人にオススメできなくなりますが)。
ブート・ボリュームの「トラブルシューティングおよび修復」を実施することになりますが、そのためにはもう一つインスタンスを立ち上げる必要があります。
またブロック・ボリュームはブート・ボリュームにはなりません。そこに救いは無いです(検証済み)。

FreeBSDカーネルの問題

たぶんカーネルだと思います。CPU自体が遅いわけではないと思いますが、非常に処理が重たいです。
これは最新版(14-current)にしても状況が変らないため、いくらかチューニング不足感を感じます。
みんなどんどん使ってレポートしよう。

  • KVM準仮想化タイマー kvm_clock(4) が移植されていません。
    • これが無いことの影響は不明ですが、実装のきっかけを考えると、あった方が良いと思われます。
  • タイマー割り込み周波数が仮想マシン上で稼動するには高すぎる嫌いがあります。
    • 一般に100ヘルツで動かすのが定石ですが、これが1000ヘルツで動いています(物理環境扱い)。
    • /boot/loader.conf にて kern.hz="100" という設定を入れれば回避できます。
    • よく見る仮想化ホスト環境であれば kern.hz="100" に自動的に設定してくれるので、この情報がカーネルには入っていません。
    • 実際 sysctl kern.vm_guest の結果は none と出ます(kvm と表示して欲しい想定)。
  • ユーザーランドの負荷に対してシステム(カーネル内処理)負荷が極めて高いです。
    • 原因は不明。ただしコンテキストスイッチングが極端に増えることはありません(調べてたら kern.hz 問題に気がついた)。
    • ただあまり見ることが無い pagedaemon が活発に活躍しているのが気になります。
    • ページング処理ないしはページゼロクリア処理が重いのだろうか?
  • ただしI/O負荷は極めて小さいです。ごく普通(物理環境と同程度の)のI/O負荷率です。

確認済みの改善

14-current での確認になりますが「現時点(2022/11/13)」移行での変更で改善した点をリストアップします。

「停止」と「再起動」操作

管理コンソールより「停止」および「再起動」の操作が反映されません。この操作を実施後900秒(15分)経過した後、オペレーションが強制されます。
よってゲスト(OS)から見ると突然電源断されたように見えます。これは再起動後に fsck(8) といった処理が走る原因となります。

この問題は acpi_ged(4)がコミットされ、各種バグが修正された 2022/10/25 以降の 14-current と下記の /etc/devd/poweroff.conf 設定により回避ができます。

/etc/devd/poweroff.conf
notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "Button";
        match "notify"          "0x00";
        action "poweroff";
};

またOCIにおける「再起動」は「停止」後「起動」することで実装されているため、上記設定で全て対応できます。

13.1-RELEASE では本機能が無いので、current からバックポートしてくるか、13.2-RELEASE を待つことになります(たぶん)。
あるいは「ただちに電源を切断することで、インスタンスを強制停止します」にチェックを入れて「停止」または「再起動」してください。
そうしない場合は15分待たないと行けなくなります。

OCI側の留意点

A1シェイプは4VM・4コア・24GBメモリ・200GBストレージの利用が可能とありますが、全部使おうとすると警告が出ます。
この警告は上記制限内では無視して設定しても構いません。警告の内容が「アップグレードしないと設定できないように読める」のはしょうがないにしても、実際は無視しても作成はできるので、理解して設定する分には問題無ありません。ただし、

  • 4VM作成(1コア・6GB・50GB/メモリの増減は可能)作成してしまうと、「終了」させてからしらばく「終了状態」になっているVMが消えてくれないと、新しいVMを作成することができません。
  • どれかリソースを消費すると作成はできません。たとえばある1VMに4コア割り当てたら、そのVMが残る限り新しいVMは立ち上げられません。

実用上下記の組み合わせが最大となる。

  • (2コア・12GB・100GB)×2VM
  • (3コア・18GB・150GB)VM+(1コア・6GB・50GB)VM ※この時両VMのメモリの加減は可能

自分としては後者を推したいですが、どちらかが、どちらかをリカバリ可能なよう構成することをオススメします。
VMに問題が発生した場合は、もう一台のVMにマウントしてリカバリすることが可能ですが、どっちも同じように利用していると、復旧しにくい可能性があります。

もちろん有償の場合この制限はありません。あくまでも Always Free での範疇の話となります。

IPv6対応について

事前にIPv6アドレスの割り当てがなされることが前提での作業となります。こちらは参考文献を参考に設定してください。
本家資料にも書いてあるのですが、いずれの資料もVCN作成から入ってるので、作成の手順を読み解きながら、既存VCNに対して変更を実施します。

作成との対比で変更を実施する場合は下記の項目が該当します。

  • タスク1: IPv6対応VCNの作成
    • 当該VCNを選択して編集、設定変更します。
  • タスク2: リージョナルIPv6対応パブリック・サブネットの作成
    • 当該サブネットを選択して編集、設定変更します。
  • タスク3: インターネット・ゲートウェイの作成
    • 変更に際し、本作業は不要です。
  • タスク4: インターネット・ゲートウェイを使用するためのデフォルト・ルート表の更新
    • 追加ルート・ルールでIPv6の作業のみ対応します。
  • タスク5: デフォルト・セキュリティ・リストの更新(オプション)
    • イングレスルールの追加が必要です。参考文献にリストアップされてる差分を参考にしてください。
    • エグレスルールの追加が必要です。エグレスは制限無しとするため、既存(IPv4)の設定を参考に、IPv6も同じように設定します。
  • タスク6: インスタンスの作成
    • これ自体は作業済みなので次へ進みます。
    • またインスタンス作成時にIPv6の割り当てができない気が…。
  • タスク7: IPv6アドレスのインスタンスへの追加
    • 特に変更点はありません。
    • なお複数のIPv6アドレスの割り当てが可能です。またDHCPv6で設定された複数のIPv6アドレスの設定が可能です。
  • タスク8: IPv6を使用するためのインスタンスOSの構成
    • DHCPv6でIPv6アドレスの取得なのは確かです。
    • 異質な点としては、プレフィックスが128ビットなため、サブネットはありません。
    • デフォルトゲートウェイ、ネームサーバー(リゾルバ)等の情報はここでは含まれていません。
    • デフォルトゲートウェイについてはICMPv6ルータ要請メッセージデーモン(rtsold)を使用して取得します。
    • ネームサーバー等の情報はDHCPv4で取得したモノを使用します。

サーバー(のVNIC)にIPv6アドレスを割り当てた後、OS側では dhcp6 パッケージのインストールを行い、各種設定を行います。
設定後 service rtsold start を実行することでIPv6アドレスが割り当てられます。
なお再起動後は自動的に上記設定が実行されるため、都度実行する必要はありません。

dhcp6 のインストール

pkg install dhcp6

dhcp6 の設定(ファイル)

/usr/local/etc/dhcp6c.conf
interface vtnet0 {
        send ia-na 1;
};
id-assoc na 1 {
};

1はどんな数字でもかまいません(ラベル以上の意味は無い)。
0にしたい場合、set ia-na 0; は省略できませんが、id-assoc na { と省略することは可能です。

ルーター要請メッセージデーモンでのIPv6割り当て担当の設定

/usr/local/etc/dhcp6c.sh
#!/bin/sh
exec /usr/local/sbin/dhcp6c -c /usr/local/etc/dhcp6c.conf -p /var/run/dhcp6c."$1".pid -dD "$1"

※この時 chmod +x /usr/local/etc/dhcp6c.sh を実行して、実行フラグを立てておくこと。

IPv6有効化設定

/etc/rc.conf
ifconfig_vtnet0_ipv6="inet6 accept_rtadv auto_linklocal"

rtsold_enable="YES"
rtsold_flags="-M /usr/local/etc/dhcp6c.sh vtnet0"

インターフェースに対して、IPv6の有効化と、ルーター要請メッセージデーモン(rtsold)の設定を行います。
※OCIでは、ルーター要請メッセージに対して、アドレスの割り当てはDHCPv6を使用するようフラグ(Managed Address Configuration Flag)がアドバタイズ(広告)されます。
FreeBSDではインターフェースに対するIPv6設定はデフォルトで無効になっています。よって他のOSで時々よく見るIPv6無効化設定は不要です。
有効化したい場合 ifconfig_vtnet0_ipv6 行を設定することで有効化できます。
具体的には ifconfig コマンド実行した結果、そのインターフェースの nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL> の行で、IFDISABLED が設定されていれば無効になっています。

本環境固有のカスタム設定

※IPv6に関する設定についてはIPv6対応についての章を確認してください。ここでは省略します。

/boot/loader.conf

/boot/loader.conf
kern.hz="100"
kern.cam.da.0.minimum_cmd_size="10"

/etc/sysctl.conf

/etc/sysctl.conf
vfs.zfs.min_auto_ashift=12
vfs.zfs.vdev.async_read_max_active=256
vfs.zfs.vdev.async_write_max_active=256

※ZFS構成した場合。また vfs.zfs.min_auto_ashift はZプール作成時しか使用しない。

/etc/devd/poweroff.conf

/etc/devd/poweroff.conf
notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "Button";
        match "notify"          "0x00";
        action "poweroff";
};

※2022/11/13 現在 14-current のみ

/etc/make.conf

/etc/make.conf
CPUTYPE= neoverse-n1
MACHINE_CPU=

シリアルコンソールの活用

UIがあまりよろしい感じで無いでないので、気がつきにくいのですが、下記図で赤丸で囲ったのように「インスタンス詳細画面」の左下、「リソース」の欄に「コンソール接続」というリンクがあります。

serial-connect.png

コンソールの利用方法は以下の2点があります。前者に関しては難しいことは無いので、後者について説明します。

  • 「Cloud Shell接続の起動」: いわゆるWebUIによるシリアル接続。極簡易には使える。
  • 「ローカル接続の作成」: OCIが用意する踏み台サーバー経由でシリアルコンソールにSSH接続する。

「ローカル接続の作成」ボタンを押すとSSH鍵の設置が求められますので、自分の都合に合わせてRSAキーを設定します。なおRSA鍵のみ対応で、より新しいタイプのSSH鍵には対応していません。
その後「コンソール接続の作成」ボタンを押すことで準備が完了します。

下記の図のように、画面一覧の右にある縦三点リーダーをクリックして「Linux/Macのシリアル・コンソール接続のコピー」をクリックします。
create-local-connection.png

下記のようなテキストがコピーされるので、ペーストして接続します。

ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.リージョン.鍵ID@instance-console.リージョン.oci.oraclecloud.com' ocid1.instance.oc1.リージョン.インスタンスID

実際の利用に際しては、SSHクライアントの設定にもよるのですが、OpenSSHの場合、下記のような設定を行うことで、手軽にシリアルコンソールに接続できるようになります。

~/.ssh/config
Host ocid1.instance.oc1.リージョン.インスタンスID
    EscapeChar ~
    ServerAliveInterval 120
    ProxyJump ocid1.instanceconsoleconnection.oc1.リージョン.鍵ID@instance-console.リージョン.oci.oraclecloud.com:443
  • ProxyCommand での指定は ProxyJump に置き換えています。ProxyJump が使えない古い環境では上記内容のまま ProxyCommand を指定します。
  • EscapeChar~ を指定することで(デフォルトの設定)、tip(1) コマンド感覚で、「リターンキー」(正確には行頭であればいつでも)→「~.」と入力することでSSHセッションを終了することができます。
  • ServerAliveInterval で秒単位でSSHセッションの維持を図ります。この指定が無い場合はいつのまにか強制切断されます(経過時間は未計測)。またもっと長くできるかは未計測です。踏み台サーバーとの間に入るファイアウォールやNAT箱等の通信機器の都合も発生するため、環境依存です。
  • ProxyJump 設定に置き換えるとよくわかりますが、シリアルコンソールのための踏み台サーバーは22番ポートではなく443番ポートで運用されています。

上記設定が完了すれば、下記のようにしてシリアルコンソールに接続できます。

$ ssh ocid1.instance.oc1.リージョン.インスタンスID

=================================================
IMPORTANT: Use a console connection to troubleshoot a malfunctioning instance. For normal operations, you should connect to the instance using a Secure Shell (SSH) or Remote Desktop connection. For steps, see https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/accessinginstance.htm

For more information about troubleshooting your instance using a console connection, see the documentation: https://docs.cloud.oracle.com/en-us/iaas/Content/Compute/References/serialconsole.htm#four
=================================================

シリアルコンソール利用時におけるよくあるトラブルとその対応

Q.接続出来ません!何故か接続が終了してしまいます。

A.知るかボケェ! 状況を切り分けろ。大抵は極めて些細で大きい設定ミスです。というわけで大枠で下記の3つの要因があります。

SSHホスト鍵の保存について

  • 初回接続はSSHホスト鍵情報が無いため、ホスト鍵が正しいか、フィンガープリント(ホスト鍵のハッシュ値)を表示して、正しいか聞いてきます。
  • SSHによるシリアルコンソールへの接続では、1回目は踏み台サーバーの、2回目はシリアルコンソールの(というと語弊がありますが、シリアルとSSHを変換している機器の)、2回聞いてきます。
  • 厳密には管理コンソールの「サーバー・ホスト・キーのフィンガープリント」を参照して評価すべきですが、(コンプライアンス的問題で以後の発言は抹消されました)。
  • この時受け入れたSSHホスト鍵情報は ~/.ssh/known_hosts に保存されます。
  • またSSHはこの保存されたホスト鍵と一致しない場合は接続に失敗しますので、問題解消の一つとして、保存されたホスト鍵を削除する手があります。

再度ローカル接続の作成を行う

  • 意外とよくあるミスとしては、違うサーバーで「ローカル接続の作成」を実施していたり、終了済みのサーバーの設定だったりすることがあるので、インスタンス詳細にて「コンソール接続」の設定の確認を行います。
  • とりあえず既存の設定を削除して、再度SSH鍵の登録を行うという対応が良い場合もあります(些細なミスの例)。
  • その場合SSH接続情報に変更が発生するので、手持ちの設定にフィードバックするようにしてください。

使用しているSSH鍵の確認

  • 「ローカル接続の作成」で設定したSSH鍵を使用しているか確認します。
  • 場合によっては先の ~/.ssh/config 設定に IdentityFile 設定を追加してやる必要があります。
  • ごく単純には ssh -i SSH鍵ファイル ocid1.instance.oc1.リージョン.インスタンスID-i オプションでSSH鍵ファイルの指定を試行錯誤できます。
  • SSH鍵の自動生成を行った場合は、手元にダウンロードして IdentityFile を設定する必要があります。

Q.繋がったみたいですが何か定型文が表示されて、その後反応がありません。

A.リターンキーでも押せばログインがうながされるので、シリアルコンソールに繋がっていることが確認できます。

アクセス制限(セキュリティリスト)について

デフォルトで、インターネットからの接続はSSHのみとなっています。この設定を変更したい場合についてTODO。

よくある質問とその答え

Q.ARM64とAARCH64って何が違うの?

A.イコールとのこと。今後はAARCH64で統一されていく方向らしい(伝聞)。とは言え、ARM64が嘘か…と言われるとそうでもないので、たぶん両者ともにずっと残ると思われ。

ただしFreeBSDのビルドとしては TARGET=arm64TARGET_ARCH=aarch64 で(クロス)コンパイルされます。
13.1リリースノートを見てると FreeBSD/arm64 と表現される向きもあるが、FreeBSD/aarch64 という表記と混在になってるので、その辺りは生暖かく見守ってあげる方向で。

Q.マーケットプレースはパートナーイメージですか?

A.マーケットプレースとはパートナーイメージのことである。またパートナーイメージとはマーケットプレースのことである。
これは、よくあるオラクルサトリ(悟り/オラクルはアメリカ合衆国テキサス州オースティンの会社だけど)である。

Q.面白そう!でもOCIの会員登録したいのですができません!

A.諦めろん。しょっちゅう止まってるという話を聞きました。何日かに一回試すと上手くいくことがあると聞いています。

参考文献

謝辞

  • IPv6回りの調査・作法について hrsさんから多大なるヒントおよび指導をいただきました。この場にて感謝申し上げます。
  • acpi_ged(4) の実装と devd(8) での見え方、devd.conf(5) への書き方について、takawataさんから多大なるヒントおよび指導をいただきました。この場にて感謝申し上げます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1