Introduction

This is a brief tutorial to make the Brother MFC-420CN printer/scanner work on Arch. While this tutorial is based on the MFC-420CN specifically, it can be used as a general guide for most Brother MFC model printers (substituting MFC-420CN for your model where needed).
On Brother's Linux Driver page you can find extra information along with drivers for different printer models.

Printer

Prerequisites

This tutorial assumes you have the following packages installed. Failure to do so may result in hard to trace issues with printing.

cups

ghostscript

gsfonts

foomatic-filters

arch x86_64 requires lib32-libcups

If you previously tried to install the printer in CUPS, remove it and any remaining driver files!!

Brother's scripts make use of the C Shell (csh) instead of the more common Bash. We must install tcsh from the "extra" repo.

# pacman -Sy tcsh

Brother's scripts look for C Shell in /bin/csh but will fail with the error "Bad Interpreter" unless we correct this to /usr/bin/tcsh. As root lets create a symbolic link:

# ln -s /usr/bin/tcsh /bin/csh

Your user is a member of the printer group (lp). Be sure to logout for changes to take affect.

Download printer drivers

Brother actively supplies Linux drivers for it's MFC series printers in RPM and DEB formats. Luckily there are tools to change these formats into something Arch can use.

First create a temporary directory.

Then you must download the official LPR drivers from the Brother website into this directory. Click here to download the MFC-420CN LPR driver (RPM archive).

You should also download the CUPS wrapper script. Click here to download the MFC-420CN CUPS wrapper script (RPM archive). This script creates the filters and PPD file for CUPS automatically saving us from extra work.

Extracting the RPM files

Now you need a small script called rpmextract which allows you to extract files from the RPM you've just downloaded.

Editing files to make it work with Arch

Arch Linux uses its own file system organization, so we'll have to edit some files. Assuming you are still in the temporary directory you created. You can use your favorite text editor to edit usr/local/Brother/cupswrapper/cupswrapperMFC420CN-1.0.0 and change all instances of /etc/init.d/ to /etc/rc.d/OR you can just do the following.

Now copy the files to their corresponding directories in your file system:

# cp -r /path/to/brscan/usr/* /usr

Now you'll need to add "brother2" to the end of /etc/sane.d/dll.conf
Brother felt it necessary to include a script to do that, so you can also run:

# /usr/local/Brother/sane/setupSaneScan2 -i

For a networked brother scanner:

# brsaneconfig2 -a name=[ANY_NAME] model=[EXACT_MODEL] ip=[IP_ADDR]

Example:

# brsaneconfig2 -a name=MFC420CN model=MFC-420CN ip=10.1.1.90

To test the networked scanner, you can install xsane:

# pacman -S xsane

And run it to verify the installation (as a luser):

$ xsane

Scan Key Install (Optional)

This allows the scanner to be recognized in other programs such as GIMP.

You'll need to extract the files to a temp path:

$ rpmextract brscan-skey-0.2.1-1.i386.rpm

While in the directory that contains the extracted content, run:

# cp -r ./usr/* /usr

Run the setup script for brscan-key:

# /usr/local/Brother/sane/brscan-skey-0.2.1-1.sh

Execute the tool to verify that the previously installed scanner is recognized:

# brscan-skey -l

Expect the following output:

# brscan-skey -l
MFC420CN : brother2:net1;dev0 : 10.1.1.90 Active

Troubleshooting

I can scan as root, but not as a normal user

Make sure your user is in the scanner group:

# gpasswd -a username scanner

then log out and back in.

If you still can't scan as a normal user, check that /usr/lib/sane (or /usr/lib64/sane for 64 bit) are readable and executable for your user/group.

64 bit caveat

The 64 bit RPM has two files in /usr/lib64/, along with two symlinks to each file. However, the Arch64 Sane package will probably look in /usr/lib/ rather than /usr/lib64/, so we'll need to create some more symlinks. And since the symlinks reference the absolute path, not the relative path, ie: