はじめに
FreeBSD(13.1-RELEASE/2024年03月31日現在)を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.0-RELEASE はセットアップ後、ソースコードからビルド(make world kernel
)して入れ替えています。もちろん freebsd-update
でも問題ありません。なお運用するなら 14.0-RELEASE 以降を推奨します。インストールイメージは残念ながら 13.1-RELEASE(2024/03/31現在)となっています。
以後 13.1-RELEASE(その後リリースされた 13.3-RELEASE 含む)を13系、14.0-RELEASE を14系と省略します。
Arm Ampere A1 Compute インスタンスとは
OCIにて Ampere社のAltraコア(CPU)を採用した、ARMベースプロセッサの第一世代環境(A1)の仮想マシンです。
OCIではインスタンス種別を「シェイプ」と表現しており、下記のルールで命名・運用されています。
インスタンスタイプ.シェイプタイプ.シェイプサイズ
- インスタンスタイプ
-
VM
(仮想マシン・バーチャルマシン) -
BM
(物理マシン・ベアメタル)
-
- シェイプタイプ ※nはハードウェア・プロセッサの世代
-
Standardn
(Intel Xeon) -
Standard.En
(AMD EPYC) -
Standard.An
(Ampere Altra) - 他にも
DenseIO
やGPU
、Optimized
があるがここでは省略
-
- シェイプサイズ
- 割り当てられるCPUコア数(とコア数に相応するメモリサイズ) ※委細省略
-
Flex
が付いてるシェイプは割り当てられるCPUコア数とメモリサイズを個別に指定することができる構成を意味する
本件では VM.Standard.A1.Flex
を使用するのでこの命名規則に慣れておくことをオススメします。
仮想マシンの立ち上げ
今時点でテンプレートイメージの完成度が低いため、軽く紹介程度に留めておきます。下記図において赤丸でくくった箇所の選択・入力することで、セットアップできます。
ホスト環境(仮想化基盤)
- ゲスト(OS)から見たところ、QEMUであることから、ホスト環境はKVMと思われます。
- CPUタイプは
neoverse-n1
で、このCPUタイプに合わせてコンパイルすると少しは速くなると思われます。 - ただし x86_64 アーキテクチャと違って arm64 はまだ若いので、ISAにそう大きな違いがあるわけではありません。
- ストレージ種別は
vtscsi(4)
でCAMの管理下にあります。ただし、- UNMAP(いわゆるTRIM、SCSIなのでUNMAP)コマンドに未対応
-
camcontrol identify
に未対応 -
camcontrol tags
は対応してるらしい(正確な情報かは不明)
- ネットワークインターフェースは
vtnet(4)
です。特に言うことは無いです。 - シリアルコンソールの利用が可能です。
uart(4)
のため、/dev/ttyu0
の設定がそのまま使えます。- シリアルコンソールの利用が非常に簡単なため、積極的に利用しましょう(後述)。
- USBが有効になってますが、使うことは無いので切った方がいいとは思います(未チューニング)。
- とは言え
GENERIC
カーネルで無効にするような話でないので、若干のチューニングが必要です(あまりやる気は無い)。 -
ukbd(4)
、uhid0
、ums0
が認識されています。いずれもビデオコンソールが無いと恩恵は受けられません。 - ビデオコンソールについては未評価です(VNCコンソール接続について未検証)。
- とは言え
感想
現時点(2022/11/13および2024/03/31)での、色々と試行錯誤した感想について述べます。単純に言えば、実用には若干問題があります。ただ工夫で回避できる部分もあります。
ただし現在、UFS(ブート)+ZFS(ルート)の、自分的にはマジ運用モード構成で検証しているため、デフォルトのUFSオンリーの構成だと、評価が変る可能性があります。
テンプレートイメージの問題
- テンプレートイメージは、現在(2024/03/31)提供されている、13.1-RELEASE を前提としています。将来改修される可能性があります。
- 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"
という設定を実施すれば警告も回避できます。
- 6バイトコマンドには対応していないので、最小コマンドサイズを10バイトに設定する必要があります(
- 実際
sysctl kern.geom.disk.da0.flags
の結果はb2<OPEN,UNMAPPEDBIO,DIRECTCOMPLETION,CANZONE>
となります。- UNMAPコマンドに未対応のため
CANDELETE
フラグがありません。 - キャッシュ同期コマンドに未対応のため
CANFLUSHCACHE
フラグがありません。
- UNMAPコマンドに未対応のため
- cloud-init についてはノーコメントで(未活用・未評価)。
- IPv6対応はそれなりに準備が必要です(デフォルトで…という意味で
net/dhcp6
のインストールが必要)。 - なおIPv6についてはOCI環境側でも事前セットアップが必要(デフォルト無効)なため、一概に「よろしくない」わけではないです。
イメージの作り替え
オンザフライで作り直してしまえばいいので、先の問題はほぼ気にならなくなります(人にオススメできなくなりますが)。
ブート・ボリュームの「トラブルシューティングおよび修復」を実施することになりますが、そのためにはもう一つインスタンスを立ち上げる必要があります。
またブロック・ボリュームはブート・ボリュームにはなりません。そこに救いは無いです(検証済み)。
FreeBSDカーネルの問題
13系カーネルは重いです。チューニング不足と思われます。14系以降で使いましょう。みんなどんどん使ってレポートしよう。
- KVM準仮想化タイマー
kvm_clock(4)
が移植されていません。- これが無いことの影響は不明ですが、実装のきっかけを考えると、あった方が良いと思われます。
- タイマー割り込み周波数が仮想マシン上で稼動するには高すぎる嫌いがあります。
- 一般に100ヘルツで動かすのが定石ですが、これが1000ヘルツで動いています(物理環境扱い)。
-
/boot/loader.conf
にてkern.hz="100"
という設定を入れれば回避できます。 - よく見る仮想化ホスト環境であれば
kern.hz="100"
に自動的に設定してくれるので、この情報がカーネルには入っていません。 - 実際
sysctl kern.vm_guest
の結果はnone
と出ます(kvm
と表示して欲しい想定)。
- ユーザーランドの負荷に対してシステム(カーネル内処理)負荷が極めて高いです(14系では改善されています)。
- 原因は不明。ただしコンテキストスイッチングが極端に増えることはありません(調べてたら
kern.hz
問題に気がついた)。 - ただあまり見ることが無い
pagedaemon
が活発に活躍しているのが気になります。 - ページング処理ないしはページゼロクリア処理が重いのだろうか?
- 原因は不明。ただしコンテキストスイッチングが極端に増えることはありません(調べてたら
- ただしI/O負荷は極めて小さいです。ごく普通(物理環境と同程度の)のI/O負荷率です。
「停止」と「再起動」操作
管理コンソールより「停止」および「再起動」の操作が反映されません。この操作を実施後900秒(15分)経過した後、オペレーションが強制されます。
よってゲスト(OS)から見ると突然電源断されたように見えます。これは再起動後に fsck(8)
といった処理が走る原因となります。
この問題は acpi_ged(4)がコミットされた14系では、下記の /etc/devd/poweroff.conf
設定により回避ができます。
notify 10 {
match "system" "ACPI";
match "subsystem" "Button";
match "notify" "0x00";
action "poweroff";
};
またOCIにおける「再起動」は「停止」後「起動」することで実装されているため、上記設定で全て対応できます。
13.1-RELEASE では本機能はありません。素直に14系を使いましょう。
あるいは「ただちに電源を切断することで、インスタンスを強制停止します」にチェックを入れて「停止」または「再起動」してください。
そうしない場合は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 の設定(ファイル)
interface vtnet0 {
send ia-na 1;
};
id-assoc na 1 {
};
1はどんな数字でもかまいません(ラベル以上の意味は無い)。
0にしたい場合、send ia-na 0;
は省略できませんが、id-assoc na {
と 0 を省略することは可能です(それでも id-assoc
設定は必要)。
ルーター要請メッセージデーモンでのIPv6割り当て担当の設定
#!/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有効化設定
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
kern.hz="100"
kern.cam.da.0.minimum_cmd_size="10"
/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
notify 10 {
match "system" "ACPI";
match "subsystem" "Button";
match "notify" "0x00";
action "poweroff";
};
※14系のみ有効
/etc/make.conf
CPUTYPE= neoverse-n1
MACHINE_CPU=
シリアルコンソールの活用
UIがあまりよろしい感じで無いでないので、気がつきにくいのですが、下記図で赤丸で囲ったのように「インスタンス詳細画面」の左下、「リソース」の欄に「コンソール接続」というリンクがあります。
コンソールの利用方法は以下の2点があります。前者に関しては難しいことは無いので、後者について説明します。
- 「Cloud Shell接続の起動」: いわゆるWebUIによるシリアル接続。極簡易には使える。
- 「ローカル接続の作成」: OCIが用意する踏み台サーバー経由でシリアルコンソールにSSH接続する。
「ローカル接続の作成」ボタンを押すとSSH鍵の設置が求められますので、自分の都合に合わせてRSAキーを設定します。なおRSA鍵のみ対応で、より新しいタイプのSSH鍵には対応していません。
その後「コンソール接続の作成」ボタンを押すことで準備が完了します。
下記の図のように、画面一覧の右にある縦三点リーダーをクリックして「Linux/Macのシリアル・コンソール接続のコピー」をクリックします。
下記のようなテキストがコピーされるので、ペーストして接続します。
ssh -o ProxyCommand='ssh -W %h:%p -p 443 ocid1.instanceconsoleconnection.oc1.リージョン.鍵ID@instance-console.リージョン.oci.oraclecloud.com' ocid1.instance.oc1.リージョン.インスタンスID
実際の利用に際しては、SSHクライアントの設定にもよるのですが、OpenSSHの場合、下記のような設定を行うことで、手軽にシリアルコンソールに接続できるようになります。
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.Unable to negotiate with XXX.XXX.XXX.XXX port 443: no matching host key type found. Their offer: ssh-rsa
と表示されて接続できません!
A.新しい目のOpenSSHで ssh-rsa
サポートが切れたことによります。このケース(ポート番号が443である点に留意)では下記のような設定を行う必要があります。ホスト鍵と公開鍵の両方で使えるように明示する必要があります。
Host instance-console.リージョン.oci.oraclecloud.com
Port 443
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
ちなみにこちらはOCIが用意する踏み台サーバーとなるSSHサーバーの問題です(後述)。似たような問題ですが、直後の問題とは微妙に起きてる箇所が違います。
Q.Unable to negotiate with UNKNOWN port 65535: no matching host key type found. Their offer: ssh-rsa
と表示されて接続出来ません!
A.新しい目のOpenSSHで ssh-rsa
サポートが切れたことによります。このケースでは下記のような設定を行う必要があります。ホスト鍵と公開鍵の両方で使えるように明示する必要があります。
Host ocid1.instance.oc1.リージョン.インスタンスID
EscapeChar ~
ServerAliveInterval 120
HostkeyAlgorithms +ssh-rsa
PubkeyAcceptedAlgorithms +ssh-rsa
ProxyJump ocid1.instanceconsoleconnection.oc1.リージョン.鍵ID@instance-console.リージョン.oci.oraclecloud.com:443
こちらはOCIが用意する踏み台サーバーから見える、インスタンスのシリアルポート(シリアル→SSH変換)の問題です(前述)。似たような問題ですが、直前の問題とは微妙に起きてる箇所が違います。
よくある質問とその答え
Q.ARM64とAARCH64って何が違うの?
A.イコールとのこと。今後はAARCH64で統一されていく方向らしい(伝聞)。とは言え、ARM64が嘘か…と言われるとそうでもないので、たぶん両者ともにずっと残ると思われ。
ただしFreeBSDのビルドとしては TARGET=arm64
、TARGET_ARCH=aarch64
で(クロス)コンパイルされます。
13.1リリースノートを見てると FreeBSD/arm64 と表現される向きもあるが、FreeBSD/aarch64 という表記と混在になってるので、その辺りは生暖かく見守ってあげる方向で。
Q.マーケットプレースはパートナーイメージですか?
A.マーケットプレースとはパートナーイメージのことである。またパートナーイメージとはマーケットプレースのことである。
これは、よくあるオラクルサトリ(悟り/オラクルはアメリカ合衆国テキサス州オースティンの会社だけど)である。
Q.面白そう!でもOCIの会員登録したいのですができません!
A.諦めろん。しょっちゅう止まってるという話を聞きました。何日かに一回試すと上手くいくことがあると聞いています。
参考文献
- クラウド・インフラストラクチャー
- OCI Cloud Free Tier
- コンピュート・シェイプ
- IPv6アドレス
- 参考にした情報
- CPUに関する情報
- FreeBSDに関する情報
- Posts Tagged freebsd