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

でアンマウントしてさようなら、良かった

ちゅうこちゅうこ

バージョン上がって 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 と同様に決め打ちされてるパスが違う…
とはいえ失敗しても無視して進んでくれてるし、アップデート出来てるし一旦無視するか