Linux on the Thinkpad T41p and T42p
This page describes my experiences using Linux on two Thinkpads: an IBM Thinkpad T42p (first booted in mid-September, 2005), and an IBM Thinkpad T41p (first booted in February 2007).
This isn’t really an instructional howto. The idea is, there are lots of Linux resources but it takes time to dig up the precise things that matter for your particular laptop. I hope that other people can use this page and save themselves some time.
Other Web Resources
Thinkpads running Linux are popular, and there are many web resources around.
- ThinkWiki is very thorough. Bookmark this one and please help keep it up to date.
- William Stein's page is great for getting started with running Linux on a Thinkpad. He also includes a good list of links to other helpful pages.
- Wikipedia's Thinkpad entry also has several links that are worth looking into.
Overview
I first booted via a Debian/stable installer CD. I tried for a long time to install Debian/unstable directly but could not get it working. The CD itself did not boot, and when I made a grub CD and then ran the installer CD via that, the installer did not work. The Debian/stable installer is far more reliable and is the way to go.
My partitioning scheme is as follows:
- 25 gigs for Windows
- 33.5 gigs for /
- 1.5 gigs for swap
There is a swap partition here in order to support swsusp2 so that the machine can suspend to disk. I normally prefer to use swap files instead of swap partitions, because swap files can be added and removed over time as my needs change—swap partitions require an up-front prediction about how much virtual memory will be needed, and such predictions are almost impossible to get right. Nevertheless, swsusp2 requires an actual partition and so I retroactively added one.
The large allocation for Windows is because Windows games have gotten really large! 5-10 gig installation requirements are common. My first partitioning gave only 15 gigs to Windows and I had real trouble making things fit.
I would prefer if /home was on a separate partition from the rest of the Linux file space, but currently it is not due to historical reasons. (See above not on previous partitioning.) With /home being separate, I would feel free to completely wipe the other partition without losing any critical data. Some people like to split their partitions up more finely grained, e.g. to have read-only /usr, special filesystem settings for /var/spool, /var/log being on its own partition so that log file growth does not stop the machine, etc., but I find it not worth the trouble for a personal machine.
Notice that I went ahead and deleted the 5 gig partition that IBM creates for its rescue tools. To each their own, but I don’t expect to ever use them, and 5 gigs is a lot of disk space! I’ve read that it is a good idea to ask Windows/XP to create “recovery disks”, because that 5-gig partition held my only copy of XP, but I haven’t gotten around to it.
After the initial install, I switched to Linux 2.6.13 and upgraded to Debian/unstable. I recall that this required some fiddling and several reboots, but there were no major problems.
My kernel config file as of February 14, 2007, using Linux 2.6.19, is:
config-astra-20070214
BIOS
When I first started installing Linux on this machine, I noticed that it would freeze after 5 minutes of inactivity. It turns out that this machine has a lot of support for power management that runs behind the scenes even after you have booted your OS. I went into the BIOS (press F1 on boot) and turned off all the various timers for automatic suspending. I’d rather use the OS-level tools like acpid.
Sound
The kernel support for Intel/SiS/.... AC97 chips
(CONFIG_SND_INTEL8x0) works fine. Originally, I had to
disable two flags using an ALSA mixer (such as
alsamixer
): Headphone Jack Sense and Line Jack Sense.
Without that, I would not hear any sound! I think that current
versions (Linux 2.6.19 anyway) might not need this trick any longer.
Networking
The wired NIC works out of the box using the “e1000” driver for the
Intel Pro/1000 (CONFIG_E1000
). When you configure your
kernel, be aware that it’s under the “1000 Mbit” section—there’s a
fast NIC built into this machine!
My Thinkpad has an Intel PRO/Wireless 2200BG. Using the support built into Linux 2.6.19, it works except that I see 22% packet loss. I now use the ipw2200 module on SourceForge, plus the ieee80211 generic stack from SourceForge, and I see no problems.
By default, this setup will name your wireless NIC eth1
.
This seems inaccurate to me, and I fear that various tools may be
confused by it. Thus I use ifrename
to change the name
to wlan0
. The following /etc/iftab
is all
that is required; simply change the mac address to whatever your card’s
is:
The first time you change the file you must run
ifrename
manually (with no arguments). After that, the
system will run it automatically via the hotplug
scripts.
Suspend to RAM
Suspend to RAM works but you need to add the following option to your kernel command line:
Without this flag, the graphics are not reinitialized correctly after a resume. The system suspends and resumes but the screen stays black.
Do not enable EnableVbetool
or
VbetoolPost
in /etc/hibernate/ram.conf
.
With these enabled, I found that suspend would almost work but, just
after resume, the screen would go blank and the keyboard would stop
responding.
Suspend to Disk
Software Suspend 2 works out of the box. I simply patched my kernel with version “2.2.rc6 for 2.6.13” and recompiled. The standard hibernate script in Debian, available in its own package, works great.
ACPI
ACPI works great with
I see no reason to muck around with APM these days. Turn on ACPI
in your kernel, as well as the one called something like “IBM extras”.
The IBM Extras setting adds several neat files in
/proc/acpi/ibm
.
Also, be sure to install the acpid
package in order to
respond to ACPI events.
I hacked my /etc/acpi/powerbtn.sh
to simply call
hibernate
. I don’t want it to log people out—I
only have one user on my laptop, and when I press power I want it
to immediately go into hibernation.
Additionally, I commented out the commands in sleep.sh
involving hwclock
. The commands don’t do the right thing
by default, and anyway, on Debian it should use the scripts in
/etc/init.d
instead of calling hwclock
directly.
X and Accelerated Graphics
I am using the open-source “ati” driver and getting very reasonable performance out of the OpenGL-based games I have tried. From glxgears I get about 1900 fps. The system is extremely stable.
To get this, the kernel has support for AGP and for DRM, and there
are a few extra options added to xorg.conf
that you can
see below. Otherwise everything .
Getting to this happy state require a lot of false starts. To things that did not work for me:
- fglrx, the ATI proprietary driver, failed to compile for me when using Linux 2.6.19. That is just as well, because I ended up trying the open-source graphics acceleration and being very happy.
- The "EXA" support in XOrg causes lots of problems on my machine, so I turned it back off. It caused lots of graphics to get really slow, including plain old web browser. Further, it caused rendering errors within my web browser. Yuck!
- Before getting DRM going, my X server would crash a lot of times after an OpenGL program exited. Oddly, using DRM has proven more stable for me.
External Monitors and Projectors
I use the XOrg server with the open-source “ati” driver.
Everything works excellently except that I have had problems
connecting an external monitor after the X server has started. On the advise
of another web site (I don’t remember which one at this point), I set
up my X server to have pre-configured settings for the external
monitor instead of trying to auto-detect them. This is important
because the auto-detection happens only when the server starts—it
does not happen again if you plug a monitor or project in later on.
The bottom line is the following section from my xorg.conf
:
Section "Device"
Identifier "ATI Technologies Inc M10 NT [FireGL Mobility T2]"
Driver "ati"
BusID "PCI:1:0:0"
Option "UseFBDev" "false"
Option "ColorTiling" "on"
# Option "AccelMethod" "EXA"
Option "EnablePageFlip" "on"
Option "AGPMode" "4"
Option "MonitorLayout" "LVDS, CRT"
# reasonable guesses at monitor limits....
Option "CRT2HSync" "15-92"
Option "CRT2VRefresh" "50-85"
Option "MergedFB" "on"
EndSection
Notice also that I have turned on the DynamicClocks
option. This is supposed to improve battery life, though I haven’t
verified it in person.
I’m not perfectly happy with this setup. Ideally, the external monitor would run at 1024x768 and the installed software—particularly presentation software—would be able to deal with it. But I haven’t put in the effort to get that working....
Built-in Mice
The Thinkpad has both a touchpad and a pointing stick thingie (between the G, H, and B keys). I have configured my kernel with the standard drivers and have a mediocre setup with the following properties:
- The touchpad works.
- The touchpad has the annoying tap-to-click feature programmed in.
- The pointing stick thingie doesn't work.
- Only the two buttons below the touchpad do anything. The
three above the touchpad do not even generate X events according
to
xev
. - An external mouse works great via
/dev/input/mice
and is usually what I use.
I tried the fix on William’s page to disabling tap-to-click but it didn’t work, and so I still get annoying clicks when my wrists brush across the touchpad. I have no idea why the fix didn’t work; it looks like it should....
The Linux source code recommends a separate Synaptic driver for use
with X, but I have not used that because it is nicer using the
/dev/input/mice
mouse consolidator.
UPDATE: As of February 2007, the pointing stick thingie is working. Otherwise, the above list is still accurate. For some reason, the tap-to-click is not reacting as thoroughly to my wrists as it used to; this is a positive change, since I hate tap-to-click anyway.
UPDATE: As of May 2007, everything is working. Tap-to-click is still turned on, but its sensitivity seems to be low enough now not to be too annoying. Obviously this is all a mystery to me.