hiroの長い冒険日記

主にコンピュータ周辺の興味を持った内容を綴ります

Windows11 WSL2 に Plamo Linux を install してみた

当日記ではアフィリエイト広告を利用しています

WSL2 には Microsoft Store 又は wsl command で distribution が install できます。しかし前回の記事で試したように distrod を使用すると (少し不具合はあるものの) linuxcontainers.org の container 24種類が WSL2 で使用できます。その中に Plamo Linux も含まれていますが installpkg が使えない状態であり、ちゃんと使える状態ではありませんでした。調べてみると wsl の import command は単なる tar ball を再配置するだけのようですので、他の distribution も install できそうです。そこで、今回は軽量 Linux で systemd を使用していない distribution ということで、Plamo Linux を WSL2 に install してみる事にしました。

distrod で install した Plamo Linux の状態

linuxcontainers.org から install できる container 版の Plamo Linux ですが、簡単に導入できるメリットはあるものの、

  • installpkg 等の pkgtools が install されていない
  • wgetcurl 等の外部から package を download する方法がない

という不具合 (というか特徴?) がありました。00_base のみ install されているので、pkgtools8 や wget が入っていません。

WSL2 では mount option があるので、Plamo Linux の ISO image を mount すれば package の install は出来そうですが、常用できる環境まで整えるのは大変な状態だと感じました。

他のdistribution の WSL2 の対応状況と install 方法

幾つかの distribution では WSL2 への install が実現できているようです。

qiita.com

github.com

github.com

Gentoo Linux の install 方法を見ると、

  • '/' を基準とした package install 済みの tar ball を準備
  • wsl --import で vhdx に読み込み (この際に init が配置される?)

というやり方であれば、基本的にどんな distribution でも WSL2 に入れられるはずです。

そこで、仮想マシンに新たに Plamo Linux を最小構成で install して、それを tar ball にまとめて import してみる事にしました。

仮想マシンへの Plamo Linux の install

今は Ubuntudebian を使う事が多く、久し振りの Plamo Linux です。前回は Plamo 1.x の頃でしょうか (Plamo 開発の歩みによると1998年の Software Design の付録だったと記憶していますので Version 1.3 でしょう)。久々の install でやり方を忘れていますので、思い出しながら進めました。

install 環境

WSL2 Ubuntu + distrod systemd 化の環境で qemu-kvm を使用して install してみました。前回の記事で WSL2 で distrod を使い始めたので、WSLg 含め不具合がないかを確認する意味もあります。
hiro20180901.hatenablog.com

上記の記事に追記しましたが、distrod の linuxcontainers.org からの軽量 container の install では、WSLg は動作するものの、gnome-tweaks 等による設定が反映されない不具合 (/mnt/wslg 以下の Owner が login user ではなく 'ubuntu' になっている。chown で変更しても再起動で戻る) がありますので、今回は WSL2 Ubuntu に distrod を install した環境で試しています。

ですので、

が済んだ状態で、qemu-kvmPlamo Linux を install しました。

仮想HDD の準備と仮想マシンの起動

過去に試した内容と重複しますので、詳細は過去記事を参照ください。
hiro20180901.hatenablog.com

仮想HDD 作成 :
WSL2-distrod Ubuntu bash :

$ mkdir qemu_vm
$ mkdir qemu_vm/plamo
$ cd qemu_vm/plamo
$ qemu-img create -f qcow2 ./PlamoLinux.qcow2 32G
$ cp /usr/share/OVMF/OVMF_VARS.fd .

  • qcow2 で 32GB の仮想 HDD を準備します。
  • GPT 形式で install する為、UEFI の書き換えする部分を qcow2 と同じ folder に準備します。

install 用 script :
WSL2-distrod Ubuntu bash :

$ cd ~/qemu_vm/plamo
$ kvm -m 8G -smp 4 \
  -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
  -drive if=pflash,format=raw,file=OVMF_VARS.fd \
  -drive file=PlamoLinux.qcow2,if=virtio \
  -net nic,model=virtio -net user,hostfwd=tcp::2222-:22 \
  -machine vmport=off \
  -vga qxl \
  -spice port=5900,disable-ticketing=on \
  -cdrom /mnt/e/ISO/plamo-7.4_x86_64_2021-12-09_usb.iso -boot once=d -no-reboot

  • Windows側で download している plamo-7.4 の 2021/12/09 version を使用しました。ML を見ていたら get_pkginfo の際に最新版を使用していた方がよいとのコメントがありましたので、現時点で最も新しい物を準備しました。
  • Plamo Linux では installer で起動した段階でも sshd が起動していました。qemu-kvm で起動している Plamo Linux の中に入られるように、'hostfwd=tcp::2222-:22' を追加しています。cmd.exe から ssh -p 2222 plamo@localhost で login できます。
  • Windows 版の Remote Viewer で SPICE で接続できました。spice://localhost:5900 で OK です。これ以降の screen shot は Remote Viewer で記録したものです。

起動用 script :
WSL2-distrod Ubuntu bash :

$ cd ~/qemu_vm/plamo
$ kvm -m 8G -smp 4 \
  -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
  -drive if=pflash,format=raw,file=OVMF_VARS.fd \
  -drive file=PlamoLinux.qcow2,if=virtio \
  -net nic,model=virtio -net user,hostfwd=tcp::2222-:22 \
  -machine vmport=off \
  -vga qxl \
  -spice port=5900,disable-ticketing=on \
  -drive file=/mnt/e/ISO/plamo-7.4_x86_64_2021-12-09_usb.iso,media=cdrom \
  -boot c \
  -monitor stdio

  • 追加で DVD から package を入れようと '-cdrom' option を付けると此方から起動してしまうので、代わりに '-drive … ,media=cdrom' で接続して mount する様に変更しました。/dev/cdrom で mount できます。
  • ssh 及び SPICE については install の時と同様です。

install 手順

ググっても Plamo の install 画面は Web 上であまり見つからなかったので screen shot で説明しながら進めます。昔ながらの ncurses を使用した setup 画面なので、懐かしく感じます。それでも日本語表示なので分かりやすいです。

新しめの Plamo Linux は GPT 環境にも install できるようですので、GPT 環境で install する事にしました。

boot直後 : grub version 2 なので GPT で起動している模様。最初の項目を選択して enter。
f:id:hiro20180901:20220312190030p:plain:w800

起動 : 起動には少し時間がかかります。prompt 表示には、上部に日本語で記載の通り、user : root、password : root で login して setup を実行します。
f:id:hiro20180901:20220312190148p:plain:w800

setup 実行 : 私は英語配列なので KEYMAP の変更は不要です。上下キーでカーソルを移動できます。
f:id:hiro20180901:20220312190333p:plain:w800

cfdisk選択 : 3番目の 'cfdisk' を選択して enter を押します。
f:id:hiro20180901:20220312205651p:plain:w800

HDD の選択 : 仮想マシンなので '/dev/vda' を選択します。GPT なディスクの場合は EFI システムパーティションを作成するように注意書きがあります。
f:id:hiro20180901:20220312205737p:plain:w800

ラベルタイプを選択 : gpt を選択します。
f:id:hiro20180901:20220312205817p:plain:w800

cfdisk 起動直後 : 選択した '/dev/vda' は全て空き領域なので、「新規作成」を選択して順次パーティションを作成します。
f:id:hiro20180901:20220312205905p:plain:w800

EFI システムパーティション : ESP 領域としてパーティションのサイズ 128M を指定しました。
f:id:hiro20180901:20220312205949p:plain:w800

ESP領域のタイプの変更 : 元の画面に戻り、128MB の領域が '/dev/vda1' として確保されています。しかし、タイプが 'Linux ファイルシステム' となっていますので、上下キーで '/dev/vda1' を選択し、左右キーで下部の「タイプ」を選択して enter を押します。
f:id:hiro20180901:20220312210059p:plain:w800

パーティションタイプを選択 : 一番上の 'EFI システム' を選択します。
f:id:hiro20180901:20220312210140p:plain:w800

cfdisk 作成後 : 同じ手順で残りを全て 'Linux ファイルシステム' で作成しました。
f:id:hiro20180901:20220312210433p:plain:w800

現段階では重い処理をさせる予定はありませんので、swap は作成しませんでした。

この後、[書き込み] -> [終了] の順に選択して仮想 HDD に partition 情報を書き込みます。その後、Setup 初期画面に戻ります。

ここで、一旦 setup を終了して ESP 領域を format しました。

qemu-kvm Plamo installer bash :

# mkfs.vfat -F32 -s2 /dev/vda1

Plamo Linux 7.4では必要ないかも知れません。
第78回 Plamo LinuxのGPT/UEFI対応[その2]:玩式草子─ソフトウェアとたわむれる日々|gihyo.jp … 技術評論社

Setup 初期画面 で install 選択 : もう一度 setup を起動し、4番目の 'install' を選択して enter を押します。
f:id:hiro20180901:20220312210716p:plain:w800

installation menu : 先にも書きましたが英語配列なので KEYMAP の変更はなし、swap も使用しませんので ADDSWAP も選択しませんでした。
f:id:hiro20180901:20220312211806p:plain:w800

TARGET を選択 : 4番目の 'TARGET' を選択して enter を押します。
f:id:hiro20180901:20220312212054p:plain:w800

root partition の選択 : 表示されている中から '/dev/vda2' を選択します。
f:id:hiro20180901:20220312212140p:plain:w800

Format partition : 昔は HDD の check の為に 'Check' を選んでいましたが時間がかかり過ぎるので、今回は 'Format' を選択しました。
f:id:hiro20180901:20220312212229p:plain:w800

Select FS : ファイルシステムには ext4 を選択しました。拘りがあれば btrfs でも xfs でも良いと思います。
f:id:hiro20180901:20220312212322p:plain:w800

SOURCE の選択 : インストール元を選択します。
f:id:hiro20180901:20220312212538p:plain:w800

Select install media : 今回は ISO image から boot して RAM上で installer が起動している状態です。DVD-ROM は /dev/sr0 に接続されていますので、'DVD-ROM' を選択します。download した iso image は USB media 用ですが、qemu への接続は cdrom (iso) ですので DVD-ROM からで OK です。
f:id:hiro20180901:20220312212636p:plain:w800

Found DVD device : DVD-ROM が /dev/sr0 に見つかったというメッセージです。
f:id:hiro20180901:20220312212831p:plain:w800

Select install method : デフォルトディレクトリ(/cdrom/plamo) からインストールを選択します。
f:id:hiro20180901:20220312212937p:plain:w800

カテゴリ選択に進む? : 'はい' を選択します。
f:id:hiro20180901:20220312213041p:plain:w800

カテゴリ選択 : 上下キーで合わせてスペースキーでチェックを ON/OFF できます。
f:id:hiro20180901:20220312213129p:plain:w800

標準では minimum と devel と libs が check されていますが、最小構成という事で minimum のみを選択しました。実際には 00_base と 01_minimum が install されます。(これが原因で少し嵌ることに...)

インストールに進むかの確認 : 「はい」を選択します。
f:id:hiro20180901:20220312213344p:plain:w800

カテゴリ単位でパッケージを選択するか? : RECOM を選択し、カテゴリ単位で全てをインストールします。EXPERT で個々のパッケージを選択するのは Plamo のパッケージについての知識があれば良いですが、久し振りなので RECOM を選びました。
f:id:hiro20180901:20220312213433p:plain:w800

システム設定の説明 : 「はい」を選択します。
f:id:hiro20180901:20220312213600p:plain:w800

grub install : system boot に grub が必要ですので「はい」を選択します。
f:id:hiro20180901:20220312213700p:plain:w800

timezone : JST でよいので「はい」を選択します。
f:id:hiro20180901:20220312213734p:plain:w800

最終調整前のメッセージ : 確認して「了解」を選択します。
f:id:hiro20180901:20220312213809p:plain:w800

hostname : LAN 内なら標準でも良いかと思います。私は 'plamo' にしました。
f:id:hiro20180901:20220312213859p:plain:w800

network : LAN 内に dhcpd があれば 'DHCP' を選択します。
f:id:hiro20180901:20220312213934p:plain:w800

root の password の設定 : 画面がずれて表示されていますが、root 用の password を設定します。Plamo Linux では一般ユーザーは installer で作成されません。後で自分で作成します。
f:id:hiro20180901:20220312214013p:plain:w800

install 終了 :
f:id:hiro20180901:20220312214045p:plain:w800

再起動して、起動用の script で起動すれば Plamo Linux 7.4 が起動できました。

ちょっとした不具合と tips

Plamo Linux 7.4 を minimum のみで install する事を誰もやっていなかったのでしょうか、ちょっとした不具合がありました。また、他の distribution とは違い、初期の設定から自分で行わなければならないので、備忘録として残しておきます。

get_pkginfo が使えない

/usr/bin/get_pkginfo は python の script ですが、行頭で #!/usr/bin/python と version なしの python が指定されています。Plamo Linux の標準は Python3 で /usr/bin/python の link は python3 ですが、minimum には Python2 までしか含まれていないので、get_pkginfo が起動できませんでした。

iso image を /mnt に mount して、
qemu-kvm Plamo bash :

# installpkg /mnt/plamo/02_devel/Python-3.9.6-x86_64-B1.txz

と Python3 を install すれば解決しました。

これで、get_pkginfo で package を update する事ができました。

$ sudo get_pkginfo -a

installpkg で error message

installpkg command を実行すると以下の error が出ていました。
qemu-kvm Plamo bash :

# installpkg
processing [ kmod ] ...
mv: can't rename 'plamo-default.conf.dist': No such file or directory

installpkg command は shell script で、追っかけてみると /var/log/initpkg/kmod でこの error message が出ていました。

# cat /var/log/initpkg/kmod
#%% begin initialize
if [ ! -f /etc/modprobe.d/plamo-default.conf ]; then
  ( cd /etc/modprobe.d ; mv plamo-default.conf.dist plamo-default.conf )
fi
#%% end

/etc/modprobe.d/plamo-default.conf.dist が存在していなかった為に mv できない状態でした。module に関する設定は必要ないと思いますので、空ファイルを作成して回避しました。

# touch /etc/modprobe.d/plamo-default.conf

一般ユーザー登録

最近やってないので忘れていました。

# useradd -m hiro
# passwd hiro

'-m' option は home directory を作る option です。

sudo の設定

# visudo -f /etc/sudoers.d/hiro
$ sudo cat /etc/sudoers.d/hiro
hiro ALL=(ALL) ALL

wheel group に入れるのが通常の方法でしょうが、一人の環境なので簡単に済ませました。

最小構成で install した partition から tar ball を作成する

最小構成で install した Plamo Linuxget_pkginfo -a で最新版にした状態で、tar ball でまとめてみます。

qemu-kvm debianPlamo Linux root fs を mount

Plamo Linux を起動していない状態で tar ball を作成したいので、以前に install していた debian を利用します。

WSL2-distrod Ubuntu bash :

$ tree
.
├── install.sh
└── qemu_vm
    ├── debian
    │   ├── Debian11_UEFI.qcow2
    │   ├── Debian_UEFI_boot.sh
    │   ├── Debian_UEFI_install.sh
    │   └── OVMF_VARS.fd
    └── plamo
        ├── OVMF_VARS.fd
        └── PlamoLinux.qcow2

3 directories, 7 files

$ cd qemu_vm/debian
$ cat Debian_UEFI_boot.sh
kvm -m 8G -smp 4 \
  -drive if=pflash,format=raw,readonly=on,file=/usr/share/OVMF/OVMF_CODE.fd \
  -drive if=pflash,format=raw,file=OVMF_VARS.fd \
  -drive file=Debian11_UEFI.qcow2,if=virtio \
  -drive file=../plamo/PlamoLinux.qcow2,if=virtio \
  -net nic,model=virtio -net user,hostfwd=tcp::2222-:22 \
  -machine vmport=off \
  -vga qxl \
  -spice port=5900,disable-ticketing=on \
  -boot c \
  -monitor stdio
$ ./Debian_UEFI_boot.sh

起動した debianPlamo Linux の root fs を mount して tar ball を作成します。

qemu-kvm debian bash :

$ lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
fd0      2:0    1    4K  0 disk
vda    254:0    0   64G  0 disk
|-vda1 254:1    0  512M  0 part /boot/efi
|-vda2 254:2    0 62.5G  0 part /
`-vda3 254:3    0  976M  0 part [SWAP]
vdb    254:16   0   32G  0 disk
|-vdb1 254:17   0  256M  0 part
`-vdb2 254:18   0 31.7G  0 part

# /dev/vdb2 が Plamo Linux の root fs

$ sudo mount /dev/vdb2 /mnt
$ cd /mnt
$ sudo tar -Jcvf /home/hiro/plamo.tar.xz . 
$ ls -l ~/plamo*
-rw-r--r-- 1 root root 707745020 Mar 13 22:59 /home/hiro/plamo.tar.xz

tar ball を WSL2 へ import

出来た plamo.tar.xz を Windows 側に copy します。scp を使用しました。

cmd.exe :

C:\Users\hiro\Documents\WSL2_VMs>scp -P 2222 hiro@localhost:~/plamo.tar.xz .
hiro@localhost's password:
plamo.tar.xz                                                                          100%  675MB  18.7MB/s   00:36

tar.xz -> tar に解凍します。

WSL2-distrod Ubuntu bash :

$ cd /mnt/c/Users/hiro/Documents/WSL2_VMs
$ xz -dv ./plamo.tar.xz
./plamo.tar.xz (1/1)
  100 %     674.9 MiB / 2,033.3 MiB = 0.332    37 MiB/s       0:54
$ ls -l *tar
-rwxrwxrwx 1 root root 1359134720  3月  4 19:58 Ubuntu-20.04.tar
-rwxrwxrwx 1 root root 2132049920  3月 13 22:23 plamo.tar

解凍後の状態で WSL2 Ubuntu から export した Ubuntu-20.04.tar と比較すると、plamo.tar がかなり大きい状態でした。不要な package を削ればもっと小さくなると思います。

これを wsl -import で読み込めば WSL2 で Plano Linux が使用出来るようになります。

cmd.exe :

C:\Users\hiro\Documents\WSL2_VMs>mkdir PlamoLinux
C:\Users\hiro\Documents\WSL2_VMs>wsl --import PlamoLinux PlamoLinux plamo.tar

起動すると error が表示されます。が、WSL2 Plamo Linux は起動できました。
WSL2-distrod Plamo bash :

ファイル システムの 1 つをマウント中にエラーが発生しました。詳細については、「dmesg」を実行してください。
root@hiro-pc:/mnt/c/Users/hiro#

/etc/fstab から root filesystem 以外の行を消去すれば、この error は出なくなります。

これで Plamo Linux を WSL2 上で使用できるようになりました。get_pkginfo や installpkg も動作します。SystemV init は起動していませんので、/etc/init.d/ 以下の script を使用して daemon を起動できます。

WSL2-distrod Plamo bash :

$ sudo /etc/init.d/sshd start
  *   Starting SSH Server...                                                                                   [  OK  ]

これで実用上は問題なく使用できる事が確認できました。

distrobuilder を使用して tar ball を作成する

最小構成とはいえ、WSL2 には不要な kernel や module 等の package が含まれています。そこで、linuxcontainers.org の container image を作成する command である distrobuilder を使用して tar ball を作成し、WSL2 に import してみました。

gihyo.jp

上記を参考にしましたが、plamo 用の container を作成する部分には不具合がありましたので、修正しながら作業を進めました。

debian 仮想マシンの準備

先程使用した debian 仮想マシンを再利用しました。この debian の中に

を install します。
qemu-kvm debian bash :

$ sudo apt install debootstrap golang

distrobuilder の download, make

github から distrobuilder を download し make します。
qemu-kvm debian bash :

$ go get -v -x github.com/lxc/distrobuilder/distrobuilder

~/go 以下に芋蔓式に依存 package が download されます。

qemu-kvm debian bash :

$ tree -d -L 3 go/src
go/src
├── github.com
... 略 ...
│   ├── lxc
│   │   ├── distrobuilder
│   │   └── lxd
... 略 ...

実際の distrobuilder の source directory は ~/go/src/github.com/lxc/distrobuilder になります。その directory で make を実行します。
qemu-kvm debian bash :

$ cd go/src/github.com/lxc/distrobuilder
$ make
gofmt -s -w .
go install -v ./...
github.com/lxc/distrobuilder/sources
github.com/lxc/distrobuilder/distrobuilder
distrobuilder built successfully

~/go/bin に distrobuilder の実行ファイルが作成されます。

Ubuntu の container の作成

先ずは練習がてら ubuntu の lxc-container を作成してみます。container の作成条件の yaml ファイルは github から入手します。
qemu-kvm debian bash :

$ cd ~/go/bin
$ mkdir ubuntu-lxc
$ cd ubuntu-lxc
$ wget https://raw.githubusercontent.com/lxc/distrobuilder/master/doc/examples/ubuntu.yaml
$ sudo ../distrobuilder build-lxc ubuntu.yaml
...略...
$ LANG=C ls -l
total 101356
-rw-r--r-- 1 root root       768 Mar 23 21:00 meta.tar.xz
-rw-r--r-- 1 root root 103772540 Mar 23 21:00 rootfs.tar.xz
-rw-r--r-- 1 hiro hiro      6017 Mar 23 20:53 ubuntu.yaml

rootfs.tar.xz が root filesystem の archive になります。

Plamo Linux の container の作成

次に本題の Plamo Linux の lxc-container を作成します。distrobuilder では Plamo Linux の pkgtools8 package を /tmp 以下に展開して script 内部を書き換えて使用するので、debian 上でも Plamo Linux の container を作成する事が出来ます。

plamolinux-http.go への patch

plamolinux-http.go は distrobuilder 内部で Plamo Linux の package を download、install する部分です。distrobuilder/sources/ にあります。この directory には、distribution 毎の download、install する部分が保存されています。

以下の理由で plamolinux-http.go へ patch を当てます。

  • 00_base と 01_minimum の両方を install する
  • ignorePkgs を追加する
  • 01_minimum 内の network.txz directory 以下の package を処理すると、それ以降の 01_minimum 直下の package が処理されない (おそらく bug でしょう)

ignorePkgs は、本来なら container 作成条件の yaml ファイルで指定 (remove) できるはずなのですが、plamolinux.yaml に指定しても機能しませんでした(ubuntu.yaml では機能する)。その為、plamolinux-http.go を書き換える事にしました。emacs 類を含んでいるのは私が使用しない為です。

plamolinux-http.go.patch :

--- go/src/github.com/lxc/distrobuilder/sources/plamolinux-http.go.orig	2022-03-22 18:11:20.885034611 +0900
+++ go/src/github.com/lxc/distrobuilder/sources/plamolinux-http.go	2022-03-23 10:51:29.527234436 +0900
@@ -37,12 +37,11 @@
 		s.definition.Image.ArchitectureMapped, "plamo")
 
 	paths := []string{path.Join(mirrorPath, "00_base")}
+	paths = append(paths, path.Join(mirrorPath, "01_minimum"))
 	ignoredPkgs := []string{"alsa_utils", "grub", "kernel", "lilo", "linux_firmware", "microcode_ctl",
-		"linux_firmwares", "cpufreqd", "cpufrequtils", "gpm", "ntp", "kmod", "kmscon"}
-
-	if release < 7 {
-		paths = append(paths, path.Join(mirrorPath, "01_minimum"))
-	}
+		"linux_firmwares", "cpufreqd", "cpufrequtils", "gpm", "ntp", "kmod", "kmscon",
+		"kernel_211209", "kernel_220310", "microcode_intel", "emacs_mini", "emacs_lib", "emacs_bin",
+		"wireless_tools", "wpa_supplicant", "lm_sensors"}
 
 	var pkgDir string
 
@@ -170,7 +169,10 @@
 
 			u.Path = path.Join(u.Path, target)
 
-			return s.downloadFiles(def, u.String(), ignoredPkgs)
+			dir, err = s.downloadFiles(def, u.String(), ignoredPkgs)
+			if err != nil {
+				return "", fmt.Errorf("Failed to download packages: %w", err)
+			}
 		}
 	}

この patch を当てた上で distrobuilder を作り直します。作り直す方法はこのページ上部を参照ください。

plamo.yaml への patch

Plamo Linux 用の container 作成用 yamlgithub にあります。

$ wget https://raw.githubusercontent.com/lxc/lxc-ci/master/images/plamo.yaml

ubuntu の時とは異なり、この yaml ファイルをそのまま使用しただけでは Plamo Linux の container は作成できません。release を追加する必要があります。

plamo.yaml.patch :

--- go/bin/plamo-lxc/plamo.yaml.orig	2022-03-22 18:15:04.092814303 +0900
+++ go/bin/plamo-lxc/plamo.yaml	2022-03-22 20:40:18.814475183 +0900
@@ -1,5 +1,6 @@
 image:
   distribution: plamolinux
+  release: 7.x

 source:
   downloader: plamolinux-http

container の作成

これで Plamo Linux の container を作成する事が出来ます。patch を当てて distrobuilder を作り直してから、以下の command を実行します。

qemu-kvm debian bash :

$ cd ~/go/bin
$ mkdir plamo-lxc
$ cd plamo-lxc
$ wget https://raw.githubusercontent.com/lxc/lxc-ci/master/images/plamo.yaml
$ cat plamo.yaml.patch | patch
$ sudo ../distrobuilder build-lxc plamo.yaml
$ LANG=C ls -l
-rw-r--r-- 1 root root       828 Mar 23 10:43 meta.tar.xz
-rw-r--r-- 1 hiro hiro      9159 Mar 23 22:47 plamo.yaml
-rw-r--r-- 1 root root 190567464 Mar 23 10:43 rootfs.tar.xz

Plamo Linux の container を WSL2 へ import

出来た rootfs.tar.xz を WSL2 への import します。手順については上で書いた方法と同様です。

不具合への対処

幾つか不具合が残っていますので対処します。

/var/log/initpkg に script が残る

container 作成中に installpkg 内で doinst.sh は実行されているので残らないはずなのですが、/var/log/initpkg 以下に script が残っていました。
WSL-distrod Plamo bash :

# ( cd /var/log/initpkg && ls )
ca_certificate  dcron  hostapd  linux_pam  mdadm      pkgtools8  sudo
cracklib        glibc  iputils  logrotate  nfs_utils  rsyslog    tcpwrappers

それぞれ実行してから /var/log/scripts へ名前を変えて移動します。順番としては、

  1. glibc
  2. pkgtools8
  3. その他

特に pkgtools8 の script は installpkg 等の名称を変更するので必須です。

簡単な bash script で一括処理します。
do_initpkg.sh : WSL2-distrod Plamo bash で root で実行

#/bin/bash

INITPKGDIR="/var/log/initpkg"
SCRIPTDIR="/var/log/scripts"
ADDEXT="_2"

if [ -e $INITPKGDIR/glibc ]; then
        echo "sh $INITPKGDIR/glibc"
        sh $INITPKGDIR/glibc
        echo "mv $INITPKGDIR/glibc $SCRIPTDIR/glibc$ADDEXT"
        mv $INITPKGDIR/glibc $SCRIPTDIR/glibc$ADDEXT
fi

if [ -e $INITPKGDIR/pkgtools8 ]; then
        echo "sh $INITPKGDIR/pkgtools8"
        sh $INITPKGDIR/pkgtools8
        echo "mv $INITPKGDIR/pkgtools8 $SCRIPTDIR/pkgtools8$ADDEXT"
        mv $INITPKGDIR/pkgtools8 $SCRIPTDIR/pkgtools8$ADDEXT
fi

for INITFILE in `ls $INITPKGDIR`
do
        echo "sh $INITPKGDIR/$INITFILE"
        sh $INITPKGDIR/$INITFILE
        echo "mv $INITPKGDIR/$INITFILE $SCRIPTDIR/$INITFILE$ADDEXT"
        mv $INITPKGDIR/$INITFILE $SCRIPTDIR/$INITFILE$ADDEXT
done

get_pkginfo 用に Python3 の install

wget が使えますので、download して installpkg で install します。Plamo Linux の repository から download します。Python3 の Version は変わりますので注意が必要です。

WSL-distrod Plamo bash :

# wget https://repository.plamolinux.org/pub/linux/Plamo/Plamo-7.x/x86_64/plamo/02_devel/Python-3.9.12-x86_64-B1.tzst
# installpkg Python-3.9.12-x86_64-B1.tzst
Installing Python-3.9.12-x86_64-B1...
PACKAGE DESCRIPTION:
Executing install script of Python-3.9.12-x86_64-B1
/sbin/ldconfig: /usr/lib/wsl/lib/libcuda.so.1 is not a symbolic link

最後の ldconfig の message は WSL2 に関する事なので Plamo Linux とは無関係です。

get_pkginfo の除外 package の設定

distrobuilder の plamolinux-http.go の ignorePkgs に指定した package を get_pkginfo から除外するように設定します。/usr/share/doc/get_pkginfo-3.3/README.md.gz 内に記載がありますが、

  • ~/.pkginfo
  • /etc/pkginfo.conf

のどちらかに LOCALBLOCK と CATEGORY を追加します。

/etc/pkginfo.conf :

LOCALBLOCK = "alsa_utils grub kernel lilo linux_firmware microcode_ctl linux_firmwares cpufreqd cpufrequtils gpm ntp kmod kmscon kernel_211209 kernel_220310 microcode_intel emacs_mini emacs_lib emacs_bin wireless_tools wpa_supplicant lm_sensors"
CATEGORY = 00_base 01_minimum

これで、予め除外していた package が get_pkginfo で追加で install される事は無くなりました。

WSL2 へ Plamo Linux install 完了

distrobuilder を使用して、一部の不具合に対処する事により、

  • 00_base と 01_minimum + Python3
  • pkgtools8 が使える
  • get_pkginfo が使える

という状態の WSL2 Plamo Linux が使用できるようになりました。

cmd.com :

>dir *.tar
2022/03/13  23:06     2,131,886,080 plamo.tar
2022/03/23  10:56       800,563,200 plamo_distrobuilder.tar
2022/03/04  19:58     1,359,134,720 Ubuntu-20.04.tar

distrobuilder で作成した tar ball は、仮想マシンに最小構成で install した tar ball と比較して半分以下、WSL2 から export した Ubuntu と比較しても 6割程度の大きさでした。

まとめ

始めは distrod で install できる Plamo Linux の container が実用的ではない事を発端として始めましたが、distrobuilder の Plamo Linux の container 作成で嵌ってしまい時間を要してしまいました。

以下の2種類の方法で WSL2 上で Plamo を使用する事が出来ました。

  1. 仮想マシンPlamo Linux を最小 install し、別の 仮想マシン debian から rootfs を mount、tar ball を作成して WSL2 に import
  2. 仮想マシン debian に distrobuilder を install し、Plamo Linux の lxc-container を作成 (要 patch)、WSL2 に import

別の Linux 環境が必要ですが、2番目の方法の方が WSL2 に不要な package を install せずに済みますので、tar ball が小さく出来ます。

distrobuilder の patch について、私は golang については経験がありませんので正しい方法なのかどうか分かりませんが、とりあえず考えた通りに動作しています。container 作成条件の yaml ファイルの package remove が機能しなかった事については、原因を掴むことが出来なかったのは残念でした。

とはいえ、当初の目的通りに WSL2 で Plamo Linux を動作させる事が出来ました。参考になれば幸いです。