Ubuntu – External Monitor display on Thinkpad W520 with 12.04

graphicsmultiple-monitorsnvidianvidia-optimusthinkpad

I know there is a lot of material regarding these problems, but much of it seems outdated and nothing seems to be working for my situation:

  • ThinkPad W520 (Intel 3000 and Nvidia 1000M chipset)
  • OS: Ubuntu 12.04.3.
  • BIOS graphics card setting: Optimus
  • BIOS OS Optimus auto-detection: disabled

I used the Bumblebee wiki below to install and setup Bumblebee:
https://wiki.ubuntu.com/Bumblebee#Installation

After setting my BusID for the graphics card to "PCI:01:00.0" (see config files below), I am able to run optirun firefox and the virtualgl tests like optirun glxspheres64 and glxspheres64. So, I believe all is well with the Bumblebee installation, except I cannot connect to my external monitor (via VGA). Any ideas on how to do this? The W520 has the VGA (and DisplayPort) hardwired to the Nvidia card, as described by Zachary Sunberg:

http://zachstechnotes.blogspot.com/2012/04/post-title.html

So, I believe this makes things a bit tricky when trying to connect the VGA to an external monitor. I believe that I have to use a server/screen clone, described in my attempts documented below:

  1. I tried the following post to configure the external monitors,

    http://hillspcworld.com/forum/index.php?topic=2.0

    But rebooting after step 7, causes the OS to completely crash (black screen after the bootloader that says "Could not write bytes: broken pipe"). I believe this is due to the xorg server disrupting my system somehow.

  2. I tried a similar approach in the following tutorial, but I had the same crash as in (1) during the reboot after installing xorg-dev:

    http://sagark.org/optimal-ubuntu-graphics-setup-for-thinkpads/

As of now, I am wondering where to go from here. I have a couple leads below, any ideas on what the problem is, or what I can do? Is there a better suggestion?
http://zachstechnotes.blogspot.com/2012/04/post-title.html

https://github.com/Bumblebee-Project/Bumblebee/issues/77

https://github.com/Bumblebee-Project/Bumblebee/issues/522

Also, here are some of my files (let me know if there is a better configuration – the only change I made was uncommenting the "BusID PCI:01:00.0" in the xorg.conf.nvidia file:

lucas@lucas-ThinkPad-W520:~$ more /etc/bumblebee/xorg.conf.nvidia 
Section "ServerLayout"
    Identifier  "Layout0"
    Option      "AutoAddDevices" "false"
    Option      "AutoAddGPU" "false" EndSection

Section "Device"
    Identifier  "DiscreteNvidia"
    Driver      "nvidia"
    VendorName  "NVIDIA Corporation"

#   If the X server does not automatically detect your VGA device,
#   you can manually set it here.
#   To get the BusID prop, run `lspci | egrep 'VGA|3D'` and input the data
#   as you see in the commented example.
#   This Setting may be needed in some platforms with more than one
#   nvidia card, which may confuse the proprietary driver (e.g.,
#   trying to take ownership of the wrong device). Also needed on Ubuntu 13.04.
    BusID "PCI:01:00:0"

#   Setting ProbeAllGpus to false prevents the new proprietary driver
#   instance spawned to try to control the integrated graphics card,
#   which is already being managed outside bumblebee.
#   This option doesn't hurt and it is required on platforms running
#   more than one nvidia graphics card with the proprietary driver.
#   (E.g. Macbook Pro pre-2010 with nVidia 9400M + 9600M GT).
#   If this option is not set, the new Xorg may blacken the screen and
#   render it unusable (unless you have some way to run killall Xorg).
    Option "ProbeAllGpus" "false"

    Option "NoLogo" "true"
    Option "UseEDID" "false"
    Option "UseDisplayDevice" "none"

Nouveau driver:

lucas@lucas-ThinkPad-W520:~$ more /etc/bumblebee/xorg.conf.nouveau  Section "ServerLayout"
    Identifier  "Layout0"
    Option      "AutoAddDevices" "false"
    Option      "AutoAddGPU" "false" EndSection

Section "Device"
    Identifier  "DiscreteNvidia"
    Driver      "nouveau"

#   If the X server does not automatically detect your VGA device,
#   you can manually set it here.
#   To get the BusID prop, run `lspci | egrep 'VGA|3D'` and input the data
#   as you see in the commented example.
#   This Setting is needed on Ubuntu 13.04.
#   BusID "PCI:01:00:0"

Bumblebee configuration:

lucas@lucas-ThinkPad-W520:~$ more /etc/bumblebee/bumblebee.conf 
# Configuration file for Bumblebee. Values should **not** be put between quotes

## Server options. Any change made in this section will need a server restart
# to take effect. [bumblebeed]
# The secondary Xorg server DISPLAY number VirtualDisplay=:8
# Should the unused Xorg server be kept running? Set this to true if waiting
# for X to be ready is too long and don't need power management at all. KeepUnusedXServer=false
# The name of the Bumbleblee server group name (GID name) ServerGroup=bumblebee
# Card power state at exit. Set to false if the card shoud be ON when Bumblebee
# server exits. TurnCardOffAtExit=false
# The default behavior of '-f' option on optirun. If set to "true", '-f' will
# be ignored. NoEcoModeOverride=false
# The Driver used by Bumblebee server. If this value is not set (or empty),
# auto-detection is performed. The available drivers are nvidia and nouveau
# (See also the driver-specific sections below) Driver=
# Directory with a dummy config file to pass as a -configdir to secondary X XorgConfDir=/etc/bumblebee/xorg.conf.d

## Client options. Will take effect on the next optirun executed. [optirun]
# Acceleration/ rendering bridge, possible values are auto, virtualgl and
# primus. Bridge=auto
# The method used for VirtualGL to transport frames between X servers.
# Possible values are proxy, jpeg, rgb, xv and yuv. VGLTransport=proxy
# List of paths which are searched for the primus libGL.so.1 when using
# the primus bridge PrimusLibraryPath=/usr/lib/x86_64-linux-gnu/primus:/usr/lib/i386-linux-gnu/primu s
# Should the program run under optirun even if Bumblebee server or nvidia card
# is not available? AllowFallbackToIGC=false


# Driver-specific settings are grouped under [driver-NAME]. The sections are
# parsed if the Driver setting in [bumblebeed] is set to NAME (or if auto-
# detection resolves to NAME).
# PMMethod: method to use for saving power by disabling the nvidia card, valid
# values are: auto - automatically detect which PM method to use
#         bbswitch - new in BB 3, recommended if available
#       switcheroo - vga_switcheroo method, use at your own risk
#             none - disable PM completely
# https://github.com/Bumblebee-Project/Bumblebee/wiki/Comparison-of-PM-methods

## Section with nvidia driver specific options, only parsed if Driver=nvidia [driver-nvidia]
# Module name to load, defaults to Driver if empty or unset KernelDriver=nvidia-current PMMethod=auto
# colon-separated path to the nvidia libraries LibraryPath=/usr/lib/nvidia-current:/usr/lib32/nvidia-current
# comma-separated path of the directory containing nvidia_drv.so and the
# default Xorg modules path XorgModulePath=/usr/lib/nvidia-current/xorg,/usr/lib/xorg/modules XorgConfFile=/etc/bumblebee/xorg.conf.nvidia

## Section with nouveau driver specific options, only parsed if Driver=nouveau [driver-nouveau] KernelDriver=nouveau PMMethod=auto XorgConfFile=/etc/bumblebee/xorg.conf.nouveau

Thank you.

Best Answer

First of all, I stopped trying with 12.04.3 or 12.04.4 LTS and used 13.10 instead. I believe the LTS versions cannot practically keep up with the ever-changing graphics situation - and I learned the hard way.

Here are the general steps that I took:

1) Install latest intel drivers, hope that intel-virtual-output, which is the integrated version of screenclone. If it's not packaged, compile that stuff from source.
2) In your xorg.conf.nvidia ensure the option preventing external screens is disabled.
3) Xrandr as usual :)

This resource is helpful:

http://www.unixreich.com/blog/2013/linux-nvidia-optimus-on-thinkpad-w520w530-with-external-monitor-finally-solved/

I also created a blog post on this issue for Ubuntu 14.04:

http://blog.lukeswart.net/wordpress/

The latter should also have information to help a beginner when compiling the drivers from source.

PS: As a Linux novice, this process was very time consuming and I can only hope that this post helps someone. Setting up an external monitor on a laptop running Optimus with display ports that are hard-wired to the Nvidia chip is a very discouraging process to a new Linux user.

As a user who needs to use Linux for my work, this whole situation over protecting proprietary Optimus drivers brings embarrassment upon the whole tech community.