강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

두번째 하드에 리눅스를 설치하려면

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle53.gif


-간략한 리눅스 부팅 과정-

글쓴이 : Eric Lindbloom
 번역 : 고현수

 

리눅스 설치의 정확한 과정은 배포본 및 버전마다 조금씩 다르다. 그러나 모든 리눅스에서 공통되는 과정은 아래와 같다.

  1. 부트(Boot)
  2. 인스톨 소스 감지 및 선택(장치/매체/방법)
  3. 대상 장치/파티션 만들기/선택 (Create/Select Target Devices/Partitions)
  4. 파일시스템 만들기 및 레이아웃 선택(Make File systems & Choose Layout )
  5. 설치 패키지 선택(포장 풀기/압축해제)[Select and Install (Unpack/Extract) Packages]
  6. 패키지 구성[Configure Packages]
  7. 부트레코드 쓰기
      (새 OS 부트 가능하게 만들기)[Write Boot Record (Make New OS Bootable) ]
  8. 재부팅[Reboot]
  9. 즐기라!

일반적으로는 플로피나 CD에서 부팅 한다. 몇몇 피시나 시스템은 네트워크 서버로부터 부트할 수 있다(보통 bootp/tftpd 조합을 사용한다) 그러나 여기서는 디스켓 또는 하드디스크로부터 부팅 하는걸로 한다.

MS-DOS 부트 프롬프트에서 리눅스를 부팅하는것도 가능하다. LOADLIN.EX E 라는 프로그램을 사용해서 가능하다.( LINUX.BAT 또는 SETUP.BAT , INSTALL.BAT 라는 배치파일이 종종 사용된다)

이는 MS-DOS가 운영체제라기 보다는 프로그램로더(program loader)에 가깝기 때문이다. (윈9X는 MS-DOS에서부터 투명하게 로드되어진 주인자리를 차지한(re-hosted) 운영체제로 볼 수 있다. 네트웨어도 그렇다)

어느 경우든 CD를 넣고 배치 파일을 돌리면 리눅스 설치를 시작할 수 있다.
모든 리눅스 배포본은 자신의 고유의 설치 과정이 있다. 쉘스크립트부터 정교한 GUI까지 다양하다.

대부분은 아주 간단한 칼라/텍스트 대화형식을 사용해서(ncurses) 공란에 기입하거나 자그마한 체크박스나 라디오버튼을 선택하게 한다. 이러한 인터페이스 방식은 키보드로 도스나 윈도우를 사용했던 사람들에게는 매우 익숙하게 보인다.

피시를 사용 안 해본  맥이나 SGI Irix 사용자들에게는 텍스트 대화 방식이 별로 달갑지 않은 것 같다. 즉 이 시점에서는 마우스는 아직 작동하지 않기 때문이다.
(그런 사람들은 최근에 나온 칼데라나 코렐, 스톰 리눅스를 사용하라는 것이다. 그들은 GUI 부트에서 설치하기 때문이다.  그들은 또한 키보드 방식의 텍스트모드 다이얼로그를 어떻게 다루는지 가르쳐 줄 것이다. )

부트가 된 후 인스톨 루틴은 커널에 의해 탐지되지 않은 하드웨어를 찾을 것이다.

많은 배포본은 하드웨어에 관한 보다 많은 정보를 선택하는 옵션을 제시한다.(추가적인 하드웨어를 탐지하고 지원할 커널모듈을 올리는 것도 제공한다.)

만약 당신의 두 번째 하드가 배포본의 커널에 의해 직접 탐지되지 않는 경우라면 이는 매우 중요하다. 예를 들어 당신의 첫 번 하드가 IDE 콘트롤러에 연결돼 있고, 두 번째 하드는 SCSI 어뎁터나 Promise Ultra66 IDE 같은 특수한 콘트롤러에 연결돼 있는 경우라면 인스톨 과정에서 이러한 장치를 위한 추가작인 모듈을 올려야 한다.

또한 비표준 장소에 위치한 (드문 I/O나 다른 주소에 할당된) 장치나 콘트롤러를 탐지하기 위해 커널에  추가로 명령행 인자를 지정해야 할 경우도 있다.

최악의 경우는 맞춤 커널을 다운로드하거나 커널을 만들어야 한다. 만약 당신이 다른 시스템에 이미 리눅스를 설치해 있거나 주위에 커널을 만들어줄 친구가 있다면 그 경우는 당신이 만나게 될 보다 미묘한 하드웨어 구성에 대해 도움을 줄 수 있다.

콘트롤러가 인식되면 배포본의 파티션 인터페이스를 통해 드라이브를 선택할 수 있다. (위의 단계 3)         

이 방법이 안되면 쉘 프롬프트로 가서 ([Alt]+[F2] 나 [Alt]+[F3] 등을 차례로 눌러 해쉬(#)프롬프트가 나와야 한다) 시도할 수 있다.

여러 쉘 커맨드를 시험해 보라. fdisk -l 명령을 줄 수 있다. 그러면 인식된 드라이브 목록이 나온다. 이것이 안 될 수도 있다. (어떤 배포본은 fdisk 명령이 하드 드라이브를 모두 찾을 수 있을 정도로 자그마한 미니 루트 램 디스크의 /dev에 충분한 공간을 할당하지 않는다.)

물론 이것이 혼동을 주기는 하지만 어느 배포본을 쓰느냐에 따라 달라진다. 스크린과 메뉴를 자세히 보는게 중요하다. 만약 fdisk 파라메터를 요구하면 /dev/hdb를 시험해 보라.(두 번째 하드의 일반적 이름) 그리고서 /dev/hdc (두 번째 콘트롤러의 첫번 하드),

아래는 일반적인 리눅스의 장치명이다.
 

    Primary IDE Controller:
          (Master) Drive:         /dev/hda
            (Slave) Drive:         /dev/hdb
    Secondary IDE Controller:
          (Master) Drive:         /dev/hdc
            (Slave) Drive:         /dev/hdd
    Tertiary IDE Controller:
          (Master) Drive:         /dev/hde
            (Slave) Drive:         /dev/hdf

 

주]  이 중의 hdb, hdc, hdd 는 CD ROM 드라이브일 수 있다. 혹은 LS-120 또는 다른 IDE
      블록 미디어. 어떤 경우는 빈 슬롯을 의미한다.(케이블 콘넥터)
 

  - First IDE Tape Drive: /dev/ht0

  - SCSI Host Adapters:
                           First  Hard Drive:          /dev/sda
                           Second Hard Drive:      /dev/sdb
                           Third  Hard Drive:         /dev/sdc

                           First  CD Drive:            /dev/scd0
                           Second CD Drive:        /dev/scd1

                           First  Tape Drive:          /dev/st0
                           Second Tape Drive:      /dev/st1

                           First  “Generic Device”:      /dev/sg0
                           Second “Generic Device”:  /dev/sg1


등 등

주]   이들은 첫번째 SCSI 어뎁터부터 마지막까지를 포함한다. “Generic Devices” 는
       CDR 레코더 장치를 포함한다.
       (그러나 이들을 CD-Rom 읽기 장치로 사용하려면 scdX 이름/장치를 사용해야 한다)        (CDR 드라이브는 scdX 와 또 다른 sgX 이름(디바이스 노드)과 관련된다)

이 차이점을 알아야 한다. IDE 드라이브는 콘트롤러/채널과 장치에 기초해서 이름이 할당된다. IDE CD-ROM 드라이브 이름은 하드드라이브와 구별되지 않는다.

SCSI 드라이브의 경우는 각 어뎁터의 체인에 따라 낮은 ID부터 위로 탐지된다. SCSI CD-ROM 드라이브는 하드 및 다른 SCSI 장치와는 다르게 이름 지어진다.

위에서 보듯이 당신의 답은 당신의 하드웨어에 의존한다. 만약 IDE 장치를 갖는 피시에서 /dev/hda에 하드를 /dev/hdc 에 CD-ROM을 갖고 있다면 두 번째 하드는 /dev/hdb 나 /dev/hdd가 된다. CD-ROM 드라이브를 위치를 바꾸어 (/dev/hdd 나  /dev/hdb) 새 하드를 /dev/hdc에 달 수도 있다.

이래도 문제를 해결하지 못하면 아래 내용을 파악해 메시지를 작성하라.

- 배포본 및 버전
- 첫 번 하드와 OS
- 두번째 하드(콘트롤러, 위치 혹은 ID)
- 가능하다면 fdisk -1 - 출력

comp.os.linux.* 뉴스그룹을 검색하라. 그 중 하나에 이 글을 올리라. 이 뉴스 그룹에는 질문에 답변해 주는 사람들이 많다.

일단 드라이브에 리눅스 파티션을 만들면 배포본 설치 루틴이 파일시스템을 만들고 어려움 없이 소프트웨어를 설치한다.

새 운영체제를 부팅 가능하게 만들었을 때 다른 문제를 고려해야 한다. 대부분의 피시는 첫 번 콘트롤러의 두 하드에서만 부팅 할 수 있다. 그래서 /dev/hdc , /dev/hdd 에서는 부팅이 안된다. 보통은 IDE 드라이브를 갖는 시스템에서 SCSI 드라이브로부터는 부팅 할 수 없다. 이 모두는 BIOS에 의존한다.

LILO(가장 많이 사용되는 리눅스 부트 로더)를 사용하려면 바이오스가 장치와 파티션, 부트로더/코드 와 커널을 발견해야 한다.

나는 이미 전에 LILO에 관해 언급했고 여러 경우에 이에 대한 대안을 설명했다.

도스나 윈도우 파티션이 있다면 LOADLIN.EXE를 사용할 수 있다. LOADLIN.EXE가 작동하려면 안전모드(“safe mode”)로 부팅 해야 한다.

부트 플로피를 만들 수 있다.(커널만 또는 커널 + 부트로더) 플로피를 사용한다면 SYSLINUX를 사용해라. (MS-DOS 포맷의 플로피에서 작동하는 플로피 부트 로더이다. 그러나 리눅스 커널을 부팅 해 준다)

리눅스를 부팅하는 다양한 방법이 있다. 기본적으로 커널은 어떻게 로드 되었는지를 따지지 않는다. 커널을 메모리에 올리고 시작코드로 들어가면 커널은 연결되어 있는 어느 장치의 어느 파티션에 있는 어느 파일시스템이나 발견할 수 있다. 커널은 루트 파일시스템을 찾는 기정장소를 갖고 있다. (모든 리눅스 부트 로더 즉 LILO, LOADLIN.EXE,SYSLINUX
는 이 기정치를 대치할 수 있는 파라메터를 커널에 넘겨서 루트 파일시스템을 직접 지정가능하다.)

루트 파일시스템이 마운트 되면 리눅스 커널은 /dev/console 장치와 /sbin/init 파일을 찾는다. 그리고 장치를 열어 실행한다.

다른 모두는 그들을 뒤따른다. (보다 자세한걸 알려면 /etc/inittab 파일을 읽어라. ) 시작시의 램 디스크(initrd) “linuxrc” 프로그램/스크립트에 관한 약간 더 복잡한 문제가 있기는 하다. 그러나 이 문제들은 배포본에서 알아서 처리하므로 여기는 다루지 않는다.

어떻게 피시가 리눅스를 부팅 하는지를 요약한다.

- 바이오스가 부트로더를 발견한다
- 부트로더가 커널을 발견하고(또는 initrd) 로드한다.
- 커널은 헤더에 압축해제 루틴을 갖는 압축된 이미지이며 스스로 압축을 풀고
   메모리에 위치한다.
- 커널은 프로세서와 메모리를 초기화한다(보호모드)
- (dmesg와 klogd를 위한 링버퍼를 설치한다)
- 커널은 명령행 옵션들을 추출한다.
- (커널은 이 단계에서 initrd를 로드할 수도 있다.
   커널 파라메터와 부트로더에 따라 결정된다.)
- 커널은 시스템을 탐색해서 로칼하드웨어를 찾는다.
- 시리얼콘솔 지원이 설정돼 있으면 사전 설정 또는 명령행 옵션에 따라
   시리얼포트를 초기화 한다.
- 시리얼이 아니면 비디오 하드웨어를 초기화한다.
  (텍스트 또는 프레임버퍼 모드) 초기 비디오모드는 내장된 디폴트 값이거나 명령행 옵션이다

  . 프레임버퍼라면 부트로고를 디스플레이한다.
  . initrd 라면 커널은 초기 램디스크를 만든다.
  . initrd라면 루트에 램디스크를 마운트하고 linuxrc 를 찾아서 실행한다.

- (linuxrc 이후 또는 대신에) 루트파일시스템을 마운트 한다
- 초기 콘솔장치를 연다.
- 남은 커널 명령행 옵션을 환경변수로 저장
- init 프로그램을 찾아 실행(명령행의 옵션 “init=명령” 라인이 있으면 디폴트값을 변경한다.)
- 다른 남은 명령행 인자는 넘긴다.
- init는 /etc/inittab를 찾아서 열어 명령 라인과 환경을 추출해서 런레벨을 설정하고
   그 런레벨에 적용되는 지시를 따른다.
- inittab는 update를 시작하고(또는 bdflush 또는 ???) rc.sysinit ,등
   Rc<런레벨>을 실행한다.(이들이/etc/rc.d/rcX.d/K* and S*를 실행한다), rc.d/S* 스크
  립트는 여러 데몬등등을 시작하고 인터페이스를 초기화한다.
- init는 여러 개의 getty 프로세서와 아마도 xdm(그래픽 로긴) 프로그램을 낳는다
- init는 respawn 리스트에 있는 프로세서를 감시하고, 고아 프로세서를 받아들이고 자신의
   zombie 자식 프로세스를 거두어 들인다. /dev/initctl 파이프로부터의 신호와 명령을
   처리한다.

대충 이렇다. 마지막 과정은 셧다운 명령이나 리부트, 할트(halt) 명령이 있을 때까지 계속한다.
하드웨어 실패나 리셋 또는 파워 절단시는 무조건 프로세스가 중단된다.

나는 이 중 몇몇의 정확한 과정은 모른다. Initrd가 어디에 올려지는지도 정확히 모른다. (나는 그것이 부트로더에 의해 이루어진다고 읽었으나 커널에 의해 이루어진다고 생각이 드는 부트파라메터 옵션을 보았다)

이 글은 부트시나 인스톨시의 문제점들을 해결하는데 도움이 되기 위함이다.

이 글에서 일반적인 절차를 알았으면 다음에는 /etc/inittab과 여러 rc* 파일을 읽으라.


관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,043 명
  • 현재 강좌수 :  35,853 개
  • 현재 접속자 :  102 명