Gentoo Linux on Apple MacBook Pro Core2Duo
This is a short guide for the experienced Linux user. It explains how I installed Gentoo Linux on my Apple MacBook Pro. I chose to run Linux on this laptop because it works best for my needs. Neither OS-X nor Windows are an option for me. Please note: This is a matter of taste. That it works for me doesn't necessarily mean that it works for you.
This page is gradually updated as new drivers / kernels are available. There is a page in the Gentoo Wiki, too. But I find the information there very chaotic, incomplete and sometimes wrong.
Hardware features
I bought the second edition of the MacBook Pro in December 2006 because of its excellent hardware and unsurpassed design. dmidecode, lspci, lsusb, /proc/bus/input/devices
- Intel Core2Duo dual-core processor at 2.33 GHz. cpuinfo
- 2048 MB RAM
- Intel Mobile 945GM/PM/GMS/940ML PCI express chipset with 82801G I/O chip
- Superdrive (DVD R/W, CD R/W), 24x
- 100 GB hard drive
- ATI Radeon Mobility X1600 with 256 MB RAM
- 17" 1680 x 1050 (371 x 232 mm) LCD screen
- Marvell Gigabit Ethernet port
- Atheros based WLAN (AirPort)
- Integrated iSight webcam
- IEEE-1394 (Firewire) ports (1 x 400, 1 x 800)
- 3 USB 2.0 ports
- Infrared remote control
- Keyboard in Swiss-German layout with backlight
- Touchpad
OS-X, Bootcamp, rEFIt, and booting the Gentoo LiveCD
As you have probably heard, Intel Macs don't come with a PC BIOS. They have an alternative boot firmware called EFI. In contrast to BIOS, a portion of EFI is installed on a partition on the harddrive. This makes it extensible. It also provides the BIOS calls for Linux. Decent EFI support is in process of being implemented into Linux since kernel 3.1 onwards only. Some drivers still rely on BIOS calls (graphics!). So currently don't bother with a pure EFI installation. It probably won't work.
First I booted into OS-X. Downloaded and installed rEFIt.
rEFIt is nothing more than an EFI extension/module. It shows a boot menu that allows to boot other operating systems
installed on other partitions
or LiveCDs. It does no harm to your system. If you want to directly boot into OS-X without rEFIt,
just select the OS-X partition as the boot disk in OS-X. As I never use OS-X I told rEFIt to
boot Linux by default, by setting the legacyfirst
option in
/efi/refit/refit.conf
.
Downloaded and installed BootCamp. BootCamp helps with resizing your OS-X partition to make room for the Linux partitions. Apart from that it does nothing: The BIOS emulation is part of your Mac's firmware.
Downloaded and burnt the Gentoo Live CD for x86 i686 (32 bit). At that time I was relying on some binary drivers, so I chose the 32 bit version. Who knows if the binary crap (why binary drivers are crap) would ever work in 64 bit mode. In December 2011 I reinstalled using the x86_64 Gentoo architecture. Today 64bit code is often more tested and more stable than 32bit code. I even have the impression that the 64bit Gentoo is faster filesystem wise.
As for boot CDs: the Gentoo minimal boot CD is not the best. It's kernel has no support for the WiFi card. I recommend the SystemRescueCD to install Gentoo or do any Gentoo maintenance work. It's kernel works with the MacBook Pro hardware.
Now, insert the boot CD and reboot. rEFIt will come up and let you choose to boot from the CD. In the live CD use fdisk to partition your hard drive. I deleted the Windows partition that BootCamp had created. Then I created a Linux partition and a Linux Swap partition. Rebooted and let rEFIt sync the EFI partition table (GPT). Used fdisk to fix the partition types again (83 and 82). The existing EFI partition is actually empty, but don't remove it!
I chose ext4 for the filesystem because it's still one of the fastest today (look at various Phoronix benchmarks on non-SSD disks). A very good alternative in terms of speed and reliability is XFS.
Portage settings
I am using this make.profile
: /usr/portage/profiles/default/linux/amd64/10.0/desktop
.
plus these USE flags and config:
USE="X509 a52 aac aio amr amrnb amrr amrwb apache2 asf audacious avahi bash-completion bluetooth bzip2 cdda cddb cdparanoia cleartype contrast css dga dirac divx dmi dnotify dts dvdnav emerald enblend exif exscalibar ffmpeg fftw flac ftp gd gimp glibc-omitfp gmedia gs gtk2 hdri hfs hotpixels hpn html ibam idn ieee1394 imagemagick inotify ipod irda isight jabber jack java javascript jce jpeg2k kde kvm ladspa lame laptop latex lcms lensfun libvisual lm_sensors logitech-mouse logrotate maildir mdnsresponder-compat mmx mng moonlight mozdevelop mozsvg mp4 mpeg2 mplayer msn multicall mysql network network-cron no-old-linux no-suexec nodrm nsplugin pcap pertty portaudio postscript ppds rdesktop rle sasl scanner sift slp smp sms speex spf sse sse2 sse3 ssse3 subversion tex theora thunderbird timezone tk type1 udev urandom usb userlocales utempter v4l v4l2 vaapi vcd vim-syntax visualization wifi win32codecs wmp wps x264 xcb xcomposite xine xinerama xosd xscreensaver xvid zeroconf zip -3dnow -3dnowext -abiword -acl -arts -cracklib -eds -esd -fortran -gnome -isdnlog -kerberos -lightning -mudflap -oss -pppd -qemu -semantic-desktop -spell" INPUT_DEVICES="evdev keyboard mouse synaptics" VIDEO_CARDS="fglrx radeon vesa fbdev" ALSA_CARDS="hda-intel" LINGUAS="en de"With GCC 4.5 in 32 bit mode:
CHOST="i686-pc-linux-gnu" CFLAGS="-O2 -march=core2 -fomit-frame-pointer -pipe"With GCC 4.5 in 64 bit mode:
CHOST="x86_64-pc-linux-gnu" CFLAGS="-O2 -march=core2 -fomit-frame-pointer -pipe"Of course you can always use
-march=native
instead.
Kernel
Some important config options:
- 32 bit kernels: CONFIG_HIGHMEM4G or CONFIG_HIGHMEM64G: the MacBook has 2GB RAM and 4GB swap. Without this option you will get a warning in dmesg that you are only using around 890 MB of RAM.
- CONFIG_HOTPLUG_CPU: without it, suspend to RAM is impossible.
3.3
I got a 3.3 kernel out of git. 3.3.1 breaks WIFI, please patch -R -p1 <
commit-db6a6a7. Here is my kernel config for
x86_64
3.2
I got a 3.2 kernel out of git. Here is my kernel config for x86_64
3.1
I got a 3.1 kernel out of git. Here is my kernel config for x86 and x86_64.
older kernels below are all 32 bit3.0
I got a 3.0 kernel out of git. Here is my kernel config.
2.6.39
I got a 2.6.39 kernel out of git. Here is my kernel config.
2.6.38
I got a 2.6.38 kernel out of git. Here is my kernel config.
2.6.37
I got a 2.6.37 kernel out of git. Here is my kernel config.
2.6.36
I got a 2.6.36 kernel out of git. Here is my kernel config.
2.6.35
Sorry, I had not much fun with .35. So leaving this one out.2.6.34
I got a 2.6.34 kernel out of git. Here is my kernel config.
I have converted my ext3 partition to ext4 now.
Grub
I am using the Grub boot manager to boot the kernel. The /boot/grub/grub.conf
contains:
timeout 3 default 0 fallback 0 # Prod title Linux-2.6.33 root (hd0,2) kernel /boot/linux-2.6.33 resume=/dev/sda4 root=/dev/sda3 rootfstype=ext4 radeon.dynclks=1 # Testing title Linux-2.6.34 root (hd0,2) kernel /boot/linux-2.6.34
The problem that most of the time the keyboard is dead when Grub comes up is resolved by the MacBook Pro EFI Firmware Update 1.4 from 09/27/2007.
Groups
I found it useful (not to say necessary) to assign the user to the following groups:
- users: main group
- cron: to be able to use crontab
- audio: to be able to play sound
- cdrom: to be able to burn CDs
- video: to be able to use the iSight
- games: to play games
- portage: to use equery, emerge read-only
- disk: to access plugged storage
- plugdev: so memory sticks work
- wheel: to be able to su to root
Keyboard layout
I have set my system to UTF-8, using
a en_US.utf8 locale (eselect locale) and I am using a UTF-8 keymap (not a Latin-1 one!):
I have modified the keymap a little. The more keys you get right in the keymap file the less work you have in X,
as it inherits these settings! I started off with a keymap file created with dumpkeys
,
tweaked it and put it to /etc/default.kmap. This file is then referenced
from /etc/conf.d/keymaps
in the KEYMAP
variable.
For X see below!
The Apple keys work as Alt-Gr. So it provides access to the 'at' sign as Apple-2, the # sign as Apple-3, square brackets [] as Apple-ü and Apple-", braces {} as Apple-ä and Apple-$, pipe | as Apple-1 (or Apple-7), backslash \ as Apple-<. Additionally the Apple-E is the Euro € and Apple-G the 'at' like on a Mac. I have made the keypad Enter key (between Right Apple and Cursor Left) a 'Delete' key. With Shift it's 'Insert'. You also get 'Delete' with Fn-Backspace (Kernel does that).
By default the Kernel sets the Fn key to always enabled (OS-X behaviour). If you don't like that
turn it off with the kernel parameter usbhid.pb_fnmode=2
in Grub or change it at runtime
through /sys/module/usbhid/parameters/pb_fnmode
.
Wifi (AirPort)
Since kernel 2.6.29 I have been happily using the ath9k driver.
For WPA support I am using wpa_supplicant
.
/etc/conf.d/net
modules=( "wpa_supplicant" ) config_wlan0=( "dhcp" ) dhcpcd_wlan0="-L -t 20 -E" wpa_supplicant_wlan0="-Dnl80211"
Before that the MadWifi project did not support the new Atheros chipset AR5418 yet. That means you have to use a bloody Windows driver with ndiswrapper. I have found the Lenovo (IBM) driver to work best (the D-Link caused a kernel panic in some networks). To obtain the driver (deep linking impossible):
- go to Lenovo support site
- enter "2007VEH" as the product number (it's a ThinkPad T60)
- click on "Software and Device Drivers"
- click "Networking-Wireless"
- download under "ThinkPad 802.11abgn wireless LAN" "Windows 2000, XP"
- Save the driver to disk (exe file)
- Use cabextract (emerge cabextract) to unpack the archive
- Install the driver using ndiswrapper:
ndiswrapper -i WIN2K_XP/NET5416.INF
Tethering with the HTC Hero
Tethering is extremely simple with the Hero. Just make sure to enable "RNDIS and ActiceSync" device support in the kernel (USB_NET_RNDIS_HOST). In 2.6.33 that option is well hidden below:
- Device Drivers
- Network Device Support
- USB Network Adapters
- Multipurpose USB Networking Framework > Host for RNDIS and ActiveSync devices
After plugging in the phone and enabling Wireless Controls > Mobile Network Sharing on the phone, you get a new ethernet device (usb0 here). Use it like any other regular ethernet device.
# lsusb -t /: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci_hcd/8p, 480M |__ Port 3: Dev 9, If 0, Class=comm., Driver=rndis_host, 480M |__ Port 3: Dev 9, If 1, Class=data, Driver=rndis_host, 480M # ifconfig -a usb0 usb0 Link encap:Ethernet HWaddr 12:34:56:78:90:AB BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)
xorg and 3D
The MacBook has a Radeon Mobility X1600 M56P, which is a RV5xx chip also known as RV515 or RV516.
So make sure to set these variables in your /etc/make.conf
:
INPUT_DEVICES="evdev keyboard mouse synaptics" VIDEO_CARDS="fglrx radeon vesa fbdev"
You have the choice between two different graphics drivers for Xorg:
ATI drivers
AMD's (former ATI) proprietary closed source driver fglrx
from the ati-drivers
ebuild: offers 3D acceleration, has some bugs, breaks
often with new kernel versions, closed source
Some versions of the ati-drivers are really buggy (break Google Earth and suspend to RAM). I have
used ati-drivers-8.39.4
for kernels before 2.6.24, and
ati-drivers-8.452
and ati-drivers-8.542
since. But now I have switched
to the xorg drivers.
Xorg drivers
The Xorg xf86-video-ati
(radeon) driver offers good support.
To get propert 3D acceleration this driver needs DRI. DRI is provided by r300_dri.so which
comes with MESA 7.2 onwards.
Kernel mode setting (KMS)
KMS works very well with xf86-video-ati-6.13.1 and kernel 2.6.36.
You get a working framebuffer console and fast console/X
switching. You can also save your battery with radeon.dynclks=1 on the kernel command line.
You can always fall back to old user modesetting (UMS) by specifying nomodeset
on
the kernel commandline. If X crashes on start, try removing your xorg.conf.
Here is my xorg.conf: xorg.conf.
Note that I don't specify any mode lines as xorg can perfectly figure out the best mode with no help. To get
nice anti-aliased fonts see the
this Wiki page.
For Keyboard and Touchpad config there are files for /etc/X11/xorg.conf.d
:
10-keyboard.conf, 11-touchpad.conf
The keyboard in X needs a little tweaking with xmodmap
.
For xorg-server I am using this Xmodmap.
Just save it as the global /etc/Xmodmap
or a
local ~/.Xmodmap
.
Touchpad
The touchpad can operate either through the appletouch driver (which is the default) or
through the USB HID driver. Which one is used is determined by a HID_QUIRK_IGNORE_MOUSE
in the blacklist
entry in /drivers/usb/input/hid-core.c
:
{ USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ANSI, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE }, { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_ISO, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE | HID_QUIRK_POWERBOOK_ISO_KEYBOARD}, { USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_GEYSER4_JIS, HID_QUIRK_POWERBOOK_HAS_FN | HID_QUIRK_IGNORE_MOUSE },.
The HID driver of course does not provide extended features like tapping, multifinger, scrolling etc.
The appletouch driver does (together with the synaptics xorg input driver). You may also want to
run syndaemon -i 1 -t -d
from an Autostart script in X.
Mighty Mouse
I have an optical Bluetooth Mighty Mouse with a scroll ball (Vendor/Product: 05ac:030c).
It works out of the box with the help of the bluez-utils
and
kdebluetooth
.
Please note that with bluez-utils-3.10 the hidd is gone
and the following is no longer necessary. In fact the job of connecting/pairing the device is now
performed by kdebluetooth.
In /etc/conf.d/bluetooth
make sure to enable the HID
daemon and to specify the MAC address of the mouse (use hcitool and hcidump).
# Start hidd (allowed values are "true" and "false") HIDD_ENABLE=true # hard code MAC address of mouse HIDD_OPTIONS="--connect aa:bb:cc:dd:ee:ff"
From 2.6.19 on the HID layer is decoupled from USB and can be used by the bluetooth subsystem. The full HID support is available as of 2.6.21. For earlier kernels there is a patch.
Sound
The MacBook Pro has on-board Intel HDA STAC 922x sound. Audio playback and recording works fine
with internal speakers and headphones. The mixer controls seem to be changing with every kernel
version (very annoying). Be careful when switching between kernels, as ALSA keeps an
asound.state
file with configured devices in /var/lib/alsa
(or /etc
on other distros) which may be read by alsactl
at boot time.
If your mixer does not show the PCM device, or pommed's sound support doesn't work you may need
to delete those after changing the kernel.
In Gentoo also check the settings in /etc/conf.d/alsasound
. I said yes to save and
restore sound levels.
More information about the STAC 922x and ALSA can be found there.
The card has no MIDI synthesizer, so to play MIDI files you need timidity++
.
If you want to get into real audio development, your best start is qjackctl
and pam config for realtime priority. Also make sure to set
options snd-hda-intel position_fix=1
in /etc/modules.d/alsa
and update-modules
, to eliminate xruns in jackd!
iSight camera
The iSight is now fully supported by the linux-uvc kernel module and works fine in
Kopete and Skype. The module is included in the vanilla kernel 2.6.26. For earlier kernels
it can be obtained separately: emerge linux-uvc
.
Use version 0.1.0_pre157 which also requires the
isight-firmware-tools
. On OS-X the firmware is found under
System/Library/Extensions/IOUSBFamily.kext/Contents/PlugIns/AppleUSBVideoSupport.kext/Contents/MacOS/AppleUSBVideoSupport
.
Copy it to /lib/firmware
and run ift-extract --apple-driver AppleUSBVideoSupport
to extract it to /lib/firmware/isight.fw
.
After modprobe uvcvideo
a v4l device is created.
You can use GStreamer to play and record video
(emerge gstreamer gst-plugins-base gst-plugins-good gst-plugins-v4l2 gst-plugins-ffmpeg
).
# view only (some magic) gst-launch-0.10 v4l2src ! autovideosink # view only (no magic) gst-launch-0.10 -v v4l2src ! videorate ! video/x-raw-yuv,format=\(fourcc\)UYVY,width=320,height=240 ! \ ffmpegcolorspace ! xvimagesink # record and preview gst-launch-0.10 -v v4l2src ! videorate ! video/x-raw-yuv,format=\(fourcc\)UYVY,width=320,height=240 ! \ ffmpegcolorspace ! tee name=preview ! xvimagesink sync=false preview. ! ffenc_msmpeg4 ! queue ! \ avimux ! filesink location=1.avi # record with sound from microphone and preview gst-launch-0.10 v4l2src ! videorate ! video/x-raw-yuv,format=\(fourcc\)UYVY,width=320,height=240 ! \ ffmpegcolorspace ! tee name=preview ! xvimagesink sync=false preview. ! ffenc_msmpeg4 ! queue ! \ avimux name=mux alsasrc ! queue ! audioconvert ! ffenc_ac3 ! mux. mux. ! filesink location=1.avi
Or use mplayer2: mplayer2 tv://
or more complete options:
tv=driver=v4l2:input=1:width=320:height=240:device=/dev/v4l/isight:outfmt=uyvy:fps=24
Mplayer is then started with: mplayer tv:// -vf mirror,screenshot
To save a still image (photo booth) press s
.
Recording to file is also possible with mencoder (but you don't see what you're recording).
I have defined a profile in
~/.mplayer/mencoder.conf
:
[webcam] o=1.mpg oac=pcm=yes ovc=lavc=yes lavcopts=vcodec=mjpeg tv=driver=v4l2:input=0:width=320:height=240:device=/dev/v4l/isight:outfmt=uyvy:fps=24 vf=mirror nosound=1
Mencoder is then started with: mencoder -profile webcam tv://
But it crashes after a while with floating point exception.
ffmpeg works (but you don't see what you're recording):
ffmpeg -f video4linux2 -s qvga -i /dev/v4l/isight 1.mpg
luvcview has been patched to support the UYVY format.
luvcview -f uyvy
Pluggable devices
Just make sure the user
is in the plugdev
group. Forget HAL: it is no longer necessary
and deprecarted.
Special keys
The macbook has a couple of special keys to control the LCD brightness, speaker volume,
CD eject and keyboard backlight. The pommed
daemon handles them nicely: emerge pommed
and modify /etc/pommed.conf
to your liking. Then run gpomme -c
to setup the optional GUI and add gpomme
to your X login scripts. Make sure the kernel is compiled with INPUT_UINPUT.
In KDE the backlight and volume are handeled by global shortcuts by default already. So you can safely disable support for that in pommed. All you need pommed for is keyboard backlight these days.
Remote control
Use LIRC.
Suspend to RAM
Works well on recent kernels. Just use KDE's power management.
Useless screenshot
Here is the obligatory completely atypical and useless screenshot. Click for the full-size image (1680x1050, 1MB).