Systems/Unix2015.08.06 10:42

ToastCloud는 NHN ENTERTAINMENT에서 제공하는 IaaS 서비스이다. 이 서비스를 이용하면 VM들을 할당받아 Kubernetes 클러스터를 만들 수 있다. 


사전 준비 


ToastCloud는 http://cloud.toast.com에서 서비스하고 있다. 우선 아이디를 만들고, 프로젝트를 만들고, Infrastructure 상품을 enable 한 다음 (좌측 메뉴의 Infrastructure > Compute) Ubuntu 14.04 VM을 네 개 만든다. (상세한 과정은 http://cloud.toast.com/documents/1/?content_id=18 참고) 


이 때 Zone은 kr-a나 kr-b 가운데 하나를 선택하며 Flavor는 원하는 VM의 크기에 따라 알맞은 것을 선택하면 되며, 이름은 kubernetes-cluster 같은 것으로 주면 된다. instance의 수는 4 정도로 잡으면 테스트 해 보기에는 적당한데, 더 큰 클러스터를 원하면 더 크게 잡으면 된다. 


Kubernetes 클러스터는 하나의 Kubernetes master와 여러 개의 minion들로 이루어진다. instance를 4로 잡았다는 것은, 마스터 하나에 minion 네 개를 쓰겠다는 뜻이다. 구성하기에 따라서는 마스터 노드에 minion도 같이 구성할 수 있긴 한데, 정신 사나우므로 별로 추천하고 싶진 않다. 


위와 같이 VM을 만들 때 주의할 것은, 아래의 그림과 같은 사항이다. 



외부에서 VM에 ssh에 접속할 때 필요한 private keypair를 만들고, 다운받아 두는 것이다. 이 keypair를 다운받아 두지 않으면 나중에 외부에서 접속할 방법이 없으므로 반드시 다운받아두도록 하자. 


아무튼, 이렇게 해서 VM을 만들면 화면에 VM이 네 개 보이게 될 것이다. 이제 해야 할 것은, 생성된 VM들 가운데 master node로 이용할 VM에 floating IP, 그러니까 public IP를 할당해 두는 것이다. public IP를 할당하지 않으면 외부에서 접속이 불가능하다. 방법은 역시 http://cloud.toast.com/documents/1/?content_id=18를 참고하자. 


이제 SSH 접속을 위해 마지막으로 해야 할 일은 Infrastructure > Network & Security 메뉴에서 'default' security group에 SSH 접속을 위한 규칙 하나를 추가하는 것이다. 방법은 간단하니까 들어가서 해 보면 금방 알 수 있다. 


장비 접속과 추가 설정


이제 아까 다운받았던 pem 파일(private key file)과 ssh 클라이언트, 그리고 public IP 주소로 kubernetes 마스터 노드에 접속을 시도해 보자. 


$> ssh -i my-kuber-keypair.pem ubuntu@<public IP 주소>


모든 VM에는 이미 ubuntu라는 기본 계정이 있다. 이 계정으로 모든 작업을 진행하면 된다. 


접속이 되는 것을 확인하였다면, 아래 명령으로 .pem 파일을 master 노드에 복사해 두자. minion 노드에 접속하려면 마스터 노드를 거치지 않으면 불가능하므로, 이 조치가 필요하다. 


$> scp my-kuber-keypair.pem ubuntu@<public IP 주소>:


이렇게 하면 master 노드의 ubuntu 계정에서 다른 minion 노드로 접속하기 위한 private key file이 master node의 /home/ubuntu 아래에 복사된다. 


복사를 마쳤다면, 이제 다시 master 노드에 ssh 접속해서, .bashrc 파일의 맨 아래쪽에 아래의 코드를 추가하자. 


SSH_AGENT_PID=$(pgrep -f ssh-agent)


if [ ! $SSH_AGENT_PID ]; then

ssh-agent > ~/.ssh-agent.sh

fi


. ~/.ssh-agent.sh 


ssh-add my-kuber-keypair.pem


이 코드를 추가하면 ssh-agent가 실행되고, 거기 private key가 등록된다. 그러면 ssh로 minion에 접속할 때 -i 옵션을 생략할 수 있다. 이 절차가 중요한 이유는, Kubernetes가 클러스터 구성 과정에서 필요한 파일을 각 노드에 복사할 때, -i 옵션을 쓰지 않기 때문이다. 따라서 이 절차가 없으면 클러스터의 각 노드에 접속을 하지 못한다. 


여기까지 했다면 웬만한 건 다 끝났다. 


Docker 설치


이제 클러스터의 각 노드에 docker를 설치하자. VM 이미지로 우분투를 사용하고 있으므로, 아래의 명령으로 각 미니언 노드에 docker 구성을 마칠 수 있다. (docker를 설치하면 안 된다. 반드시 docker.io를 설치하자.) 


$> sudo apt-get install docker.io


삽질 끝에 이렇게 docker를 설치하면 버전이 안맞아서 문제가 꽃핀다는 사실을 발견. 아래 링크를 참조해서 최신 docker-engine을 설치하자. 이미 docker.io를 설치한 사용자는 sudo apt-get purge docker.io 한 다음에 아래의 링크에 나와 있는 대로 시행하면 된다.


http://blog.docker.com/2015/07/new-apt-and-yum-repos/


Kubernetes 클러스터 설치


클러스터 설치는 굉장히 단순하다. 아래 문서를 참고해서 그대로 따라하면 된다.


https://github.com/GoogleCloudPlatform/kubernetes/blob/master/docs/getting-started-guides/ubuntu.md


몇 줄로 요약하자면, 


1. git clone https://github.com/GoogleCloudPlatform/kubernetes.git

2. cd kubernetes/cluster/ubuntu 

3. ./build.sh 실행

4. config-default.sh 수정

5. cd ..

6. KUBERNETES_PROVIDER=ubuntu ./kube-up.sh


이상의 과정을 실행하면 설치는 끝난다. 주의할 것은, config-default.sh 파일을 조심해서 수정해야 한다는 것. 나는 아래와 같이 수정했다. 


...

# Define all your cluster nodes, MASTER node comes first"

# And separated with blank space like <user_1@ip_1> <user_2@ip_2> <user_3@ip_3> 

export nodes=${nodes:-"ubuntu@192.168.0.14 ubuntu@192.168.0.12 ubuntu@192.168.0.15 ubuntu@192.168.0.13"}


# Define all your nodes role: a(master) or i(minion) or ai(both master and minion), must be the order same 

role=${role:-"a i i i"}

# If it practically impossible to set an array as an environment variable

# from a script, so assume variable is a string then convert it to an array

export roles=($role)


# Define minion numbers

export NUM_MINIONS=${NUM_MINIONS:-3}

# define the IP range used for service cluster IPs.

# according to rfc 1918 ref: https://tools.ietf.org/html/rfc1918 choose a private ip range here.

export SERVICE_CLUSTER_IP_RANGE=${SERVICE_CLUSTER_IP_RANGE:-10.0.0.0/24}  # formerly PORTAL_NET

# define the IP range used for flannel overlay network, should not conflict with above SERVICE_CLUSTER_IP_RANGE

export FLANNEL_NET=${FLANNEL_NET:-172.16.0.0/16}


# Admission Controllers to invoke prior to persisting objects in cluster

export ADMISSION_CONTROL=NamespaceLifecycle,NamespaceExists,LimitRanger,ServiceAccount,ResourceQuota,SecurityContextDeny


SERVICE_NODE_PORT_RANGE=${SERVICE_NODE_PORT_RANGE:-"30000-32767"}


# Optional: Enable node logging.

ENABLE_NODE_LOGGING=false

LOGGING_DESTINATION=${LOGGING_DESTINATION:-elasticsearch}


# Optional: When set to true, Elasticsearch and Kibana will be setup as part of the cluster bring up.

ENABLE_CLUSTER_LOGGING=false

ELASTICSEARCH_LOGGING_REPLICAS=${ELASTICSEARCH_LOGGING_REPLICAS:-1}


# Optional: When set to true, heapster, Influxdb and Grafana will be setup as part of the cluster bring up.

ENABLE_CLUSTER_MONITORING="${KUBE_ENABLE_CLUSTER_MONITORING:-true}"


# Extra options to set on the Docker command line.  This is useful for setting

# --insecure-registry for local registries.

DOCKER_OPTS=${DOCKER_OPTS:-""}


# Optional: Install cluster DNS.

ENABLE_CLUSTER_DNS="${KUBE_ENABLE_CLUSTER_DNS:-true}"

# DNS_SERVER_IP must be a IP in SERVICE_CLUSTER_IP_RANGE

DNS_SERVER_IP=${DNS_SERVER_IP:-"10.0.0.10"}

DNS_DOMAIN=${DNS_DOMAIN:-"cluster.local"}

DNS_REPLICAS=${DNS_REPLICAS:-1}


# Optional: Install Kubernetes UI

ENABLE_CLUSTER_UI="${KUBE_ENABLE_CLUSTER_UI:-true}"

...


주의해서 봐야 할 것은, 변수 nodes와 role의 역할이다. 이 두 변수가 하는 일과 그 값의 의미는 위에 링크 건 문서에 자세히 나와 있으나, 간단히 요약하자면 nodes는 마스터와 미니언 노드의 목록이고 (마스터가 맨 앞에 나와야 한다) role은 그 각 노드가 a(마스터), i(미니언), i(미니언), i(미니언) 순으로 운영된다는 뜻이다. 

이렇게 하면 설치 과정에 별 문제는 없을 것인데, 가끔 cluster validation이 굉장히 오래 걸리는 문제가 생길 수 있다. 대부분의 경우 docker daemon이 정상적으로 실행되지 않아서 생기는 문제며, /var/log/upstart/docker.log를 통해 확인할 수 있다. 대체로 minion으로 사용하는 노드를 재부팅하면 해결된다. 또한, 아래와 같은 문제가 생길 수 있다. 

1. groupadd 관련 오류가 난다
2. 설치 validation이 '.' 표시만 잔뜩 뱉어놓고 끝나지 않는다

1번 문제는 kubernetes/cluster/ubuntu/util.sh 스크립트에 있는 오류 때문인데, 이 문제에 대한 패치는 Kubernetes master 브랜치에 pull request를 했고, 바로 merge되어 고쳐졌으니 아마 kubernetes 소스를 git clone한 지 오래된 분들에게만 해당 증상이 나타날 것이다. 만일 그런 증상이 나타난다면 그냥 kubernetes 디렉터리에 가서 git pull을 다시 하면 된다.

2번 문제는 docker 설치가 각 미니언 노드에 제대로 되어 있지 않아서 생기는 문제인데, 위에 적은 대로 설치를 했다면 아마 같은 증상을 겪을 일은 없을 것이다. 

모든 설치가 정상으로 끝났다면 아마 아래와 같은 메시지를 보게 될 것이다. 

Kubernetes cluster is running.  The master is running at:

  http://192.168.0.2:8080

Using master 192.168.0.2
Wrote config for ubuntu to /home/ubuntu/.kube/config
... calling validate-cluster
Found 3 nodes.
        NAME          LABELS                               STATUS
     1 192.168.0.4   kubernetes.io/hostname=192.168.0.4   Ready
     2 192.168.0.5   kubernetes.io/hostname=192.168.0.5   Ready
     3 192.168.0.6   kubernetes.io/hostname=192.168.0.6   Ready
Validate output:
NAME                 STATUS    MESSAGE              ERROR
controller-manager   Healthy   ok                   nil
scheduler            Healthy   ok                   nil
etcd-0               Healthy   {"health": "true"}   nil
Cluster validation succeeded
Done, listing cluster services:

Kubernetes master is running at http://192.168.0.2:8080

마스터 노드에 웹 서버도 설치되어 접속해 볼 수 있는 상황이다.  http://<public IP 주소>:8080/으로 접속을 시도해 보자. 접속이 안된다면 security group을 고쳐서 8080번 포트를 개방해 주어야 한다. 아래와 같은 화면이 표시될 것이다. 

{
  • paths
    [
    • "/api",
    • "/api/v1",
    • "/healthz",
    • "/healthz/ping",
    • "/logs/",
    • "/metrics",
    • "/resetMetrics",
    • "/swagger-ui/",
    • "/swaggerapi/",
    • "/ui/",
    • "/version"
    ]
}

path에 나와 있는대로 접속을 시도해 보면 된다. http://<public IP 주소>:8080/ui/ 에 접속해보자. 아마 UI가 제대로 표시되지 않을 텐데, 그럴 때는 kubernetes/cluster/ubuntu 디렉터리로 가서 아래를 시행하면 된다. 

$> KUBERNETES_PROVIDER=ubuntu ./deployAddons.sh

이렇게 하면 UI가 addon 형태로 설치된다. 설치가 잘 되었는지는 아래의 명령으로 확인할 수 있다. 

$> kubectl get pods --namespace=kube-system

UI pod가 Running 상태로 나오면 제대로 된 것이다. Pending 상태로 너무 오래 지속되고 있다면, 역시 docker daemon이 문제일 가능성이 제일 크므로, 미니언 노드를 재부팅시켜주는 것이 좋다. 

여기까지 되는 것을 확인하려다 Kubernetes 설치 스크립트의 버그를 몇 개 잡았는데, 전부 Kubernetes 마스터 브랜치에 merge 된 상태이므로, 이 글을 읽는 여러분이 설치를 할 때 쯤에는, 같은 문제를 겪을 일은 아마 없을 것이다. 


저작자 표시 비영리 변경 금지
신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 임태형

    위 구성을 그대로 적용했는데요. UI를 보기 위해 http://<Master IP>:8080/ui 하면 아래와 같은 에러가 나타납니다.
    Error: 'dial tcp 172.17.0.2:8080: no route to host'
    Trying to reach: 'http://172.17.0.2:8080/'

    172.17.x.x는 docker 안에서의 eth0에 속하는 ip라하는데.. 이쪽으로 redirect를 못해주네요. 혹시 이부분에 대해서 아시는게 있으신가요? 도움 요청 드립니다.

    2015.08.28 14:26 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 혹시 kubectl get pods --namespace=kube-system의 출력 결과를 보여주실 수 있을까요?

      2015.08.31 20:08 신고 [ ADDR : EDIT/ DEL ]
  2. 최용환

    일단 ifconfig 하셔서 flanneld 네트워크가 떠 있는지 보시고,
    etcdctl ls / 해보시면
    /registry 만 있는지 /coreos 도 있는지 알수 있습니다.
    없으면 설정해주셔야 합니다.

    etcdctl mk <etcd 키 경로> <값> , 경로는 / 로 시작한다.

    2015.11.10 11:11 신고 [ ADDR : EDIT/ DEL : REPLY ]

Thoughts2011.07.25 09:14
OS X Lion이 앱스토어에 공개되었습니다. 언제쯤 공개되나 기다리고 있었는데 빠르군요. 운영체제를 앱스토어에서 구매해서 업그레이드 할 수 있다는 것은, 확실히 대단한 일입니다. CD로 구매해서 업그레이드 할 수 있다고 하니, 기업체에서는 이 옵션을 사용하는 것이 좋겠습니다.

OS X Lion에 추가된 핵심 기능들로는 다음과 같은 것들이 있습니다.

1. 풀 스크린

기존 Mac 프로그램들은 전체 화면 모드를 지원하지 않았는데, 이번에 OS X 에 전체화면 기능이 포함되면서, 모든 프로그램에 전체 화면 모드를 사용할 수 있게 되었습니다. (대체 왜 이런 기본적인 기능이 지금까지 지원 안된 것인지.. ㅎ)

2. 미션 컨트롤

클릭 한번으로 모든 윈도우를 보고, 바로 이동할 수 있습니다. 손가락 네개로 쓸어올리면 다음과 같은 화면이 보입니다. 화면 상단에는 모든 작업영역 화면이 보이고, 아래쪽에는 모든 응용 프로그램 화면이 보이죠. 배치를 조정할 수도 있습니다. Expose를 완전히 대체한다고 봐도 될듯.


3. Launch pad

iOS와 Mac OS의 경계를 없애버리는 인터페이스. 엄지와 나머지 손가락 세 개를 터치패드 상에서 오므리면 다음과 같은 화면이 뜹니다. (처음에는 응용 프로그램 목록 구성하느라 조금 느립니다.) 이 화면에서 프로그램을 실행할 수 있기 때문에, 매번 Finder를 띄워서 프로그램을 찾는 불편함이 사라질 듯.


4. 다시 열기

Mac을 재시동하면 언제나 당신이 작업하던 바로 그 상태로!

5. 자동 저장

Command-S를 누르지 않아도 맥이 언제나 자동 저장!

6. 좀 더 손쉬운 작업 영역간 이동

손가락 세 개로 Swipe를 하면 (쓸어 넘기기) 작업 영역 간 이동을 할 수 있습니다. iOS와 보다 비슷해 진 부분 중 하나죠. 작업 영역의 맨 왼쪽에는 위젯들이 들어가 있는 대시보드 화면이 있어서, 이제 굳이 Fn 키를 누르지 않아도 위젯들을 불러 쓸 수 있습니다. 역시 아이폰과 비슷한 사용법입니다. ㅎ


우선 앱스토어에서 구매 절차부터 살펴봅시다. 설치 전에는 아래 그림과 같은 사항을 먼저 점검해야 합니다.


점검이 끝났다면 설치 돌입! 앱스토어에서 OS X Lion을 선택하고 구매를 선택합니다.


조금 있으면 '설치됨'으로 바뀌는데, 그렇다고 설치가 다 된건 아니고, 다음과 같은 화면이 하나 뜰겁니다.


이제 이 화면부터 순서대로 클릭해 나가면 설치가 됩니다.


신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

  1. 좋은 정보 주셔서 감사합니다 ^^

    2012.04.09 09:52 신고 [ ADDR : EDIT/ DEL : REPLY ]

Languages/Ruby or Rails2008.07.17 14:47

passenger를 설치하는 절차는 우선 다음의 명령을 입력하는 것으로 시작된다.

sudo gem install passenger

엔간하면 이 절차는 정상적으로 완료될 것. 하지만 그 다음이 문제. 설치 문서에는 passenger-install-apache2-module 을 실행하라고 나오는데, 이 파일은 /var/lib/gems/1.8/gems/passenger-2.0.2/bin 디렉터리 아래에 있는데다, 결정적으로 실행 권한이 설정되어 있지 않다.

그러므로 실행하려면 그 디렉터리 아래에 가서, sudo ruby passenger-install-apache2-module 처럼 실행해 주어야 한다. 그런데 그렇게 실행해 보면, rake가 gems 디렉터리 아래에 분명 설치되어 있는데도 설치되어 있지 않다고 불평하는 일이 발생한다. (이런...)

이런 일이 발생했다면, 여러분의 gems installation에 뭔가 문제가 발생한 것이다. -_-;
http://agileweb.wordpress.com/2008/07/18/how-to-install-rails-21-on-ubuntu-in-5-steps/
위의 링크를 참조해서 여러분의 gems installation 자체를 업데이트해보는 것이 좋겠다. 그런 다음 rails, passenger 등등을 다시 설치해야 한다.

이것은 rake 실행파일이 /usr/bin/ 아래에 복사되어 있지 않기 때문에 발생하는 문제. 따라서 sudo cp /var/lib/gems/1.8/gems/rake-0.8.1/bin/rake /usr/bin 과 같이 해주어야 한다. 그러면 문제가 해결된다. (카피가 찜찜한 분은 심볼릭 링크를 걸어주는 편이 낫겠다.) 실행권한도 빠져있으니 sudo chmod +x로 걸어주어야 한다.

이렇게 하고 나서 다시 sudo passenger-install-apache2-module 를 해 보면 뭔가 make 한다는 메시지가 쫙 나오고 나서 다음과 같은 텍스트가 화면에 출력된다.

Please edit your Apache configuration file, and add these lines:

   LoadModule passenger_module /var/lib/gems/1.8/gems/passenger-2.0.2/ext/apache2/mod_passenger.so
   PassengerRoot /var/lib/gems/1.8/gems/passenger-2.0.2
   PassengerRuby /usr/bin/ruby1.8

After you restart Apache, you are ready to deploy any number of Ruby on Rails
applications on Apache, without any further Ruby on Rails-specific
configuration!

Press ENTER to continue.

/etc/apache2/conf.d 디렉터리 아래에 passenger라는 파일을 만들어 위의 설정을 그대로 입력해 보자. 그런 다음에 enter 키를 누르면 다음의 텍스트가 화면에 출력된다.

Deploying a Ruby on Rails application: an example

Suppose you have a Ruby on Rails application in /somewhere. Add a virtual host
to your Apache configuration file, and set its DocumentRoot to
/somewhere/public, like this:

   <VirtualHost *:80>
      ServerName
www.yourhost.com
      DocumentRoot /somewhere/public
   </VirtualHost>

And that's it! You may also want to check the Users Guide for security and
optimization tips and other useful information:

  /var/lib/gems/1.8/gems/passenger-2.0.2/doc/Users guide.html

Enjoy Phusion Passenger, a product of Phusion (www.phusion.nl) :-)
http://www.modrails.com/

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

일단 여기까지 해서 설치는 끝났다. 이제 남은 일은 VirtualHost 설정을 적절히 해서 Rails의 실행 결과가 브라우저에 전송될 수 있도록 하는 것 뿐...

우선, apache에 또다른 VIrtualHost 설정을 꾸며서, 접속 도메인 명이 달라질 경우 해당 VirualHost가 실행될 수 있도록 한다.

<VirtualHost *>
    ServerAdmin byungjoon.lee@gmail.com
    ServerName www.xxxxx.com
    DocumentRoot /home/bjlee/work/rails/xxxxx/public
    RailsBaseURI /
</VirtualHost>

대략 위와 같이 하면 된다. 다만 한가지 주의할 것은, 위의 /home/.../public 디렉터리에 www-data (apache2가 실행되는 사용자명) group에 대한 읽기쓰기 권한을 주어야 한다는 것. 필자는 /home/.../work/rails 디렉터리에 가서 그 아래에 있는 모든 subdirectory에 대해 chown -R bjlee:www-data *를 실행하고, chmod -R g+w * 를 실행해 주었다.

이렇게 하고 나서 브라우저의 주소창에 www.xxxxx.com을 입력하고 접속해보면 접속이 된다. 접속이 안될 경우 해당 도메인 명이 등록이 안된 것이니 ㅋㅋ 윈도우의 hosts 파일을 고쳐서 등록된 것처럼 꾸며야 할 것.

그런데 이렇게 하면서 몇가지 프로그래머가 반드시 알아야 할 사항이 드러났는데.

1. development 모드에서는 *.rhtml의 확장자를 사용해 view template을 꾸밀 수 있었는데, production mode를 가정하는 passenger의 특성상 *.html.erb의 확장자가 아니면 인식을 못한다는 것. (Rails 2.0부터는 *.rhtml의 확장자는 더이상 사용하지 않으며, *.html.erb의 확장자를 사용해야 한다. 다만 현재로서는 하위호환성을 위해 *.rhtml을 Development 모드에서는 지원하고 있다.)

2. 원래 그런 건지 아니면 설정을 잘못해서 그런건진 몰라도 (아마 전자일듯) passenger를 사용해 rails 프로그램을 띄우면 소스코드를 바꿔도 그 결과가 바로 반영되어 실행되지는 않는다. (소스코드의 변경을 반영하려면 웹 서버를 다시 띄워야 한다.) 아마 production mode 로 release를 하는 것을 가정하는 passenger의 특성상 그러할 것. 물론 시간이 지나 모든 세션이 종료되고 난 뒤에는 수정된 코드가 다시 반영된다. :-) Rails app 디렉터리 아래에 tmp/restart.txt 파일을 'touch' 해도 된다. 이 경우에는 웹 서버 전체가 재시작되는 것이 이니라, 해당 app만 재시작된다.

여기까지만 주의하면 passenger를 통해 rails 프로그램을 쾌적하게 배포할 수 있을 것이다.

다른 문제에 대해서는 passenger를 배포하고 있는 웹 사이트에 가서 http://www.modrails.com/ 사용자 가이드를 보면 될 것이다.


신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Languages/Erlang2008.07.04 12:28

yaws를 설치했다면 Erlyweb도 설치해보고 싶은 것이 인지상정일 터인데, 설치 방법이 간단하긴 하지만 그렇다고 한방에 잘 되지도 않는다. 다음과 같이 하면 큰 무리 없이 잘 될 것.

BASIC TROUBLESHOOTING : 설치시 생기는 문제들

우선, http://erlyweb.org/ 에 가서 최신 버전의 erlyweb distribution을 받는다. 그런 다음에 erlang의 lib 디렉터리 아래에다 이 파일의 압축을 푼다. 필자의 경우, /usr/lib/erlang/lib 아래에 풀어주었다. erlang library가 어디에 설치되어 있는지 모르겠다면, erl 프롬프트상에서 code:lib_dir(). 를 입력하고 리턴 키를 눌러주면 된다.

원래는 (?) 압축을 풀어주는 것 만으로 모든 것이 해결되어야 한다. 제대로 되었다면, 이제 작업 디렉터리로 가서 erl 셸을 실행한 다음에 다음과 같이 해 본다.

1> erlyweb:create_app("testapp", ".").


이렇게 하면 다음과 같은 메시지가 나오면서 해당 디렉터리 아래에 src,www, ebin 등의 디렉터리가 생성되어야 한다.

1> erlyweb:create_app("testapp", ".").
info:erlyweb_util:39: creating "./testapp"
info:erlyweb_util:39: creating "./testapp/src"
info:erlyweb_util:39: creating "./testapp/src/components"
info:erlyweb_util:39: creating "./testapp/www"
info:erlyweb_util:39: creating "./testapp/ebin"
info:erlyweb_util:70: creating "./testapp/src/components/html_container_view.et"
info:erlyweb_util:70: creating "./testapp/src/components/html_container_controller.erl"
info:erlyweb_util:70: creating "./testapp/src/mh20_app_controller.erl"
info:erlyweb_util:70: creating "./testapp/www/index.html"
info:erlyweb_util:70: creating "./testapp/www/style.css"
ok


그런데 잘 되지 않고, 간혹(?)

=ERROR REPORT==== 17-May-2007::11:43:31 ===
beam/beam_load.c(1097): Error loading module erlyweb:
  use of opcode 136; this emulator supports only up to 129


위와 유사한 오류 메시자가 뜨는 경우가 있다. 그럴 때는 erlyweb 빌드를 다시 해 주어야 한다. /usr/lib/erlang/lib/erlyweb-1.76 (필자의 경우) 로 cd 한 다음에, make clean ; make를 때려주자. 십중팔구는 그것도 잘 안될 것이다. 오류 메시지를 유심히 보면, yaws_api.hrl 파일을 찾지 못하는 것이 원인임을 알 수 있다.

그 때는 cd src/erlyweb을 일단 하자. 위의 문제를 해결하는 데는 여러 가지 우아한 다른 방법이 있을 수 있겠지만, 성질급한 사람에게 추천하는 가장 빠른 방법은, 이 디렉터리 안에서

ln -s <yaws 헤더 파일이 있는 디렉터리>/yaws_api.hrl .


를 해 주는 것이다. 필자의 경우 저 디렉터리는 yaws를 local home directory에 설치했기 때문에 /home/bjlee/packages/yaws-1.76/include 였다.

이렇게 한 다음에 다시 cd ../.. 해서 /usr/lib/erlang/lib/erlyweb-1.76 (필자의 경우) 로 간 다음에 make를 때려보면 정상적으로 컴파일이 될 것이다.

그 다음으로 남은 일은 http://www.ibm.com/developerworks/kr/library/opendw/20080617/ 여기를 참고하면 될 것이다. :-)

MORE TROUBLESHOOTING : 설치 이후

1. 컴파일 문제

그런데 만일 yaws를 띄우는건 잘 되는데 erlyweb app가 컴파일이 잘 안된다면? 특히 다음과 같은 오류 메시지를 내는 경우에는 어떻게 해야 좋을까?

3> erlyweb:compile("testapp", [{erlydb_driver, mysql}, {auto_compile, true}]).
debug:erlyweb_compile:379: Compiling Erlang file "testapp_app_controller"
error:erlyweb_compile:89: Error compiling app controller
** exited: {error,{invalid_module,"testapp/src/testapp_app_controller.erl"}} **

그럴 경우에는 yaws의 interactive command prompt 상에서 pwd().를 해 본다. 아마 testapp를 생성한 디렉터리가 아니게 되어 있을 것이다. 그럴 경우에는

4> cd("/home/bjlee/work/yaws/erlyweb/").


와 같이 해 주면 된다. 필자의 경우에는 저 디렉터리 아래에 testapp 디렉터리가 있었다.

2. MySQL 문제

erlyweb:compile을 처음으로 실행할때는 MySQL을 쓰던 mnesia를 쓰던 사실 별 상관은 없지만, 본격적으로 모델을 만들고 데이터베이스를 붙이려고 하다 보면 이제 문제가 조금씩 발생한다. 가장 크게 문제가 되는 것은 erlyweb:compile이 정상적으로 실행되려면 시스템에 MySQL이 깔려 있어야 한다는 것. (mnesia를 쓰겠다면 아무 문제 없겠지만...)

MySQL을 깔고 나서 yaws interactive shell에서 다음과 같이 해 보자. 이렇게 해 두어야 erlyweb:compile 과정에서 발생하는 문제가 사라진다. 아래의 과정은 mysql server에의 접속 정보를 확인하는 과정과 같은 것이라고 보아도 일단은 무방하다.

erlydb:start(mysql, [{hostname, "localhost"}, {username, "xxxx"}, {password, "yyyy"}, {database, "testdb"}]).

username의 "xxxx" 부분에는 데이터베이스 접근에 사용될 아이디를 적어주시고, password의 "yyyy" 부분에는 해당 사용자의 암호를 적어주시면 된다. database의 "testdb" 부분에는 mysqladmin create <데이터베이스이름> 명령으로 생성한 mysql database 이름을 적어주면 된다.

그런 다음에 erlyweb:compile을 다시 돌려보면 되는데, auto_compile을 true로 해두었다면 사실 안해주어도 무방해야 하지만, 직접 돌려보면 어떤 문제가 있는지를 직접 확인할 수도 있다.

보통 이 단계에서 발생하는 문제는, 다음과 같은 증상으로 나타난다.

** exited: {no_such_table,{{module,test},{table,test}}} **

즉, 모델에 대한 데이터베이스 테이블이 아직 만들어지지 않았다는 것. 이 문제는 mysql 상에서 테이블을 적절히 생성해서 해결해주면 된다.





 

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Languages/Erlang2008.06.14 17:03
Erlang 웹 개발을 위해 yaws 서버 소스 파일을 다운로드 받아 설치할때는 다음과 같은 절차를 우선적으로 밟게 된다.

./configure ; make

그런데 ./configure를 실행하면 gcc에서 실행파일을 생성할 수 없다고 하는 메시지가 뜨면서 configure가 중단되는 경우가 있다.

그런 경우에는 이 글을 참고하여 gcc 문제를 먼저 해결해야 한다. 그런 다음에 다시 ./configure ; make 한다.

그런데 make를 진행하다 보면 pam_appl.h라는 헤더 파일을 찾지 못한다는 오류 메시지가 출력되면서 컴파일이 진행되지 않는 경우가 있다.

그런 경우에는 sudo apt-get install libpam0g-dev 를 실행하여 관련된 헤더 파일을 설치하여야 한다.

이상의 과정이 정상적으로 끝났다면 이제 ./configure ; make를 하면 yaws 파일이 정상적으로 생성된다.

생성된 실행 파일을 설치하는 것은 그 나중 문제인데, 사용자의 local home directory에 임시로 설치하여 사용하고자 한다면 그 상태에서 make local_install 하면 된다. 그러면 실행 파일이 사용자의 $HOME/bin에 설치되고, configuration 파일은 $HOME/yaws.conf와 같이 만들어지게 된다.

개발 단계에서는 이렇게 설치해놓고 사용하는 것이 보다 간편하다.

상기 문제는 yaws 소스를 컴파일하여 설치하려고 하는 경우에만 발생하며, sudo apt-get install yaws와 같이 해서 설치한 사용자에게는 발생하지 않는 문제이다. 다만 sudo apt-get install yaws로 설치한 사용자는 Yaws 사용자 가이드에 나온 예제들을 실행해 보기 위애서 여러 가지 설정 파일들을 이리 고치고 저리 고치는 수고를 좀 장시간 해 주어야 할 것이다.

참고한 링크들:

  1. http://marc-abramowitz.com/archives/2007/04/18/building-yaws-erlang-web-server-for-ubuntu/
  2. http://www.buggymind.com/137
  3. http://www.ibm.com/developerworks/kr/library/opendw/20080520/





신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Systems/Unix2008.06.05 17:29
이 글은 Fedora Core 6에 Skype를 설치하는 방법을 다룬다. 전반부에 소개한 방법은 아래의 문서에 기술된 방법을 참고한 것이다.

http://kaiser.wordpress.com/2007/09/15/installing-skype-on-fedora-core-6/

후반부에 기술한 방법은 필자가 개인적으로 경험한 결과를 정리한 것이다. 삽질의 길은 멀고도 험하다 -_-;

[첫번째 방법]

yum으로 설치한다. yum install skype하면 끝.

그런데 skype를 repository에서 찾을 수 없다면 설치가 아마 안될 것이다. 그런 경우가 발생하면, /etc/yum.repos.d/ 아래에 skype.repo 파일을 만들고, 다음과 같이 입력한다.

[skype]
name=Skype Repository
baseurl=http://download.skype.com/linux/repos/fedora/updates/i586/
gpgkey=http://www.skype.com/products/skype/linux/rpm-public-key.asc
그런 다음에 yum install skype의 명령을 다시 실행한다.

[두번째 방법]

제대로 되었다면 정상 설치가 되어야 하는데, 간혹가다 "Header V3 DSA signature" 어쩌구 하는 메시지가 포함된 Warning이 뜨면서 설치가 안될 수 있다. (원인은 잘 모른다.)

그럴때는 다음의 절차를 따라한다. 우선

yum install nas
yum install qt4
yum install qt4-x11

위의 세 명령을 순차적으로 실행한다.

그런 다음 http://www.skype.com/download/skype/linux/choose/ 를 방문하여, Fedora Core 6 링크를 클릭하여 rpm을 다운받아 설치한다.

그런 다음 명령행(command line)에서 skype라고 입력하여 실행해 본다. 사용권에 동의할 것인지를 묻는 창이 나오면 성공한 것이다.

+ + +

논문에 필요한 시험을 Linux에서 하는 중인데, 추가 실험을 하려고 하다보니 Skype도 필요하고 이것도 필요하고 저것도 필요하고...

Linux가 '시험'하긴 좋은 운영체제인데, '뭘 좀 편하게' 하려면 이게 또 만만치는 않은듯. 10년 이상을 Unix/Linux를 만졌는데 뭘 좀 해보려고 하면 찾아볼게 한두가지가 아니니... 그래도 고쳐서 뭔가 해볼 수 있다는 걸 다행으로 생각해야 할듯.

신고
Posted by 이병준

소중한 의견, 감사합니다. ^^

Systems/Windows2007.09.06 09:00

가장 기본적인 가정은, LM70에는 Fedora Core 6가 제일 잘 맞더라, 하는 것입니다. Ubuntu는 시도해보지 않아서 잘 모르겠습니다.

1. Windows 설치

LM70에 Windows XP 설치 CD를 넣고 시도해 보면, 잘 안됩니다. 장치 Configuration을 검사하다가 뻗어버리는데, 기본적으로 Windows 인스톨러에 SATA 관련 기능이 없는 탓도 있을 것이고... 아무튼 잘 되질 않습니다. 가장 쉬운 방법은 시스템 부팅 시 F11 버튼을 눌러 Xnote의 시스템 복구 기능을 구동시키는 것입니다.

이 기능이 구동된 후에는 파티션을 나눈다거나 하는 작업을 고급 설정 부분에서 할 수 있습니다. 유의할 것은 Windows가 하드 디스크 상의 첫번째 파티션이 되어야 한다는 점입니다. 그렇게 잡지 않으면 LM70의 시스템 복구 기능이 제대로 동작하지 않습니다. 저는 Windows 용으로 25G 정도의 용량을 잡아주었습니다.

파티션을 나눈 다음에는 한번 재부팅 한 다음에 (왜 그런지 모르겠지만, 재부팅하지 않으면 복구 후에도 Windows가 정상적으로 부팅되지 않습니다) 앞서 만든 주 파티션에 Windows를 복구해주어야 합니다. 그런 다음에 Windows가 정상적으로 부팅되면 이제 프로그램을 깔아준다던가, 네트워크를 잡는다거나 하는 작업들을 해 주면 됩니다.

2. Linux 설치

Windows가 제대로 설치된 다음에는 Linux 설치는 오히려 간단합니다. 설치 화면이 실행되고 다음 버튼을 눌러나가다 보면 하드 디스크 파티션과 관련된 화면이 나올텐데, 여기서 "하드 디스크 여유 공간에 기본 파티션 설정"을 선택한 다음 계속 진행해 나가면 됩니다. sda1은 Windows 용, sda2는 부트 이미지가 들어가는 영역인거같구요, sda3에 Linux 파일들이  깔리게 됩니다.

그런 다음에 다음 버튼을 누르다보면 부트로더 설치(GRUB)와 관련된 화면이 나오고 거기에 부팅할 OS 목록이 나옵니다. 두 번째 OS가 아마 Other로 나올텐데, 여기서 그 목록을 클릭한 다음 오른쪽의 편집 버튼을 눌러 그 이름을 Other에서 Windows XP로 바꾸어주면 됩니다.

그런 다음에 나오는 화면은 뭐 별로 어려운 부분이 없으니까 그냥 넘어가도 됩니다.

설치가 제대로 되었으면 이제 GSynaptics를 설치하고, 무선랜을 잡아주는 작업을 해 주면 됩니다.

GSynaptics 설치를 하는 제일 쉬운 방법은, yum install gsynaptics를 실행하는 것입니다. 소스 설치를 하려면 (왜?) GSynaptics 홈페이지에 가서 소스를 다운받아 컴파일을 해 주면 되는데, FC6 설치 직후에 컴파일을 하려면 ./configure부터 잘 안될겁니다. yum install perl-XML-Parser를 입력하여 관련 모듈을 설치한 다음에 ./configure; make; make install 하면 됩니다. (당연히 make install 하려면 super user가 되어야.. ㅎㅎ)

그런 다음 gsynaptics를 실행해 보면... 또 안됩니다. ㅋㅋ

/etc/X11/xorg.conf에 보면 Section InputDevice 부분이 있습니다. 다음과 같이 편집합니다.

Section "InputDevice"
        Identifier  "Synaptics"
        Driver      "synaptics"
        Option      "Device" "/dev/input/mice"
        Option      "Protocol" "auto-dev"
        Option      "Emulate3Buttons" "yes"
        Option      "SHMConfig" "true"
EndSection

이렇게까지 하고 재부팅해보거나 X 서버를 다시 실행시킵니다. 그런다음 명령행 상에서 gsynaptics 프로그램을 실행시키면, 터치패드를 켜고 끌 수 있습니다.

그런 다음에는 무선랜을 잡아야 하는데요.

rpmfind.net에서 ipw2200-firmware-3.0.9-noarch.rpm을 갖다가 깝니다. 그런 다음 재부팅해보면 eth1 (무선랜)이 제대로 올라오는 것을 볼 수 있습니다.

그런 다음에는 시스템->관리->Services 에서 NetworkManager와 NetworkManagerDispatcher 두개를 다 살려줘야합니다. 그러면 화면 상단 구석에 NetworkManager 애플릿이 떠서 인터페이스들을 관리하는 것을 볼 수 있습니다. 뜨지 않는다면 로그아웃했다가 다시 로그인해보면 뜰겁니다. (그래도 안되면 재부팅 ㅋㅋ)

아무튼 이정도까지 하면 이제 해야 할 건 대충 다 했다고 볼 수 있습니다.

나머지는 그때그때 알아서~

PS. 여기까지 했는데도 뭔가 잘 안된다면? 그때는 이 문서를 참고하세요.



신고
Posted by 이병준

소중한 의견, 감사합니다. ^^