이것 저것 찾아보았지만 dualhead를 사용하기 위해서는 xrandr(Xorg RandR)을 통해서 하는 것이 현재로서는 가장 수월한 것 같다. (실제로는 옛날 방법들은 잘 먹질 않는다 -.-;)

Virtual screen 설정
일단 xrandr로 dualhead를 사용하기 위해서는 내부화면이든 외부 화면이든 이것들을 합한 것은 하나의 virtual screen에 들어가야 한다. 그런데 intel 945GM chipset의 경우 virtual screen의 크기가 2048x2048을 넘으면 그래픽 가속 기능이 지원되지 않는다고 한다. 그렇게 되면 화면이 진짜 답답하게 움직인다. 그건 용납할 수가 없으니 어쩔 수 없이 virtual screen의 크기는 일단 최대로 잡아서 2048x2048로 설정한다. 이것은 /etc/X11/xorg.conf 에서

Section "Screen"
   Identifier "Default Screen"
   Monitor "Configured Monitor"
   Device "Configured Video Device"
   SubSection "Display"
     Virtual 2048 2048
   EndSubSection
EndSection

와 같이 수정하여 설정할 수 있다.

외부 monitor 활성화 방법
터미널에서 xrandr 명령어를 통해서 활성화할 수 있다. intel 945GM 칩셋의 문제로 virtual screen이 2048x2048을 넘을 수 없기 때문에 외부 화면은 내부 화면의 아래쪽에 붙도록 설정한다. (오른쪽이나 왼쪽에 붙게 하면 가로 길이가 2048을 넘는다. ex, 1366 + 1024 = 2390. 위, 아래로는 여유가 있다. ex, 768 + 1200 = 1968. 그런데 오른쪽이 아니라 아래에 붙게 하면 간혹 좀 헷갈린다. 뭐, 그래도 어쩔 수 없다.)
$ xrandr --output VGA --auto --below LVDS
위 명령에서 VGA는 외부 output이고 LVDS는 내부 output이다. 끌 때는
$ xrandr --output VGA --off
라고 한다.

내부/외부 monitor의 우선순위
xrandr이 훌륭히 일을 처리해 주긴 하지만 중요한 문제가 하나 있다. xrandr로 외부 모니터를 활성화시키면 이것이 주화면이 된다는 것이다. 이것은 VAIO의 내부 LCD가 두번째 CRTC에서만 구동되기 때문이고, 외부 VGA output은 첫번째와 두번째 CRTC 중 어느쪽이라도 사용할 수 있기 때문이다. 그리고 모니터 두개가 다 활성화되면 첫번째 CRTC에서 구동되는 외부 모니터가 목록상 첫번째 녀석이기 때문에 이것이 주화면이 된다. 이걸 제대로 바로잡는 것은 내 힘으로 해결할 수 있는 건 아닌 듯하다.

어쨌거나 이것이 일으키는 가장 큰 문제는 dualhead 상황에서 gnome-panel이 외부 화면으로 옮겨 붙어 버린다는 것이다. 보통의 경우라면 그다지 큰 문제는 아니겠지만 presentation을 하는 경우라면 외부 모니터가 활성화되자마자 사람들은 내 gnome-panel을 보게 될 것이다. 뭔가 찜찜해지게 된다. 다음 글에서 이것을 해결하기 위한 트릭을 찾았다. (아래 URL 참조) 모든 것이 자동으로 후다닥 일어나게 하려면 Fn+F7 펑션키로 구동되는 스크립트에 위 글에서 찾은 꽁수도 포함시켜야 할 듯 하다. 어쨌든 다음의 간단한 명령어를 사용한다.
$ gconftool-2 --type int --set /apps/panel/toplevels/top_panel_screen0/monitor 1
위의 명령어는 외부 모니터가 활성화될 때마다 항상 실행해야 한다. 내부 모니터 하나만 활성화되어 있을 때에는 gnome이 이것을 monitor 0로 인식한다. 실제로 CRTC 1에서 돌고 있더라도 순서만 인식한다. 여기에 외부 모니터가 활성화되면 CRTC 0에서 구동되는 외부 모니터가 순서상 앞이기 때문에 monitor 0가 되고 내부 모니터는 밀려서 monitor 1이 된다. 외부 모니터를 끄면 다시 내부 모니터가 monitor 0가 되는 식이다.

Function key (Fn+F7) 동작 설정
이를 위해서는 두가지 일을 해야 한다.
  • Function key (Fn+F7)를 누르는 acpi event가 발생했을 때 어떤 스크립트가 실행될 것인지를 정한다.
  • 실제 실행될 스크립트를 작성한다.

첫번째 것은 /etc/acpi/events/ 에 acpi가 구동될 때 읽어들일 file을 만들어서 스크립트를 등록하는 작업이다.


곁다리 열기



VAIO TZ27LN 모델의 경우에 등록해야 하는 키 입력 event는 acpi_listen 명령으로 알 수가 있다. terminal에서 다음과 같이 명령하고
$ acpi_listen -t 10
10초 안에 Fn+F7 (LCD와 모니터 그림이 있음) 키를 두세번 천천히 누른다. (-t 10은 10초 동안 acpi event를 잘 듣고 화면에 출력해 준다는 뜻. 그런데 man page를 다 읽어보진 않았지만 acpid에 의해 잡히지 않는, 그러니까 이미 등록돼 있지 않은 event만 여기에 잡히는 것 같음.)
yhyang@beren:~$ acpi_listen -t 5
sony/hotkey SPIC 00000001 00000012
sony/hotkey SPIC 00000001 0000003b
sony/hotkey SPIC 00000001 00000012
sony/hotkey SPIC 00000001 0000003b
sony/hotkey SPIC 00000001 00000012
sony/hotkey SPIC 00000001 0000003b
대충 위와 같은 결과를 보여준다. 0012로 끝나는 것은 키가 눌렸을 때, 003b로 끝나는 것은 키가 release됐을 때의 event이다. (위의 예에서는 Fn+F7 키를 5초 안에 세번 눌렀음.) http://ubuntuforums.org/showthread.php?p=3986738&highlight=VGA#post3986738 에 있는 것과는 약간 다른데 HKEY가 아니고 SPIC가 붙어 있다. 무슨 차이가 있는지는 잘 모르겠지만 일단은 실제 acpi_listen으로 알아낸 것을 쓰기로 한다.

앞에서 알아낸 event를 등록하기 위해서는 /etc/acpi/events/ 에 설정 file을 만들어 넣어야 한다. 이름은 아무거나 해도 되는데 http://ubuntuforums.org/showthread.php?p=3986738&highlight=VGA#post3986738 에 있는 것을 따라서 sony-lcd-mode로 한다. 내용도 거의 그대로 하는데 screen_VGAon() 함수에서 외부 모니터를 켜는 방법을 그냥 --auto가 아니고 --below LVDS가 되게 한다.

function screen_VGAon(){
$SU "export DISPLAY=$DISPLAY; xrandr --output $EXTERNAL_OUTPUT --auto --below $INTERNAL_OUTPUT"
}


패널 위치 조정

그리고 앞에서 panel의 위치를 재조정해주는 것을 추가한다. (이게 잘 안되네)


잘 안되는 이유를 찾아봤는데 다음 글에서와 같이 dbus session id와 관련이 있는 듯하다.
http://ubuntuforums.org/archive/index.php/t-961726.html

일단 DBUS_SESSION_BUS_ADDRESS를 읽어들이는 부분을 추가한다.
# Figure out DBUS session id
source /home/$ON_USER/.dbus/session-bus/`cat /var/lib/dbus/machine-id`-0
export DBUS_SESSION_BUS_ADDRESS

그리고 screen_VGAon() 함수에 panel 위치를 재조정해주는 것을 추가한다.
function screen_VGAon(){
$SU "DISPLAY=$DISPLAY xrandr --output $EXTERNAL_OUTPUT --auto --below $INTERNAL_OUTPUT"
sleep 2
$SU "DISPLAY=$DISPLAY DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS gconftool-2 --type int --set /apps/panel/toplevels/top_panel_screen0/monitor 1"
}

여기에서 중간에 sleep 2가 들어간 것은 외부 모니터를 켠 후에 2초간 기다렸다가 panel 위치를 재조정하라는 것인데, 외부 모니터를 켜고 바로 gconftool을 실행하면 panel이 먹통이 돼 버린다. 이유는 아직 못 찾았다. 최소 2초 기다려서 panel이 외부 모니터로 넘어가면 gconftool을 실행한다. sleep 2 정도면 외부 모니터가 켜지고 약간의 지연 시간이 있는 것을 감안하면 외부 모니터에 실제 보이는 시간은 정말 순간이다. 외부 모니터가 반응이 너무 좋다면 낭패 -.-;;



TODO
  • 화면을 두개를 쓰면 배경화면이 두 화면에 늘어져서 보인다. 한 화면에 하나씩 보이도록 설정 할 것. 이것은 nautilus와 compiz의 충돌 때문이다.
    그런데, 다음 글에 보면 Ubuntu 9.04에 가서나 해결될 것이라고 한다. -.-;;
    http://brainstorm.ubuntu.com/idea/93/


참조 URL들

ps. Tomboy에 적어 놓았던 것을 그냥 긁어 붙이니 영 이상하다. html로 export해서 그것을 그냥 긁어 붙여도 이상하고 html 모드에서 소스를 긁어 붙여도 역시 이상하다. 깔끔하게 옮겨지질 않네.


  
트랙백   |  댓글   |

아... 이건 별로 영양가도 없고 시간 많이 잡아먹는 삽질인데, 어쨌든 시작한 거라 일단은 어디까지 할 수 있나 알아보도록 하자. (이런 거 할 때가 아닌데...)

연결 준비

일단 PC쪽 환경은 VAIO VGN-TZ27LN 노트북에 ubuntu 8.10 Ibex Intrepid가 깔려 있는 상태이다. PC쪽에서 bluetooth를 가능하게 하려면 대충 다음의 패키지들을 설치해야 한다. 다른 패키지가 필요하다고 하면 그것들도 같이 설치해 준다.

  • bluez-gnome: bluetooth applet을 띄우고 각종 bluetooth 기기들의 등록과 연결을 처리한다. (이건 아마 대부분 깔려 있을 것임)
  • gnome-vfs-obexftp: bluetooth 기능이 있는 기기와 파일을 주고 받으려면 필요하다고 한다.
  • gnome-bluetooth: gnome-obex-server가 들어 있다. 폰 쪽에서 연결할 때 필요하다.

폰 쪽은 모델마다 다르겠지만, IM-S370 모델의 경우는 메뉴->sky 프로그램->블루투스에서 설정을 할 수가 있다. 일단 블루투스 on/off 에 들어가서 bluetooth 장치의 전원을 켠다.(당연하지) 그리고 자기정보에서 이름을 바꿔준다. 안 바꿔줘도 되지만 기왕이면 자기가 알아보기 쉬운 이름을 정해주는 것이 좋겠다. 그리고 환경설정에서 보안모드1(보통)으로 바꿔준다. 폰의 설명서에는 모드1에서는 경우에 따라서 패스키를 생략할 수 있는 모드라고 돼 있는데, 다른 문서(Service authorization issues 부분)를 보면 bluetooth에 본래 security mode가 셋 있다. 1에서는 패스키를 아예 사용하지 않고, 2에서는 service level에서만 사용하고, 3에서는 link level에서 사용한다고 한다. 즉, 3에서는 서비스 레벨에서 패스키를 이미 교환했던 건 어쨌건 link를 만들기 전에 항상 패스키를 사용하는 것이고, 2에서는 서비스 레벨에서 패스키를 이미 교환했으면 다시 또 패스키를 교환하지는 않는 것으로 추정된다. (더 자세한 것은 내가 bluetooth를 전공할 것도 아니라 살펴보지 않았다.) 어쨌든, 폰에서 보안모드2(패스키 항상 확인)을 선택하면 PC와 연결할 때 PC쪽에서 패스키를 설정할 수가 없다. 폰에서 보안모드1(패스키 때때로 생략)을 선택하면 처음 연결할 때 한번 패스키를 확인한다.

기기 등록

PC에서 블루투스 애플릿에 오른쪽 클릭을 하고 Setup new device...를 누르면 bluetooth device wizard가 실행된다. 여기에서 다음을 누르고 조금 기다라면 자신의 폰이 목록에 나온다. (앞에서 이름을 설정했으면 그 이름이 보인다.) 폰을 선택하고 다음을 누르면 connecting... 어쩌구 하면서 그 다음 줄에 패스키(PIN) 번호가 나온다. 폰 쪽에서는 패스키를 입력하라는 화면으로 바뀌었을 것이고 PC쪽에서 나온 PIN 번호를 폰에서도 입력해 준다. 그러면 일단 service level에서 키를 교환하고 이게 계속 유지되는 모양이다. 이렇게 한번 인증하고 나면 나중에 폰의 등록 기기 목록에서도 PC 쪽이 나오는 것을 확인할 수 있다.

사용하기

일단 인증은 했지만 그 다음에 할 수 있는 것은 사실 그리 많지 않은데 (사실은 다른 건 어떻게 하는지 못 찾아봤다.) 우선 파일 전송을 해 보도록 한다. PC에서 bluetooth applet을 오른쪽 클릭하고 Browse files on device...를 선택하면 기계들 목록이 나온다. 거기에서 자신의 폰을 선택하면 nautilus 창이 하나 새로 뜨고 거기에 폰에 저장돼 있는 사진 목록이 뜬다. 여기에서 파일을 옮기거나 이것 저것을 할 수 있다. 그외에 nautilus 창에서 전송하고 싶은 file에 오른쪽 클릭을 한 후에 보내기 context menu에서 바로 폰으로 file을 전송할 수도 있다.

폰 쪽에서 PC로 연결하기 위해서는 gnome-obex-server라는 것이 필요한데 gnome-bluetooth 패키지를 설치하면 들어 있다. 설치 후에 주메뉴->보조 프로그램->Bluetooth File Sharing을 선택해서 실행하면 서버가 실행되고 시스템 트레이(notification area)에 서버 동작 상태를 알려주는 아이콘이 생긴다.

file 전송 중일 때는 아이콘이 움직임


폰 쪽에서 PC로 연결을 하면 PC 쪽에서는 연결을 허용할 것인지를 묻는 화면이 나오는데, 자신의 폰이라면 "이 기기에서 항상 연결"을 선택하면 다시 허용 여부를 묻지 않고 항상 연결한다. 폰 쪽에서 PC로 연결할 때에는 그냥 file 전송 외에 주소록 항목을 전송할 수도 있다. vcf 형식으로 항목 하나당 한 file로 전송된다.

폰에서 이미지 파일을 전송했을 때

폰에서 주소록 항목을 전송했을 때


문제점들

문제는 몇 가지가 있는데, 일단 gnome-phone-manager라는 것이 동작하지 않는다. 이 프로그램은 bluetooth를 통해서 폰의 이러저러한 소소한 기능들(메시지 보내기/받기, 주소록 싱크, 일정 싱크 등등)을 PC에서 이용할 수 있도록 해준다고 한다. 이 패키지를 깔면 gnokii-common, libbtctl4, libgnokii3, libgnomebt0, libical0 등이 같이 깔린다. 하지만 SKY 폰하고는 연결이 되지 않는다. nokia 계열 폰하고는 잘 붙는 모양이다.

폰에서 PC로 파일을 전송하면 이미지 파일이든 주소록 항목이든 모두 사용자의 홈 디렉토리에 저장된다. 성가신데 저장 위치를 바꾸려면 gconf-editor로 설정을 바꿔줘야 한다. gnome-obex-server 인터페이스 자체에서 설정할 수 있는 방법을 제공하지 않으니 불편하다.

PC에서 폰으로 전송할 수 있는 것은 이미지 파일 중에서도 jpg 형식 뿐인 것 같다. (주소록 항목(vcf file)을 전송하는 것은 시험해 보지 않았음) 그것도 보통 아무 file이나 전송하면 SKY 폰의 문제인지 file 크기가 지원되지 않는 것이라고 메시지를 내고 폰에 저장되지 않는다.

결론

뭐, 결국 현 상황에서 bluetooth로 폰을 활용하는 것은 폰에서 찍은 사진을 데이터 케이블을 사용하지 않으면서(당연이 sky에서 제공하지 않는 데이터 매니저를 사용하지 않으면서) ubuntu가 돌아가는 PC로 전송하는 것이다. 다른 것은 잘 안되거나 문제가 있거나 활용도가 떨어진다.


  
트랙백   |  댓글   |

ubuntu는 기본적으로 gnome 데스크탑 환경을 사용하는데 AWN 같은 것도 써 봤지만 아무래도 제일 무난하게 쓸 수 있는 것은 gnome-panel이다. 그런데 이 gnome-panel을 쓰다가 panel에 올려 놓은 applet이나 object들의 위치가 간혹 이리저리 엉키는 현상이 발생하곤 한다. 그러면 applet들 위치를 맞춰주느라고 또 이리저리 마우스질을 해야 하니 여간 귀찮은 것이 아니다. launchpad에 있는 이 글이나 brainstorm.ubuntu.com에 있는 이 글 같은 곳에 이런저런 얘기들이 있는데 모두 다 읽고 나서 ubuntu 8.10 intrepid ibex의 경우에는 문제들이 많이 호전됐다는 것을 알 수 있다. 그래도 applet들을 추가하고 마우스로 위치를 지정한 경우에는 어느 순간에 가면 엉키는 현상은 여전히 생긴다. 지금은 panel에 올릴 수 있는 applet들을 꽤 둘러본 상태고 더 이상 새로 applet을 추가할 일도 거의 없을 것 같기에 applet들 위치를 확정적으로 고정하기로 했다. 위에 링크한 첫번째 글에 중요한 hint들이 많이 들어 있다.

우선 손을 보기 전의 panel의 모양은 이런 상태였는데 한 번 엉키고 나서 마우스로 이리저리 조정한 것이다. 거기에 리붓을 하고 나면 또 이런 식으로 배치가 영 찜찜하고 간격도 생긴다.


위 링크한 글들에 의하면 gconf-editor를 통해서 applet의 위치를 직접 수치를 입력해서 지정해 줄 수가 있다는 것을 알 수 있다.


위 화면은 gconf-editor를 열고 /apps/panel 아래를 연 모습이다. applets에 보면 10개의 applet이 현재 등록돼 있고, objects에 보면 5개의 object들이 등록돼 있다는 것을 볼 수 있는데, applets에 있는 것들은 말 그대로 applet인 것들이고, objects에 들어 있는 것은 메뉴 항목이나 구분선이나 프로그램 실행 단축 아이콘 같은 것들이다. general 항목을 보면 현재 panel에 올라와 있는 applet들과 object들이 모두 나열돼 있다.


하나의 예로 applet_0을 보면 object_type이 bonobo-applet이라고 돼 있고 위치는 panel의 왼쪽 끝을 기준으로 1231 픽셀 우로 이동한 곳이다. bonobo_iid가 OAFID:GNOME_GWeatherApplet이라고 돼 있는 것으로 첫번째 스크린샷에서 오른쪽에서 두번째인 날씨 애플릿인 것을 알 수가 있다. position 바로 위에 있는 panel_right_stick이 체크돼 있는 경우는 위치를 panel의 오른쪽 끝을 기준으로 지정하게 된다. 패널의 왼쪽 끝은 상관 없이 오른쪽에 정렬해서 붙일 경우에 유용하다.

이제 삽질의 시간인데, applet들의 bonobo-iid를 보면서 어떤 applet인지 확인하고 object들의 경우는 object_type이나 launcher_location 등을 보면서 실제 어떤 녀석인지 확인한다. 기억력에 자신이 있으면 applet이나 object들을 하나씩 확인하면서 바로 위치를 지정해도 되고, 그렇지 않으면 어딘가 적어 놔도 된다. 어쨌든, 위치는 오른쪽 끝이든 왼쪽 끝이든 첫번째 녀석은 0, 그 다음은 1, 그 다음은 2, 이런 식으로 한다. 위치는 픽셀 단위이지만 panel에 applet이나 object들이 실제 올라갈 때는 겹치지 않도록 적당히 위치를 이동하게 된다. 1 픽셀 단위로 적어 놓으면 applet이나 object들이 사이에 간격 없이 잘 배열된다. 위치를 지정하면서 여섯번째에 있는 locked 항목도 체크해 준다.

이런 식으로 지정하면 실제 applet들의 위치가 바로 이동하지는 않는다. 그렇다고 또 마우스질을 할 수는 없으니 panel을 다시 띄운다. panel을 다시 띄우기 전에 gconf-editor에서 수정한 내용을 백업해 놓는다(만일을 위해서^^).

$ gconftool-2 --dump /apps/panel > panel.gconf

같은 식으로 하면 된다. panel이 떠 있다는 것은 gnome 세션의 기본 구성 요소에 panel이 포함돼 있다는 뜻이기 때문에 kill 명령으로 죽이면 gnome이 panel이 죽은 것을 감지하고 새로 띄우게 된다. (windows에서 explorer가 말썽을 부려서 프로세스를 죽이면 다시 뜨는 것과 유사하다.) 이런 식으로 한다.


panel이 다시 뜨고 나면 좀 보기가 나아진다. 필요한 applet들은 낭비하는 공간 없이 다닥다닥 붙어 있고, 위치가 엉키지도 않는다.


  
트랙백   |  댓글   |

사실 이건 google에서 "ubuntu wlan blinking" 정도로만 검색해도 답이 나오는 것이긴 한데, 문제는 눈에 바로 보이는 답을 적용하면 해결이 안된다는 것이다. -.-;

구글링으로 바로 얻게 되는 답은 아마도 이것이 될 터인데:
http://blog.drinsama.de/erich/en/linux/2008052101-iwlwifi-blinking.html
VAIO-TZ27 모델의 경우는 저걸로 해결이 안된다. 보다 자세한 얘기들이 launchpad에 있는데, 한참을 읽어 보면 어떤 모델에서는 이렇게 하면 되고, 어떤 모델에서는 다르게 해야 하고 하는 얘기들이 한참 나온다. 결론부터 얘기하면 VAIO-TZ27의 경우에는 다음의 스크립트를 써야 한다.

#!/bin/sh
if [ "$IFACE" = "wlan0" ]; then
    for dir in /sys/class/leds/iwl-phy*assoc; do
        echo none > $dir/trigger
    done
fi

/sys/class/leds 디렉토리에 보면 총 4개의 subdirectory들이 있는데 "iwl-phy*:" 같은 접두어가 붙어 있는 TX, RX, assoc, radio이다. 추측해 보자면, TX, RX는 말 그대로 데이터가 송신/수신될 때, assoc는 무선랩 접속이 일어날 때 (associate이라고 부르는 동작이다), radio는 주변에 AP가 있을 때(그러니까 어디선가 전파가 잡히고 있을 때이다) wlan LED를 깜빡이게 하는 것 같다. 첫번째 링크에 있는 해결책이 본래 정석이 맞을 거다: AP가 잡힐 때와 association이 일어날 때는 깜빡여주는 게 좋고, TX/RX 일 때에는 성가시니 끈다. 그런데, 문제는 노트북 모델마다 저게 다른 것 같다는 거다. 아마 현재 커널(2.6.27-11)의 driver가 VAIO 모델에서 정확하게 들어맞지 않기 때문인 것 같다. 그래서 각각의 subdirectory의 trigger를 끄나 안 끄나 동작이 좀 요상해 지는데, 데이터가 송수신되고 있을 때 깜빡이는 건 assoc에 연결돼 있는 모양이다. VAIO는 이래저래 하드웨어가 잘 지원되지 않는 면이 있네. -.-;


  
트랙백   |  댓글   |
 이전  1   다음 

최근댓글
fotowall :: ncloud RSS Feeds today :    yesterday :
total :