Gentoo Wiki


This page is for printing from Windows clients to a Gentoo server. For printing from a Gentoo client to a Windows server, see HOWTO print winserver.



Connecting a printer to the parallel port or USB port, install samba and cups, a little configuration magic, and you are printing in no time.

You can print from Windows without Samba, as described here, but using Samba makes the Windows configuration idiot-proof and lets us automagically upload the latest CUPS windows drivers to the Windows box.

This HOWTO goes through all the steps needed to set up both Samba, CUPS and Windows.

It is based on different work found on the internet, the forums, and IRC. (The structure of this HOWTO is taken from the Samsung printer howto).

This guide should work for all printers, but I'll be using the HP LaserJet 1000 as an example. (It's difficult to configure, by the way, because it requires firmware uploading).

What this HOWTO will do

  1. Install a printer locally
  2. Configure your kernel to support printing (USB and LPT). We are using a 2.6 kernel.
  3. Configure Samba and CUPS to use the printer in RAW mode.
  4. Configure the Windows clients to use the printer.

Required packages

(hotplug is obsolete since udev does the magic for you....)


First we need to know what type of USB host we are using (skip this part if you are using LPT). There are two kinds of USB hosts: OHCI and UHCI. You only need one of them. Run the lspci utility and check what type of USB controller you have:

Code: sample lspci output
# lspci
0000:00:00.0 Host bridge: VIA Technologies, Inc. VT82C693A/694x [Apollo PRO133x] (rev c4)
0000:00:01.0 PCI bridge: VIA Technologies, Inc. VT82C598/694x [Apollo MVP3/Pro133x AGP]
0000:00:04.0 ISA bridge: VIA Technologies, Inc. VT82C686 [Apollo Super South] (rev 40)
0000:00:04.1 IDE interface: VIA Technologies, Inc. VT82C586A/B/VT82C686/A/B/VT823x/A/C PIPC Bus Master IDE (rev 06)
0000:00:04.2 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 16)
0000:00:04.3 USB Controller: VIA Technologies, Inc. VT82xxxxx UHCI USB 1.1 Controller (rev 16)
0000:00:04.4 Host bridge: VIA Technologies, Inc. VT82C686 [Apollo Super ACPI] (rev 40)
0000:00:09.0 SCSI storage controller: Adaptec AHA-2940/2940W / AIC-7871
0000:00:0b.0 Ethernet controller: 3Com Corporation 3c900B-Combo Etherlink XL [Cyclone] (rev 04)
0000:00:0c.0 VGA compatible controller: S3 Inc. 86c325 [ViRGE] (rev 06)
0000:00:0d.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)

Kernel configuration

Next, you will need to make sure USB (or LPT) support is compiled into your kernel. I prefer compiling support into my kernel as opposed to making modules. The choice is yours.

Linux Kernel Configuration: options for USB

For USB print support

Device Drivers -> USB Support
<*> Support for Host-side USB
<*> EHCI HCD (USB 2.0) support
[ ]   Full speed ISO transactions (EXPERIMENTAL)
[ ]   Root Hub Transaction Translators (EXPERIMENTAL)
< > OHCI HCD support
<*> UHCI HCD (most Intel and VIA) support
<*> USB Printer support

Or for LPT

Device Drivers -> Character devices
<*> Parallel printer support

After making your changes, you will need to reboot if you compiled USB support into the kernel. Otherwise, you could just load the modules. I would suggest rebooting, though.

Use flags

You need three useflags to be set for this guide:

Install Packages

This is probably the easiest step. It is good practice to always do a pretend/verbose before installing any package. This way you know what is going to be installed (focusing on dependencies, if any). Kick back for a while as it takes about 30 minutes to install the packages, depending on hardware/optimizations. It will take longer if any dependencies need to be installed.

emerge --sync
emerge -av hotplug samba cups

Configuring packages

Configuring CUPS

First, edit /etc/cups/mime.convs and uncomment the following line at the very bottom of the file:

File: /etc/cups/mime.convs
application/octet-stream        application/vnd.cups-raw        0       -

Then edit /etc/cups/mime.types and uncomment the following line at the very bottom of the file:

File: /etc/cups/mime.types

Now we need to edit /etc/cups/printers.conf, remove everything in it, and add the following, modifying it for your needs:

File: /etc/cups/printers.conf
# You may prefer to visit http://localhost:631/ rather than edit this directly.
<DefaultPrinter HPLaserJet1000> <-- Name of the printer.
Info HP LaserJet 1000 <-- The Description of the printer.
Location usb:/dev/usb/lp0 <-- This is a human readable string, stating the Location (eg. "my Brother's Office Plotter")
DeviceURI usb://hp/LaserJet%201000 <-- the URI for the printer, ("usb" is the name of the backend, doing the actual transfer to the printer ).
State Idle
Accepting Yes
JobSheets none none
QuotaPeriod 0
PageLimit 0
KLimit 0

All we need to do now is edit /etc/cups/cupsd.conf. Most of the options can be changed as you like. The following should be set, though:

File: /etc/cups/cupsd.conf
User lp
Group lp

If you need to access the web interface for cups, from the subnet 192.168.1.x in this example, use this:

<Location />
Order Deny,Allow
Deny From All
Allow From 192.168.1.*
<Location /admin>
AuthType Basic
AuthClass System
Order Deny,Allow
Deny From All
Allow From 192.168.1.*

Otherwise, use this:

<Location />
Order Deny,Allow
Deny From All
Allow From 127.0.0.*
<Location /admin>
AuthType Basic
AuthClass System
Order Deny,Allow
Deny From All
Allow From 127.0.0.*

Configuring Samba

Note: At this point you should have your CUPS install squared away and you should be able to print locally. To verify this, go to http://localhost:631/printers/ and print a test page. If this doesn't work, you may want to have a look at Cups.

First, you need to do a few things: Create the folder where the drivers for the Windows 2000/XP workstations to download will be placed:

# mkdir -p /usr/share/cups/drivers

Next create a folder that we will use to transfer some files from your Windows box:

# mkdir -m 777 /home/shared-folder

Now create /etc/samba/smb.conf and paste in the following:

File: /etc/samba/smb.conf
        workgroup = MSHOME
        netbios name = mini-itx
        server string = file and printer server
        hosts allow = 192.168.1.
        security = user
        load printers = yes
        printing = cups
        printcap name = cups
        use client driver = no

        path = /home/shared-folder
        comment = shared files
        read only = no
        browseable = yes
        guest ok = yes

        comment = All Printers
        path = /var/spool/samba
        browseable = yes
        printable = yes
        writable = no
        guest ok = yes

        comment = Printer Drivers
        path = /usr/share/cups/drivers
        browseable = yes
        guest ok = yes
        read only = yes
        write list = root

You should edit the following to suit your needs:

netbios name sets the NetBIOS name by which a Samba server is known. This is what you will see in network neighborhood.

workgroup controls what workgroup your server will appear to be in when queried by clients.

server string controls what string will show up in the printer comment box in print manager and next to the IPC connection in net view.

hosts allow is a comma-, space-, or tab-delimited set of hosts which are permitted to access a service. To allow everyone on your LAN, use your current IP minus the last number.

security If you use "users", only user accounts you specify will be allowed. For a completely open system you can change this to "share", but for now you MUST leave it set to "user" or you will have problems during a later step.

Note: In-depth Samba configuration is beyond the scope of this HOWTO, if you need more info please see the Suggested Reading below.

Adding services to runlevels

Now we just need to add the cupsd and samba services to the default runlevel, if you have a recent version of udev, you can skip the hotplug stuff:

Code: Adding the services to the default runlevel and starting them
rc-update add cupsd default
rc-update add samba default
rc-update add hotplug boot
/etc/init.d/cupsd start
/etc/init.d/samba start
/etc/init.d/hotplug start


Code: Adding the services to the default runlevel and starting them
for x in cupsd samba hotplug ; do rc-update add $x default ; /etc/init.d/$x start ; done

Prepare the Windows Driver

When a Windows box uses our print server for the first time, we want the necessary drivers to be automatically downloaded from our server and installed. You need:

You can put all them in /usr/share/cups/drivers directory just using portage:

# emerge -av net-print/cups-windows net-print/adobeps

Now we have the driver files that we need, but we have to get the rest off of a Windows 2000/XP box. First, we have to add some Samba users, so we can access our shared folder from the Windows box:

# smbpasswd -a root
# smbpasswd -a <a_valid_username>

We now will export the printers to samba:

# cupsaddsmb -H localhost -U root -a

or if above fails (cupsaddsmb: Unable to connect to server), try this:

# cupsaddsmb -U root -h localhost -a

or if above still fails (cupsaddsmb: Unable to connect to server), try this:

# cupsaddsmb -U root -h <YOUR_IP_ADDRESS_OR_HOST_NAME> -a

and if above also fails, check that your host listens to port 631 (e.g. 'telnet <YOUR_IP_ADDRESS_OR_HOST_NAME> 631)!

This will export all known printers; see the cupsaddsmb man page if your requirements are different.

You should now be able to use the printer from any Windows box. You can double click on the printer in "My Network Places" or use the "Add Printer" wizard. The easiest way is to run explorer.exe, use the folder-tree view, and go to My Network Places >> Entire Network >> Microsoft Windows Network >> Mshome Now you should see your printer, so double-click on it and you're ready to print. You should NOT have to manually select or install drivers.

If you want to make your Samba server open to everyone with access to the network, you can now change /etc/samba/smb.conf so security = share .

Uploading the firmware to the printer upon insertion

If your printer requires you to upload the firmware to it everytime you plug it in, this might be helpful to you. First, copy the firmware file (typically placed inside the driver file you download from the vendor website and extracted) to /lib/firmware.

Now, go to the /etc/dev.d/default directory and make a script called, and put execution permissions on it:


if [ "$DEVNAME" == "/dev/usb/lp0" ]
  cat /lib/firmware/sihp1000.dl > /dev/usb/lp0
  exit 1

In this case, the file is called sihp1000.dl. This is a pretty badly written script nice script, but it works. :)


Suggested Reading


See also

Retrieved from ""

Last modified: Mon, 06 Oct 2008 09:38:00 +0000 Hits: 80,066