130

Is there a safe, stable application for reading from and writing to ext4 file systems on Mac OS X?

If not, what's the best way to access the contents of an ext4 file system on Mac OS X?

  • It would be more than helpful if you specified what version of OS X you are running. There are compatibility issues with the solutions available depending on OS revision. – kopischke Nov 1 '11 at 8:30

10 Answers 10

60

The answer depends on you willingness to invest in commercial software:

If you don’t mind spending some money on a commercial product, Paragon’s extFS for Mac will give you read and write access to ext2 / ext3 / ext4 file systems. The current version supports all versions of OS X / macOS from 10.10 upwards.

If you are looking for a free solution, you can setup a Linux virtual machine, mount your volume(s) there and share it / them via Samba or (S)FTP. This post has some details on how to achieve this using VirtualBox, a free virtual machine application. Note this is not exactly a lightweight solution, even if using a prebuilt VirtualBox VM will spare you installing and configuring a Linux distro from scratch.

  • 2
    Surely there's a free nonvm solution? – Pacerier Nov 21 '17 at 16:40
  • osboxes.org provides newer versions vs virtualboxes.org. – Tim Dec 14 '18 at 18:30
36

Building on Ken's answer: I used fuse4x and fuse-ext2 successfully, and I recommend fuse-ext2 over ext4fuse.

ext4fuse was a hassle for me, because it requires manual compilation and has no support for fuse4x options that would allow me to set access control. fuse-ext2 provides downloadable packages, and the 0.0.7 version worked just fine. I copied a few large ISOs over without any problem.

  • can fuse-ext2 mount things as writable or only readonly? – knocte Apr 16 at 11:15
25

One can also install OSXFUSE completely via the brew command line package manager:

brew install homebrew/fuse/ext4fuse

Note that the installation tells certain commands need to be run as 'sudo' in addition to this.


With Yosemite better have a look at this. And then make sure the directory is readable by your user by doing this. For it to work I had to use the wheel group like this:

sudo dscl . append /Groups/wheel GroupMembership $(whoami)
18

With recent changes to homebrew, this should be as simple as:

brew cask install osxfuse
brew install ext4fuse

You may have to reboot.

ext4fuse is read-only, unfortunately. And you may need to use a flag to get it to work as a normal user.

Others viewing this question may be interested in libguestfs. I'm not aware of an OS X port, but considering that VirtualBox has an API, it's not out of the question.

I wonder why no one has written a compatibility layer to allow Linux kernel filesystem code to run in userspace/fuse. Or has someone?

10

If you're wondering what the command line is to mount an ext4 partition using fuse and ext2fuse (e.g. when installed using MacPorts port install ext2fuse) - then firstly you need to work out where the Linux partition is:

diskutil list

This will list all partitions for all disks and amongst them you should see the relevant ones listed under the TYPE column as Linux. Combine the diskX and partition number Y like this /dev/diskXsY - e.g:

mount -t fuse-ext2 /dev/disk1s2 ~/my_mount_point

It may complain about not being able to write to the log file but it should still mount the partition into your home mount point. But if you want to mount the partition into a system directory then you need to run it as root e.g:

sudo mount -t fuse-ext2 /dev/disk1s2 /sys_mount_point

If that doesn't work try:

sudo ext2fuse /dev/disk1s2 /sys_mount_point

Update: More recently I've found that fuse-ext2 has problems with certain newer ext4 features, so instead it is better to use ext4fuse (port install ext4fuse or brew install ext4fuse). Use the ext4fuse command directly:

ext4fuse /dev/disk1s2 ~/mount_point

Also as mentioned by Timothy in the comments you usually only need to use sudo if you're mounting outside your home directory or the disk (/dev/diskX) is only accessible by root:

sudo ext4fuse /dev/disk1s2 /sys_mount_point

It should be noted that you can only access that mounted filesystem as root/sudo. e.g.

sudo ls /sys_mount_point

And to unmount the filesystem you just use normal umount command (with sudo if used to mount the partition):

umount ~/mount_point
  • You only need to access the drive as root if you mount it outside your home directory. You can cd ~, mkdir mnt, ext4fuse /dev/diskXsY mnt, ls -la mnt without sudo/root. – Timothy Zorn Feb 1 '17 at 20:46
  • mount: exec /Library/Filesystems/fuse-ext2.fs/Contents/Resources/mount_fuse-ext2 for ...: No such file or directory – Wolfgang Fahl Mar 8 '17 at 10:33
9

Just for the record, I have tested Paragon ExtFS driver (trial version) on my MacBook Pro to write to ext4 partition in Linux. I found that the driver was very unstable, and it created corruptions to the filesystem that fsck was not able to repair neither in Linux nor in Disk Utility.

My idea was to have access to my /home partition from Mac OS X using this Paragon driver, but I don't suggest to do this setup. So far, I have my /home partition in Linux formatted to hfsplus with no journaling, and then I can access my files from Mac OS X. Of course, from time to time I get some problems in my FS but is not very frequent. However, I don't suggest this setup either (at least that you have an up to date backup for your daily work).

Finally, I believe that Paragon is more suitable maybe to use for external hard disks but anyways it is not very reliable for being software which license is expensive.

Update: As of May 2015, I have formatted my /home to ext4, and I mount the filesystem using fuse-ext2 in combination with FUSE for OS X. I can access the ext4 partition to read and write. It is more solid setup than the one I previously described above.

  • I can confirm the last entry here where the Paragon ExtFS driver can make some bad trouble on your linux drives. For me, who is dualbooting OSX and Linux, paragon created corruptions on my / device. This was easy to resolve but however thats not a stable solution... – user67382 Jan 14 '14 at 6:04
  • Further bad experience with Paragon ExtFS driver. Consistent kernel panics leading to system rebooting, corruption of the files system (luckily fsck on Linux box did work). Tried on two different external drives with same results. – user83677 Jun 26 '14 at 21:17
9

You can boot Linux VM quickly on your OS X using Vagrant. You require to install VM provider such as VirtualBox and Vagrant either via .dmg file from the site or using brew cask.

Once you have vagrant command installed, run this in any selected folder:

vagrant init ubuntu/trusty64; vagrant up --provider virtualbox

This will generate Vagrantfile config file and .vagrant folder.

and you'll have Linux box booted within few minutes (downloaded from Atlas Hashicorp repository).

Then connect to the box via command: vagrant ssh and try to mount your device inside Linux.

By default your current folder will be synched with /vagrant folder in VM. For more advanced options, you can modify Vagrantfile with required configuration.

So if you mount your filesystem within /vagrant folder, it will be automatically synched back to your macOS.


Alternatively you just need to install a VirtualBox, run the GUI app, install and boot a minimal version of Linux e.g. Ubuntu in order to achieve the same as explained above.


Above non-native solution are not ideal, but at least your macOS would be more stable rather than installing unstable kernel extensions which may cause a lot of system crashes.

  • Ran with vagrant init ubuntu/xenial64; vagrant up --provider virtualbox as ubuntu/vivid64 is not available anymore. – Fredrik Erlandsson Oct 30 '16 at 6:37
  • Try use ubuntu/trusty64 instead. – kenorb Oct 30 '16 at 12:24
8

I had an ext4 formatted USB drive that I was able to mount after I installed osxfuse. Reading from it works great, but I am not sure if writing is safe.

Also, for moving files from OS X's filesystem (HFS+) to ext4, you may first want to remove those hidden .DS_Store files the OS X filesystem sneaks in as they occasionally cause bad inodes.

find /my/data/to/move -name '*.DS_Store' -type f -delete

It is better than having to fix them after with an fsck command.

6

There is also e2fsprogs available in MacPorts. I haven't tested it yet myself but looks promising.

6

Updated answer for (High) Sierra

For Sierra and High Sierra ext4fuse seems to work well for read access only and therefore it could probably be considered the preferred option. While other answers already give some usage examples I'll repeat it once again with some important details:

Install ext4fuse with:

brew install ext4fuse

You can mount as a normal user but in that case you'll only be able access world-readable files, that's why for full access you need to use sudo, e.g.:

sudo ext4fuse -o allow_other /dev/disk2s1

Here is a bash script which partially automates the process. When launched it will automatically create the mount point after you'll be prompted to enter one of the displayed device identifiers such as disk2s1:

diskutil list
read -p "Please type the EXT4 device identifier: " disk_id
MOUNT_POINT=~/mnt/$disk_id
mkdir -p ${MOUNT_POINT}
sudo ext4fuse -o allow_other /dev/$disk_id ${MOUNT_POINT}
echo "***TO UNMOUNT USE***: 'diskutil umount ${MOUNT_POINT}'"
open ${MOUNT_POINT}

To unmount you can use e.g. diskutil umount /dev/disk2s1 — if you get a message that unmounting failed then you can force unmounting with diskutil umount force /dev/disk2s1, although it would be cleaner to close the apps that are using files on the disk and retry unmounting in without force.

If you happen to have files owned by _lpoperator (apparently they are created when you use rsync with preserve group option), then the following command will allow you to access those files:

/usr/sbin/dseditgroup -o edit -a everyone -t group _lpoperator

Original answer for Yosemite and older (deprecated)

Two packages are needed in order to enable EXT2/3/4 support on OSX: OSXFUSE and FUSE-EXT2.

The homebrew formulas for OSXFUSE and FUSE-EXT2 did not work for me on either mavericks or yosemite.

What did work was the following:

  1. Manually download and install the OSXFUSE DMG from http://osxfuse.github.io/. IMPORTANT: Once you launch the PKG installer, make sure you selected MacFUSE Compatibility Layer in the wizard (it is not enabled by default) - without it I was getting an error while trying to mount.
  2. Manually download FUSE-EXT2 from http://sourceforge.net/projects/fuse-ext2/ or for Sierra/El Capitan from https://github.com/gpz500/fuse-ext2/releases and run the PKG installer.

Once you have both OSXFUSE and FUSE-EXT2 installed you can mount the ext2/ext3/ext4 partitions as mentioned in other answers:

  1. Find the device name for the EXT partition you want to mount (e.g. disk0s2 in the example below, (UPDATE) in later MacOS versions ext3/ext4 partitions might be labelled Microsoft Basic Data and not Linux):

    # diskutil list | grep Linux 1: Linux_Swap 8.2 GB disk0s1 2: Linux 119.9 GB disk0s2

  2. Mount the partition to an existing mount point:

    sudo mkdir -p /Volumes/ext4 sudo mount -t fuse-ext2 /dev/disk0s2 /Volumes/ext4

Mounting as a regular user did not work for me. Probably this can be fixed by fiddling with permissions, but I didn't look into it.

Note: My suspicion is that the homebrew formulas did not work because homebrew installs osxfuse without the MacFUSE Compatibility Layer.

There are two osxfuse packages in homebrew:

# brew search osxfuse
>>> osxfuse
>>> Caskroom/cask/osxfuse

Both versions fail to mount EXT partitions. Most likely, the DMG version (Caskroom/cask/osxfuse) fails because homebrew installs the package with default settings, which means that MacFUSE Compatibility Layer is not included. The main osxfuse version probably needs some special installation parameter to enable MacFUSE compatibility, so until this is fixed in homebrew the manual DMG method should be used.

This method worked for me on mavericks, yosemite, elcapitan and sierra.

EXT2/3/4 mount script for older OSX versions (deprecated)

To save some extra typing I use a tiny script which takes the partition name such as disk0s2 and mounts it under /Volumes/disk0s2, creating the folder if necessary:

### mount_ext4.sh
sudo mkdir -p "/Volumes/$1"
sudo mount -t fuse-ext2 "/dev/$1" "/Volumes/$1"
open "/Volumes/$1"

The script is called with the partition name that you look up via diskutil list, e.g. mount_ext4.sh disk2s3.

  • 1
    Tried this but unfortunately get the error FUSE-EXT2 could not mount /dev/disk2s2 at /Volumes/ext4 because the following problem occurred: (but there is no problem description or reference). I have installed the Compability Layer addon. I'm on macOS Sierra so tried the Github gzp500 version. – Winterflags Jul 28 '17 at 16:36

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .