Java-Linux 1.1.1 HOWTO Karl Asha, karl@blackdown.org 18 May 1997 번역: 박기영, meanless@soback.kornet.nm.kr 이것은 리눅스용 JDK-1.1.1 하우투의 초안이다. ______________________________________________________________________ 목차표: 1. JDK 1.1.1 설치하기 1.1. 개관 1.2. 필요한 라이브러리 1.3. 리눅스용 JDK 1.1.1 구하기 1.4. 리눅스용 JDK 1.1.1 설치하기 1.5. 시스템 셋팅 요건 1.6. Motif(모티프) - 정적 대 동적 1.7. 문제점과 버그 레포팅 1.8. 한층 더 자세한 내용 2. JDK-1.1.1 릴리즈 노트 2.1. jdb 3. 리눅스 커널에서 자바 바이너리 포맷 지원 사용 3.1. 커널 설정 3.2. 자바 바이너리 지원 사용하기 3.3. 한층 더 자세한 내용 4. 넷스케이프와 자바 4.1. 넷스케이프 3.0 4.2. 넷스케이프 4.0 5. Morimba의 Tuner ______________________________________________________________________ 1. JDK 1.1.1 의 설치 1.1. 개관 리눅스용 JDK 1.1.1 패키지는 넓은 지역에 걸친 자원자들의 미러 사이트 리스트에서 구할 수 있다. 개발자들의 시스템은 ELF 바이너리를 사용할 수 있는 시스템이라고 가정한다. 여기서 ELF 는 이 문서의 범위를 넘어서므로 언급하지 않겠다. 1.2. 필요한 라이브러리 현재 리눅스용 JDK 1.1.1 은 필수적인 표준 C 라이브러리와 지원 바이너리를 실행하기 위해 필요한 Linux Dynamic Loader Library 로 패키징되었다. 개발자들은 사용하는 시스템에 XFree86 라이브러리가 설치되어 있는지를 확실히 해야한다. 리눅스용 JDK 1.1.1 은 다음과 같은 환경 하에서 만들어졌다. 라이브러리 변경 o libc version 5.4.13 o loso version 1.8.5 o XFree86 version 3.1.2 새로운 XFree86 을 시스템에 깔아야 한다면, 필요한 패키지는 다음에서 찾을 수 있다. 더 자세한 정보를 원한다면 XFree86 배포판이 있는 곳의 README 화일을 보라. 현재 시스템에 설치되어 있는 라이브러리들의 요약을 보려면 ldconfig -v 라고 쳐보아라. 이 패키지들의 기술적 세부사항이나 프로그래밍 정보, 설치 안내는 이 문서의 범위를 넘어선다. 1.3. 리눅스용 JDK 1.1.1 구하기 리눅스에서 자바를 사용하기 위한 세가지 패키지는 미러 사이트에서 구할 수 있다. 자신의 자바 애플리케이션과 JRE를 번들하는 것에 대한 라이센스 정보를 알고 싶다면 에 방문해 보라. JDK 1.1.1 을 위한 JavaSoft 문서, 데모 클래스, src.zip 이 각각의 패키지에 배포되어 있다.(jdk1.1.1-doc+demo.tar.gz) JDK - Java Developer's Kit 이 패키지는 리눅스에서 자바 프로그램을 컴파일하고 실행시키기 위한 모든것을 포함한다. JRE - Java Runtime Environment JRE 는 응용프로그램에 번들시켜 사용하는 런타임 시스템이다. 이것은 자바 프로그램을 실행(컴파일이나 디버깅이 아니라)하기 위해 필요한 모든것을 포함하고 있다. RT - Saperated Java Runtime Environment RT 패키지에서는 국제화 지원과 기본 런타임 VM이 rt와 i18n 두 디렉토리에 나뉘어져 들어있다. rt 디렉토리는 ISO-Latin-1 환경에서 자바 응용프로그램을 실행하는데 필요한 모든것을 제공한다. i18n 디렉토리는 서로 다른 지역의 문자 인코딩 방법(Scheme)을 위한 부가적인 바이트->캐릭터 변환기를 포함하고 있다. JRE 패키지에는 이 두 디렉토리가 하나로 결합되어 있다. 현재 확인된 미러들의 리스트는 에 있다. 1.4. 리눅스용 JDK 1.1.1 설치하기 관습에 따라, 모든 이가 JDK 를 설치하기 위해 해야할 일은 디렉토리를 선택하는 것이다. 이를테면 /usr/local/ 같은 곳에다가 말이다. 그리고 선택된 압축화일을 푼다. 인스톨이 되었으면(위의 디렉토리 /usr/local 을 선택한 경우) /usr/local/jdk1.1.1/bin/ 을 패스에 추가해서 JDK 를 사용할 수 있게 한다. 불행히도 리눅스용 JDK 의 홈 디렉토리 선택을 둘러싸고 최근에 논쟁이 벌어졌다. 솔직히 위치에 관한건 단순히 시스템을 꾸미는 정도의 문제일 뿐이다. 여전히 중요한 것으로 남아있는 것은 JDK 의 서브디렉토리인 bin/, lib/, classes 를 포함하는 디렉토리를 가리키는 JDK_HOME 변수를 설정하는 것이다. 앞으로 나올 Java-Linux 에서 배포될 패키지들은 필요한 지원 바이너리와 클래스들을 찾기 위해 이 변수를 참조 할 것이다. 1.5. 필요한 시스템 셋팅 CLASSPATH 셋팅 CLASSPATH 환경 변수는 JDK 에게 클래스를 어디서 찾을지 가르쳐 주기 위해서 쓰인다. 가끔 잘못된 셋팅은 JDK 툴이 성공적으로 수행되는 것을 방해하기도 한다. 만약 JDK 를 사용하다가 어떤 문제점을 경험하게 되면 java, java, appletviewer 를 실행하기 전에 CLASSPATH 변수가 제대로 되어있는지 부터 살펴보아라. Device 퍼미션 JDK 를 사용하기 전에 /dev/zero 라는 특별한 장치가 모두에게 읽기, 쓰기가 허용되어 있는지를 확인하라. 허용을 하게 하려면 수퍼유저의 권한으로 다음과 같이 하라. chmod 666 /dev/zero 스왑 공간 JDK는 실행될 때, 메모리의 상당히 많은 부분을 미리 확보하려고 시도한다. JDK 와 함께 제공되는 모든 실행 가능 화일을 실행하기 전에 적어도 20메가 바이트의 남은 스왑 공간이 있는지를 확인하라. 자바 인터프리터가 쓰는 메모리의 양을 -mx 와 -ms 플래그를 써서 조절할 수 있다. 이 셋팅에 관한 더 상세한 정보는 JDK 매뉴얼 페이지에 있다. 1.6. 모티프 - 정적 대 동적 JDK 1.1.1 에 앞서 Java-Linux 에 두가지 다른 패키지가 배포되었다. 하나는 Motif 와 정적으로 링크된 것이다. 비록 Motif 와 동적으로 링크된 JDK 1.1.1 이 현재로선 지원되지 않지만 Motif 공유 라이브러리를 사용할 수 있는 방법은 있다. NS_JAVA 환경 변수를 마치 사용하는 것처럼 0 이 아닌 값으로 셋팅한다. 이 방법은 XFree86 배포판을 인스톨 할 필요가 없이 JDK 를 사용할 수 있게 해준다. Motif 공유 라이브러리 역시 사용하게 해준다. 공유 Motif 라이브러리를 사용하기 위해선 LD_PRELOAD 환경 변수를 사용해야만 한다. Motif 라이브러리와 모든 필요한 XFree86 라이브러리가 먼저 로드되어야 한다. 예를 들어 : export NS_JAVA=true export LD_PRELOAD=/usr/X11R6/lib/libXm.so.2.0:\ /usr/X11R6/lib/libX11.so.6.1 1.7. 문제점과 버그 보고 만약 리눅스용 JDK 1.1.1 을 사용하는 도중 버그처럼 보이는 것을 발견하게 된다면 Steve byrne 에게 메일을 보내라. sbb@gnu.ai.mit.edu 버그 레포트에 loconfig -v 의 출력물, 커널 버젼, 그리고 유용한 스택 트레이스를 포함시켜 달라. 1.8. 한층 더 자세한 내용 최신 하우투, 메일링 리스트, 지원되는 제품리스트 그리고 다른 Java-Linux 서비스들은 Blackdown Organization 에 있다. 이것들에 대한 어떤 질문이나 제안이 있다면 karl@blackdown.com 에게 보내라. 풍부한 Java 정보들은 바로 JavaSoft 이다. 2. JDK-1.1.1 릴리즈 노트 2.1. jdb JDK 와 함께 패키징되어 있는 디버거 ("jdb")는 작동하기 위해 활성화된 네트워크 인터페이스를 필요로 한다. 대개의 다이얼 업 머신은 인터넷에 연결되어 있지 않을땐 루프백("127.0.0.1")인터페이스만 활성화되어 있기 때문에 jdb 는 문제를 일으킨다. jdb 는 컴퓨터의 호스트 네임과 일치하는 어드레스에 접속하려고 시도할 것이다. 그리고 /etc/hosts 에 명시되어 있는 어드레스에 접근과 조사를 할 수 없다는 것을 알게 된다. 이 문제에 대한 한가지 해결책은, 호스트네임을 ("127.0.0.1") 로 바꾸거나 별명으로 만들어 주는 것이다. 좀더 사리에 맞는 대답은 바로 /etc/hosts 에 명시한 이름, 어드레스와 일치하는 더미 장치를 쓰는 것이다. 더미 인터페이스는 정말 좀 색다른 것이지만 그래도 다소 유용한 것이다. 주요 장점은 독립적인 호스트거나 IP 네트워크 연결이 단지 전화접속으로 이루어 지는 컴퓨터에서 발휘된다. 사실상 후자는 대개의 경우 독립적인 호스트의 경우이다. 독립적인 호스트의 딜레마는 독립적인 호스트는 단 하나의 활성화된 네트워크, 즉 127.0.0.1 로 보통 주어지는 루프백 장치만을 가진다는 것이다. 그러나 어떤 경우엔 로컬 호스트의 공식적인 IP 어드레스에 데이터를 보내야 할 필요가 있다. 이를테면, 랩탑 vlite 를 생각해보자. 이것은 이 예를 들 동안 어떤 네트워크에도 연결되어 있지 않을 것이다. vlite 의 어떤 응용프로그램이 같은 호스트의 다른 응용프로그램에게 데이터를 보내려고 한다. vlite 의 /etc/hosts 에서 192.72.1.65 라는 IP 어드레스를 찾아서 그 응용프로그램이 IP 어드레스로 데이터를 보내려고 시도한다. 루프백 인터페이스가 그 머신에서 현재 유일하게 활성화되어 있는 인터페이스이기 때문에 커널은 이 어드레스가 자기자신을 참조한다는 사실을 모른다! 때문에 커널은 데이터그램을 버리고 응용프로그램에게 에러를 반환한다. 여기가 더미장치가 간섭하는 곳이다. 단순히 더미장치는 루프백 인터페이스의 바뀐 자아의 역할을 함으로써 그 딜레마를 해결한다. vlite 의 경우 단지 191.72.1.65 어드레스를 준후 호스트의 라우트 포인팅을 그것에 첨가하면 된다. 적당한 주문은 다음과 같다. ________________________________________________________________________ # ifconfig dummy vlite # route add vlite ________________________________________________________________________ 3. 리눅스 커널에서 자바 바이너리 포맷 지원의 사용 3.1. 커널 설정하기 리눅스에서 자바 바이너리 포맷 지원을 사용하려면 커널을 'Kernel support for ELF binaries' 로 설정해주어야만 한다. 최신 커널 설정에서 위와 같은 옵션을 보려면 'Experimental Drivers' 옵션에도 역시 yes 로 해줘야 한다. 커널로 컴파일시켜 넣을때 o 만약 자바 지원이 모듈로 컴파일되지 않는다면 자바 응용프로그램들의 위치가 리눅스 제어 인터페이스를 사용하는 도중에 명시되어야 한다. 아니라면 자바와 애플릿뷰어 응용프로그램은 /usr/bin 에서 발견될 것이라고 가정한다. echo "/usr/local/java/bin/java" > /proc/sys/kernel/java-interpreter echo "/usr/local/java/bin/appletviewer" > /procsys/kernel/java-appletviewer 모듈로서 컴파일시킬 때 o 자바 지원이 모듈로 컴파일 되었다면 모듈은 자바와 애플릿뷰어 응용프로그램이 /usr/bin 에 있을거라고 예상한다. 이것에 관해 작업해 주려면 /usr/src/linux/fs/binfmt_java.c 만 수정하면 된다. #define _PATH_JAVA "/usr/bin/java" #define _PATH_APPLET "/usr/bin/appletviewer" 3.2. 자바 바이너리 지원의 이용 자바 바이너리 지원을 사용하기 위해서는 컴파일된 자바 코드와 함께 다음과 같은 과정이 시행되어야 한다. o 자바 소스 화일을 보통 하듯이 컴파일 한다. o chmod 로 생성된 클래스에 실행 가능으로 설정한다. o 클래스 화일을 다른 실행 가능한 것들 처럼 그냥 실행시킨다. 3.3. 한층 더 자세한 내용 리눅스 커널에서 자바 바이너리 포맷 지원에 관한 릴리즈 노트는 에 있다. 4. 넷스케이프와 자바 4.1. 넷스케이프 3.0 넷스케이프 3.0 과 자바, 리눅스 머신의 근본적인 문제는 dl-malloc 로 컴파일된 표준 C 라이브러리를 이용한다는 것이다. wrapper 스크립트와 오래된 gunmalloc 를 사용하면 거의 대부분의 브라우저가 다운되지 않을 것이다. 스크립트는 역시 아주 간단한 CLASSPATH 를 설정한다. 조심하라. 이떤 CLASSPATH 기입은 넷스케이프를 혼란시킬 수 있고 브라우저를 다운시킬 수도 있다. 구식의 넷스케이프 클래스 라이브러리가 존재하면 역시 그렇게 될 수 있다. __________________________________________________________________________ #!/bin/sh export CLASSPATH="/usr/local/netscape/java/classes/java_301:." export LD_PRELOAD="/lib/gnumalloc.so" exec /opt/netscape/bin/netscape "$@" # 주의! 이 스크립트가 아닌 실제의 넷스케이프 실행화일의 패스가 되어야 한다. -------------------------------------------------------------------------- 모든 일을 하려면 다음과 같은 과정을 따라라: o 넷스케이프를 설치한다. O 넷스케이프 압축화일에 포함된 java_30 이나 java_301 화일을 /usr/local/netscape/java/classes/ 로 복사한다. o gnumalloc.so 를 /lib 로 카피한다. o 셸 스크립트를 자신의 셋업에 맞게 수정한다. gnumalloc.so 는 http://www.blackdown.org/java-linux/downloads/gnumalloc.tar.gz 에서 구할 수 있다. 이 팁에 대해 Doug Ridgway (ridgway@routh.UCSD.EUD)에게 감사를 표한다. 최근에 libXext.so.6.0 이상의 libXext.so 버전을 쓰는 경우, 자바 애플릿을 만나면 넷스케이프가 다운되어 버리는 현상이 보고되었다. 해결책은 libXext.so.6.0 을 /lib/509/ 와 같은 디렉토리로 복사한후 적당한 심볼릭 링크를 한뒤 LD_LIBRARY_PATH 에 그디렉토리를 제일 처음 찾도록 설정하는 것이다. Geoffrey Daifiki (dairiki@apl.washington.edu)는 넷스케이프 3.0 하에서 자바로 음악을 연주 할 수 있게 하였다. 그것은 http://irving.apl.washington.edu/~dairiki/libmmoss/libmmoss.html 에서 찾아볼 수 있다. 4.2. 넷스케이프 4.0 넷스케이프 4.03b 에 앞서, 어떤 라이브러리와 모듈의 조합으로도 넷스케이프의 다운을 막을 수가 없었다. 그러나 libc 5.4.23 이나 그 상위의 버전과 함께 쓰였을 때 넷스케이프 4.0 베타 3 버전은 넷스케이프 3.0 이 필요로 했던 어떤 이전의 작업 환경도 필요로 하지 않고 작동되는 것이 검증되었다. 5. Marimba 의 Tuner 현재 Tuner 의 업데이트는 반드시 생략해야한다. 그것과는 별도로 응용프로그램들은 잘 동작한다.