1001001

73。CTFのWrite-upや技術的な備忘録を書きとめたいです。

EXT4でフォーマットされた外付けHDDをMacにマウントする

備忘録として残す.

経緯

Raspberry Pi 4のRasbian上で,2TBの外付けHDDをマウントして使っていた.マウントしたディレクトリに対してsmbでアクセス可能にして使っていた.

転居後しばらく起動していなかったラズパイの電源を久々に入れたら起動せず,HDDにアクセスできなくなっていた.

また,EXT4でフォーマットしているため通常のWindowsMacではマウントできなかった.中身が無事かどうかいち早く確認したかったので,とりあえず手持ちのMBPでマウントする方法を試すことにした.

環境

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-ext2EXT4でフォーマットされた外付け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が出てきた.

macos - Installation issue "ext4fuse:Linux is required for this software." on Mac OS Mojave - Ask Different

どうやら,特定のビルド(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でのインストールに失敗していたのかもしれない.

だが,前述の通りマウントは成功しているので良しとする.

まとめ

EXT4でフォーマットされた外付けHDDをMacにマウントする方法を調べ,成功した手順をメモした.

教訓

  • ext4fuseでInput/Outputエラーが出る場合はfuse-ext2を使おう
  • ラズパイはちゃんとメンテしよう
  • macはちゃんとアップデートしよう