
솔라리스에서 실행되는 리눅스 스크린샷을 보려면 클릭
(역주; 이글의 저자는 Solaris를 운영체제나 Sun 워크스테이션을 지칭하는데 사용한다. 문맥상 둘중 하나가 명확하므로 그대로 옮겼다.)
오픈소스 개발자가 되면서 나는 자연적으로 모든 작업을 리눅스에서 하게 되었다. 개발자는 "모든" 소스코드가 있는 장점을 안다. 예를 들어, 나는 Open Source Audio Library Project 작업을 한다. 이는 사운드 기능을 제공하는 C++ 클래스 라이브러리다. 리눅스 랩탑에서 개발하면서 나는 오디오 샘플 빈도에 문제를 발견했다. 어떤 샘플 빈도에서는 음이 도널드닥처럼 들리고, 다른 빈도에서는 정상으로 들렸다. 데스크탑 컴퓨터의 리눅스에서는 문제가 없었다. 오랜 검사끝에 나는 다른 운영체제를 사용한후 랩탑을 끄지않고 리눅스로 재부팅하면 오디오칩의 레지스터가 초기화가 안되서 문제가 발생함을 알아냈다. 나는 오디오 코드에서 드라이버를 찾아 고쳤더니 제대로 작동하였다. 나는 Alan Cox에게 패치를 보냈고 바로 다음 커널(2.2.17)에 반영되었다. 만약 소스코드를 볼 수 없는 독점 운영체제였다면 이런 일은 일어나기 힘들 것이다.
라이브러리를 검사하면서 나는 세가지가 필요함을 알았다. 1) 더 많은 운영체제를 지원, 2) 빅엔디언 CPU 지원, 3) 64비트 플래폼 지원. 여른 컴퓨터들를 살펴본후 나는 Sun Microsystems 컴퓨터에 지원을 추가함이 좋다고 결정했다. Sun은 가장 대중적인 상업적 유닉스 컴퓨터이고, 그들의 새로운 모델은 빅엔디언에 64비트인 UltraSPARC CPU를 사용한다.
Sun는 Ultra 5라는 저급 컴퓨터를 만든다. 이 컴퓨터를 새로 사려면 $2000에서 $3000 정도 든다. 이는 내가 기대하는 것보다 많은 액수다. 그래서 나는 Ebay에서 중고 Ultra 5를 찾았다. Ebay에서 중고 Ultra 5는 $500에서 $700 정도 한다. 워크스테이션으로는 좋은 가격이다. 나는 270 Mhz UltraSPARC II 프로세서, 64MB 메모리, 4.3 GB 하드디스크를 단 Ultra 5를 샀다. 만약 어떤 종류의 Sun 워크스테이션을 살지 모르겠다면 www.linuxdoc.org에서 SPARC-HOWTO를 봐라. 나는 또 Sun에서 (www.sun.com/software/solaris/binaries/get.html) Solaris 8을 $75에 사서 설치했다. 설치는 완벽하게 성공했다. 나는 내 소프트웨어를 Solaris에 포팅할 수 있었다. 그러나 사람들이 SPARC에서도 리눅스를 사용함을 안후 나는 Ultra 5에 리눅스도 설치하여, Solaris 8과 리눅스를 듀얼부팅할 수 있어야 했다. 다음은 Ultra 5에 리눅스를 설치한 경험담이다.
첫단계는 사용할 배포본을 결정하는 일이다. Intel 프로세서에서 여러해동안 SuSE 리눅스를 사용해왔고 좋아한다. SuSe가 SPARC 배포본을 제공하기에 이것으로 결정했다. CheapBytes에서 구매하고 3일후 CD를 받을 수 있었다. 어떤 배포본을 사용할지 결정하지 못했다면 www.ultralinux.org 웹사이트에 가봐라. 거기에서 Sun 워크스테이션용 리눅스 배포본 목록을 얻을 수 있다.
다음 단계는 리눅스 배포본을 어디에 둘지 결정하는 일이다. 나의 4.3GB 하드디스크로만은 Solaris와 리눅스 모두를 담기에 충분하지 않다. 나는 먼저 SPARC에 리눅스를 처음 설치해보기 때문에 테스트를 위해 기존의 4.3 GB IDE 하드디스크를 빼고 오래된 3GB IDE 하드디스크를 달았다. 이 디스크는 Intel 시스템의 오래된 리눅스에서 가져왔다. 문제가 있음을 알았다. YaST2라는 SuSE 설치기를 사용하는데 어떤 방식을 사용해도 하드디스크를 파티션하지 못했다. YaST2는 자동(automatic) 옵션과 사용자 직접(custom manual) 옵션을 제공한다. 자동 옵션을 사용하면 디스크를 파티션할 수 없다는 오류가 난다. 직접 옵션도 어떻게 하던간에 작동하지 않았다. 몇일의 시도후 어떤 식으로든 디스크가 포맷되야 한다고 생각하여 마지막으로 Solaris를 먼저 설치해봤다. 제대로 되는 것같다. 그런다음 YaST2에서 사용자 직접 파티션 메뉴를 사용하여 SunOS 스왑 파티션을 남겨두고 16MB /boot 파티션, 2GB / 파티션, 200MB 리눅스 스왑 파티션을 만들었다. 이후 파일 설치는 정상적으로 진행되었다. 나는 나중에 인터넷에서 비Soarlis 디스크를 사용할때 fdisk로 디스크에 Solaris 디스크라벨을 만들어야 한다는 것을 알았다. 또 이 라벨은 첫번째 파티션에 저장되고 스왑이 라벨을 보존하지 않기때문에 첫번째 파티션을 리눅스 스왑 파티션으로 사용하지 못함을 알았다.
이제 실제 설치할 준비가 되었다. 나는 완전히 다시 시작하기로 결정했다. 그래서 새로 20 GB 하드디스크를 사서 Ultra 5에 달았다. Ultra 5를 끼고 초기화중에 Stop-A 키조합을 눌렸다. 그러면 Ultra 5의 부트 PROM이 뜬다. Solaris 8 CD를 CD-ROM 드라이브에 넣고 "boot cdrom"을 입력하여 Solaris 설치를 시작했다. Solaris Gazette가 아니기때문에 명령프롬프트에서 format을 실행하여, 세번째 파티션(#2)에 백업라벨을 만들고 다른 것들을 지운후, 하드드라이브에 라벨을 준다고 말하면 충분할 것이다. 그리고 Solaris 8 설치를 재시작했다.
Solaris 설치에 루트 파티션 5G, Solaris 스왑 파티션 512 MB, /export/home 파티션 2GB를 할당했다. 나는 첫번째 SuSE CD를 넣고 컴퓨터를 재시작했다. 부팅이 시작할때 Stop-A를 누르고 "boot cdrom"을 입력했다. YaST2에서 직접 파티션 편집을 선택했다. 512MB 리눅스 스왑 파티션과 16 MB /boot 파티션을 만들고, 나머지는 리눅스 / 파티션에 할당했다.
다음 과정은 실제 리눅스 소프트웨어를 설치하는 일이다. 원하는 패키지를 선택한후 SILO 설정이 나온다. 사용자 SILO 설정을 선택하고 "Install SILO on partition /boot"가 선택되었는지 확인한다. 나는 RPOM의 OpenBoot에서 리눅스와 Solaris 중 어느것으로 부팅할지 선택하기 때문에 MBR(Master Boot Record) 대신 여기에 설치했다. 이에 대한 것은 아래서 더 다룬다. /boot에 SILO를 설치하여 다른 리눅스 커널을 부팅할 수도 있다. 사용자 계정을 만들고 root 사용자의 암호를 입력한다. 그러면 설치기가 총 1624개 패키지를 설치한다. 모든 것이 문제없이 진행되었다.
설치가 끝난다음 YaST에서 나머지를 설정한다. 나는 네트웍에 Sun Happy Meal 10/100base T 카드를 선택했다. 나머지 네트웍 설정은 Intel 시스템에서와 같다. 그런후 첫번째 CD-ROM에 있는 설명서를 참고하여 Ultra 5의 사운드를 설정했다. 나는 다음 두 줄을 /etc/init.d/boot.local에 추가했다.
modprobe audio modprobe cs4231
여기서 유일한 문제는 설명서에 파일이 /etc가 아니라 /sbin으로 쓰여있다는 점이다. 경험있는 리눅스 사용자는 이게 명백한 실수임을 알지만, 초보자는 좀 고생했을 수도 있다. 나는 이를 SuSE에 알렸고, 그들은 즉각 오류를 지적해준 것에 감사했다.
내가 만든 오디오 소프트웨어를 테스트할때 오디오장치 /dev/audio를 open 호출이 멈춰버렸다. 좀 살펴본후 나는 KDE가 장치를 사용하는 오디오 서버를 실행함을 발견했다. 나는 KDE 제어판에서 오디오 서버를 끄고 KDE를 재시작했다. 이제 Ultra 5에서 오디오를 사용할 수 있다.
다음으로 리눅스에서 내용을 보기위해 Solaris 8 디스크 파티션을 마운트했다. Solaris가 사용하는 파티션타입은 ufs라고 한다. 나는 쓰기 기능이 아직 실험적이라는 글을 읽었다. 그래서 다음과 같이 Solaris의 /와 /home 파티션을 리눅스에 (읽기전용으로) 마운트했다. 나는 첫번째 하드디스트의 파티션을 알아보기위해 "fdisk /dev/hda"를 실행했다. 그래서 /dev/hda1가 /, /dev/hda8가 /home임을 알 수 있었다. 먼저 마운트 장소를 만들었다. 나는 다음과 같이 /에 만들기를 좋아한다.
cd / mkdir sun_root mkdir sun_home 다음으로 아래 줄을 /etc/fstab에 추가했다. /dev/hda1 /sun_root ufs defaults,ro,ufstype=sun 1 0 /dev/hda8 /sun_home ufs defaults,ro,ufstype=sun 1 0
그런후 "mount /sun_root"와 "mount /sun_home"로 마운트했다. 이제 리눅스에서 Solaris 파티션을 볼 수 있다.
다음 차례는 Ultra 5에서 두 운영체제간에 부팅이 가능하도록 설정하는 일이다. 대부분 Intel 시스템의 LILO에 익숙할 것이다. Solaris에서 리눅스는 SILO를 사용한다. 나는 SILO를 서로 다른 리눅스 커널을 부팅하는데 사용하고, Solaris와 리눅스간의 부팅은 OpenBoot이라는 Ultra 5의 부팅 PROM을 사용한다. 다음 명령어들은 Ultra 5에 있는 OpenBoot 3.x 버전에 적용된다. Stop-A를 눌러서 OpenBoot 프롬프트로 간다. 프롬프트에서 devalias를 입력하여 정의된 별명을 확인한다. 다음과 같은 디스크 항목을 발견할 수 있다.
disk /pci@1f,0/pci@1,1/ide@3/disk@0,0 disk3 /pci@1f,0/pci@1,1/ide@3/disk@3,0 disk2 /pci@1f,0/pci@1,1/ide@3/disk@2,0 disk1 /pci@1f,0/pci@1,1/ide@3/disk@1,0 disk0 /pci@1f,0/pci@1,1/ide@3/disk@0,0
오른쪽은 장치 항목이다. 직접 별명을 만들 수도 있다. linux와 solaris라는 이름의 별명을 만든다.
linux /pci@1f,0/pci@1,1/ide@3/disk@0,0:d solaris /pci@1f,0/pci@1,1/ide@3/disk@0,0:a
이는 Intel 플래폼의 리눅스에서 /dev/hda라고 부르는 disk0에 대한 장치 항목이다. 장치 항목 오른쪽의 ':문자'는 하드디스크에 있는 파티션을 가리킨다. 첫번째 파티션은 ':a'이고, 네번째는 ':d'이다. 이 항목들을 비휘발성램에 저장하기위해 OpenBoot에서 nvalias 명령어를 사용한다. 이미 지정되있는 별명은 새 별명으로 대체된다.
OpenBoot에서 설정할 수 있는 파라미터가 또 있다.
setenv auto-boot? = false
이는 전원이 들어올때 ok 프롬프트에서 멈치게한다. 그래서 solaris나 리눅스 중 하나를 선택할 수 있다. "boot solaris"나 "boot linux"를 입력하면 된다.
다음은 내가 SPARC에서 리눅스를 사용하면서 발견한 것들이다.
1. 부팅할때 커널에서 "Unimplemented SPARC system call 69/44" 메시지는 무시한다. 44번 시스템콜과 69번 시스템콜은 getuid32()/geteuid32()로 둘다 UltraSPARC에서는 필요없다.
2. 내가 읽은바로는 UltraSPARC 리눅스의 커널은 64비트지만 사용자 공간은 아직도 32비트이다. 무슨 뜻인지는 모르겠지만 프로그램을 64비트로 컴파일 할 수 없다는 말같다.
3. Stop-A 키조합는 SuSE 7.1과 몇몇 배포본에서 사용할 수 없다. SuSE의 경우 YaST2에서 기타(misc) 항목을 보면 다시 가능하게 할 수 있다. 나는 가능하게 한후 Stop-A를 눌렀더니 부팅 프롬프트없이 컴퓨터가 멈췄다. 리눅스를 사용할때는 아마도 그대로 두는 것이 좋겠다.
처음 파티션 문제를 제외하고는 디스크는 잘 동작했다. 그러나
디스크 문제는 실망이다. SuSE는 좋은 SPARC 리눅스 배포본이다.
나는 메일링리스트에서 SuSE 7.3이 작업중이라는 것을 알았다.
나는 또 SPARC 리눅스를 위해 노력한 모든 오픈소스 리눅스 프로그래머들에게도
감사한다. 정말 멋진 일을 했다! 수고에 감사한다. 이제 나는
내 Ultra 5에서 Solaris 8과 SuSE Linux 7.1을 둘다 사용할 수 있다.
64M 램에 270 MHz 프로세서로 빠르지는 않지만, 의도한 소프트웨어
포팅에는 문제없다.
Bruce는 리눅스 해킹을 즐기는 평범한 해커다. 그는
Open Source Audio Library Project를
시작했다. 그는 윈도우즈 3.1에서 프리웨어로 프로그래밍을 시작했다.
그는 메시지를 못받고 운영체제 전체가 멈춰버리는 것을 보고,
더 나은 방법을 찾았다. 답은 리눅스였다.
Bruce Forsberg
Copyright © 2001, Bruce Forsberg.
Copying license http://www.linuxgazette.com/copying.html
Published in Issue 72 of Linux Gazette, November 2001