備忘録として残す.
経緯
Raspberry Pi 4のRasbian上で,2TBの外付けHDDをマウントして使っていた.マウントしたディレクトリに対してsmbでアクセス可能にして使っていた.
転居後しばらく起動していなかったラズパイの電源を久々に入れたら起動せず,HDDにアクセスできなくなっていた.
また,EXT4でフォーマットしているため通常のWindowsやMacではマウントできなかった.中身が無事かどうかいち早く確認したかったので,とりあえず手持ちのMBPでマウントする方法を試すことにした.
環境
- OS: macOS Big Sur 11.7.1(20G918)
- PC: MacBook Pro (13-inch, 2017, Two Thunderbolt 3 ports)
intel macです.
この項を書こうとして気づいたが,MacのOSもクソ古かった.(これも最近あまり使っていないものを引き出したので...)
バージョン上げれば解決した問題もあるかもしれない.
前提
Macに外付けHDDを接続すると、「このコンピュータでは読み取れないディスクです」という旨のポップアップが表示され,外付けHDDの中身をFinderで表示できない.(= マウントできない.)
これは,外付けHDDがMacがデフォルトで利用できるファイルシステムを利用していないことを意味している.そして今回この外付けHDDはEXT4という形式でフォーマットされており,デフォルトのMacではマウントできない.
しかし,以下のコマンドを叩くことで,どのような外付けHDDが接続されているのかは確認できる.
以下で確認できる/dev/disk2 が,今回マウントしたい外付けHDD.Macに外付けHDDをUSBケーブルで接続した状態でコマンドを叩いている.
diskutil list ✘ 1 /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *500.3 GB disk0 1: EFI EFI 314.6 MB disk0s1 2: Apple_APFS Container disk1 500.0 GB disk0s2 /dev/disk1 (synthesized): #: TYPE NAME SIZE IDENTIFIER 0: APFS Container Scheme - +500.0 GB disk1 Physical Store disk0s2 1: APFS Volume Macintosh HD - Data 424.7 GB disk1s1 2: APFS Volume Preboot 392.5 MB disk1s2 3: APFS Volume Recovery 620.2 MB disk1s3 4: APFS Volume VM 1.1 GB disk1s4 5: APFS Volume Macintosh HD 20.6 GB disk1s5 6: APFS Snapshot com.apple.os.update-... 20.6 GB disk1s5s1 /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *2.0 TB disk2 1: Linux Filesystem 2.0 TB disk2s1
マウントはできないがきちんと認識はできていることは確認できたので,ここからEXT4をマウントできるようにしていく.
fuse-ext2でEXT4でフォーマットされた外付けHDDをMacにマウントする
最終的に成功した方法はfuse-ext2を使う方法.インストールからマウントまでの手順を示す.
ビルドに必要なツール(の中でも後述手順で入らないもの)を事前にインストール.
xcode-select --install
brew instal automake
以下のスクリプトをscript.shとして任意のディレクトリに保存.
#!/bin/sh export PATH=/opt/gnu/bin:$PATH export PKG_CONFIG_PATH=/opt/gnu/lib/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH mkdir fuse-ext2.build cd fuse-ext2.build if [ ! -d fuse-ext2 ]; then git clone https://github.com/alperakcan/fuse-ext2.git fi # m4 if [ ! -f m4-1.4.17.tar.gz ]; then curl -O -L http://ftp.gnu.org/gnu/m4/m4-1.4.17.tar.gz fi tar -zxvf m4-1.4.17.tar.gz cd m4-1.4.17 ./configure --prefix=/opt/gnu make -j 16 sudo make install cd ../ # autoconf if [ ! -f autoconf-2.69.tar.gz ]; then curl -O -L http://ftp.gnu.org/gnu/autoconf/autoconf-2.69.tar.gz fi tar -zxvf autoconf-2.69.tar.gz cd autoconf-2.69 ./configure --prefix=/opt/gnu make sudo make install cd ../ # automake if [ ! -f automake-1.15.tar.gz ]; then curl -O -L http://ftp.gnu.org/gnu/automake/automake-1.15.tar.gz fi tar -zxvf automake-1.15.tar.gz cd automake-1.15 ./configure --prefix=/opt/gnu make sudo make install cd ../ # libtool if [ ! -f libtool-2.4.6.tar.gz ]; then curl -O -L http://ftpmirror.gnu.org/libtool/libtool-2.4.6.tar.gz fi tar -zxvf libtool-2.4.6.tar.gz cd libtool-2.4.6 ./configure --prefix=/opt/gnu make sudo make install cd ../ # e2fsprogs if [ ! -f e2fsprogs-1.43.4.tar.gz ]; then curl -O -L https://www.kernel.org/pub/linux/kernel/people/tytso/e2fsprogs/v1.43.4/e2fsprogs-1.43.4.tar.gz fi tar -zxvf e2fsprogs-1.43.4.tar.gz cd e2fsprogs-1.43.4 ./configure --prefix=/opt/gnu --disable-nls make sudo make install sudo make install-libs sudo cp /opt/gnu/lib/pkgconfig/* /usr/local/lib/pkgconfig cd ../ # fuse-ext2 export PATH=/opt/gnu/bin:$PATH export PKG_CONFIG_PATH=/opt/gnu/lib/pkgconfig:/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH cd fuse-ext2 ./autogen.sh CFLAGS="-idirafter/opt/gnu/include -idirafter/usr/local/include/osxfuse/" LDFLAGS="-L/opt/gnu/lib -L/usr/local/lib" ./configure make sudo make install
スクリプトの実行.
./script.sh
マウント.script.shの横に作られるビルドのためのフォルダの中に作られるfuse-ext2を直接叩く形で実行.
- allow_other: 非root以外の誰でもアクセス可能
- rw+: 読み書きの権限を付与
cd fuse-ext2.build/fuse-ext2/fuse-ext2 mkdir ~/ext4_mount sudo ./fuse-ext2 /dev/disk2s1 ~/ext4_mount -o allow_other,rw+
この時,Macのセキュリティ機構に一度ブロックされるので,それを許可する.許可をした場合,反映のために再起動が必要となる.
再起動後に同じコマンドを打つとマウントが成功する.これでext4_mountというフォルダに,外付けHDDの中身がマウントされ,Finderなどで中身を見られるようになる.
成功するまでの試行錯誤
最終的な解決策に行き着くまでに発生したエラーなどを詳細に記載する.
(なお,その場ですべてメモしたわけではないので,エラー文などが多少変わってしまっているかもしれない.)
はじめはext4fuseというツールでマウントを試みたのだがこれが使えず,fuse-ext2をインストールして利用するまでの試行錯誤である.
エラー1: brew caskのエラー
念のため記載しておく.
ext4fuseのREADMEでは未だにbrew cask installが使われているが,今はbrew install --cask というオプションになっているので適宜読み替える.
エラー2: ext4fuseをbrewで入れようとしてエラー
以下のようなエラーが出る.
Error: ext4fuse: Unsatisfied requirements failed this build.'
調べると以下のstackexchangeのQAが出てきた.
どうやら,特定のビルド(OSバージョン)によってはbrewでインストールできないっぽいので,ソースコードからビルドした方が良いと言っている.
基本的にこの通りやればインストールまではできる.マウントも一瞬成功したように見える.
なお,成功した手順でも記載した通り,マウントするコマンドを打ったあとはMacのセキュリティ機能により一度ブロックされるので,許可->再起動が必要になるのはこのツールも変わらない.
エラー3: ext4fuseでマウントしようとしてInput/Outputエラー
ext4fuseを実行してマウントするところまでは良いのだが,いざマウントしたフォルダにアクセスしようとするとInput/Output errorsが出る.自分の場合は,ターミナルでマウント先のフォルダが存在するはずのディレクトリにcdしたときに,そのエラーがターミナル上に表示された.
先程の記事をよく見ると,「ext4fuseだとInput/Output errorsが出るからfuse-ext2使った」というのが書いてあったので,ここでfuse-ext2を利用する方針に切り替えた.
エラー4: fuse-ext2のscript.shで75行目で./configureできない等のエラー
そもそもconfigureなど必要なファイルが生成されてなくて,ファイルが存在しない的なエラーが多発する.
少し前の出力を見ると以下のようなエラーがある.
Can't exec "aclocal": No such file or directory
調べると,automakeパッケージに含まれるものらしく,どうやらautomakeのインストールが上手く行ってないらしい.script.shの中で入るはずなのだが.
Can't exec "aclocal": No such file or directoryの対処法 #MacOSX - Qiita
なので,automakeは手動で入れることにした.
brew install automake
これでscript.shを実行すれば,fuse-ext2がビルドされるところまではいける.
ただ,make installに失敗しているのか,コマンドへのパスは通っていないので,自分はfuse-ext2があるフォルダに移動し,直接バイナリを叩くことにした.もしかしたらautoconfとか諸々,script.shでのインストールに失敗していたのかもしれない.
だが,前述の通りマウントは成功しているので良しとする.