Open9
M1 macでext4なディスクを読み取りたい

RaspberryPi4 で使用していたディスクに置いてあるファイルにアクセスしたいタイミングが出来たため、どうにかしてアクセスできないか調べてみた
環境
Apple M1 14.4.1

実際に以下のコマンドでビルドを実施してみた
brew install macos-fuse-t/homebrew-cask/fuse-t
git clone https://github.com/macos-fuse-t/ext4fuse.git
cd ext4fuse
make
そうすると
cc -I/usr/local/include/fuse -DFUSE_USE_VERSION=26 -std=gnu99 -g3 -Wall -Wextra -DEXT4FUSE_VERSION=\"ext4fuse\" -mmacosx-version-min=10.5 -D_FILE_OFFSET_BITS=64 -c -o fuse-main.o fuse-main.c
fuse-main.c:14:10: fatal error: 'fuse.h' file not found
#include <fuse.h>
^~~~~~~~
1 error generated.
gmake: *** [<builtin>: fuse-main.o] Error 1
どうも brew でインストール済みの fuse-t が提供する header ファイルが見つからないようだ

どこにインストールされているのかわからなかったので、以下のコマンドで fuse-t のパッケージを見てみる
pkgutil --payload-files /opt/homebrew/Caskroom/fuse-t/1.0.36/fuse-t-macos-installer-1.0.36.pkg
すると
.
./Library
./Library/Application Support
./Library/Application Support/fuse-t
./Library/Application Support/fuse-t/pkgconfig
./Library/Application Support/fuse-t/pkgconfig/fuse-t.pc
./Library/Application Support/fuse-t/bin
./Library/Application Support/fuse-t/bin/go-nfsv4-1.0.36
./Library/Application Support/fuse-t/bin/go-nfsv4
./Library/Application Support/fuse-t/uninstall.sh
./Library/Application Support/fuse-t/include
./Library/Application Support/fuse-t/include/fuse
./Library/Application Support/fuse-t/include/fuse/fuse_lowlevel.h
./Library/Application Support/fuse-t/include/fuse/._fuse_lowlevel.h
./Library/Application Support/fuse-t/include/fuse/fuse_common_compat.h
./Library/Application Support/fuse-t/include/fuse/._fuse_common_compat.h
./Library/Application Support/fuse-t/include/fuse/fuse.h
./Library/Application Support/fuse-t/include/fuse/fuse_common.h
./Library/Application Support/fuse-t/include/fuse/._fuse_common.h
./Library/Application Support/fuse-t/include/fuse/fuse_lowlevel_compat.h
./Library/Application Support/fuse-t/include/fuse/._fuse_lowlevel_compat.h
./Library/Application Support/fuse-t/include/fuse/fuse_compat.h
./Library/Application Support/fuse-t/include/fuse/._fuse_compat.h
./Library/Application Support/fuse-t/include/fuse/fuse_opt.h
./Library/Application Support/fuse-t/cfg
./Library/Application Support/fuse-t/cfg/fuse-t.ini
./Library/Application Support/fuse-t/lib
./Library/Application Support/fuse-t/lib/libfuse-t-1.0.36.dylib
./Library/Application Support/fuse-t/lib/libfuse-t-1.0.36.a
./Library/Application Support/fuse-t/lib/._libfuse-t-1.0.36.a
./Library/Application Support/fuse-t/LICENSE.rtf
./Library/Frameworks
./Library/Frameworks/fuse_t.framework
./Library/Frameworks/fuse_t.framework/fuse_t
./Library/Frameworks/fuse_t.framework/PrivateHeaders
./Library/Frameworks/fuse_t.framework/Resources
./Library/Frameworks/fuse_t.framework/Versions
./Library/Frameworks/fuse_t.framework/Versions/A
./Library/Frameworks/fuse_t.framework/Versions/A/_CodeSignature
./Library/Frameworks/fuse_t.framework/Versions/A/_CodeSignature/CodeResources
./Library/Frameworks/fuse_t.framework/Versions/A/fuse_t
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_lowlevel.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/config.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_common_compat.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_misc.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_i.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_common.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_lowlevel_compat.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_kernel.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_compat.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/cuse_lowlevel.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_opt.h
./Library/Frameworks/fuse_t.framework/Versions/A/PrivateHeaders/fuse_darwin_private.h
./Library/Frameworks/fuse_t.framework/Versions/A/Resources
./Library/Frameworks/fuse_t.framework/Versions/A/Resources/go-nfsv4
./Library/Frameworks/fuse_t.framework/Versions/A/Resources/Info.plist
./Library/Frameworks/fuse_t.framework/Versions/A/Headers
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse_lowlevel.h
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse_common_compat.h
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse.h
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse_t.h
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse_common.h
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse_lowlevel_compat.h
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse_compat.h
./Library/Frameworks/fuse_t.framework/Versions/A/Headers/fuse_opt.h
./Library/Frameworks/fuse_t.framework/Versions/A/Modules
./Library/Frameworks/fuse_t.framework/Versions/A/Modules/module.modulemap
./Library/Frameworks/fuse_t.framework/Versions/Current
./Library/Frameworks/fuse_t.framework/Headers
./Library/Frameworks/fuse_t.framework/Modules
どうも /Library/Application Support/fuse-t/include/fuse
以下に目的のファイルが含まれていそうだ

ビルド時にそのパスを見てくれればいいので、make ファイルを以下のように書き換える
- CFLAGS += -mmacosx-version-min=10.5
+ CFLAGS += -mmacosx-version-min=10.5 -I/Library/Application\ Support/fuse-t/include/fuse
この状態で再度
make
を実行すると、無事 ext4fuse
がビルドされた

後は
diskutil list
でマウントしたいディスクを探す
/dev/disk6 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *10.0 TB disk6
1: Microsoft Basic Data 10.0 TB disk6s1
これで disk6s1
が対象とわかった
適当にマウントポイントを
mkdir ~/ext4_mount
で生やしてしまって
sudo ./ext4fuse /dev/disk6s1 ~/ext4_mount -o allow_other
で mount したら中身が見れた

見終わったので
sudo umount ~/ext4_mount
でアンマウントしてさようなら、良かった

pkgutil
のオプションは
この記事がわかりやすかった、感謝

バージョン上がって 1.0.38 が降ってきたので、brew upgrade した
そうしたら
==> Running uninstall script /Library/Application Support/fuse-t/uninstall.sh
Password:
Welcome to fuse-t Uninstaller
The following packages will be REMOVED:
fuse-t-1.0.36
Application uninstalling process started
[1/5] [DONE] Successfully deleted shortcut links
[2/5] [DONE] Successfully deleted package info
[3/5] [ERROR] Could not delete fuse headers (another fuse pkg exists?)
[4/5] [DONE] Successfully deleted shared libraries
[5/5] [DONE] Successfully deleted fuse-t
fuse-t uninstall process finished
って感じで、header ファイル類の削除に失敗してた
該当の Uninstaller を見てみると
#remove fuse headers and library
[ -e "/usr/local/include/fuse" ] && rm "/usr/local/include/fuse"
if [ $? -eq 0 ]
then
echo "[3/5] [DONE] Successfully deleted fuse headers"
else
echo "[3/5] [ERROR] Could not delete fuse headers (another fuse pkg exists?)" >&2
fi
Makefile と同様に決め打ちされてるパスが違う…
とはいえ失敗しても無視して進んでくれてるし、アップデート出来てるし一旦無視するか