Category Archives: UNIX

우분투 firefox에서 SSH protocol 링크

여러대의 서버를 관리하면서, 모니터링할수 있는 페이지를 만들고, 해당 서버를 클릭하면 SSH로 바로 연결할수 있도록 MIME 링크를 만들어서 사용하고 있습니다. MIME 링크 처리는 윈도우즈에서 프로그램을 제작해서 ssh:// 형태의 MIME type에 대해서 처리하게 했습니다. 프로그램은 단순히 putty를 찾아서 실행해주는 간단한 구조입니다.

이걸 리눅스에서 할려고 했더니 어떻게 해야하는지 좀 헤맸습니다. mime type이라는 건 서버에서 파일이 내려갈때 HTTP header에 붙어서 가고, 이를 브라우저에서 처리하는 거라… ssh:// 형태의 링크는 mime 링크로는 처리가 안되고, 이를 처리하는 걸 protocol handler라고 하더군요. 검색어 자체가 잘못되서 해결책을 찾는데 꽤 시간이 걸렸습니다.

먼저 gnome에서 ssh 프로토콜을 프로그램 연결하는 부분입니다.

$ gconftool-2 -s /desktop/gnome/url-handlers/ssh/command ‘/usr/bin/gnome-terminal -e “~/bin/handle_protocol.sh %s”‘ –type string
$ gconftool-2 -s /desktop/gnome/url-handlers/ssh/enabled -t boolean true

참고 URL: http://kb.mozillazine.org/Register_protocol

~/bin/handle_protocol.sh 파일 내용입니다.

#!/bin/sh

link=$1
proto=`echo "$link"|cut -d: -f1`
host=`echo "$link"|cut -d/ -f3`
echo "$proto $host"
exec $proto $host


파일 만들고 실행되도록 chmod 해야 합니다.

$ chmod a+x ~/bin/handle_protocol.sh

이렇게 하면 firefox에서 ssh:// 로 시작하는 링크 누르면 gnome-terminal이 뜨면서 ssh로 연결됩니다. telnet도 똑같은 방법으로 등록하면 사용이 가능합니다.

이렇게 설정했는데 우분투(9.10)에서 원격 접속했을때 윈도우즈에서 putty 이용했을때보다 속도가 많이 느리더군요. /etc/ssh/ssh_config에서 맨 아래 두줄을 주석 처리하면 빨라집니다.

#GSSAPIAuthentication yes
#GSSAPIDelegateCredentials no

출처: http://onlyubuntu.blogspot.com/2007/04/fix-for-ssh-slow-to-ask-for-password-in.html

Varnish 2.0 (웹캐시, 리버스프록시)

Varnish Cache에 대해서 글을 올린지 얼마 안된 듯한데 찾아보니 3년정도가 지났네요. 아직까지 실제 서비스 환경에서는 Varnish를 도입하지 못했었는데… 다시 필요에 의해서 로드밸랜서(+서버단 캐시)를 고려하게 되었습니다.

원래 수동으로 서브도메인별로 나누어서 로드밸런싱을 하고 있었는데, 서브도메인간 자바스크립트 연동의 문제들이 여러곳에서 발생하기 시작해서, 로드밸런서를 도입하려고 합니다. 그외에도 여러가지 장점이 있을듯 하네요.

Varnish가 이제 버전 2.0이 나왔고(나온지 1년 됐네요 –), 여러가지 변화가 있었네요.
현재 버전은 2.0.4 입니다.

1. VCL 언어가 좀더 프로그래밍 언어 다워졌습니다.

VCL 언어가 약간 언어답지 않은 면이 있었는데.. return 등의 도입으로 좀더 설정파일(소스) 보기가 편해졌습니다. 그리고 C언어를 embedding 할수 있는 방법이 있네요.

2. grace 지원

개체(요청결과)를 캐싱할때 expire 시간과 함께 grace 시간을 설정할수 있습니다. expire 시간이 지나고 웹서버(backend)들이 요청 처리를 하지 못할때 grace 시간 동안 캐시에 있는 내용으로 서비스가 됩니다. 또한 expire 시간이 지나는 순간 하나의 웹서버에 하나의 요청만으로 캐시를 업데이트하며 그 동안은 캐시에서 서비스가 되도록 설정할수 있습니다. 예를 들면 메인 페이지가 1초에 100번 요청되고 메인 페이지 처리하는데 2초가 걸린다고 하면, 서버에 원래 200번 요청 들어갈것이 1번만 가면 되는거죠. 웹서버와 디비 입장에서 아주 고마운 일이죠.

3. ESI (Edge Side Script) 일부 지원

 페이지에서 특정 부분은 사용자 정보가 포함되기 때문에 전체 페이지 캐싱이 어려운 경우가 많습니다. 사용자 별로 캐시를 두면 캐시의 의미가 많이 떨어집니다. 이럴 경우 해당 부분만 별도의 페이지로 저장해두고

<esi:include src=”userinfo.php” />

형태로 원본 페이지에 넣어주면 캐시에 그대로 저장되고, 요청을 처리할때 userinfo.php 부분만 웹서버에 요청하여 varnish에서 조합해서 보내줍니다.

ESI가 아주 유용한 기능이기는 하지만 아쉬운 점은 Varnish가 아직 압축을 지원하지 못한다는 점이네요. 웹서버 측에서 페이지를 압축하면 ESI를 쓸수 없고, Varnish 쪽에서 압축할수 있는 방법을 지원하지 않습니다. ESI와 압축을 조합해서 쓸수 있었으면 정말 좋았을텐데 정말 아쉬운 부분이네요.

현재 회사에서 varnish 도입을 위한  테스트중입니다. ESI는 압축 미지원으로 도입에서 제외되었으며, 로드밴런싱, 캐싱 기능, 서버 죽을때 처리 등만 활용하려고 합니다.

grace의 개념을 이해하면서, memcached를 웹에서 사용하는 방법을 비슷한 방법으로 변경을 고려하고 있습니다.

PHP 모든 페이지를 캐싱하기는 로직상으로 문제가 발생할 확률이 커서 정해진 HTTP 헤더가 포함된 PHP 페이지만 캐싱 되도록 설정했습니다. 캐싱해도 안전하다고 생각하는 페이지에 특정 헤더를 포함하면 캐싱이 됩니다.

url.purge 명령으로 정규식에 해당하는 캐싱된 페이지를 날릴수 있는 기능도 활용할 생각입니다. 캐싱이 유용한 페이지이지만 사용자가 글을 등록하고 바로 글이 안보인다던지 하는 문제는 url.purge를 써서 해결하려고 합니다.

CentOS PHP에서 원격 연결 안될때

CentOS 5.x에서 웹서버나 PHP에서 원격서버에 연결할때 기본적으로 SELinux 보안 모듈에서
막나보네요. PHP에서 원격 DB에 연결이 안되서, iptables도 열심히 만지고 PHP소스도 컴파일 다시 하고, tcpdump로 패킷 보고 –; 하여간 삽질하다가 겨우 해결했습니다.

웹서버는 lighttpd, mod_fastcgi 모듈로 PHP 사용중입니다.

아래처럼 웹서버에서 외부로 연결가능하도록 설정가능합니다.

# /usr/sbin/setsebool httpd_can_network_connect=1

원격 DB 연결, PHP에서 get_file_content() 함수로 외부의 데이터를 받을 때, 웹서버에서 mod_proxy 사용등을 할때 아마도 이 설정을 풀어줘야할듯 하네요.

재부팅할때도 적용되게 하려면,

# /usr/sbin/setsebool -P httpd_can_network_connect=1

출처:

https://bugzilla.redhat.com/show_bug.cgi?id=164867

memcachedb = memcached + Berkeley DB

memcached가 메모리에만 저장되기 때문에 서버 재시작하면 내용이 모두 날라갑니다. memcached가 캐시에 최적화되어 개발되어 있기때문에 당연한 거지만… 사용법이 간단하고, 퍼포먼스가 좋다보니 memcached의 간편함과 DB의 persistence를 모두 충족할수 있는 프로그램을 찾게되는듯하네요.

memcachedb는 memcached와 Berkeley DB(오라클이 인수했더군요)를 이용하여 만들어졌으며, 클라이언트는 memcached 프로토콜을 이용하여 접속하며, key, value는 메모리가 아니라 DB에 저장됩니다. 단순한 구조로 되어 있기 때문에 복잡한 DB에 비하면 훨씬 더 빠르게 동작합니다. 또한 replication을 지원하기 때문에, read를 분산하여 처리할수 있습니다. 다만, memcached처럼 여러개의 서버를 파티션해서 사용할수는 없습니다. replication으로 연결하면 write은 모든 서버에서 일어나게 됩니다.

memcachedb와 유사한 프로젝트로 tugela cache가 있습니다. 현재 소스가 더이상 관리가 되지 않고 있지만,  tugela cache도 memcached와 Berkeley DB를 이용하여 만들어졌습니다. memcachedb와의 차이점은 persistency를 추구하지 않는다는 점입니다. 메모리보다 많은 캐시가 필요할때 디스크에 쓰는 형태입니다. replication이 없고 memcached와 마찬가지로 read/write를 모두 분산할수 있습니다. memcached에서 캐시 사이즈가 메모리보다 클때 사용하기에는 memcachedb보다는 tugela cache가 적절합니다.

회사에서 세션정보를 저장하는 데몬을 직접 작성하여, 메모리로 세션을 관리하고, 주기적으로 세션정보를 파일로 쓰고, 시작할때
파일에서 세션정보를 읽도록 해서 관리하는데 이거 작성하는것도 일이죠. 이럴 경우 memcachedb를 이용하면 좋을듯하네요…

repcached – memcached + replication

repcachedmemcached에 리플리케이션(replication) 기능을 추가한 프로그램입니다.

memcached가 cache이기 때문에 세션정보등을 저장하기는 좀 불안한 면이 있죠. 그래서 memcached(repcached)를 두개 띄워놓고, 하나가 중단되더라도 replication을 해두면 보다 안정적으로 서비스 운영이 가능합니다.

repcached 서버를 두군데 띄우고 양쪽으로 리플리케이션 되도록 세팅하면 한쪽에 key,value를 입력하면 다른 서버에도 같은 key,value가 입력됩니다. 그리고 서버 재시작할때 다른쪽 서버의 모든 key,value를 받아오도록 되어있으니, memcached를 재시작해야하거나 서버의 문제로 종료된 경우 캐시를 전부 날리지 않아도 됩니다.

그리고 memcached 클라이언트 라이브러리를 그대로 이용할수 있으므로, 클라이언튼 쪽은 서버에 양쪽 서버 주소만 등록해주면 됩니다.

repcached는 memcached의 패치입니다. 따라서 컴파일하면 memcached 파일이 생성됩니다. 저는 혹시를 위해서 실행파일명을 repcached로 변경하여 설치했습니다.

아래처럼 두개의 호스트에서 repcached를 실행하면 모든 key,value가 공유됩니다.

10.0.0.2> repcached -m 128 -l 10.0.0.2 -p 4001 -d -x 10.0.0.3

10.0.0.3> repcached -m 128 -l 10.0.0.3 -p 4001 -d -x 10.0.0.2

한가지 불편한점은 하나의 호스트에서 리플리케이션하도록 세팅이 불가능해보입니다. -X로 replication에 사용하는 포트를 지정할수는 있지만, 상대편의 replication 포트를 지정하는 옵션이 없어서 어떻게 세팅해야할지 모르겠네요. 하지만 두개의 서버에 나누어 실행하는게 더 안전하므로 실제 서비스 적용할때는 크게 문제가 되지 않을거라 생각되네요.

memcached와 성능상의 차이가 얼마나 있는지는 테스트해봐야할듯하네요.

그리고 memcached와 마찬가지로 메모리가 부족하면 임의의 key,value를 지울듯한데, 세션정보등을 repcached에만 의존해도 되는지 의문이 드네요.

캐시가 날라가면 캐시를 채울때까지의 서버 부하 감소용으로 사용하면 좋을듯하네요. 그리고 read를 분산하는 효과도 있겠죠.

서버/인프라를 지탱하는 기술

얼마전(5월1일)에 서점에 갔다가 상당히 괜찮은 책을 발견했습니다.

“서버/인프라를 지탱하는 기술”

일본서적 번역본인데 이렇게 서버 최적화와 서버 운영에 필요한 기술들에 나온 책은 흔하지 않은듯하네요. 번역본은 더 그렇죠…

무중단 서비스를 위한 다중화 기술에 대한 설명이 자세히 나와있으며, 서버 최적화에 내용도 어느정도 나와있습니다. 리눅스, Apache, MySQL 등의 오픈 소스를 이용한 서버운영에 대한 내용이고, 각각에 대한 최적화에 대한 내용도 있습니다. 하지만, 최적화에 대한 페이지가 제한되어 있는게 좀 아쉽네요. 이름만 듣고 적용하지 못했던 여러가지 툴들에 대한 설명도 볼수 있었습니다. 제가 수동으로 스크립트를 짜서 해오던 일들도 소개된 툴들을 활용해보면 좀더 쉽게 서버관리가 가능할거 같습니다.

목차입니다…

1. 서버/인프라 구축 입문 (다중화/부하분산의 기본)
1.1 다중화의 기본
1.2 웹 서버의 다중화 – DNS 라운드 로빈
1.3 웹 서버의 다중화 – IPVS를 이용한 로드밴런서
1.4 라우터 및 로드밸런서의 다중화

2. 한 단계 높은 서버/인프라 구축 (다중화, 부하분산, 고성능 추구)
2.1 리버스 프록시 도입
2.2 캐시서버 도입
2.3 MySQL 리플리케이션
2.4 MySQL 슬레이브 + 내부 로드밸런서 활용 예
2.5 고속, 경량의 스토리지 서버 선택

3. 무중단 인프라를 향한 새로운 연구 (DNS 서버, 스토리지 서버, 네트워크)
3.1 DNS서버의 다중화
3.2 스토리지 서버의 다중화
3.3 네트워크의 다중화
3.4 VLAN 도입

4. 성능향상, 튜닝 (리눅스 단일 호스트, 아파치, MySQL)
4.1 리눅스 단일 호스트 부하의 진상규명
4.2 아파치 튜닝
4.3 MySQL 튜닝의 핵심

5. 효율적인 운영 (안정된 서비스를 향해)
5.1 서비스의 가동감시 Nagios
5.2 서버 리소스 모니터링 Ganglia
5.3 서버관리의 효율화 Puppet
5.4 데몬의 가동관리 daemontools
5.5 네트워크 부트의 활용 PXE, initramfs
5.6 원격관리 관리회선, 시리얼 콘솔, IPMI
5.7 웹 서버 로그관리

6. 서비스의 무대 뒤 (자율적인 인프라, 다이나믹한 시스템 지향)
6.1 Hatena의 내부
6.2 DSAS의 내부

CentOS 4에서 PHP 5와 XCache 소스로 설치

lighttpd와 병행하여 쓰고 있는데, CentOS 4 버전에서는 SRPM이 PHP4 버전이 디폴트로 되어 있어서, PHP5는 소스를 받아서 설치했습니다. ./configure할때 인자주는게 생각처럼 되지 않아서 좀 헤맸습니다. 오랜만에 PHP 소스를 직접 받아서 설치해봤습니다.

./configure –enable-fastcgi –enable-discard-path
–enable-force-cgi-redirect –with-mysql=/usr/bin/ –with-libdir=lib64  …기타 라이브러리 설정

앞에 –enable-fastcgi enable-discard-path
–enable-force-cgi-redirect 부분은 lighttpd와 fastcgi와 연동하기 위해서 필요한 부분입니다.

–with-mysql=/usr/bin/ –with-libdir=lib64는 mysql 모듈을 사용하도록 한것인데, 64bit MySQL 라이브러리가 깔려있어서 –with-mysql 옵션만 주면 mysql 라이브러리를 못찾더군요.

예전에 SRPM을 설치하면서 필요한 devel 패키지들은 모두 설치되어있어서 따로 yum을 통한 패키지 설치는 없었습니다 ^^

설치는 간단히 sapi/cgi/php-cgi를 /usr/local/bin 쪽에 복사하고, /usr/local/lib/php.ini를 적당히 만들어주고, lighttpd.conf에서 새로운 php-cgi 참조하도록 변경했습니다.

웹서버 재시작하여 정상동작하는거 확인하고 make install하고, 전에 사용하던 PHP관련 RPM들을 삭제했습니다. 컴파일할때 RPM도 같이 설치되어 있으면 문제가 생기더군요.

XCache 소스 받아서 압축풀고 아래대로 했습니다.

$ phpize
$ ./configure --enable-xcache
$ make
$ sudo -s
# make install
# cat xcache.ini >> /usr/local/etc/php.ini
# vi /usr/local/etc/php.ini


php.ini 파일에서 zend_externsion에서 xcache.so 참조하는 부분이 있는데 경로에서 버전정보를 수동으로 고쳐야합니다.

zend_extension = /usr/local/lib/php/extensions/non-debug-non-zts-xxx/xcache.so
   →
zend_extension = /usr/local/lib/php/extensions/no-debug-non-zts-20060613/xcache.so


웹서버 재시작하고 phpinfo() 호출해서 출력하면 xcache 정상 동작하는거 확인할수 있습니다.

CentOS에서 최신버전 lighttpd rpm 만들기

CentOS나 RHEL에서 최신 버전 lighttpd rpm 만드는 방법입니다.
이전 버전의 src rpm을 받아서 아래와 같이 src rpm 최신버전으로 제작할수 있습니다.

# wget http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# rpm -i http://www.lighttpd.net/download/lighttpd-1.4.13-1.src.rpm
# cd /usr/src/redhat/SPECS
# sed -i ‘s/1\.4\.13/1\.4\.22/g’ lighttpd.spec

sed로 lighttpd.spec 파일에서 1.4.13을 찾아서 1.4.22(현재 최신 버전)으로 변경합니다. 일반 에디터로 편집하셔도 됩니다. 파일 내용도 한번 확인해보시면 도움이 될듯하네요.

lighttpd 소스를 받습니다.

# cd /usr/src/redhat/SOURCES
# wget http://www.lighttpd.net/download/lighttpd-1.4.22.tar.gz

이제 rpm만 만들면 됩니다. src rpm은 아래처럼 만듭니다.

# cd /usr/src/redhat/SPECS
# rpmbuild -bs lighttpd.spec

이렇게 하면 /usr/src/redhat/SRPMS 에 src rpm이 만들어집니다.

아래처럼 바이너리 rpm을 제작할수 있습니다. ssl을 사용할 수 있도록 옵션을 추가적으로 전달했습니다. spec 파일 보면 어떤 옵션이 있는지 확인할수 있습니다.

# cd /usr/src/redhat/SPECS

# rpmbuild -bb lighttpd.spec -with ssl

이렇게하면 시스템에 따라 /usr/src/redhat/RPMS/{x86_64, i386} 에 바이너리 rpm 파일이 생성됩니다.

rpmbuild 할때 오류나면 yum으로 필요한 패키지 설치하면 됩니다. (yum update openssl-devel …)

이제 필요한곳에 rpm을 설치하고 재시작 하면 됩니다~

# rpm -e lighttpd      (이전 버전 제거)
# cd /usr/src/redhat/RPMS/x86_64
# rpm -i lighttpd-1.4.22-1.x86_64.rpm
# /etc/init.d/lighttpd start

Ubuntu 8.10에서 Flash 동작안할때

Ubuntu 8.10로 업그레이드한후 Firefox에서 플래시가 동작안하고 설치하라고 나오는데, 막상 설치하려고 하면 이미 설치되어있다고 나오네요. 지웠다가 다시 설치해도 마찬가지로 계속 설치하라고 나오더군요.

원인은 모르겠지만, flashplugin-nonfree를 지우고, ubuntu-restricted-extras를 설치하면 Flash 10이 정상적으로 동작하네요.

sudo apt-get remove flashplugin-nonfree
sudo apt-get install ubuntu-restricted-extras

sawfish 윈도우 메니저

유닉스의 X 윈도우는 윈도우 테두리와 동작등을 담당하는 부분이 빠져있는데, 이 부분을 윈도우 메니저가 처리합니다. 수십 개 이상의 윈도우 메니저가 존재하며, 각각 기능이 천차만별이라 같은 X 윈도우를 사용한다고 해도 모양이나 사용방법은 전혀 틀려집니다. 같은 윈도우 메니저라 해도 설정이 자유로운것이 많아서 모양이나 동작등도 사용자들이 커스터마이징을 많이해서 사용합니다.

예전에 GNOME 데스크탑의 디폴트 윈도우 메니저였던 sawfish가 안타깝게 metacity에게 자리를 내어주었지만… 제 개인적인 생각으론 metacity는 기능이 좀 부족하더군요. 커스터마이징 면에서 낮은 점수를 받을수 밖에 없습니다. “일반 사용자들을 위한 디폴트 윈도우 메니저”로 선택되었으니 커스터마이징은 중요한 요소가 아니였나봅니다.

예전엔 이름이 sawmill이였는데… 다른 소프트웨어가 그 이름을 사용중이라고 sawfish로 바꿨습니다. sawfish는 LISP 와 유사한 언어(rep)로 커스터마이징이 가능합니다 🙂 물론 LISP을 알면 더 자유로워질수 있지만(^^), 몰라도 sawfish-ui 로 커스터마이징이 가능합니다.

X 윈도우의 윈도우 메니저들은 대부분 가상 데스크탑을 지원하는데.. MS윈도우즈에 있는 가상 데스크탑 프로그램들은 많이 구해서 사용해봤는데 많이 부족하더군요. 기능이 부족하기 보다, 기본적인 기능이 제대로 동작하는걸 찾지 못했습니다. 데스크탑 이동할때 포커스를 제대로 잡아주는 프로그램을 아직 접하지 못했네요. litestep이 그나마 사용할만하지만 이건 쉡을 바꾸는거라 불편이 따르더군요. 하여간 제가 윈도우즈용 프로그램도 개발하지만, 데스크탑에 리눅스를 깐건 이 가상 데스크탑 기능이 정말 그리워서였죠. 옆에 윈도우즈 노트북이 있으니 윈도우 프로그래밍 작업은 원격으로 연결해서 작업하거나 vmware에서 작업합니다.  2000년, 2001년에 있던 회사에서는 유닉스 프로그램만 개발해서 리눅스를 데스크탑으로 썼었습니다. 이때 썼던 윈도우 메니저가 sawfish 였고요.

뭐 X 윈도우와 윈도우 메니저를 접한건 94년 정도로 올라가는데 (학교 워크스테이션실), 그때 있던게 mwm(motif)과 openlook(olwm?)과 fvwm이였죠. fvwm이 오픈소스라 fvwm을 사용했었습니다. fvwm의 추억의 색(붉은색+하늘색)은 아직도 기억에 남네요. 그후 리눅스를 PC에 깔면서 꽤 많은 윈도우 메니저를 사용해봤습니다. 대부분 쓸만하지만 저는 화려한거보다는 가볍고 빠르고 커스터마이징이 자유로운걸 사용하게 되더군요. fvwm2, icewm 등을 많이 썼었고, 결국 sawfish로 정착했습니다.

꽤 오랜만에 회사의 메인 PC에 리눅스(우분투)를 깔았습니다. 윈도우즈 개발은 원격으로 옆의 노트북이나 집 PC에 연결해서 개발합니다. 노트북의 화면을 활용하기 위해서 synergy를 사용하기도 했었는데 저는 가상 데스크탑이 더 편하더군요. 오래전에 듀얼 모니터(20인치 CRT)도 사용해봤지만 고개 왔다갔다 하는거보다 키보드로 가상화면 이동하는게 더 편하더군요.

sawfish에서 제가 좋아하는 기능이 pack window와 창채우기(maximize-fill-window) 기능입니다. 단축키 잘 할당해 놓으면 창위치 잡기 위해서 마우스로 손이 갈 필요가 거의 없습니다. 그리고 마우스로 위치와 크기 조정하는거보다 더 빠르고 잘 배치를 할수 있죠.

아래는 제가 사용중인 설정입니다.

(custom-set-keymap
(quote global-keymap)
(quote (keymap
    (cycle-windows . “M-TAB”)
    (show-desktop . “H-d”)
    ((run-shell-command “nautilus”) . “H-e”)
    ((run-shell-command “vmware”) . “H-v”)
    ((run-shell-command “evolution –component=mail”) . “H-m”)
    ((run-shell-command “gnome-terminal”) . “H-t”)
    ((run-shell-command “firefox”) . “H-f”)
    ((activate-workspace 1) . “H-1”)
    ((activate-workspace 2) . “H-2”)
    ((activate-workspace 3) . “H-3”)
    ((activate-workspace 4) . “H-4”)
    ((activate-workspace 5) . “H-5”)
    ((activate-workspace 6) . “H-6”)
    (next-workspace . “M-C-Right”)
    (pack-window-left . “C-S-Left”)
    (pack-window-right . “C-S-Right”)
    (pack-window-up . “C-S-Up”)
    (pack-window-down . “C-S-Down”)
    (maximize-fill-window-toggle . “C-F”)
    (maximize-window-vertically-toggle . “C-V”)
    (maximize-fill-window-horizontally-toggle . “C-H”)
    (pack-window-up . “C-I”)
    (pack-window-down . “C-K”)
    (pack-window-left . “C-J”)
    (pack-window-right . “C-L”)
    (previous-workspace . “M-C-Left”))))
(custom-set-keymap
(quote window-keymap)
(quote (keymap
    (raise-and-pass-through-click . “Button1-Click”)
    (size-window-subtract-column . “H-Left”)
    (size-window-add-column . “H-Right”)
    (size-window-subtract-row . “H-Up”)
    (size-window-add-row . “H-Down”)
    (send-to-next-workspace . “M-C-S-Right”)
    (send-to-previous-workspace . “M-C-S-Left”)
    (move-window-interactively . “W-Button1-Move”)
    (popup-window-menu . “W-Button2-Click”)
    (delete-window-instance . “M-F4”)
    (resize-window-interactively . “W-Button3-Move”)
    (lower-window . “M-C-Down”)
    (raise-window . “M-C-Up”))))

가상화면 전환은 Ctrl-Alt-Left, Ctrl-Alt-Right, Win-1 ~ Win-6 까지 이용합니다. 창을 다른 가상화면으로 옮길때는 Ctrl-Alt-Shift-Left, Ctrl-Alt-Shift-Right을 이용합니다. 창이동은 Ctrl-Shift-화살표를 이용합니다. 창이동하는 함수가 pack-window-up … 등의 함수인데.. 픽셀 단위로 움직이는게 아니라 다른 창에 붙도록 이동합니다. 익숙해지면 편합니다. 원하는 곳에 잘 붙지 않을때가 있는데… 사용해보면 익숙해집니다. 원하는 위치를 잡으면… Ctrl-Shift-f 로 빈곳을 채울수 있습니다. 다른 창 영역은 침범하지 않으니 다른 창들과 함께 창을 나눠서 쓸때 딱입니다. Ctrl-Shift-v와 Ctrl-Shift-h로 세로/가로 따로 창을 채울수도 있습니다.

저는 주로 가상화면에 한꺼번에 띄울 창들을 실행하고, 창들을 Ctrl-Shift-화살표로 원하는 곳으로 이동하고, 크게 보고 싶은 창부터 창채우기합니다. 창크기 조절을 세밀하게 하고 싶으면 Win-커서키를 눌러서 조절하던가, 마우스로 창크기를 조절하고 창채우기하면 됩니다. 창크기 조절할때 마우스로 끝 잡기가 귀찮아서 Ctrl-오른쪽 마우스(resize-window-interactively) 누르면 창크기가 바로 조절되게 세팅했습니다.

Win-e, f, m, t, v키에는 자주 사용하는 어플들을 등록했습니다. 탐색기(nautilus), Firefox, Mail, Terminal, VmWare.

스크린샷을 찍어봤지만.. 뭐 특별한건 없습니다. 일반 그놈 패널에… 가상화면마다 창들이 많이 붙어있죠. 오른쪽 메신저(Pidgin)은 MSN+nateon 같이 사용하니 편하더군요. 친구리스트는 gimp로 블라인딩처리~

원격접속(rdesktop)을 이용할때는 키보드는 모두 rdesktop으로 가게 했습니다. 가상화면 이동할수 있으면 좋겠지만… 윈도우메니저에서 먼저 키보드 처리하면, 윈도우즈 사용시 여러가지로 불편하더군요. 대신 가상화면창에서 마우스 휠을 움직입니다. 마우스 휠로 가상화면 이동이 가능합니다. 그리고 원격접속이나 vmware는 가상화면을 4,5,6번으로 고정시켰습니다. 4번은 옆의 노트북 rdesktop, 5번은 vmware, 6번은 집 rdesktop. 메일은 2번, 기타 작업 공간은 1, 3번을 쓰고 있습니다. 1번은 메신저와 가벼운 웹브라우징, 3번은 노트북(4번)과 같이 작업할때 쓰는 공간입니다. 그리고 혹시를 위해서 가상화면 7, 8번은 여유 공간입니다.

rdesktop은 아래처럼 띄웁니다.

rdesktop.sh -u 아이디 -p 패스워드 -k ko -g workarea -r disk:root=/ -r sound:local -T “rdesktop – notebook” 아이피주소

rdesktop.sh은 rdesktop을 호출하기 전에 사운드 장치를 공유할수 있도록 했습니다.

% cat /usr/bin/rdesktop.sh
#!/bin/sh
LD_PRELOAD=libaoss.so exec /usr/bin/rdesktop “$@”

-k ko는 한영키를 위해서 필요하고, -g workarea 옵션을 주어 전체 공간을 사용하도록 합니다. 원격에서 리눅스 폴더 전체 보이게하고, 소리는 리눅스로 보내도록 했고, 창이름을 지정했습니다. 창 이름을 지정하여 sawfish에서 몇가지 작업을 해줍니다.

(custom-set-typed-variable
(quote match-window-profile)
(quote
    (((WM_NAME . “^rdesktop – notebook$”))
     (workspace . 4)
     (maximized . all)
     (focus-click-through . #t)
     (frame-type . none))
    (((WM_NAME . “^rdesktop – home$”))
     (workspace . 6)
     (maximized . all)
     (focus-click-through . #t)
     (frame-type . none))
    (((WM_CLASS . “^Vmware/vmware$”))
     (workspace . 5)
     (maximized . all)
     (frame-type . none))))

가상화면을 4번으로 고정시키고, 창크기를 최대화하고, 창테두리를 안그리게 했습니다. 그놈패널을 제외한 모든 영역이 윈도우즈가 차지하도록 했습니다 🙂


요즘 제가 사용하고 있는 환경인데… 역시 불편한점은 있습니다. 먼저 메신저로 받은 파일을 네트워크에 공유해서 받아야하는 불편함이 있습니다. 대부분 파일들은 리눅스(오픈오피스)에서도 잘 열리지만.. (docx 포함) 편집은 아직 불편한 점이 많더군요. 왠만하면 리눅스에서 처리하고, 꼭 필요하다면 윈도우즈 쪽으로 옮겨서 작업하고 있습니다.

11월11일 추가내용: 우분투에서 설정 방법

우분투의 패키지 메니저인 synaptic에서 sawfish로 검색해서 설치했습니다. 아래처럼 설치되어있습니다.


그리고 Gnome 세션을 사용하고 홈디렉토리에 .gnomerc를 아래처럼 만들어주고 다시 로그인하면 윈도우 메니저가 sawfish로 변경됩니다.

% cat ~/.gnomerc
export WINDOW_MANAGER=/usr/bin/sawfish