System Admin

본문 바로가기
사이트 내 전체검색


RedHat Linux >> System Administration for Redhat Linux
[목차]
제3장 시스템 관리 기초

    8. 리눅스 심층 분석

 

리눅스 박스의 전원을 켜는 순간부터 login 화면에 아이디와 패스워드를 입력하고 여러분의 리눅스 박스에 로긴할 때 까지 우리는 윈도우와  사뭇 다른 메시지와 화면들을 대하게 됩니다. 처음 유닉스 계열의 리눅스 운영체제를 접한 사람들에게는 복잡 미묘하고 까다롭게만 보이는 메시지들이 가득한 화면에 부담감과 약간의 공포를 느끼게 되죠. 하지만, 이 모든 과정은 합리적이고 과학적인 방법을 이용한 부팅(Booting)은 매우 중요한 과정입니다. 또한, 부팅과정을 이해하면, 리눅스 박스의 종료과정도 저절로 이해가 됩니다.

부팅(Booting)이라는 것은 bootstrap의 약어입니다. 이것은 보통 신발 끈을 묶은 상태, 즉, 준비가 된 상태를 일컫는 말로, 스스로 일어선다는 의미로 자수 성가를 말하기도 합니다. 즉, 리눅스 박스가 하드웨어 상태로 놓여져 있는 것이 아니고, 운영체제가 메모리에서 작동을 하여 시스템의 각 하드웨어(프로세서, 마우스, 키보드, 랜카드, 사운드 카드, 각종 부변기기)를 알맞게 사용할  수 있는 준비를 하는 작업입니다. 이것은 전체적으로 bootstrapping이라고 합니다. 즉, 커널(Kernel)이 메모리에 복사되고, 실행되어, 모든 하드웨어를 제어하여 일정한 작업을 할 수 있게 준비되는 상태입니다.

일반적인 유닉스 계열 운영체제의 부팅(Booting)과정은 시스템에 장착된 ROM이 작동하고, 그후 root디스크의 0번째 디스크에 부트 프로그램(리눅스의 LILO)이 작동하여서 커널을 메모리에 복사하고, 실행시킵니다. (하드웨어에 따라 달라지지만, 일반적인 인텔 기반의 유닉스에서는 활성화된 root 파티션의 마스터 부트 레코드(Master Boot Record:MBR)에 부트 프로그램이 기록되어 있습니다.) 그러면, 시스템의 제어권이 유닉스 계열 운영체제로 옮겨서 작동을 하게 됩니다. 즉, 커널이 시스템의 작동을 관리하고, 메모리에 계속적으로 남아서 기본적인 하드웨어 제어를 담당하게 됩니다. 이것이 운영체제의 부팅입니다. 리눅스 박스의 전체적인 부팅과정을 알아보도록 하겠습니다.

 

1. 리눅스 박스의 전체적인 부팅과정(Booting Process)

먼저, 전체적인 리눅스 부팅 과정에 대한 이해를 해보기로 하겠습니다. 아래의 그림은 전체적인 리눅스 부팅 과정을 설명하고 있습니다. 전원을 켜고, 콘솔에 login 메시지가 나오기까지의 전체적인 과정입니다.

 

전원을 사용자가 켜게되면, 시스템의 바이오스가 작동하고, 먼저, LiLO를 작동시키게 됩니다. 이때, LiLO는 /etc/lilo.conf의 설정을 읽어서 커널(보통의 경우 vmlinuz를 사용합니다.)의 위치를 파악하고 읽은 커널을 메모리에 적재하고, 실행합니다. 그런다음에 Sysvinit를 실행하여서 대부분의 운영체제의 서비스 데몬(아파치 웹서버, 메일 서버 같은 것부터, atd, crond같은 시스템의 기초적인 작업 까지 포함한 프로그램들)이 실행되고, 리눅스 박스가 정상적인 운영체제로서의 역할을 시작합니다.

가상콘솔은 migetty프로그램이 터미널을 열어줍니다. 그 다음, login 과정을 위해서 /bin/login 프로그램이 실행 됩니다. 그 후 설정한 쉘에 따라서 로긴을 하게 됩니다. 이 모든 과정이 리눅스가 시작되는 부팅 진행과정입니다. 만약, 엑스윈도우로 실행을 시키셨다면, xdm이 실행되어서 리눅스 박스에서 엑스윈도우가 실행되어 로긴을 하게 됩니다.

이제부터는 리눅스 박스의 부팅과정에 대해서 좀더 쉽게 원리를 설명하고자 합니다. 먼저 리눅스 박스에서 여러분들의 손으로 직접 전원 스위치를 누르면 리눅스 박스의 부팅이 시작됩니다.

 

2. LiLO(Linux Loader)

대부분의 사용자들은 인텔 리눅스 박스에서 LiLO 나 Loadlin을 사용하고 계실 것입니다. 차이점은 바로 리눅스 부팅을 원할 때 하드디스크나 디스켓의 부트 섹터(디스크의 첫 번째 섹터를 말합니다.)에 설치하여 LiLO를 사용하고, 여러 가지 사정으로 인해 다른 운영체제를 부팅한 다음 리눅스 부팅을 하기 위해서는 Loadlin을 사용하는 것입니다. 물론, 알파 리눅스 박스는 MiLO, 스팍 리눅스 박스에서는 SiLO를 사용하지만, 부팅 과정에서 하드디스크의 커널을 읽고 커널을 메모리에 복사하고, 실행시키는 작업을 수행하는 것은 모두 다 동일합니다. (MiLO나 SiLO의 경우에는 /etc/lilo.conf를 사용하지 않고, 다른 외부적인 옵션이나 firmware로 해결합니다.)

 

LiLO는 위의 그림과 같이 일단 작동을 시작하면, /etc/lilo.conf의 설정 파일을 읽어서 커널(Kernel)의 위치를 파악합니다. 그 다음, 커널을 메모리에 복사를 하고, 실행을 합니다. 보통의 경우 아래의 메시지와 같은 커널의 크기가 커져서 압축을 하여서 만드므로, 실행시키기 앞서서 압축을 풀고 실행합니다.

LiLO boot :

Loading linux ..............................

Uncompressing Linux ... OK, booting the kernel

 

LiLO는 하드웨어 설정이나, 부팅을 맘대로 할 수 없게 패스워드 같은 것까지 /etc/lilo.conf에 설정할 수가 있어서 매우 편리합니다. 이 때는 하드디스크가 읽기만 할 수 있는 상태로 작동을 합니다.

 

3. 커널 실행

커널이 실행 되면, 아래와 같은 메시지를 접하게 될 것입니다.

 

리눅스 박스에서 커널의 실행은 하드웨어에 생명을 불어 넣은 과정과 같습니다. 커널은 리눅스 박스의 리소스를 배분하고, 메모리를 관리하며, 프로세서를 제어하는 역할을 합니다. 즉, 운영체제의 역할을 하게 됩니다. 메시지를 자세히 보면, 각 하드웨어의 역할 및 동작을 담당하고, 각종 프로토콜이나, 표준 방식에 대해서 작동하는 것을 알 수 있습니다.

Linux version 2.4.5 (root@ns) (gcc version 2.96 20000731 (Red Hat Linux 7.1 2.96

-81)) #1 SMP 일 6월 24 16:20:47 KST 2001

커널 버전이 얼마고, 언제 무엇으로 컴파일 되었는 가를 보여줍니다.

Red Hat Linux 7.1이고, KST(Korean Standard Time) 기준으로 6월 24일날 커널을 2.4.5 버전으로 gcc를 이용해서 컴파일 했다는 메시지입니다.

 

Intel MultiProcessor Specification v1.1

    Virtual Wire compatibility mode.

OEM ID: INTEL    Product ID: 440GX        APIC at: 0xFEE00000

Processor #0 Pentium(tm) Pro APIC version 17

    Floating point unit present.

    Machine Exception supported.

    64 bit compare & exchange supported.

    Internal APIC present.

    SEP present.

    MTRR  present.

    PGE  present.

    MCA  present.

    CMOV  present.

    PAT  present.

    PSE  present.

    PSN  present.

    MMX  present.

    FXSR  present.

    XMM  present.

    Bootup CPU

Processor #1 Pentium(tm) Pro APIC version 17

    Floating point unit present.

    Floating point unit present.

    Machine Exception supported.

    64 bit compare & exchange supported.

    Internal APIC present.

    SEP present.

    MTRR  present.

    PGE  present.

    MCA  present.

    CMOV  present.

    PAT  present.

    PSE  present.

    PSN  present.

    MMX  present.

    FXSR  present.

    XMM  present.

시스템이 어느 프로세서를 사용하는지 알 수가 있습니다.

 

Kernel command line: auto BOOT_IMAGE=leelab ro root=801 BOOT_FILE=/boot/vmlinuz-2.4.5

부팅 디바이스명과 부팅 커널의 위치를 보여줍니다.

 

Console: colour VGA+ 80x25

콘솔이 VGA 모드를 사용하고 , 가로 80, 세로 25에 글자를 표시할 수 있습니다.

 

Calibrating delay loop... 897.84 BogoMIPS

프로세서의 속도를 나타내는 척도입니다 . 정확하지 않을 수도 있으나 BogoMIPS는 Milion Instructions Per Second의 약자로 초당 실행 시키는 프로세서 명령어 수를 100만개로 잡고, 나타내는 것으로 수치가 높은 프로세서 일수록 높은 실행 속도를 나타냅니다. 하지만, 프로세서마다, 조건 마다 다른 수치를 나타내므로, 절대적인 것은 아닙니다.

 

Memory: 512652k/524288k available (1423k kernel code, 11248k reserved, 542k data, 228k init, 0k highmem)

사용가능한 메모리의 양을 나타냅니다.

 

PCI: PCI BIOS revision 2.10 entry at 0xfdb71, last bus=1

PCI: Using configuration type 1

PCI: Probing PCI hardware

PCI->APIC IRQ transform: (B0,I7,P3) -> 19

PCI->APIC IRQ transform: (B0,I16,P0) -> 16

PCI->APIC IRQ transform: (B0,I19,P0) -> 19

PCI 바이오스 버전과 설정에 대해서 나오며, 이바이오스를 이용합니다.

 

VFS: Diskquotas version dquot_6.4.0 initialized

가상 파일 시스템의 초기화를 말합니다. 가상파일 시스템이라는 것은 다음 그림과 같이 본래의 파일 시스템과 다른 파일시스템간의 중간에서 완충역할을 통해 파일 시스템을 구성하므로써 서로 다른 파일 시스템간에도 파일을 읽거나, 쓸 수가 있도록 하는 리눅스 만의 독특한 파일 시스템입니다. 이 파일 시스템을 통해 윈도우 95/98/NT 나 다른 맥ㅁ, 솔라리스와 같은 운영체제의 파일 시스템을 읽을 수 가 있습니다.

 

Linux NET4.0 for Linux 2.4
Based upon Swansea University Computer Society NET3.039

NET4: Linux TCP/IP 1.0 for NET4.0

IP Protocols: ICMP, UDP, TCP, IGMP

IP: routing cache hash table of 4096 buckets, 32Kbytes

TCP: Hash tables configured (established 131072 bind 65536)

ip_conntrack (4096 buckets, 32768 max)

ip_tables: (c)2000 Netfilter core team

NET4: Unix domain sockets 1.0/SMP for Linux NET4.0.

네트워크를 사용하기 위한 소켓과 TCP/IP프로토콜의 실행을 나타냅니다.

 

Starting kswapd v1.8

파일 시스템의 스왑영역이 아니고 커널의 스왑영역을 실행하는 것입니다.

 

Detected PS/2 Mouse Port.

마우스 포트를 찾았다는 메시지입니다.

 

Serial driver version 5.05a (2001-03-20) with MANY_PORTS SHARE_IRQ SERIAL_PCI ISAPNP enabled
ttyS00 at 0x03f8 (irq = 4) is a 16550A
ttyS01 at 0x02f8 (irq = 3) is a 16550A

직렬 포트의 값을 나타냅니다. 보통, 윈도우에서 com1,2,3,4라고 불리는 것을 말합니다.

 

pty: 256 Unix98 ptys configured

pty를 256명까지 허용한다는 것입니다. 커널을 컴파일할 때 [Character devices]에서 설정을 해 줄 수가 있습니다. 동시에 접속할 수 있는 사용자수를 결정합니다. pty라는 것은 원경으로 터미널에 접속한 것을 말 합니다.

 

Floppy drive(s): fd0 is 1.44M
FDC 0 is a National Semiconductor PC87306

플로피 디스크가 1.44메가를 사용할 수 있고, Floppy Disk Controller에 대해서 기술합니다.

 

md driver 0.90.0 MAX_MD_DEVS=256, MAX_REAL=12

md(Multiple Devices)는 여러개의 디바이스를 사용하도록 하는 기능을 말합니다. 대표적으로 RAID를 말합니다. RAID기능이 커널에 적재되어음을 말합니다.

 

scsi : 0 hosts.
scsi : detected total.

i91u: PCI Base=0xE800, IRQ=16, BIOS=0xC8000, SCSI ID=7
i91u: Reset SCSI Bus ...
scsi0 : Initio INI-9X00U/UW SCSI device driver; Revision: 1.03g
scsi : 1 host.
  Vendor: SEAGATE   Model: ST39140LW         Rev: 1503
  Type:   Direct-Access                      ANSI SCSI revision: 02
Detected scsi disk sda at scsi0, channel 0, id 0, lun 0
SCSI device sda: hdwr sector= 512 bytes. Sectors= 17783240 [8683 MB] [8.7 GB]
 sda: sda1 sda2 < sda5 sda6 >

SCSI Controller를 찾고 그 다음, 스카시 번호에 따라서 시디롬, 하드 디스크등을 찾아 정보를 출력하고, 사용가능하다는 메시지입니다.

위는 Initio 9800UW을 찾아서 설정한 메시지입니다.

 

eth0: 3c5x9 at 0x220, 10baseT port, address  00 10 4b 25 ae 6d, IRQ 5.
3c509.c:1.18 12Mar2001 becker@scyld.com
http://www.scyld.com/network/3c509.html
8139too Fast Ethernet driver 0.9.17
eth1: RealTek RTL8139 Fast Ethernet at 0xe0800f00, 00:00:21:28:4e:5f, IRQ 19
eth1:  Identified 8139 chip type 'RTL-8139B'

RealTek 8139 PCI 랜카드1개와 3C509랜카드를 찾아서 설정한 메시지입니다.

 

Partition check:
 sda: sda1 sda2 < sda5 sda6 sda7 >

VFS: Mounted root (ext2 filesystem) readonly.

현재 리눅스 박스의 파티션 정보가 출력됩니다. 이중에 <sda5 sda6 sda7>의 메시지는 논리 파티션을 나타냅니다. 또한 루트 파티션이 읽기 가능으로 마운트 되었음을 나타냅니다.

 

Freeing unused kernel memory: 228k freed
Adding Swap: 136512k swap-space (priority -1)

파티션의 스왑영역을 메모리에 추가하여 활성화 시키는 메시지입니다.

 

그밖의 메시지

Soundblaster audio driver Copyright (C) by Hannu Savolainen 199 ~
SB 4.13 detected OK (220)
<SoundBlaster EMU8000 (RAM0k)>

사운드 카드가 있을 경우에는 사운드 설정에 관해서 메시지가 출력됩니다.

 

Checking 386/387 coupling ... OK, FPU using exception 16 error reporting.

386에서 보조 수치 연산 장치가 달려 있지 않을 경우에 체크하는 메시지로, 보조 수치연산 장치가 내장되어 있음을 확인하는 메시지입니다

 

Checking 'hit' instruction ... OK.

시스템에 hlt 명령을 보내서 시스템을 일단 정지 시켜 보는 메시지입니다. 일단은 시스템의 안정성을 확인하기 위해서 프로세서 명령어인 hlt를 보내서 시스템을 정지시키고, 정상적인 종료가 되는 가를 확인합니다.

 

Intel Pentium with F0 0F bug - workaround enabled.

펜티엄 버그를 수정하고 보완해 줄 수 있는 소프트웨어적인 장치인 워크어라운드를 실행 하는 메시지입니다.

 

이와 같은 커널 메시지는 dmesg명령어를 사용하여 다시 출력해 볼 수가있습니다. 또한, 부팅한 후에 일정량의 버퍼에 들어 있는 메시지를 Shift 키와 PageUP, DOWN키를 사용하여 최근 메시지를 볼 수 있습니다.

# dmesg

# dmesg|more

 

[ 참고 ]

부팅할 때 실행되는 /etc/rc.d/rc.sysinit의 맨 아래 보면 아래와 같은 메시지를 볼 수 가 있습니다.
즉, dmesg 명령어로 부팅된 후의 모든 부팅 메시지를 /var/log/dmesg에 저장하도록 되어 있습니다.

# cd /etc/rc.d
# more rc.sysinit

# Now that we have all of our basic modules loaded and the kernel going,
# let's dump the syslog ring somewhere so we can find it later
dmesg > /var/log/dmesg

-----------------------------------------

 

4. Sysvinit 실행

 

커널이 실행되어서 운영체제가 하드웨어의 모든 기능을 제어하게 되었을 때 Sysvinit 프로그램이 실행 되게 됩니다. init 프로그램에는 유닉스 계열처럼 System V계열과 BSD계열이 있습니다. 리눅스에서는 System V init 프로세서를 사용하고 있습니다.

init는 커널에 의해 생성되는 첫 번째 프로세서로서, initialize의 약자입니다. 즉, 초기화를 한다는 것이죠, 약간의 유닉스 지식을 가지고 계신분이라면, 부모 프로세서와 자식프로세서라는 말을 들어 보셨을 것입니다. 유닉스의 경우에는 하나의 프로그램이 실행되어서 계속적으로 인간의 자손이 아기를 낳듯이 프로세서를 낳고 낳고 하면서 이어지는 것입니다.

최초의 시작되는 프로그램을 통해서 모든 프로그램의 실행이 제어되고, 통제되어지는 것입니다. 이 같은 원리로 상위의 프로세서를 제거하면 (유닉스에서는 kill라는 명령어를 사용합니다.) 아래의 하위 프로세서는 죽거나, 영혼(좀비 프로세서라고들 하지요)처럼 컴퓨터 세계를 떠돌아 다니게 됩니다. 이런 운영방식은 거의 모든 운영체제제에서 동일 합니다.

사실 프로세서에서 엄격하게 말하면 처음으로 실행되어지는 것은 커널의 Scheduler라는 프로세서입니다. 이것은 실행을 위한 프로세서의 일정을 정하고, 실행할 순서, 시간, 길이를 결정하는 작용을 합니다. 한마디로 fork()와 exe()를 이용해서 프로세서를 만드는 것입니다. 이프로세서는 커널에서 작동을 하기 때문에 ps나 pstree에서도 볼 수 가 없습니다.

 

[ 참고 ]

fork : 새로운 프로세서를 생성하는 것을 말합니다. 즉, 부모 프로세서에서 자식 프로세서를 만든 것을 말합니다. 유닉스 프로그래밍을 작성하려면, 반드시 이 개념에 대해서 잘 아셔야 합니다.

exec : 사용했던 프로세서와 같은 프로세서 아이디(PID)를 사용하여서 프로세서를 시작하는 것을 말합니다. 아주 새로운 프로세서를 시작해서 프로세서 오버헤드를 올리는 것보다 효과적인 방법입니다.

------------------

init 프로세서가 시작되면, 그 아래로 fork와 exec를 이용해서 시스템의 기본적인 atd, crond, inetd, gpm, httpd, innd, klogd, lpd 등의 데몬들이 실행됩니다. init는 제일 먼저 샐행되 때문에 항상 프로세서 아이디(PID)는 1이고, 리눅스 박스가 shutdown 될 때에도 제일 마지막으로 프로세서과정에서 종료됩니다.

리눅스 박스의 프로세서가 어떻게 되어 있는가는 아래와 같이 ps와 pstree를 이용하여 프로세서 아이디와 그 구조에 대해서 시각적으로 알 수 가 있습니다.

# ps aux| grep init
root         1  0.0  0.1  1368  544 ?        S    Jun26   0:13 init [3]
#

# pstree|more

init-+-automount
     |-bdflush
     |-crond---crond---run-parts---awk
     |-eth1
     |-gpm
     |-httpd---13*[httpd]
     |-keventd
     |-khubd
     |-klogd
     |-kreclaimd
     |-kswapd
     |-kupdated
     |-6*[mingetty]
     |-msql2d
     |-named---named---4*[named]
     |-portmap
     |-proftpd
     |-sa1---sadc
     |-safe_mysqld---mysqld---mysqld---mysqld
     |-sendmail
     |-sshd-+-sshd---bash---su---bash---more
     |      `-sshd---bash---su---bash---pstree
     |-syslogd
     |-xfs
     `-xinetd

 

위에서,

 httpd---13*[httpd]

웹서버 데몬을 fork와 exec를 이용해서 13개를 동작시키고 있을 다는 것을 알 수 있습니다.

sshd---bash---su---bash---pstree

 pstree를 실행시키기 위해서 sshd데몬에 의해서 원격 접속한 터미널에서 login를 수행하여 접속한 bash쉘을 통해서 pstree를 사용하고 있는 것을 볼 수 가 있습니다.

6*[mingetty]

6개의 mingetty가 실행되어서 가상 콘솔이 6개가 작동중인 것을 알 수가 있습니다.

이외에도 프린터 사용을 위한 lpd 데몬이라든지 마우스사용을 위한 gpm이라든지 수많은 실행 프로그램들이 init를 통해서 실행되어지고 있다는 것을 알 수가 있습니다.

이중에서 앞서 이야기한 프로세서의 종속성을 실험하기 위해서 sshd---bash---su---bash---pstree중에서 bash나 su을 kill명령어(kill -9 PID)를 이용해서 종료시킨다면, 아마도 하위에 있는 자식 프로세서 bash와 pstree는 init와 연결고리가 끊어지게 되어서 종료되게 될 것입니다.

[참고]

BSD 계열의 부팅과정에서는 swapper가 sched를 대신하여 프로세서를 생성시킵니다. 그런다음에 init가 시작을 하지요. BSD와 System V의 부팅 과정은 아래와 같이 다릅니다.

BSD

System V

swapper        - 프로세서 0

sched       - 프로세서 0

init                - 프로세서 1

init            - 프로세서 1

pagedaemon - 프로세서 2

 

 

5. 리눅스 박스의 자세한 Sysvinit 작동 과정

System V 실제적인 이해는 Run-level에 대한 이해를 해야만 합니다. 유닉스 계열인 리눅스 박스에서는 Run-level이라는 독특한 방법을 사용하여 여러 가지 시작 방법을 가지고 있으며, 종료도 Run-level을 통해서 실행이 되어 집니다. Run-level은 각 배포판마다 다르지만, 일정한 형식을 따르고 있으므로 약간의 지식만 가진다면, 이해하기 쉽습니다. init작용을 이해해보기로 하겠습니다.

우선적으로 init는 lilo가 /etc/lilo.conf를 읽듯이 /etc/inittab를 읽습니다. 이 파일에는 리눅스 박스가 어떤 일부터 해야 할지를 상세하게 기술해 놓은 것입니다. 이 파일이 하드디스크에 없을 때는 리눅스 박스는 단일 사용자(single mode)모드로 부팅합니다. 여기서 initdefault를 읽어서 시스템의 run-level를 결정합니다.

레드헷 리눅스의 /etc/inittab파일의 내용을 한번 살펴보겠습니다.

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)
#
id:3:initdefault: 

이 설정은 기본 Run-level이 3임을 나타내 주고 있습니다.

# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit

시스템의 초기 시작 스크립터를 지정해 주고 있습니다.

l0:0:wait:/etc/rc.d/rc 0
l1:1:wait:/etc/rc.d/rc 1
l2:2:wait:/etc/rc.d/rc 2
l3:3:wait:/etc/rc.d/rc 3
l4:4:wait:/etc/rc.d/rc 4
l5:5:wait:/etc/rc.d/rc 5
l6:6:wait:/etc/rc.d/rc 6 

각 Run-level에 대해서 나타내 주고 있습니다.

# Things to run in every runlevel.
ud::once:/sbin/update

시스템 충돌을 보증하는 sync 명령어의 실행에 의해 모든 파일 시스템의 슈퍼블럭들을 정기적으로 갱신하는 프로세서입니다. 이 데몬은 일반적으로 bdflush라고 불려집니다. 리눅스에서는 update와 bdflush라고 불려집니다. 이 데몬은 파일 시스템 무결성을 보장합니다.

# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now

ctrl+alt+delete키를 누르면 shutdown 시킬 수 있는 설정입니다. 이것은 주석 처리하면 키가 먹지 않습니다.

 

pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"

리눅스박스에 UPS가 설치되었을 경우에 전원 불량 시그널이 수신되면 바라 shutdown 시키는 설정입니다.

 

pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"

만약 지정된 시간에 전원이 정사으로 돌아오면 shutdown 명령를 취소하는 설정입니다.

 

# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6

Run-level 당 표준적으로 실행되는 가상 콘솔의 정의입니다. 6개를 정의 했군요

# Run xdm in runlevel 5
# xdm is now a separate service
x:5:respawn:/etc/X11/prefdm -nodaemon

Run-level이 5개인 경우에 xdm을 실행하여 엑스윈도우 부팅을 가능하게 하는 설정입니다.

--------------------------

 

id:runlevels:action:process

보통 inittab파일의 기술 방식은 위와 같습니다. id는 보통 레이블입니다. 여러분이 쓰고 싶은 데로 1-4글자와 숫자로 사용이 가능합니다. runlevels는 말 그대로 run-level입니다. 이 명령이 어느 run-level에서 작동하기 원하는지 run-level 번호를 쓰면 됩니다. 위의 예제에서 처럼 복수로 , 2345라고 쓰셔도 되고, 3이라고 하나면 쓰셔도 됩니다. action은  init 프로세서에 있는 명령어입니다. process는 여러분이 실행시키고 싶은 명령어를 기술하시면 됩니다. 자세하게 알아야 할 것은 action 부분입니다.

action은 아래와 같은 명령어를 사용할 수 있습니다.

respawn : 프로세서가 종료되면 항상 다시 시작하게 하는  명령어입니다.

wait : 지정된 run-level에서 실행이 되고, init는 이프로세서가 종료되기를 기다립니다.

once : 지정된 프로세서가 한번만 명령어를 실행합니다.

boot : 시스템 부팅 때에 그 프로세스를 실행한다. 이때는 run-level값이 무시됩니다.

bootwait : boot 와  once의 기능을 합친 것입니다.

initdefault : 시스템의 기본 run-level을 지정합니다.

sysinit : 제일 먼저 실행이 됩니다.

process : 필드는 보통 생략됩니다.

powerwait : 전원에 문제가 생겼을 때 실행합니다. 프로세서 작업이 끝날 때까지 기다립니다.

powerfail : 위와 같으나, 프로세서 작업을 종료를 기다리지 않습니다.

ctrlaltdel : ctrl, alt, del키를 동시에 누르면 작동합니다.

kbrequest : 특정한 키를 입력 받을 때 실행합니다.

-----------------

[참고]

아직 하드 디스크를 정식으로 마운트하지 않았는데도 하드 디스크를 읽을 수 있지요 ? 그 이유는 처음에 커널도 시작될 때 부터, 하드 디스크를 읽기 모드로 설정하여 (read-only) 마운트하여 읽기 때문입니다.

 

init가 시작되는 시점은 커널의 하드웨어 찾기와 설정이 끝난 시점부터 시작이 됩니다. 아래의 메시지는 레드헷 기준으로 구성한 메시지입니다. 다른 배포판들에서 약간의 차이가 있습니다.

 

 

리눅스 배포판 중 레드헷/칼데라, 데비안, SuSE는 서로다른 INIT구조로 엮어져 있습니다. 서로 다른 사람들이 만들다 보니 같은 프로그램과 같은 리눅스를 만어도 아래 그림과 같이 서로 다른 INIT구조를 나타냅니다. 하지만, 기본적인 작동방식은 동일 합니다.

Redhat/Caldera

Debian

S.u.S.E

/etc/rc.d

init.d

/etc/

init.d

/etc/rc.d

rc

 

rc0.d

 

rc0.d

 

rc0.d

 

rc2.d

 

rc2.d

 

rc2.d

 

rc3.d

 

rc3.d

 

rc3.d

 

rc4.d

 

rc4.d

 

rc4.d

 

rc5.d

 

rc5.d

 

rc5.d

 

rc6.d

 

rc6.d

 

rc6.d

 

rc

 

rc.boot

 

rcS.d

 

rc.local

 

rc.S

 

boot.d

 

rc.sysinit

 

 

 

boot.local

 

 

 

 

 

boot.setup

레드헷/칼데라 리눅스에서는 run-level이 아래와 같습니다.

Run-level 0 - halt (시스템의 종료와 같습니다.)

Run-level 1 - single user (네트워크가 작동하지 않습니다.)

Run-level 2 - multi-user without NFS (NFS와 다수의 데몬이 작동하지 않습니다.)

Run-level 3 - multi-user with NFS (가장 일반적인 작동 모드입니다.)

Run-level 4 - not used (사용자가 정의해서 사용이 가능합니다.

Run-level 5 - X11 (xdm을 이용해서 엑스윈도우로 부팅)

Run-level 6 - reboot (리부팅 모드입니다.)

 

데비안 리눅스에서는 run-level이 다음과 같습니다.

Run-level 0 - halt (시스템의 종료와 같습니다.)

Run-level 1 - single user (네트워크가 작동하지 않습니다.)

Run-level 2,3,4,5 - multi-user(보통은 2로 작동하지만, 모두 다 사용자 정의로 설정이 가능합니다.)

Run-level 6 - reboot (리부팅 모드입니다.)

 

SuSE 리눅스에서는 run-level이 아래와 같습니다.

Run-level 0 - halt (시스템의 종료와 같습니다.)

Run-level 1 - single user (네트워크가 작동하지 않습니다.)

Run-level 2 - multi-user without network (네트워크 없는 다중 사용자 모드입니다.)

Run-level 3 - multi-user with network (가장 일반적인 작동 모드입니다.)

Run-level 4 - not used (사용자가 정의해서 사용이 가능합니다.

Run-level 5 - multi-user with network and xdm (xdm을 이용해서 엑스윈도우로 부팅)

Run-level 6 - reboot (리부팅 모드입니다.)

 

유닉스에서 실행시키고자 하는 프로그램(데몬)을 작동시키는 스크립트들을 한곳에 모여 두고 run-level에 따라서 rc0.d, rc1.d, rc2.d, rc3.d, rc4.d, rc5.d, rc6.d에 링크를 해 놓습니다. 이럴 때, 아주 간단한 법칙이 하나 있습니다.  S로 링크를 시작하는 것은  시작을 의미하는 것이고, K로 시작하여 링크해 놓은 것은 종료를 의미하는 링크입니다. 그 다음에 숫자는 우선 순위를 나타내는 것입니다. 위의 이런 법칙은 스크립트에 의해서 작동이 제어됩니다.

레드헷/칼데라에서는 /etc/rc.d/init.d/functions에서 찾을 수 있고, 데비안은 /etc/init.d/rc와 /etc/init.d/rcS에서 찾을 수 있습니다. SuSE에서는 /etc/rc.d/rc에서 찾아 볼 수 가 있습니다.

 

원본 스크립트들은  /etc/rc.d/init.d에 존재하면서 run-level 3에 링크되는 것을 보여주고 있습니다. 예제는 웹 데몬 httpd가 run-level 3에 S85httpd 이름으로 링크 되어 있는 것을 볼 수가 있습니다.

S : 시작             85 : 85번째              httpd : 데몬이름

또한 run-level 0에 15번째로 링크되어 있는 것을 볼 수가 있습니다. 만약 여러분이 부팅을 하면서 run-level 3으로 부팅을 하면, 웹데몬 httpd는 85번째로 실행이 됩니다. 그리고 다시 여러분이 리눅스 박스를 종료시키면 run-level 0이므로, 15번째로 웹데몬 httpd가 종료를 하게 됩니다.

 

전원을 켜면, 바이오스가 작동이 되고, root파티션의 MBR에 있는 LILO를 읽게 됩니다. LILO는 /etc/lilo.conf파일을 참조하여서 커널의 위치를 파악하고 읽습니다. 메모리에 적재한 커널을 일단, LILO는 압축을 풀고, 실행을 합니다. 이 때, 커널은 하드웨어의 디바이스를 찾고, 설정을 수행합니다. 그리고 난 다음, 커널의 sched로 시작된 init 프로세서가 /etc/inittab을 참조하여 초기화 작업과  run-level을 결정합니다.

 

[참고]

여러분이 리눅스 박스를 리부팅 한다면, 아래와 같은 메시지를 접하시게 될 것입니다.

INIT : Switching to runlevel : 6
INIT : Sending processes the TERM signal

리부팅도 단지 run-level이 6으로 바뀌는 과정에 불과 합니다. 이 모든 작용은 /etc/rc.d/rc6.d의 내용을 그대로 반영하게 됩니다.

시스템 작동중에 run-level을 바꾸려면 init명령을 쓰면 됩니다.

# init 3

또는

# init 5

 

지금 까지 리눅스 부팅과정에 대해 설명했습니다. 다음은 로그인 과정입니다.

6. 터미널 로그인(Terminal Login)

부팅 후에는 mingetty가 가상 콘솔을 열고, 사용자가 로긴하기 위해서는 login 프로그램이 작동하여 인증을 거치면, 쉘이 작동하게 됩니다.

 

로그인 화면에서 id 와 password을 입력하고, 엔터키를 입력하면, login은 /etc/passwd 파일에서  사용자 이름을 찾습니다.

없으면, Invalid login 메시지를 출력합니다. 있으면, /etc/shadow파일에서 암호화 된 password를 받아 비교합니다.

암호가 틀리면, Invalid login 메시지를 출력합니다.

/etc/securitty가 있다면, 로그인 보안 기능이 작동합니다. 즉, 합당한 우선권이 있는 사용자만이 이 파일에 열거된 tty들로 올바르게 로그인 되도록 허락합니다.

/etc/btmp가 있다면 login은 이 파일에 시도했다가 성공하지 못한 모든 로그인들을 기록합니다.

사용자가 세 번 연속적으로 잘못된 로그인 시도를 하면 login은 종료됩니다. 그렇지 않다면, 사용자 이름을 위한 "login:"을 출력하고, 되풀이 합니다.

암호가 일치하면,  사용자의 이름에대한 숫자인 사용자 ID, 그룹 ID, 그리고 홈디렉토리를 /etc/passwd의 필드에서 나타나는 대로 지정합니다. 또한, /etc/wtmp 파일을 갱신합니다. 이것은  올바른 로그인에 대한 발자취입니다.

login은 /etc/quota 명령을 실행하고, 사용자에게 시스템 관리자에 의해 지정된 쿼터를 넘어섰는지를 경고합니다.

/etc/passwd의 마지막 필드의 명령을 실행합니다. 일반적으로 사용자가 이용하고자 하는 쉘의 경로를 지정하는 것입니다. 필드가 비어있다면, Bourne 쉘을 디폴트로 시작할 것입니다.

 

 

 

[목차]

개인정보취급방침 서비스이용약관 모바일 버전으로 보기 상단으로

TEL. 063-469-4551 FAX. 063-469-4560 전북 군산시 대학로 558
군산대학교 컴퓨터정보공학과

Copyright © www.leelab.co.kr. All rights reserved.