RedHat Linux >> System Administration for Redhat Linux
|
[목차] |
제3장 시스템 관리 기초
4. 부팅/긴급 복구 문제 리눅스 박스를 책임지는 관리자로서 가장 큰 시련 중 하나는 아예 시스템이 부팅도 되지 않을 때이다. 뭔가 일이 꼬여서 하드 디스크에 있는 리눅스로 부팅도 되지 않을 때는 도대체 어떻게 해야 하는가?
가. 리눅스 부팅 이해하기
부팅은 운영체제의 범위를 벗어나느 문제이다. 일단 하드웨어적인 제한 사항에 의해 부팅이 불가능한 경우 리눅스로서도 어쩔 수 없는 사태가 있다.
부팅 과정은 bios라는 지워지지 않는 rom에 들어 있는 컴퓨터의 필수 소프트웨어가 부팅 가능한 매체의 첫 부분을 읽어들여 메모리 특정 위치에 올려주는 것으로부터 시작한다. bios 설정으로 들어가 변경하지 않았다면 일반적으로 첫 번째 부팅 장치인 플로피 디스크에 매체가 들어 있는지 확인하고, 그렇지 않으면 ide 또는 scsi 하드 디스크 첫 번째 디스크의 mbr이라고 하는 부분을 읽어들인다.
mbr에는 특수한 어셈블리 프로그램이 들어 있는데, 기본 프로그램의 동작은 매우 간단하다. 파티션 테이블을 읽어들이고, 주 파티션 중 부트 플래그(boot flag)가 붙어 있는 파티션의 첫 번째 섹터를 읽어 들인다. 바로 파티션의 첫 번째 부트 섹터에 운영체제의 커널을 메모리에 올려놓고 본격적인 부팅이 시작되게 하는 프로그램이 들어 있다.
리눅스에서는 인텔/리눅스의 경우 lilo(linux loader)라는 특별한 프로그램을 사용한다. 알파/리눅스와 스팍/리눅스는 하드웨어 아키텍처 자체가 다르므로 부팅 메커니즘이 완전히 다르다. 각각 milo와 silo라는 특별한 부트로더를 사용한다. milo와 silo는 인텔 아키텍처에서와 같은 제한 사항이 없으므로 크게 문제를 일으키지 않는다. 하지만, lilo는 제한 많은 ibm 호환 아키텍처의 모든 제한 상항을 끌어안아야 하므로 골치 아픈 문제를 가져오는 경우가 많다.
시스템에 리눅스만 있는 경우에는 lilo를 mbr에 설치해도 되고, 루트 파티션에 설치해도 된다. 일반적으로 mbr 에 넣어서 시스템 부팅에 대한 전체 권한을 가지게 하는 것이 편리하다. 루트 파티션에 설치하는 경우에는 fdisk 프로그램에서 부트 플래그를 주어 부팅할 수 있다. 윈도우 95/98/nt와 같은 다른 운영체제와 같이 사용하는 경우에는 lolo를 mbr 에 설치하여 멀티부팅이 가능하도록 해두는 것이 편하다. ibm os/2의 부트 로더 또는 상용 부트 프로그램을 사용하는 경우에는 그것을 사용해도 괜찮다. 아무튼 누가 mbr을 차지하는가에 따라 부팅에 관한 통제권이 결정된다.
제일 빈번하게 닥치는 문제는 lilo가 정상적인 부팅 프롬프트인 boot:를 보여주지 않고 li 까지만 표시되고 멈추는 경우이다. 심한 경우에는 0101과 같은 숫자 패턴이 끝없이 이어지며, 부팅이 불가능한 상태가 되는 겅우이다.
보통 문제는 고용량 하드 디스크에서 lba 모드를 사용하지 않았거나 lba 모드를 lilo가 제대로 인식하지 못했을 때, 그리고 리눅스 커널이 있어야 할 위치에 리눅스 커널이 없는 상태에서 발생한다.
나. 간단한 문제 : 싱글 모드로 부팅하기
부팅 자체가 안 되는 것은 아니고 커널은 제대로 부트되지만, 실수로 네트웍 설정 등을 잘못하여(예를 들어, 주소 또는 이름을 잘못 주었다든지) 시스템 초기화 과정에서 네트웍 관련 데몬이 뜨는데 엄청난 시간이 걸리면서 마치 다운된 것과 같은 일이 일어날 때를 들 수 있다.
주소와 이름 문제에 민감한 메일 전송 서버 sendmail 데몬과 nfs 자동 마운트 데몬인 amd, netbios 파일/프린터 공유 데몬, 삼바(samba)의 네임 데몬등이 네트웍 시스템에 조금만 문제가 생겨도 엄청나게 오랜 시간동안 네트웍을 검색하고 시간을 지연시킨다. 대부분 엄청난 인내심을 기지고 견디면 로그인 프롬프트까지 볼 수 있지만, 그것보다는 그냥 리부팅을 시키고 특수한 복구 모드로 리눅스를 시작하는 것이좋다.
boot : linux single
부팅할 운영체제 이름 다음에 single 이라는 옵션을 주면 리눅스는 네트웍 기능을 작동시키지 않고, 최소한의 시스템 초기화만 학 루트만이 로그인한 상태인 1번 실행 레벨로 들어간다. 이 상태에서 설정 내용을 제대로 고치고 telinit 3 명령으로 정상적인 실행 레벨인 3번으로 진입하거나 리부팅해도 된다(알려진 문제로는 1번 실행 레벨에서 리부팅없이 다른 실행 레벨로 진입하는 경우 현재 사용중이었던 가상 콘솔로 로그인하지 못하는 문제가 있다. <엔테>키를 쳐도 ^m이라는 문자만 찍히고, login: 프롬프트에서 더 이상 진행할 수 없기 때문이다.).
다. 준비가 최고 : 부팅 디스크 만들어 두기
모든 문제에는 준비가 최고 해결책이다. 지금 말해두는 작업을 해두면 앞으로 하는 번거로운 작업에서 해방될 수 있다.
레드햇 리눅스에서는 리눅스 커널이 다른 배포판과 조금 다르게 루트(/) 디렉토리가 아니라 /boot 디렉토리에 들어 있다.
[root@leelab /]# cd /boot [root@leelab /boot]# cat vmlinuz > /dev/fd0
cat 명령을 이런 용도로 사용하는 것은 매우 흥미로운 일이다. 파일 시스템을 무시하고, 그냥 장치의 앞부분부터 한 바이트 한 바이트 raw 모드로 써넣기 하는 작업을 해야만 부팅 가능한 플로피 디스켓을 만들 수 있다.
유닉스 명령에 자신있는 사람은 dd 명령을 사용하기도 한다.
[root@leelab /boot]# dd if=vmlinuz of=/dev/fd0
하지만, cp 명령은 사용하지 말라. 아직 일이 끝난 것은 아니다.
[root@leelab /boot]# rdev /dev/fd0 root device /dev/sda6 [root@leelab /boot]#
rdev 명령은 커널 이미지에 기록되어 있는 루트 파티션 정보를 보여주거나 설정하는 명령이다. 커널은 그 안에 기본적인 하드웨어 초기화 작업 이후 루트(/) 디렉토리에 마운트할 루트 파티션 정보를 지닌다.
레드햇 리눅스에서 기본으로 제공하는 커널에는 레드햇 리눅스 배포판 제작자의 환경이 설정되어 있을 것이다. 제작자는 아마도 scsi 시스템을 사용하며, 루트 파티션이 /dev/sda6인 것 같다.
하지만, 여러분의 루트 파티션은 이와 다를 것이다. 여러분의 루트 파티션을 모르는가? mount 명령을 입력하면 확인할 수 있다.
필자의 루트 파티션은 /dev/hda1이므로 다음과 같이 입력하였다.
[root@leelab /boot]# rdev /dev/fd0 /dev/hda1 [root@leelab /boot]# rdev /dev/fd0 root device /dev/hda1 [root@leelab /boot]#
rdev 명령 다음 커널이 있는 플로피 장치인 /dev/fd0, 그 다음에 설정할 루트 파티션 이름을 적는다. rdev 명령을 사용하여 다시 확인해 보라
이렇게 해서 부팅 디스켓이 만들어 졌다. 부팅중 bios 설정 화면에 들어가서 꼭 플로피 드라이브로 먼저 부팅하도록(부팅 순서를 a: c:) 하고, 부팅 디스켓을 넣어 부팅해 보자.
▶ lilo를 사용하지 않는 부트 디스켓 지금 만든 리눅스 부팅 플로피 디스켓은 lilo 와 같은 부트 로더를 사용하지 않은 순수 리눅스 커널 그대로이다. 따라서, lilo 와 전혀 관련이 없다.
장점과 단점은 동시에 존재한다. 지금 만든 부트 디스켓을 가지고는 lilokr 제공하는 boot: 프롬프트가 없기 때문에 다양한 옵션을 적어줄 기회가 없다. 부트 디스켓은 넣는 순가 그냥 부팅해 버린다. mbr에 설치된 lilo가 잘못되었다든지 할 때 매우 유용하다. 일단 리눅스로 부팅한 상태에서 /etc/lilo.conf 파일과 /sbin/lilo 며영을 사용하여 mbr의 lilo 정보를 갱신하면 된다. 쓰기 방지를 해놓고 잘 보고나해 두면 여러분이 지금 해둔 일을 두고두고 칭찬하게 될 것이다.
라. 도스/윈도우 95 운영체제가 있는 경우
리눅스로만 부팅하여 들어가지 못하는 경우가 있을 수 있다. 주로 커널 컴파일을 한 후 /sbin/lilo 명령을 실행하여 mbr 또는 루트 파티션에 있는 lilo 정보를 갱신하지 않아서 발생하는 경우가 많다. 도스 또는 위도우 95/98의 명령행 상태(도스창 상태가 아니라)에서는 레드햇 리눅스 cd에 들어 있는 loadlin 프로그램과 커널 이미지를 사용하여 리눅스로 부팅하여 들어갈 수 있다. 레드햇 리눅스 cd의 dosutil 디렉토리로 들어가 보자.
loadlin autoboot\vmlinuz root=/dev/hda1 ro
loadlin 프로그램은 dosutils 디렉토리에 있으며, 커널 이미지는 하부 디렉토리인 autoboot 디렉토리에 놓여 있다. root= 옵션 다음에 리눅스가 설치되어 있는 루트 파티션의 위치를 지정하고 맨 끝에 개 옵션을 적는다. 리눅스는 다양한 루트 파일 시스템을 처음에 읽기 전용으로 마운트한 후 시작하기 때문이다. 부팅이 진행되면서 이상이 없는 루트 파일 시스템을 읽기/쓰기 상태로 전환한다.
마. mbr에서 lilo 제거하기
mbr에서 lilo를 제거하려면 도스 상태에서 fdisk 명령을 사용하면 된다.
fdisk /mbr
위 명령을 입력하면 mbr의 정보를 기본 상태로 돌려놓는다. 또는, 리눅스 상태에서 lilo -u 옵션을 사용하여 백업된 섹터 이미지를 복원할 수 있다.
[root@leelab /root]# /sbin/lilo -u /dev/hda
lilo는 원래의 섹터값을 /boot 디렉토리에 boot.0345 이런 식의 이름으로 백업본을 보관해 둔다. 이 백업된 섹터를 다시 원래의 장소에 적는다.
바. 복구 디스켓 사용하기
레드햇 리눅스 cd의 images 디렉토리에 들어가면 설치에 사용되는 이미지 파일 boot.img가 있다.
이 파일을 도스에서는 rawrite, 리눅스에서는 cat 또는 dd를 사용하여 한 장의 디스켓에 적는다.
C:\WINDOWS>e: CDROM에 리눅스 CD를 넣고, A드라이브에 boot.img 디스켓을 넣고, 부팅하면, boot: 프롬프트가 나오면 복구 모드를 의미하는 rescue를 입력한다.
맨 마지막에는 썰렁한 루트 쉘 프롬프트 #이 표시되며, 여러분이 그 동안 갈고 닦은 리눅스 실력을 발휘할 기회를 제공한다.
이 모드에서는 vi, e2fsck 등의 명령을 사용하여 편집하거나 망가진 파일 시스템을 복구할 수 있다.
lilo 부트 이미지를 제대로 고치기 위해서는 문제가 있는 리눅스가 설치된 루트 파티션을 /mnt 디렉토리에 마운트 한다.
[root@leelab /]# mount /dev/hda1 /mnt [root@leelab /]# cd /mnt/sbin [root@leelab /sbin]# ./lilo -r /mnt
-r 옵션은 그 뒤에 적은 디렉토리를 새로운 루트 디렉토리로 잠깐 설정하게 하는 옵션이다.
여러분이 두 장의 플로피로 부팅하면 그 상태는 메모리를 루트 파티션으로 사용하고 잇는 매우 특별한 상태의 리눅스이다. lilo를 실행시키면 현재 상태에서 /etc/lilo.conf 파일을 찾게 되는데, 사실 우리가 원하는 lilo.conf 설정 파일과 커널 이미지들은 모두 /mnt 디렉토리에 놓여 있다. 다라서, -r 옵션으로 하여금 일단 /mnt 디렉토리를 새로운 루트 디렉토리로 설정하도록 해줘야 한다.
|
[목차] |