Ubuntu 14.10 e posterior: é muito, muito mais simples lá. Por favor, veja esta resposta e meu comentário abaixo.
Nota : Isso só funciona no Ubuntu 13.04. Existem algumas diferenças em 13.10.
Eu consegui conectar dois monitores externos (além do painel embutido) ao meu ThinkPad T430 no Ubuntu 13.04, com o Optimus ("Gráficos Comutáveis") ativado (opção 3 na sua lista). Os monitores são conectados através da interface DVI, um deles é girado. Em contraste com 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 alcança o objetivo de maior duração da bateria se desconectado e usando monitores externos, se conectado.
A ideia principal aqui é:
- O adaptador gráfico interno é responsável pelo gerenciamento da imagem (bitmap) que é realmente exibida
- Por padrão, tudo é renderizado no adaptador gráfico interno
- 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 dos monitores "virtuais" é copiado constantemente para o segundo servidor X
O principal benefício sobre outras soluções é que todas as telas são (aparentemente) parte da mesma sessão X, então você pode mover livremente as janelas entre as telas.
Até agora eu 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 dadas abaixo.
Instale o Bumblebee
Siga a seção "configuração básica" das instruções . Execute 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 bumblebee apenas com o driver nouveau? . Pela minha experiência, não funciona, pelo menos não nesta configuração.
Validação
Você deve conseguir executar optirun glxgears
.
Instalar uma versão corrigida de xserver-xorg-video-intel
Opção 1: Instalar do meu PPA (atualmente apenas 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: crie 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, isso era link .
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
suffix) 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 a reinicialização, execute xrandr
em um terminal. A saída deve listar duas exibições virtuais adicionais.
Baixar e criar screenclone
Obtenha o fork do screenclone do puetzk 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. (Não vai funcionar ainda.)
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 leem
UseEDID
ou UseDisplayDevice
- No
Section "ServerLayout"
, adicione uma entrada Screen "Screen0"
-
Na parte inferior do arquivo, adicione o seguinte:
Section "Screen"
Identifier "Screen0"
Device "Device0"
DefaultDepth 24
SubSection "Display"
Depth 24
EndSubSection
EndSection
-
Reinicializar
Teste
Minha configuração pressupõe um monitor de paisagem conectado à primeira porta DVI da estação de acoplamento e um retrato um conectado à segunda porta DVI. Execute os seguintes comandos em um terminal do diretório onde 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 invocação de xrandr
se nenhuma rotação for desejada (e, é claro, o --rotate left
na primeira invocação).
Ao terminar screenclone
com Ctrl + C (que foi colocado novamente em primeiro plano usando 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 para a tela do laptop somente, use
xrandr --output LVDS1 --output VIRTUAL1 --off --output VIRTUAL2 --off
Limpeza
-
Copie screenclone
para um diretório que esteja no PATH
(por exemplo, /usr/local/bin
)
-
Crie um script bash
para automatizar a inicialização e o desligamento dos monitores externos. Este script irá configurar exibições externas ao iniciar e alternar para a tela do laptop somente 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 desative o segundo e terceiro monitor. Edite o script extmon-start
para se adequar à sua configuração.
Referências
A minha resposta baseia-se em grande parte nos seguintes recursos:
-
link (a descrição original)
-
link (uma versão simplificada do que foi dito acima)
-
link (instruções sobre como habilitar a versão corrigida do driver Intel em 13.04)
-
link (um fork melhorado do screenclone com suporte integrado ao Bumblebee)
-
link (para obter uma lista de dependências)
-
link (com dicas cruciais sobre como ativar a rotação de tela)
-
link (um comentário anterior no GitHub)