참조 사이트:
http://colinux.wikia.com/wiki/Network
http://docs.fedoraproject.org/en-US/Fedora/15/html/Deployment_Guide/ch-Network_Interfaces.html


이전 글( http://vis-a-vis.tistory.com/19 )에서 윈도우즈 XP에 coLinux를 설치하는 과정을 설명하였다. 이 글은 coLinux Fedora에서 네트워크를 설정하는 과정을 설명한다.

여기서는 두 개의 가상의 네크워크 라인을 coLinux와  hosting OS(예, 윈도우즈 XP) 사이에 생성하여, 하나는 coLinux에서 컴퓨터 화면에 x program을 띄우는데 사용하며, 다른 하나는 coLinux에서 실제 네트워크 어댑터로 연결하여 외부 인터넷으로 연결되도록 하는데 사용한다.

참조 사이트를 보면 여러 가지 방식이 가능하나, 각각 TAP과 WinPcap을 이용하여 두 개의 가상 네트워크 라인을 생성하는 방식을 성능면에서 가장 추천하고 있다. 본 글에서도 TAP을 이용하여 하나의 라인 (라인 0라고 하자)을, WinPcap을 이용하여 다른 하나의 라인 (라인 1이라고 하자)을 생성하는 과정을 설명한다.
 


1. Windows XP에서 TAP 가상 어댑터 설정하기

   여기서는 라인 0가 윈도우즈 쪽에 연결될 어댑터를 어떻게 설정하는지 알아보자.

  1. coLiinux를 설치할 때 TAP-Win32 adapter도 함께 설치하였다면 아래의 파란색 네모 안에 보이듯이 해당 어댑터가 Network Connections에 생성되어 있다.


  2. 마우스 오른쪽 버튼을 클릭하여 활성화된 메뉴에서 Properties를 클릭하면 아래의 창이 뜬다.


  3. 여기서 Configure를 클릭하면 아래의 창이 뜬다. 여기서 Advanced 탭 아래에 있는 Media Status 항목의 값을 Always Connected로 설정하고 OK를 클릭한다.


  4. TAP 어댑터의 Firewall 설정 해제 하기. 1B의 그림에서 Advanced 탭을 클릭하면 아래와 같이 Windows Firewall 설정을 변경할 수 있다. Settings를 클릭한다.


    그런 다음, 아래와 같이 Firewall을 끈다. 라인 0는 coLinux와 Windows XP사이에만 존재하는 폐쇄 라인이므로 외부와 연결되어 있지 않다. 게다가 coLinux 쪽에서 Windows XP를 공격할 것도 아니므로 Firewall을 꺼도 무방하다.


  5. Static IP address 할당하기.

    1B의 그림에서 Internet Protocol (TCP/IP)를 선택한 후, Properties를 클릭하여 아래와 같이 static IP address(192.168.37.10)와 subnet mask(255.255.255.0)를 입력하고 OK를 클릭한다. IP 주소 번호에서 37은 아무렇게나 선정된 숫자이며, 중복된 번호의 어댑터가 존재하면 다른 번호로 대체될 수 있다.




2. coLinux에서 두 개의 네트워크 인터페이스 설정하기
 
  1. 먼저, C:\coLinux 폴더 밑에 있는 fedora.conf 파일을 열어서 아래와 같이 eth0와 eth1 라인을 추가하고 저장한다.

    kernel=vmlinux
    initrd=initrd.gz
    cobd0="fedora11.img"
    cobd1="swap512m.img"
    cofs0="."
    root=/dev/cobd0 ro
    # mem=256
    # cocon=120x40
    eth0=tuntap
    eth1=pcap-bridge,"Wireless Network Connection",XX:XX:XX:XX:XX:XX,

    eth0는 윈도우즈의 TAP 어댑터로 연결되는 가상의 폐쇄 라인 (라인 0) 을 생성하는데 사용되는 coLinux 쪽의 어댑터이다. eth1은 WinPcap을 사용하여 실제 네트워트 카드로 연결되는 가상의 라인 (라인 1)을 생성하는데 사용된다.

    eth1의 값 중에서 " "안의 부분은 외부 인터넷과 연결된 실제 네트워크 어댑터의 이름을 사용한다. 유선 랜의 경우 대개 그 이름은 "Local Area Connection"이며, 무선 랜의 경우는 "Wireless Network Connection"이다. 확실하게 하기 위해서 1A에 있는 그림의 Network Connections 창을 열어서 이름이 실제로 어떻게 명명되어 있는지 확인하는 것이 좋다.

    WinPcap 어댑터가 무선랜 카드로 연결되는 경우는, eth1의 끝에 무선랜 카드의 MAC address를 XX:XX:XX:XX:XX:XX 처럼 추가한다. 무선랜 카드의 MAC 주소는 윈도우 명령창에서 ipconfig -all을 실행하면 확인할 수 있다.



3. coLinux Fedora 상에서 두 개의 네트워크 인터페이스 설정하기

  1. coLinux를 실행하여 coLinux Fedora를 부팅한 뒤, Cooperative Linux console에서 root로 로그인한다. (이전 글 coLinux 설치하기 참조) 그런 뒤, 아래의 명령어로 /etc/sysconfig/network-scripts 디렉토리로 이동한다.

    [root@localhost ~]# cd /etc/sysconfig/network-scripts

  2. ifcfg-eth0 파일을 아래와 같이 수정한다. 원본 파일은 다른 이름(예, ifcfg-eth0.orig)으로 저장한다.

    DEVICE=eth0
    IPADDR=192.168.37.20
    NETWORK=192.168.37.0
    NETMASK=255.255.255.0
    BROADCAST=192.168.37.255
    BOOTPROTO=none
    ONBOOT=yes

    위의 IPADDR, NETWORK, BROADCAST 주소 값 중에 37은 다시 한 번 말하지만 임의의 숫자이다. 중복된 번호의 어댑터가 존재하면 다른 아무 번호로 바꿀 수 있다. 단, 1E에서 할당한 static address와 같은 숫자로 맞춰야 한다.

  3. ifcfg-eth1 파일을 아래와 같이 수정한다. 파일이 존재하지 않으면 생성시킨다.

    DEVICE=eth1
    ONBOOT=yes
    BOOTPROTO=dhcp

    eth1은 BOOTPROTO값을 dhcp로 하여 동적으로 주소를 할당받을 수 있도록 한다.

  4. 설정이 끝낸 후, 아래의 명령어로 network를 재시동한다.

    [root@localhost ~]# /etc/init.d/network restart                                
    Shutting down interface eth0:                              [  OK  ]            
    Shutting down interface eth1:                              [  OK  ]            
    Shutting down loopback interface:                       [  OK  ]            
    Bringing up loopback interface:                           [  OK  ]            
    Bringing up interface eth0:                                  [  OK  ]            
    Bringing up interface eth1:    
    Determining IP information for eth1... done
                                                                           [  OK  ]

    모두 OK가 되면 네트워크 어댑터 eth0와 eth1이 정상적으로 작동하는 것이다.

  5. 테스트. 아래와 같이 ping 명령어를 이용하여 네트워크 연결상태를 확인한다.

    [root@localhost ~]# ping 192.168.37.10                                         
    PING 192.168.37.10 (192.168.37.10) 56(84) bytes of data.                       
    64 bytes from 192.168.37.10: icmp_seq=1 ttl=128 time=20.0 ms                   
    64 bytes from 192.168.37.10: icmp_seq=2 ttl=128 time=0.000 ms                  
    64 bytes from 192.168.37.10: icmp_seq=3 ttl=128 time=0.000 ms                   ^C                                                                             
    --- 192.168.37.10 ping statistics ---                                          
    3 packets transmitted, 3 received, 0% packet loss, time 3000ms                 
    rtt min/avg/max/mdev = 0.000/6.666/20.000/9.428 ms

    [root@localhost ~]# ping www.google.com                                        
    PING www.l.google.com (74.125.224.208) 56(84) bytes of data.                   
    64 bytes from www.google.com (74.125.224.208): icmp_seq=1 ttl=57 time=70.0 ms  
    64 bytes from www.google.com (74.125.224.208): icmp_seq=2 ttl=57 time=70.0 ms  
    64 bytes from www.google.com (74.125.224.208): icmp_seq=3 ttl=57 time=270 ms    ^C                                                                             
    --- www.l.google.com ping statistics ---                                       
    4 packets transmitted, 3 received, 25% packet loss, time 3610ms                
    rtt min/avg/max/mdev = 70.000/136.666/270.000/94.281 ms

    윈도우의 가상 TAP adapter 쪽으로나, 외부 인터넷(예, www.google.com)쪽으로나 패킷 로스없이 잘 연결된 것을 확인할 수 있다.



4. 문제해결

  1. coLinux Fedora를 재부팅해도 eth0, eth1이 자동으로 로딩되지 않고 매번 /etc/init.d/network restart를 실행시켜야 eth0와 eth1이 로딩되는 경우

    우선, ifcfg-eth0와 ifcfg-eth1파일에서 ONBOOT 값이 yes로 되어 있는지 확인한다. no 이면 yes로 바꾸고 network 를 재시동한다.

    그래도 문제가 지속되면, 아래와 같이 network 설정을 확인한다. 만약 모든 값이 off이면 on으로 설정한다.

    [root@localhost ~]# chkconfig --list network
    network         0:off   1:off   2:off   3:off   4:off   5:off   6:off
    [root@localhost ~]# chkconfig network on                                       
    [root@localhost ~]# chkconfig --list network                                          
    network         0:off   1:off   2:on    3:on    4:on    5:on    6:off


Posted by 참향그늘
,

참조 사이트:
Cooperative Linux
coLinux wiki


1. coLinux 란?

"Cooperative Linux (coLinux) is the first working free and open source method for optimally running Linux on Microsoft Windows natively."

자연스럽게 마이크로 소프트 윈도우즈 상에서 리눅스를 최적으로 실행하기 위한 최초의 무료 공개 프로그램이다.


"... it allows one to ... run Linux on Windows 2000/XP/Vista/7, without using a ... virtualization software, VMWare ..."

VMWare 같은 가상 소프트웨어 없이 윈도우즈 2000/XP/Vista/7에서 리눅스를 실행할 수 있게 한다.



2. 파일 내려받기 (File Download)

소스 포쥐 사이트 ( http://sourceforge.net/projects/colinux/files/ )에서 아래의 파일들을 내려 받는다.

  1. coLinux-stable/0.7.9-linux-2.6.33.7 (2011-04-29)
  2. Images 2.6.x Fedora (2011-12-18)
    Fedora 이외에도 Ubuntu, Debian, ArchLinux, Slackware 같은 리눅스 시스템을 내려 받을 수 있다. 이 글에서는 Fedora를 기준으로 윈도우 XP상에 설치하는 과정을 설명하고자 한다.

http://www.winpcap.org 에서 

      C. WinPcap을 내려 받는다.
          2011년 12월 23일 기준으로 버전 4.1.2 ( WinPcap_4_1_2.exe )를 받았다.



3. 설치하기 (Installation)

  1. WinPcap을 먼저 설치한다. 내려 받은 WinPcap_4_1_2.exe 파일을 더블 클릭하여 설치를 완료한다.

  2. 내려받은 coLinux-0.7.9.exe 파일을 더블 클릭하여 설치를 시작한다. 아래의 창이 뜨면 Next를 클릭한다.


    다음의 창에서 I agree 버튼을 클릭한다.


    이미 Fedora 파일 시스템을 내려 받았으므로, 아래의 창에서 Root Filesystem image Download를 체크를 지우고  Next를 클릭한다.


    설치할 폴더 이름을 C:\coLinux\ 로 지정한 다음, Next를 클릭한다.


    WinPCAP도 이미 설치하였으므로 Next를 클릭한다.


    coLinux를 설치하는 중에 TAP-Win32 Adapter를 설치할 것인지 물어보는데, Continue Anyway를 클릭한다.


    설치가 완료되면 아래의 창에서 Next를 클릭한다.


    아래의 창에서 Finish를 클릭하여 설치과정을 종료한다.


  3. 마지막으로 Fedora 파일 시스템을 설치한다. 이 때, 1GB정도의 하드 공간이 필요하다.

    파일 Fedora-11-20090919.exe를 C:\coLinux 디렉토리로 이동한다. 파일을 더블 클릭하여 압축을 푼다. 압축을 풀고나면 Fedora.cmd, Fedora.conf, fedora11.img, swap512m.img의 파일들이 생성된다.



4. 실행하기

윈도우 명령 창에서 아래와 같이 명령어를 입력한다.
C:\coLinux>colinux-daemon.exe @fedora.conf
 

그러면, 아래와 같이 Cooperative Linux console이 따로 생성되면서 리눅스 프로그램 부팅이 시작된다.


부팅이 완료되면, 아래와 같이 root로 로그인한다. 



useradd 란 명령어로 root이외의 계정을 생성한 뒤, 다음부터는 될 수 있으면 root가 아닌 일반 사용자로 로그인 한다.

윈도우 명령창에서 명령어를 직접 입력하여 coLinux를 실행하는 대신에 단축 아이콘을 이용할 수도 있다. 파일
colinux-daemon.exe의 단축 아이콘을 바탕 화면에 생성한다. 아이콘을 마우스 오른쪽 단추로 클릭하여 property를 조정한다. 아래와 같이 shortcut 탭의 Target 필드에 @fedora.conf 를 추가입력하고 저장한다.


이 단축 아이콘을 더블 클릭하면 cooperative linux console 이 생성되면서 리눅스 부팅 과정이 시작된다.




5. 종료하기

coLiniux를 종료할 때는 다음의 명령어를 입력한다.
[root@localhost ~]# shutdown -h now

아래에서와 같이 System halted란 메시지가 나오면, File-Quit을 클릭하여 console을 종료한다.




6. 제거하기

원도우 명령창에서 Uninstall.exe를 실행한다.



아래의 창들에서 각각 Uninstall과 Close 버튼을 클릭하여 프로그램 제거를 완료한다.




Posted by 참향그늘
,

참조 사이트:
http://www.sqlinform.com/forum4/read.php?3,467
http://www.serialio.com/support/OSX/Termlet/JavaPolicyFile.php

인터넷을 돌아다니다 만나게 된, 어느 자바 애플릿 윈도우에서 텍스트를 복사(copy)해다가 내 컴퓨터의 편집기(editor)에 붙이려고(paste) 했으나, 클립보드(clipboard)에 아무 것도 복사가 되지 않았음을 알게 되었다. 왜 복사가 되지 않는 걸까? 어떻게 하면 복사할 수 있을까? 이 글은 이 문제를 해결한 과정을 정리한 것이다.

오라클(Oracle)에서 2011년 2월에 자바 6 업데이트 24 (Java 6 update 24)를 내놓으면서 보안상의 결함을 수정하게 된다. 그 결과로, 개인 컴퓨터의 클립보드와 자바 애플릿 사이에 복사 및 붙이기 (copy & paste) 기능이 제한된 것이다. 복사 및 붙이기 기능을 사용하려면 다음의 방법들이 있다.

1. 이전 버전의 자바를 사용한다.
2.
3. 자바 애플릿의 보안 셋팅을 조절하는 java.policy 파일을 수정한다.

이 글에서는 3번의 방법에 대해서 설명하기로 한다. 윈도우 컴퓨터의 경우는 java.policy 파일이 대개 C:\Program Files\Java\jre6\lib\security\ 폴더 아래에 존재한다. 맥 (OS X) 컴퓨터의 경우는 /Library/Java/Home/lib/security 폴더 아래에 있다. 우선 java.policy을 자신의 홈디렉토리로 복사한다.

For Windows,
cp C:\Program Files\Java\jre6\lib\security\java.policy C:\Users\--your--user--name--\.java.policy

For Macs,
cp /Library/Java/Home/lib/security/java.policy ~/.java.policy

그런 후, .java.policy 파일을 열어서 // "standard" properies that can be read by anyone 밑에다가 다음의 한 줄을 집어넣는다.

permission java.awt.AWTPermission "accessClipboard";

이제, 웹브라우저(web browser)를 닫았다가 다시 열어서, 자바 애플릿을 사용하는 웹사이트에 재접속을 한다. 복사 및 붙이기가 가능함을 확인한다.
Posted by 참향그늘
,
참조 사이트: 
Vincent Zweije, "Remote X-Apps mini-HOWTO" 6. Telling the Server

ssh -x 명령어로 원격지에 있는 컴퓨터(서버)에 연결할 때, 아래와 같은 에러 메시지가 발생한다면,

[me@localhost]$ ssh -x SERVER
/usr/X11R6/bin/xauth: error in locking authority file /home/XXXXX/.Xauthority

로그인은 가능하지만, 그 컴퓨터에서 X 프로그램을 실행할 수 없다. 예를 들어 xclock을 실행시키면, 다음과 같은 에러 메시지가 뜬다.

[me@SERVER]$ xclock 
X11 connection rejected because of wrong authentication
X connection to localhost:14.0 broken (explicit kill or server shutdown).
 
.Xauthority 파일은, 서버 컴퓨터에 원격으로 접속을 시도할 때, X 서버에 접속을 승인하는 정보(authorization record, 또는 magic cookie)를 저장하고 있는 "권한 파일"(authority file)이다. 

이 파일이 어떠한 이유로 잠겨지면(locked), xauth 프로그램[각주:1]이 더 이상 이 파일을 읽거나 편집할 수 없게 된다. 그러므로, 이 파일이 잠기면 X 서버에 접속이 되지 않게 되고 결과적으로 원격 컴퓨터에서 X 프로그램을 실행할 수 없게 된다. 

본인 경험으로는 서버 컴퓨터 하드의 개인 용량을 다 써 버린 경우, .Xauthority 관련 에러 메시지가 발생하였다. 이 경우, 하드의 불필요한 데이터 들을 정리하여 여분의 공간을 마련한 다음, 잠금 상태에 있는 ~/.Xauthority 파일을 지운다. 이후에 재접속을 하면 자동으로 ~/.Xauthority 파일이 생성되고, X프로그램을 실행할 수 있게 된다. 

재접속이 귀찮으면 아래와 같은 방법을 이용한다.

[me@SERVER]$ rm ~/.Xauthority
[me@SERVER]$ touch ~/.Xauthority


  1. X 서버에 접속할 때 사용되는 권한 정보를 다루는 프로그램. [본문으로]
Posted by 참향그늘
,
참조 사이트 :
Matt Cutts: Gadgets, Google, and SEO
Mozilla Firefox Support Site
http://forums.mozilla.or.kr/viewtopic.php?p=42098
http://thehours.co.kr/tt/496

리눅스 컴퓨터에서 파이어 폭스 실행시 "Firefox is already running but is not responding." 이라는 에러 메시지가 뜬다면 아래와 같이 해결한다.

먼저, 컴퓨터에서 돌아가고 있는 프로세스들 중에서 firefox 관련된 것들을 검색한다.
[me@localhost ]$ ps auxwww | grep firefox
me    4615  0.0  0.0   4484   528 ?        S    May11   0:00 /bin/sh /usr/lib/firefox-1.5.0.12/firefox
me    4638  0.0  0.0   4484   512 ?        S    May11   0:00 /bin/sh /usr/lib/firefox-1.5.0.12/run-mozilla.sh /usr/lib/firefox-1.5.0.12/firefox-bin
me    4643  0.0  0.1 380760  1716 ?        Sl   May11  49:14 /usr/lib/firefox-1.5.0.12/firefox-bin
me  32329  0.0  0.0   3920   664 pts/1    R+   08:40   0:00 grep firefox

검색된 프로세스들을 kill이란 명령어로 죽인다.
[me@localhost ]$ kill 4615 4638 4643

위와 같은 절차를 거치면, 컴퓨터를 재부팅하지 않고서도 firefox를 실행할 수 있게 된다. 이런 에러가 발생하는 이유에 대해서는 thehours.co.kr에서 자세히 설명이 되어 있다. 간단히 말하자면, 프로파일에 걸린 락(잠금)이 풀리지 않은 상태서 firefox가 종료해서 생기는 문제이다. 다른 해결 방법은 락파일을 찾아서 지우는 것이다. 대개 리눅스에서는 프로파일이 ~/.mozilla/firefox/프로파일폴더/ 아래에 생성되는데, 여기서 lock 파일과 .parentlock 파일을 찾아서 지우면, firefox가 실행이 된다.

윈도우즈 컴퓨터의 경우에도 동일한 방법으로 해결이 가능하다. 자세한 내용은 Mozilla firefox support site를 참조한다.
Posted by 참향그늘
,
이전 글에서 구글 스프레드 쉬트를 이용하여 온라인 영어 단어장을 만들어 봤다. 영어 단어장을 만드는 것도 중요하지만, 그보다 단어장에 있는 영어 단어를 외우는 것이 더 중요하다. 영어 단어를 암기하는 좋은 방법 중 하나가 플래쉬 카드를 이용하는 것이다. 플래시 카드 앞에는 영어 단어를, 뒤에는 그 뜻을 적은 후, 영어 단어를 보고 한국 뜻을 맞추기도 하고 반대로 한국 뜻에 해당하는 영어 단어를 맞추기도 하는데 사용한다. 마침, 구글 개짓(gadget, (작은 기계) 장치, 도구) 중에 Seth Glickman 이 만든 플래시 카드가 있길래 이를 이용하는 방법을 알아보았다.

1. 먼저 작성해둔 영어 단어장을 연다. 그런 후, 메뉴에서 insert -> gadget을 클릭한다. 아래 그림에서처럼 다양한 개짓들 중에서 Flash Cards Gadget을 찾는다.   

그림 1. Add a Gadget


2. 그림 1에서 보이는 Flash Card Gadget의 "Add to spreadsheet" 버튼을 클릭하면, 아래 그림과 같이 편집 창이 뜬다. Flash Card gadget을 사용하려면, 영어/한국 단어들이 두 개의 칼럼에 나뉘어서 나열되어야 한다. 아래의 예에서는, 칼럼 A에 영어 단어를, 칼럼 B에는 그 단어에 해당하는 한국 단어를 적어 두었다. 이 범위(Range)를 Sheet1!A2:B99 로 기입한다. Title에도 적당한 제목(이름?)을 적는다. 모든 편집이 끝나면, "Apply and close" 버튼을 클릭한다.

그림 2. Flash Cards Gadget 편집 창


3. 그러면, 아래 그림과 같이 플래시 카드들이 배열됨을 볼 수 있다. 카드의 앞에는 영어 단어가 카드의 뒤에는 한국 단어가 적혀 있다고 생각하면 된다. 


4. 특정 단어의 한국 뜻이 보고 싶으면 단어 오른 쪽에 있는 Answer 버튼을 클릭한다. 예를 들어, aficionado의 오른 쪽에 있는 Answer 버튼을 클릭하면, 열렬한 애호가라는 뜻이 나타난다. 다시 한 번더 Answer 버튼을 클릭하면, 단어의 뜻이 사라진다. 


5. 오른 쪽 상단에 있는 Flip Cards를 누르면, 모든 카드가 뒤집어 지면서 한국 뜻이 보여진다. 다시 한 번더 Flip Cards 를 누르면 영어 단어가 보여진다. 


6. Show all : 모든 단어의 한국 뜻을 보여준다. 
    Hide all :  보여 준 한국 뜻을 모두 숨긴다. 
    Shuffle  :  플래시 카드를 무작위로 섞어서, 순서가 뒤죽박죽이 되게 한다.  
    Delete  :   어떤 단어가 익숙해지면, delete를 눌러 플래시 카드에서 그 단어를 제외할 수 있다.
    Undo    :  바로 직전에 제외된 단어를 다시 불러 올 수 있다.
    Reset   :  지워진 모든 단어를 불러 오고, 단어의 순서를 원래대로 정렬한다. 

7. 편집 창 우측 상단에 있는 펼쳐 보이기(역삼각형) 메뉴를 클릭하면, 하위 메뉴 중에 Publish Gadget... 이 있다. 이를 클릭하면, 이 플래시 카드 개짓의 고유한 스크립트 주소가 생성된다. 이를 HTML 문서에 삽입함으로써, 구글 문서를 열지 않고서도 바로 이 플래시 카드 개짓에 온라인으로 접속할 수 있다. 

다른 유용한 영어 단어 관련 구글 개짓으로 Word Study 도 있다. 


Posted by 참향그늘
,
Environment modules는 사용자로 하여금 유닉스/리눅스의 환경(environment) 설정을 쉽게 수정할 수 있도록 한다. 예를 들어 응용 프로그램을 두 개의 다른 버전으로 설치하였다고 하자. 응용 프로그램의 실행 파일이름은 runme, 버전은 1.0과 2.0 이라고 하고, 각각의 실행 파일은 아래와 같이 다른 디렉토리에 위치한다고 하자. 

/usr/local/응용프로그램-v1.0/bin/runme
/usr/local/응용프로그램-v2.0/bin/runme

일반적으로는 실행 파일(runme)이 있는 bin 디렉토리를 환경 변수인 경로(PATH)에 등록하여, 사용자가 명령어 창에서 runme만 입력하여도 자동으로 그 실행파일이 있는 디렉토리를 찾아서 해당 프로그램을 실행시키기 마련이다. 그러나, 위 경우에 다른 버전의 두 디렉토리를 모두 등록시켰다가는 항상 먼저 등록된 버전의 runme만 실행된다. 그렇다고 하나만 등록한다고 하면, 다른 버전을 사용할 때마다 매번 경로(PATH)를 수정해야 한다. 게다가 bin 디렉토리 뿐만 아니라 라이브러리 파일이 있는 lib 디렉토리마저도 버전마다 다르게 불러와야 할 경우는 상당히 골치가 아프다. 

Environment modules는 모듈 파일을 이용하여 이런 번거로움을 쉽게 해결해 준다. 예를 들어, 응용프로그램-v1.0과 관련된 설정을 하나의 모듈 파일로, 그리고 응용프로그램-v2.0과 관련된 설정을 다른 모듈 파일로 저장한다. 그리고 필요할 때마다 해당 모듈 파일을 불러오는 것으로 문제 해결이다. 이 글에서는 이미 environment modules가 설치되었다고 가정하고, 아래의 몇 가지 예를 통해서 사용법만 알아 보고자 한다. (설치하려면 소스포지 사이트에서 소스 코드를 다운받아 압축을 푼 후, 그 안에 있는 INSTALL이란 파일에서 2.2 Building and Installing Modules 부분을 참조한다.)

우선 어떤 모듈이 올라와 있는지 보자. (List loaded module files.)
[user@localhost ~]$ module list
No Modulefiles Currently Loaded.
현재로서는 올라와 있는 모듈이 없음을 알 수 있다. 

어떤 모듈들을 불러올 수 있는 확인하려면, 아래와 같다. (List available modules.)
[user@localhost ~]$ module avail
-------------------------------- /opt/modules/Modules/versions ---------------------------------
3.2.6
-------------------------------- /share/apps/modules/modulefiles --------------------------------
abinit/abinit-5.8.4p     intel/intel-9             mvapich/mvapich-1.1-intel-10   openmpi/openmpi-1.3.1-intel-11
fluent/fluent-12-beta   mvapich/mvapich-1.0-intel-10   mvapich/mvapich-1.1-intel-11   pgi/pgi-8.0
intel/intel-10              mvapich/mvapich-1.0-intel-11   mvapich/mvapich-1.1-intel-9    vasp/vasp-4.6
intel/intel-11              mvapich/mvapich-1.0-intel-9    mvapich/mvapich-1.1-pgi-8.0    vasp/vasp-5.2
위에 따르면 환경 모듈의 버전은 3.2.6이고, 그 아래에 불러올 수 있는 모듈들이 나열되어 있다. 

나열된 모듈들 중에 intel/intel-9 과 mvapich/mvapich-1.0-intel-9 를 불러오려면 module load를 이용한다.  
[user@localhost ~]$ module load intel/intel-9 mvapich/mvapich-1.0-intel-9

다음으로 intel/intel-9이란 모듈의 정보를 확인해 보자. (Show/display module information.)
[user@localhost ~]$ module show intel/intel-9       
-------------------------------------------------------------------
/share/apps/modules/modulefiles/intel/intel-9:

conflict         intel 
module-whatis    Provides Intel 9 C and Fortran Compilers 
prepend-path     PATH /opt/intel/cce/9.1.053/bin:/opt/intel/fce/9.1.052/bin:/opt/intel/idbe/9.1.053/bin 
prepend-path     LD_LIBRARY_PATH /opt/intel/fce/9.1.052/lib:/opt/intel/cce/9.1.053/lib 
-------------------------------------------------------------------
위에서 "module-whiatis"를 보면 intel/intel-9 모듈은 인텔 C와 포트란 컴파일러 (버전9)를 위한 환경 설정과 관련되어 있음을 알 수 있다. 그리고, 이 intel/intel-9 모듈 파일이 /share/apps/modules/modulefiles 디렉토리에 위치함을 알 수 있다. 이 모듈은 환경 변수인 PATH와 LD_LIBRARY_PATH에 추가적으로 관련 디렉토리들을 등록함을 알 수 있다. conflict에 대해서는 조금 있다가 설명하겠다.  


인텔 컴파일러 버전 9 대신에 버전 10 모듈을 불러올려면 module switch를 이용한다. (Switch modules.)
[user@localhost ~]$ which icc
/opt/intel/cce/9.1.053/bin/icc
[user@localhost ~]$ module switch intel/intel-9 intel/intel-10
[user@localhost ~]$ which icc
/opt/intel/cce/10.1.022/bin/icc
"module switch 모듈파일1 모듈파일2"라고 입력하면, 올라와 있는 모듈 1을 모듈 2로 바꾼다. 위의 예에서 보듯이 module switch 전후로 인텔 컴파일러 실행 파일인 icc가 다른 버전으로 변환되었음을 알 수 있다. 

만약 switch 대신에 unload/load를 사용할 수도 있다. (Load/unload modulefiles.)
[user@localhost ~]$ module unload intel/intel-10
[user@localhost ~]$ module load intel/intel-9
위 예에서는 intel-9을 불러 오기 전에 intel-10을 먼저 내렸음을 알 수 있다. 

만약 unload를 하지 않으면 어떤 문제가 생기는지 보자. 
[user@localhost ~]$ module load intel/intel-10
intel/intel-10(12):ERROR:150: Module 'intel/intel-10' conflicts with the currently loaded module(s) 'intel/intel-9'
intel/intel-10(12):ERROR:102: Tcl command execution failed: conflict intel
모듈간에 충돌이 생기면서 에러가 생기는데, 이는 intel/intel-9 모듈파일에서 지정한 conflict intel과 연관이 있다. conflict 다음에 하나 또는 그 이상의 모듈파일이 지정되어 있다면, 그 중에 어느 파일과도 동시에 불러올 수 없게 한다. 상기의 예에서는 conflict 다음에 intel이라는 디렉토리를 지정하여 그 디렉토리 안에 있는 모듈 파일들은 동시에 볼러올 수 없도록 한 것이다. 모듈파일 명령어 중에서 conflct처럼 불러오는 모듈파일 사이의 관계를 지정하는 또 다른 명령어로는 prereq이 있다. prereq에 대한 상세한 내용은 

불러온 다수의 모듈파일을 모두 다 내릴려면 purge를 이용한다. (Unload all loaded module files.)
[user@localhost ~]$ module purge
[user@localhost ~]$ module list
No Modulefiles Currently Loaded.

매번 로그인할 때마다 특정 모듈을 불러오기 귀찮다면, 쉘 초기화 파일에 module load를 추가한다. 본인의 경우에는 bash_profile 파일을 아래와 같이 편집하였다.
[user@localhost ~]$ cat >> ~/.bash_profile
module load intel/intel-9 mvapich/mvapich-1.0-intel-9
Ctrl + D
[user@localhost ~]$ source ~/.bash_profile


참조 사이트 1. http://modules.sourceforge.net/
                 2. module manual page
                 3. modulefile manual page
                 4. http://www.cpd.wm.edu/modules.php
Posted by 참향그늘
,
병렬 컴퓨터에서 작업을 하다 보면, 별다른 이유없이 프로그램이 실행되지 않으며 아래와 같은 에러 메시지를 출력할 때가 있다. 

p4_error: OOPS: semop lock failed: -1

대개의 경우, 이는 더 이상의 가용 세마포어 (semaphore, 깃발 신호)가 남아 있지 않아서이다. 이에 대한 해결책을 제시하기에 앞서, 우선 세마포어가 무엇인지부터 간략하게 알아보자.  

세마포어 (semaphore) 란?

복수의 프로세스 (process) 들이 하나의 또는 제한된 공동 자원 (common resources, or shared resources)에 접속을 할 때, 동시 접속을 방지하는 것에 관여하는 메모리 변수를 지칭한다. 메모리 변수라는 점에서 일반 프로그램 변수와 비슷하나, 차이점은 프로그램 변수는 그 프로그램 안에서만 다루어지는데 비하여 semaphore 데이타는 다른 프로세스들에 의해서도 사용된다는 점이다. (출처: The Linux Tutorial

[binary semaphore 의 예]
예를 들어, 하나의 데이타 파일에 접속할 수 있는 프로세스들이 여러 개 있는 상황을 가정하자. 한 프로세스가 파일을 편집하고 있는 상황에서 다른 프로세스의 접속을 허용하면, 데이터 파일이 뒤죽박죽되기 마련이다. 이를 막기 위해서, semaphore 의 값이 on (또는 참값) 이면 접근을 허용하고 그 반대의 경우는 불허하게 정한다. 처음으로 접근하는 프로세스가 semaphore 의 값을 off (또는 거짓값) 으로 바꾸고, 파일 작업이 끝나면 semaphore 의 값을 원래대로 돌린다. 다음에 오는 프로세스들은 이 값이 거짓이면 참이 될 때가지 기다리게 된다. 비유를 하자면 공용 화장실이 하나 밖에 없는데, 사람들이 줄서서 기다리는 상황과 비슷하다. 한 명이 들어가서 문을 잠구면(locked), 나머지는 문이 열릴(unlocked) 때까지 기다리는 수 밖에 없다. (Toilet example

[counting semaphore 의 예]
다른 예로서 식당의 비유 (출처: wiki)를 드는데, 이 비유에서 식당의 자리는 공동 자원에, 찾아오는 손님은 프로세스에 해당한다. 자리의 수는 제한되어 있으므로 찾아오는 손님마다 다 앉힐 수는 없는 노릇이다. 이 경우 식당에 안내하는 사람이 있어서, 자리가 다 차면 손님을 기다리게 하고 자리가 나면 우선 순위의 손님부터 받아들이는 등의 조정을 할 것이다. 이 안내자의 역할이 semaphore 에 해당하는 것이다. 

세마포어에 대해 좀 더 자세히 알고 싶다면 Vikram Shukla 가 쓴 "Semaphores in Linux" 란 웹문서를 추천한다.

이 semaphore 를 포함한 IPC (Inter-Process Communication)들의 크기나 개수는 시스템이 정한 제한이 있다. (출처:Vinay's Tech Stuff

병렬 프로그램들이 비정상적으로 종료한 경우, semaphore가 여전히 그 프로그램에 의해서 사용되고 있는 것으로 남아서 제한된 가용 semaphore을 잠식한다. semop locked failed error 는 이러한 상황에서 연유한다. 그러므로, 사용되지 않는 semaphore array를 지우면 문제가 해결된다. 먼저, 아래의 명령어로 어떤 semaphore가 남아 있는지 알아 보자. 

[user@linuxcluster ~]$ ipcs -s

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x00000000 10485790   user   777        1
0x00000000 10518559   user   777        1
0x00000000 10551328   user   777        1
0x00000000 10584097   user   777        1
0x00000000 10616866   user   777        1
0x00000000 10649635   user   777        1
0x00000000 10682404   user   777        1
0x00000000 10715173   user   777        1
0x00000000 10747942   user   777        1
0x00000000 10780711   user   777        1
0x00000000 10813480   user   777        1
0x00000000 10846249   user   777        1
0x00000000 10879018   user   777        1
0x00000000 10911787   user   777        1
0x00000000 10944556   user   777        1
0x00000000 10977325   user   777        1
0x00000000 11010094   user   777        1
0x00000000 11042863   user   777        1
0x00000000 11075632   user   777        1
0x00000000 11108401   user   777        1
0x00000000 11141170   user   777        1
0x00000000 11173939   user   777        1
0x00000000 11206708   user   777        1
0x00000000 11239477   user   777        1
0x00000000 11272246   user   777        1
0x00000000 11305015   user   777        1
0x00000000 11337784   user   777        1

이는 header node에 남아 있는 semaphore array만 보여준다. 모든 node 에 남아 있는 semaphore array를 볼려면 cluster-fork 라는 명령어를 이용한다. 이 때, node의 숫자에 따라 출력문이 길 수도 있으므로 파일( semaphore-list.txt) 로 받는게 더 좋다.

[user@linuxcluster ~]$ cluster-fork ipcs -s > semaphore-list.txt 

확인된 semaphore array 의 소유자 (owner)가 자신이면 ipcrm -s <SEMID> 란 명령어로 지울 수 있다. 예를 들어, 이런 식이다. 

[user@linuxcluster ~]$ ipcrm -s 11337784

위 명령어는 오직 지정된 ID의 semaphore array만 삭제한다. 모든 sem array를 지우고 싶다면, cleanipcs란 명령어를 이용한다. cleanipcs는 보통 관리자 권한에서만 실행되므로 일반 사용자는 실행할 수 없다. 관리자에게 부탁해서 자신의 로컬 디렉토리에 복사해서 사용한다. (본인은 ~/bin 디렉토리에 저장해서 사용한다.) 이 경우, 타인에게 권한이 있는 sem array는 삭제할 수 없다. 타인의 sem array는 해당 사용자에게 지워줄 것을 부탁해야 한다. 모든 node에서 자신의 sem array를 지울려면 다음과 같이 cluster-fork를 이용하여 cleanipcs를 실행한다. 

[user@linuxcluster ~]$ cluster-fork ~/bin/cleanipcs

만약에 cleanipcs를 구할 수 없으면, 차선책으로 다음의 쉘 스크립트 (shell script) 파일을 만들어서 실행한다. 

[user@linuxcluster ~]$ cat > rmsem.i686.sh 
#!/bin/sh
ipcs | cut -f 2 -d ' ' | xargs ipcrm shm
ipcs | cut -f 2 -d ' ' | xargs ipcrm sem
ipcs
ctrl + D
[user@linuxcluster ~]$ chmod 744 rmsem.i686.sh
[user@linuxcluster ~]$ cluster-fork rmsem.i686.sh

이제 좀비(zombie) semaphore array를 깨끗하게 지웠으니, 프로그램이 문제없이 실행될 것이다. 
Posted by 참향그늘
,
일반적으로 리눅스 컴퓨터에서 새 프로그램을 설치할 경우, yum을 이용하는 것이 간단하고도 빠른 방법이 되겠다. 예를 들어, Octave를 설치한다면 다음과 같이 입력하면 된다.

[root@localhost ~]# yum install octave

그러나, 자신이 쓰고 있는 리눅스 배포판이 Centos (Community ENTerprise Operating System) 인 경우, 아래와 같은 메시지만 보게 되고, 설치가 되지 않는다. 

[root@localhost ~]# yum install octave
Loading "priorities" plugin
Loading "fastestmirror" plugin
Determining fastest mirrors
0 packages excluded due to repository priority protections

이러한 이유는 Octave 프로그램이 RHEL (Red Hat Enterprise Linux) 에 포함되지 않으면서, 자동적으로 Centos 에서도 배제되었기 때문이다. 하지만, 다행히도 EPEL (Extra Packages for Enterprise Linux) 로부터 Octave를 내려받을 수 있다. 이를 위해서, 우선 yum의 저장소 목록(repository list)에 EPEL을 추가하여야 한다.[각주:1] [각주:2]

현 저장소 목록에 등록되어 있는 저장소(repository)들을 확인해 보자.
[root@localhost ~]# yum repolist
Loading "priorities" plugin
Loading "fastestmirror" plugin
repo id                  repo name                                          status
addons                 CentOS-5 - Addons                             enabled
base                    CentOS-5 - Base                                 enabled
extras                   CentOS-5 - Extras                               enabled
updates                CentOS-5 - Updates                             enabled

그리고, 아래의 명령어로 yum 의 repo list 에 EPEL repository를 추가한다. 
[root@localhost ~]# rpm -Uvh http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
Retrieving http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-3.noarch.rpm
warning: /var/tmp/rpm-xfer.n5lIiD: Header V3 DSA signature: NOKEY, key ID 217521f6
Preparing...                ########################################### [100%]
   1:epel-release         ########################################### [100%]

이제 다시금 yum의 repo list 를 확인해 보면 epel 이란 ID로 EPEL repository가 추가되었음을 알 수 있다. 
[root@localhost ~]# yum repolist
Loading "priorities" plugin
Loading "fastestmirror" plugin
repo id                  repo name                                          status
addons                 CentOS-5 - Addons                             enabled
base                    CentOS-5 - Base                                 enabled
epel                     Extra Packages for Enterprise Linux 5 -   enabled
extras                   CentOS-5 - Extras                               enabled
updates                CentOS-5 - Updates                             enabled

실제로 하드 공간을 살펴보면, /etc/yum.repos.d 디렉토리 아래에 기존에 있던 CentOS-Base.repo 파일 외에 새로 epel.repo 생성되었음을 확인할 수 있다.
 
[root@localhost ~]# cat /etc/yum.repos.d/epel.repo

[epel]
name=Extra Packages for Enterprise Linux 5 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/5/$basearch
mirrorlist=http://mirrors.fedoraproject.org/mirrorlist?repo=epel-5&arch=$basearch
failovermethod=priority
enabled=1
gpgcheck=1
...

이제 yum을 이용해서 Octave를 설치하자. yum install octave라고 아래와 같이 명령어를 친 후, Is this ok [y/N]를 보면 y를 입력하여 설치를 진행한다.

[root@meso src]# yum install octave
Loading "priorities" plugin
Loading "fastestmirror" plugin
Loading mirror speeds from cached hostfile
0 packages excluded due to repository priority protections
Setting up Install Process
Parsing package install arguments
Resolving Dependencies
--> Running transaction check
---> Package octave.i386 6:3.0.5-1.el5 set to be updated
--> Processing Dependency: libglpk.so.0 for package: octave
--> Processing Dependency: libcolamd.so.2 for package: octave
--> Processing Dependency: libccolamd.so.2 for package: octave
--> Processing Dependency: libcholmod.so.1 for package: octave
--> Processing Dependency: libhdf5.so.0 for package: octave
--> Processing Dependency: libfftw3.so.3 for package: octave
--> Processing Dependency: libqhull.so.5 for package: octave
--> Processing Dependency: libcamd.so.2 for package: octave
--> Processing Dependency: libumfpack.so.5 for package: octave
--> Processing Dependency: libamd.so.2 for package: octave
--> Processing Dependency: libcxsparse.so.2 for package: octave
--> Running transaction check
---> Package fftw3.i386 0:3.2.2-3.el5 set to be updated
---> Package glpk.i386 0:4.20-2.el5 set to be updated
---> Package suitesparse.i386 0:3.1.0-1.el5 set to be updated
---> Package hdf5.i386 0:1.6.10-1.el5 set to be updated
---> Package qhull.i386 0:2003.1-8.el5 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

============================================================================
 Package              Arch       Version          Repository        Size 
=============================================================================
Installing:
 octave                  i386       6:3.0.5-1.el5    epel               12 M
Installing for dependencies:
 fftw3                     i386       3.2.2-3.el5       epel              1.3 M
 glpk                      i386       4.20-2.el5        epel              737 k
 hdf5                      i386       1.6.10-1.el5     epel              4.6 M
 qhull                     i386       2003.1-8.el5     epel              380 k
 suitesparse             i386       3.1.0-1.el5      epel             931 k

Transaction Summary
=============================================================================
Install      6 Package(s)         
Update       0 Package(s)         
Remove       0 Package(s)         

Total download size: 20 M
Is this ok [y/N]: 

옥타브 설치를 완료하였다.
  1. http://jamesreubenknowles.com/how-to-install-octave-on-centos-5-using-yum-757 [본문으로]
  2. http://fedoraproject.org/wiki/EPEL/FAQ#howtouse [본문으로]
Posted by 참향그늘
,
http://www.gnu.org/software/octave/doc/interpreter/Function-Files.html#Function-Files

옥타브(Octave) 스크립트(script)를 실행하면, 스크립트에 적혀 있는 명령어(command)나 변수(variable)들을 순차적으로 옥타브가 실행한다. 이 때, 옥타브는 우선 이미 컴파일(compile) 되어서 부호표(symbol table)에 저장되어 있는 명령어, 변수부터 찾기 시작한다. 만약 여기서 찾을 수 없으면, 경로(path)에 나와 있는 디렉토리(directory) 아래에 있는 .m 파일들 중에서 명령어와 파일이름이 동일한 것으로 고른다.

옥타브 경로 변수는 DEFAULT_LOADPATH와 LOADPATH가 있다. DEFAULT_LOADPATH는 옥타브 내부적으로 내정한 값으로 일반 사용자가 건드리지 않는 것이 좋다. 옥타브 명령 창 (command window) 에  DEFAULT_LOADPATH 를 치고 엔터 키를 누르면 아래와 같이 콜론(:)으로 구분된 일련의 디렉토리들이 나열된다.

octave:1> DEFAULT_LOADPATH
DEFAULT_LOADPATH =.:/usr/local/libexec/octave/2.1.73/site/oct/i686-pc-linux-gnu//:/usr/local/libexec/
octave/site/oct/api-v13/i686-pc-linux-gnu//:/usr/local/libexec/octave/site/oct/i686-pc-linux-gnu//:/usr/local/
share/octave/2.1.73/site/m//:/usr/local/share/octave/site/api-v13/m//:/usr/local/share/octave/site/m//:/usr/local/
libexec/octave/2.1.73/oct/i686-pc-linux-gnu//:/usr/local/share/octave/2.1.73/m//

*.m 소스 파일들은 /usr/local/share/octave/2.1.73/m 디렉토리 아래에 들어 있다.

LOADPATH 는 사용자가 편집할 수 있는 경로로서 ~/.octaverc 파일에서 LOADPATH를 정의할 수 있다. 예를
들어, 개인 홈 디렉토리 아래 Codes/OctaveScripts 디렉토리 안에 옥타브 스크립트들이 있다면,
~/.octaverc 파일을 열어서 LOADPATH를 다음과 같이 정의한다.

LOADPATH = "::~/Codes/OctaveScripts//"

주의할 점은 두 개의 콜론을 반드시 넣어야 한다는 것이다. 이는 DEFAULT_LOADPATH에서 정의된 디렉토리들을 LOADPATH로 불러오기 위함이다. 이를 빠뜨리게 되면, 기본적인 명령어도 Octave가 이해하지 못하는 경우가 생긴다. 두 개의 콜론은 하나의 첫 콜론이나 하나의 마지막 콜론으로도 대체될 수 있다. 즉, 아래 표현들은 다 동일하다.

LOADPATH = "::~/Codes/OctaveScripts//"
LOADPATH = ":~/Codes/OctaveScripts//"
LOADPATH = "~/Codes/OctaveScripts//:"

위 예에서 // 는 OctaveScripts 자체 디렉토리 및 그 하위 모든 디렉토리를 의미한다.

옥타브 버전 3 부터는 직접 ~/.octaverc 파일을 건드리는 대신에 Octave 명령 창에서 path 관련 명령어를
이용하도록 바뀌었다.[각주:1] 예를 들어 ~/Octave 란 디렉토리를 Octave 검색 경로에 넣고 싶다면, 아래와 같이 입력한다.

octave:2> addpath("~/Octave")

디렉토리를 경로에서 지우고 싶으면 rmpath 명령어를 이용한다.

octave:3> rmpath("~/Octave")

옥타브의 검색 경로를 확인하고 싶으면 pathdef() 나 path 를 이용한다.

octave:4> pathdef()


  1. http://www.gnu.org/software/octave/NEWS-3.html [본문으로]
Posted by 참향그늘
,