![]() Ken Yap 글쓴이 소개: 호주의 시드니에 살고 있다. 1979년에 처음 유닉스를 접하게 되었고, 4년간 리눅스를 사용하여 워드작업과 인터넷 접속등을 하고 있으며, 전자공학에 관련된 취미를 가지고 있다. 리눅스를 접하거나 일할때를 제외한 시간에는 여행을 하거나 재미있는 사람들을 만나거나 새로운 요리를 만들어 본다거나 산책을 하며 주위를 둘러보는 것이다. 그는 다국적기업의 연구직으로 일하고 있다. 글쓴이에게 연락하기 |
네트웍 부팅과 이더부팅의 소개![]() 요약: 이글을 통해서 여러분의 로컬 하드디스크에 연결하지 않고 어떻게 하면 비휘발성 메모리에 저장된 프로그램으로부터 부트스트랩을 잡는가에 대한 발전된 내용을 담고 있다. 리눅스 머신에서 저장공간을 유지하거나 설정하는 이상적인 방법을 제시한다. 네트웍 부팅(Network booting)이란 무엇인가?네트웍 부팅은 오래 전의 아이디어다. 컴퓨터에는 롬(ROM)칩과 같이 서버에 접속하거나 네트워크 연결을 통하여 시스템 파일을 얻을 수 있도록 하는 몇 개의 비휘발성 메모리에 포함된 부트스트랩 코드를 가지고 있는데 이것이 핵심적인 아이디어다. 이렇게 하는 이유에는 여러 가지가 있는데 먼저 첫 번째로는 부팅시 하드디스크의 사용을 피하는 것이다. 이렇게 함으로써 많은 기계에서 소프트웨어 유지비용을 줄이는 것이 된다. 네트웍 부팅에 의해서 파일들은 중앙 서버에 수용되며 그 위치에서만 갱신하면 된다. 또 다른 이유는 하드디스크가 안정되지 못한 위치에서 컴퓨터를 사용할 수 있도록 하기 위해서다. 예를 들면 공장 작업장에서도 사용할 수 있으나 하드디스크는 고장나기 쉽다. 마지막 이유는 소프트웨어를 다시 읽지 않고도 이종의 운영체제 사이를 전환할 수 있도록 하는 것이다. 네트웍 부팅은 종종 디스크 부팅과 공존한다. 예를 들자면 시스템이 디스켓에 의해 윈도우즈를 실행할 수도 있으며 때때로 네트웍에 의해 리눅스로도 실행할 수 있다. 이러한 기법을 이용한 몇 가지 사례가 있다. 내 친구중의 하나는 이러한 기술을 이용하여 네트웍을 통해 윈도우즈를 다시 로드한다. 윈도우즈를 설치한 후 자주 발생되는 시스템이 손상되었을 경우, 시스템 관리자는 네트웍을 통한 리눅스 부팅과 자동 스크립트가 하드디스크를 포맷하고 거기에 정상적인 윈도우즈 인스톨을 복사한 다음 새로운 인스톨을 수행하게 된다. 작동원리네트웍을 통하여 부팅을 하려면, 컴퓨터는 1.고유 아이디(Identity), 2, 운영체제 이미지(an operating image), 3.작업 파일시스템이 있어야 한다. 네트웍 부트 롬을 가지고 있는 디스크가 없는 컴퓨터(Diskless system;DC)를 고려해 보자. 이것이 여러 개의 고유한 DC를 가질 수도 있을 것이다. 그럼 어떻게 다른 DC들을 구별할 것인가? 컴퓨터(주로 컴퓨터의 네트웍 어댑터)의 고유함을 나타내는 정보로는 이서넷 주소(Ethernet Address)가 있다. 세상의 모든 이서넷 어댑터는 각각의 하드웨어 제작자들에 할당된 몇 개의 블록으로 구성된 그들 고유의 48비트 이서넷 어드레스를 가지고 있다. 이 주소는 협의에 의해 16진수 디지털로 되어 있으며, 콜론에 의해 두 개로 구성된 각각의 블록에 의해 분리된다. 예를 들면 00:60:08:C7:A3:D8이다. 이더넷 어드레스로부터 주어진 IP주소를 얻는 데 사용되는 프로토콜은 부트프로토콜(Boot Protocol;BOOTP) 또는 동적호스트설정프로토콜(Dynamic Host Configuration Protocol;DHCP)이라고 부른다. DHCP는 BOOTP의 발전의 산물이다. 우리가 토론한 바에 의하면 물론 BOOTP에 적용된 것들은 역시 DHCP에도 적용되었다 (사실 BOOTP와 DHCP가 이서넷 어드레스만에 의해 번역된다는 것은 다소 거짓이다. 앞에서 살펴본 바에는 설계자가 BOOTP와 DHCP가 모든 하드웨어 어드레스에 잘 동작하기 위해 대비한 것으로 보인다. 하지만 대부분의 사람들이 사용하는 것은 이서넷이다.) BOOTP 교환은 다음과 같이 실행된다.: DC: 여보세요! 나의 하드웨어 어드레스는 00:60:08:C7:A3:D8인데요. 제 IP주소를 주실래요. BOOTP 서버: (데이타베이스에서 어드레스를 찾는다.) 당신의 이름은 aldebaran이예요. 당신의 IP 어드레스는 192.168.1.1입니다. 당신의 서버는 192.168.1.1이예요. 당신이 부팅하기 위해 필요한 파일은 /tftpboot/vmlinux.nb입니다. (그리고 몇 가지 다른 정보들과 함께 보낸다.) DC가 어떻게 처음의 BOOTP 서버로부터 어드레스를 찾는지 궁금할 것이다. 그렇게 하지 않는다가 정답이다. BOOTP에 의해 요청되면 로칼 네트워크에 브로드캐스트(broadcast;연결된 모든 머신에 요청을 그대로 전송)를 하게 되어 그 요청에 답할 수 있는 모든 BOOTP 서버로부터 어드레스를 받을 수 있다. IP주소를 받고 난 후, DC는 운영체제의 이미지를 받게 되고 실행하게 된다. 여기에 사용된 다른 인터넷 프로토콜은 Trivial File Transfer Protocol(TFTP)라고 불린다. TFTP는 FTP의 축소판으로 보인다. 그러나 출처가 분명하지 않다. 그러나 Transmission Control Protocol(TCP) 대신에 사용되는 UDP(User Datagram Protocol)의 상위에서 동작한다. UDP는 그 간단함 때문에 TCP대신에 사용된다. DC에서 UDP를 수행하는 것은 작게 만들 수 있어서 코드가 ROM에 기록하기에 적당하다. UDP가 스트림 기반이 아니라 블럭 기반 프로토콜이므로 전송은 다음과 같이 블럭 단위로 수행된다.: DC: /tftpboot/vmlinux.nb의 블럭 1을 주세요. 이런 식으로 모든 파일이 다 수행되기까지 계속된다. 핸드쉐이킹(Handshaking)은 각 블럭의 스키마(Scheme)의 간단한 전송확인이며, 패킷 손실은 타임아웃되기 전에 재전송에 의해 통제된다. 모든 블럭을 다 받은 후, 네트웍 부팅 ROM은 제어권을 엔트리포인트(entry point)에 있는 운영체제로 넘기게 된다. 마지막으로 운영체제를 실행하기 위해 루트 파일시스템이 제공되어야 한다. 다른 선택이 가능하다 하더라도 리눅스와 다른 유닉스에서 사용되는 프로토콜은 주로 네트웍 파일 시스템(Network File System)을 사용한다. 이 경우에는 코드가 ROM의 내부에 상주해야 할 필요는 없으며 방금 다운받은 운영체제의 부분이 될 수 있다. 그러나 운영체제는 실제 디스크가 아닌 NFS의 루트 파일시스템에 의해 실행이 가능해야 한다. 리눅스는 그와 같이 수행할 수 있는 버전의 운영체제를 구축할 수 있는 요구 설정변수를 가지고 있다. 실제 네트부팅(Netbooting)상용 부트ROM 뿐만 아니라, 무료 패키지로 사용되는 네트웍 부팅에는 두가지가 있다. 이서부팅(Etherboot)과 넷부팅(Netboot)이다. 둘 다 Etherboot 홈페이지를 통해 찾아 볼 수 있다. 먼저 여러분은 네크워크 카드를 이서부트(Etherboot)나 넷부트(Netboot)가 지원하는지 확인하여야 한다. 결국은 누가 EPROM(Erasable Programmable Read Only Memory)에 코드를 넣었나 하는 것을 알아야 하지만, 처음에는 플로피로부터 네트웍 부팅을 수행한다. 부트 플로피를 만들기 위한 특별한 부트 블럭이 배포시에 제공된다. 이 작은 512바이트의 프로그램은 플로피에 그 다음에 위치한 디스크 블럭을 메모리로 읽어들이면서 실행을 시작한다. 그러므로 부트 플로피를 수행하기 위해서는 부트 블럭과 다음과 같은 네트워크 카드용 드라이버가 포함된 이서부트(Etherboot)바이너리와 연결하기만 하면 된다.: cat floppyload.bin 3c509.lzrom > /dev/fd0 네트워크 부트 플로피안에 옮겨 넣기 전에 리눅스에 BOOTP(or DHCP), TFTP와 NFS의 세가지 서비스를 셋업하여야 하는데, 동시에 설정되어야 할 필요는 없고 하나하나 실행할 수 있다. 다음 단계로 들어가기 전에 각각의 단계가 잘 동작하는지 확인한다. 소스코드로부터 컴파일하거나 배포시에 제공된 bootpd 서버를 인스톨했다고 가정하자. 그러면 이 서버가 bootp 요청을 기다리고 있는 중이라는 것을 알 것이다. 이 때 두가지 경우가 있다. 하나는 컴퓨터가 시동될 때 항상 듣고 있는(listening) 네트웍 서비스로 bootpd를 시작하는 것이다. 또 다른 하나는 inetd로부터 시작되는 것이다. 후자의 경우 /etc/inetd.conf에 다음과 같은 행이 포함시켜야 한다.: bootps dgram udp wait root /usr/sbin/tcpd bootpd 만약 /etc/inetd.conf를 수정했다고 가정하면, 프로세스에 HUP신호를 보냄으로서 시스템을 재시작할 필요성이 있게 된다. 다음에 이서넷(Ethernet)주소를 IP주소로 맵핑하는 데이터베이스에 bootp를 전해준다. 이 데이터베이스는 /etc/bootptab.에 있으며 다음과 같은 형식의 행을 포함하고 있다.: aldebaran.foo.com:ha=006008C7A3D8:ip=192.168.1.100:bf=/tftpboot/vmlinuz.nb다른 정보들은 나타낼 수도 있겠지만 간단하게 시작하도록 하겠다.. 자, 그럼 플로피에 의해 DC를 부팅해 보자. 그러면 DC는 그 자신의 이더넷 카드를 찾아서 BOOTP 요청을 동시에 각각의 머신에 보낸(broadcast)다. 잘 동작된다면 서버는 DC에 요청한 정보들에 대해 응답을 한다. 만약 /tftpboot/vmlinux.nb가 존재하지 않는다면 파일의 읽기시도시에 실패하게 된다. 이제 특정 커널을 컴파일하여야 하므로, 루트 파일시스템을 켜져 있는 NFS로부터 마운트하기 위한 옵션을 가진다. 또한 원래 BOOTP 응답으로부터 커널의 IP 어드레스를 얻을 수 있는 옵션을 가능(enable)으로 설정한다. 또한 모듈에 의한 커널로의 로드 대신 네트웍 어댑터에 맞는 리눅스 드라이버를 컴파일하는 과정이 필요하다. 이 과정은 초기 램디스크(initial ramdisk)를 다운받으면 되는데 모듈을 로딩하는 것은 가능하긴 하지만 그 이후에도 할 수 있다. 직접적으로 커널을 컴파일하는 것의 결과로 zImage를 설치할 수는 없다. 이것은 tagged image로 나타난다. 이것은 메모리 안의 어디로 바이트(bytes)가 들어가고 있고 어떤 어드레스에서 그 프로그램이 시작되는가를 네트웍 부트로더(network bootloader)에 전해주는 특별한 헤더를 가지고 있는 보통의 커널 이미지이다. 이러한 tagged image를 만들기 위해 mknbi-linux라고 불리는 프로그램이 사용된다. 이 유틸리티는 Etherboot의 배포시에 찾을 수 있다. 이 이미지를 발생시킨 후에 /etc/bootptab라는 이름으로 명명한 후 /tftpboot 디렉토리에 둔다. tftp server는 특별한 우선순위가 없기 때문에, 이 파일이 모두에게 읽기 가능하도록 만들어 졌는지를 확인한다. TFTP에는 소스로부터 컴파일되거나 배포시 제공되는 tftpd를 설치하였다고 가정한다. tftpd는 /etc/inetd.conf안에 다음과 같은 행에 의해서 inetd가 정상적으로 시동된다. tftp dgram udp wait root /usr/sbin/tcpd in.tftpd -s /tftpboot 다시 HUP 시그날에 의해 inetd를 다시 시작하게 되면 부트를 재시도하게 되며, 이번에는 커널 이미지를 다운로드하게 되며 이것에 의해 시동하게 된다. 루트 파일시스템을 마운트하려고 하는 시점까지 부트는 계속된다는 것을 알 수 있다. 이 시점에는 계속 진행하기 위해서 NFS 파티션을 설정(configure)하거나 추출(export)하여야 한다. 많은 이유에서 DC의 루트 파일시스템을 서버의 루트 파일시스템으로부터 사용하는 것은 별로 좋은 생각이 아니다. 그 중 하나는 간단하게 말하자면 다양한 설정파일이 있어서 DC가 그러한 방식으로 잘못된 정보들을 받을 수 있다. 또한 보안문제다. 그 서버의 루트에 쓰기 권한(그리고 쓰기 권한은 여러 가지 이유로 루트 파일시스템에서는 필요하다.)을 허용하는 것은 대단히 위험한 일이다. 그러나 다행으로 DC의 루트 파일시스템은 그리 크지 않으며, 대략 고작 30MB정도이며 이중의 많은 부분이 몇몇 DC들 사이에 공유된다. 이상적인 루트 파일시스템을 구축하기 위해서는 반드시 사용되는 운영체제 배포본에 어떠한 파일들이 보여야 하는지를 알아야 한다. 부팅시에 가장 중요한 것은 디바이스 파일이며 이 파일들은 /sbin과 /etc안에 있다. DC의 몇몇 파일들을 변경하거나 루트 파일시스템에 있는 파일을 복사하는 것과 같은 많은 어려운 과정을 건너뛸 수 있다. Etherboot 배포본에는 튜토리얼과 그러한 DC 루트 파일시스템을 현재의 서버 루트 파일시스템으로부터 생성하는 몇 개의 쉘 스크립트(shell script)등의 링크들이 있다. 또한 Etherboot 문서안에는 종종 셋업시에 가장 잘 속기 쉬운 에러대책용 팁들이 있다. DC에 사용되는 커스터마이즈된 리눅스 커널에서는 /tftpboot/ <IP address of the DC>에서 루트 파일시스템을 볼 수 있다. 예를 들어 위의 경우에서는 /tftpboot/192.168.1.100이다. 원한다면 이것을 커널을 설정할 때 바꿀수도 있을 것이다. 그럼 서버에 /etc/exports를 생성하거나 편집해 보고 다음과 같은 형식의 행을 넣어보자.: /tftpboot/192.168.1.100 aldebaran.foo.com(rw,no_root_squash) rw access는 다양한 시스템 서비스에 필요하다. no_root_squash 속성은 NFS시스템이 루트의 ID를 다른 ID로 맵핑하는 것을 방지한다. 만약 이 과정이 구체화되지 않으면, 많은 데몬들과 로거(logger)들을 혼동하게 될 것이다. NFS 서비스(rpc.portmap과 rpc.mountd)를 시동하거나 재시동하고 디스크가 없는 부팅을 해보자. 만약에 성공했다면, 커널은 루트 파일시스템을 마운트할 수 있을 것이고, 로그인 프롬프트가 나올 때까지 부팅이 이루어질 것이다. 있음직한 결과로는 미설정된 몇 가지들을 볼수 있을 것이다. 대부분의 리눅스 배포본들은 디스크로된 체제를 목표로 하고 있으며 디스크없는 부팅을 적절하게 하려면 약간의 수정이 요구된다. 가장 보편적인 실패원인은 부팅 프로세스중의 /usr 디렉토리안의 파일들에 대한 의존에 의한 것이며, 이것은 부트 프로세스중의 서버로부터 정상적으로 import된 것들이다. 두가지의 가능한 해결책이 있는데 1. 루트 파일시스템 안에 /usr 디렉토리를 소수의 파일들로 구성되도록 한다. 그럼으로서 /usr이 import된 후 오버레이(overlay)될 것이다. 그리고 2. 루트 파일시스템안의 파일을 찾기 위한 경로를 변경한다. 편집할 파일들은 /tftpboot/192.168.1.100에 있다. (이것은 DC의 루트 디렉토리라는 것을 기억하기 바란다.) 서버로부터 다른 디렉토리들 예로 /usr( read-only로 export할 수 있다)을 마운트할 수도 있을 것이다. 아무 문제없이 네트웍상에서 부팅할 수 있다는 것이 만족스럽다고 생각될 때, EPROM에 코드를 수록하려고 할 것이다. EPROM 프로그래머는 100달러 정도로 가능하며, 아주 가끔 사용하는 취미가(hobbyist)들에게는 효과적인 비용의 투자는 아니다. 때때로 저렴한 가격에 중고시장에 나타나고 있지만 가장 중요한 단서는 그것을 구동하는 소프트웨어가 적합하냐 하는데 있다. 전자공학에 숙달된 취미가라면 인터넷에 올라와 있는 무료배포된 설계중의 하나를 사용해 직접 만들어 볼 수 있을 것이지만 독자들 중의 거의 대부분에 있어서 가장 적합한 해결책은 그 과정을 접해본 사람을 아는 것이다. 아마 그러한 사람들은 전자공학을 취미로 하는 모임이라든지 전자회사에 다니는 사람중에 있을 것이다. EPROM 기술에 관해 몇 가지의 사항이 있다. EPROM의 비트들은 0 비트가 입력될 때, 승압된 전자들을 field-effector 트랜지스터의 floating gate로 분사하는 방식에 의해 프로그램된다. 전자는 0을 읽음으로써 그 위치에 갇힌다. EPROM의 정보들을 지우려면, 수정의 전차창을 통해 발생된 자외선 입자를 칩에 비춤으로서, 갇힌 전자들은 플로팅 gate로부터 빠져나갈수 있는 충분한 에너지를 가지게 된다. 햇빛이나 희미한 빛으로부터 일정기간동안 자료의 소실을 방지하기 위해 이 수정 전자창은 일반적인 상태에서 불투광성의 라벨을 붙인다. EEPROM(Electrically Erasable PROM)이라고 불리는 다른 기법도 있는데, 종종 Flash PROM이라고도 불린다. 여기서 비트들은 전자적인 신호들에 의해 제거된다. 이러한 이유로 EPROM이 재사용될 경우 자외선 eraser를 필요로 하지 않지만, 제거작업을 수행할 부가적인 회로들을 필요로 한다. 만약 전자공학을 잘 아는 사람이라면, Etherboot의 배포본에 있는 EEPROM 보드용의 구동 소프트웨어와 회로도를 제공받았을 것이다. 보드는 PC의 빈 ISA 버스 슬롯에 꼽고 네트웍 카드도 역시 다른 빈 슬롯을 이용하여 부팅을 한다. 네트웍 부팅의 활용X 터미널은 네트웍 부팅의 대표적인 사용예다. 터미널 내부에 디스크 공간이 작기 때문에 더 조용하고 더 쾌적한 작업환경을 만들 수 있다. 머신은 16MB의 메모리 혹은 그 이상이며, 비디오 카드 또한 좋을수록 좋다. 이상적이라고 생각되는 하드웨어 사양은 최고급 486기종이거나 초기 펜티엄 기종으로 보인다. 어떤 사람들은 네트웍 부팅을 복수단말기(하나의 단말 제어장치과 그에 연결된 다른 단말기)들에 사용하기도 한다.DC의 사용이 아주 미미하거나 디스크를 신뢰할 수 없을 때, 예를 들면 교실에서 사용되는 단말기의 경우에 해당된다. 더 많은 정보를 알고싶으시면 :여러분이 들러야 할 처음 목적지는 Etherboot 홈페이지가 될 것이다.:http://www.slug.org.au/etherboot/ 이 곳에는 많은 문제들과 해결방안이 논의되어 있는 구독할 수 있는 메일링 리스트들을 포함한 다양한 링크들을 볼 수 있을 것이다. 즐거운 넷부팅이 되세요!
1차번역:정영대
|
본 웹싸이트는 Miguel Angel Sepulveda님이 관리합니다. © Ken Yap 1998 LinuxFocus 1998 |