[Problem][Solved] Aporaudio 1.1.2 の OverlayFS のマウントエラーを解消する

# はじめに

**🕒 この記事を読むのに必要な時間 🕒**
全文：おおよそ5分〜10分

**📜 必要な知識 📜**
Linuxコマンドライン操作: 中級以上

**💻 実行環境 💻**
OS: Arch Linux x86_64
Kernel: 6.5.5-arch1-1
Terminal: xfce4-terminal


■ 修正改造 概要
===============

APoraudio はデフォルトで入っているモジュール数が多すぎて Extern ディレクトリに追加モジュールが増やせない。マウント時にエラーになってしまう。(以下の記事を事前に参照すべし)

:::note info
**【参考】**[Linux ディストリビューション APoraudio を試してみた #LiveUSB - Qiita](https://qiita.com/9hnder/items/14aef01d593d5ada7cb5#-overlayfs-%E3%83%9E%E3%82%A6%E3%83%B3%E3%83%88%E3%81%AE%E3%82%A8%E3%83%A9%E3%83%BC)
:::

そこで /mnt/sdb1/porteus/modules/aporaudio ディレクトリの中身を全て解凍 → 1つのファイルにまとめることでモジュール数を大幅に削減した。
その時の方法を記しておく。


■ 準備
=======

:::note warn
**【注意】**
筆者は本記事の作業を使い慣れた Arch Linux 上で行った。
もし APoraudio 上で行う場合は以下の準備は必要ない。最初から全て含まれるためだ。他の環境から調整する場合には必要となる。
:::

事前に APoraudio のファイルの中から xzm 形式のファイルをいじるためのツールを抜き出してくる。具体的には一覧表示用の lsxzm, 圧縮用の mkXZM を抽出しておく。

	/mnt/sdb1/porteus/base/001-z.core.xzm  の中の、
	/usr/local/bin/lsxzm

	/mnt/sdb1/porteus/base/002-z.xorg.xzm  の中の、
	/usr/local/share/spm/bin/mkXZM

これらはシェルスクリプトなので Linux ならおそらくどれでも使えるだろう。ただし、xzm 形式のベースである Squash ファイルシステムを マウント/アンマウントできるコマンドを含んだパッケージは必要である。（Arch Linux では squashfs-tools パッケージ）事前にパッケージマネージャーでインストールしておこう。

抽出には unsquashfs コマンドを使う。

```console
	$ mount -o uid=$USER,gid=`id -g $USER` /dev/sdb1 /mnt/sdb1
	$ cd /mnt/sdb1/porteus/base
	$ unsquashfs 001-z.core.xzm /usr/local/bin/lsxzm
	$ unsquashfs 002-z.xorg.xzm /usr/local/share/spm/bin/mkXZM
```

これらはパスの入っている場所に置いておくと良い。
筆者は ~/bin/ に置いたが、/usr/local/bin でもいいし ~/.local/bin とかでもいい。

```console
	$ mv squashfs-root/usr/local/bin/lsxzm  ~/bin/
	$ mv squashfs-root/usr/local/share/spm/bin/mkXZM  ~/bin
	$ rm -R squashfs-root
	$ chmod 755 ~/bin/lsxzm ~/bin/mkXZM
	$ hash -r
```


:::note info
**【後日追記】**
後から気づいたが、 unsquashfs コマンドの -l や -ll オプションで普通に ls コマンドの結果のようなリストが見れるので lsxzm については入れなくてもいい。
:::



■ 改造元ファイル
=================

:::note info
**【備考】**
ISO に入っているわけだし、/var/log/packages/＜パッケージ名＞ にファイルのリストは一応あるので、この工程は面倒なら飛ばしてしまってもよい。
:::


1 つのファイルにまとめると、元の パッケージ名 と ファイル名 の関連性が失われてしまう気がした。そこで筆者は元のファイル名については、以下のようにしてリストを作成しておいた。


```console
	$ cd /mnt/sdb1/porteus/modules
	$ find aporaudio/ -name '*.xzm' | xargs -t -n 1 ~/bin/lsxzm 2>&1 | sed -e 's|/home/$USER/bin/|----> |' -e '/^$/d' | gzip -c >aporaudio_all.lst.gz
```

これで作成された aporaudio_all.lst.gz には以下のような形で保存されている。

	----> ＜パッケージ名1＞
	ファイル名1
	ディレクトリ名1/ファイル名1
	...

	----> ＜パッケージ名n＞
	ファイル名n
	ディレクトリ名n/ファイル名n
	...

以下のコマンドで閲覧可能。

```console
	$ zcat aporaudio_all.lst.gz | less
```

■ 改造実行
===========

以下のコマンドで xzm ファイルを解凍する。

```console
	$ su -
	password:
	# mkdir tmp && cd tmp
	# find /mnt/sdb1/porteus/modules/aporaudio/ -name '*.xzm' | xargs -tn 1 unsquashfs -f
	# ls
	squashfs-root
	# du -sh squashfs-root/
	527M	squashfs-root/
```

そしてデフォルトの名前から aporaudio へリネームしておく。

```console
	# mv squashfs-root aporaudio
```

これを再度圧縮する。
これには一般ユーザーのときに *$USER*/bin/ ディレクトリに置いておいた mkXZM コマンドを使った。 root で作っているのでなければ、 *$USER* の部分は適宜自分のユーザー名に置き換えたり、またはパス自体を /usr/local/bin などに変えているならパスを読み替えるなどすること。

```console
	# /home/$USER/bin/mkXZM aporaudio
	Parallel mksquashfs: Using 4 processors
	Creating 4.0 filesystem on aporaudio.xzm, block size 262144.
	[=======================================================/] 21518/21518 100%

	Exportable Squashfs 4.0 filesystem, zstd compressed, data block size 262144
		compressed data, compressed metadata, compressed fragments,
		compressed xattrs, compressed ids
		duplicates are removed
	Filesystem size 140849.38 Kbytes (137.55 Mbytes)
		28.93% of uncompressed filesystem size (486829.67 Kbytes)
	Inode table size 370860 bytes (362.17 Kbytes)
		19.35% of uncompressed inode table size (1916821 bytes)
	Directory table size 439075 bytes (428.78 Kbytes)
		35.61% of uncompressed directory table size (1233153 bytes)
	Number of duplicate files found 2587
	Number of inodes 43836
	Number of files 20408
	Number of fragments 695
	Number of symbolic links 22089
	Number of device nodes 1
	Number of fifo nodes 3
	Number of socket nodes 0
	Number of directories 1335
	Number of hard-links 1
	Number of ids (unique uids + gids) 6
	Number of uids 4
		root (0)
		ken (1001)
		unknown (124)
		unknown (45)
	Number of gids 6
		root (0)
		unknown (1001)
		polkitd (102)
		unknown (124)
		unknown (45)
		unknown (92)
	# ls -l
	total 138M
	drwxr-xr-x 10 root root 4.0K Nov 27  2022 aporaudio/
	-rw-r--r--  1 root root 138M Apr 13 23:59 aporaudio.xzm
	#
```

あとは aporaudio ディレクトリを全て削除して、 aporaudio.xzm を代わりに sdb1 に移しておく。
だが、その前に念の為、元のファイル群をバックアップしておく。
ここでは /mnt/sdb1/#backup/ へ置いておいた。

```console
	# cp -r /mnt/sdb1/porteus/modules/aporaudio /mnt/sdb1/#backup/
```

:::note info
**【備考】**
ISO に入っているわけだし、この工程は面倒なら飛ばしてしまってもよい。
:::


それでは差し替え実行。

```console
	# rm -Rf /mnt/sdb1/porteus/modules/aporaudio
	# cp aporaudio.xzm /mnt/sdb1/porteus/modules/
	# ll /mnt/sdb1/porteus/modules/aporaudio.xzm
	-rwxr-xr-x 1 root root 138M Apr 13 23:59 /mnt/sdb1/porteus/modules/aporaudio.xzm
	#
```

これで再起動してみたが、うまくいった。
ちゃんと読み込まれるし、 Extern ディレクトリに入れたモジュールについても狙い通りに動作するようになった。…もちろん、入れすぎて名前が長くなるとまた同じエラーとなってしまうのだが。


以上。