벌써 두번이나 했는데 매번 기억이 안 나서 몇번씩 시행착오를 한 관계로 잊어버리지 않기 위해서 기록한다.

Source code에 한글로 comment를 쓰기 좋아하는 사람들(사실 나도 간혹 그런다)이 꽤 많이 있는데, file의 character encoding만 잘 맞춘다면야 comment를 뭘로 쓰든 사실 별 상관이 없다. 오히려 자신의 제일 잘 구사할 수 있는 언어인 한국어로 설명을 달아놓는 것이 더 좋을 수도 있을 것이다. 그런데, 이건 encoding을 잘 맞출 때나 할 수 있는 얘기고, EUC-KR이나 CP949로 저장되어야 할 파일을 어찌어찌 하다가 UTF-8 같은 것으로 저장해버리는 일이 종종 생긴다. 흔히 editor가 EUC-KR로 encoding된 파일을 열 때 제대로 decoding을 하지 않은 채로 열고, 저장할 때는 그냥 UTF-8로 저장해 버리는 경우에 많이 발생하는 듯 하다. 어쨌거나 내가 최근 며칠 사이에 아주 자주 마주치는 상황은 아마도 그런 전차로 발생한 듯 한다.

어떻게 이런 일이 일어났는지는 뭐 알 수 없는 거고, 현재 상태만 설명하자면 이렇다.

  • 파일의 실제 character set은 EUC-KR이다.
  • 그런데 이 파일이 적절한 decoding과 다시 적절한 encoding 없이 바로 UTF-8로 저장되었다.

이것을 다음과 같은 과정을 거쳐서 복원 시도할 것이다.

  1. UTF-8을 decoding해서 latin1으로 표현된 파일을 얻는다.
  2. 이 파일을 EUC-KR로 decoding한 후에 다시 UTF-8로 encoding한 파일을 얻는다.

2번의 결과물을 보면 망가졌던 한글 character 중 대략 70% 정도는 복구할 수가 있다. 그리고 나머지는 사람의 두뇌를 이용해서 복구가 안된 글자들을 상상해서 끼워 맞추는 작업이 필요하다.

최초의 파일(file1.c)은 이렇다. (vim에서 열어 본 것. ~/.vimrc에서 fileencodings는 ucs-bom,utf-8,euc-kr,cp949,iso-2022-kr,latin1 로 설정되어 있음)

이것을 bvi로 열어서 해당하는 부분을 보면 아래와 같다.

첫번째 변환은 다음과 같이 한다.

iconv -f utf-8 -t latin1//IGNORE file1.c > file2.c

최초 파일(file1.c)을 utf-8로 인식하여 연 다음에 latin1으로 변환하라는 뜻인데, latin1은 사실 아무런 변환을 하지 않은 것과 같다. 따라서 우연히 utf-8로 잘못 저장된 내용을 복구한 것이 된다.

이 결과는 다음과 같다(file2.c)

vim에서는 같은 것처럼 보이지만, 처음은 encoding이 utf-8이었고, 지금은 latin1으로 인식한다.

bvi로 열면 다음과 같다. 분명 파일 내용은 바뀌어 있다.

여기에서 생각할 것은 이 파일은 encoding은 실제로는 euc-kr이라는 것이다. 적절한 code 변환 없이 저장되는 바람에 일부 byte들이 유실되었고 vim로 자동인식해서 열어봐도 그냥 latin1으로 표시될 뿐이다. 이 파일을 강제로 euc-kr로 인식시키고자 다시 iconv를 이용한다. 두번째 변환은 다음과 같다.

iconv -f euc-kr -t utf-8//IGNORE file2.c > file3.c

이 결과물(file3.c)은 제대로 utf-8로 저장된 파일이 된다.

vim에서 열면 아래와 같다.

bvi로 열면 아래와 같다.

마지막 결과를 잘 보면 한글 한 글자당 3 byte가 사용되는 제대로 된 utf-8 encoding인 것처럼 보인다. 물론 몇가지 글자들은 정보 유실 때문에 여전히 깨지기도 하고, 복원하는 과정에서 잉여 byte들이 끼어들어 뭔가 더 길어진 것처럼 보이기도 한다. 잘 인지되지 않는 글자들은 무시한다. 시간이 남는다면 유실되거나 추가된 byte들을 이러저리 만져보면서 완전한 원본을 만들어낼 수도 있겠으나, 나는 지금 이 글을 쓰면서도 이미 시간을 많이 소비했다. ㅋㅋ 나머지는 나의 한국어 실력을 믿기로 한다.






  
트랙백 0  |  댓글 0  |

아래의 어느 것도 문제의 원인이 아니었음! 단지 마우스가 불량이었음! -.-;; 아래는 그냥 기록상 남겨둠.

더보기



  
트랙백 0  |  댓글 0  |

linux의 gnome 환경에서 쓸만한 음악 연주기 중에서 그 중 제일 쓸만하다고 판단되는 banshee 1.5.0이 나왔다. 근데 보면 aka 1.6 beta 1이라고 나온다. 안정버젼이 되려면 1.6이 될 때까지 기다려야 하는 건가? 어쨌든 현재 ubuntu jaunty 저장소에는 올라오지 않고 있는데 일단 subversion으로 받은 소스로 deb 패키지를 만들어서 설치했다. revision number는 5209라서 r5209 딱지를 붙였다.


monodoc-banshee-manual은 설치하지 않았는데 혹시나 해서(그냥 심심해서) 올려 둠.

근데 1.4.x 때보다 느려진 것 같다. 음악이 끊기거나 하는 건 아닌데 화면이 반응하는 속도가 참 아쉽다.

  
트랙백 0  |  댓글 0  |

terminal에서 vim을 띄워서 작업한다면 K 키로 man page를 보는 데 그다지 문제가 없다. 물론, 터미널이 제대로 된 터미널일 경우에.

그런데 gvim을 쓸 때에는 K 키로 man page를 보면 보기 싫게 나온다. less가 화면을 제어하기 위한 기능이 gvim에서 제공되는 emulated terminal에서는 제공되지 않기 때문이란다. (관련링크) 그래서 Dr Chip이라는 사람이 vim 창에서 자체적으로 man page를 출력해주는 vim plugin은 만들었다. man page viewer라는 것으로 man page를 보려는 keyword 위에서 K 키를 누르면 터미널에서 man이 구동되지 않고 vim 창이 쪼개지면서 새 창에 man page가 나온다. 새로 나오는 창은 일반적인 vim buffer처럼 동작한다. (간단히 말해서 h,j,k,l 키로 이동. ctrl+d, ctrl_u 등도 이용 가능. 등등등)

설치는 아주 간단하다. 일단 위 링크를 눌러서 Dr Chip의 페이지로 간 다음에 Man Page Viewer를 우클릭해서 어딘가에 저장한다. 요즘 왠만한 데스크탑용 vim이라면 확장자가 .gz인 파일을 그냥 열 수 있다. 그러니 그냥 vim으로 manpageview.vba.gz를 연다. 그런 다음에 :so % 라고 입력한다. (:부터 %까지 다 입력해야 함.) 이렇게 하면 ~/.vim 아래에 이런 저런 파일들을 생성한다. 다음부터는 gvim에서 K 키로 man page를 "잘" 볼 수가 있다.

ps. 찾아보니 KLTP에 이와 관련된 팁이 이미 있었는데 (이 글) 너무 오래된 (2002년) 글이다.

'Linux & Unix' 카테고리의 다른 글

USB 마우스 종종 먹통되는 문제  (0) 2009.06.22
banshee 1.5.0 released  (0) 2009.06.03
gvim에서 man page 제대로 보기  (0) 2009.05.18
2009년 우분투 세미나  (0) 2009.05.11
Ubuntu에서 노트북 배터리 아끼기  (2) 2009.05.07
sony VAIO + conky  (0) 2009.05.03
  
트랙백 0  |  댓글 0  |


우분투 한국 사용자 모임에서 "2009년 우분투 세미나" 를 개최합니다.

이 세미나에서는 우분투를 처음 접하는 사용자와 우분투를 사용하고 있는 사용자들을 대상으로, 우분투 소개, 데스크탑 설정 및 응용 프로그램 등의 기초적인 부분과 리눅스 커널 및 DBMS 등의 고급 내용도 함께 다룰 예정입니다. 또한 상당한 수준의 기념품이 (가능한) 참석자 전원에게 지급될 예정입니다. 더 자세한 내용은 다음 글을 참고하세요. viewtopic.php?f=2&t=5063&start=0

주의 : 세미나 참석 인원이 정원에 도달하였으므로, 추가 신청은 받지 않습니다. 하지만 기념품을 못받더라도 오시겠다! 하시는 분은 오셔도 됩니다.

라고 합니다. 이상 펌! ^^

저도 참석할 예정입니다.

'Linux & Unix' 카테고리의 다른 글

banshee 1.5.0 released  (0) 2009.06.03
gvim에서 man page 제대로 보기  (0) 2009.05.18
2009년 우분투 세미나  (0) 2009.05.11
Ubuntu에서 노트북 배터리 아끼기  (2) 2009.05.07
sony VAIO + conky  (0) 2009.05.03
ubuntu linux와 windows 사이에 rsync 설정  (1) 2009.03.01
  
트랙백 0  |  댓글 0  |

노트북 배터리를 아끼기 위한 첫번째 step은 뭐니 뭐니해도 일단은 powertop을 설치하고 어떤 것들이 노트북에 로드를 주느냐를 감시하는 것이다. powertop은 추가로 배터리를 아끼기 위한 이러저러한 방법들을 추천해 준다. 그런데 ubuntu의 경우에 laptop-mode-tools라는 것이 있어서 powertop이 추천해줄만한 것들이 이미 설정되어 있다. 사용자의 취향에 따라서 세세하게 조정할 수도 있다. GUI는 일단 모르겠다. 기본적으로는 /etc/laptop-mode/laptop-mode.conf 를 수정하는 방식이다. (현재 설치된 Ubuntu는 9.04임)

laptop-mode 설정

/etc/default/acpi-support 수정해서 ENABLE_LAPTOP_MODE=true 로 변경함. 이 것이 laptop-mode-tools에서 하는 작업들을 사용할 수 있게 해줌. laptop-mode-tools의 설정 파일은 /etc/laptop-mode/laptop-mode.conf 에 있는데 대충 설정들을 보면 전력 소모를 줄일 수 있는 설정들이 대부분 들어가 있는 것으로 보인다.

/etc/laptop-mode/laptop-mode.conf 내의 몇가지 option들을 enable한다.

  • CONTROL_NOATIME=1
  • CONTROL_HD_WRITECACHE=1

/etc/laptop-mode/conf.d/ 아래에 있는 conf 파일들에서 쓸모 있을 것 같은 설정들을 enable시킨다.

  • ac97-powersave.conf
  • bluetooth.conf
  • configuration-file-control.conf
  • dpms-standby.conf
  • ethernet.conf
  • hal-polling.conf
  • intel-hda-powersave.conf
  • intel-sata-powermgmt.conf
  • lcd-brightness.conf
    • echo [value] to echo 5
    • BRIGHTNESS_OUTPUT="/sys/class/backlight/acpi_video0/brightness"
  • sched-mc-power-savings.conf
  • usb-autosuspend.conf
  • video-out.conf
    • BATT_DISABLE_VIDEO_OUTPUTS="VGA"
    • LM_AC_DISABLE_VIDEO_OUTPUTS="VGA"
  • wireless-iwl-power.conf
    • 이건 enable하지 않았다. 설정 파일의 설명에 의하면 iwl4965 driver를 사용할 때 효과가 있다고 하는데, 현재 나의 경우 iwlagn driver를 사용하고 있다.

Reducing disk activities

아래는 사실 위에 것을 하기 전에 찾아본 것인데, 누구에겐가는 쓸모가 있을 것 같아서 덧붙인다.

에... 그러니까, conky가 report하기로 disk에 뭔가 계속 쓰여지고 있다고 한다. 이런 저런 명령어들을 찾아봤는데 무슨 process가 얼마나 (그리고 어디에) 쓰고 있는지 알려주는 것이 없는듯했다. 그러다가 이글(https://answers.launchpad.net/ubuntu/+question/30513)을 발견했는데 아래쪽에 보면 iotop이라는 프로그램(http://guichaz.free.fr/misc/#iotop)을 소개하고 있다. 이게 딱 내가 찾던 것인데... 문제는 이 프로그램도 어떤 프로세스가 disk에 접근하는 정도는 보여줘도 어떤 파일을 읽거나 쓰는지는 안 보여준다.

googling하다가 이런 글(http://ubuntuforums.org/showthread.php?t=839998)도 발견했다. journal commit과 page 교환 간격을 늘려주는 것이다. 그런데 이것대로 따라하고 나도, suspend 갔다가 돌아오면 sysctl.conf 의 설정은 원래대로 덮어쓰여진다.

ubuntu wiki에 보면 이런 것(https://wiki.ubuntu.com/ReducedPowerUsage)도 있다. 2006년 글인데 아직도 쓸모가 있을 것 같다.

  
트랙백 1  |  댓글 2  |

몇시간 전에(그러니까 술먹으러 가기 전에) 어렵사리 (생각보다 시간이 걸리더군요) 만든 겁니다. 문제는 있을 수 있습니다. 저한테 머라 하지 마세요. 우선은 fanspeed 부터 만들었는데 Sony VAIO에 관계된 몇가지는 (그래봐야 몇 개 안되는군요) 앞으로 만드는대로 포스팅하겠습니다. VAIO 안 쓰시는 분들에게는 필요가 없겠지만요. ^^

첫번째는 fanspeed를 가져오는 겁니다. upstream에 패치 보냈는데 언제 반영될지는 모르겠습니다.

sony_fanspeed 추가.
http://sourceforge.net/tracker/?func=de ... tid=757310


  
트랙백 0  |  댓글 0  |

(EDIT 2009.03.13 windows에서 rsync server를 사용하는 것은 포기했음. 자세한 사정은 이 글 끝의 덧..들을 참고. 아래는 그냥 기록상 남겨둠. 다른 사람에게는 도움이 될 지도 모르니...)


서설

노트북에서 작업을 하다가 갑자기 비교적 대량의 데이터를 백업해야 할 일이 생겼는데 FTP로 옮기고 있자니 짜증이 났다. 뭔가 일이 자동으로 일어났으면 좋겠는데... 그런 생각을 하다가 노트북 데이터의 자동 백업 방법을 생각해 보니 제일 바람직한 것은 rsync를 사용하는 것이었다. 버젼 컨트롤이 필요한 것들은 lab 한 구석에 돌리는 debian 서버에 subversion(옛날 것들)과 git(요즘 것들)을 혼합하여 저장하지만, 특별히 버젼 컨트롤은 필요 없이 단순히 동기화만 필요한 것들에는 굳이 subversion이나 git을 사용할 필요가 없어 보였기 때문이다. 버젼 컨트롤에는 아무래도 이러저러한 추가 정보들이 필요하다 보니 단순히 동기화를 위해서 버젼 컨트롤 소프트웨어를 사용하는 것도 낭비라고 여겨졌다. 그래서 lab에서 사용하는 windows 데스크탑이 HDD도 넉넉하니 단순 무식하게 rsync로 자동으로 동기화가 되도록만 해 놓고 싶었다.

이 글은 linux client(ubuntu 사용)와 windows server(win xp 사용) 사이에 rsync 설정을 한 삽질기이다.


서버

일단 windows가 서버가 되어야 하니 rsync server를 설치해야 하는데 찾아 보니 이런 것들이 있다.

DeltaCopy는 rsync server이긴 한데 이 글을 읽어보면 domain controller하고 얽혀서 별로 좋지가 않다고 한다. 서버가 windows xp인데다가 우리 랩도 windows domain controller하고는 담 쌓고 지낸지가 몇년이 됐으니 DeltaCopy는 나도 패스다.

cwRsync는 특별히 새로 나온 소프트웨어라기보다는 기존에 cygwin과 rsync를 직접 설치하던 것을 cygwin에서 필요한 부분만을 가져오고 rsync를 그 위에 설치해 주고 rsync 서버를 daemon mode로 (그러니까 윈도우즈 서비스로) 설정하는 것까지를 편하게 해 준다. cygwin에서 뭘 가져올지를 시간들여 생각할 필요가 없다. 그러니 나를 위해서도 이것이 좋은 선택이다.

cwRsync는 위 홈페이지에서 링크를 따라가면 sourceforge에서 다운로드할 수 있는데, client는 필요 없으니 서버만 다운로드한다. (cwRsyncServer_3.0.1_Installer.zip) 설치는 간단하다. 특별히 신경 써서 뭘 할 필요도 없다. 단, 설명을 읽어보면 서비스 시작 형태가 수동으로 설정된다고 하는데, 관리도구->서비스 에서 rsync server를 찾아서 자동으로 시작하도록 해 준다. (시작은 좀 있다가 한다.) 그리고 실제의 서버 설정을 하는데, 시작메뉴에서 cwRsync를 찾아서 rsyncd.conf를 누르면 설정파일 내용이 메모장에 뜬다.

rsync는 기본적으로 module 단위로 동작한다. 서버의 설정 파일에 모듈들을 지정하면 외부에서는 서버이름과 그 서버에 있는 모듈들이 보이는 식이다. 서버이름/모듈이름 의 형식으로 접근하게 된다. 설정파일에서 기본적인 것은 그냥 있는 것(test라는 모듈이 이미 하나 정의돼 있을 거다.)을 대충 고쳐서 써도 되는데 중요한 것은 charset을 처리하도록 손을 봐 줘야 한다는 거다. 일단 upload할 모듈의 끄트머리에 charset = utf-8을 적어준다. 한글 파일 이름만을 위해서는 윈도우즈 기본 charset인 cp949나 euc-kr을 써도 되는데 유럽쪽 글자들이 들어 있는 파일 이름을 위해서는 아무래도 유니코드가 좋다. 여기에서 utf-8로 정해줬다고 바로 그대로 동작하는 건 아니다. 이 글이나 이 글을 읽어 보면 cwRsync에 딸려 오는 cygwin이 유니코드를 사용하도록 돼 있지 않다고 한다. 그 글들에서 따라가 보면 어떤 일본어로 된 utf8-cygwin이라는 페이지가 뜨는데 거기에서 cygwin1-dll-20-11-18.tar.bz2을 다운로드한다. 압축파일을 열면 cygwin1.dll이라는 파일이 나오는데 그걸 C:\Program Files\ICW\Bin 아래에 덮어 씌운다.

그럼 그 다음에 rsync 서비스를 시작해 준다. 이 이후에 중간 중간 설정 파일을 바꾸면서 시험해 볼 때는 매번 서비스를 중지하고 다시 시작해야 할 필요는 없다. 설정파일을 바꾸면 바로 적용되는 듯하다.


클라이언트

클라이언트는 뭐 특별히 설명할 것이 없다. 한가지만 언급하자면 rsync 프로그램에 먹일 옵션으로는 -ausx --iconv=utf-8 정도가 좋은 것 같다. 물론 리눅스 클라이언트에서 사용하는 charset이 utf-8일 때 얘기고 옛날 식 euc-kr을 쓴다면 -ausx --iconv=euc-kr로 하면 될 것이다.


자동화

자동화는 클라이언트가 리눅스이니 cron 같은 것을 쓰면 된다. 이것도 여기서 특별히 설명할 것은 없네. 다른 데 더 좋은 설명이 많을 테니까.



어째 용두사미 격의 삽질기네. 뭐, 삽질에 시간이 제일 많이 걸린 부분이 저 위에 utf-8 관련한 정보를 찾는 시간이었으니 오히려 이런 식이 제 격인 것 같기도 하고. ㅋㅋ


그 날 이후

덧. 2009. 03. 12 컴퓨터를 갈아 엎고 나서 위에 기록한 거 대로 다시 설치했는데 이게 제대로 안된다. 문제는 아직 뭔지 모르겠다. cygrunsrv.exe를 실행하면 error 1053을 내고 서비스가 시작되지 않는다.

덧. 2009. 03. 13 cwRsync도 어차피 cygwin과 rsync를 설치하기 쉽게 패키징 한 것이다. 그래서 cygwin을 사용하지 않는 것을 찾아보았는데 Unison이라는 것을 찾았다. 그런데 이것도 문제가 있다. windows에 server로 설치하기 위해서는 socket method와 remote shell method를 선택할 수 있는데 socket method는 보안을 구현하기 거시기하다. 그런데 remote shell method로서 추천하고 있는 것이 결국 cygwin + ssh을 설치하는 것이다. 이래서는 어차피 다시 cygwin으로 돌아온 것이다. 그럴 바에는 그냥 cygwin + ssh + rsync로 가는 것이 훨씬 나을 것 같다. 그런데 다시 cygwin + ssh + rsync로 한다고 해도 앞에 덧. 03.12에서처럼 cwRsync에서의 알 수 없는 문제가 또 생길지도 모르겠다.

덧. 2009. 03. 13 cygwin을 직접 설치하고 rsync를 setup하려고 해도 같은 문제가 생긴다. cygwin 설치와 관련된 것은 아닌 것 같다. 그보다는 win xp에서의 permission setting 같은 것과 관련이 있는 것으로 보인다. 이것을 해결하기 위해서는 cygrunsrv.exe 프로그램에 관계된 자세한 문서를 찾아봐야 할 것 같은데 잘 못찾겠다. 정 안되면 소스를 분석해봐야겠다. 근데 그러려면 일이 커질 확률이 꽤 있다.

또 다른 해결책으로는 windows 머신에 virtualbox 같은 가상 머신을 설치하고 windows 방화벽에서 port forwarding을 할 수 있다. 그런데 이렇게 하는 것은 문제 해결 자체보다 해야 할 것이 많아서(가상 머신 설치와 설정 등) 별로 내키지 않는다. 그래도 이 방법에 대해서는 내가 잘 알고 있기 때문에 cygrunsrv.exe를 분석하는 것 보다는 빨리 해결할 수 있을 것 같다.

덧. 2009. 03. 13 이것 저것 살펴 보고 나서 내가 cygrunsrv.exe의 문제를 해결할 수 없을 것이라고 판단했다. 물론 시간을 들이면 못 하지는 않을 것 같지만 들이는 시간에 비해서 얻는 것이 미약하다. 당분간은 rsync 없이 ftp로 살아야겠다. 어차피 데이터는 한쪽으로만 흐르고 지워지는 데이터는 거의 없고 주로 교내 네트웍에서 자료를 옮기기 때문에 네트웍 대역폭을 신경 쓸 필요가 없고 공용 서버들도 아니고 critical service를 돌리는 컴퓨터들도 아니기 때문에 시스템 load에도 신경 쓸 필요가 없다.

고로... 그냥 ftp만 이용하다가 여름 정도 도면 cygwin과 cygrunsrv.exe에 중요한 변화가 있는지 체크해 보는 것이 좋을 것 같다.

이것 저것 찾아보았지만 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는 이래저래 하드웨어가 잘 지원되지 않는 면이 있네. -.-;


Ubuntu는 Gnome Desktop을 기본으로 하고 있다. 따라서 각종 application들도 Gnome에 있는 것들이거나 Gnome과 잘 맞는 것들을 사용하고 있는데, 그 중의 하나로 Evolution이 있다. Evolution은 Gnome에서 기본으로 사용되는 프로그램으로 이메일, 주소록 관리, 일정 관리 등을 할 수 있다. 이메일이나 주소록 관리만을 위해서라면 (나의 경우 예전부터 사용하던) Thunderbird가 훌륭한 대안이고, 어떤 면에서는 Thunderbird를 더 좋아하고 익숙하다. 그런데, 일단 일정 관리라는 것이 중요한 문제가 되고, 그 밖에도 Evolution이 Gnome에 잘 맞다 보니 Gnome에서 쓰이는 다른 소소한 프로그램들과도 잘 연동된다. Gnome에서 쓰이는 다른 프로그램들과의 연동은 내가 어찌 해보기에는 좀 벅차고 시간도 없고 ㅋㅋ, 일단 Thunderbird에서 일정 관리를 할 수 있도록 한다.

Evolution에서 굳이 Thunderbird로 귀찮게 옮겨가려는 이유에는, Evolution이 보낸이 이름이 한글로 된 메일의 경우 화면에 제대로 표현해 주지 않기 때문이다. 물론, Evolution의 잘못이라기보다는 MS outlook으로 메일을 보내는 사람들의 문제이지만, 어쨌든 Thunderbird의 경우 이 문제가 없다. (그리고 일단 친숙하다! 하하)

1. 일단 Thunderbird를 설치한다. Ubuntu의 경우는 repository에 있는 것을 간편하게 설치할 수 있다. 터미널에서 aptitude를 사용해도 되고, synaptics 패키지 관리자를 써도 되고, gnome 메뉴에 있는 프로그램 추가/삭제 항목을 이용해도 된다. 보다 친숙한 한글 환경을 위해서는 Thunderbird용 한글 locale도 같이 설치 됐는지 확인한다.


2. Thunderbird에서 일정관리를 하기 위해서는 별도의 add-on을 설치해야 하는데 Lightning이라는 것이 제일 유명하고 좋다. ("제일 좋다"에는 약간 자신이 없음) Lightning이 add-on이다 보니 ubuntu repository에 있는 것을 설치해도 되고 직접 thunderbird 메뉴에서 최신 버젼을 설치해도 되는데, 최신 버젼인 Lightning 0.8의 경우 ubuntu에 있는 thunderbird와 잘 맞지 않는 것으로 보인다. 왜 잘 맞지 않다고 하냐 하면... 아래의 screenshot을 보면 된다.

add-on을 설치하고 thunderbird를 실행하면 달력 pane과 폴더 pane이 분리돼서 보인다.


메일 탭을 누르면 달력 pane의 내용은 사라지지만 공간이 여전히 남는다.


달력 탭을 다시 눌러도 정작 달력이 제대로 표시돼지 않는다. 툴바가 달력 모드로 바뀌어 동작하는 듯 보이지만, 실제로 툴바를 눌러도 화면이 바뀌지 않는다.


그외에도 달력 모드에서 캘린더 메뉴가 엉뚱한 내용으로 차 있다. 새 달력을 추가하는 것도 안되고 화면이 보기 불편한 것 외에 아예 제대로 동작하지 않는다.

그러니 일단 ubuntu의 thunderbird와 제대로 동작하는 Lightning add-on을 설치하는 것이 좋겠다. Lightning add-on은 lightning-extension이라는 이름으로 ubuntu repository에 있고 현재 이글을 쓰고 있을 때 버젼은 0.7이다. 설치는 간편하게 할 수 있다.


3. lightning을 설치했으면 일단 일정 관리를 할 수가 있긴 한데, 요즘에는 한 사람이 컴을 여럿 사용하는 경우가 드물지 않고, 꼭 그렇지 않더라도 여러가지 device에서 sync를 맞춰야 하는 경우가 생긴다. 이러한 용도로 사용하려면 palm용 sync 프로그램들을 사용해도 되지만, 여러 대의 PC 간의 sync를 맞추려면 또 귀찮아진다. 그러니 어딘가 한 군데에 달력을 저장하고 다른 여러 곳의 client에서 불러다가 쓰는 것이 스트레스가 줄어든다.

이를 위해서는 Google Calendar와 Lightning을 같이 사용하면 좋은데, Lightning에서 Google calendar를 이해할 수 있도록 해 주는 thunderbird 용 add-on이 역시 있다. Provider for Google Calendar라는 이름을 가지고 있다. 이 add-on은 Lightning이 설치돼 있어야 동작한다. 현재 최신 버젼은 0.4인데, 이 버젼은 함께 사용할 Lightning이 0.8 버젼 이상일 것을 요구한다. 여기에서 설치한 Lightning이 0.7버젼이므로 이것을 이용할 수가 없는데, Thunderbird add-on site에서 예전 버젼을 찾아보면 0.3.1 버젼이 0.4 이전의 최신 버젼이다. add-on을 설치하는 것은 Thunderbird 용 add-on을 설치하는 일반적인 방법을 그대로 따르면 된다.


4. 설치가 다 됐으면 이제 Google calendar의 달력들을 Lightning에 추가해야 한다. Google calendar로 가서 달력 관리 화면으로 간다. 그러면 제일 아래쪽에 달력 주소와 관련한 부분이 나온다.

비공개 주소의 XML 버튼을 누르면 비공개 주소가 나온다. (하지만, 실제로는 Lightning에 추가할 때 공개 주소를 사용해도 상관 없는 듯 하다. 실제로 주소를 사용하는 것이 아니라 주소에 나오는 캔린더 ID를 따로 처리하는 것으로 보인다.)

파란색으로 표시된 주소를 오른쪽 클릭하여 주소 복사를 선택한다. 이제 Lightning에 달력을 추가한다. 캘린더 탭을 누르면 달력모드로 전환되고, 달력 목록에 Home이라는 것만 하나 있을 것이다. 목록 화면 아무곳이나 오른족 클릭하여 New calendar 항목을 선택하고 On the Network을 선택한다. Provider for Google calendar add-on을 설치했기 때문에 Google calendar라는 항목이 보일 텐데 그것을 선택하고 앞에서 복사한 주소를 붙여 넣기 한다. 그리고 자신의 구글 아이디와 패스워드를 입력하면 끝이다.

Evolution에서도 Google calendar를 불러다가 쓸 수 있는데, 거기서는 기본 달력 하나만 접근 가능하다. 그런데 Lightning에서는 개별 달력 별로 주소만 입력하면 여러개를 사용할 수 있다. 공개 달력도 주소만 알면 추가 가능하다.

Google calendar의 달력 목록

Lightning에 추가된 모습


그리고 다 잘 됐으면 좋겠는데, 문제가 좀 있다. 읽는 것은 문제가 없는데 Lightning에서 수정하는 내용이 Google calendar 쪽으로 잘 전달이 되지 않는다. 이벤트를 마우스로 끌어서 다른 시간으로 움직이는 것은 잘 되는 것을 보면 잘못된 주소를 사용해서 그런 것 같지는 않다. 이동 외에 다른 동작, 그러니까 내용 수정, 생성, 삭제 등은 되질 않는다. 달력 설정에 딱히 뭘 건드려 볼 것도 없어서 언젠가 개발자들이 고쳐주길 기다리는 수밖에 -.-;; 그외에 달력을 off-line으로 저장하고 나중에 sync를 맞추는 것은 아직 안되는 모양이다. (어쩌면 이런 문제들은 Lightning 0.8에서 모두 고쳐진 것인지도 모른다. 써 볼 수가 없어서 모른다. -.-;;)


  
트랙백 0  |  댓글 0  |
이 삽질을 시작한 이유: 그냥 windows가 싫어졌다. 랩에 있는 데스크탑이야 들어 있는 데이터도 많고 파티션이 분리 돼 있다고 해도 이것 저것 다시 설정하는 데에는 한 세월이다. 그리고 몇가지 OS 의존적인 프로그램들이 있어서 Linux로 갈아 엎는다는 것이 굉장한 스트레스를 준다. 어쩌면 갈아 엎고 나서 얼마 안 가 다시 windows로 돌아가야 할 일이 생길지도 모른다. 그래서, 노트북을 TZ25에서 TZ27로 바꾸게 된 김에 거기에 Linux를 깔기로 했다.

Hardware
아래 정보는 windows xp가 깔려 있던 상태에서 장치관리자 정보를 기록한 것이다.

모델명: VAIO VGN-TZ27LN

CPU+RAM: Intel Core2 CPU U7600 @ 1.20GHz, RAM 2GB

NICs: Marvell Yukon 88E8055 PCI-E Gigabit Ethernet Controller + Intel Wireless WiFi Link 4965AGN + Broadcom Bluetooth LAN Access Server Driver 20460A (확인요) + 1394 Net Adapter + HDAUDIO Soft Data Fax Modem with SmartCP

Block Devices: TOSHIBA MK1011GAH (100GB) + MATSHITA DVD-RAM UJ-852S USB Device + Ricoh Memory Stick Disk Device + Ricoh SD/MMC Disk Device

Display: Mobile Intel 945 Express Chipset x 2 + Plug-and-Play LCD Monitor

Pointing Devices: Alps Pointing-device for VAIO + HID 규격 마우스

Battery: MS ACPI-Compliant Control Method Battery (확인요)

Audio: Realtek High Definition Audio (확인요)

기타: Infineon Trusted Platform Module + Sony Visual Communication Camera VGP-VCC7 + TouchChip Fingerprint coprocessor

(확인요)라고 붙인 것은 windows가 알려주는 장치명이 정확한 것인지 확신하지 못하는 경우이다.

Linux Distribution
Linux 배포본이라면 본래 Debian을 좋아했지만 그거야 UI를 콘솔에서 직접 볼 일이 없을 때 얘기고, 노트북에 깔아서 쓰기에는 아무래도 Ubuntu가 좋을 것 같다. Ubuntu도 Debian에서 파생된 배포본이기 때문에 deb 패키징 시스템은 그대로 사용하고 있어서 RedHat 계열에 비해 패키지 관리는 수월할 것 같다(수월하다기보다 익숙하다고 해야 하려나 ㅋㅋ. 나는 Debian의 apt 시스템을 사랑한다). 같은 패키징 시스템을 쓴다고는 해도 Ubuntu가 Debian에 비해서 UI와 같이 사용자와의 interaction은 훨씬 친숙할 테니 이 점에서 Ubuntu가 Debian보다는 좋을 것 같다. 그런데 Ubuntu라고 해도 몇가지 종류 중에서 선택을 해야 하는데 예전부터 UI는 Gnome보다는 KDE를 좋아하긴 했지만 아무래도 Ubuntu에서는 Gnome 쪽이 KDE보다는 대세인 것으로 보인다. 잘 모를 때는 대세를 따르는 것이 좋다. 그래서 Ubuntu를 선택하기로 했다.

Ubuntu 정보: http://www.ubuntu.com/products/whatisubuntu/desktopedition

Ubuntu의 install disk는 Live CD로도 사용할 수 있고 설치용 disk로도 사용할 수 있다.

Install disk 다운로드 위치:
http://ftp.kaist.ac.kr/pub/ubuntu-cd/hardy/ubuntu-8.04.1-desktop-i386.iso

Live CD를 사용하지 안하고 netinst 이미지를 사용할 수도 있는데, 이 경우에는 사용자에게 보다 친숙한 GUI 환경에서 설치를 하지 않고 예전 Debian에서 사용되던 텍스트 형식의 설치 화면이 나온다. 그런데 네트웍 연결이 빠른 곳이라면 좋은 선택이지만 느린 곳에서 살고 있다면 netinst로 설치하는 작업이 스트레스가 될 수 있다. 기본적인 설치 시스템을 빼고 나머지 패키지들은 모조리 네트웍으로 다운로드 받아야 하기 때문이다.

Installation
일단 CD를 구운 다음 windows가 돌고 있는 상태에서 노트북에 삽입하면 이런 화면이 뜬다.

[Kubuntu CD Menu.png]

Full install을 선택하면 reboot option들이 나온다.

[reboot options]

물론, 꼭 windows가 도는 상태에서 CD를 넣어야 할 필요는 없다. 컴퓨터를 끄고 CD를 넣고 전원을 켜도 상관 없다. (오히려 이게 친숙한 방법이지) 어쨌거나 컴퓨터가 부팅될 때 CD가 들어가 있고 boot priority가 HDD보다 CD(혹은 DVD)가 높도록 돼 있기만 하면 된다.

[boot menu] 쿠분투 설치하기, 설치하지 않고 사용해 보기

설치하지 않고 사용해 보기를 선택해 보면, 아무런 설정을 하지 않고 동작되는 주변기기들은 대충 터치패드(두드리기 적용됨), 키보드 (function 키들 일부 동작함 - 음량조절 o, LCD 밝기 조절 o, sleep 모드 들어가기 x, LCD/외부화면 전환 x) 정도이다. 아무래도 노트북의 모든 기능들을 제대로 사용하기 위해서는 제대로 설치를 해봐야 알 듯하다.

Live CD로 부팅을 하고 나면 설치할 수 있는 방법이 두가지가 있다. 하나는 boot menu에서 "설치하지 않고 사용해 보기"를 선택하고 좀 둘러보다가 gnome 메뉴에서 설치 메뉴를 선택하는 방법이고, 또 하나는 boot menu에서 바로 설치 메뉴로 들어가는 방법이다. 결론적으로는 두 방법 모두 같은 GUI를 사용하기 때문에 차이는 없다고 봐도 된다.

파티션 문제
서버로 사용할 거라면 파티션을 잘게 나누는 것이 도움이 되지만 데스크탑으로 사용할 것이라면 굳이 이렇게 할 필요가 없다. lilo(linux loader, 예전에 kernel의 위치를 찾아서 부팅하기 위해서 사용되던 것으로 요즘에는 grub이 사용된다.)의 옛버전을 사용하던 리눅스에서는 서버로 쓰든 데스크탑으로 쓰든 /boot 디렉토리를 별도의 파티션으로 빼고 제일 첫번째 파티션으로 사용했다. 하지만 요즘의 lilo에서는 이렇게 할 필요가 없다. 또 요즘에는 lilo보다는 grub을 사용하는 경우가 대부분이다. 그러니 파티션을 여럿으로 쪼개야 하는 마지막 하나 남은 필요성도 없어진 셈이다. 그래서 일단은 전체 디스크를 사용한다. 그러면 swap 파티션만 따로 빼고 나머지는 남는 디스크를 통째로 사용한다.

설치 준비 단계는 6단계인데 사실 파티션 문제를 빼고 나면 고민할 만한 것들은 거의 없다. 실제 설치 단계에서는 따로 물어보거나 하는 것이 없다. 기다리다가 reboot하라는 메시지가 나오면 CD를 제거하고 reboot하면 된다.

Setup
Windows도 마찬가지이긴 하지만 Linux라는 물건은 설치가 끝났다고 만사가 끝나는 게 아니다. 동일한 목적을 위한 프로그램의 선택이 여러가지가 있기도 하고, 상업용으로 제작되어 돈주고 사는 OS가 아니기 때문에 어떤 패키지에는 직접 사용자가 이런 저런 설정을 해주어야 하는 경우도 있다. 또 나의 경우처럼 노트북에 설치하는 경우라면 노트북 하드웨어에 대한 자세한 기술 정보가 공개되지 않은 경우도 있어서 몇몇 주변기기에 대한 설정이 제대로 되어 있지 않을 수도 있고 아예 지원되지 않을 수도 있다. 이래저래 설치가 끝난 후에 진정한 삽질이 시작된다고 봐야 한다.

아래는 노트북에 따로 저장해 놓았던 설정 기록인데 한글로 적은 것도 있고 영어로 적은 것이 섞여있다. -.-;; 어쨌든 o가 앞에 붙은 것은 해결이 제대로 돼서 뒤에 더 손을 볼 필요가 없는 것이고, +는 어느정도 해결은 됐지만 언젠가 더 손을 봐야 하는 것이다. -의 경우는 문제는 있지만 아직 해결을 못 본 것이다.

o grub
USB로 설치를 했더니 주 HDD의 device가 이상해졌다. grub이 불평을 하면서 부팅을 중단하고 멈추면 일단 아무키나 누른다. 그러면 메뉴가 나온다. 첫번째 항목이 정상 부팅을 하는 옵션이다. 그런데 HDD device가 잘못 설정돼 있을 것이니 고쳐주지 않으면 제대로 부팅할 수 없다. 첫번재 항목을 선택한 상태에서 e를 누르면 부팅 명령을 수정한다. 몇가지 명령어로 구성돼 있는데, (hd1,0)라는 문자열이 있는 줄을 선택하고 e를 누른다. 그러면 그 명령줄이 화면에 표시되는데 hd1을 hd0로 바꾸고 enter를 친다. 다시 부팅 명령 화면으로 돌아간다. hd1이 hd0으로 바뀌어 있는지 확인한다. 그리고 b를 눌러 부팅한다. 일단 부팅하고 나면 /boot/grub/menu.lst를 열어서 hd1으로 돼 있는 것을 모두 hd0으로 바꾼다.

o firefox
ubuntu에는 kubuntu에서처럼 konqueror 같은 전용 browser가 설치되지 않고, 기본적으로 firefox가 설치됨. 한글화 돼 있음. 입맛에 맞는 addon을 설치하거나 개인적인 설정을 하는 것 외에 따로 손을 볼 만한 것은 없음.

o thunderbird
ubuntu에는 기본적으로 설치되지는 않음. aptitude를 이용하여 설치. 한글화 돼 있지 않음. 그러나 한글을 읽고 쓰는 데 문제는 없음.

font가 정말 보기 싫음. gnome 설정에서 모든 font를 Un Graphic으로 바꾸고 나도 제대로 적용되지 않음. gnome 설정을 따르지 않고 별도의 font 설정을 따르는 것으로 보임.
http://www.ubuntu.or.kr/viewtopic.php?f=11&t=785
위 글을 참고하여 ~/.mozilla-thunderbird/xxxx/chrome 디렉토리를 생성하고    userChrome.css를 새로 만들어 넣음.

o cpufreq
관련된 버그 리포트:
https://bugs.launchpad.net/ubuntu/+source/gnome-power-manager/+bug/156472

Run gconf-editor and set a gconf key:
/apps/gnome-power-manager/ui/cpufreq_show

o disable gnome zoom key binding (e.g. win+r)
gconf-editor를 열어서 /apps/compiz/plugins/ezoom 항목을 찾는다. 거기에서 win+r, win+c, win+l, win+v 등으로 설정돼 있는 항목들을 찾아서 disabled로 바꾼다. (win 키는 <Super>로 인식한다. 그러니 win+r이라면 <Super>r 로 돼 있다.)

o iPod sync
available via rhythmbox program

o automatic wifi connection at boot
solved by manual edit function of Gnome Network Manager

+ brightness control
밝기 조정은 원래 동작은 하지만 화면에 아이콘이 나오지는 않는다.
hal-system-lcd-get-brightness와 hal-system-lcd-set-brightness의 첫번째 line을 #!/bin/sh 에서 #!/bin/bash로 변경

그래도 별 변화는 못 느낀다. 저 workaround는 오래된 버그 리포트에서 찾은 것인데 화면에 아이콘이 나오는 것하고는 관계가 없는 것처럼 보인다.

+ HWP
http://charum.org/zb41/zboard.php?id=ubuntu&page=1&sn1=&divpage=1&category=5&sn=off&ss=on&sc=on&select_arrange=headnum&desc=asc&no=49
Install hwp2005 with a little hack. i.e. extend the trial period by removing install time info:
apps/haansoft/shared/installinformation/hwp2005trial/installedtime = 1216636557

window frame disappears! solve it!

+ bluetooth
https://answers.launchpad.net/ubuntu/+question/38592
Type in the command line:
$ sudo hciconfig hci0 reset
After that, vaio finds bluetooth mouse. anyway, it cannot connect to it using bluetooth manager.

http://ubuntuforums.org/showthread.php?p=609310
found a fix to work around a mouse problem. but this looks rather ugly.

Here is my own work around:
edit /etc/default/bluetooth and find HIDD_ENABLED and set to 1;
add "--connect xx:xx:xx:xx:xx:xx" option to the HIDD_OPTION;
restart a bluetooth service by run /etc/init.d/bluetooth start (or restart)

Still problem. I still need "hciconfig hci0 reset". I added this to /etc/rc.local. Now, mouse works. But, I don't know about other things.

See https://help.ubuntu.com/community/BluetoothSetup for further information.

+ sleep and hibernate mode
Commented out sonypi in /etc/init.d/hotkey-setup line 142, but sleep and hibernate still don't work. Anyway, sonypi module seems to have some problem with sony-laptop module. Remove it all the way.

https://bugs.launchpad.net/ubuntu/+source/linux-source-2.6.22/+bug/164398
This helps.
add the following line to /etc/default/acpi-support:
MODULES="iwl4965"
add the following line to /etc/pm/config.d/modules:
SUSPEND_MODULES="ehci_hcd uhci_hcd"
Now, suspend works.

Overall, wireless lan and usb things seem problematic.

Anyway, hibernation does not work yet.
See https://bugs.launchpad.net/ubuntu/+source/linux/+bug/129224 for future investigation

+ internet explorer
installed agent switcher plugin to firefox to fake agent type;
installed ies4linux;

see http://www.tatanka.com.br/ies4linux/page/Installation:Ubuntu
but, font setting is ugly, and there is no activex.

tried with --install-corefonts
noticed not a big change

According to http://www.gagme.com/greg/linux/activex-linux.php, I installed mfc42.dll to enable activex. Now, it seems to work in some cases, but not perfectly.

Bah! Long way to get it work! Forget about it, and just use real Windows XP in VirtualBox. (See virtual machine below)

o instant messenger (all using Pidgin)
MSN by MSN plugin

NateOn by NateOn plugin from http://dev.haz3.com/phpBB3/viewforum.php?f=9
added these two sources to /etc/apt/sources.list:
deb http://ppa.launchpad.net/pidgin-nateon/ubuntu hardy main
deb-src http://ppa.launchpad.net/pidgin-nateon/ubuntu hardy main
and then udpate and install pidgin-nateon package. However, apt will compain that the packages are from untrusted source. Nevermind. I need it.

o virtual machine
Installed virtualbox-ose + libqt3-mt + libxalan110 + libxerces27
Installed virtualbox-ose-modules-2.6.24-19-generic

Some tweaks: see https://help.ubuntu.com/community/VirtualBox
install scim-bridge-client-qt to solve Host key problem related to SCIM
run virtualbox with "taskset -c 1  virtualbox" to solve CPU consumption problem

Install VirtualBox Guest Addition to the guest OS. This will gives shared mouse activities between host and guest OS.

Run virtual machine without front-end screen by
$ taskset -c 1 VBoxSDL -vm <vmname>

VirtualBox doesn't start after I upgrade the kernel from 2.6.24-19 to 2.6.24-20. The reason is that VirtualBox needs a package named as virtualbox-ose-modules-2.6.24-20, but there is no such package yet. One solution is to revert to the previous kernel 2.6.24-19, and the other is to wait until virtualbox packages are updated. I don't have enough time to compile virtualbox-ose from scratch. :(

+ external monitor
found a hint at http://ubuntuforums.org/showthread.php?p=3986738&highlight=VGA#post3986738.
This post is pointing out a more detailed document at http://www.thinkwiki.org/wiki/Sample_Fn-F7_script. Check it out later.

+ webcam
It seems that I have to handle uvcvideo problem.

I found another solution without handling uvcvideo problem. (actually I don't know the relation between this solution and uvcvideo)
see http://wiki.mediati.org/Installation
svn co http://svn.mediati.org/svn/r5u870/trunk r5u870
cd r5u79
make
sudo make install
sudo sudo modprobe r5u870

Now, it works with ekiga. (I did not try other programs.)
Update: it works incorrectly after resuming from suspend.

+ printer driver
I could easily add HP 4300 dtn print driver using gnome's system-config-printer.

But, when I print plain ascii file containing unicode Korean characters, it prints as up-side-down question marks (?). There seems to be a font problem. I'll try installing Korean PS fonts.

o touchpad things
problems: touchpad sensitivity, tapping preference, tapped drag preference. See http://www.cs.utexas.edu/~erkin/home/tools/xorg.conf

o slow DNS problem

- evolution and google calendar

- battery care function
I need some way to handle battery care function.

- power saving!
I installed powertop to help enhancing battery life. let's do care about it later.

- cdrom auto power down for power saving



일단은 이 정도까지. 뭔가 더 건드리게 되면 update하기로 한다.

구글 웹마스터 도구에는 각 사이트의 sitemap을 등록하여 검색 엔진이
어느 주소를 검색 목록에 추가할 것인지를 알 수 있도록 하는 기능이 있는데,
Sitemap protocol이라는 형식의 파일을 사용해도 되고, 기존에 많이 쓰이고
있는 RSS 형식을 사용해도 된다. 그런데, MoniWiki를 사용하는 위키 사이트의
RSS를 구글 웹마스터 도구에 등록하려고 봤더니, MoniWiki에 들어 있는 rss plugin을 통해서는
제대로 되지 않는다. 티스토리에서 제공하는 rss는 잘 등록되는 것을
보면 MoniWiki에서 사용하는 rss 형식이 구글에서 요구하는 rss 형식과
잘 맞지 않는 모양이다. 하지만 어차피 rss protocol에 대해서 잘 알고 있는 것이
아니고 Sitemap 문법이 무척 간단하기 때문에 기존의 rss plugin을 고치기보다
새롭게 sitemap plugin을 하나 간단히 만들었다.

XML 형식은 sitemaps.org에 있는 것을 참조했고,
원래 MoniWiki에 들어 있는 rss_rc plugin과 TitleIndex macro를 참고했다.
현재는 아주아주 단순하게 각 페이지 목록을 추출해서 sitemap에 오로지 위치만
포함시킨다. 다른 정보는 하나도 안 들어간다. -.-;;
버젼은 일단 0.1로 메긴다.


확인 결과 일단은 동작을 하는 듯 하다.
사용자 삽입 이미지

스크린샷을 보니 위키에 페이지가 48개 뿐이라니 쫌 한심하다. ㅋㅋ
아니지, 실제 내용이 들어 있는 페이지는 저거의 반수도 안될 것인데
정말 한심하다. ㅠ.ㅠ

통상적인 APM(apache + php + mysql) 환경에서 소규모의 프로젝트를 할 때에는 대개 apache와 php와 mysql이 모두 한 서버에서 돌아가는 경우가 있다. 이런 경우라면 php와 mysql 사이의 통신을 모두 local에서만 하도록 하면 안전은 별로 신경을 쓸 필요가 없다.

그런데 만약에 DB를 따로 분리하면 php가 돌아가는 머신과 DB 서버가 돌아가는 머신 사이의 통신을 안전하게 보호해야 하지 않을까 하는 생각이 들기 마련이다. 바쁘고 정신 없다면 그냥 사용자 인증만 하도록 하면 되겠지만, 누군가가 sniffing을 해 버리면 DB의 내용이 노출된다. 그러니 이런 때에는 암호 통신을 하면 좋은데 생각해 볼 수 있는 방법은 ssh tunnel을 사용하는 것과 SSL을 사용하는 것이 있겠다. SSH tunnel을 사용하는 것은 php에서 이런 것이 지원되는지 아직 모르니 일단 SSL을 이용하는 것에 대해서 썰을 풀도록 하자.

(이건 혼자서 심심풀이 땅콩, 내지는 나중에 내가 찾아보기 쉽게 쓰는 것이니 다른 곳에 더 좋은 문서가 있을 수도 있음.)

사용한 환경 (이건 뭐 적당히 달라도 될 듯. 버젼에 영향을 받는 경우는 본문 중에 따로 표시)
Server: Debian etch, MySQL 5.0, OpenSSL 0.9.8
Client: Debian etch, MySQL 5.0 C library, PHP 5, PHP PEAR, OpenSSL 0.9.8

참고한 문서
MySQL 5.0 Documentation: Using SSL Connections
MySQL 5.0 Documentation: SSL Command Options
PEAR Manual: DB: Introduction - connect
PHP Manual: mysqli_ssl_set

MySQL 문서에 의하면 설치된 MySQL이 SSL을 지원하는지를 확인하는 4가지 절차가 나와 있다.
여기에서는 패키지로 설치하는 것만 생각할 테니 다음의 절차를 통한다.
(이후 노란 배경에 #는 shell prompt, mysql>은 DB의 command prompt를 나타냄.
회색 배경은 명령의 결과, 또는 파일의 내용임.)

1. SSL이 지원되도록 compile 된 패키지인지 확인
서버에서 다음을 실행한다.
# mysqld --ssl --help

에러가 나오지 않고 대충
mysqld  Ver 5.0.45-Debian_1-log for pc-linux-gnu on i486 (Debian etch distribution)
Copyright (C) 2000 MySQL AB, by Monty and others
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Starts the MySQL database server

Usage: mysqld [OPTIONS]

For more help options (several pages), use mysqld --verbose --help

와 같은 식의  안내 메시지가 나오면 된 것이다.
(내가 사용된 Debian 패키지에는 SSL이 지원되는 것이 들어가 있다.)

2. Run time에서 SSL 옵션이 켜져 있는지 확인
서버에서 다음을 실행한다.
# mysql -u root -p (DB에 root로 로긴한다. 물론 패스워드를 입력해야 한다.)
mysql> SHOW VARIABLES LIKE 'have_openssl';

그러면 다음과 같은 output이 나올 것이다.
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
+---------------+----------+
1 row in set (0.00 sec)
내가 사용한 패키지의 기본 설정으로는 openssl을 사용하는 옵션이 꺼져 있다. (물론 지원은 된다.)이제 저 옵션을 켜야 하는데, 서버를 다시 시작하지 않고도 할 수 있을 테지만, 일단은 문서에 나오는 대로 서버를 새로 시작하는 방법을 따른다. (물론, 이렇게 해야 서버를 다른 이유로 재시작할 때도 SSL 옵션이 켜지게 되겠지.)

참고로 MySQL은 OpenSSL 말고 내장된 yaSSL을 사용할 수도 있는데, 심심풀이 삼아서 알아보려면 다음을 실행한다.
mysql> show variables like '%ssl%';
결과는 다음과 같을 것이다.
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |
| have_ssl      | DISABLED |
| ssl_ca        |          |
| ssl_capath    |          |
| ssl_cert      |          |
| ssl_cipher    |          |
| ssl_key       |          |
+---------------+----------+
7 rows in set (0.00 sec)
위에서 보는 바와 같이 yaSSL도 지금은 사용하지 않도록 돼 있다. 그리고 인증서나 기타 SSL과 관련된 정보들이 하나도 들어가 있지 않음을 알 수 있다.

3. SSL 관련 서버쪽 옵션
서버에서 다음을 실행해야 한다. "실행한다"가 아닌 것에 주의 ^^; 뭘 실행해야 하는 것인지 일단 살펴보기로 하자.
# mysqld --ssl-ca=cacert.pem --ssl-cert=server-cert.pem --ssl-key=server-key.pem
이렇게 실행되도록 만들어야 하는데 일단 사용되는 옵션을 조금만 뜯어보면,
  1. --ssl-ca 옵션은 CA의 리스트와 그 인증서들을 가져올 파일을 지정해 주는 것이고,
  2. --ssl-cert 옵션은 이 서버가 사용할 공개키가 포함된 인증서가 저장된 파일을 지정해 주는 것이고,
  3. --ssl-key 옵션은 이 서버가 사용할 비밀키가 저장된 파일을 지정해 주는 것이다.
일단은 비밀키, 공개키와 인증서를 만들어야 함을 알 수 있다. 이것들을 만들기 위해서는 잠시 MySQL에서 벗어나서 OpenSSL을 가지고 놀아야 한다.
참고로 Debian 패키지에 딸려 오는 설정 파일(/etc/mysql/my.cnf)에는 다음과 같은 부분이 있다.
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
세가지 옵션이 comment 처리돼 있고, 그 위의 설명에는 인증서들을 만드는 데에 tinyca라는 프로그램을 사용하면 좋다고 돼 있다. 이 tinyca라는 게 무엇이냐 하면 GUI로 인증서를 만들어주는 툴인데, 나의 경우 서버에는 GUI 툴을 실행하기 위한 X-window 관련 패키지들이 하나도 깔려 있지 않다. 그러니 저 패키지를 깔려면 그다지 사용하게 되지 않을 대량의 라이브러리들을 깔아야 한다는 의미가 되겠다. 그런 건 싫지. 그리고 왠지 guru의 분위기를 풍겨 보자면 openssl을 직접 가지고 놀아 보는 게 좋을 것 같다. 므흐흐... (아, 정말 쓸 데 없는 이유다. -.-;;)

4. 인증서 만들기
인증서라는 것은 자신의 공개키와, 그 공개키를 다른 사람이 믿을 수 있게 만들기 위해서 CA라는 인증기관의 서명을 덧붙인 것을 말한다. 그런데 문제는 CA의 서명을 받으려면 돈도 들지 모르고 이래 저래 귀찮아진다. 그러니 여기서 사용할 것들은 모두 "local"에서만 의미를 갖도록 만든다. 무슨 말이냐 하면 혼자서 CA 역할도 하고 북치고 장구치고 하는 것이다. 이 글의 목적이 애초에 제대로 된 인증 시스템 안에 편입하는 것이 아니고, 단순히 "암호화 통신"만을 가능하게 만들려는 것이기 때문이다.

일단 서버에 이미 openssl을 위해서 openssl 관련 라이브러리들이 깔려 있어야 하니
# aptitude install openssl
이라고 해서 같이 설치할 거냐고 물어보는 관련 패키지들까지 모조리 설치한다. 그 다음에
# openssl -h
라고 실행하면 '-h'라는 명령이 없다고 불평은 하지만, 착하게도 사용 가능한 명령어 목록을 보여준다. :)
openssl:Error: '-h' is an invalid command.

Standard commands
asn1parse      ca             ciphers        crl            crl2pkcs7     
dgst           dh             dhparam        dsa            dsaparam      
ec             ecparam        enc            engine         errstr        
gendh          gendsa         genrsa         nseq           ocsp          
passwd         pkcs12         pkcs7          pkcs8          prime         
rand           req            rsa            rsautl         s_client      
s_server       s_time         sess_id        smime          speed         
spkac          verify         version        x509          

Message Digest commands (see the `dgst' command for more details)
md2            md4            md5            rmd160         sha           
sha1          

Cipher commands (see the `enc' command for more details)
aes-128-cbc    aes-128-ecb    aes-192-cbc    aes-192-ecb    aes-256-cbc   
aes-256-ecb    base64         bf             bf-cbc         bf-cfb        
bf-ecb         bf-ofb         cast           cast-cbc       cast5-cbc     
cast5-cfb      cast5-ecb      cast5-ofb      des            des-cbc       
des-cfb        des-ecb        des-ede        des-ede-cbc    des-ede-cfb   
des-ede-ofb    des-ede3       des-ede3-cbc   des-ede3-cfb   des-ede3-ofb  
des-ofb        des3           desx           rc2            rc2-40-cbc    
rc2-64-cbc     rc2-cbc        rc2-cfb        rc2-ecb        rc2-ofb       
rc4            rc4-40        

이 중에서 필요한 명령은 genrsa와 req 명령이다. Debian의 경우 패키지로 깔면 man page도 깔렸을 테니
# man req
라고 하면 openssl에서 req 명령의 설명을 보여준다. 간단히 썰을 풀면, 인증서를 검증하는 것과 인증서를 생성하는 것을 해주는 명령이라고 한다. 우리가 여기서 필요한 것은 인증서를 생성하는 것이다. 설명 중에 보면 "It can additionally create self signed certificates for use as root CAs for example."라고 하는데 여기서 나는 root CA의 역할까지 몽땅 해버릴 작정이다. :)

우선 genrsa 명령으로 서명 받을 키를 만든다. 명령 이름에서 유추할 수 있듯이 이 명령은 RSA에 사용할 private key를 만드는 명령이다.
# openssl genrsa -out myprivkey.pem 2048
openssl에 관련된 어떤 문서들을 보면 -des3이나 idea나 -des 같은 옵션을 붙이도록 돼 있는데 여기서는 이렇게 하면 안된다. 이 키는 서버가 (그러니까 사람이 아니라 프로그램이) 사용할 키이기 때문이다. 참고로 저 옵션 중에 하나를 붙이면 비밀키가 암호화돼서 저장되기 때문에 키를 사용하려고 할 때마다 암호를 풀기 위해서 passphrase를 입력해 줘야 한다. 프로그램이라면 당연히 그렇게 할 수가 없지.

그 다음에는 저 키로부터 공개키를 얻어서 그것을 서명받아야 한다.
# openssl req -new -x509 -key myprivkey.pem -out mycacert.pem -days 0
이렇게 만든 인증서를 self-certified certificate이라고 부른다. 알아 듣기 쉬운 말로 하면, 자신의 공개키가 맞다는 것을 자기 이름을 걸고 보증한다는 뜻이다. 제대로는 자신의 공개키를 자신의 비밀키로 서명한 것이다. 이런 것은 원래 root CA나 하는 일인데, 나는 혼자서 북치고 장구칠 작정이기 때문에 혼자서 키 만들고 혼자서 서명한다. ^^

역시나 심심풀이 삼아서 이것을 검증해 보면
# openssl verify -verbose -CAfile mycacert.pem mycacert.pem
mycacert.pem: OK
라고 나온다.

5. 서버 설정하기
Debian의 경우 mysql의 설정파일이 /etc/mysql/my.cnf 라고 돼 있다. 이 파일에서 다음 부분을 찾아서 수정한다.
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
# ssl-ca=/etc/mysql/cacert.pem
# ssl-cert=/etc/mysql/server-cert.pem
# ssl-key=/etc/mysql/server-key.pem
아래와 같이 바꾼다.
# For generating SSL certificates I recommend the OpenSSL GUI "tinyca".
#
ssl-ca=/etc/mysql/mycacert.pem
ssl-cert=/etc/mysql/mycacert.pem
ssl-key=/etc/mysql/myprivkey.pem
물론 위에서 만든 myprivkey.pem과 mycacert.pem은 /etc/mysql에 넣어두어야 한다.
그 다음에 서버를 재실행한다.
# /etc/init.d/mysql restart

이제 mysql에 로그인해서 살펴보면
mysql> show variables like '%ssl%';
+---------------+--------------------------+
| Variable_name | Value                    |
+---------------+--------------------------+
| have_openssl  | YES                      |
| have_ssl      | YES                      |
| ssl_ca        | /etc/mysql/mycacert.pem  |
| ssl_capath    |                          |
| ssl_cert      | /etc/mysql/mycacert.pem  |
| ssl_cipher    |                          |
| ssl_key       | /etc/mysql/myprivkey.pem |
+---------------+--------------------------+
7 rows in set (0.00 sec)
요렇게 나오는 것을 볼 수 있다.

안타까운 것은 여기까지는 그냥 준비라는 사실 ^^
이제 DB 서버에서 grant 명령 등을 이용해서 사용자 설정들을 해 줘야 한다.

6. 사용자 등록
일단 시험용 database를 하나 만든다.
mysql> create database fortest;
그리고 시험용 사용자를 만든다.
mysql> grant all privileges on fortest.* to testuser@testhost identified by 'testpass' require SSL;
다른 것들은 mysql의 설명을 참조하고, 중요한 것은 끝에 require SSL이 붙어야 한다는 것이다.

7. Client 연결
client 쪽, 그러니까 php가 돌고 있는 쪽에서는 몇가지 설정할 것이 없는데 설치돼 있는 패키지가 ssl을 지원하도록 컴파일 된 것이기만 하면 된다. 내가 설치한 패키지는 지원이 된다. 그러니 남은 것은 연결할 때 어떤 option들을 주느냐이다.

7.1 mysql 명령을 이용하는 경우
이건 거의 시험삼아 접속해 보는 경우일 것이다.
client에서 다음을 실행한다.
# mysql -u testuser -p -h server.mydomain.net --ssl --ssl-ca=mycacert.pem fortest
물론, mycacert.pem 파일이 다른 곳에 있으면 그곳까지의 경로를 다 써준다.
앞서서 설정한 패스워드(testpass)를 입력하면 접속이 돼야 한다. 여기서 물론 server.mydomain.net은 가상의 주소이고 실제로는 자기 서버 주소를 쓴다.

7.2 PEAR 중의 DB.php를 이용할 경우
PEAR 패키지 중에 있는 DB module은 dsn이라는 것을 이용하여 DB 서버가 어디에 있고 어떻게 접속할 것인지 정한다. dsn은 웹 페이지 URL과 유사한 string 형태로 지정할 수도 있고 array 형태로 지정할 수도 있는데, 실수를 방지하기에도 그렇고 보기에도 array 형태가 좋다.
$dsn = array(
    'phptype'   => 'mysqli',
    'username'  => 'testuser',
    'password'  => 'testpass',
    'hostspec'  => 'server.mydomain.net',
    'database'  => 'fortest',
    #'key'      => <optional>,
    #'cert'     => <optional>,
    'ca'        => 'mycacert.pem',
    #'capath'   => <optional>,
    #'cipher'   => <optional>,
); 
$options = array(
    'ssl'       => true,
);
$db_link = DB::connect($dsn, $options);
#로 comment 처리된 부분은 써줘도 안써줘도 되는데 지금처럼 혼자서 북치고 장구치는 상황에서는 안 써주는 게 낫다.

7.3 php의 mysqli_connect(), mysqli_ssl_set()을 이용할 경우
SSL을 이용하려면 mysql_* function들은 안되고 mysqli_* function들을 써야 한다. 저 i는 improved의 의미라나. 어쨌든, 그런데 이 경우에 persistent connection을 사용할 수 없게 된다. 이건 아쉽..

일단 mysqli_init()으로 db link하나를 생성한다. (맞다. 쫌 불편해진다.)
$db = mysqli_init();

mysqli_ssl_set()을 이용해서 ssl관련 변수들을 설정한다.
원래 syntax는 mysqli_ssl_set(mysqli $link, string $key, string $cert, string $ca, string $capath, string $cipher)인데, 여기에서 $link와 $ca 빼고는 설정 안해도 되기 때문에 모두 NULL로 한다. 그러면 다음과 같이 된다.
mysqli_ssl_set($db, NULL, NULL, 'mycacert.pem', NULL, NULL);

그 다음에 실제로 연결한다. (function이름도 mysqli_real_connect()이다. ^^)
mysqli_real_connect($db, 'server.mydomain.net', 'testuser', 'testpass', 'fortest');

8. 마무리
음... 마무리는... 음...
php의 mysqli extension을 쓰면 좀 불편해지기도 하고 persistent connection을 쓸 수 없어지는 문제도 있는데, PEAR를 사용하면 persistent connection을 쓸 수 있도록 하는 옵션이 있다. 이런 면에서는 PEAR를 사용하는 편이 좋을 것 같긴 하다. (근데 실제로 persistent connection이 되는지 안 되는지 확인은 안 해 봤음. :p)

ps. 지금 보니 PEAR를 이용하더라도 phptype이 mysqli로 돼 있으면 결국 php의 mysqli extension을 내부적으로 사용하기 때문에 presistent connection은 사용할 수 없다. 그러니까, 결론은 ssl connection을 사용하느냐 persistent connection을 사용하느냐의 선택이 돼 버린다는 얘기다. 쩝... 하긴 어딘가에서 보니 persistent connection이 꼭 좋은 건 아니라고 돼 있긴 하다.

'Linux & Unix' 카테고리의 다른 글

VAIO + Ubuntu 사용  (1) 2008.08.08
MoniWiki Sitemap Plugin  (0) 2008.04.25
SSL을 이용한 MySQL 연결  (3) 2007.11.12
Debian Linux에서 openafs client 설치  (0) 2007.04.18
ssh-agent 활용법 두번째  (0) 2007.03.29
hanterm에서 status bar 완전히 없애기  (0) 2007.01.17
  
트랙백 0  |  댓글 3  |
환경: Debian GNU/Linux ver. 4.0 (etch)
AFS cell server DB:
>postech.ac.kr          #Pohang University of Science and TEchnology, Korea
141.223.7.101                   #afsdb1.postech.ac.kr
141.223.7.102                   #afsdb2.postech.ac.kr
141.223.7.103                   #afsdb3.postech.ac.kr

뭘 먼저 설치하든 큰 상관은 없는데, 일단 openafs-client를 설치한다.

$ aptitude install openafs-client

(aptitude 대신에 apt-get을 써도 된다. 효과는 같다.)

사용자 삽입 이미지
자신이 속한 AFS cell의 이름을 적는 곳인데, 나의 경우 postech.ac.kr에 속해 있으므로
그렇게 적는다. 자신이 AFS cell에 속해 있지 않다면 afs라는 것이 별로 쓸모가 없으므로
혹시나 흘러흘러 여기까지 온 사람들은 여기에서 멈추는 것이 좋겠다. -.-;;

사용자 삽입 이미지
cache 크기를 정하는 건데 그냥 default대로 둔다.

사용자 삽입 이미지
/afs 이하의 내용을 유동적으로 만들 것인지를 정하는 것인데, 왠만하면 no를 선택하는 것이
좋겠다. no를 선택하면 자신이 속한 Cell의 관리자가 정해놓은 내용을 보게 될 것이고,
yes를 선택하면 afs client가 CellServerDB에 있는 내용을 보고 알아서 만들어낸다.
나의 판단에 afs는 서로 다른 cell 간에 파일 전송에는 그렇게 어울리는 것이 아니기 때문에
자기 cell의 관리자를 믿고, 이 화면에서는 no를 선택하는 것이 좋겠다. 호기심이 생기면
yes를 해 봐도 되지만, 머리만 아파질 확률이 더 높다.

사용자 삽입 이미지
드디어 자신이 속한 cell의 cell server DB들의 주소를 적는다. IP를 직접 적기 보다는
그냥 hostname을 (가능하면 suffix까지 모두) 적는다. 그게 보기가 좋다. -.-;;
서버가 여러개면 space로 구분.

사용자 삽입 이미지
openafs client를 자동으로 시작할 거냐고 묻는데, 네트웍에 항상 물려 있는 컴이라면
당연히 yes를 선택한다. 그렇지 않다면 아마도 no를 선택하는 것이 현명하겠지만.
네트웍이 끊기면, cd나 ls 정도를 해도 멈추어서 두통을 유발할 수 있기 때문이다.

사용자 삽입 이미지
마지막 화면에 나온대로 아직 openafs module이 안 올라가 있기 때문에 서비스가
시작되지는 않는다. 이런 화면이 보기 싫다면 module을 먼저 build해서 올리면 되는데... :)
이 상태에서 일단 openafs module을 build하고 올리도록 한다.

모듈을 올리는 가장 손쉽고 편리한 방법은 debian package 중에 있는 module-assistant를
사용하는 것이다. 이게 언제 debian에 도입됐는지는 모르지만, 작업량을 비약적으로 줄여주는
효과를 갖는다. 만세! (예전에는 make-kpkg로 약간 더 불편하게 작업했는데 중간에 문제가
생기면 익숙하지 않은 사람이 헤쳐나가기엔 좀 까다로운 면도 있다.)

일단 module-assistant를 설치한다.

$ apt-get install module-assistant

그리고 실행

$ module-assistant
별다른 옵션 없이 실행하면 menu를 출력해주고 그 중에서 자신이 원하는 동작을 선택한다.
사용자 삽입 이미지
처음 실행하는 거라면 먼저 update를 선택해서 패키지 목록을 갱신해 준다.
사용자 삽입 이미지
그 다음에 prepare를 눌러서 module-assistant의 작업 공간을 마련해준다.
사용자 삽입 이미지
그러면 작업환경에 필요한 패키지들을 알아서 선택해서 설치까지 한다.
사용자 삽입 이미지
엔터키 누르고 계속해서 이제 설치할 모듈을 선택한다.
사용자 삽입 이미지
아래 화면과 같이 목록이 나오는데 화살표키로 이동해서 openafs-modules를 선택한다.
사용자 삽입 이미지
선택은 space 키를 눌러서 한다. * 표시가 생기면 선택된 것이다.
사용자 삽입 이미지
모듈을 선택하고 나면 또다른 메뉴가 나온다. 여기에서 GET을 선택해서 해당 모듈의
소스 패키지를 다운로드하고 설치한다.
사용자 삽입 이미지
사용자 삽입 이미지
소스 패키지의 설치가 에러 없이 끝났으면 이제 build한다.
사용자 삽입 이미지
대충 아래와 같은 화면이 나오고 컴파일이 진행된다.
사용자 삽입 이미지
끝나고 메뉴로 돌아오면 이번에는 INSTALL을 선택해서 모듈이 들어 있는 패키지를 설치한다.

이제 openafs 서비스를 시작해야 하는데
$ /etc/init.d/openafs-client restart
를 선택한다. 이전에 서비스를 시작한 적이 없다면 restart 대신에 start로 해도 된다.
restart가 안전하다.

Debian etch에 따라오는 openafs-client에는 klog 프로그램이 기본으로 포함돼 있다.
자신의 afs cell에서의 사용자이름이 alice였다면
$ klog alice
라고 한 후에 패스워드를 입력하면 afs token을 받아온다. 이것은 cell 관리자의 설정이나
afs 설정에 따라 달라지는데 나의 경우는 25시간짜리 토큰을 받게 되어 있다.
현재 보유하고 있는 토큰을 보려면
$ tokens
라고 하면 된다. 당장 token을 없애려면
$ unlog
라고 한다.

기타 사용법은 다른 곳 참조.

'Linux & Unix' 카테고리의 다른 글

MoniWiki Sitemap Plugin  (0) 2008.04.25
SSL을 이용한 MySQL 연결  (3) 2007.11.12
Debian Linux에서 openafs client 설치  (0) 2007.04.18
ssh-agent 활용법 두번째  (0) 2007.03.29
hanterm에서 status bar 완전히 없애기  (0) 2007.01.17
ssh-agent 활용법  (2) 2006.12.29
  
트랙백 0  |  댓글 0  |
http://computing.lbird.net/2630968에 있는 내용에 추가.

왠지 모든 것이 자동으로 일어났으면 한다고 생각된다면(제가 그렇습니다. -.-;;) 다음의 방법을 사용할 수 있다. 다시 말하면, ssh-agent를 직접 command line에서 실행하는 것이 귀찮은 것이다.

.bash_profile에 위의 내용 대신 아래와 같이 삽입한다.
# ssh-agent variables
if [ -f ~/.ssh-agent.sh ]; then
. ~/.ssh-agent.sh
fi
if [ ! -S $SSH_AUTH_SOCK ]; then
ssh-agent -t 86400 > ~/.ssh-agent.sh
echo "No agent! ssh-agent started."
. ~/.ssh-agent.sh
fi

이렇게 하면 일단 .ssh-agent.sh이라는 파일이 이미 있는지 확인하고 있으면 읽어들인다. 그리고 거기에서 설정된 소켓($SSH_AUTH_SOCK)이 정말로 있는지 확인한다. 그렇지 않으면 ssh-agnet가 돌고 있지 않으니 새로 실행한다는 메시지를 띄우고 .ssh-agent.sh를 다시 만든다. 다른 것 또 한가지는 -t 86400 옵션을 추가해서 기본적으로 ssh-add를 통해서 key를 집어 넣을 때 제한시간을 하루로 설정한다는 것이다.

  
트랙백 0  |  댓글 0  |
한텀을 쓰면 보통 화면 제일 아래에 status bar가 위치한다.

사용자 삽입 이미지

상태바가 있음


이리저리 구글링을 해 보면 [완성/조합] 과 [두벌식/세벌식] 표시를
없애는 것은 나오는데 상태바를 완전히 없애는 것은 나오지 않는다.
hanterm의 도움말을 보면 -hns 옵션을 주면 상태줄이 없어진다고
돼 있는데, 이 옵션을 줘도 아무런 효과가 없다. 구글링을 해봐도
소용이 없길레 debian에 있는 hanterm-xf-3.3.1p18의 소스를 뒤졌다.
그랬더니 왠걸, -hns가 아니라 -nhs 옵션을 줘야 없어지도록 돼 있다.
구글링을 더 잘했으면 나올지도 모르겠지만, 일단 나는 답을 찾았으니
삽질기에 등록해 놓는다.

사용자 삽입 이미지

상태바가 없음


그런데 application defaults file이나 .Xdefaults 같은 파일을 써서 없애는
방법은 아직 모르겠다. 일단 급하지 않으니 저대로 써야겠다.
현재 내 xmanager에서는 hanterm-xf -nhs -geom 80x40 을 실행하도록
설정돼 있다.

http://wiki.kldp.org/wiki.php/UsingSshAgent 에 오늘 쓴 글.

1 서설

subversion을 항상 local에서만 사용하다가 얼마전에 archive 전용 서버를 하나 마련하고 remote로 사용하고 있었지요. svn+ssh 을 이용해서 접속하고 있었는데, 이거 매번 ssh을 위해서 패스워드를 치기가 영 귀찮은 것이 아닙니다. 어떤 때는 coding하는 시간보다 패스워드 치는 시간이 더 긴 것 같다는 착각이 들 때도 -.-;;;; 그래서 ssh-agent를 사용하는 방법을 찾아봤는데 의외로 간단히 정리돼 있는 게 없어서, 아주 간단히 사용방법의 하나를 소개합니다. 이후는 편의상 반말로 :)

2 미리 확인할 것들

  1. 우선 당연히 ssh client와 server가 제대로 동작하도록 설정하였는지 확인한다.
  2. 위의 사항이 제대로 되었으면 당연히 되겠지만, 혹시 모르니 ssh-keygen, ssh-copy-id, ssh-agent, ssh-add의 명령어가 사용 가능한지 확인한다.

3 상황 설명

현재 자신이 작업하고 있는 머신이 machA라고 하고, svn+ssh server가 돌고 있는 머신을 machB라고 하자. 편의상 두 머신에 alice라는 username으로 계정을 가지고 있다고 가정한다.

4 준비 작업

우선 ssh용으로 쓸 key pair를 만들어야 한다. machA에서 다음의 작업을 수행한다.

alice@macha:~$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/lbird/.ssh/id_rsa):
Enter passphrase (empty for no passphrase): <password>
Enter same passphrase again: <password>
Your identification has been saved in .ssh/id_rsa.
Your public key has been saved in .ssh/id_rsa.pub.
The key fingerprint is:
33:d9:ac:19:bd:75:13:e5:4a:d9:3c:98:fa:4f:39:d6 lbird@debian
alice@macha:~$

key를 생성했으면 machB로 공개키를 전달해야 한다. machA에서 다음 작업을 수행한다.

alice@macha:~$ ssh-copy-id alice@machb
alice@machb's password: <alice@machb의 password>
Now try logging into the machine, with "ssh 'alice@machb'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
lbird@debian:~$

여기서 <alice@machb의 password>와 위의 <password>는 같을 필요는 없다는 것에 유의. 확인은 안해봤지만 당연히 그럴 것 같다. :)

5 ssh-agent 설정

다른 곳에 좋은 설명이 많겠지만 간단히 설명하면, ssh-agent라는 프로그램은 한번 실행하면 계속 메모리에 상주하면서 사용자의 private key를 안전하게 보호하고 있게 된다. 여기에 ssh-add라는 프로그램으로 사용자가 추가하고 싶은 private key를 집어 넣을 수 있다. ssh-agent는 실행될 때 소켓을 하나 만든다. 다른 프로그램들은 그 소켓 이름을 SSH_AUTH_SOCK라는 환경 변수에서 알아내서 ssh-agent와 통신해서 private key를 얻는다.

machA (자신의 주 작업장)에 처음 로긴하면 일단 다음의 명령을 실행한다.
alice@macha:~$ ssh-agent > ~/.ssh-agent.sh

순서는 좀 바뀌었지만, machA의 alice의 홈디렉토리에 있는 .bash_profile에 다음의 몇줄을 추가하도록 한다.
# ssh-agent variables
if [ -f ~/.ssh-agent.sh ]; then
. ~/.ssh-agent.sh
fi

사실상 ssh-agent와 관련한 작업은 이제 끝났고 사용만 하면 된다.

6 사용

사실 그냥 쓰면 된다. -.-;;

machA가 한번 부팅된 이후에 잘 리붓하지 않는 머신이라면 부팅 직후 첫번째 로긴에서 위의 ssh-agent를 실행하는 작업을 해주면 다음에는 아무런 작업이 필요 없다.

자주 리붓되는 머신이라면 역시 부팅 직후 첫번째 로긴에서 ssh-agent를 실행해 주면 된다. (앞 단락이랑 같은 얘긴데 -.-;; )

7 사족

그냥 끝내면 심심하니까.. ^^

ssh-agent가 없을 때는 접속할 때 이런 식이다.
alice@macha:~$ ssh alice@machb
Password: <alice@machb의 password>
Linux machb 2.6.8-2-686 #1 Tue Aug 16 13:22:48 UTC 2005 i686 GNU/Linux
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have mail.
Last login: Wed Dec 27 12:02:44 2006 from macha
alice@machb:~$

ssh-agent가 있으면

alice@macha:~$ ssh alice@machb
Linux machb 2.6.8-2-686 #1 Tue Aug 16 13:22:48 UTC 2005 i686 GNU/Linux
The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.
Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
You have mail.
Last login: Wed Dec 27 12:02:44 2006 from macha
alice@machb:~$

password 안 물어본다. (사실 처음 접속할 때는 물어본다 :p)

svn+ssh을 통해서 작업한다면 update나 commit을 할 때마다 한두번씩 물어보는 패스워드를 처음에 한 번만 입력하면 된다는 아주아주 편리한 점이 생긴다.

  
트랙백 0  |  댓글 2  |
 이전  12   다음 

fotowall :: ncloud RSS Feeds today : 7   yesterday : 6
total : 159,113