OpenBSD on FreeBSD

Table of Contents

gpart

以前に、USB DriveにFreeBSDを入れた。その時、FreeBSD側からのgpart確認を 怠っていたので、確認しておく。まずは、FreeBSDが/dev/da0にて見える事を 確認。USBストレージはda0とかになるんだな

sakae@slfb:~ $ df
Filesystem  1K-blocks     Used     Avail Capacity  Mounted on
/dev/da0s1a 147252956 12934028 122538692    10%    /
devfs               1        0         1     0%    /dev
tmpfs          524288      104    524184     0%    /tmp
sakae@slfb:~ $ gpart show
=>       63  488397105  ada0  MBR  (233G)
         63          1        - free -  (512B)
         64  488397104     4  !166  [active]  (233G)

=>       63  488397105  diskid/DISK-091026PB42041SGY80YB  MBR  (233G)
         63          1                                    - free -  (512B)
         64  488397104                                 4  !166  [active]  (233G)

=>       63  312581745  da0  MBR  (149G)
         63          1       - free -  (512B)
         64  312475648    1  freebsd  [active]  (149G)
  312475712     106096       - free -  (52M)

=>        0  312475648  da0s1  BSD  (149G)
          0  304087040      1  freebsd-ufs  (145G)
  304087040    8388608      2  freebsd-swap  (4.0G)

そして、普通のHDDは、adaとかになるんか。このHDDはマシンに組み込みされ た奴。OpenBSDが入っている。

刺さる

USB Driveに入れたFreeBSDを使っていると、時々、応答しなくなる事がある。 それは突然にやってくる。lsに反応しなくなったり、psに応答しなくなったり、 見境なく発生する。 そうなった場合、コマンドをキャンセル(C-c)するんだけど、その痕跡がター ミナルに ^CC なんて風に残る。で、そのうちにプロンプトに戻るんだ。

どうも、Driveが応答しなくなってる。業界用語で言う、刺さる って症状だ。 これが発生して、回復した時、エラーが発生していないか/var/log/messageを 確認するんだけど、何の痕跡も無し。

Drive回りって事で、実害が無い sync コマンドでも、根気よく試していると、 発生した。どんな事をやってるか、 vfd_syscalls.c で確認。

/*
 * Sync each mounted filesystem.
 */
sys_sync(struct thread *td, struct sync_args *uap)
{

        return (kern_sync(td));
}

マウントされてる奴に対して実行。

kern_sync(struct thread *td)
{
        for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
                if (vfs_busy(mp, MBF_NOWAIT | MBF_MNTLSTLOCK)) {
                        nmp = TAILQ_NEXT(mp, mnt_list);
                        continue;
                }
                if ((mp->mnt_flag & MNT_RDONLY) == 0 &&
                    vn_start_write(NULL, &mp, V_NOWAIT) == 0) {
                        save = curthread_pflags_set(TDP_SYNCIO);
                        vfs_periodic(mp, MNT_NOWAIT);
                        VFS_SYNC(mp, MNT_NOWAIT);
                        curthread_pflags_restore(save);
                        vn_finished_write(mp);
                }
                mtx_lock(&mountlist_mtx);
                nmp = TAILQ_NEXT(mp, mnt_list);
                vfs_unbusy(mp);
        }
        mtx_unlock(&mountlist_mtx);
        return (0);
}

busyじゃない奴についてsyncする。で、その実体は、

#define VFS_SYNC(MP, WAIT) ({                                           \
        int _rc;                                                        \
                                                                        \
        _rc = (*(MP)->mnt_op->vfs_sync)(MP, WAIT);                      \
        _rc; })

vfs_sync が、本体だと思うのだけど、追跡してくと堂々巡りになっちゃう んだよな。はて、どうしたものか? geom(8) or disk(4)

VMWare

前回は、bhyveがマシンの機能不足で動作しなかった。ちょっと悔しいので、 知識を身につけておく。

エンジニアなら知っておきたい仮想マシンのしくみ 記事一覧

「ハイパーバイザの作り方」公開ページ

それから、残念なCPUを回避する方法も調べてみる。

Virtualization Technology (VT-X)を有効にするには on Lenovo

VMware Player で VT-x が有効化できない時はデバイス セキュリティを確認

VMware 16 PlayerでVT-xを有効にできていなかった話

Intel VT-x(CPUの仮想化機能)が有効にならずCMLが起動できない時の対応方法

やっぱり、微妙な問題には、Windowsが絡んでくるんだな。WSL2と喧嘩するの かな?

まあ、VMWareと言えどもWindows上のいちアプリでしかない。領主様のWindows の意向には逆らえない訳で。いや、WSL2なんてのに靡いたオイラーが意志薄弱 と認識しておこう。こやつ一度使うと癖になりますから。その主因は、 Windowsのスクリプト環境が貧弱すぎるからだろう。

PowerShellとか有るみたいだけど、根が腐っているからね。たとえば、血圧デー タの入力で、朝晩のセットで入力しなきゃいけない所を朝だけしか入力しなかっ たとする(入力時にこれは、あえてチェックしていない)。後でそれを検出する のは、5秒で作成できたよ。こんなの、PowerShellでは、どうやるか皆目見当 も付かないぞ。

alias ckcsv="tail -150 current.csv | cut -b-6 | uniq -c | grep -v '2 '"

これ、Debian/WSL2上のやつね。24070204 .. 24070221 .. みたいなデータな んで、冒頭の6文字を取り出して、uniq -c すれば、2になってるはず。それを 逸脱してるのを検出すればOK。unixならチョロイものだ。

OpenBSD on FreeBSD

FreeBSDにqemu税を支払って導入。税と言うのはDiskを無駄にするオプション 群の事ね。

sakae@f64:~ $ pkg info qemu
qemu-8.2.2_1
Options        :
        CDROM_DMA      : on
        CURL           : on
        DOCS           : on
        GNUTLS         : on
        GTK3           : on
        JPEG           : on
        NCURSES_DEFAULT: on
        OPENGL         : on
        PNG            : on
        SASL           : on
        VDE            : on
        X11            : on

X11,GTK3,OPENGLとかテキスト屋には、無用の長物なんだけどね。まあ、しょ うがない。自分用にqemuをコンパイルするなんてのは、考えないでおこう。

で、OpenBSD用のdiskを準備

sakae@f64:/opt/OB75 $ cat MKDISK.sh
qemu-img create -f qcow2 ./disk 8G

こんなインストール用スクリプトを利用。

sakae@f64:/opt/OB75 $ cat INS.sh
qemu-system-x86_64  -m 384 -nographic -no-fd-bootchk -s \
  -net nic -net user,hostfwd=tcp::2022-:22  \
  -hda disk -cdrom ./install75.iso

動作中にcom0の設定を行なう。下記 はcom0関係の項目に絞って掲載。

boot>  ;; Press SPACE
boot> help
commands: # boot echo env help hexdump ls machine reboot set stty time
machine: boot comaddr diskinfo memory
boot> set tty com0
switching console to com>> OpenBSD/amd64 CDBOOT 3.65
boot>
boot> boot
  :
Welcome to the OpenBSD/amd64 7.5 installation program.
(I)nstall, (U)pgrade, (A)utoinstall or (S)hell? i
At any prompt except password prompts you can escape to a shell by
typing '!'. Default answers are shown in []'s and are selected by
pressing RETURN.  You can exit this program at any time by pressing
Control-C, but this can leave your system in an inconsistent state.
  :
Terminal type? [vt220]
System hostname? (short form, e.g. 'foo') ob64
  :
Change the default console to com0? [yes]
Available speeds are: 9600 19200 38400 57600 115200.
Which speed should com0 use? (or 'done') [9600]
  :

こんな風にインストールを実施する。com0の設定は、/etc/boot.confに反映さ れているよ。

ob64# cat /etc/boot.conf
stty com0 9600
set tty com0

そして、こちらは、OpenBSDの起動スクリプト。

sakae@f64:/opt/OB75 $ cat boot.sh
qemu-system-x86_64  -m 384 -nographic -no-fd-bootchk -s \
  -net nic -net user,hostfwd=tcp::2022-:22  \
  -hda disk

初回の起動時に、/etc/firmware/vmm が自動的に追加された。これ、BIOS-ROM なのね。また、不要なダエモン君が多数出現してるので、下記の設定で、辞退 してもらった。

ob64# cat /etc/rc.conf.local
library_aslr=NO
pf=NO
check_quotas=NO
smtpd_flags=NO
ntpd_flags=NO
sndiod_flags=NO
slaacd_flags=NO
resolvd_flags=NO

VM on OpenBSD

さて、これで母艦ってかホストOSであるFreeBSDで、ゲストOSであるOpenBSDが 動き出した。qemuさん、ありがとう。そしてVWMwareさんには並々ならぬご支 援を頂き感謝しております。

さて、このゲストOS上で、VMしてみたい。OpenBSD FAQ - Virtualization

しっかり、前提条件が説明されてるぞ。

ob64# dmesg | egrep '(VMX/EPT|SVM/RVI)'
ob64#

残念なCPUは遺伝するんだなあ。あきらめろ。 強引に、起動してみる。

ob64# rcctl enable vmd
ob64# rcctl start vmd
vmd(failed)

そして、/var/log/messages

Jul  3 06:58:30 ob64 vmd[60344]: vmd: /dev/vmm: Operation not supported by device

泣く泣く、/etc/rc.conf.localに追加された、 vmd_flags= を削除するので あります。

ob64# ktrace rcctl -f start vmd
vmd(failed)

これじゃkshのログしか採取できないな。

ログから、発生現場を探してみます。まずは、文字列のエイリアスを見付ける。

ob$ cd /sys/sys
ob$ fgrep 'supported by device' *
errno.h:#define ENODEV          19      /* Operation not supported by device */

そして、現場に当たる。

ob$ cd ../dev/vmm/
ob$ grep ENODEV *
vmm.c: *  ENODEV: if vmm(4) didn't attach or no supported CPUs detected
vmm.c:          return (ENODEV);
vmm.c:          return (ENODEV);
vmmopen(dev_t dev, int flag, int mode, struct proc *p)
{
        /* Don't allow open if we didn't attach */
        if (vmm_softc == NULL)
                return (ENODEV);

        /* Don't allow open if we didn't detect any supported CPUs */
        if (vmm_softc->mode == VMM_MODE_UNKNOWN)
                return (ENODEV);

        return 0;
}

もうドライバーの領域(暗黒街)なんで、それなりの覚悟で潜入捜査しないと、 殺されるぞ。

TRAMP-Mode

しょうがないので、せめてソースと対面したいと思った。が、ゲスト側には emacsなんて入れてない。そこでホスト側のemacsを利用できないか?

こういう要望にちゃんと答てくれるんだなあ。その名は、TRAMP-Mode。微妙に 世界を騒がす御仁とはつづりが違うぞ。

素な使い方は、下記。

C-x C-f /ssh:sakae@localhost#2022:abc.c

少々ググったら、便利な設定が公開されてた。 Emacs Tramp でリモート上のファイルを直接編集する方法

sakae@f64:~/.ssh $ cat config
Hostname        localhost
Host    qemu
User    sakae
Port    2022

こんな設定をやっておくと、

sakae@f64:~ $ ssh qemu
sakae@localhost's password:
Last login: Wed Jul  3 15:18:56 2024 from 10.0.2.2
OpenBSD 7.5 (GENERIC) #79: Wed Mar 20 15:33:49 MDT 2024
 :

面倒なく、接続できた。ssh -p2022 localhost のエイリアスみたいなものだ な。

C-x C-f
Find file: /ssh:qemu:/sys/kern/
Password for /ssh:qemu:

そして、それをemacsにも適用できる。

接続が切れるとフリーズする。その場合は、
M-x tramp-cleanup-all-buffers を実行する

なお、~/.authinfo が自動作成されるけど、ヤバイ情報が格納されてるから、 都度削除しておこう。このトランプ野郎は、指定したゲストからファイルをロー カルに転送してemacsに喰わせるって仕組みで動作してる。だから、ヤバイ情 報をキャッシュしてるんだ。emacsを終了したら、自動で削除しないのかねぇ。 後始末大事だよ。

can't boot FreeBSD/amd64 on qemu

FreeBSDの母艦に、FreeBSDを入れて、ゲストをgdbしたい。

qemu-system-x86_64  -m 384 -nographic -no-fd-bootchk -s \
  -net nic -net user,hostfwd=tcp::2022-:22  \
  -boot order=d -cdrom ./FreeBSD-14.1-RELEASE-amd64-disc1.iso  disk

ちょいと苦労して、インストール用スクリプトを用意した。

Booting from DVD/CD...
CD Loader 1.2

Building the boot loader arguments
Looking up /BOOT/LOADER... Found
Relocating the loader and the BTX
Starting the BTX loader

が、上記の様に、ローダーの本体が起動してこない。

過去にi386版のFreeBSD 14.0を入れた事が有るんだけど、その時はすんなりで きた。OpenBSD上でやったので、同様の手順を踏んだけど、駄目だった。こう なったら、VMWareでやってみて、それを移動してくるかなあ。

install FreeBSD on VMweare

インストールしたら、すかざず、 com0からアクセス出来るように設定。on /boot/loader.conf

boot_multicols="yes"
boot_serial="yes"
comconsole_speed="9600"
console="comconsole,vidconsole"
autoboot 0

そのDISK(vmdk)を母艦に転送して、qcow2なフォーマットに変換。

sakae@f64:/opt/FB141 $ qemu-img convert -O qcow2 vmw.vmdk  disk
qemu-img: Could not open 'vmw.vmdk': Could not open 'vmw.vmdk': Invalid argument
sakae@f64:/opt/FB141 $ file vmw.vmdk
vmw.vmdk: VMware4 disk image

が、エラーだよ。4Gに分割を選んだので、実体は

-rwxr-xr-x  1 sakae wheel 1111228416 Jul  4 14:41 qemu-s001.vmdk*
-rwxr-xr-x  1 sakae wheel      65536 Jul  4 14:41 qemu-s002.vmdk*
-rwxr-xr-x  1 sakae wheel        497 Jul  4 14:41 qemu.vmdk*

最初、s001が本命と思ってvmw.vmkなんて名前で持ってきてたんだ。それが間 違いだっと。全部持ってきて、代表で、qemu.vmdkを指定したら、上手く変換 できた。

can not boot on qemu

Booting from Hard Disk...
/

何時まで待っても、loginが出てこない。

1001  2  R+     8:35.56 qemu-system-x86_64 -m 384 -nographic -no-fd-bootchk -s -net nic -net user,hostfwd=tcp::2022-:22 -hda disk

README

リブート!

読書メーター 皆様の感想が面白い。

オイラーは、このカタカナ言葉 & 業界用語に引かれて、この本を手にした次 第。著者の経歴をいの一番に確認するんだけど、金融機関でシステムエンジニ アをやってたそうだ。

銀行が統合した。A銀行とB銀行は、もちろん別々なシステムで動いていた訳だ から、おいそれと統合できない。当面の間、コンピューター間を橋渡しするシ テム(小説上ではリンカーって名称になってる)で、凌ぐ事になる。 そのシステムのお守りをする人達の物語。

そんな構図が現実に有ったよね。リレー・コンピューターって呼んでたかかな。 よく落ちるで有名だった、いなほの銀行の事ね。

このリンカーはUNIXで構築されているって設定。雷で停電、UPSが糞でホスト が落ちた。オイラーの現役時代に経験してるな。リアルな話しだ。

なんとかシステムを復旧。しかし、原因不明の振込が発生。苦労して原因を追 求したら、昔 顧客の要求で、取引店舗変更の為に作成したデータが残っていた。しかもその 帳票がYMDで持つべきデータをMDで処理してたと言う、ミニY2K 問題。アホみたいな話だなあ。

ホットしていたら、今度は謎のタイムアウトが頻発。サーバーの時計が3秒ず れていたらしい。ntpdが切れても数日で3秒も時計が狂うかね。稼動中のマシ ンの時計を、一気に修正しちゃうってどうよ? ntpdの効能を知らない人達だ ああ、と思っちゃうぞ。でも、時計合わせで現象消失。

でも、また再発。ノリノリってエイリアス名で呼ばれる新人(本名、範子)が、 ググってBUGを発見。それによると、 データの受信時に、ヘッダーに記された時刻と、リアルな時刻を加算して2で 割る処理がはいってた。その処理で2038年問題が発覚。 time_t が32Bitで 処理してたため、エラー発生、タイムアウト。いやいや、よくある事です。

どこのUnixか説明はなかったけど、まあ大型ホストをやってるメーカーのやつ でしょう。AIXかSolarisかな。想像すると楽しいな。 データベースは何を採用してるんだろう? mysqld? いやいや、落ちても責任 転嫁できる、ボラクルでしょう。ブランド品だから文句を言うなって原理が働 いているに違いない。

と、技術的に読むののいいし、あだ名が通用する、楽しいチームというか人間 関係の物語として読んでもいいよ。


This year's Index

Home