|
카테고리
전체
제갈장비-Linux 제갈장비-TOMCAT 제갈장비-JAVA -------------------- 문서-Linux 문서-Powerbuilder 문서-JAVA 문서-ASP 문서-하드웨어 문서-EDPS 문서-MSSQL -------------------- TIP-JAVA TIP-Perl TIP-ASP TIP-Powerbuilder 01 TIP-Javascript TIP-Excel TIP-XML TIP-MSAccess TIP-PostgreSql TIP-Windows TIP-Linux TIP-HTML TIP-TOMCAT -------------------- ETC Secret Util-Japan 미분류 최근 등록된 덧글
잘읽어 보았습니다. 그런..
by 이윤철 at 11/07 1000 666 by qhrlfeh77 at 05/21 123 by qhrlfeh77 at 05/21 by qhrlfeh77 at 05/21 감사합니다!! HashSet.. by 세레네이 at 04/06 찾고 있었던 자료인데 .. by 나그네 at 01/09 감사합니다. 잘 보았습.. by 졸면죽는다 at 10/28 좋은 정보 정말 감사합니.. by 강성훈 at 10/22 좋은글 퍼가겠습니다. by 정의진 at 09/29 이제야 봤습니다. iText.. by 제갈장비 at 08/09 이글루 파인더
|
2006년 08월 06일
[프롤로그]
내 노트북에 데비안을 설치하느라 폭풍같은 일주일(?)을 보낸 후 다음은 뭘 해볼까 고민하다가 인터넷의 여러 문서를 보니 컴퓨터가 부팅된 후 리눅스를 기동하는데 이 리눅스가 처음으로 기동시키는 프로그램이 swapper 라는 프로세스라는 걸 알았다. 프로세스 번호도 멋있게 pid0 라고 한다. 그런데 이 swapper는 바로 /sbin/init라는 스크립트를 실행시키고 제어권을 init로 넘긴다고 한다. 그 다음에 생성되는 리눅스의 모든 프로세스는 init를 조상으로 섬긴다고 한다. 그래서 이번엔 init라는 걸 공부해 보기로 맘먹었다. 그전에 컴퓨터 부팅 과정이 있지만 조금 조사한 바로는 부팅과정을 간략히 파악하는 것은 그리 어려운 것은 아니었지만 좀 더 세부적으로 자세히 분석하는 것은 지금의 내 실력으론 머리만 아플것 같아서 뒤로 미루었다. 그게 정신건강에 좋을거 같아서다. 괜히 부팅과정 테스트한답시고 까불다가 또 하드웨어 해먹을까봐 관뒀다. 그럼... 이제부터 분석기를 적는데 LOOX에 Redhat7.2를 기본만 깔아서 실제 움직임을 보면서 하기로 했다. 지금은 데비안을 높은 옵션으로 설치해 놔서 재부팅을 계속해야 할 것 같은 init분석을 하기에는 부팅시간이 너무 오래 걸릴 것 같아서이다. 긴 기다림 짧은 만남........ 좀 LOOX가 불쌍해 보인다. 이상한 주인 만나 제 기능도 제대로 못해보고 세월만 죽이다가 지난 일주일동안 이제 좀 써주는가 보다 했지만 다시 재설치를 한다니... 하지만 계속 사용을 할거니까 너무 실망말아라 하고 토닥여주고 재설치를 했다. 이제까지 나는 내가 갖어왔던 기계들에 이름을 하나씩 붙여 줬었는데 이제보니 유독 LOOX에게만 이름을 붙여주지 않았었다. 좋은 생각이 떠오르면 이름하나 지어줘야 겠다. ------------------------------------------------- LOOX에 Redhat7.2를 가장 기본 옵션으로 설치했다. 단, 부트로더를 Grub는 나중에 하기로 하고 LILO로 했다. 인터넷 문서에 이 LILO로 설명된 것이 많기 때문에.... 설치를 시작하니 설치 펙케지수가 128개다. 데비안의 높은 옵션으로 설치할 때는 7백여개였는데 거기에 비하면 무지하게 적다. 화면상에 나타난 남은 시간이 2분정도 된다. 와~~ 하루에 10번도 더 재설치할 수 있겠다.... 라는 쓸데없는 생각도 해본다. 설치끝났다. 정말 빠르다. 정말 2분 조금 지나 끝나버렸다. 로그인 해서 우선 #ps [enter]하니 login bash ps 달랑 3개의 프로세스가 나온다. 이번엔 ps aux | less 해본다. 뭔가 무지 많이 나온다. 이건 나중에 알아보자. 화면을 보니 머리가 아프다. init를 살펴보자. 우선 init의 스크립트 화일은 /sbin/init 이다. 이걸 vi로 열었다. 뭔가 깨진 글자들이 가득 나왔다. ??? 또 틀렸다. 이건 바이너리 파일인가 부다. 다시 문서를 들여다 보니 init는 프로세스이고 이 init가 /etc/inittab 파일을 읽어서 그 안에 적혀있는 순서대로 실행한다고 한다. 뭐가 그리 급한지..... (문서를 좀 찬찬이 들여다 봐라!!!) 다시 vi로 /etc/inittab를 열었다. 주석 처리가 안된 라인을 옮겨보자 ------------------------------------------ id:3:initdefault: 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 ud::once:/sbin/update ca::ctrlaltdel:/sbin/shutdown -t3 -r now pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" pf:12345:powerrokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" 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 x:5:respawn:/etc/X11/prefdm -nodaemon ------------------------------------------ 음... 의미모를 말만 가득 적혀 있다. 이제부터 이걸 분석해 나가는 거다. 제일 처음의 id:3:initdefault:을 알아보자. 이부분은 실행 레벨을 정한다고 한다. 숫자 3이 실행레벨. 실행레벨에는 0 : 정지 1 : 싱글유저모드(루트만 로그인 가능) 2 : NFS 서비스를 제공하지 않는 다중 사용자 모드 3 : 모든 사용자들이 로그인 할 수 있고 시스템의 모든 기능 사용 가능 4 : 사용안함 5 : X윈도우로 시작 6 : 리부팅 이 있다. 그래서 위에는 처음에 3으로 되어 있나부다. 위의 내용은 inittab 파일에 주석처리되어 영어로 더 자세히(?) 적혀 있다. 데비안이 설치됐던 LOOX는 5로 되어 있었겠지? 이젠 확인이 안된다.... 그거 복사해 둘걸..... OTL(<-보기만 봤지 이거 내가 써보는게 여기가 처음이다.) 여기서 실행레벨을 하나씩 바꿔서 해보기로 했다. 우선 0은 정지니까 켜지자마자 정지될거 같아서 안하고 1로 바꿔서 재부팅 해보기로 했다. 로그인 화면도 안나오고 그냥 sh-2.05# 라는 프롬프트가 떨어진다. 이래서 싱글유저 모드인가 부다... 여기서 뭐가 되고 뭐가 안되고는 확인하지 않는다. 아니, 못한다. 모르니까...... 다음은 2로 바꾸고 재부팅.... 로그인 화면나오고 로그인.... 처음 3과 다를게 없어 보인다. NFS 서비스를 제공하지 않는다는데 몸으로 느껴지지 않는다. NFS 서비스가 뭐지? 이것도 그냥 패스... 다음 5로 하고 재부팅.... X윈도우가 설치안되어 있으니 뭔가 다르겠지? 로그인 나올 시점에 아래와 같은 메세지가 나온다. INIT: Id "x" respawning too fast: disabled for 5 minujtes 엔터를 치니 로그인 화면이 나온다. 음.... X가 없으니 텍스트의 로그인이 나오는가 보다. 기능은? 실행레벨 3과 같을까? 모르겠다. 다음은 사용 안한다는 4를 넣고 재부팅.... 한번 해보고 싶었다. 그냥 로그인 화면이 나온다. 실행 레벨은 뭘까? 넘어가자.... 1,2,3,4,5를 해봤다. 남은 건 0과 6이다. 주석에 이건 설정하지 말라고 써있다. 그래도.... 하드웨어가 망가지진 않을것 같다... 한번 해보잣... 최악으로 시스템이 죽기밖엔 더하것냐? 우선 0을 넣고 재부팅.... 어떻게 될려나아....... 역쉬.... 리로나오고 나서 부팅이 진행되다가 그냥 파워오프하고 꺼져버린다. 이걸 다시 실행레벨3으로 살리는 방법은 없나? 왜 설정하지 말라고 해놓곤 설정이 되도록 해놓은거냐? 그 이유를 말해다오.... 시간보내기 싫어서 그냥 재설치한다. 2,3분 정도 밖엔 안걸리니까.. 아니 부팅시간까지 5분정도 걸린다. 재설치... 오후1:52에 시작 오후 1:59에 재부팅 후 로그인 화면 뜸 7분 걸린다. 윗 사양의 기계라면 더 빠르려나? 나머지 6번 리부팅 옵션은 안할련다. 계속 재부팅될 것 같아서이고 재설치한다고 전원 껏다가 하드가 또 나갈거 같아서다. OK! id:3:initdefault: 는 뭔 말인지 알았다. 다음은 si::sysinit:/etc/rc.d/rc.sysinit다. 문서를 보니 /etc/rc.d/rc.sysinit를 실행하는 거라고 한다. 앞에 si::sysinit: 은 뭐지? 하여간 뭘 실행하는지 보기 위해 #vi /etc/rc.d/rc.sysinit 했다. 뭔가 프로그램같은 문장들이 화면 가득히 나온다. 뭐지? C 인가? 다시 문서를 보자. 주석에 "System initializatin." 이라고 되어 있다. 시스템 초기화를 하는건가 부다. 그리고 실행레벨과는 관계없이 꼭 한번은 실행이 되어야 할 스크립트라고 한다. 우선 넘어가자... 다음은 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 부분이다. 문서에 부팅레벨이 0번이면 /etc/rc.d/rc0.d의 내용들을 순차적으로 실행시킵니다. 부팅레벨이 1번이면 /etc/rc.d/rc1.d의 내용들을 순차적으로 실행시킵니다. 부팅레벨이 2번이면 /etc/rc.d/rc2.d의 내용들을 순차적으로 실행시킵니다. 부팅레벨이 3번이면 /etc/rc.d/rc3.d의 내용들을 순차적으로 실행시킵니다. 부팅레벨이 4번이면 /etc/rc.d/rc4.d의 내용들을 순차적으로 실행시킵니다. 부팅레벨이 5번이면 /etc/rc.d/rc5.d의 내용들을 순차적으로 실행시킵니다. 부팅레벨이 6번이면 /etc/rc.d/rc6.d의 내용들을 순차적으로 실행시킵니다. 라고 되어있다. 그럼 현재 실행레벨이 3이니까... 부팅레벨? 실행레벨=부팅레벨인가? 하여간 /etc/rc.d/rc3.d 화일이 실행되는가 부다. /etc/rc.d/rc3.d 를 열어봤다. 아무것도 없다. 왜지? ls -l 명령으로 /etc/rc.d 를 보니 rc3.d 가 화일이 아니라 디렉토리이다. 그래서 #cd /etc/rc.d/rc3.d 로 들어가서 #ls -l 해보니 화일이 나온다. 전부 어딘가에 링크되어 있는 화일이었다. 그럼 l3:0:wait:/etc/rc.d/rc 3 라는 명령이 /etc/rc.d/rc3.d 안의 화일들을 순차적으로 전부 실행하라는 뜻인가 보다. inittab 화일안의 명령들이 어떤 프로그램의 스크립트 명령이라는 걸 깜빡했다. 이 안의 링크파일들은 모두 /etc/rc.d/init.d 안의 파일들과 링크되어 있다 한다. 그리고 그 파일들을 실행한다. 정리하면 실행레벨별로 실행할 스크립트들을 모아둔 디렉토리가 따로 존재하는데 그 디렉토리의 화일들은 /etc/rc.d/init.d 안의 화일들과 링크되어 있기 때문에 어떠한 실행레벨의 초기실행명령들이라도 모두 /etc/rc.d/init.d 안에 넣어두고 실행레벨별 디렉토리에서 필요한 파일들만 링크를 걸어두면 된다는 얘기가 된다. 처음엔 좀 헷갈리더니 곰곰이 생각해 보니 그럴듯하다. 캬~~ 누가 짰는지 머리 좀 굴렸다. 음..... 뭔가 리눅스의 비밀을 알기 시작했다는 긴장감이 든다. 그리고 문서에는 첫글자가 K로 시작하는 건 해당스크립트를 죽이기 위한 것이고 S로 시작하는 건 해당 스크립트를 시작하는 것이라는데 내 디렉토리의 파일들은 전부 S로 시작하는 것만 있다. 왜 K로 시작하는 건 없지? 이것도 넘어가자.... 너무 기본옵션으로 설정해서 죽일게 없나부다... 그리고 마지막에 S99local -> ../rc.local 이라고 되어 있는걸 주의깊게 보라고 한다. #vi /etc/rc.d/rc.local 로 열었다. 그런데 touch /var/lock/subsys/local 밖에 없다. 참고 문서에는 뭔가 프로그램 같은게 잔뜩 있는데.... 리눅스를 너무 기본으로 깔았나? 이 파일은 새로 설치한 툴이나 프로그램을 부팅때마다 자동으로 실행되게끔 할 때 제일 마지막에 실행명령을 추가해주면 된다고 한다. 이 설명을 보고 뭔가 넣어 보고 싶은데 현재 새로 깐 프로그램이나 툴이 없다. 나중에 해보자.... 어떤 프로그램을 부팅때마다 자동으로 실행 시키고 싶을 때 /etc/rc.d/rc.local 의 마지막에 실행 명령을 넣어준다. 우선 위의 사항만 머리에 넣어 두자. 다음은 ud::once:/sbin/update 다. update를 man으로 보라고 한다. #man update bdflush - kernel daemon to flush dirty buffers back to disk. 라고 나온다. 뭔 말인지... 문서에는 bdflush라는 데몬을 실행하여 버퍼를 청소하는 역할을 한다고 되어 있다. 우선 그렇구나.... 하고 넘어간다. 다음 ca::ctrlaltdel:/sbin/shutdown -t3 -r now 다. 이건 유저가 Ctrl + Alt + Delete 키를 눌렀을 때 /sbin/shutdown 을 실행한다. 위의 경우에는 3초후 Shutdown을 시작한다. 이 명령은 나도 자주 하는 명령이라서 이해하기가 쉽다. 단지, 스크립트형식으로 써 있어서 좀 색달라 보인다. Ctrl + Alt + Delete 를 눌러봤다. Shutdown 된다. 그리고 재부팅된다. 다음 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"는 UPS 전원 부족시에 자동으로 셧다운 시킨다. 다음 pf:12345:powerrokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"는 UPS 전원이 충전되어 전원 공급에 문제가 없는 경우 실행한 셧다운 명령을 취소한다. 이정도로 넘어가자. UPS가 없다. 다음 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 이것은 가상 콘솔로 로그인을 위해 실행하는 것이라고 한다. 그리고 2345라고 연속으로 적혀 있는 것이 실행레벨이란다. 2,3,4,5의 실행레벨에서 이 가상콘솔 로그인이 되는 것이다. [참고] 가상 터미널 접속을 위한 프로토콜 : mingetty, uugetty, agetty, mgetty가 있다. respawn : 커널 메모리상에서 프로세스가 실행되었다가 죽으면 다시 실행되도록 해주는 명령이다. 로그인한 후 모든 작업을 마치고 로그아웃하고 나면 다시 로그인 화면이 뜨는 이유는 바로 이 respawn 옵션을 보고 init가 계속적으로 mingetty 프로그램을 수행하기 때문이다. 한번 변경시켜보자. 우선 현재 Alt + F1 ~ F6까지 로그인 화면이 나오는지 확인했다. 6개 모두 된다. 다음 /etc/inittab 를 수정했다. 4번부터 6번까지 주석처리하고 재부팅 했다. 로그인을 확인해 봤다. Alt+F1 , F2 , F3까지 되고 Alt+F4부터는 눌러도 화면이 안바뀐다. 신기하다. 내가 이런 조작을 할 수 있게 될 줄이야.....^^ 잊어먹기 전에 원상복귀 시켜놓았다. 다음은 마지막인 x:5:respawn:/etc/X11/prefdm -nodaemon이다. X-window 실행 레벨이라고 한다. 뭔가 실행레벨에 대한 설명이 더 있을 것 같아서 찾아봤는데 눈에 띄는게 없다. 끝났다. 뭔가 많이 배운 느낌이다. 이 일기의 수직바도 꽤 쪼끄매졌다. 그게 좋은건지 나쁜건지..... 마지막으로 파일을 수정한 후 바로 적용을 할 수 있다고 한다. #init q 좀 전 까지 재부팅 했는데..... 이젠 재부팅 안해도 된다. 좀 전에 가상콘솔 띄우는 옵션 변경했던 것을 재부팅없이 확인해 봤다. 잘 된다. 원래 init분석기도 여러날에 걸쳐 적게될 줄 알았지만 공부하다보니 셸스크립트에 대한 지식이 전혀 없어서 그냥 /etc/inittab 만 분석하기로 했다. init 프로세스에 대한 좀 더 세부적인 사항은 셸스크립트를 공부하고 나서 하기로 하고 아쉽지만 여기서 접기로 했다. ----------------------------- [요점정리] 리눅스가 제일 처음 실행하는 프로그램 : /sbin/init /sbin/init 는 /etc/inittab 의 내용을 순서대로 실행레벨에 맞게 실행한다. 실행레벨을 인식한다. 실행레벨에 맞게 정의된 스크립트를 실행한다. (예 : /etc/rc.d/rc3.d 의 파일 --> /etc/rc.d/init.d 안의 파일을 실행) 부팅때마다 실행할 프로그램은 /etc/rc.d/rc.local 에 정의해 둔다. 가상콘솔창을 준비해 둔다. [궁금하고 알아볼 것] 싱글유저 모드에 대해서 좀 더 자세히.... NFS 서비스가 뭐지? [참고 사이트] http://ai.korea.ac.kr/~kaizer/unix/linuxboot.htm http://blog.naver.com/keyes?Redirect=Log&logNo=100024108460 http://blog.naver.com/mizoony?Redirect=Log&logNo=24221169
| |||||