이성주 linuxlee@hitel.net
|
◆ 리눅스 LILO 에 관하여
1. LILO 실패시의 에러 메시지 LILO 로 부팅할 때, LILO라는 글자가 제대로 표시가 안되면서 장비가 이상이 생기는 경우가 있다. 어떠한 경우에 어떠한 에러 메시지가 나오고 이것에 대한 처리 방법은 무엇인지 알아보자. LILO 의 부팅 부분은 두 부분으로 나누어져 있다. 첫 번째 부분은 부트 섹터이고 두 번째 부분은 /boot/boot.b 이다. LILO를 설치하는 동안 map 파일(보통은 /boot/map)이 만들어진다. 그리고 이것으로 LILO가 시작되어야 할 운영체제의 필요한 지점을 찾는 것이다. LILO가 로딩될 때는 LILO라는 단어가 표시된다. 각각의 단어가 표시되는 것에 따라 현재 수행되는 있는 부분을 파악할 수 있다. 반대로 이야기하면 어느 글자까지 표시되었는가를 보면 대충 어디서 에러가 발생했는지 알 수 있다. 각각의 에러의 경우를 알아보자. * 아무 것도 표시가 안된 경우 이것은 LILO 자체가 로딩되지 않는다는 것이다. LILO 가 설치되지 않았거나 LILO가 설치된 파티션이 활성화되지 않은 경우이다. * L 자만 나온 경우 부트로더의 첫 부분이 로딩되고 실행된 것이다. 하지만 부트로더의 두 번째 부분이 로딩되지 않았다. 이 경우는 보통 장치의 문제이거나 장치의 OS 위치 표시가 잘못된 경우이다. * LI 자만 나온 경우 첫 번째 부트로더가 두 번째 단계의 부트로더를 로딩할 수 있었지만 그것을 실행하는데 실패한 경우다. 이 경우에도 역시 위치 표시의 문제이거나 또는 map 설치 프로그램 통하지 않고 임의로 /boot/boott.b 파일을 옮긴 경우이다. * LIL 자만 나온 경우 두 번째 부트로더가 시작되었지만 map 파일로부터 descriptor 테이블을 로딩하는데 실패한 경우이다. 이 경우도 전형적인 장치의 문제이거나 위치가 잘못된 경우이다. * LIL? 의 경우 두 번째 단계의 부트로더가 잘못된 주소를 로딩한 경우이다. 이것은 위치 표시가 잘못되었거나 역시 map 설치 프로그램을 이용하지 않고 임의대로 /boot/boot.b 파일을 옮긴 경우이다. * LIL- 의 경우 descriptor 테이블이 잘못된 경우이다. 이 경우도 역시 위치 표시가 잘못되거나 /boot/boot.b 가 임의대로 옮겨진 경우가 전형적이다. * LILO 모든 부분이 정상적으로 로딩된 것이다. 대부분의 위치 정보 오류(geometry 가 틀린 경우)의 경우는 물리적인 손상이 되었거나 또는 파티션 테이블의 정보가 잘못되었을 때 발생하지만 이뿐만 아니라 LILO가 설치될 때 에러가 발생한 경우에도 해당된다. 이러한 경우는 보통 1024 실린더 제한(2번 참고)을 무시할 때 발생한다. 위와 같은 에러가 발생했을 때의 해결책을 알아보자. * 먼저 리눅스 부팅과 관련된 정보를 1024
실린더 안쪽으로 설치한다. * LILO를 다시 설치한다.
단지 다음과 같이 LILO 프로그램을 실행시킴으로서 # /sbin/lilo
2. 1024 실린더 제한 대부분의 LILO 로딩 에러는 여기에 원인이 있는 것 같다. 이것에 대해서 자세히 알아보자. 부팅시에 LILO 는 하드 드라이브를 액세스하기 위해서 BIOS 정보를 사용한다. 그래서 접근 가능한 부분이 다음과 같은 부분으로 제한된다. * 실린더 0에서 1023 번까지 * 처음 두 개의 물리적인 하드 드라이브 * 가능하다면 (E)IDE 드라이브 위의 세가지중 두 번째와 세 번째는 요즘의 PC 에서는 그렇게 심각한 문제는 아니다. 왜냐하면 요즘의 BIOS는 네 개의 EIDE 하드 드라이브까지 지원하고 이중 일부는 BIOS/SCSI 호스트 어댑터가 EIDE 디스크가 장비에 기본으로 설치되어 있어도 SCSI 로 부팅할 수 있는 기능을 제공한다. 그러나 이러한 특징은 그렇게 넓게 퍼진 것도 아니며, 표준으로 될 만큼 충분히 일반적이지도 않다. 위의 첫 번째 제한은 피해갈 방법이 쉽지 않다. 해결 방법을 알아보자. LILO 가 사용하는 다음과 같은 데이터는 1024 실린더 안에 있어야만 한다. * LILO 가 설치된 부트 섹터 * /boot 디렉토리에 있는 파일들(/etc/lilo.conf 파일에 지정된 내용에 해당된다.) * LILO 가 부팅을 담당하는 리눅스 커널들 * 필요하다면 LILO 가 부팅을 담당하는 다른 OS의 부트섹터들 이러한 것들은 최소한 2MB 이상이다. /bootdhk 와 리눅스 커널은 보통 리눅스 root 파티션에 위치한다. 그러나 이것은 강제 사항이 아니다. 이론상으로는 위험하지만 다른 OS 시스템의 파티션에도 저장할 수 있다. 그렇다면 이러한 제한에 대해서 어떠한 점을 고려해야 하는가 알아보자. * 대부분의 만족할 만한 해결책은 primary
리눅스 파티션을 완전히 1024 실린더 * 만약 LILO 가 MBR에 설치되어 있거나 또는
첫 번째 하드디스크의 확장 파티션 * 리눅스가 아닌 다른 OS의 파티션에 있는 LILO 관련 파일들 아마도 다른 OS 의 파티션이 1024 실린더 이하의 공간을 차지하고 있다면, 이 하드 드라이브를 다시 파티션하기란 쉽지 않을 것이다. 만약 리눅스 파티션 이외의 다른 파티션이 이 영역을 점유하고 있고 리눅스가 그 파티션의 파일 시스템에 대한 읽기와 쓰기 접근이 허용되어 있다면 LILO 의 관련된 파일들은 그곳에 저장할 수 있다. 이 때 물론 부트 섹터는 제외된다. 그러나 이러한 방법의 신뢰성에는 다소 의문이 있다. LILO 파일들이 그 OS의 보호아래 있어야만 한다. 즉 안전하게 존재해야 한다는 것이다. 또한 만약 이 다른 OS의 파티션이 1023 이상의 시린더에 접근할 수 있다고 한다면 LILO 에 관련된 파일들이 확실히 1024 아래쪽에 위치한다는 보장이 없다는 것이다. 이때 조심해야 할 것은 LILO 부트 섹터를 리눅스 이외의 이 파티션에 설치하면 안된다는 것이다. 이럴 경우에는 그 파일 시스템이 손상될 수 있다. 그래서 LILO 부트 섹터는 첫 번째 디스크(1024 보다 작다면)의 확장 파티션의 시작에 저장하거나 MBR 에 설치할 수 있다. 이러한 경우의 예를 들면 다음과 같다. 예 1: 일단 적당한 도스 파티션이 /dos 로 마운트 된다고 가정하자. LILO 는 MBR(즉, /dev/hda)에 설치되어야 한다. 이것은 또한 /dev/hda1으로 부팅 되도록 해야할 것이다. 이렇게 하려면 순서는 다음과 같다. ① MS-DOS 와 리눅스를 위한 부트 디스크를
만들고 동작이 잘되나 확인한다. ② 새로운 디렉토리(예를 들면, /dos/LINUX)를
만들고 /boot로부터 LILO 에 관련된 ③ 그런 다음 /dos/LINUX/lilo.conf 파일을 만든다. 내용은 다음과 같다. boot=/dev/hda ④ 이 lilo.conf 로 LILO를 설치한다. # /sbin/lilo -C /dos/LINUX/lilo.conf 이렇게 하면 LILO가 잘 작동할 것이다. DOS로 부팅하고 가능한 한 LILO 와 관련된 파일들을 쓰기 금지해 놓는다. 그리고 관련 디렉토리도 시스템과 히든 속성을 적용해 놓는다.
예 2 : 만약 다른 사용되는 MBR 이 존재하고 그 MBR 대신에 LILO가 첫 번째 하드 드라이브의 확장 파티션에 설치되어야 한다면 단지 예1번의 boot= 라인만 변경하면 된다. 다음과 같이 한다. boot=/dev/ext_partition 이때 디스크 1 의 확장 파티션을 LILO 설치 후에 리눅스를 이용하여 부팅 가능하게 하고 다른 primary 파티션에서는 active 표시를 제거해야 한다.
3. LILO의 "linear" 옵션 LILO가 하드 드라이브로부터 부팅할 때 부트 커널을 발견할 수 없어서 LI라는 글자만 화면에 보이고 멈췄다면 이것은 보통 1024 실린더 제한에 의한 경우가 많다. 또한 혹시 linear 옵션을 가지고 LILO가 설치된 경우라면 이것이 문제일 수도 있다. 이러한 경우에 1024 실린더 문제라면 위의 해결책을 이용하고 만약 LILO의 설치시 옵션 문제라면 /etc/lilo.conf 파일에서 linear 옵션을 제거한다. 그런 후 다시 /sbin/lilo 을 실행시킨다. 그럼 linear 옵션을 지정한 경우에 어떠한 점이 문제가 될 수 있는지 알아보자. /boot/boot.b, /boot/map, kernel 등 등에서 하드 드라이브의 섹터에 대한 포인터는 LILO 부트 섹터와 물리(실린더-헤드 -섹터)주소 대신에 논리 섹터 주소를 가지고 있는 /boot/map 파일 안에 저장되어 있다. 부팅시에 LILO 부트 섹터는 BIOS 함수를 호출함으로써 하드 드라이브의 구조를 결정한다. 그래서 논리 섹터 주소를 물리주소로 매핑 한다. 그런 다음 실제 드라이브에 대한 접근은 물리 섹터 주소로 이루어진다. linear 옵션은 리눅스가 실행될 때 다른 위치 정보를 가지는 특별한 하드 드라이브를 BIOS 가 볼 때 도움을 준다. 논리 섹터 주소는 하드 드라이브의 위치 정보와는 독립적으로 정확히 유지할 수 있다. 이것은 드문 경우이고 linear 옵션은 대부분의 경우는 필요없다. 그리고 linear 옵션은 1024 실린더 제한 외에 다른 제한이 있다. 이것은 특별히 요즘의 대용량 하드 드라이브에서 유효한 것이다. 즉 linear 는 오직 다음과 같은 상황에서 동작한다. 512MB 아래에서 16 섹터/트랙 64 헤드 수보다 더 많은 것을 가지는 경우에는 1024 개의 실린더 제한보다 더 제한적이다. 왜냐하면 요즘의 보통 128 이거나 또는 255 헤드를 가지기 때문이다. 이러한 제한이 생기는 이유는 부트시 물리 주소로의 변환을 하는 중간에 나오는 값이 있는데, 이것이 특정 섹터의 트랙이다. 이 값은 16 비트 연산이다. 그래서 트랙은 65535를 넘을 수 없다.
4. LILO로 부트시의 생기는 문제들 LILO 로 부팅할 때 커널이 로드된 후에 문제가 나타날 수 있다. 자신이 로드할 커널을 선택할 수 있다. 그러나 이 커널이 시작되지 않을 수 있다. 이것은 화면에 리눅스 커널의 압축이 풀린다는 메시지가 나오기 전에 여러 가지 다른 요인으로 시스템이 충돌된다는 것을 뜻한다. 가능한 에러 메시지와 현상은 다음과 같다. * 시스템이 재부팅 되는 경우 * 시스템이 멈추는 경우 * crc-error 가 나오는 경우 * no free space 가 나오는 경우 * Error 0X00 이 나오는 경우 * Error 0X01 이 나오는 경우 * incomplete literal tree 가 나오는 경우 어떤 때는 플로피가 액세스 된 뒤에도 시스템이 멈추게 된다. 이러한 현상의 원인은 보통 커널의 크기가 매우 크다든지, 또는 LILO에 문제가 있든지 또는 문제 있는 하드웨어를 사용하는 경우이다. 문제가 있는 하드웨어라면 장비의 BIOS가 빠른 메모리 액세스를 할 경우에 문제를 발생시키기도 한다. 그러나 다음의 경우에는 문제가 발생하지 않는다. * Loadlin을 사용해서 부팅을 하는 경우 * 커널이 플로피로 dd if=/vmlinuz of=/dev/fdo
하여 복사되고 * make zlmage을 이용하여 만들어진 크기가 작은 커널이 LILO에 의해서 부트되는 경우 장비 자체에서 BIOS 설정을 바꿈으로써 에러가 나오는 것을 막을 수도 있다. 대표적인 설정 몇 가지는 다음과 같다. 일단 시스템에 리눅스의 설치가 가능해야 한다. 만약 Loadlin을 통하여 부팅할 수 없다면 부팅 디스크를 이용해야 한다. 만약 이렇게 해도 안 된다면 BIOS 의 값을 변경해 본다. 어쨌든 설치가 된 후에 문제가 발생한다면 어떻게 시스템을 부트할 수 있는가 한가지씩 해본다. 먼저 설치될 때와 같은 장치를 통해서 부트를 시도해 본다. 즉 부팅 디스크로 설치를 했다면 부팅 디스크를 이용해서 부팅을 시도해 보는 것이다. DOS 파티션에서 Loadlin을 사용하는데 문제가 없다면 부팅 디스크도 이용해 보는데 만약 여기에서 문제가 없다면 부팅 디스크도 이용해 보는데 만약 여기에서 문제가 발생한다면 부팅 디스크의 파라미터를 다음과 같이 해본다. load_ramdisk=0 root=/dev/root_partition 이렇게 하고 나서 문제가 해결되면 새로운 커널이 수행되어야 한다. 만약 계속적으로 문제가 발생한다면 메인보드나 BIOS에 대한 조절을 고려해보고 자신의 하드웨어에 대한 총체적인 점검을 해보는 것도 좋을 것이다.
◆ 부트나 루트디스켓 만들기 1. 관련된 사항 리눅스를 설치하다보면 디스켓 한 두 장으로 설치가 진행되는 것을 볼 수 있을 것이다. 이 디스켓으로 작업하는 것은 많은 프로그램을 사용하지는 않지만 정말 필요한 몇 가지를 담아서 사용하는데는 지장이 없다. 그리고 이러한 것으로 거의 대부분의 시스템에 관련된 작업을 할 수 있다. 그래서 어떻게 부트와 루트 디스크를 만드는지 알아보자. 다음에 만드는 것은 리눅스의 플로피 디스크 버전이라고 할 수 있다. 순서는 다음과 같다. ① 사용하고자 하는 기본 커널을 컴파일해서 만든다. ② 디스크에 파일 시스템을 만들고 ③ 필요한 것을 플롳피로 복사하는 것이다.
2. 커널 컴파일 디스크는 1.44MB 정도의 데이터밖에 저장을 할 수 없으므로 지금 사용하고 있는 커널을 바로 플로피로 복사할 수 없다. 그래서 커널을 컴파일 해서 새로 만들어야 한다. 이 때에 사용할 기능을 설정해야 하는데, 자신이 어떠한 것이 필요한가를 잘 생각해서 커널에 포함시켜야 한다. 여기서는 ext2 파티션 지원과 플로피 디스크 지원과 PPP 지원을 포함하기로 한다. make dep ; make clean ; make zImage 명령을 실행시켜 커널 이미지를 만들어야 한다. 여기에서 make zImage 가 매우 중요하다. 이것은 마지막 과정에서 만들어진 커널을 압축해 준다. 이렇게 하면 /usr/src/linux/rach/i386/boot에 zImage 라는 이름으로 커널이 만들어져 있을 것이다.
3. 파일 시스템의 작성 커널을 만들고 바로 필요한 파일을 플로피로 복사하는 것이 아니다. 여기에서 디스크에 파일 시스템을 작성해야 한다. 그리고 필요한 프로그램을 모두 압축해야 한다. 이 과정이 좀 복잡하다. 다음과 같은 순서를 따른다. 먼저 다음 명령을 입력한다. dd if=/dev/zero of=DEVICE bs=1k count=3000 DEVICE 는 압축을 하지 않은 파일 시스템이 위치할 하드 디스크상의 적당한 장소를 지정한다. 다음으로 다음 명령을 입력한다. 여기에서 DEVICE는 역시 압축하지 않은 파일 시스텝이 위치할 장소이다. mke2fs -m 0 DEVICE 만약 이 명령에서 뭔가 질문을 해오면 무조건 yes라고 하면 된다. 이런 다음 새로 작성된 파일 시스템을 마운트 해야 한다. 새로운 파일 시스템은 정규 파일안에 있기 때문에 커널에서 loopback 장치에 대한 지원이 있어야 한다. 즉 현재 자신이 사용하는 커널에 이 기능이 포함되어 있어야 한다는 것이다. 만약 포함되어 있지 않다면 다시 설정을 하고 컴파일 해주면 된다. 설정하는 것은 다음과 같은 질문을 yes 또는 module 로 해주면 된다. Loopback device support (CONFIG_BLK_DEV_LOOP) [M/n/y/?] 중요한 것은 이 커널을 플로피에 넣을 커널이 아니고 자신이 현재 사용하고 있는 커널을 말하는 것이다. 자신의 커널에 loopback 장치에 대한 설정을 가지고 있다면 다음과 같이 명령을 입력한다. mount -t ext2 DEVICE /mnt 만약 loopback 장치를 모듈로 설정한 경우에는 modprobe loop 명령을 입력하여 모듈을 로딩해준다. 만약 이 명령에서 뭔가 경고나 도는 에러가 발생한다면 다음과 같이 입력해본다. mount -o loop -t ext2 DEVICE /mnt 이렇게 한 후에 새로 만들어진 파일 시스템에 필요한 파일들을 복사한다. 먼저 /mnt 로 옮겨간 후에 다음 디렉토리들을 만든다. /dev 다음으로 /dev 아래의 파일들을 복사한다. cp -dpR /dev /mnt/dev 만약 inode가 부족하다면 /mnt/dev에서 자신에게 필요없는 장치 파일들을 지운다. /dev 에 필요한 파일들의 복사가 끝났다면 이번에는 /etc 디렉토리의 것을 복사한다. cp -dpR /etc /mnt/dev 그 다음은 /lib 이다. cp -dpR /lib /mnt/dev 다음은 /bin 디렉토리인데 이곳의 파일들은 정말 필요한 것만 복사한다. 이로서 플로피에 필요한 모든 것이 복사되었다. 이제 플로피로 이것들을 복사해야 한다. 이것을 하기 위해서 먼저 다음과 같이 입력하여 파일 시스템을 압축해야만 한다. cd / 여기에서 커널의 크기를 점검하는 것이 중요하다. /usr/src/linux/arch/i386/boot 디렉토리로 이동하여 크기를 확인한다. 그런 다음 커널의 크기를 1024로 나누어야 한다. 예를 들면 만약 커널의 크기가 250000 바이트라면 그것은 245KB 이다. 여기에서 이 값을 ROOTBEGIN 이라고 사용한다. 지금 커널을 다음 명령을 사용하여 플로피로 복사한다. dd if=zImage of=/dev/fd0 다음은 커널이 플로피에서의 루트 파일 시스템을 발견할 수 있도록 아려주어야 한다. rdev /dev/fd0 /dev/fd0 여기서 잠깐 16진수 계산을 해야 한다. ROOTBEGIN 의 16 진수 값(F5)에 4000을 더한다. 그 답을 10 진수 형태로 바꿔서 다음 명령을 입력한다. 다음의 숫자 대신 자신에게 해당되는 값을 입력한다. rdev -r /dev/fd0 16629 ((F5+4000)hex) 마지막으로 다음 명령을 입력하여 플로피에 파일 시스템을 복사한다. dd if=rootfs.gz of=/dev/fd0 ds=1k seek=ROOTBEGIN 이렇게 하면 끝이다. 두 번째 플로피는 더 쉽다. 플로피에 원하는 파일들을 복사하기만 하면 된다. 그러나 두 번째 디스크에 파일들을 사용하기 원한다면 디스크로 부팅 뒤에 마운트를 시켜주어야 한다. mount /dev/fd0 /usr 이것에 대한 참고 할 만한 자료는 Bootdisk-HOWTO를 보면 될 것이다. |