QEMUでDOSアプリを動かす(1)

Windows 10をMac mini (Intel)のVMWareで動かしていますが,その目的は現在ではDOSアプリであるアマチュア無線用ログソフト(以下 “ログソフト”)を動かすためだけです

Windows 10になってDOS窓内での日本語入力ができなくなってしまいました.そこで現在,日本の地名などもローマ字書きしています.そのWindows 10のサポートは既にメインストリームサポート期間を終了して,セキュリティー対策等だけの延長サポート期に入っています.延長サポートも2025年10月15日に終了するそうなので,そろそろ対策を考え始めないといけません.

現在Windows 11が動くハードウエアも仮想マシンも持っていません.11でも多分DOS窓内で日本語入力は保証されていないでしょうから,そのDOS窓を開くだけのためにハードや仮想マシンやWindowsのライセンスへの新たな投資はバカバカしいです.

ずいぶん昔はLinuxマシン上でDOSEMUというi486エミュレーター上に日本語サポートされたFreeDOSを走らせてそこでログソフトを動かしていました.しかし,x86系のCPUを搭載したLinuxマシンを常用しなくなったこともあり,Windows 8.1→10のDOS窓内で動かしていた次第です.

DOSEMUの開発はとっくに終わっていて,今日のGCCでは自力でbuildもできません.

しかし世の中には同じようなことを必要としたりより高いスキルで解決したりする人がいるようで,自分が今日いじっているdistroを確認したところ,Manjaroには正規にパッケージがあります.また,Slackwareは好事家が作ったパッケージをまとめているサイトSlackBuildsbuild用スクリプトがあります.

Debianについては,開発元が開発をやめた関係で,4年前にUnstableからも外されていました

早速試してみたところ,Manjaroはそれこそ,

pacman -S dosemu

だけでインストールが済みました.また,SlackBuildsも,

sbopkg -i gcc5
sbopkg -i dosemu
sbopkg -i dosemu-fonts

で,かつてx86で動かしていたサブディレクトリーをコピーしてからC:, D:にそれぞれ割り付けることで動作確認できました(Manjaroは動作確認してません).

DOSEMUのいいところは,LinuxのファイルシステムのサブディレクトリーをC: D:ドライブに割り当てることができることで,他のエミュレーターのようにディスクイメージが必須ではありません(ディスクイメージも使えます).

これはなかなか塩梅が良く,DOS用ログソフトのデータファイルをLinuxのファイルシステムにおいたまま読み書きし(ログソフトでは新しい交信データを追記していくのがほとんどです),Linux上で自作スクリプトでMariaDBとやりとりできますし,Linux用のバックアップソフトでも更新したデータだけのバックアップで済みます.

ただ問題点としては,DOSEMUはCPUのエミュレートはしないため,x86のシステム上でしか動かず,Raspberry Piでは使えません.前述のように,今日x86のLinuxは常用していないのでできればRaspberry Piで動かしたいです.

いちおう,x86マシン上でDOSEMUを動かすというのは保険としてとっておいて,次はなんとかRaspberry Pi上でQEMUを使ってDOSを動かし,目的のログソフトを動かすことを目指します.

あとがき

呆れたことに,全く同じことを3年半前にやろうとしたようです.その成果が残っていないので頓挫したようです.

数年前までは,2〜3のWindows用アプリも動かしていました.
使いやすさが売りのManjaroがこうしたオタクしか使わないパッケージをサポートしているのは意外なようですが,大もとがオタクなArchLinuxなので普通にあるようです.

Enscriptのトラブル(Courierの字抜)の解決策

今まで動いていた自作のPerlスクリプトによるQSLカード記入面のデータ出力(enscript入力形式) から,enscript により印刷イメージのPS(PostScript)を生成する手順で,それぞれは動くのですが,出力されたPS形式のファイルをGhostscript付属のps2pdfでPDF化すると,どうしても等幅フォントCourierがひどく文字抜けします.アルファベットに関しては,ざっと見て大文字だけ抜けるのかと思えばそうでもなく小文字も多数抜けています.また数字は “1” 以外全部抜けているようです.

This image has an empty alt attribute; its file name is %E3%82%B9%E3%82%AF%E3%83%AA%E3%83%BC%E3%83%B3%E3%82%B7%E3%83%A7%E3%83%83%E3%83%88-2024-03-17-13.14.45.png

解決策

enscriptに与えるソースファイル内で,フォント名を “Courier”, “Courier-Bold” などから,それぞれ, “Courier-New”, “Courier-New-Bold” などに変更するだけです.

これだけで,enscriptとps2pdfで正しいPDFができます

This image has an empty alt attribute; its file name is 20240315-good-480x358.png

動作確認できたdistro

  • Slackware ARM (32bit) 15.0
  • Slackware AArch64 current
  • Raspberry Pi OS (64bit) Bookworm
  • Debian AMD64 Bookworm
  • Debian AArch64
  • Manjaro AMD64
  • Manjaro ARM(64bit)

Desktop環境はすべてKDE Plasma Desktopです.PDFの確認はOkularで行っています.

印刷も問題ありません.
Raspberry Pi OSでなく,UEFIブート用の本家Debian.Raspberry Pi OS (64bit)のもとで動く仮想マシン(KVM/QEMU)で稼働.

Slackware aarch64でいくことに (6)

性急な判断はせずに,しばらく評価を続けることにします.ただ,評価のために1TBのSSDをまるまるあてがうのはもったいないので,かつてRaspberry Pi 4 Model B (RPi4)の評価用に使用してきた500GB SSDに引っ越すことにしました.

現在このSSDはRaspberry Pi 5 Model B (RPi5)に引き継いでいます.約半分をManjaro ARM64(以下単にManjaro)に,残りの半分をRaspberry Pi OS 64bit (RPiOS)に割り振り,RPiOSはSSDからブート,Manjaroは2GBのSDカードにboot部分を書いてあり,差し込んで起動したらManjaroになるようにしています.

RPiOSでは仮想マシンを扱っていてその仮想ディスクイメージがあるのでこれ以上パーティションのサイズを小さくしたくないので,Manjaroの方を半分にすることにしました.

作業はCore i7のManjaro AMD64上で行いました.まずManajroの内容をすべてManjaro AMD64のディスク上にコピーし,Manjaroのパーティションを削除し,半分サイズでもう一度Manjaroのパーティションを作成し,残りをSlackware aarch64ように切りました.

あとはformatしてコピーです.Manjaro AMD64のディスクに一旦退避したRPiOSの内容を半分に減らしたRPiOSのパーティションに,1TBのSlackware aarch64の内容をまるまる500GB SSDの中の新しいパーティションにそれぞれコピーします.rootのコピーが終わったら,microSDカードをvfatでフォーマットして,ここにSlackware aarch64の/boot部分を書き込みます.

ここまではほとんど物を考えずにできますが,ブートするようにそれぞれの/boot/cmdline.txt/etc/fstabを書き換えるのは慎重に行う必要があります.なんか勘違いやケアレスミスをして1度でブートしないことがよくあります.

ブートがうまくいかないのは,たいていcmdline.txtroot=の間違いです. "root="が抜けていたり,その引数が間違っていたりです.

ということで,500GBのSSDをRPi5に接続して,SDカード無しでブートすると,RPiOS,SDカードその1を差し込んでブートするとManjaroに,SDカードその2を差し込んでブートするとSlackware aarch64が起動するようにそれぞれなりました.

しばらく評価を続けます.

zram (5) resumeの問題

zramの設定について,自己完結のために記事を書きましたが,自己完結していないので補記です.

Debianのクリーンインストールをデフォルトで行うと,ルートパーティションの後ろにswapパーティションが作られてしまいます.

/etc/fstabからswapの行を削除しても次に起動するとswapパーティションが使われています.fdiskでswapパーティションを削除するという強硬策に出ると,さすがにディスクのパーティションを使用したswapはしませんが,起動がやたら遅くなります.

これは随分前から何度も経験している “RESUME” の問題です.initramsfs内の起動設定でRESUME用にswapパーティションを必要とするため,マウントしたいけどできずタイムアウトまで無駄に時間を浪費する,ということです.

仮想マシンに独自にRESUME機能をもたせても意味がありませんから(仮想マシンとしてresumeできる),ここを無効にするのですが,distroにより流儀が違うようです.

Manjaroに関しては,当blog内に記事がありました

Debianに関しては,/etc/initramsfs-tools/conf.d/resumeの一行だけあるRESUMEの行をコメントアウトすればよいです

3年前の記事です.何年か周期で同じことを繰り返しています😥
当然/etc/initramsfs-tools/conf.d/resumeを削除しても良いですが,残しておけば後で何かの手がかりになるかもしれません.

Manjaro ARM64 ぶっ壊れる

Raspberry Pi 4 Model B (RPi4)をWS(workstation)として使える可能性を一番示してくれているdistroである表記Manjaro ARM64を使い続けてきました.当BLOGの記事からすると2年半とかになると思います.ローリングモデルの性(さが)といいますか,途中でパッケージマネージャーのデータベースにほつれが出てだんだんおかしくなってきました.

コマンドライン版のpacmanではupdate/upgradeできるのですが,GUI版のpamac-managerではなにもしなくてもいつも”Up to date”になる状態が1年以上続いたと思います.それに本日終止符が打たれました.コマンドラインのpacmanで依存性に衝突が生じてupdateができなくなりました.

たぶん,パッケージデータベースを修復する方法もあると思うのですが,このWSではあまりややこしい設定はしていませんので,新規インストールをすることにしました.

といっても完全に新規でなくて,夏頃から取り組んできたRTSP表示のためManjaro AMR64をSDカードにインストールしたものが使わずに放置されていたのでそれを使いました.

/bootのパーティションはvfatにフォーマットした2GBのSDカードにコピーし,ルートパーティションはSSDの旧Manjaroのあったところにコピーです./boot/cmdline.txtと/etc/fstabを修正して起動しました.その後でバックアップからメインユーザーのデータをコピーしてほぼ元通りです.

Manjaroにjoeがないと以前騒いでいましたが,素直にコンパイルできるパッケージなので自分でmakeして/opt/binに置きました.