Mac で Linux のディスクの中身にアクセスする方法 (ただしリードオンリー)
はじめに
Raspberry Pi 4 に Ubuntu を入れて遊んでいたのですが、操作を誤って OS が起動不能に。再インストールする前に、ディスク内のデータのバックアップを取ろうと思い、SD カードを Mac に接続したのですが、マウントすることができませんでした。
$ diskutil list
# /dev/disk0 と /dev/disk1 は macOS のものなので省略
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *63.9 GB disk2
1: Windows_FAT_32 system-boot 268.4 MB disk2s1
2: Linux 63.6 GB disk2s2
# /dev/disk2s2 が Linux のディスクということがわかったが、マウントできず...
$ diskutil mount /dev/disk2s2
Volume on disk2s2 failed to mount
Perhaps the operation is not supported (kDAReturnUnsupported)
If you think the volume is supported but damaged, try the "readOnly" option
SD カードを接続した際に自動的に /dev/disk2s1
がマウントされるのですが、これはシステムブートなので Linux の中身ではありません。
調べてみると、どうやら macOS では Linux のファイルシステムである ext4 をサポートしていないようです。ext4 をマウントできるようにするためには ex4fuse
と呼ばれるツールが必要のようなので、今回はそれのインストール方法と使い方を紹介します。
環境
- macOS Big Sur 11.1
- Ubuntu Desktop 20.10 (今回検証した SD カード内の Linux ディスクの OS)
インストール
$ brew install --cask osxfuse
$ brew install ext4fuse
インストールに失敗する場合はアプリケーションを許可する必要があります。「システム環境設定」 > 「セキュリティとプライバシー」 > 「一般」 > 「ダウンロードしたアプリケーションの実行許可」の項目に許可されていない項目が出てきたら許可します。許可するためには事前に左下の南京錠をクリックする必要があります。
許可したあとは再起動を求められるので再起動します。
使い方
まずはマウント先のディレクトリを作っておきます。以下の例では ~/raspberrypi4
をマウント先としています。
$ mkdir ~/raspberrypi4
:warning: マウント先としてホームディレクトリやデスクトップなど、macOS にもともと存在するコアなディレクトリを指定するのは推奨されません。アンマウントするまでもともとのディレクトリにアクセスできなくなるためです。
次にマウント対象のディスクを見つけます。
$ diskutil list
# /dev/disk0 と /dev/disk1 は macOS のものなので省略
/dev/disk2 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: FDisk_partition_scheme *63.9 GB disk2
1: Windows_FAT_32 system-boot 268.4 MB disk2s1
2: Linux 63.6 GB disk2s2
いくつか表示されると思いますが、どれが Ubuntu (Linux) がインストールされている SD カード (あるいは USB メモリーなど) のものなのかはなんとなく勘でわかると思います。自分の環境では /dev/disk2
が SD カードのディスクでした。
その中の、TYPE
が Linux
になっているものを見つけます。上記の場合だと一番下の disk2s2
が該当します。なのでマウント対象のディスクは /dev/disk2s2
であることがわかりました。
マウント対象のディスクがわかったら、以下のコマンドを実行します。なお、ここでも許可を求められることがありますので、その場合は「システム環境設定」 > 「セキュリティとプライバシー」 > 「一般」 > 「ダウンロードしたアプリケーションの実行許可」の項目から許可をします。
$ sudo ext4fuse /dev/disk2s2 ~/raspberrypi4 -o allow_other
/dev/disk2s2
はマウント対象のディスク、~/raspberrypi4
は先ほど作成した空のディレクトリを指定します。
これで ~/raspberrypi4
の中身が Linux の中身になっていると思います。
$ ls ~/raspberrypi4
bin boot dev etc home lib lost+found media mnt opt proc root run sbin snap srv swapfile sys tmp usr var
アンマウント
umount
コマンドでアンマウントできます。アンマウントすると ~/raspberrypi4
は空のディレクトリに戻ります。
$ sudo umount ~/raspberrypi4
欠点
この方法なら無料で Linux のディスクをマウントすることができますが、リードオンリーである という点に注意してください。つまりマウントしたディスクの中身のファイルを編集したりすることはできません。
編集などもしたい場合は extFS for Mac by Paragon Software という GUI アプリがありますが、こちらは有料です。どうしても Mac で Linux のファイルの中身を編集したい場合はこちらを検討する必要がありますが、そこまでするなら別の Linux 環境でマウントしたほうが良さそうですね (当然、Linux なら Linux のディスクをマウントすることができるので)。
おまけ: ディスク丸ごとコピーしたい場合
SD カード内のディスクを丸ごとコピーしたい場合は dd
コマンドが使えます。
$ sudo dd if=/dev/rdisk2 of=~/raspberrypi4.img
if=
には diskutil list
の SD カードのディスクを指定します。/dev/disk2
が SD カード (あるいは USB メモリーなど) だった場合、/dev/disk2
の代わりに /dev/rdisk2
を指定すると高速になるそうです。
of=
には書き出し先のパスを指定します。上記の例では ~/raspberrypi4.img
に書き出すようにしています。
ただし、以下の 2 点に注意してください。
- ディスク丸ごとコピーするので Mac の容量が圧迫される
- めちゃくちゃ時間がかかる
64 GB の SD カードの中身を丸ごとコピーしたら、同然 Mac の容量を 64 GB 消費します。また、64 GB の SD カードの中身を丸ごとコピーするのにかかった時間 (上記の dd
コマンドの実行時間) は 8 時間 27 分 54 秒 でした。
そのため、一部のファイルのみをバックアップしたり取り出したりしたい場合は、この記事で紹介したようにマウントして取り出したほうが無難です。
Discussion