Ubuntu 14.10 e posterior: É muito, muito mais simples lá. Por favor, veja esta resposta e meu comentário abaixo.
Nota : Isso funciona apenas no Ubuntu 13.04. Existem algumas diferenças na 13.10.
Eu consegui conectar dois monitores externos (além do painel embutido) ao meu ThinkPad T430 no Ubuntu 13.04, com o Optimus ("Switchable graphics") ativado (opção 3 em sua lista). Os monitores são conectados através da interface DVI, um deles é girado. Ao contrário de outras soluções, todos os monitores são conectados ao mesmo gerenciador de janelas, para que as janelas possam ser movidas livremente entre os monitores. Isso atinge o objetivo de aumentar a vida útil da bateria se desconectada e o uso de monitores externos se conectado.
A idéia principal aqui é:
- O adaptador gráfico interno é responsável por gerenciar a imagem (bitmap) que é realmente exibida
- Por padrão, tudo é renderizado no adaptador gráfico interno
- Os aplicativos acelerados por GPU usam o adaptador gráfico discreto, a saída é copiada para o adaptador gráfico interno
- Para cada monitor externo, o adaptador gráfico interno fornece uma exibição "virtual"
- A saída para os monitores externos ocorre usando um segundo servidor X, o conteúdo das telas "virtuais" é constantemente copiado para o segundo servidor X
O prefeito benefício sobre outras soluções é que todos os monitores são (aparentemente) parte da mesma sessão X, para que você possa mover livremente as janelas entre os monitores.
Até agora, não notei nenhuma penalidade de desempenho.
Instruções
Você precisa fazer o seguinte:
- Instale o Bumblebee a partir de um PPA
- Crie e instale um driver de vídeo Intel personalizado
- Baixe, compile e finalmente instale um pequeno programa
- Edite dois arquivos de configuração
- Reinicie várias vezes
Para a maioria das ações, você precisará de um terminal, um editor de texto e acesso root ( sudo
). Instruções detalhadas são fornecidas abaixo.
Instale o Bumblebee
Siga a seção "configuração básica" das instruções . Executar como root, o último comando realmente inicia a reinicialização:
add-apt-repository ppa:bumblebee/stable
apt-get update
apt-get install bumblebee virtualgl linux-headers-generic
reboot
Não tente executar o zangão apenas com o driver nouveau? . Da minha experiência, não funciona, pelo menos não nesta configuração.
Validação
Você deve ser capaz de executar optirun glxgears
.
Instale uma versão corrigida do xserver-xorg-video-intel
Opção 1: Instalar a partir do meu PPA (atualmente apenas o Ubuntu 13.04)
Execute o seguinte como root:
add-apt-repository ppa:krlmlr/ppa
apt-get update
apt-get install xserver-xorg-video-intel
Opção 2: Construa e instale seu próprio pacote
Escolha o patch mais recente para xserver-xorg-video-intel
. Clique no arquivo, clique no botão "Raw", copie o URL no navegador. No momento da redação deste documento, era https://raw.github.com/liskin/patches/master/hacks/xserver-xorg-video-intel-2.20.14_virtual_crtc.patch .
sudo apt-get build-dep xserver-xorg-video-intel
cd ~
apt-get source xserver-xorg-video-intel
cd xserver-xorg-video-intel
# replace the URL below with the one you have noted, if necessary
wget https://raw.github.com/liskin/patches/master/hacks/xserver-xorg-video-intel-2.20.14_virtual_crtc.patch
patch -p1 < *.patch
# The next command will ask for a change log message. Supply something meaningful,
# this will later allow you to distinguish your patched package from the distribution's.
dch -l+virtual
dpkg-buildpackage -b
cd ..
sudo dpkg --install xserver-xorg-video-intel_*.deb
Validação (1), para ambas as opções
O comando
apt-cache policy xserver-xorg-video-intel
deve mostrar a versão corrigida ( +virtual
sufixo) e a versão original do Ubuntu.
Necessário para 13.04, para ambas as opções
Adicione o seguinte ao seu /etc/X11/xorg.conf
, crie se necessário:
Section "Device"
Identifier "intel"
Driver "intel"
Option "AccelMethod" "uxa"
Option "Virtuals" "2"
EndSection
Validação (2), para ambas as opções
Após uma reinicialização, execute xrandr
em um terminal. A saída deve listar dois monitores virtuais adicionais.
Faça o download e construa o screenclone
Obtenha o fork do puetzk do screenclone e suas dependências e compile-o.
sudo apt-get install libxcursor-dev libxdamage-dev libxinerama-dev libxtst-dev git build-essential
cd ~
git clone git://github.com/puetzk/hybrid-screenclone.git
cd hybrid-screenclone
make
Validação
O arquivo screenclone
existe e é executável. (Ainda não funcionará.)
Editar xorg.conf.nvidia
- Abra o arquivo
/etc/bumblebee/xorg.conf.nvidia
em um editor de texto, como root
- Comente ou remova as linhas que lêem
UseEDID
ouUseDisplayDevice
- No
Section "ServerLayout"
, adicione uma entradaScreen "Screen0"
Na parte inferior do arquivo, adicione o seguinte:
Section "Screen"
Identifier "Screen0"
Device "Device0"
DefaultDepth 24
SubSection "Display"
Depth 24
EndSubSection
EndSection
Reiniciar
Teste
Minha configuração pressupõe um monitor paisagem conectado à primeira porta DVI da estação de acoplamento e um retrato conectado à segunda porta DVI. Execute os seguintes comandos em um terminal no diretório em que o screenclone está localizado , adapte conforme necessário.
xrandr --output LVDS1 --output VIRTUAL1 --mode 1920x1200 --right-of LVDS1 --output VIRTUAL2 --mode 1920x1200 --right-of VIRTUAL1 --rotate left
./screenclone -b -x 1:0 -x 2:1 &
sleep 1
xrandr -d :8 --output DP-2 --right-of DP-1 --rotate left
fg
Observe como a rotação da tela deve ser definida duas vezes. Você pode omitir a segunda chamada xrandr
se nenhuma rotação for desejada (e, é claro, --rotate left
a primeira chamada).
Ao finalizar screenclone
com Ctrl + C (que foi colocado em primeiro plano novamente fg
), o adaptador gráfico discreto é desligado. Você pode verificar isso com cat /proc/acpi/bbswitch
. Ainda assim, o espaço da tela é reservado para os dois monitores agora desconectados. Para voltar apenas à tela do laptop, use
xrandr --output LVDS1 --output VIRTUAL1 --off --output VIRTUAL2 --off
Limpar
Copie screenclone
para um diretório que esteja no PATH
(por exemplo, /usr/local/bin
)
Crie um bash
script para automatizar a inicialização e o desligamento dos monitores externos. Este script configura telas externas no início e muda para a tela do laptop apenas na saída (por exemplo, pressionando Ctrl + C).
#!/bin/bash
set -m
xrandr --output LVDS1 --output VIRTUAL1 --mode 1920x1200 --right-of LVDS1 --output VIRTUAL2 --mode 1920x1200 --right-of VIRTUAL1 --rotate left
trap "xrandr --output LVDS1 --output VIRTUAL1 --off --output VIRTUAL2 --off" EXIT
screenclone -b -x 1:0 -x 2:1 &
sleep 1
xrandr -d :8 --output DP-2 --right-of DP-1 --rotate left
fg
Opção alternativa: Minha coleção de scriptlets contém dois scripts extmon-start
e extmon-stop
, que ativam e desativam o segundo e o terceiro monitor. Edite o extmon-start
script para se adequar à sua configuração.
Referências
Minha resposta baseia-se principalmente nos seguintes recursos: