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

# はじめに
ＦｒｅｅＢＳＤ（13.1-RELEASE／2024年03月31日現在）を[ＯＣＩ（Oracle Cloud Infrastructure）](https://www.oracle.com/jp/cloud/)環境にインストールしてみた。だけだと、できて当たり前なので、色々と触ってみた感想を残しておきます。

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

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

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

なお 14.0-RELEASE はセットアップ後、ソースコードからビルド（`make world kernel`）して入れ替えています。もちろん `freebsd-update` でも問題ありません。なお運用するなら 14.0-RELEASE 以降を推奨します。インストールイメージは残念ながら 13.1-RELEASE（2024/03/31現在）となっています。

以後 13.1-RELEASE（その後リリースされた 13.3-RELEASE 含む）を１３系、14.0-RELEASE を１４系と省略します。

## Arm Ampere A1 Compute インスタンスとは
ＯＣＩにて [Ampere社のAltraコア](https://amperecomputing.com/processors/ampere-altra/)（ＣＰＵ）を採用した、ＡＲＭベースプロセッサの第一世代環境（Ａ１）の仮想マシンです。

ＯＣＩではインスタンス種別を「[シェイプ](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm)」と表現しており、下記のルールで命名・運用されています。

```
インスタンスタイプ.シェイプタイプ.シェイプサイズ
```

- インスタンスタイプ
    - `VM`（仮想マシン・バーチャルマシン）
    - `BM`（物理マシン・ベアメタル）
- シェイプタイプ ※*ｎ*はハードウェア・プロセッサの世代
    - `Standardｎ` （Intel Xeon）
    - `Standard.Eｎ` （AMD EPYC）
    - `Standard.Aｎ` （Ampere Altra）
    - 他にも `DenseIO` や `GPU`、`Optimized` があるがここでは省略
- シェイプサイズ
    - 割り当てられるＣＰＵコア数（とコア数に相応するメモリサイズ） ※委細省略
    - `Flex` が付いてるシェイプは割り当てられるＣＰＵコア数とメモリサイズを個別に指定することができる構成を意味する

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

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

![image-and-shape.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321527/de20550a-6297-d2ff-e2de-fa6eb0a6691e.png)

# ホスト環境（仮想化基盤）
- ゲスト（ＯＳ）から見たところ、ＱＥＭＵであることから、ホスト環境はＫＶＭと思われます。
- ＣＰＵタイプは `neoverse-n1` で、このＣＰＵタイプに合わせてコンパイルすると少しは速くなると思われます。
- ただし x86_64 アーキテクチャと違って arm64 はまだ若いので、ＩＳＡにそう大きな違いがあるわけではありません。
- ストレージ種別は `vtscsi(4)` でＣＡＭの管理下にあります。ただし、
    - ＵＮＭＡＰ（いわゆるＴＲＩＭ、ＳＣＳＩなのでＵＮＭＡＰ）コマンドに未対応
    - `camcontrol identify` に未対応
    - `camcontrol tags` は対応してるらしい（正確な情報かは不明）
- ネットワークインターフェースは `vtnet(4)` です。特に言うことは無いです。
- シリアルコンソールの利用が可能です。`uart(4)` のため、`/dev/ttyu0` の設定がそのまま使えます。
    - シリアルコンソールの利用が非常に簡単なため、積極的に利用しましょう（[後述](#シリアルコンソールの活用)）。
- ＵＳＢが有効になってますが、使うことは無いので切った方がいいとは思います（未チューニング）。
    - とは言え `GENERIC` カーネルで無効にするような話でないので、若干のチューニングが必要です（あまりやる気は無い）。
    - `ukbd(4)`、`uhid0`、`ums0` が認識されています。いずれもビデオコンソールが無いと恩恵は受けられません。
    - ビデオコンソールについては未評価です（ＶＮＣコンソール接続について未検証）。

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

## テンプレートイメージの問題
- テンプレートイメージは、現在（2024/03/31）提供されている、13.1-RELEASE を前提としています。将来改修される可能性があります。
- ＵＦＳのみ構成で提供される（許容）。できればＺＦＳ構成それもＵＦＳ＋ＺＦＳの構成があると嬉しいです。
- パーティション構成がアライメントを考慮していません。これは特にＩ／Ｏパフォーマンスにおけるペナルティが怖いです。
    - 現時点では、もっと悪いボトルネックがあると思われるので、このペナルティが現実的かは不明です。
    - 各ファイルシステム毎に（セクターサイズが）５１２バイトと４０９６バイトとバラバラです。ただ致命的ではありません。
    - これはあまりアクセスしないファイルシステムのセクターサイズが効率的でなくても問題無いからです。
    - パーティションの区切り（特に開始）が１ＭＢ（どの辺りで切るかは要検討）境界にありません。
    - ただアライメントが不要な（あまりアクセスしない）パーティションもあるため全面的に悪いわけではありません。
- ＥＳＰ（ＥＦＩシステムパーティション）のサイズが３２ＭＢ強となっています。
    - アライメントを考慮して３２ＭＢ弱にするのが良いと思います。
    - その場合ＦＡＴ３２にはできないので（サイズ不足）、ＦＡＴ１６で構成することになります。
    - ３２ＭＢも必要か？とか、２００ＭＢ、５００ＭＢだろ？という議論についてはノーコメントで。
- クワーク（quirk）が不足しているため、警告が表示されます。
    - ６バイトコマンドには対応していないので、最小コマンドサイズを１０バイトに設定する必要があります（`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>` となります。
    - ＵＮＭＡＰコマンドに未対応のため `CANDELETE` フラグがありません。
    - キャッシュ同期コマンドに未対応のため `CANFLUSHCACHE` フラグがありません。
- cloud-init についてはノーコメントで（未活用・未評価）。
- ＩＰｖ６対応はそれなりに準備が必要です（デフォルトで…という意味で `net/dhcp6`のインストールが必要）。
- なおＩＰｖ６についてはＯＣＩ環境側でも事前セットアップが必要（デフォルト無効）なため、一概に「よろしくない」わけではないです。

### イメージの作り替え
オンザフライで作り直してしまえばいいので、先の問題はほぼ気にならなくなります（人にオススメできなくなりますが）。
[ブート・ボリューム](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/bootvolumes.htm)の「トラブルシューティングおよび修復」を実施することになりますが、そのためにはもう一つインスタンスを立ち上げる必要があります。
また[ブロック・ボリューム](https://docs.oracle.com/ja-jp/iaas/Content/Block/Concepts/overview.htm)はブート・ボリュームにはなりません。そこに救いは無いです（検証済み）。

## ＦｒｅｅＢＳＤカーネルの問題
１３系カーネルは重いです。チューニング不足と思われます。１４系以降で使いましょう。みんなどんどん使ってレポートしよう。

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

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

この問題は [acpi_ged(4)](https://cgit.freebsd.org/src/commit/?id=a9880bfe1181b7a32d026339bae113f24300e5e1)がコミットされた１４系では、下記の `/etc/devd/poweroff.conf` 設定により回避ができます。

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

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

13.1-RELEASE では本機能はありません。素直に１４系を使いましょう。
あるいは「ただちに電源を切断することで、インスタンスを強制停止します」にチェックを入れて「停止」または「再起動」してください。
そうしない場合は１５分待たないと行けなくなります。

## ＯＣＩ側の留意点
Ａ１シェイプは４ＶＭ・４コア・２４ＧＢメモリ・２００ＧＢストレージの利用が可能とありますが、全部使おうとすると警告が出ます。
この警告は上記制限内では無視して設定しても構いません。警告の内容が「アップグレードしないと設定できないように読める」のはしょうがないにしても、実際は無視しても作成はできるので、理解して設定する分には問題無ありません。ただし、

- ４ＶＭ作成（１コア・６ＧＢ・５０ＧＢ／メモリの増減は可能）作成してしまうと、「終了」させてからしらばく「終了状態」になっているＶＭが消えてくれないと、新しいＶＭを作成することができません。
- どれかリソースを消費すると作成はできません。たとえばある１ＶＭに４コア割り当てたら、そのＶＭが残る限り新しいＶＭは立ち上げられません。
- また削除してもすぐにリソースが開放されるわけではないので、若干時間が掛かります（具体的には未計測）。

実用上下記の組み合わせが最大となる。
- （２コア・１２ＧＢ・１００ＧＢ）×２ＶＭ
- （３コア・１８ＧＢ・１５０ＧＢ）ＶＭ＋（１コア・６ＧＢ・５０ＧＢ）ＶＭ ※この時両ＶＭのメモリの加減は可能

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

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

# ＩＰｖ６対応について
事前にＩＰｖ６アドレスの割り当てがなされることが前提での作業となります。こちらは[参考文献](https://qiita.com/500InternalServerError/items/be14d19a8a51601346cb)を参考に設定してください。
[本家資料](https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/ipv6.htm#ariaid-title13)にも書いてあるのですが、いずれの資料もＶＣＮ作成から入ってるので、作成の手順を読み解きながら、既存ＶＣＮに対して変更を実施します。

作成との対比で変更を実施する場合は下記の項目が該当します。
- タスク1: IPv6対応VCNの作成
    - 当該ＶＣＮを選択して編集、設定変更します。
- タスク2: リージョナルIPv6対応パブリック・サブネットの作成
    - 当該サブネットを選択して編集、設定変更します。
- タスク3: インターネット・ゲートウェイの作成
    - 変更に際し、本作業は不要です。
- タスク4: インターネット・ゲートウェイを使用するためのデフォルト・ルート表の更新
    - 追加ルート・ルールでＩＰｖ６の作業のみ対応します。
- タスク5: デフォルト・セキュリティ・リストの更新(オプション)
    - イングレスルールの追加が必要です。[参考文献](https://qiita.com/500InternalServerError/items/be14d19a8a51601346cb#5-セキュリティリストのセキィリティルールの編集)にリストアップされてる差分を参考にしてください。
    - エグレスルールの追加が必要です。エグレスは制限無しとするため、既存（ＩＰｖ４）の設定を参考に、ＩＰｖ６も同じように設定します。
- タスク6: インスタンスの作成
    - これ自体は作業済みなので次へ進みます。
    - またインスタンス作成時にＩＰｖ６の割り当てができない気が…。
- タスク7: IPv6アドレスのインスタンスへの追加
    - 特に変更点はありません。
    - なお複数のＩＰｖ６アドレスの割り当てが可能です。またＤＨＣＰｖ６で設定された複数のＩＰｖ６アドレスの設定が可能です。
- タスク8: IPv6を使用するためのインスタンスOSの構成
    - ＤＨＣＰｖ６でＩＰｖ６アドレスの取得なのは確かです。
    - 異質な点としては、プレフィックスが１２８ビットなため、サブネットはありません。
    - デフォルトゲートウェイ、ネームサーバー（リゾルバ）等の情報はここでは含まれていません。
    - デフォルトゲートウェイについてはＩＣＭＰｖ６ルータ要請メッセージデーモン（`rtsold`）を使用して取得します。
    - ネームサーバー等の情報はＤＨＣＰｖ４で取得したモノを使用します。

サーバー（のＶＮＩＣ）にＩＰｖ６アドレスを割り当てた後、ＯＳ側では `dhcp6` パッケージのインストールを行い、各種設定を行います。
設定後 `service rtsold start` を実行することでＩＰｖ６アドレスが割り当てられます。
なお再起動後は自動的に上記設定が実行されるため、都度実行する必要はありません。

## dhcp6 のインストール
```console
pkg install dhcp6
```

## dhcp6 の設定（ファイル）
```text: /usr/local/etc/dhcp6c.conf
interface vtnet0 {
        send ia-na 1;
};
id-assoc na 1 {
};
```

１はどんな数字でもかまいません（ラベル以上の意味は無い）。
０にしたい場合、`send ia-na 0;` は省略できませんが、`id-assoc na {` と 0 を省略することは可能です（それでも `id-assoc` 設定は必要）。

## ルーター要請メッセージデーモンでのＩＰｖ６割り当て担当の設定
```shell: /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` を実行して、実行フラグを立てておくこと。

## ＩＰｖ６有効化設定
```shell: /etc/rc.conf
ifconfig_vtnet0_ipv6="inet6 accept_rtadv auto_linklocal"

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

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

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

※ＩＰｖ６に関する設定については[ＩＰｖ６対応について](#ｉｐｖ６対応について)の章を確認してください。ここでは省略します。

## /boot/loader.conf

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

## /etc/sysctl.conf
```text: /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
```
※ＺＦＳ構成した場合。また `vfs.zfs.min_auto_ashift` はＺプール作成時しか使用しない。

## /etc/devd/poweroff.conf
```text: /etc/devd/poweroff.conf
notify 10 {
        match "system"          "ACPI";
        match "subsystem"       "Button";
        match "notify"          "0x00";
        action "poweroff";
};
```
※１４系のみ有効

## /etc/make.conf
```makefile: /etc/make.conf
CPUTYPE= neoverse-n1
MACHINE_CPU=
```

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

![serial-connect.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321527/97ac6338-d3c3-75f7-1f4b-db49abd7cf69.png)

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

- 「Cloud Shell接続の起動」： いわゆるＷｅｂＵＩによるシリアル接続。極簡易には使える。
- 「ローカル接続の作成」： ＯＣＩが用意する踏み台サーバー経由でシリアルコンソールにＳＳＨ接続する。

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

下記の図のように、画面一覧の右にある縦三点リーダーをクリックして「Linux/Macのシリアル・コンソール接続のコピー」をクリックします。
![create-local-connection.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/321527/8ea4a05b-be8b-6565-e60f-1df0a5baca80.png)

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

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

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

```ssh:~/.ssh/config
Host ocid1.instance.oc1.リージョン.インスタンスＩＤ
    EscapeChar ~
    ServerAliveInterval 120
    ProxyJump ocid1.instanceconsoleconnection.oc1.リージョン.鍵ＩＤ@instance-console.リージョン.oci.oraclecloud.com:443
```

- `ProxyCommand` での指定は `ProxyJump` に置き換えています。`ProxyJump` が使えない古い環境では上記内容のまま `ProxyCommand` を指定します。
- `EscapeChar` で `~` を指定することで（デフォルトの設定）、[`tip(1)`](https://www.freebsd.org/cgi/man.cgi?tip(1)) コマンド感覚で、「リターンキー」（正確には行頭であればいつでも）→「`~.`」と入力することでＳＳＨセッションを終了することができます。
- `ServerAliveInterval` で秒単位でＳＳＨセッションの維持を図ります。この指定が無い場合はいつのまにか強制切断されます（経過時間は未計測）。またもっと長くできるかは未計測です。踏み台サーバーとの間に入るファイアウォールやＮＡＴ箱等の通信機器の都合も発生するため、環境依存です。
- `ProxyJump` 設定に置き換えるとよくわかりますが、シリアルコンソールのための踏み台サーバーは２２番ポートではなく４４３番ポートで運用されています。

上記設定が完了すれば、下記のようにしてシリアルコンソールに接続できます。
```console
$ ssh ocid1.instance.oc1.リージョン.インスタンスＩＤ

=================================================
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
=================================================
```

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

### Ｑ．接続出来ません！何故か接続が終了してしまいます。
Ａ．知るかボケェ！ 状況を切り分けろ。大抵は極めて些細で大きい設定ミスです。というわけで大枠で下記の３つの要因があります。

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

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

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

### Ｑ．繋がったみたいですが何か定型文が表示されて、その後反応がありません。
Ａ．リターンキーでも押せばログインがうながされるので、シリアルコンソールに繋がっていることが確認できます。

# アクセス制限（セキュリティリスト）について
デフォルトで、インターネットからの接続はＳＳＨのみとなっています。この設定を変更したい場合についてＴＯＤＯ。

### Ｑ．`Unable to negotiate with XXX.XXX.XXX.XXX port 443: no matching host key type found. Their offer: ssh-rsa` と表示されて接続できません！
Ａ．新しい目のＯｐｅｎＳＳＨで `ssh-rsa` サポートが切れたことによります。このケース（ポート番号が４４３である点に留意）では下記のような設定を行う必要があります。ホスト鍵と公開鍵の両方で使えるように明示する必要があります。

```ssh:~/.ssh/config
Host instance-console.リージョン.oci.oraclecloud.com
    Port 443
    HostkeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa
```

ちなみにこちらはＯＣＩが用意する踏み台サーバーとなるＳＳＨサーバーの問題です（後述）。似たような問題ですが、直後の問題とは微妙に起きてる箇所が違います。

### Ｑ．`Unable to negotiate with UNKNOWN port 65535: no matching host key type found. Their offer: ssh-rsa` と表示されて接続出来ません！
Ａ．新しい目のＯｐｅｎＳＳＨで `ssh-rsa` サポートが切れたことによります。このケースでは下記のような設定を行う必要があります。ホスト鍵と公開鍵の両方で使えるように明示する必要があります。

```ssh:~/.ssh/config
Host ocid1.instance.oc1.リージョン.インスタンスＩＤ
    EscapeChar ~
    ServerAliveInterval 120
    HostkeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa
    ProxyJump ocid1.instanceconsoleconnection.oc1.リージョン.鍵ＩＤ@instance-console.リージョン.oci.oraclecloud.com:443
```

こちらはＯＣＩが用意する踏み台サーバーから見える、インスタンスのシリアルポート（シリアル→ＳＳＨ変換）の問題です（前述）。似たような問題ですが、直前の問題とは微妙に起きてる箇所が違います。

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

## Ｑ．ＡＲＭ６４とＡＡＲＣＨ６４って何が違うの？
Ａ．イコールとのこと。今後はＡＡＲＣＨ６４で統一されていく方向らしい（伝聞）。とは言え、ＡＲＭ６４が嘘か…と言われるとそうでもないので、たぶん両者ともにずっと残ると思われ。

ただしＦｒｅｅＢＳＤのビルドとしては `TARGET=arm64`、`TARGET_ARCH=aarch64` で（クロス）コンパイルされます。
[１３．１リリースノート](https://www.freebsd.org/releases/13.1R/announce/#_aarch64_generic)を見てると FreeBSD/arm64 と表現される向きもあるが、FreeBSD/aarch64 という表記と混在になってるので、その辺りは生暖かく見守ってあげる方向で。

## Ｑ．マーケットプレースはパートナーイメージですか？
Ａ．マーケットプレースとはパートナーイメージのことである。またパートナーイメージとはマーケットプレースのことである。
これは、よくあるオラクルサトリ（悟り／オラクルはアメリカ合衆国テキサス州オースティンの会社だけど）である。

## Ｑ．面白そう！でもＯＣＩの会員登録したいのですができません！
Ａ．諦めろん。しょっちゅう止まってるという話を聞きました。何日かに一回試すと上手くいくことがあると聞いています。

# 参考文献
- [クラウド・インフラストラクチャー](https://www.oracle.com/jp/cloud/)
- [OCI Cloud Free Tier](https://www.oracle.com/jp/cloud/free/)
- [コンピュート・シェイプ](https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/computeshapes.htm)
- [IPv6アドレス](https://docs.oracle.com/ja-jp/iaas/Content/Network/Concepts/ipv6.htm)
- 参考にした情報
    - [OCIってAWSとどう違うの？基礎知識まとめた＆無料で入門資格チャレンジしてみた](https://qiita.com/minorun365/items/d121b19e041c715fad3e)
    - [無料？！Oracle Cloud の信じられない程スペックいいVPSを作ってみました](https://qiita.com/adwin/items/39dc24e53733eed14d6d)
    - [[OCI] IPv6に対応した仮想クラウドネットワーク（VCN）を作成して、自宅からIPv6アドレスで仮想マシンにアクセスしてみた](https://qiita.com/500InternalServerError/items/be14d19a8a51601346cb)
    - [Oracle Cloud: シリアル・コンソール接続して Single User Mode でログインしてみてみた](https://qiita.com/shirok/items/5a4e90a8ed092b01502d)
    - [OCIモバイル・アプリでComputeの起動を試してみた](https://qiita.com/kazunishi/items/8ff1329f15a4dfe79569)
    - [[OCI]Oracle Cloud Infrastructure コンソールにサインインする際の手間を省力化するTips](https://qiita.com/500InternalServerError/items/df643e2b4572a2f961d4)
- ＣＰＵに関する情報
    - [Ampare Altra](https://amperecomputing.com/processors/ampere-altra/)
    - [オラクルがArm NeoverseベースのクラウドインスタンスとしてOCI Ampere A1 Computeを提供](https://www.arm.com/ja/company/news/2021/05/27-5-2021-oracle-adds-arm-neoverse-based-cloud-instances-with-oci-ampere-a1)
- ＦｒｅｅＢＳＤに関する情報
    - [FreeBSDarm64 now available in OCI](https://blogs.oracle.com/cloud-infrastructure/post/freebsdarm64-now-available-in-oci)
    - [Ampere: Getting Cloud-Native with FreeBSD on OCI Ampere A1 with Terraform](https://freebsdfoundation.org/news-and-events/latest-news/ampere-getting-cloud-native-with-freebsd-on-oci-ampere-a1-with-terraform/)
    - [Getting Cloud-Native with FreeBSD on OCI Ampere A1 with Terraform](https://amperecomputing.com/blogs/2022-10-07/getting-cloud-native-with-freebsd-on-oci-ampere-a1-with-terraform-.html)
- [Posts Tagged freebsd](https://people.freebsd.org/~dch/tags/freebsd/)
    - [Using OCI command-line tools to Upload FreeBSD images](https://people.freebsd.org/~dch/posts/2022-04-04-custom-oci-images.html)
    - [Custom-built FreeBSD Images for OCI](https://people.freebsd.org/~dch/posts/2022-03-26-building-custom-freebsd-images.html)
    - [Booting FreeBSD on Ampere's Awesome Altra CPUs](https://people.freebsd.org/~dch/posts/2021-07-02-oci-bringup.html)

# 謝辞
- ＩＰｖ６回りの調査・作法について [hrs](https://qiita.com/bsdhrs)さんから多大なるヒントおよび指導をいただきました。この場にて感謝申し上げます。
- acpi_ged(4) の実装と devd(8) での見え方、devd.conf(5) への書き方について、[takawata](https://twitter.com/takawata19/)さんから多大なるヒントおよび指導をいただきました。この場にて感謝申し上げます。