NTFS-3G
NTFS-3G is a fully functional NTFS writer/reader built as a userspace filesystem, thanks to the magic of FUSE. For another way to get read/write support of NTFS filesystem, see Captive NTFS.
Please note that the following instructions are made in such a way that it should be easy to create a SlackBuild script or make a package.
Installing FUSE
Since NTFS-3G is not implemented as a kernel module, it has to find ways to communicate with the kernel and make its services as a filesytem available to any other process. To do this, it uses a library called FUSE (which stands for Filesystem in Userspace).
Slackware 11.0's 2.6.17.13 kernel already has FUSE support compiled, but the version which comes with this kernel lacks a few features (such as proper block devices handling) and that seems to annoy NTFS-3G, so we'll begin by installing a newer FUSE.
If you have FUSE already installed, please check that it is at least 2.6.0 with this command:
$ sudo /sbin/modprobe fuse $ dmesg | grep fuse kernel: fuse init (API version 7.8) kernel: fuse distribution version: 2.6.0
If it doesn't print the distribution version line then you have a version older than 2.6.
Getting FUSE to work
You have to make sure that the version of FUSE you're downloading is ≥ 2.6.0 and ≠ 2.6.2, unless you like annoying warnings and malfunctioning filesystems.
I prefer to do my building in a /tmp folder, so I'll start with this:
mkdir /tmp/fusebuild cd /tmp/fusebuild
First, you have to get the most recent version (at the time of writing, 2.6.3):
wget http://superb-west.dl.sourceforge.net/sourceforge/fuse/fuse-2.6.3.tar.gz
(There are several other mirrors. You can go to SF.net's download page to find another mirror.)
Then you can extract the source.
tar zxf fuse-2.6.3.tar.gz cd fuse-2.6.3
Before compiling, you have to make sure that your kernel sources and .config matches your running kernel. If you've build your own kernel (and haven't touched the source since then) then you should be fine. Otherwise, if you're running Slack's binary kernels, you'll have to install the kernel source. Usually, that's enough. Should you have some other kernel-related trouble, check out the FUSE homepage.
Now, you can compile your fuse library/tools/module
# You might want to change the CFLAGS or the --with-kernel path # Also, take note of the --exec-prefix=/ this allows you to have # /usr mounted later (or even as an NTFS partition, but why would # you want that?) and still mount NTFS drives. You may as well # remove it, and everything will get in /usr/* CFLAGS="-O2 -march=i486 -mtune=i686" ./configure \ --enable-kernel-module \ --with-kernel=/lib/modules/$(uname -r)/build \ --enable-lib \ --enable-util \ --enable-example \ --localstatedir=/var \ --sysconfdir=/etc \ --prefix=/usr \ --exec-prefix=/ \ --program-prefix= \ --profram-suffix= \ i486-slackware-linux make # Do the following steps as root: make install # This is only necesary if you didn't change/remove # the --exec-prefix option at configure time. mv /lib/pkgconfig/* /usr/lib/pkgconfig/ rmdir /lib/pkgconfig cat > /etc/udev/rules.d/99-fuse.rules <<_EOF_ KERNEL=="fuse", MODE="0666" _EOF_ # Note that fuse will also put some stuff in /etc/init.d, let's # put it where it belongs. mv /etc/init.d/fuse /etc/rc.d/rc.fuse rmdir /etc/init.d # You might also want to add this at the bottom of # /etc/rc.d/rc.modules: # [ -x /etc/rc.d/rc.fuse ] && /etc/rc.d/rc.fuse start
If you're making a slackbuild or building a package, instead issue:
mkdir -p /tmp/tmproot make install DESTDIR=/tmp/tmproot # Also prepend /tmp/tmproot to the paths references which come after # that. You may have to actually create some of those paths.
To make sure that everything is working so far, let's run a simple test (as root):
cd example mkdir /tmp/mntpoint # Run this as root. ./hello /tmp/mntpoint & #you can add a "-d" flag if you want to see what's goinng on. ls -l /tmp/mntpoint # You should see something like this: # total 0 # -r--r--r-- 1 root root 13 Jan 1 1970 hello cat /tmp/mntpoint/hello # It should print the famous "Hello, World!". # If it did, then FUSE is working as it should. # Run this also as root. fusermount -u /tmp/mntpoint rmdir /tmp/mntpoint cd ..
If everything is fine so-far, you can delete the cruft left behind:
cd rm -rf /tmp/fusebuild
Installing NTFS-3G
Now you should be ready to install NTFS-3G. Again, let's begin by making a build directory:
mkdir /tmp/ntfs-3gbuild cd /tmp/ntfs-3gbuild
Getting the greatest & latest
Then we can get the latest NTFS-3G. Note that there are usually two or three releases per month, so make sure to check the homepage to get the latest version.
wget http://www.ntfs-3g.org/ntfs-3g-0.20070207-RC1.tgz
Configuring and compiling
Compiling NTFS-3G is actually quite easy, it is one of those programs were compiling "just works".
First, you have to untar the source:
tar zxf ntfs-3g-0.20070207-RC1.tgz cd ntfs-3g-0.20070207-RC1
Next, let's configure the sources:
CFLAGS="-O2 -march=i486 -mtune=i686" ./configure \ --prefix=/usr \ --exec-prefix= \ --program-prefix= \ --program-suffix= \ i486-slackware-linux
That usually works without problems, unless you are missing libfuse. If so, you must see the above steps on configuring FUSE.
Now compile and install.
make make install # If you're making a package or a slackbuild, you will have to issue the next trick to avoid some st*pid error: # # make install LDCONFIG=/bin/true DESTDIR=$YOUR_ROOT_DIR # # also, you'll have to make sure that the mount.ntfs-3g.8 symlink points to the right (maybe gzipped) ntfs-3g.8 file.
And that's pretty much it.
Mounting with NTFS-3G
So, how to mount something? NTFS makes mounting NTFS filesystems as easy as with other filesystems:
root@damned-02# mount -t ntfs-3g /dev/sda1 /mnt/pendrive
If you fail to see some files which you know are there, you should try using the locale option, specially if that partition is used by a non-english Windos.
For example:
- For some reason I don't know, My WinXP in Spanish uses en_US for character encoding (not even en_US.utf8), to see my files with "special" chars (mostly á, é, í, ó, ú and ñ) I have to use:
root@damned-02# mount -t ntfs-3g -o locale=en_US /dev/sda1 /mnt/pendrive
The only way I know to find the right locale is to do some trial and error. If when you mount without locale, it shows all your files, then your correct locale is the one printed by
echo $LANG
To see which locales you have support for (there are 342 in Slack 11.0), type
locale -a | less
Using /etc/fstab
You can use /etc/fstab to mount ntfs partitions at boot time. For example, my laptop's fstab looks like this:
/dev/hda1 swap swap defaults 0 0 /dev/hda3 / jfs defaults 1 1 /dev/hda4 /home jfs noatime 1 2 /dev/hda2 /mnt/win ntfs-3g dmask=0007,fmask=0117,gid=6,locale=en_US 1 0 /dev/cdrom /mnt/cdrom auto noauto,group,ro 0 0 devpts /dev/pts devpts gid=5,mode=620 0 0 proc /proc proc defaults 0 0
This gives read/write access to anyone in the disk group (gid=6) to the NTFS partition at hda2 mounted in /mnt/win.
Note, though, that "mount" reports the filesystem as "fuseblk" (unless you have a version of fuse < 2.6 which won't allow you to mount block devices anyway).
Allowing users
NTFS-3G can let users other than root mount NTFS filesystems, but you'll have to set the suid flag in /bin/ntfs-3g. This applies even when using fstab with the users option.
So for this to work:
/dev/sda1 /mnt/pendrive ntfs-3g noauto,users 0 0
You have to do (as root):
# chmod 4755 /bin/ntfs-3g
RTFMs
If you have any problems or doubts:
If you find any error in this tutorial, don't forget this is a wiki and don't hesitate fixing or updating or improving or ...