2月 052024
 

以前のエントリで「bhyve の ubuntu で Intel Wi-Fi 6 AX200 を利用する。」と、いうエントリを書きました。そして、一個前のエントリ「NiPoGi GK3Pro ミニ PC 購入。」では MINI PC には VMware ESXi ではなく bhyve で仮想環境を構築した。と、書いています。

bhyve は基本的にコマンドをチマチマ打っていく状態だったので『GUI で簡単に仮想サーバ構築とかできないのかなぁ?』と思って探してみるとあるようですねぇ。 FreeBSD の ports にはなっていないようですが、GitHub からダウンロードできるようです。

https://github.com/DaVieS007/bhyve-webadmin

ここから bhyve-webadmin-master.zip をダウンロードして展開します。
今回ダウンロードしたのは BVCP という bhyve をウェブベースの GUI で管理できるものになります。
インストール先の FreeBSD では bhyve の環境が整っている必要があります。上記の「bhyve の ubuntu で Intel Wi-Fi 6 AX200 を利用する。」のエントリ中の『1. FreeBSD 母艦側の設定』の部分の設定をまず先済ませておく必要があります。

 
1.インストール
展開後にその中にある install.sh を実行します。以下、簡単なテキストキャプチャです。
指定するのは唯一データを管理するディレクトリを指定するのみです。今回は /opt/bhyve を指定しました。

# unzip bhyve-webadmin-master.zip
<略>
# cd bhyve-webadmin-master
# ./install.sh

                    ██████╗ ██╗   ██╗ ██████╗██████╗ 
                    ██╔══██╗██║   ██║██╔════╝██╔══██╗
                    ██████╔╝██║   ██║██║     ██████╔╝
                    ██╔══██╗╚██╗ ██╔╝██║     ██╔═══╝ 
                    ██████╔╝ ╚████╔╝ ╚██████╗██║     
                    ╚═════╝   ╚═══╝   ╚═════╝╚═╝     

            Bhyve Virtual-Machine Control Panel under FreeBSD
        
 N  2024-02-05 09:38:25 | BVCP | Initialising BVCP-Backend 1.9.8-p9 Application

  [>] Generating Entropy ... [9BA2FE3E0EC4B6D72CF2E6760FF5B0AA]

 Welcome to initial setup menu!
 The Software is located at: /var/lib/nPulse/BVCP

 The Software is producing pseudo filesystem scheme for virtual machines using symlinks
 Where to create metadata, iso_images, database, config, logs: (Does not need much space), default: [/vms]_> /opt/bhyve
<略>
 N  2024-02-05 09:40:08 | BVCP | Initialising BVCP-Backend 1.9.8-p9 Application
 N  2024-02-05 09:40:10 | BVCP | Starting Database ...
 (!) Admin Credentials recreated,
   - User: admin
   - Password: LmZH4kXD

 N  2024-02-05 09:40:10 | SW | Program exited gracefully...
Installation Finished!
Navigate: https://[your-ip]:8086
#

 
BVCP のデータ管理用ディレクトリを指定してインストールすると上記のようになって終わります。ウェブログインするパスワードが表示されているので覚えておきましょう。

インストール先についてですが、以下のようになっています。

  • BVCP のベースプログラムは /var/lib/nPulse/ にインストールされます
  • /etc/rc.conf に bvcp_enable=”YES” という文字列が追加されます
  • /usr/local/etc/rc.d/ 内に bvcp-backend bvcp-frontend bvcp-helper の三つのファイルが追加されます
  • データ保存先の /opt/bhyve/ が作成されます

 
上記のディレクトリ、ファイルを全て削除することによりまっさらな状態(uninstall した状態)となります。

 
2.仮想マシン作成前の準備
インストール後ウェブブラウザから https://wanchan.running-dog.net:8086 などとアクセスします。

インストール時に控えていた admin とそのパスワードでログインし、まずは右上をクリックしアカウントの管理として Account Settings から自分のメールアドレスを登録しましょう。

 
新規にアカウントを作成したら admin をログアウトして、新しいユーザでログインし直してと。
仮想マシンが利用する HDD イメージを保存するストレージを指定します。大容量のディレクトリを指定しましょう。

NFS 領域も指定できます。Active 系 bhyve 母艦がダウンすると NFS 上にゲスト OS のイメージがあるので Standby 系を Active にしてゲスト OS を起動できたりするので冗長構成が取れそうですね。

 
次にネットワークを設定します。
VLAN などの設定は母艦の FreeBSD 側で先に設定しておく必要があります。必要であれば設定しておきましょう。この辺り VMware ESXi 的に言うと vmnic0 に VLAN 単位の vSwitch を生成して、それを仮想マシンで利用する。みたいな雰囲気ですね。
母艦の FreeBSD が利用できないネットワークインターフェースは当然 bhyve でも利用できません。
pptdevs 経由で仮想マシン側にデバイス渡したくても BVCP の UI にデバイスを渡すオプションは今のところ無いようです。

ネットワークを作成する場合は em0 とか re0 などを一個含めておくと、bridge300 番台を生成してくれます。母艦側の FreeBSD の VLAN インターフェースも指定可能です。
その後、仮想マシンを作成したタイミングで tap300 番台を自動生成してくれ、かつ、それを bridge として追加してくれるようになります。
母艦側の NIC を含めないネットワークを作成すると、それは裏 LAN 的な、外に出ていかないネットワークとなります。

これで、アカウント・ストレージ・ネットワークの設定が完了しました。

 
3.仮想マシン作成
ここまで来たらいよいよ仮想マシンの追加をします。一番最初は OS の雛形を指定することになります。

対応している OS は FreeBSD・Linux・Windows になります。まぁ、それだけあれば十分か? macOS は FreeBSD かな?デバイスの形態が全く違うけど・・。 VyOS は Linux ですな。では Solaris は? まぁ、その話は置いといて・・f(^^;;。

雛形を作成したら次に作成した OS を選択して詳細を設定していきます。まぁ、GUI なので直感的に設定ができますよね。

色々細かい設定とかありますが、まずは OS をインストールしなければならない。
Virtual Hardware のところでは CPU 数やメモリ容量の変更ができます。

インストールのために CD-ROM Drive を指定します。ISO イメージを、データを管理するディレクトリ内に設置します。今回の環境での場所としては /opt/bhyve/iso_images/ になります。このディレクトリ内に保存します。

次に HDD イメージを作成します。登録したストレージ内に必要な容量を選択します。
その次に追加された HDD イメージの詳細設定を行います。

Name / Description は書いておいたほうが良いでしょう。 LUN Slot は気分的な設定値ですが、仮に HDD を複数接続したときに番号をずらしたほうが良さそうな雰囲気ですよね。
Attach Disk にチェックを入れると OS 側で HDD を認識するようになります。

作成した HDD は 今回の環境では NFS 領域の /media/Strage/ に vm_images というディレクトリが作成され、その中に格納され /media/Strage/vm_images/ubuntu01_disk01.img になります。 仮想マシン登録時に指定した Machine Name の ubuntu01 (小文字になる)と Name / Description で指定した disk01 を合わせたファイル名になります。

最後にネットワークを指定します。
自分が接続したいネットワークの指定と、ドライバを指定します。ドライバは FreeBSD 的に言うと vtnet0 と em0 の二つが選べます。 WindowsOS をインストールするときは Intel Pro 1000 を指定したほうが良いかもです。

 
これで設定がぜんぶ完了しましたかね。

 
4.いよいよ起動
では左上にある緑色の Start ボタンを押しましょう。そして起動後に現れる VNC Console をクリックすると別ウィンドでコンソールが表示され OS がブートするところを確認できます。その後 OS のインストールを進め、再起動してインストール完了。
apt -y update などで最新の OS 状態にしたり apt-get install でパッケージを色々インストールして最低限の環境を構築すれば良いですね。

ここで一旦 OS を停止して /media/Strage/vm_images/ubuntu01_disk01.img をバックアップしておけば、もう一個 OS を作成したいときにタネ用 HDD として利用できます。
新規に ubuntu02 とかを作成するときに Create Virtual Disk のところでうまいこと指定することができます。

あと、起動時に毎回コンソールに入る状態になっているのですが、一番上の Options の中の Wait for console: を No にすると、コンソール画面を開く必要はなくスルっと起動するようになります。

 
自分で作成した環境で、コマンドベコベコ打って仮想マシンを作成していたとき、WindowsOS は中々起動できなかったのですが BVCP を利用すると簡単に起動させることができます。
母艦側には潤沢な資源が必要になりますが、僕が試してみたところ Windows11 Pro と Window Ssever 2019 が起動できて動作しています。
まぁ、Windows11 の場合は BypassTPMCheck と BypassSecureBootCheck は必須になりますが、ここでは省略します;-)。

とまぁ、比較的簡単に bhyve を利用したウェブ UI の仮想環境が構築できました。

 
今回の BVCP を利用した bhyve 環境は、新規の仮想環境の構築となります。今までコマンドベースで自分の趣味を反映した bhyve 環境で用意したモノを再利用しようとしてもほぼ利用できません。
例えば BVCP 環境下で作成した FreeBSD のディスクイメージを自分がコマンドベースで作成した bhyve 環境に持っていって起動しようとしても、ブート時のデバイス認識のところでエラーになって起動しなかったりします。その逆もしかりです。

今までのコマンドベースで構築した環境・仮想マシンを捨てて、新しく BVCP 環境に移行するか、コマンドラインベース環境と同居するか悩みます。が、やっぱ GUI 環境のほうが楽だね。になると思いますが・・f(^^;;。

 
5.そろそろエンディング
前回のエントリでは Intel Celeron N5105 な NiPoGi GK3Pro ミニ PC で VMwareESXi が動作しないような環境(動作したとしてもデバイスを認識しないような PC の構成)においても FreeBSD が動作するのであれば bhyve による仮想環境が構築可能である。と記載しています。
そこに今回 GUI ベースで bhyve を動作させることにより、ますます bhyve のしきいが低くなりました。これで楽しさが広がりますねぇ;-)。

これは僕の仮想マシン一覧になりますが、母艦は FreeBSD/amd64 14.0-RELEASE で動作しております。仮想マシンとして動作している freebsd03 は FreeBSD/amd64 13.2-RELEASE で、現在起動中です。
この freebsd03 内では qemu を利用した chroot で中に入る環境があって、そこは FreeBSD/arm64 13.2-RELEASE の環境が構築されており ports のコンパイルなどを行っております。

こんな非常にややこすぃーい環境も構築できるのが良いっ!! ;-P

1月 272024
 

前回の Beelink MINI S 購入に引き続き、もう一個 MINI PC を購入してみしました。

と、いうのも比較的小型の OS が可動する装置としては Raspberry Pi を持っているのですが、どうも FreeBSD 14.0-RELEASE を arm7 とか arm64 で動作させるのに嫌気が差してきて『素直に amd64 で良いじゃん。』と、なり、今回の MINI PC の購入となったのでありました。

今回購入したのは NiPoGi GK3Pro ミニ PC というらしいです。これは Intel の第 12 世代プロセッサである Intel Celeron N5105 を搭載しています。メモリは 8GB で SSD は 256GB です。このスペックで 15,000yen 前後なので、随分と安い。今だと Raspberry Pi 4 とかと同じくらいではないかなぁ・・。値段的にも一緒であれば、 arm64 でなくとも良いよねぇ。みたいな・・。

ただ、値段が安いだけのことはあります。SSD は NMVe ではなく、SATA 接続の M2.SSD です。

安さの秘訣を一覧にしてみましょう。あ。全て FreeBSD/amd64 14.0-RELEASE で認識した内容です。

  • SSD は上にも書いた通り M2 SATA で 256GB の容量
  • サウンドカードは USB 接続の C-Media Electronics Inc. USB Audio Device で snd_uaudio.ko で認識
  • Bluetooth も USB 接続で Realtek Bluetooth Radio で ng_ubt.ko で認識されますが利用できるかは知りません
  • WiFi は Realtek RTL8821CE で if_rtw88.ko で認識できますが、まだ利用できません。これは PCIe にぶるさがっているっぽい

 
この辺りで基本的にプライスダウンしている感じでしょうか。ほとんどのデバイスが USB にぶるさがっているので BIOS の画面から Disable にできません。『FreeBSD で利用できないデバイスなんて要らないよー。』とか思って BIOS 画面覗いても Disable にする項目がないです・・。orz

pciconf -lv してみると none が 11 個もありますが、これは Intel の Celeron プロセッサを使っている PC のパターンでしょうか。

あと、悲しいことに、最近の PC のはずなのに USB-C ポートがありません。これは結構ショックでかい・・。orz。

 
この PC の使い方
さてと。気を取り直して・・。
例の如く、この手の中華製 MINI PC は付属の WindowsOS の出どころが非常に怪しいので、サクっと削除。
Windows Product Key Viewer という Windows のプロダクトキーを確認するアプリでチェックしてみると、やはり “B” のみが並んでおりました。これは Beelink SER4 を購入してチェックしたときにと一緒ですね。

しょーがないので FreeBSD 専用の PC にすることにしました。チョイスした OS は FreeBSD/amd64 14.0-RELEASE です。 CPU の Intel Celeron N5105 には Intel のバーチャリゼーション機能が搭載されているので vmm.ko を kldload した場合は bhyve で仮想環境が構築でき、また、起動時に vmm.ko を kldload していなければ virtualbox が起動できます。

この手の MINI PC って VMware ESXi が動作しなかったり、動作してもデバイスを認識してくれなかったりするので FreeBSD をインストールして仮想環境を構築するのはアリです。まあ、 VMware ESXi は Broadcom に買収されて、その後無料版の VMware ESXi がなくなることになるので FreeBSD+bhyve は今のところチョー注目株です;-)。
AlmaLinux+Docker の環境よりしきいが低いですかね。

ただ、その場合、メモリ 8GB はちょっと量が少ないので 16GB に拡張したほうが良いですかね。
Intel の Celeron N5105 のサイトを見ると対応メモリは 16GB までのようです。

HDMI の上の黒いパーツのネジを一本外して、横にスライドさせると内部にアクセスできます。

MINI PC の上のフタを開けると 2.5 インチの SATA SSD が装着できます。その下にメモリスロットが一個あって default で 8GB のメモリが入っいます。メモリ換装は簡単そうです。 M2.SATA SSD を換装するか、換装せずに 2.5 インチ STAT SSD を増設するか、微妙ではありますね。

ちなみに、上記の写真に写っているのは銅板ではありません。ただ単にテカリのあるプラスチックです:-|。

 
あ。そーそー。この MINI PC は、一個目の HDD として追加の 2.5 インチ STAT SSD が認識され、内蔵の M2.SATA SSD は二個目として認識されます。ちょっとーっ!! この辺りもおかしいよねぇ・・。 orz

以下は mount コマンドの結果。

/dev/ada1p2 on / (ufs, local, soft-updates, journaled soft-updates)
devfs on /dev (devfs)
/dev/ada1p1 on /boot/efi (msdosfs, local)
/dev/ada1p3 on /home (ufs, local, soft-updates, journaled soft-updates)
/dev/ada1p4 on /usr (ufs, local, soft-updates, journaled soft-updates)
/dev/ada1p5 on /var (ufs, local, soft-updates, journaled soft-updates)
/dev/ada0p1 on /opt (ufs, local, soft-updates)
<以下略>

 
何もかも怪しい筐体です・・。orz。

 
FreeBSD もインストールしたし virtualbox に WindowsOS もインストールしたので、これは外に持ち出しも OK っぽい。
仕事でデータセンタ行ったとき、IP アドレス付加したあとに inetd 経由で sredird が動作すればポートサーバ風に利用できてコンソール接続も可。なんてこともできるし。

小さいので夢が膨らみます;-)。

 
最後にですが、全然デバイスが認識できていない pciconf-lv の結果を添付してこのエントリは終了とします;-)。

hostb0@pci0:0:0:0:      class=0x060000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4e24 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = HOST-PCI
vgapci0@pci0:0:2:0:     class=0x030000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4e61 subvendor=0x8086 subdevice=0x2212
    vendor     = 'Intel Corporation'
    device     = 'JasperLake [UHD Graphics]'
    class      = display
    subclass   = VGA
none0@pci0:0:4:0:       class=0x118000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4e03 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Dynamic Tuning service'
    class      = dasp
xhci0@pci0:0:20:0:      class=0x0c0330 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4ded subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
    subclass   = USB
none1@pci0:0:20:2:      class=0x050000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4def subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = memory
    subclass   = RAM
none2@pci0:0:21:0:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Serial IO I2C Host Controller'
    class      = serial bus
none3@pci0:0:21:1:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de9 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Serial IO I2C Host Controller'
    class      = serial bus
none4@pci0:0:21:2:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dea subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none5@pci0:0:22:0:      class=0x078000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de0 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Management Engine Interface'
    class      = simple comms
ahci0@pci0:0:23:0:      class=0x010601 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dd3 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = mass storage
    subclass   = SATA
none6@pci0:0:25:0:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc5 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none7@pci0:0:25:1:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc6 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
sdhci_pci0@pci0:0:26:0: class=0x080501 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc4 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = base peripheral
    subclass   = SD host controller
pcib1@pci0:0:28:0:      class=0x060400 rev=0x01 hdr=0x01 vendor=0x8086 device=0x4db8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-PCI
pcib2@pci0:0:28:1:      class=0x060400 rev=0x01 hdr=0x01 vendor=0x8086 device=0x4db9 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-PCI
none8@pci0:0:30:0:      class=0x078000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = simple comms
none9@pci0:0:30:3:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dab subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
isab0@pci0:0:31:0:      class=0x060100 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4d87 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-ISA
hdac0@pci0:0:31:3:      class=0x040300 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake HD Audio'
    class      = multimedia
    subclass   = HDA
none10@pci0:0:31:4:     class=0x0c0500 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da3 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake SMBus'
    class      = serial bus
    subclass   = SMBus
none11@pci0:0:31:5:     class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da4 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake SPI Controller'
    class      = serial bus
re0@pci0:1:0:0: class=0x020000 rev=0x15 hdr=0x00 vendor=0x10ec device=0x8168 subvendor=0x10ec subdevice=0x0123
    vendor     = 'Realtek Semiconductor Co., Ltd.'
    device     = 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller'
    class      = network
    subclass   = ethernet
rtw880@pci0:2:0:0:      class=0x028000 rev=0x00 hdr=0x00 vendor=0x10ec device=0xc821 subvendor=0x10ec subdevice=0xc821
    vendor     = 'Realtek Semiconductor Co., Ltd.'
    device     = 'RTL8821CE 802.11ac PCIe Wireless Network Adapter'
    class      = network

 
では。さようなら。

9月 282023
 

いやぁ。まいった。 FreeBSD 14-RELEASE/amd64 になったら if_iwlwifi.ko が正常動作するようになって FreeBSD でいよいよ待ちに待った WiFi6 が利用できるようになるのかと思いきや・・。
ぜーんぜんそんなことはなくて FreeBSD 14.0-BETA3 で bhyve から Intel AX200 を試してみたけど、やっぱり 802.11a 止まりですな。 802.11ac さえも相変わらず利用できない。一体いつまで待てば FreeBSD で高速な WiFi が利用できることになるのやら・・。

ちなみに FreeBSD 13.2-RELEASE/amd64 では一応 if_iwlwifi.ko は 802.11a では利用可能になりました。しかし、これが suspend/resume に対応していない。 resume すると利用不可になるデバイスなのでまるで利用する気にならない・・。orz。
なので、僕はずっと USB な if_rtwn_usb.ko を利用しています。一応 802.11a での通信になってしまうのだけど supend/resume には対応しているので、そこはかとなく使い続けている状態です。

 
今回は、今 FreeBSD をインストールして利用している ThinkPad X13 で Intel Wi-Fi 6 AX200 を 802.11ac or ax で利用するために bhyve を利用して ubuntu をインストールします。
そして ubuntu 側で Wi-Fi 6 AX200 を利用するのですが、一応、前提条件を書いておきます。

  • 今回 ubuntu はルータとして利用しません。IPv4/IPv6 のデアルスタクにすると設定むづかしくてしょーがない・・。
  • 母艦の FreeBSD はネットワーク的にはフツーに通信できる状態として、それとは別にブリッジ経由で bhyve の ubuntu と通信します。
  • データのやり取りは bhyve な ubuntu 側の wlp0s6 を利用し、母艦の ThunPad X13 上の FreeBSD に橋渡しします。
  • 母艦の FreeBSD の /home/takachan を bhyve な ubuntu に NFS マウントするとこでデータ転送の手間を省きます。

 
上記を図にするとこんな感じ。

 
母艦側の FreeBSD の default gateway を bhybe の ubuntu の 172.16.1.11 にすると母艦側の通信は ubuntu の wlp0s6 を抜けて WiFi6 な通信が可能になるのだけど、戻りパケットの設定などを上位のルータに設定して上げる必要があったりとか、IPv4/IPv6 デアルスタクにすると色々ややこしくなるのでやめました。

 
では、母艦の FreeBSD に必用な設定と bhyve 側 ubuntu のインストールと設定を見ていきましょう。

 
1. FreeBSD 母艦側の設定
まず、 FreeBSD の母艦側の設定を行います。

今回、 bhyve を動作させるために、まず packages をインストールします。今回はこれだけインストールしました。

$ pkg info | grep bhyve
bhyve-firmware-1.0_1           Collection of Firmware for bhyve
edk2-bhyve-g202308_3           EDK2 Firmware for bhyve
uefi-edk2-bhyve-csm-0.2_4,1    UEFI EDK2 firmware for bhyve with CSM (16-bit BIOS)
vm-bhyve-1.5.0                 Management system for bhyve virtual machines

 
続いて起動時の設定を行います。

 
o./boot/loader.conf

# bhyve
vmm_load="YES"
hw.vmm.amdvi.enable=1
pptdevs="2/0/0"

 
bhyve を利用するには vmm.ko を kldload する必要があります。そして hw.vmm.amdvi.enable=1 にします。
しかし、 vmm.ko は仮想環境で排他利用となります。以前のエントリで書いていますが VirtualBox を利用する場合は vmm.ko を kldunload する必要があります。

pptdevs=”2/0/0″ は pciconf -lv で確認した PCI デバイスを bhyve で利用するための設定です。以下は pciconf -lv の例です。

$ pciconf -lv | grep -A 3 iwl
iwlwifi0@pci0:2:0:0:        class=0x028000 rev=0x1a hdr=0x00 vendor=0x8086 device=0x2723 subvendor=0x8086 subdevice=0x0080
    vendor     = 'Intel Corporation'
    device     = 'Wi-Fi 6 AX200'
    class      = network

 
if_iwlwifi.ko を利用したデバイス iwlwifi0 は PCI バスの 2:0:0 に割り当てられているので、/boot/loader.conf で上記のように割り当ててあげます。

次に bhyve の起動設定です。

 
o. /etc/rc.conf

vm_enable="YES"
vm_dir="/opt/bhyve"

 
vm_enable=”YES” と vm_dir=”hoge” を設定しました。他に zfs のオプションとかなんか色々あるみたいですが、ひとまず不要なので省き、一番簡単な設定のみとしました。

これで一旦再起動します。

 
2. bhyve の準備と OS のインストール

o.ネットワーク設定
bhyve では仮想スイッチを利用します。まぁ『仮想スイッチ』と、言ってもただ単にブリッジインターフェースを作成するのみです。

母艦側 FreeBSD のネットワークの状態は lo0 と wlan0 があるのみです。 wlan0 は if_rtwn_usb.ko を利用した 802.11a で 5G の周波数に接続するフツーの NIC です。

ここに bhyve の ubuntu と通信するための『仮想スイッチ』を準備してしてあげます。

# service vm start
# ifconfig tap0 create
# sysctl net.link.tap.up_on_open=1
# vm switch create -a 172.16.1.1/24 public
# vm switch add public tap0
#
# ifconfig -a
lo0: flags=8049 metric 0 mtu 16384
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
        inet 127.0.0.1 netmask 0xff000000
<一部略>
wlan0: flags=8843 metric 0 mtu 1500
        inet 192.168.1.32 netmask 0xffffff00 broadcast 192.168.1.255
        inet6 fe80::20f:ff:fe8d:2c72%wlan0 prefixlen 64 scopeid 0x2
        inet6 2001:470:fe36:5678::32:1 prefixlen 64
<一部略>
vm-public: flags=8843 metric 0 mtu 1500
        ether 3e:ce:d6:69:ff:84
        inet 172.16.1.1 netmask 0xffffff00 broadcast 172.16.1.255
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: tap0 flags=143
                ifmaxaddr 0 port 4 priority 128 path cost 2000000
        groups: bridge vm-switch viid-4c918@
        nd6 options=9
tap0: flags=8943 metric 0 mtu 1500
        options=80000
        ether 58:9c:fc:10:fc:0e
        groups: tap
        media: Ethernet autoselect
        status: no carrier
        nd6 options=21
        Opened by PID 2627

 
bhyve で利用する tap0 を作成します。次の sysctl はまぁ、おまじない。次に『仮想スイッチ』を public という名で vm switch create します。ついでに IP アドレスを付加します。

ifconfig -a で確認すると vm-public と tap0 が作成されました。
vm-public は bridge インターフェースで vm switch add public tap0 コマンドにより tap0 を内包しています。かつ vm-public には 172.16.1.1/24 の IPv4 アドレスが付きました。 bhyve 側の ubuntu は FreeBSD 側から見ると tap0 ですが ubuntu 側では enp0s2 として認識してそこに 172.16.1.11/24 のアドレスを付加すると母艦と bhyve 側の ubuntu で通信が可能になります。

母艦側の wlan0 は全く触ることはありません。

 
ネットワークの設定ができたので、bhyve の ubuntu をインストールしていきましょう。

まず、原型を作成します。

# service vm start
# vm create -t ubuntu ubuntu
# cd /opt/bhyve
# ls -aCF
.config/    .img/       .iso/       .templates/ ubuntu/
#
# vm install ubuntu .iso/ubuntu-23.04-live-server-amd64.iso
<以下略>

 
/etc/rc.conf に記載した vm_dir の /opt/bhyve の下に色々できています。 /opt/bhyve/.templates/ の下にファイルを一個作成します。

o./opt/bhyve/.templates/ubuntu.conf

loader="uefi"
cpu=2
memory=2G
network0_type="virtio-net"
network0_switch="public"
disk0_type="virtio-blk"
disk0_name="disk0.img"
graphics="yes"
graphics_port="5900"

 
このファイルを作成して、iso イメージを /opt/bhyve/.iso/ に設置してから vm install ubuntu を実行しましょう。そして、インストールします。あ。なんか、 ubuntu23 はメモリが 512MB ではインストーラが起動しないようです。1GB とか 2GB のメモリ量にしてあげましょう。

インストール中はネットワークは利用できないので利用する iso イメージは最低限インストールできるものをチョイスします。

これでイントールは完了しましたかねぇ。

o. bhyve の ubuntu の起動スクリプト

#!/bin/sh

case $1 in
'start' )
    bhyve -c 2 -m 1G -w -H -S \
          -s 0,hostbridge \
          -s 1,virtio-blk,/opt/bhyve/ubuntu/disk0.img \
          -s 2,virtio-net,tap0 \
          -s 3,fbuf,tcp=0.0.0.0:5900 \
          -s 4,xhci,tablet \
          -s 5,lpc -l com1,stdio \
          -s 6,passthru,2/0/0 \
          -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
          ubuntu
    ;;
'tm' )
    tmux new-session -d -s mugi-ubuntu 'sudo /opt/bhyve/bin/vm_ubuntu.sh start'
    sleep 3
    ifconfig tap0 | grep status
    ;;
'stop' )
    bhyvectl --force-poweroff --vm=ubuntu
    ;;
'ls' )
    bhyvectl --get-stats --vm=ubuntu
    echo;echo
    echo "tmux list-sessions"
    echo "tmux attach -t ubuntu"
    ;;
'*' )
    echo vm_ubuntu.sh { start | stop | ls | tm }
    ;;

esac

exit 1;

 
bhyve でゲスト OS を起動するにはずいぶんと難儀です。上記のスクリプトは /opt/bhyve/bin/vm_ubuntu.sh という名で準備しました。
ちと、説明が必要ですかね。

まず、 start オプションのパラメータですが、-s は PCI BUS を想定してください。ディスク・ネットワーク・コンソール・USB、そして pptdevs で渡された Intel Wi-Fi 6 AX200 になります。このパラメータでまず、ubuntu が起動できるかと思います。

しかし、ここまでたどり着くまでにはずいぶんと色々苦労したので bhyve の起動オプションは本当に難儀したぞぉ。簡単に bhyve の ubuntu とか FreeBSD が起動するとは思わないほうが良い。色々検索して情報を探してくだされ。 BIOS でのブートとか UEFI でのブートとか、google に聞くと古い情報とかごまんとあって、最新の情報を拾ってくるのは中々悩ましい・・。

 
次の tm オプションですが、これは tmux を介してバックグラウンドで動作させます。 tmux については個別に勉強してください。コマンドのサワリだけ書いておきます。

# tmux list-sessions
ubuntu: 1 windows (created Wed Sep 27 12:31:41 2023)
# tmux attach -t -ubuntu
<以下略>

 
tmux list-sessions で tmux のセッションを確認して、そのセッションに tmux attach -t -ubuntu でアタッチするとコンソールが表示されます。コンソールから抜けるには tmux のコマンド C-b d を打ちます。

もしかしら ubuntu では tmux 使えないかも・・。
もうひとつのコンソールへのアクセス方法があります。 ports から net/tigervnc-viewer をインストールします。そして、以下のコマンドを打ちます。

$ vncviewer localhost:5900
<以下略>

 
上のほうで /opt/bhyve/.templates/ubuntu.conf というファイルを作成しましたが、そのとき graphics_port=”5900″ を指定していると思います。また bhyve 起動時にも -s 3,fbuf,tcp=0.0.0.0:5900 というオプションを指定しています。これが vncviewer でアクセスするポートになります。

コンソールに接続できたので ubuntu の設定を色々していくことにします。まぁ、僕は ubuntu はあまり得意ではありませんので、このあとはサワリだけ説明することにします。

そして、次に行きます。

 
3. 母艦と bhyve の ubuntu との通信
bhyve の ubuntu 側で ip addr をたたくと以下のインターフェースが確認できると思います。

$ ip addr show
1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
2: enp0s2:  mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
3: wlp0s6:  mtu 1500 qdisc noqueue state UP group default qlen 1000

 
enp0s2 が 母艦側との通信インターフェースで wlp0s6 が WiFi6 です。

まず、母艦の 172.16.1.1 と通信する enp0s2 設定からです。

o./etc/netplan/99-config.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s2:
      dhcp4: false
      addresses: 
        - 172.16.1.11/24
#     gateway4: 172.16.1.1
      nameservers:
        addresses: [192.168.1.34]
        addresses: [192.168.22.251]

 
さーっ!! yaml の設定に悩んでくだされーっ!! なんでまともに設定できんのだ?! とウンザリすることでしょう・・。orz
設定完了後 sudo netplan apply のコマンドを打って、で設定を反映して、そしてうんと怒られてください;-P。

無事に設定が完了すると、FreeBSD 母艦と bhyve との間の 172.16.1.0/.24 のセグメントで通信ができるようになります。

ここまでできたら母艦側から ssh 接続できるようになるので、作業が格段にしやすくなります。

 
続いて wlp0s6 側の設定を見ていきます。 enp0s2 は母艦との接続のためだけのインターフェースですが wlp0s6 は外部との通信を行います。 ubuntu は WiFi6 に対応しているので Intel Wi-Fi 6 AX200 を利用する通信はむちゃくちゃ速いです。

o./etc/netplan/50-cloud-init.yaml

network:
    wifis:
        wlp0s6:
            optional: true
            access-points:
                "AP80211AX":
                    hidden: true
                    password: "PASSWORD"
            dhcp4: false
            addresses:
              - 192.168.1.48/24
              - 2001:470:fe36:abcd::48:1
            gateway4: 192.168.1.1
            nameservers:
              addresses: [192.168.1.34]
              addresses: [2001:470:fe36::ffff:34]

 
WiFi の SSID は AP80211AX で パスフレーズは PASSWORD です。この AP はステルス機能を有効化しているので hidden: true を設定しています。
IP アドレスについては IPv4/IPv6 デアルスタクです。 IPv4 gateway は設定していますが IPv6 gateway は ra で降ってきます。ネームサーバも IPv4/IPv6 両方のアドレスを指定しました。

これまた書き方にうんと悩んだあと sudo netplan apply のコマンドを打って設定を反映して、そしてうんと怒られてください;-P。

これで ubuntu 側の設定は完了です。

 
4. bhyve の ubuntu の設定と実際に利用してみる
ubuntu では設定というか、dep を apt-get install で色々好きなものをインストールしてください。
ここでは特には書かないです。

唯一必要だったのが NFS クライアント側の設定でしょうか。母艦の FreeBSD 側で NFS Server を有効にして /etc/exports を書きます。 /home/takachan を NFS のマウントポイントとして 172.16.1.0/24 から許可します。
ubuntu 側では /etc/fstab に母艦の FreeBSD の /home/takachan を /home/takachan/takachan 辺りにマウントするようにします。

NFS の設定が完了したら、試しに iso イメージをダウンロードしてみましょう。

まずは母艦の FreeBSD で wget を実施し、次に ssh で bhyve の ubuntu にログインしたあとに wget してみました。

$ wget http://ftp.iij.ad.jp/pub/FreeBSD/releases/ISO-IMAGES/14.0/FreeBSD-14.0-BETA3-amd64-bootonly.iso
FreeBSD-14.0-BETA3-amd64 1%[                    ]   7.35M  1.84MB/s   残り3m 49s  
^C
$ ssh 172.16.1.11
ubuntu $ cd takachan
ubuntu $ wget http://ftp.iij.ad.jp/pub/FreeBSD/releases/ISO-IMAGES/14.0/FreeBSD-14.0-BETA3-amd64-bootonly.iso
FreeBSD-14.0-BETA3-amd64 4%[>                   ]  20.66M  10.2MB/s   eta 38s
^C
ubunru $

 
母艦側の FreeBSD のホームディレクトリで wget で iso イメージを取得すると大体 16Mbps の速度が出るか出ないか。これは USB の if_rtwn_usb.ko を利用して 802.11a で通信する FreeBSD で一番速い WiFi の速度です。
次に bhyve の ubuntu に ssh して NFS マウント先で wget すると FreeBSD側 の $HOME で wget するのと同じ状態になります。ただ、ubuntu 側で wget すると速度が全然違い 80Mbps 出ています。これは Linux での iwlwifi ドライバが正常に動作していることを示しています。そして、この速度はうちの外部接続ネットワークの限界です。

 
宅内の他の PC やサーバとデータをやりとりするときは ubuntu 側の 192.168.1.48 側のアドレスでデータをやり取りすることにより高速に転送することが可能です。

 
こんな感じで、いつまで待っても FreeBSD で WiFi の 802.11ac or ax が利用できないのを bhyve の ubuntu で通信速度を稼ぐ。と、いうちょっと荒業を、今回は使ってみました。

おかげで bhyve にずいぶんと詳しくなったぞぉーっ!! みたいな f(^^;;。

一点だけ注意点があるかも。母艦の FreeBSD は suspend/resume に対応していても bhyve で動作する OS が動作しないかな? FreeBSD の resume 後 vm lsit で Running 状態だったゲスト OS は動作がおかしくなる傾向が見受けられました。
が、これは当然でしょうかねぇ・・。考えてみると FreeBSD 側で Intel Wi-Fi 6 AX200 は supend/resume に対応してないので、たとえ pptdevs で ubuntu に渡していても resume 後は利用出来ない状態に陥ります・・。orz。

FreeBSD 14-R で if_iwlwifi.ko が suspend/resume に対応してくれるとともっと幸せになれるのだけれど、それはリリースされてみたいと解らないかなぁ。

 
と、いうことで、皆さんもせっかく持っている内臓の、 FreeBSD では中々利用できない Intel 系の WiFi チップ。 bhyve の ubuntu で有効利用するのもありなのかなぁ。と、いうのが今回のネタだったのでありました。

bhyve のこと、今後、ネタとして書く機会あるかな?

6月 282023
 

自分でも、強引な手法だなぁ。と、思ってしまいます。

まず、 Windows11 Pro 上で動作している Hyper-V サーバがあります。その下で FreeBSD/amd64 13.2-RELEASE が動作しております。

Hyper-V の母艦である Windows11 Pro は NotePC なので WiFi 使ったり RJ45 使ったり VPN 使ったりするので Hyper-V のサーバとクライアントの間の「仮想スイッチ」はブリッジ、それはつまりは仮想スイッチマネージャの「接続の種類」で[外部ネットワーク]を選択することはほぼ不可能(利用する物理ネットワークによって毎回変更する必要がある)なのであります。

母艦側で複数のネットワークアダプタを利用する場合は、どうしても NAT、それはつまりは[内部ネットワーク]をチョイスするしかないのであります。

Hyper-V の仮想スイッチが NAT になると、色々と制約を受けます。まず、 DHCP を克服する必要があります。これについてはウェブ上に、設定方法について、色々書かれたドキュメントがあるのでそちらを参考にしてください。

いろいろ設定すると Hyper-V のクライアント (俗に『仮想マシン』と、言いますな) は NAT 配下で、固定 IPv4 アドレスで動作させることが可能になりました。

Hyper-V の母艦からは仮想マシンに対して ssh などのアクセスができるようになります。が、当然リモートのマシンからは Hyper-V 管理下の仮想マシンへはアクセスできません。

あと、仮想マシンのネットワークは NAT が入るのでこれまた色々と制約受けます。上に書いた、外部からのアクセスができません。他に NFS マウントできません。 gif トンネル張れません。とか・・。

 
そもそも、 Hyper-V の母艦の外部のネットワークに IPv6 がない場合、仮想マシンは IPv6 を利用することができません。あれ? Hyper-V の NAT 仮想スイッチで IPv6 喋れるのか?

どうして仮想マシン側に IPv6 が欲しいのだ? -> だって、IPv4 は NAT なので上記の制約受けるじゃん。それなら、トンネルでも良いから IPv6 でどっかーんっ!! と抜けていきたいじゃん。

と、いうのが発想の原点にあります。

と、いうことで図を書いてみました。

簡単に説明します。

  • 真ん中に Windows11 Pro の Hyper-V サーバがいます
  • Windows11 Pro の Hyper-V サーバは上位のネットワークとは IPv4 アドレスのみが降ってくるネットワークに接続しています
  • Hyper-V 配下の仮想マシンは FreeBSD/amd64 13.2-RELEASE です
  • Hyper-V サーバと仮想マシンの間には NAT の仮想スイッチが入っています
  • NAT の仮想スイッチは仮想マシンが固定 IPv4 アドレスを利用できるようにしています

 
これが現状、フツーにできる Hyper-V 環境です。この状態で、仮想マシン側に IPv6 グローバルアドレスを付加して、IPv4 の NAT 超えをあきらめ、IPv6 で外部との通信をできるようにして色々楽しめる状態にします。

  • 仮想マシンの FreeBSD は wireguard で外部に接続します
  • wireguard で作成した VPN トンネルの中に gif トンネルを通します
  • 仮想マシンに IPv6 が通ったので様々通信ができるようになります

 
トンネルの多段ですね。
図の左側は VyOS と wireguard のサーバは別々に描かれていますが、最近の VyOS を使うと一個にまとめられると思います。僕の環境では未だに VyOS-1.1.8 を利用していますので wireguard は別サーバに構築しました。

 
wireguard と VyOS の置き場所によって仮想マシンの IPv6 の通信速度は圧倒的に変わります。色々考えてみてください;-)。

と、いうことで、次に設定を見ていきましょうか。

 
1. 仮想マシン側の wireguard の設定
今回、仮想マシンは FreeBSD/amd64 13.2-RELEASE なので wireguard は ports から簡単に入ります。 net/wireguard をインストールしましょう。もしかしたら wireguard-kmod-0.0.20220615_1 がインストールされるかもしれませんが、実際には利用しません。

wireguard-kmod-0.0.20220615_1 をインストールした場合には /boot/modules/if_wg.ko がインストールされますが 13.2-RELEASE からは OS 標準で /boot/kernel/if_wg.ko が用意されています。フツーに wireguard_enable=”YES” すると /boot/kernel/if_wg.ko が利用されます。

僕の環境では wireguard-2,1 、wireguard-kmod-0.0.20220615_1 、 wireguard-tools-1.0.20210914_1 がインストールされました。

次に設定です。

が、その前に、まず最初に wireguard では鍵のペアを作成する必要があります。

# cd /usr/local/etc/wireguard/
# wg genkey > server.key
# wg pubkey < server.key > server.pub
#
# wg genkey > client.key
# wg pubkey < client.key > client.pub
# 
# chmod 600 *.key 
#

 
サーバ側とクライアント側のキーの両方を作成しましたが、これを利用します。

続いて設定を見ていきます。今回は wireguard のトンネルを一個作成するだけですので wg0.conf のみです。複数に接続する場合は wg1.conf wg2.conf などと設定フアイルを複数書きます。

・/usr/local/etc/wireguard/wg0.conf

[Interface]
PrivateKey = 8LJDuAU9Ste2ySHRmgHnOAyk+E4ZMbw+vCBbMHXMbZU=
Address = 192.168.254.11/32

[Peer]
PublicKey = 17CucZLVbS1Jt/8LXREvrDGEnYunIA2RYYjlJhxftlk=
AllowedIPs = 192.168.254.1/32, 10.20.65.201/32
Endpoint = 10.20.65.15:51820

 
[Interface] の 設定は自分側の設定を記載します。

  • PrivateKey は作成した鍵ファイルの client.key の内容を記載します。
  • Address は wg0 インターフェイスに付加する IPv4 アドレスです。 wireguard で接続するためだけに利用するので /32 で指定します。ただ、サーバ側と同じレンジが良いでしょう。

続いて [Peer] の設定で、これは wireguard のサーバ側に関する設定になります。

  • PublicKey は server.pub の内容を記載します。
  • AllowedIPs は wireguard サーバの wg0 インターフェイスの IPv4 アドレスを記載します。
  • AllowedIPs にはもう一個 IPv4 アドレスを記載します。 gif トンネルの接続先 IPv4 アドレスを “,” で区切って記載します。詳細についてはあとで書きます。
  • Endpoint は wireguard が動作しているサーバの IPv4 アドレスと Port 番号を記載します。

 
だいたいこんな感じで良いと思います。非常に簡単な設定ですね。ただ、一点。 [Peer] 側の設定の AllowedIPs の設定がクセモノです。
AllowedIPs に wireguard サーバ側の wg0 インターフェースの IP アドレスを書いただけでは wireguard サーバとしか通信ができません。

『wireguard サーバ側で NAT の設定を入れてないから他のネットワークと通信できんのか?』と思い、wireguard サーバ側の設定を色々いじってしまうのですが、そうではなく、クライアント側がどこと通信したいのか、AllowedIPs に記載することにより通信が可能となります。

今回は wireguard トンネルを抜けいてったあと gif トンネルを張りたいので VyOS の IPv4 アドレスを AllowedIPs に追加しました。 10.20.65.0/24 と通信したい場合は AllowedIPs には wireguard サーバの wg0 インターフェースの IPv4 アドレスと 10.20.65.0/24 を追加で書けば良いです。

で、自動起動するように設定を書きます。 /boot/loader.conf に明示的に if_wg_load=”YES” と書かずともカーネルモジュールがロードされます。

・/etc/rc.conf

wireguard_enable="YES"
wireguard_interfaces="wg0"

 
これでクライアント側の設定は完了です。

次にサーバ側の設定を見ていきましょう。

 
2. wireguard のサーバ側の設定
上のほうでも書きましたが、 wireguard のサーバは自前で用意せずとも VyOS で利用可能です。 VyOS-1.3 以降から wireguard に対応したんだったかな? 詳細なバージョンは覚えていませんが・・。

今回、僕は wireguard サーバも FreeBSD 側で作成しました。インストールは ports からですが、クライアント側のと同様のモノをインストールしました。

鍵は既に作成したので、それを使いまわしましょう。すると、サーバ側で用意するのは設定フアイル一個のみです。

・/usr/local/etc/wireguard/wg0.conf

[Interface]
PrivateKey = aJbypbTUy5LB+EIPd6FHf25D2rbTw9l+x5o7fBLL+Ec=
Address = 192.168.254.1/24
ListenPort = 51820

[Peer]
PublicKey = F8kvub6jdPnl99rISnffYtilNVEswDUo+sqGWzc7FRY=
AllowedIPs = 192.168.254.11/32

 
[Interface] の 設定は自分側の設定を記載します。

  • PrivateKey は server.key の内容を記載します。
  • Address は wg0 インターフェイスに付加する IPv4 アドレスです。

続いて [Peer] の設定で、これは wireguard のサーバ側に関する設定になります。

  • PublicKey は client.pub の内容を記載します。
  • AllowedIPs は wireguard クライアントの wg0 インターフェイスの IPv4 アドレスを記載します。

 
以上で設定は完了です。 /etc/rc.conf にクライアントのと同じ設定を追加して wireguard を起動します。サーバ側とクライアント側の両方で service wireguard start を実行すると wg0 インターフェースが生えてきます。

双方の wg0 の IPv4 アドレスに ping を打ち、到達性を確認します。この時点で ping が当たらない場合は設定情報が間違っています。なおしてください。そもそも wireguard のサーバとクライアントの物理インターフェース間で通信できることを確認します。

 
双方の wg0 に付加された IPv4 アドレスに ping が当たるようになったら OK。クライアント側の [Peer] 設定の AllowedIPs に記載した VyOS の IPv4 アドレスに ping が当たることを確認します。
上にも書いた通り 10.2.65.201 だけでなく、もっと他のマシンにも接続したい場合はクライアント側で設定してみてください。

 
最後に wireguard の wg0 トンネルをぬけて gif トンネルを掘ります。 gif トンネルが掘れると Hyper-V の仮想マシンにはグローバルな IPv6 アドレスが付加されます。 IPv6 を利用することにより IPv4 で受けていた NAT の制約から開放されることになります。パチパチパチっ!!

と、いうことで IPv6 gif トンネルの設定については以前書いているのでそつらを参考にしてください。

IPv6 Over IPv4 トンネルを dtcp から VyOSへ。

 
移動する PC 上で Hyper-V を動かしたとき、その下で動作する仮想マシンはネットワーク的に色々な制約を受けるモノです。今回は多段トンネルでその問題を解決してみました。

  • 仮想マシンは NAT ネットワークで gif トンネルが利用できないので wireguard なトンネルを掘る
  • wg0 を抜けて gif トンネルを掘る
  • IPv4 は NAT ネットワークなので IPv6 の直アクセスで NAT 問題を回避
  • 仮想マシンに IPv6 アドレスが付加されたので仮想マシンのネットワークはもーサイコーっ!!

 
こんな感じの手順で今回の構成を構築しましたが、フツーここまでやる?

ってか、まあ、Hyper-V が動作するのは WindowsOS なので、ネットワーク的に色々な制約が多すぎてやりたいことができない。
ネットワークはトンネルで抜けて色々やりましょう。と、いう雰囲気ですが・・。

一点だけ。まだ検証してないし、計算が必要だと思うのですが・・。 MTU って、一体いくつになるの? f(^^;;。

11月 102022
 

僕が持っている色々な PC は WindowsOS と FreeBSD でマルチブートしています。デスクトップ PC の場合は M2.SSD の他に SATA 2.5 インチ SSD と、更に USB HDD を接続して、全てのストレージは NTFS と UFS (ZFS ではない;-) に分割して、どちらの OS でも高速アクセスと、ビッグデータ蓄積領域を確保している状態です。

普段は FreeBSD を利用しているのだけど、たまに Windows11 を起動してアプリを利用したり、蓄積していたデータをファイルサーバにアップして、再度 FreeBSD を起動してファイルサーバから取ってくる。とかしていましたが、今後はそーいう動作は必要なくなります。

FreeBSD 13.1-RELEASE (正確には 13.0-R 辺りからかな?) では NTFS 領域がマウントできて、かつ FreeBSD から rw アクセスが可能となりました。 sysctl で vfs.usermount=1 などとすると、一般ユーザ権限でマウントして、かつ、設定によっては自動的にマウントできたりします。

そして KDE5 などを使っていると dolphin (KDE5 のファイルマネージャ) から簡単にアクセスできるようになります。

設定方法について、順番に見ていきましょう。

 
1. ports からインストール
まずは ports から sysutils/fusefs-ntfs をインストールします。そして /boot/loader.conf に以下の行を書きます。

fusefs_load=”YES”

 
これで完了です。

 
2. 実際にマウント
僕のデスクトップ PC の場合、 FreeBSD の起動時に以下の SSD と HDD が認識されています。

$ dmesg | grep nvd
nvd0:  NVMe namespace
nvd0: 488386MB (1000215216 512 byte sectors)
Trying to mount root from ufs:/dev/nvd0p5 [rw]...
$
$ dmesg | grep da0
ada0 at ahcich1 bus 0 scbus1 target 0 lun 0
ada0:  ACS-4 ATA SATA 3.x device
ada0: Serial Number S5RRNF1R566155H
ada0: 600.000MB/s transfers (SATA 3.x, UDMA6, PIO 512bytes)
ada0: Command Queueing enabled
ada0: 953869MB (1953525168 512 byte sectors)
da0 at umass-sim0 bus 0 scbus6 target 0 lun 0
da0:  Fixed Direct Access SPC-3 SCSI device
da0: Serial Number DCC77FFFFFFF
da0: 40.000MB/s transfers
da0: 3815447MB (7814037168 512 byte sectors)
da0: quirks=0x2
$
$ gpart show /dev/nvd0
=>        34  1000215149  nvd0  GPT  (477G)
          34        2014        - free -  (1.0M)
        2048      532480     1  efi  (260M)
      534528       32768     2  ms-reserved  (16M)
      567296   629467136     3  ms-basic-data  (300G)
   630034432    20971520     5  freebsd-ufs  (10G)
   651005952   167772160     6  freebsd-ufs  (80G)
   818778112   125829120     7  freebsd-ufs  (60G)
   944607232    41943040     8  freebsd-ufs  (20G)
   986550272    12124160     9  freebsd-swap  (5.8G)
   998674432     1529856     4  ms-recovery  (747M)
  1000204288       10895        - free -  (5.3M)
$
$ gpart show /dev/ada0
=>        34  1953525101  ada0  GPT  (932G)
          34       32734     1  ms-reserved  (16M)
       32768   819200000     2  ms-basic-data  (391G)
   819232768  1134292367     3  freebsd-ufs  (541G)
$
$ gpart show /dev/da0
=>        34  7814037101  da0  GPT  (3.6T)
          34       32734    1  ms-reserved  (16M)
       32768  4096000000    2  ms-basic-data  (1.9T)
  4096032768  3718004360    3  freebsd-ufs  (1.7T)
  7814037128           7       - free -  (3.5K)

 
nvd0 が M2.SSD で / パーティション他がある、メインの SSD です。
ada0 は SATA SSD で da0 は USB HDD です。全て WindowsOS と FreeBSD で半分ずつ (NTFS と UFS で半分ずつ) 利用しています。

 

実際に NTFS をマウントしてみるには以下のコマンドを利用します。

# ntfs-3g -o rw /dev/ada0p2 /mnt/
#  ls -l /mnt/
total 0
drwxrwxrwx  1 root  wheel  0 Nov 18  2021 $RECYCLE.BIN/
drwxrwxrwx  1 root  wheel  0 Nov 24  2021 Hyper-V/
drwxrwxrwx  1 root  wheel  0 Apr  3  2022 Data/
drwxrwxrwx  1 root  wheel  0 Nov 23  2021 Recovery/
drwxrwxrwx  1 root  wheel  0 Nov 18  2021 System Volume Information/
#
# umount /mnt

 
ports から sysutils/fusefs-ntfs をインストールすると ntfs-3g というコマンドがインストールされ、そのオプションに -o rw を指定しているので FreeBSD から書き込みもできるようになります。

これで NTFS の中のデータを取り出すために WindowsOS を起動することがなくなりました;-)。

 
3. automount しちゃうよ
KDE5 を利用している場合、 sddm からログインすると、ログインした段階で色々なファイルシステムを一般ユーザ権限でマウントしてくれる機能があります。

一般ユーザのアカウント takachan でログインすると、自動マウントさせたい場合には上にも書いた通り /etc/sysctl.conf に以下の設定をします。

vfs.usermount=1

 
この他に「KDE システム設定」でちょっと設定します。

「KDE システム設定」を起動して「起動と終了」→「Background Services」をチョイスすると、その中に [Removable Device Automounter] という項目があるのでこれにチェックを入れて更に再生ボタンを押してステータスを『実行中』にします。

次に同じく「KDE システム設定」の「リムーバブルストレージ」→「Removable Devices」をチョイスして、一番下にある [Automatically mount removable media that have never been mounted before] にチェックを入れて [適用]ボタンを押します。

これで、一旦ログアウトして再度ログインするか、service sddm restart してからログインしてみます。

と、いうか、sddm を再起動したあと、リモートから ssh でログインして df -k とかたたいて確認して、そのあとで sddm から一般ユーザでログインするとログイン後に様々なファイルシステムがマウントできることが確認できます。

僕のデスクトップ PC の場合はこんな感じになります。

$ df -k
Filesystem    1024-blocks      Used      Avail Capacity  Mounted on
*** 一部略 ***
/dev/ada0p3     549341012 187462520  317931212    37%    /opt
*** 一部略 ***
/dev/fuse       409599996  44718652  364881344    11%    /media/Samsung_SSD_870_QVO_1TB_S5RRNF1R566155H_p2
/dev/fuse      2047999996 534627440 1513372556    26%    /media/WDC_WD40_EZRZ-00GXCB0_DCC77FFFFFFF_p2
/dev/da0p3     1800630836 892226780  764353592    54%    /media/WDC_WD40_EZRZ-00GXCB0_DCC77FFFFFFF_p3
/dev/fuse       314733564  69794920  244938644    22%    /media/WDC_PC_SN730_SDBPNTY-512G-1006_213240808600_p3
/dev/fuse          764924    604264     160660    79%    /media/WDC_PC_SN730_SDBPNTY-512G-1006_213240808600_p4

 
/media/ ディレクトリのは以下にデバイス名付きで自動的に、一般ユーザ権限でマウントされます。デバイス名の後ろは p2,p3 とありますがパーティション名ですね。
Windows11 の C:\ や リカバリ領域なども自動マウントします。あと、UFS なファイルシステムも自動マウントしてしまいます。

Filesystem が /dev/fuse の場合は NTFS か FAT で /dev/da0p3 と表示されている場合は UFS ですね。 /media/Samsung_SSD_870_QVO_1TB_S5RRNF1R566155H_p3 は UFS ですが、これは /dev/ada0p3 で既に /opt にマウントしているので自動マウントされません。

 
KDE5 を利用した場合は opendesktop.org 由来の UDisks2 が利用されます。 FreeBSD 的かつ ports 的には sysutils/bsdisks が動作して plasmashell から dbus を経由して自動マウントしてくれるようです。
NTFS ファイルシステムを自動マウントしたくない場合は kldload fusefs.ko をやめれば良いです(あとで別件で説明します)。 UFS はもう完全に自動マウントしてしまうので止められない。自動マウント自体を停止したい場合は「KDE システム設定」の [Removable Device Automounter] を停止するしか手はないです。

 
KDE5 を利用している場合には KDE5 側で自動マウントしてくれますが、KDE5 を利用していな場合、 sysutils/dsbmd をイントールして /etc/rc.conf に dsbmd_enable=YES を書く必要があるかもしれません。

詳細については以下の URL を参照してください。

https://github.com/mrclksr/DSBMD

上記の dsbmd は ports のコンパイル時の make onfig で様々なファイルシステムを検知、自動マウントしてくれるようです。裏を返すとそれだけ色々な fusefs をインストールする。と、いうことになると思いますが。 ext4 とか HFS+ とかすげーな。みたいな・・。

一般ユーザ権限で色々なファイルシステムを自動マウント。遊んでみてください;-)。

 
4. 注意制限事項
注意点は二つ。

  • Bitlocker で保護されている NTFS はマウントできない
  • USB HDD の場合、スピンドルが止まっている場合がある

 
順番に見ていきましょうか。

Lenovo の ThunkPad X13 は Windows11 と FreeBSD のマルチブートですが、 Windows11 の NTFS は Bitlocker で保護されているので ntfs-3g ではマウントできません。以下のようになります。

# ntfs-3g -o rw /dev/nvd0p3 /mnt/
NTFS signature is missing.
Failed to mount '/dev/nvd0p3': 無効な引数です
The device '/dev/nvd0p3' doesn't seem to have a valid NTFS.
Maybe the wrong device is used? Or the whole disk instead of a
partition (e.g. /dev/sda, not /dev/sda1)? Or the other way around?

 
上記のようなエラーが出た場合は WindowsOS 側で「コンピュータの管理」→「ディスクの管理」を開いて当該パーティションが『Bitlocker で保護されてます。』と、いう表示があるか確認してみましょう。
この場合 kldload fusefs.ko していても意味ないです。リカバリ領域が見えても意味ないし・・。

 
次の USB HDD の場合ですが、SSD と違い外付け USB HDD の場合、ケースの機能によっては HDD の回転を停止するものがあります。自動マウントしている状態で HDD のスピンドルが停止していた場合、 cd /media/USB-HDD/ とか ls /media/USB-HDD/ すると、そこから HDD のスピンドルが回り始めます。この場合、ほぼほぼ CAM status: SCSI Status Error が出ます。そして、マウントしている状態だけど ls しても表示してくれない・・。 orz

外付け HDD の場合は cd とか ls でアクセスする前に以下のコマンドを打つ必要があります。

$ sudo camcontrol start /dev/da0

 
上記コマンドを打った段階で停止していた HDD (/dev/da0) のスピンドルが回り始めます。そのあとで cd とか ls でアクセスするようにしましょう。

 
以上、FreeBSD で NTFS に対するアクセスと、ファイルシステムの一般ユーザ権限での自動マウントについて書いてみました。

マルチブートしている PC の場合、もう一方の OS の中へアクセスしたい。と、いうことは多々あるのですが、今回は FreeBSD 側から WindowsOS の NTFS に対して簡単にアクセスする方法を書いてみました。

皆さんの環境でも是非、導入してみてください;-)。自動マウントはらくちんですよ。

10月 242022
 

その昔購入した Lenovo V525 は Windows10 から Windows11 にアップデートして、 2022/10 の Windows Update を実行したら、画面がデスプレィに表示してくれなくなった・・。

回復 USB から青いメンテナンス画面を出して以前のバージョンに戻したり、適用した Windows Update を消したりして、なんとか復活したけど、この PC 、一番安いの購入したので CPU が AMD A6-9500 で、メモリ 4GB を 8GB にパワーアップして利用していたけど、最近は遅すぎてお話にならない。まぁ、最近は Ryzen7 の 8Core / 16 スレッドな PC を利用しているので、遅さにうんざり。って、感じでしょうか。

 
新しい PC を探していたのだけど、手頃で小型な PC が良い。と、いうことで、そーなると、AMD の Ryzen 搭載 PC はちと高め・・。
Intel の第11世代プロセッサである Intel Celeron N5095 を搭載している PC であれば、アーキテクチャが ATOM とはいえ、そこそこ速いであろうということで、Beelink MINI S を購入してみました。

メモリは 8GB 、 SSD は 128GB です。ただ、 M2.SSD ではなく SATA に接続されたモノなので、NVNE よりは遅いのと、買い換えるとしたらちょっと高価になるかな・・。と、いう状態。

amazon で購入しましたが 24,800yen のところクーポン 3,000yen 分がついていたので 21,800yen という、非常に格安な部類の PC が手に入りました;-)。

 
ただ、以前 Beelink SER4 を購入したとき、OS が怪しすぎたので返品しました。今回は継続して利用してみようかと・・。

ただ、やっぱり、不要なドライバがインストールされていたりするので、 Microsoft から Windows11 の ISO イメージダウンロードして、プレインストールの OS はサクっと、削除しました。

 
プレインストールされた OS は一応回復 USB を作成し、 c:\ 直下にあるドライバ類をバックアップしました。

Windows11 クリーンインストール後は Intel Serial IO I2C Host Controller が 7 個くらいあり、これらは認識しなかったので、バックアップしたドライバが入っていたディレクトリからインストールしました。
必要なドライバは全て入っているので、デバイスマネージャーで確認すると ! マークは一個もない状態になりました。

最近は AMD の PC ばかりが手元にあるので Intel プラットームの PC の状況はいまいち把握できていません。この Serial IO は FreeBSD でも根こそぎ認識していません。 pciconf -lv はほぼほぼ none です。

 
今回の PC 購入時に Windows のライセンスについてちょっと調べたのですが、「MAK ライセンス」というのがあるらしいですね。「マルチプルアクティベーションキー」の略だとか。これをメーカが利用すると、出荷する PC はドドドとライセンスを提供できるかな?

 
と、いうことで届いた MINI S はこんな感じ。 iPhone8 との比較ですが、随分と小さいです。これだと、カバンに入れて持ち運べそうです。例えばデータセンタに行けばディスプレーとキーボード・マウスがあるので NotePC を持ち運ぶ必要はないかもですね。

中身はこんな感じです。

実は U95 の写真をウェブで見ていて、メモリスロットが 2 つあると思い、別途 8GB のメモリを購入してしまいました。が、実際に開けてみるとメモリスロットは一個しかあふりません。 Beelink MINI S はメモリスロットは一個です。なので、メモリを増やす場合は 16GB の SO-DIMM を一枚購入する必要があります。 メモリの形式は SO-DIMM DDR4 2400MHz 1.2V です。

SSD は上にもかいた通り M2.SATA SSD です。増設は 2.5 インチ SATA SSD が増設できます。僕は FreeBSD をインストールするために SATA SSD 480GB (余り物) を増設しました。

上の写真だとアップですね。下のほうに M2.SATA SSD 上が、メモリモジュールを外したメモリスロット。一個しか無いです。

無線 /Bt チップは Intel Dual Band Wireless-AC 3165 を利用しているようですが、中を開けてみると M2.SATA SSD の右側にハンダでオンボードに固定のようです。ずいぶんとちっこいチップが写真の右側に見えると思います。

しかし、Dual Band Wireless-AC 3165 は速度出ないですね。 802.11ac で接続して通信確認しましたが 100Mbps 程度しか出ません。 筐体が小さい中に張り巡らせたアンテナの影響もあるのかな?

 
これでほぼ準備完了。 OS も新規に再インストールしたし、気分もドライバもすっきりっ!! ;-)。

実際に使ってみると ATOM の割には速いです。 Intel Celeron N5095 は比較的新しいアーキテクチャだからでしょうかね。まぁ、今まで v525 で利用していた AMD A6-9500 は 2Core でもありますしね。そこそこ頑張ってくれる PC が手に入ってラッキーでした;-)。

今回購入した Beelink MINI S は Windows11 で利用するための PC です。テレビに接続して、色々楽しみたいと思います。

 
と、いいつつ、当然 FreeBSD/amd64 13.1-RELEASE もインストールしました。

本当はこんなことやる必要ないのかもしれないのですが、 EFI 領域がどうなるのか解らなかったので、ちょっとトリッキーにインストールしました。
M2.SATA の Windows11 領域を 20GB ほど小さくして、そこに FreeBSD 用の / パーティションを準備して、/home /usr /var SWAP などは 2.5インチ SATA SSD 側にインストールしました。

サクっと起動して、 X11 まで起動して KDE5 が動作して suspend/resume します。 Dual Band Wireless-AC 3165 は iwm0 で認識します。 802.11a で通信できます。

まぁ、 一応デアルブートにしましたが Windows11 をメインで利用するので、これくらいで。最後に pciconf -lv をつけておきます。

hostb0@pci0:0:0:0:      class=0x060000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4e24 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = HOST-PCI
vgapci0@pci0:0:2:0:     class=0x030000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4e55 subvendor=0x8086 subdevice=0x2212
    vendor     = 'Intel Corporation'
    device     = 'JasperLake [UHD Graphics]'
    class      = display
    subclass   = VGA
none0@pci0:0:4:0:       class=0x118000 rev=0x00 hdr=0x00 vendor=0x8086 device=0x4e03 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Dynamic Tuning service'
    class      = dasp
xhci0@pci0:0:20:0:      class=0x0c0330 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4ded subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
    subclass   = USB
none1@pci0:0:20:2:      class=0x050000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4def subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = memory
    subclass   = RAM
none2@pci0:0:21:0:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Serial IO I2C Host Controller'
    class      = serial bus
none3@pci0:0:21:1:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de9 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Serial IO I2C Host Controller'
    class      = serial bus
none4@pci0:0:21:2:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dea subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none5@pci0:0:21:3:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4deb subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none6@pci0:0:22:0:      class=0x078000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4de0 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Management Engine Interface'
    class      = simple comms
ahci0@pci0:0:23:0:      class=0x010601 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dd3 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = mass storage
    subclass   = SATA
none7@pci0:0:25:0:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc5 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
none8@pci0:0:25:1:      class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc6 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
pcib1@pci0:0:28:0:      class=0x060400 rev=0x01 hdr=0x01 vendor=0x8086 device=0x4dbc subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-PCI
pcib2@pci0:0:28:5:      class=0x060400 rev=0x01 hdr=0x01 vendor=0x8086 device=0x4dbd subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-PCI
none9@pci0:0:30:0:      class=0x078000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = simple comms
none10@pci0:0:30:3:     class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dab subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = serial bus
isab0@pci0:0:31:0:      class=0x060100 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4d87 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    class      = bridge
    subclass   = PCI-ISA
hdac0@pci0:0:31:3:      class=0x040300 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4dc8 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake HD Audio'
    class      = multimedia
    subclass   = HDA
none11@pci0:0:31:4:     class=0x0c0500 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da3 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake SMBus'
    class      = serial bus
    subclass   = SMBus
none12@pci0:0:31:5:     class=0x0c8000 rev=0x01 hdr=0x00 vendor=0x8086 device=0x4da4 subvendor=0x8086 subdevice=0x7270
    vendor     = 'Intel Corporation'
    device     = 'Jasper Lake SPI Controller'
    class      = serial bus
iwm0@pci0:1:0:0:        class=0x028000 rev=0x81 hdr=0x00 vendor=0x8086 device=0x3165 subvendor=0x8086 subdevice=0x8010
    vendor     = 'Intel Corporation'
    device     = 'Wireless 3165'
    class      = network
re0@pci0:2:0:0: class=0x020000 rev=0x15 hdr=0x00 vendor=0x10ec device=0x8168 subvendor=0x10ec subdevice=0x0123
    vendor     = 'Realtek Semiconductor Co., Ltd.'
    device     = 'RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller'
    class      = network
    subclass   = ethernet

 
NotePC のかわりにモバイルで持ち出すのもアリな雰囲気です。ちっこくて、ほどほど速い (ベンチ取らずに体感でのコメントで申し訳ない(^^;) し値段も手頃なので、まぁ『あり』なのかなぁ;-)。

9月 182022
 

自宅のデスクトップ機自宅サーバに HP ProDesk 405 SFF/CT を購入しました。時期的にデスクトップ機は G6 、自宅サーバは G8 というタイミングです。

で、この二台は AMD Ryzen7 PRO CPU が搭載されています。 BIOS (UEFI) メニューを見ると AMD DASH というのに対応しているようです。

そもそも “AMD DASH” とはなんぞや?

簡単に言うと iLO みたいにリモートで BIOS を管理でる機能らしい。あくまで『らしい』のであります;-)。

AMD DASH を利用するためには PC 側に AMD DASH で利用するための IPv4 アドレスの設定が必要です。これは iLO と一緒ですね。

そして、管理用のマネージャーが必要です。マネージャーは以下の URL にアクセスしてダウンロードすることができます。

https://developer.amd.com/tools-for-dmtf-dash/

『AMD MANAGEMENT CONSOLE』ってのがそれにあたります。

確認してみると Windows 用の GUI と CLI 、各種 Linux 対応の CLI がダウンロードできるようです。
まぁ、『手元の Linux で CLI』より『手元の Windows で GUI』のほうが楽だろうと思い AMC-setup-7.0.0.956-AMD.exe をダウンロードし、手頃な WindowsOS にインストールします。

これでマネージャー側の準備は完了。では早速、デスクトップ機にアクセスしてみることにしましょうっ!! ってんですが、これが大変。

PC 側で AMD DASH を有効にして IP を付加させるまでの工程は随分と苦労するので、今回はそちらをメインに書いてみます。

 
1. BIOS (UEFI 画面。以降 BIOS 画面と記載) で AMD DASH を有効化
その通りですね。 BIOS 画面で [詳細設定] -> [システムオプション] を選択して下から二番目にある「AMD DASH」にチェックを入れます。



 
2. UEFI ドライバーからの「他社製オプション ROM の管理」へアクセス
「AMD DASH」にチェックを入れたあと、次に BIOS 画面で [UEFI ドライバー] を選択し、そこに表示されている「他社製オプション ROM の管理」の項目を選択します。 選択したあと、保存して終了します。そのタイミングで再起動します。

再起動して起動してくるタイミングで F3 キーを押してください。画面の左下に以下のように表示され、その後「他社製オプション ROM の設定」画面が表示されます。

F9 はブートセレクト画面、 F10 は BIOS 設定画面が表示されますが、 F3 キーを押すと「他社製オプション ROM の管理」画面が表示されます。これは裏技か? どこにも書かれてないぞぉー。

 
3. AMD DASH のネットワークと認証設定
「他社製オプション ROM の管理」画面にはいりました。青ベースの画面になりますね。

僕の場合はオンボードの Realtek の NIC と PCI-e x16 スロットに HP 純正の Intel の 2Port NIC のカードが入っているので MAC アドレスが 3 個見えますが、ここから Realtek の NIC の設定画面に入ります。Realtek は一番下の NIC ですね。

NIC を選択すると設定画面に突入。

右上には「AMD DASH の設定をしているよー。」って、表示されています。

ネットワークの設定については、まぁ、ややこすぃーのでとりあえず DHCP の設定をしてから抜けます。
個別の IP アドレスを指定しても良いと思いますし VLAN-ID を設定しても良いと思います。が、一番最初は勝手がわからないので DHCP でアドレスを取得するようにします。
この画面、良く見てみるとネットワークの設定するところが二ケ所あるんですよ。どっちが AMD DASH 用か良くわからない。なので、両方のネットワーク設定で DHCP の設定としました。

Realtek RealManage Setup のところで Setup and Configuration の中に入ると Security 関係の ID とパスワードが求められます。これには Administrator/Realtek で認証が通過します。

AMD MANAGEMENT CONSOLE からアクセスする際の認証に利用されます。 Administrator/Realtek は default 値です。

完了したら「他社製オプション ROM の設定」画面を抜けて再起動します。

 
4. しかし、実際の IP アドレスの割当は?
今回はデスクトップ機の HP ProDesk 405 G6 SFF/CT 側で AMD DASH を設定したので、こちらを利用します。 PC 上で動作している OS は FreeBSD/amd64 13.1-RELEASE です。

まず、自分のネットワークの網内に dhcpd を起動します。 FreeBSD 的ですが tail -f /var/db/dhcpd/dhcpd.leases して、 Realtek の NIC がどの IPv4 アドレスを取得するか確認します。

PC の電源を入れた段階でただちに IPv4 が取得されると思います。

『オンボードの Realtek の NIC は FreeBSD でも利用するのに AMD DASH で IPv4 アドレス取得して FreeBSD でも IPv4 使うの、無理じゃね?』

となるのであります。

その昔、HP DL320G5p 辺りに iLO とオンボード NIC が一緒のポートで VLAN で IP アドレスを使い分けろ。とかいうのがありました。その後、この仕様はなくなり iLO と OS が利用する NIC は別ポートなのが主流になりましたが・・。

「他社製オプション ROM の設定」画面で VLAN の設定もできるので、そこで PC セグメントと AMD DASH 用管理セグメントを分けた VLAN-ID を設定する。と、いうのも一つの手ではあります。

と、いうことで、この部分の IP アドレスの使い分けが非常にややこしい。自宅に Cisco 891FJ があるとはいえ・・。既に VLAN を利用して自宅のネットワークを構築しているとはいえ・・。

 
と、いうことでオンボードの re0 は AMD DASH 専用ポートに、PCI-e の 2Port NIC を FreeBSD 側で利用 (em0・em1 で認識している)することにします。

FreeBSD ではオンボードの Realtek の NIC は /boot/kernel/if_re.ko では動作しません。 ports から net/realtek-re-kmod をイントールした /boot/modules/if_re.ko を利用する必要があります。

 
PC に電源を入れて DHCP で取得した IP アドレスに ping を打ち続けるのですが、 FreeBSD が起動して re0 が認識した時点で ping が止まります。 AMD DASH と FreeBSD の IP アドレスがグチャグチャになるのでしょうなぁ。

それにしても AMD DASH 対応の NIC のために FreeBSD の標準 if_re.ko では動作しないのかな?
まぁ、FreeBSD は em0 を利用して通信するので re0 を認識させる必要さえありません。

 
ちなみに、自宅サーバ側の HP ProDesk 405 G8 SFF/CT は VMware ESXi 7.0 が動作していますが、ESXi7 はそもそも Realtek の NIC を認識しないので、こちらは問題なく AMD DASH で利用できますね。ただ、もう ESXi7 が起動している状態なので AMD DASH の設定してませんが・・f(^^;;。

 
オンボードの Realtek NIC の IP アドレスの設定について FreeBSD のみで動作確認したので WindowsOS ではどういう振る舞いをするのか確認さえしていません。もしかしたらドライバが優秀なのかもしれませんが、僕は見ようとも思ってません;-)。

と、いうことで AMD DASH 用に IPv4 アドレスが付いたでしょうか?

では次に進みましょう;-)。

 
5. AMC Console を起動
Windows にインストールした AMD MANAGEMENT CONSOLE を起動します。
一番最初にセットアップ画面が表示され、認証用 IP とパスワードを指定するように求められます。先程の default 値の Administrator/Realtek を指定します。
次に AMD DASH 対応 PC をネットワークから探査します。一番左にある “DISCOVER” と書かれたアイコンをクリックします。

  • hostname
  • IP Address
  • TCP/IP Range
  • Active Directory

 
上記で探査可能ですが、dhcpd のログを確認して IPv4 アドレスは解っているので素直に IP Address で探査します。

探査できるとこんな感じです。

 
6. AMC Console を使い込んで行こう
一旦認識されると All Systems というコンピュータグループに登録されるので、確認します。
探査された PC の状況や BIOS の情報を表示してくれます。色々見て楽しんでください;-)。

あとは AMC Console の上のアイコンにあるメニューを順に確認していく。と、いう感じでしょうか。機能的に色々試す。と、いう感じです。

 
僕的には右から 4 番目の “REMOTE ACCESS” がえらい気になったですが・・。 iLO5 だと HTML5 コンソールとか起動して、 PC の画面が表示できるのですか、『AMD DASH もできるのかっ!?』うひっ!! ・・。 まぁ、甘かったですね・・。orz

ちょっと使ってみたのですが、 BIOS 設定など表示できるのはうれしいです。が、その程度かなぁ・・。 iLO にはほど遠いみたいな雰囲気でしょうか。まぁ、CPU メーカがここまでよくやった。うんうん。

 
あ。ここまで書いて、思い出したっ!! AMD DASH は iLO の対抗ではなかったですね。 Intel の vPro 対抗の機能だったっ!! 失礼しましたっ!!

と、いうことで機能的には Intel vPro と同等なのかな?

 
興味がある方は色々試してみてください。

上にも書いた通り、ネットワーク設定が通過できると比較的容易に遊べるようになるかと思われます。

 
このエントリは AMC Console の利用方法について記載したものではなく、どこにもドキュメントが無い AMD DASH を利用する PC 側のネットワーク設定について書かれたモノなのであります。なので AMC Console の Linux CLI とか Windows GUI とか、そんなのはどうでも良いことなのでありますっ!! ;-P。

 
(参考にしたサイト: https://www.reddit.com/r/Amd/comments/ism4wg/trying_out_dash_remote_access_on_a_thinkpad_t14s/)
どこにもドキュメントが無いないわけではなかった・・。ほっ。

8月 282022
 

去年の 11 月にデスクトップ PC を新調しました。 CPU は AMD Ryzen7 PRO 4750G です。この環境において FreeBSD を起動 (当時は 13.0-RELEASE でしたが、今は 13.1-RELEASE が動作しています) しています。

素晴らしい CPUをチョイスしたので 8 Core/16 スレッドです。ports を make するとメモリが足りなくなって大変。みたいな・・。
この強力な CPU パワーを使い切るのは ports のコンパイル時しかないんかい?! になるのも悲しいので VirtualBox でもインストールして利用するべ。などと思っても、ちぃとも動作しない・・。

エラーとしてはこんな感じ。

文字列的には・・。

仮想マシン"WindowsServer2012_01"のセッションを開けませんでした。

VirtualBox can't enable the AMD-V extension. Please close all other virtualization programs. (VERR_SVM_IN_USE).

終了コード : NS_ERROR_FAILURE (0x80004005)
コンポーネント: ConsoleWrap
インターフェース: IConsole {872da645-4a9b-1727-bee2-5585105b9eed}

 
まぁ、OS は Windows Server でなくとも良いんですが、 Windows11 だったり FreeBSD なども上記エラーメッセージが出力されて起動しない・・。 orz
せっかくの 8 Core/16 スレッドな CPU なのに・・。

たまに VirtualBox を起動して『あ。やっぱり動かないね。』になるのよねぇ・・。
BIOS (UEFI) で AMD-V (AMD SVM) が有効になっていることは何回も確認している。

上記メッセージは日本語的には

「VirtualBox は AMD-V 拡張機能を有効にできません。 他のすべての仮想化プログラムを閉じてください。 (VERR_SVM_IN_USE)。」

らしいんですな。 Linux 方面では kvm と VirtualBox がケンカしていて仮想化資源を取り合っているんだそうで、VirtualBox を起動する際は kvm のカーネルモジュールを rmmod すれば良いらしい。

 
では、 FreeBSD は何が仮想化資源を掴んでいるのだぁ!? と、なるのですが、原因が全くわかりません・・。

cat /var/log/messages してみると・・。

vboxdrv: XXXXXXXXXXXXXXXX VMMR0.r0
vboxdrv: XXXXXXXXXXXXXXXX VBoxDDR0.r0
VMMR0InitVM: eflags=40246 fKernelFeatures=0x2 (SUPKERNELFEATURES_SMAP=1)

 
んー。見覚えのある文字列がありますが、これはなんなんざんしょ(?_?) と、いう状態です・・。

でもって、閃いた。試しに vmm.ko を kldunload してみた。

$ sudo kldunload vmm.ko
ivhd0: detached
amdiommu0: detached
pci0:  at device 0.2 (no driver attached)

 
man vmm してみると以下のように表示されますな。

NAME
vmm.ko – bhyve virtual machine monitor

DESCRIPTION
vmm.ko provides the kernel portion of the bhyve(4) hypervisor.

An Intel CPU with VT-x/EPT or AMD CPU with SVM support is required.

PCI device passthrough to a virtual machine requires hardware with VT-d support.

なるほどねぇ・・。こいつと競合していたのねぇ・・。と、いうことで、以降はすんなりと VirtualBox の仮想マシンが無事に起動したのでありました。

 
と、いうことで、VirtualBox が仮想化資源をつかめない。上記のようなメッセージが出力されている場合は、競合が発生しているので、とりあえず vmm.ko がロードされていないか確認すると良いと思います。

僕は AMD の CPU しか使ったことないけど、 Intel 系の CPU も vmm.ko は kldload できるのかな?

8月 212022
 

FreeBSD で Xorg を利用していた場合、USB のキーボード、マウスを一回抜き差しすると、設定がぜぇーんぶ飛んでしまいます。

例えば僕は USB 切り替え機器で FreeBSD 、macOS 、WindowsOS の間を一個のキーボードとマウスを利用しています。
FreeBSD から macOS に USB 切替器で切り替えると、 FreeBSD から見ると USB のキーボードとマウスは一旦切り離された状態 (devd 的に言うと detatch された状態) になります。
そして macOS から FreeBSD に戻るときに USB 切替器で切り替えると今度は attach された状態になります。

アタッチされたとき、最近の Xorg ではキーボード、マウスの設定が全部飛んでしまうんですな。以前は設定情報がとんでしまうなんてことは無かった。しかし、今は飛んでしまう。 Xorg のデバイス検知の仕掛けが libinput とか xinput 、 evdev 辺りになった影響なのかもしれないですな。

 
では、USB キーボード・マウスの、どんな設定が detatch -> attach で飛んでしまうのか?

キーボードの場合、 2 個前のエントリで書いた ${HOME}/.xmodmaprc の内容が消えてしまう。毎回 USB キーボードを attach する毎に xmodmap コマンドを打つ必要がある・・。orz

打つコマンドとしては以下のような感じ。

$ xmodmap ~/.xmodmaprc

 

マウスの場合、俗に『ナチュラルスクロール』などと言っていますが、回転方向を macOS みたいにする設定ですね。
KDE の場合「KDE システム設定」->「入力デバイス」->「マウス」から『スクロール方向を反転』のチェックをはずして [適用] を押したあと、チェックをつけて再度 [適用] を押すともとに戻ります。

が、GUIベースでこんなことしないで、CLI 的コマンドが何個か用意されています。

# libinput list-devices
<略>
Device:           MOSART Semi. 2.4G Keyboard Mouse, class 0/0, rev 1.10/1.03, addr 15
Kernel:           /dev/input/event7
Group:            8
Seat:             seat0, default
Capabilities:     pointer 
Tap-to-click:     n/a
Tap-and-drag:     n/a
Tap drag lock:    n/a
Left-handed:      disabled
Nat.scrolling:    disabled
Middle emulation: disabled
Calibration:      n/a
Scroll methods:   button
Click methods:    none
Disable-w-typing: n/a
Accel profiles:   flat *adaptive
Rotation:         n/a
<略>
$
$ xinput list
⎡ Virtual core pointer                        id=2    [master pointer  (3)]
⎜   ↳ Virtual core XTEST pointer                    id=4    [slave  pointer  (2)]
⎜   ↳ System mouse                                  id=6    [slave  pointer  (2)]
⎜   ↳ Compx 2.4G Wireless Receiver                  id=11   [slave  pointer  (2)]
⎜   ↳ MOSART Semi. 2.4G Keyboard Mouse              id=13   [slave  pointer  (2)]
⎣ Virtual core keyboard                       id=3    [master keyboard (2)]
    ↳ Virtual core XTEST keyboard                     id=5    [slave  keyboard (3)]
    ↳ System keyboard multiplexer                     id=7    [slave  keyboard (3)]
    ↳ Power Button                                    id=8    [slave  keyboard (3)]
    ↳ AT keyboard                                     id=9    [slave  keyboard (3)]
    ↳ Compx 2.4G Wireless Receiver                    id=10   [slave  keyboard (3)]
    ↳ MOSART Semi. 2.4G Keyboard Mouse                id=12   [slave  keyboard (3)]

 
今回やりたいことはマウスの逆回転をコマンドで設定したいということで、表示された内容を確認するには pointer をチェックします。すると “MOSART Semi. 2.4G Keyboard Mouse” と、いうマウスデバイスになります。

このマウスの回転方向を逆転するには以下のコマンドを利用します。

$ xinput list-props "pointer:MOSART Semi. 2.4G Keyboard Mouse"
<略>
$ xinput set-int-prop "pointer:MOSART Semi. 2.4G Keyboard Mouse" "libinput Natural Scrolling Enabled" 8 1

 
一行目のコマンドで対象となるマウスの内容を一旦表示してみました。二行目のコマンドでマウスの回転方向を逆にします。オプションの “libinput Natural Scrolling Enabled” 8 1 がそれになります。
前半部分はマウスのデバイス名になるので、マウスが変わるとデバイス名が変わります。

 
と、いうことで、ここまでが前ふり部分のお話です。

  • キーボードのキーマップを変えたいときはキーボードの attach 後に毎回 xmodmap コマンドを投入
  • マウスのホイールを逆回転にしたいときはマウスの attach 後に毎回 xinput コマンドを投入

 
detatch -> attach 後に毎回上記コマンドを打つとなると、それなりにイヤになりますね。
USB 機器の attach を検知して自動的にコマンドを実行してくれないものか・・。

そーいうときのために devd という機能がありましたっ!! 早速 /etc/devd/keybord.conf という設定ファイルを書いて devd を restart してみます。

notify 100 {
        match "system"          "USB";
        match "subsystem"       "DEVICE";
        match "type"            "ATTACH";
        match "vendor"          "0x25a7";
        match "product"         "0xfa70";
        action "/home/takachan/bin/KeybordOn.sh";
};

 
USB デバイスの vendor と product を usbconfig -d ugen0.5 show_ifdrv コマンドで拾ってきて設定します。 USB デバイスが attach されたときに action に記載されたスクリプトが実行されます。

なんか、無事に USB デバイスの検知はしているようですが、スクリプトの動いている感が全くありません。
なんでか、悩んだのですが、そもそも devd は root 権限で動作しております。それが一般ユーザの takachan のために Xorg のキーボードの設定やマウスの設定なんてしてくれるはずが無いのです。 $DISPLAY とかどうなっているのだ?! 的発想です。
まぁ、当たり前と言えば当たり前ですが・・。

ちなみに devd には /var/run/devd.seqpacket.pipe のいうのがあって、この pipe を一般ユーザ権限で動作するプログラムが受けると、一般ユーザ権限でイベントが受けられらしいですが、あまりドキュメントが無い・・。 devd-rs というのがヒントになります。

 
一般ユーザがもっと気軽に USB デバイスのイベントを拾えるようなものはないのか? 探してみると ports にあるようです。x11/inputplug になります。 コンパイル時には rust がいるかな? (大変だぁ・・)

inputplug は、例えば ~/.xsession に記載しておくことにより Xorg へのログイン時に一般ユーザ権限のデーモンとして起動します。起動後は xinput のイベントを拾うことができるようになります。

$ echo 'echo "$@"' > xishow; chmod 755 xishow
$ inputplug -d -c ./xishow

 
とりあえず xinput のイベントを拾って表示する xishow スクリプトを用意して inputplug を起動します。 -d はデーモンモードにならないオプションで -c はスクリプトを指定します。 -d を指定しないとバックグラウンドで動作してしまって、仮に情報が拾えていても tty に表示してくれないので、最初の試験中はほぼほぼつけていたほうが良いです。

上記の状態で USB 機器を detatch -> attach してイベントが拾えていれば OK。 あとはスクリプトの部分を作成していくことになります。
それにしてもこれで一般ユーザ権限でようやっと USB 機器のイベントが拾えるようになったぁ。ふぅ・・。

 
と、いうことで、僕が作成したスクリプトはこんな感じ。大急ぎの perl であまり美しくないですけどねぇ・・f(^^;;。

#!/usr/local/bin/perl

use strict;

my $pointer = "MOSART Semi. 2.4G Keyboard Mouse";
#my $pointer = "Telink Wireless Receiver";

my $cmd1 = "/usr/local/bin/xmodmap ${HOME}/.xmodmaprc";
my $cmd2 = "/usr/local/bin/xinput set-int-prop ";
$cmd2   .= "\"pointer:${pointer}\" ";
$cmd2   .= "\"libinput Natural Scrolling Enabled\" 8 1";
my $cmd3 = "loggder -t USB-keybord and mouse Ready.";   


my @opt = ();

for (my $c = 0;$c < 11; $c++) {
    push(@opt,shift);
}

my $f1 = 0;
my $f2 = 0;
my $f3 = 0;

foreach my $data (@opt) {
    $f1++ if ($data eq "XIDeviceEnabled");
    $f2++ if ($data eq "XISlaveKeyboard");
    $f3++ if ($data eq $pointer);
#    print "DEBUG: $f1 / $f2 / $f3 : $data" . "\n";
}

if ($f1 && $f2 && $f3) {

# デバイスを認識する前にコマンドを実行してまうので 5 秒ほどスリープ
    sleep 5;
    print "CMD1: " . $cmd1 . "\n";
    print "CMD2: " . $cmd2 . "\n";
    print "CMD3: " . $cmd3 . "\n";
    system("$cmd1");
    system("$cmd2");
    system("$cmd3");
}

exit 1;

 
これで、USB 機器接続後に xinput のイベントを拾ったあと、xmodmap と xinput set-int-prop のコマンドを実行してくれるようになりました。
やりたいことがようやっとできました。そこはかとなく長い道のりだったのであります。

が、今の時代、 FreeBSD でここまでがっつりと Xorg 使っている人、居るんかいな?
このエントリが無駄にならないことを切に願うのであります・・。

8月 112022
 

以前のエントリで「macOS で Wiondows キーボードを。」というのを書きました。このときは、かな刻印のない HHKB Lite2 の後釜どうしよう。的な記事で、安めの エレコムの TK-FCM103XBK を購入して、Windows・FreeBSD・macOS で利用。って、感じの記事でした。

あれからしばらくして、有線ではない、無線の TK-FDM105TXBK と、いうのも購入しました。エレコムのこれ系のキーボードは都合 3 個購入して色々なシーンで利用しようと思いました。

 
が、しょせんは HHKB Lite2 と一緒でナイロンの弾力でベコベコ打つ。みたいな感じです。『赤軸とか青軸と呼ばれるちょっと高価なキーボード使ってみたいなぁ。』とか思い探してみることにしました。

あんまり高いのは買えないので、まず、そこはかとなく安価な GAMDIAS の HERMES S1R というの購入してみました。

やじるしキーがついていて日本語配列、かな刻印あり。
あ。下のキーボードについてはあとで説明します;-)。

僕に必要な機能は一通り付いていました。キー配列などはエレコムの TK-FCM103XBK と一緒なので問題ありません。
それにしても個人的には初めてのゲーミングキーボード。ゲーミングキーボードって、どうしてキーの根元が丸見えなんでしょうかねぇ?不思議です。僕は PC でゲームをやらないので良くわからないのですが、左側の Windows キーはジャマなんでしょうかねぇ?

キーを押したときに色が光るのはまぁ、よしとします。自分で色々なパターンや明るさを設定できるのも良い感じでしょうか。

 
赤軸なのでキーを押したときの感覚がなかなか良い感じです。そして打刻音もベコベコとした雰囲気が良い感じです。

これをしばらく使い続けていたのでありました。

 
そんな状況の中で『60% キーボード』という言葉を耳にしました。フルサイズのキーボードの 60% 程度の大きさで、サイズ的には HHKB くらいのサイズです。

へー。

とか、思いネットを色々さまよってみました。そしたら、WENRUI メカニカルキーボード 日本語配列 キーボードというのが目に止まりました。

日本語配列、かな刻印あり、有線 USB 接続、無線 USB 接続、Bluetooth での接続もできて、バッテリー搭載。と、いうもういたせりつくせりな感じ。

『無線 USB 接続』というのは FreeBSD では必須です。FreeBSD の Bluetooth はアテになりませんしね。USB 有線よりは無線のほうが良いという雰囲気。

このキーボードが 6,000yen を切る価格で販売されていたので購入してみました。

上が HHKB Lite2 で、下が今回購入した WENRUI メカニカルキーボード 日本語配列 キーボードです。

 
一点気になったのが、物理的な『矢印』キーが付いていない点でしょうか。
Fn キーを押しながら『め』『かな』『変換』『Menu』キーを同時押しすると『矢印』キーとして動作する。と、いう状態です。

物理的な問題としては他に、スペースバーの左側に『無変換』キーがありません。『Alt』キーと一緒になっています。macOSの場合、日本語オフ (裏を返すと英語入力のオンか) する場合 Fn との同時押しが必要かも。

『Esc』 キーは Fn キーを押さない場合は『全角/半角』キーになります。 Fn キーと同時押しで『Esc』キーが機能するとなると Emacs 使いには非常に厳しい・・。

機能的には他に Shift + → + Fn が動作しません。

僕の場合、仮想デスクトップを利用するときに、デスクトップを切り替えるのに Ctrl + 『矢印』キーを利用しているのですが、このキーボードは『矢印』キーがないので Fn を同時押しする必要があります。

KDE5 の konsole とか、タブのついているアプリのタブ切り替えは Shift + 『矢印』キー だったのですが、Shift + → + Fn が動作しないため Shift + ← + Fn を押してグルッと反対方向に一周させる必要があります。

Shift + → はキーが別のに取られているようで、どうしようもない。と、いうのが現状のようです。

 
では実際に色々な OS で正しく動作するように設定を入れてみました。

WindowsOS では『Esc』 キーを Fn との同時押しにしないようにするために Microsoft PowerToys をインストールしてキー設定しました。

VK244 が『Esc』 キーを Fn との同時押しにしないようにするための設定。
Apps/Menuの設定が Shift + → + Fn を有効にする設定。

 
macOS では以前も解説した(上記リンクを参照してください)ことのある Karabiner-Elements で設定しました。『無変換』キーも無いので日本語オン・オフは『変換』キーと『かな』キーに割り当てました。当然 Shift + → + Fn を有効にする設定も追加しました。

application はShift + → + Fn を有効にする設定です。
grrave_accent_and_tilde(`) の設定が『Esc』キーのみで Esc が動作する設定。
スペースバーの右側 2 つのキーを英数字オン・漢字オンに割り当てました。

 
FreeBSD の場合、僕は KDE5 を利用しているので「KDE システム設定」の「キーボード」→[詳細] タブでそれらしいのをチョイスしして『全角/半角』キーと『Esc』キーを入れ替えました。

昔の X の設定は ${HOME}/.xmodmaprc とかに色々書いたりしていましたが、今は、KDE5 を使うのであればそちらの設定に任せてしまったほうが楽ちんですね。

が、上に書いた Shift + → + Fn が機能しない件ですが、こちらは ${HOME}/.xmodmaprc で解決しました。必要ない。って言ったのに、やっぱり書いてみました・・;-P。
Shift + → + Fn は keycode 147 なので、これを Right の keycode 114 に変更します。 (xev で確認できるよー;-)
『Esc』は keycode 9 なので 49 を 9 に変更します。

! shift + -> 
keycode 147 = Right Right Right 

! Zenkaku_Hankaku -> Escape
keycode 49 = Escape Escape Escape

 
と、いうことで必要な設定は OS ごとに準備完了。あとはベコベコうち続け、経験値を積んていくだけです。

このエントリも WENRUI メカニカルキーボード 日本語配列 キーボードで打っています。『矢印』キーは Fn キーと同時押しなので、ちとめんどう。Emacs のカーソル移動ショートカットで回避 (C-n C-p C-f C-b) すると、やじるしキーの出番は少なくなりそうですね。
Windows でも xkeymacs 利用しているし macOS はそもそも emacs キーバインドなので、良い感じです。

 
テレワークで家で仕事する機会が多いので、文字入力環境を考えていたら、なんか、ずいぶんとキーボードが溜まってきたような気がしますf(^^;;。

自分にあったものを色々と見つけてみたいと思います。が、キーボードはさすがにしばらくもー良いかな。