리눅스커널 QnA 이번호에서는리눅스의핵심이라할수있는커널에대해리눅서들이주로궁금해하는부 분을중심으로 QnA 형식으로엮어보았다. 이글을읽고커널이결코해커만의전유물이 아니라리눅서라면누구든쉽게친해질수있다는것을알수있는계기가되었으면한다. 오늘과내일넷센터홍석범 (antihong@tt.co.kr) 문 ) 커널과리눅스는어떤관계입니까? 답 ) 가끔리눅스를사용하시는분께운영하는리눅스서버의버전이어떻게되냐고물으면 6.2 또는 7.1 이라고말씀하십니다. 그러나엄격히말한다면이는틀린대답입니다. 왜냐하면이는단지일부배포판업체나기관에서커널을기반으로 GNU 유틸리티와각벤더의유틸리티를포함하여패키징을한배포판에붙인임의의버전일뿐이며실제로리누스가관리하며발표하는리눅스 ( 커널 ) 와는직접적으로관계가없기때문입니다. 리눅스는그자체로, 일반적으로이야기하는넒은범위의리눅스라는운영체제의핵심부분이라할수있는 커널 을뜻하는것이며, 따라서정확하게이야기한다면리눅스란커널을뜻하는것입니다. 그러나일반적으로는커널및각종패키지를포함한각벤더의배포판을그냥리눅스라칭하기도합니다. 문 ) 왜리눅스커널은 C 와어셈블리로만들어졌나요? 답 ) 여러가지가이유가있습니다. 첫번째는리눅스커널의창시자인리누스가 Linux 를쓰기시작할때처음사용한것이 386 의 Minix OS 와 gcc 이었기때문입니다. 그리고이론적인측면에서보면어떠한 OS 든전제혹은부분적으로커널은항상어셈블리어로쓰여졌기때문입니다. 이는어셈블리가하드웨어에가장가깝고또한밀접한언어이기때문입니다. 또다른한편으로 OS 디자이너들은전통적으로 UNIX 를포함하여많은 OS 커널루틴을 C 로만들어왔기때문이기도합니다. 문 ) /usr/src 에서리눅스커널소스를압축해제하면 linux-x.y.z 대신 linux 로풀려서 linux 를 linux-x.y.z 로 rename 한후 linux 로링크를하는데, 이렇게하는이유가무엇인가요? 그리고아예처음부터 linux-x.y.z 로풀리지않는이유가있나요? 답 ) 물론꼭이렇게할필요는없습니다. 단지 /usr/src 디렉토리에여러버전의리눅스커널소스를가지고설치를할때각소스간에버전의구별을쉽게하기위해서입니다. 그래서 linux 를현재사용중인 linux-버전으로링크를하여사용하는것이지요. 그리고압축해제시처음으로풀리는디렉토리이름이 linux 인것은리누스가이방식을선호하기때문입니다. 이와같이하였을경우패치를할때마다매번디렉토리이름을
rename 할필요가없고더쉽고간단히패치등의작업을할수있기때문이지요. 문 ) 커널컴파일을잘못하면부팅이아예안될수도있다던데요. 꼭해야합니까? 답 ) 그럴수도있고그렇지않을수도있습니다. 어떤분은커널컴파일을해보았냐해보지않았느냐에따라리눅스초급과중 / 고급을나누는기준이될정도로커널컴파일은리눅스중급자로가기위한필수조건이라고생각합니다. 다시원론으로돌아와서이야기하면커널컴파일과정은결론적으로새로운하나의커널이미지를생성하는것인데, 부팅시여러커널이미지중어떤커널이미지로부팅할것인지선택할수있습니다. 따라서만약새롭게생성한커널이미지로부팅이되지않는다면이전의커널이미지를선택하여재부팅을하시면되는것입니다.( 물론 lilo 설정에서복수개의이미지로부팅할수있도록설정해야합니다.) 부팅시 LILO: 상태에서부팅할커널이미지를선택하는부분을상기해보시면이해가가실겁니다. 따라서커널컴파일을한다고부팅이아예안될수도있다는것은틀린말입니다. 그러니걱정하지마시고마음껏커널컴파일에도전해보세요. 그리고커널컴파일및업그레이드를하는이유는크게 보안 과 성능향상 이라는두가지로설명할수있습니다. (1) 시스템보안 (Security) 을위해. 아래는얼마전실제로필자가운영하는리눅스서버에서테스트한결과입니다. [user1 @www user1]$ id uid=500(user1) gid=500(user1) groups=500(user1),10(wheel) [user1 @www user1]$ gcc exploit.c -o exploit [user1 @www user1]$./exploit bug exploited successfully. enjoy! bash# id uid=0(root) gid=0(root) groups=500(user1),10(wheel) bash# uname -a Linux kernel.tt.co.kr 2.2.18 #1 SMP Tue Nov 21 01:22:41 KST 2000 i686 unknown bash# exit 이버그는리눅스배포판과관계없이커널버전 2.2.19 이전의모든시스템에통용되는버그로서통상적으로가장많이사용하는레드햇 6.x 계열을설치후커널업그레이드를하지않았다면초기배포판버전대로커널이 2.2.16 이므로위버그가바로적용이되어, 일반유저권한만있으면위소스를 gcc로컴파일후실행하여바로 root 권한을획득할수있게되는치명적인문제가있습니다. 위와같이리눅스커널에서치명적인보안문제가
발생하는일은그리흔한일은아니지만이러한경우가가끔발생하므로시스템의보안을 위해지속적으로커널패치또는업그레이드를하시는것이좋습니다. (2) 확장된기능과최적화된성능을위해리눅스를서버로사용하거나특정한목적으로사용한다면서버의성능을높이기위해 CPU를 Dual 로한다거나메모리를추가로장착하기도합니다. 그러나실제물리적인성능을높이기보다는시스템의핵심인커널과각종데몬의설정을최적화함으로써더욱가시적인향상을기대할수있는경우가많이있습니다. 일반적인리눅스배포판의커널은배포판을이용하는유저들이어떤하드웨어를사용하는지그리고어떤목적으로사용할것인지알수없으므로여러다른종류의하드웨어와상당수의설정들을지원하도록설정되어배포되므로커널이미지의크기가당연히커질수밖에없고, 사용하지않는여타기능들이많이추가되었으므로시스템에최적화되지못해당연히성능이떨어지게돕니다. 혹이전에커널컴파일을한적이없다면 /usr/src/linux 로이동한후 make menuconfig 를입력후 Network device support ---> Ethernet (10 or 100Mbit) ---> 를선택해보시기바랍니다. 실제사용하지도않는모든이더넷카드가모듈로선택되어있고이것들이현재시스템의커널모듈에올라가있습니다. 이렇듯불필요한기능을커널에포함시키거나모듈로설정하였을경우시스템이전반적으로무거워지고많은메모리를소모하게되지요. 또한정작자신에게필요한기능은커널에포함되지않는경우가있어특수한기능을이용하거나자신에게필요한기능만을선택하여사용할수있도록하기위해커널컴파일이필요하기도합니다. 이를테면리눅스를이용해라우터로이용하거나클러스터링을구성하려면반드시커널패치및컴파일이필요하게되지요. 문 ) 커널컴파일하는방법을알려주세요? 답 ) 각각의절차에대한자세한설명은 http://kernel.pe.kr/ 이나 http://kldp.org/ 리눅스 _ 커널 / 커널 _ 컴파일 / 를참고하세요. [root@work /usr/src]# rm -f linux [root@work /usr/src]# tar zxvfp linux-2.4.8.tar.gz [root@work /usr/src]# mv linux linux-2.4.8 [root@work /usr/src]# ln -s linux-2.4.8 linux [root@work /usr/src]# cd /usr/include/ [root@work /usr/include]# rm -rf asm linux scsi [root@work /usr/include]# ln -s /usr/src/linux/include/asm-i386 asm [root@work /usr/include]# ln -s /usr/src/linux/include/linux linux [root@work /usr/include]# ln -s /usr/src/linux/include/scsi scsi [root@work /usr/include]# cd /usr/src/
[root@work /usr/src/linux]# make menuconfig [root@work /usr/src/linux]# make dep; make clean; make bzlilo; make modules; make modules_install /etc/lilo.conf 설정변경후 [root@work /boot]# /sbin/lilo 문 ) 커널컴파일은하지않고그냥편하게 rpm 으로커널업그레이드만하는방법을알려주세요. 답 ) 이방법은그리권장하는방법은아니므로가급적이면커널소스를가지고와서직접커널컴파일을하시기바랍니다. 하지만커널컴파일이익숙하지않은상태에서단순히커널버전만을업그레이드하기를원할경우이방법을사용하시면됩니다. 먼저레드햇의경우 ftp://updates.redhat.com/ 에서각버전에맞는최신버전의 Kernel RPM 을가져옵니다. ( 레드햇에서패키징하는 Kernel RPM 은배포한이전커널버전에치명적인문제가있을경우에만업데이트된 RPM 을패키징하므로일반적으로소스로배포되는최신버전보다는버전이낮습니다.) 여기에서는레드햇 7.X 에서 Kernel-2.4.3-12 버전을기준으로하여설명하도록하겠습니다. 먼저다운로드받은 kernel 을 rpm -Uvh 옵션을이용하여업그레이드합니다. 만약의존성에러가날경우에는 rpm Uvh -nodeps 옵션을주어설치를하면됩니다. # rpm -Uvh kernel-source-2.4.3-12.i386.rpm Preparing... ########################################### [100%] 1:kernel-source ########################################## [100%] # rpm -Uvh kernel-headers-2.4.3-12.i386.rpm Preparing... ########################################### [100%] 1:kernel-headers ########################################### [100%] # rpm -Uvh kernel-2.4.3-12.i386.rpm Preparing... ########################################### [100%] 1:kernel ########################################### [100%] 이렇게하고나면 /boot/ 에 vmlinuz 및 System.map 등몇가지링크가자동으로생성됩니다. 그리고이제는 mkinitrd 명령어를통해 RAMDISK 파일을생성할차례입니다. # mkinitrd /boot/initrd-2.4.3-12.img 2.4.3-12 mkinitrd 실행시형식은 /boot/initrd-( 커널버젼 ).img 커널버젼입니다. 그리고부팅시업데이트된새로운커널로부팅할수있도록 LILO 에등록하면됩니다. /etc/lilo.conf 를읽어이전버전의내용을그대로복사한다음, initrd 부분과 vmlinuz 부분의설정을업그레이드한버전으로변경합니다. 적절히수정한후 /sbin/lilo
명령어를실행하고재부팅을하면됩니다. 다시한번말씀드리지만 rpm 의커널은많은옵션들이모듈로선택되어있기에커널이미지의크기가크고 ( 커널컴파일후 /boot 디렉토리에있는양커널이미지의사이즈를서로비교해보세요.) 커널은메모리에올라가작동하므로커널의크기가큰만큼메모리도많이소모하게됩니다. 따라서 rpm 으로설치하셨다하더라도가급적커널컴파일을하여시스템에최적화하실것을권장합니다. 문 ) 커널업그레이드를하려고하는데, 어떤커널버전을받아야하나요? 현재대부분의유저들이사용하는커널버전은 2.2.X 버전이거나일부 2.4.X 일것입니다. 2.2.18 을포함한이전버전의경우위에서설명한바와같이심각한보안버그가있으므로반드시 2.2.19 이상버전으로업그레이드를하시기바라며, 아울러잘아시다시피 2.4.X 버전부터는엔터프라이즈급에맞도록커널코드가상당히개선되었으므로가능하시다면 2.4.X 대의커널을사용하시는것이좋습니다. 그리고커널버전은두번째번호가짝수인가홀수인가에따라안정버전과개발버전으로나뉘어지는데, 개발버전의경우테스트단계이므로일반유저들은특별한경우가아니라면 2. 짝수.X 형태의안정버전을사용하셔야합니다. 아울러 2.4.X 일부버전에도리눅스가작동중갑자기멈추어버리거나특정한프로세스가작동하지않는등의버그가있으므로가급적이면이러한문제를해결한가장최신버전을받으시는것이좋습니다. 현재최신버전은 # finger @finger.kernel.org [zeus.kernel.org] The latest stable version of the Linux kernel is: 2.4.8 The latest prepatch (alpha) version *appears* to be: 2.4.9-pre2 로확인가능하며 8 월 14 일현재 2.4.8 이최신안정버전입니다. 최신버전의커널은 ftp://ftp.kernel.org/ 나한국의미러사이트인 ftp://ftp.kr.kernel.org/ 에서다운로드가능합니다. 문 ) 커널컴파일을하기전에 /usr/include 에서 asm, linux, scsi 등을링크하라고하던데, 링크를하는이유는무엇인가요? 답 ) /usr/include 디렉토리는표준 C 라이브러리헤더파일이있는디렉토리입니다. 따라서 /usr/include 디렉토리에서압축을해제한커널소스에있는디렉토리로링크를하는이유는소스내에 #include 를하는파일들은기본적으로현재소스의위치와는관계없이 /usr/include 디렉토리에서해당링크파일을찾기때문입니다. 예를들어커널소스내에 #include <linux/config.h> 와같이파일을참조하고있다면 /usr/include/linux 디렉토리에있는 config.h 라는헤더파일을찾게되는것이지요. 실제로커널소스의헤더파일들은커널소스 (/usr/src/linux/) 의 include 디렉토리아래에있습니다.
문 ) 커널컴파일옵션선택시모듈로하는것이좋나요? 아니면정적으로 (Static 하게 ) 포함시키는것이좋나요? 답 ) 이는어떤옵션을선택하고어떤목적으로시스템을사용하느냐에따라다릅니다. 모듈기능은매우유용하기는하지만그렇다고해서모든옵션에모듈을적용하는것은바람직하지않습니다. 사용하지않는기능은과감히선택하지말고꼭필요한기능만을선택하되자주사용하는기능은모듈보다는정적으로선택하여커널에포함하는것이좋습니다. 왜냐하면모듈은커널에서직접지원되는것보다는느리기때문이지요. 이를테면이더넷카드 ( 랜카드 ) 의경우모듈로선택하는것보다커널에정적으로포함시키는것이약 10-15% 정도더나은성능을발휘하는것으로알려져있습니다. 문 ) 커널컴파일시특히주의하여야하는옵션에대해알려주세요. 답 ) 커널컴파일시각각의옵션에대해잘알고자신의하드웨어사양에따라꼭필요한기능만선택하는것이중요하지만특히아래의설정을잘못했을경우성능을크게좌우하고심할경우에는정상적으로부팅이안될수도있으므로주의하셔야합니다. (1) 적절한 CPU 타입선택 Pentium 3, AMD K6, Cyrix, Pentium 4, Intel 386, DEC Alpha, PowerPC등시스템의 CPU 에맞는타입을선택하셔야합니다. 만약 cpu 선택메뉴에서 386을사용하면모든 CPU 에서사용가능하나 Pentium-III 를선택하면펜티엄이나 486의경우에는사용할수없게되니주의하시기바랍니다. 즉, 자신의현재사양보다낮은타입을선택할수는있으나현재사양보다높은타입은선택할수없습니다. 현재의시스템에서어떤 CPU 를사용하는지잘모르겠으면 cat /proc/cpuinfo 로확인하면됩니다. "Pentium-Classic" -- 인텔펜티엄의경우선택 "Pentium-MMX" -- 인텔펜티엄 MMX의경우선택 "Pentium-Pro" -- 인텔펜티엄프로 / 셀러론 / 펜티엄II의경우선택 "Pentium-III" -- 인텔펜티엄 III 의경우선택. (2) SMP 지원여부현재시스템이 Single CPU 인지아니면 Dual CPU 인지에따라선택사항이다소달라집니다. Single CPU 인데 SMP 를선택하거나, Dual CPU 인데 SMP 를선택하지않는것은시스템의안정성이나성능상으로좋지않습니다. (3) 파일시스템리눅스에서사용할파일시스템을적절히선택합니다. 이때파일시스템을잘못선택하거나모듈로설정할경우부팅이되지않을수도있으니주의하셔야합니다. (4) 커널모듈을로드할수있도록하기
Loadable module support ---> 에서 Enable loadable module support 을선택합니다. 이옵션으로현재작동하고있는리눅스시스템에서도 insmod 와 rmmod 등을이용하여운영체제가작동하고있는상태에서도동적으로모듈을올리거나내릴수있습니다. 문 ) 레드햇리눅스를사용하고있는데, 커널컴파일을하려고보니 /usr/src/redhat 만있고 /usr/src/linux 는없네요. 뭐가문제죠? 답 ) /usr/src/redhat 는 RPM 패키징를하기위해필요한디렉토리이며커널과는직접적으로관계가없습니다. /usr/src 에 linux 디렉토리가없는경우라면 CD 를이용하여리눅스설치시커널소스를선택하지않고설치하셨기때문이므로단순히 CD에서 kernel-source rpm 을설치하시거나커널소스를다운로드받아설치하시면 linux 디렉토리에커널소스사설치됩니다. 문 ) 방화벽을설정하기위해 iptables 를사용하려고합니다. 커널을어떻게설정해주어야사용가능하나요? 답 ) iptables 는커널레벨에서작동하는패킷필터링툴이므로커널에서지원이되어야사용가능합니다. Iptables 를사용하기위해서는 Networking options ---> [*] Network packet filtering (replaces ipchains) 를선택하면하단에 IP: Netfilter Configuration ---> 메뉴가생깁니다. 이부분을선택한후 <*> Connection tracking (required for masq/nat) <*> FTP protocol support <*> IP tables support (required for filtering/masq/nat) <*> Packet filtering <*> Full NAT 를선택하면됩니다. 그러나보다확장된기능의 iptables 를사용하려면모든옵션을다선택하시면됩니다. 그리고 iptables 실행파일은별도로설치하여야하는데, http://netfilter.samba.org/ 에서 iptables 소스파일을다운로드받아압축해제후 make ; make install 로설치를해도되고 http://rpmfind.net/ 에서각자의버전에맞는 rpm 형태의 iptables 를다운로드받아설치하여도됩니다. 문 ) 정식커널과알랜콕스의 ac 패치버전과는어떤차이가있나요? 답 ) 알랜콕스는리누스와함께핵심적인커널개발자중의한사람으로커널개발자사이에서는리눅스커널의어머니라고도칭합니다. 커널메일링리스트에서도알랜콕스의제안과글을많이볼수있는데, 일반적으로
알랜콕스의패치를리누스의커널에대한테스트버전정도로생각하면됩니다. 리누스는커널에대해다소보수적 (?) 이고조심스러워수많은테스트를거쳐완전히안정하다고확신이되었을경우에만커널에포함시키는반면알랜은다소새로운개념과새로운기능의드라이버, 더욱공격적인코드를포함시키는성향이있습니다. 알랜콕스의패치를통해안정하다고판단되었을경우알랜은리누스에게이패치를보내어정식커널에포함시키도록합니다. 알랜콕스를포함하여여러커널개발자들의패치를적용하려면 http://www.kernel.org/pub/linux/kernel/people/ 사이트를참고하면됩니다. 그리고리누스에의해발표되는 Pre 패치도있는데, 이는다음버전의공식커널발표전에실제로잘동작하는지테스트해보려는기능들에대한패치입니다. 이를테면 8 월 14 일현재안정버전은 2.4.8 인데, 프리패치는 2.4.9-pre2 입니다. 문 ) 패치버전을이용하여커널을패치하는방법을알려주세요? 답 ) 커널을업그레이드하고자할때현재의커널버전에서완전히새로운커널소스를가지고와새롭게컴파일하여설치하는방법도있지만 20 여메가가넘은압축소스를일일이다운로드하여커널을재설치하는것이부담이될때에는간단히패치를하는방법도있습니다. 커널패치를하는방법에대해서는각각리눅스커널패치, 알랜콕스의패치, 프리패치에대해설명을드리겠습니다. 현재의커널버전이 2.4.5 인데 2.4.7 로업그레이드를하고자할때에는먼저커널 2.4.5 소스가있는 /usr/src/linux 로이동하여패치파일의압축을해제한후 [root@work /usr/src/linux]# patch -p1 < patch-2.4.6 로 2.4.5 을 2.4.6 로패치합니다. 그리고 [root@work /usr/src/linux]# patch -p1 < patch-2.4.7 로 2.4.6 을 2.4.7 로추가패치합니다. 그리고현재의 2.4.7 에알랜콕스의 2.4.7-ac8 를패치하고자한다면 [root@work /usr/src/linux]# patch -p1 < patch-2.4.7-ac8 로 2.4.7 를 2.4.7-ac8 로패치하면됩니다. 일반적인커널패치는이전버전까지의패치가모두들어있다는가정에서만들어진패치이므로 2.4.5 에서 2.4.7 로패치를하려면 2.4.5 에서바로 2.4.7 로패치할수없고 2.4.5->2.4.6->2.4.7 순으로순서대로패치하여야합니다. 반면에알랜콕스의패치는이와달리상위버전의패치가하위버전의패치를포함하고있으므로한번만패치를하시면됩니다. 따라서 2.4.7-ac8 에서 2.4.7-ac9 로패치를하려면이미 2.4.7-ac9 에는 ac8 의패치를포함하고있으므로바로패치할수없고먼저역패치를한후다시패치하여야합니다. [root@work /usr/src/linux]# patch -p1 -R < patch-2.4.7-ac8
위와같이 -R 옵션을주어역패치를하면전혀패치가가해지지않은 2.4.7 원본커널소스로만들어줍니다. [root@work /usr/src/linux]# patch -p1 < patch-2.4.7-ac9 이후위와같이깨끗한상태의 2.4.7 에서 2.4.7-ac9 로패치하시면됩니다. 그리고 2.4.8 에서 2.4.9-pre1 으로패치하려면 [root@work /usr/src/linux]# gzip -d patch-2.4.9-pre1.gz 와같이 patch-2.4.9-pre1.gz 를압축해제한후 [root@work /usr/src/linux]# patch -p1 < patch-2.4.9-pre1 를적용하면됩니다. 문 ) lilo.conf 에보면 initrd 라는것이있는데, initrd 는무엇인가요? 없는경우도있던데, 꼭필요한가요? 답 ) initrd 란부팅시초기화에필요한루트디스크의이미지를나타내는것으로특히 SCSI 하드디스크를사용할때중요합니다. 만약 SCSI 하드를사용할경우 SCSI 부분을커널옵션에서모듈로설정했다면, 부팅시램디스크이미지를생성하지않았을경우 SCSI 하드를인식할수없게되므로결국은부팅을할수가없게됩니다. 이러한이유로램디스크의이미지를만드는것이지요. CD 를이용하여리눅스운영체제를처음설치할때는이러한경우를대비하여 lilo.conf 에 initrd 부분이추가되는것입니다. 물론 SCSI 가없거나 SCSI 부분을커널옵션에서모듈로설정하지않고정적으로포함하였을경우에는 ( 즉메뉴에서 * 로선택하였을경우 ) 굳이 initrd 설정이필요하지않으므로이부분을삭제하셔도됩니다. 가급적이면커널컴파일시 SCSI 부분을모듈로선택하지말고정적으로포함시키기바랍니다. 문 ) System.map 은어떤기능을하는것입니까? 꼭필요한파일인가요? 답 ) 만약커널패닉 (Kernel Panic) 이일어나거나기타커널과관련된문제가발생할경우에는화면에여러가지레지스터들과그에해당하는 16 진수와관련된페이지의정보가출력되게됩니다. /boot/system.map 파일이있을경우에는그주소가나타내는함수이름으로변환해주어어떤위치에서어떤원인으로커널이문제를일으켰는지쉽게판단할수있도록디버깅해주는역할을합니다. 그러나 System.map 파일이없다면 c01000cb 와같이전혀이해할수없는 16 진수주소들만을보게될것입니다. 따라서 System.map 파일이없이도부팅하는데에는문제가없습니다만만일에발생하는문제에대비하여반드시설정하실것을권장합니다. 문 ) 커널튜닝에는어떤방법이있습니까? 답 ) 시스템을최적화하거나자신의필요에따라커널설정을수정하여야할필요가있는경우가있습니다. 이때는커널컴파일을하기전에커널소스를직접수정한후커널컴파일을할수있는데, 이를하드레벨튜닝이라하며이를통해파일오픈개수나처리할수
있는프로세스개수등의제한을변경할수있습니다. 반면에커널이제공하는파라미터값을 /proc 파일시스템을이용해서부팅이완료된시점후에변경할수있는데, 여기서는주로파일시스템과네트웍자원에관련된내용에대해서튜닝을합니다. 이러한방법을소프트레벨튜닝이라하는데, 이방법으로설정되는값들은시스템이부팅되면서원래의값으로초기화되어부팅시스크립트를통해설정되어야되기때문에 /etc/rc.d/rc.local 파일이나 /etc/sysctl.conf 파일에설정하여야합니다. 소프트레벨튜닝으로설정가능한값은 sysctl a 로확인할수있습니다. 커널튜닝은시스템에끼치는영향이크므로조심스럽게설정하셔야합니다. 문 ) 잘운영되다가 Kernel Panic 이라며시스템이멈추어버리는경우가있는데, 이런경우에는어떻게하여야하나요? 답 ) 커널패닉은매우많은경우에발생할수있습니다. 시스템의과부하로인한문제일수도있고 CPU 나메모리등하드웨어의불량으로발생할수도있습니다. 따라서커널패닉이발생할경우에는콘솔이나로그파일에패닉에대한메시지가남으므로로그메시지를근거로아래의사이트를참고하여커널패닉의이유를찾아보시기바랍니다.( 이를위해서는일정정도의 C 언어의해석능력이있어야합니다.) http://linux.fh-heilbronn.de/doku/linux/linux-2.4.7/r/panic.htmlz 예를들어설명하면필자가운영하는한시스템의 ( 커널 2.4.7) 경우 [root@www log]# cat messages grep panic Jul 22 14:57:45 www kernel: Kernel panic: CPU context corrupt Jul 25 19:25:30 www kernel: Kernel panic: CPU context corrupt 와같이 2-3 일에한번씩 "CPU context corrupt" 라는메시지를내면서커널패닉이발생한적이있었는데, 이는하드웨어와관련하여주로다음과같은경우에발생한다고알려져있습니다. (1) CPU 를 overclocking 하였다. (2) CPU 가불량이다. (3) 전압이문제가있거나전원상태가좋지않다. (4) 주위온도가높다. 커널패닉의구체적인원인과대처법에대해서는아래에서설명할커널메일링리스트 (http://www.uwsg.indiana.edu/hypermail/linux/kernel/index.html ) 에서검색하면도움을받으실수있습니다. 문 ) 새로운기능을시험해보려고커널컴파일을하기위해옵션을살펴보니몇가지옵션이보이지않습니다. 커널소스를다시받아야하나요? 답 ) 커널옵션중
Code maturity level options ---> Prompt for development and/or incomplete code/drivers 부분을선택하셨나확인해보시기바랍니다. 네트워크드라이브나파일시스템등리눅스커널에서지원하는많은기능중일부는아직안정화단계가아닌개발단계에있어서기타기능이나안정성측면에서안정적이지않을경우가않습니다. 이러한상태를 알파테스트상태 라고하는데, 위옵션을선택하지않으면이러한단계에있는메뉴들이보이지않게됩니다. 따라서만약선택하려는메뉴가보이지않을경우이옵션을선택하시면보이실것입니다. 문 ) 커널컴파일후부팅을하려고하니 Uncompressing.. Ok, booting the kernel 메시지까지만나오고멈추어서부팅이되지않습니다. 답 ) 새롭게컴파일한커널로적용시부팅이되지않는다면커널옵션에서어딘가실수를하셨기때문입니다. 위와같은메시지만나오는경우는대부분커널컴파일옵션중 Processor type and features ---> 에서 CPU Type 을잘못선택하셨기때문이므로이부분을살펴보시고자신의 CPU 타입에맞는 CPU 를선택한후재컴파일해보세요. 문 ) 커널컴파일후모듈컴파일까지했는데, 생각해보니옵션을하나잘못선택한것이있습니다. 이러한경우처음부터다시해야하나요? 답 ) 그러실필요는없습니다. 단지커널옵션수정후 make bzlilo( 또는 make bzimage) 만실행해주신후루트파티션 (/) 에새로운커널이미지인 vmlinuz 와 System.map 파일이생기므로이파일들만이전의설정파일에덮어쓰시면됩니다. 문 ) uname r 을실행하면커널버전이나오는데, 실제커널버전이아니라커널버전을제마음대로설정하고싶습니다. 어떻게하면되나요? 답 ) /usr/src/linux/ 디렉토리에 Makefile 이있는데, 이파일의제일윗줄에있는 VERSION = 2 PATCHLEVEL = 4 SUBLEVEL = 8 EXTRAVERSION =-3 부분을원하시는대로수정해준후재컴파일을하시면됩니다. 참고로위의경우에는커널버전이 2.4.8-3 임을알수있습니다. 문 ) 커널컴파일을하여업그레이드를하였는데, 새로운버전이아니라예전버전으로부팅됩니다. 어디가잘못되었나요? 답 ) 이러한경우는 /etc/lilo.conf 를변경후 /sbin/lilo 를실행하여변경된내용을 LILO 에적용하지않고재부팅을하였기때문입니다. /sbin/lilo 로정보를갱신해주었는지확인하고아울러 /etc/lilo.conf 설정에서새로운커널이미지로설정하였는지확인해
보시기바랍니다. 문 ) 부팅시 Kernel Panic: VFS: Unable to mount fs 라는메시지가나오고부팅이되지않습니다. 어떻게하여야하나요? 답 ) 커널컴파일을한후재부팅시 Kernel Panic: VFS: Unable to mount fs 와같은메세지가나면서부팅이되지않는다면부팅과정에서루트파일시스템을제대로마운트하지못했기때문에발생하는현상입니다. 이러한경우에는대부분이두가지이유인데, 일단부팅이가능한기존의커널이미지 (linux등) 로다시부팅한후 lilo.conf 에서지정한 root= 부분이실제시스템의루트파티션과맞는지, 그리고사용하는시스템의하드디스크 (IDE 또는 SCSI) 를커널컴파일옵션에서제대로선택하였는지그리고파일시스템 (ext2등) 도제대로선택하였는지확인해보시기바랍니다. 특히 SCSI 를사용한다면 SCSI 어댑터를모듈로설정하지말고반드시 * 로설정하여커널에정적으로 (Static 하게 ) 포함시키시기바랍니다. 부팅시파일시스템이마운트되지않은상태에서는어떠한모듈도로드할수가없기때문입니다. 문 ) 커널 2.2.16 에서아파치웹서버를운영하고있는데, 동시접속자를설정하는 MaxClients 가 256 이상으로설정되지않습니다. 어떤분은 1024까지설정하여사용중이던데, 알아보니커널설정을변경해야한다더군요. 아파치와커널이어떤관계입니까? 답 ) 아파치웹서버에서동시접속자수를제한하는 MaxClients 는기본적으로 256이설정가능한최대치입니다. 이는두가지이유로제한이되는데, 아파치소스자체에서 MaxClients 가가질수있는값을 256으로제한해둔이유도있지만 2.2.X 대의리눅스커널에서도한유저가생성할수있는프로세스가 256개로제한되어있기때문입니다. 그래서이제한을변경하려면두가지작업을함께해주셔야하는것입니다. 먼저아파치소스인 src/include/httpd.h 에서 #define HARD_SERVER_LIMIT 256 수치를 1024 와같이설정을원하는값으로적절히변경한후아파치를재컴파일하여야하고두번째로커널소스인 /usr/src/linux/include/linux/tasks.h 에서 NR_TASKS와 MAX_TASKS_PER_USER 변수를역시재설정후커널컴파일을다시해주셔야합니다. 그러나커널 2.4. 에서는이설정제한이없어졌으므로 2.4.X 에서는아파치소스만변경하신후아파치를재컴파일하시면됩니다. 문 ) 랜카드를자주변경해야할이유가있어자주사용하는랜카드를모듈로설정하였습니다. 모듈명령어를이용하여랜카드를잡는방법을알려주세요. 답 ) lsmod, rmmod, insmod 또는 modprobe 명령어만아시면됩니다. 참고로현재로딩된모듈을보려면 lsmod 로확인가능하며현재의로딩된모듈을삭제하려면 rmmod 를, 추가하려면 insmod 를하시면됩니다.
현재 3Com 이더넷카드를사용하고있다면 3c59x 가로딩된모듈이보일것입니다. 또는 /etc/conf.modules( 커널 2.4.X 라면 /etc/modules.conf) 에보시면어떤모듈이설정되어있는지확인가능합니다. 3Com 랜카드를빼고인텔의 EtherExpress 100 으로변경하였다면두가지방법이있습니다. 단순히 /etc/conf.modules( 커널 2.4.X 라면 /etc/modules.conf) 에 alias eth0 3c59x 대신 alias eth0 eepro100 과같이변경후부팅하시면자동으로모듈이로딩되어인식하는방법이있습니다. 또다른방법은 rmmod 3c59x 로기존의모듈을삭제한후 insmod eeprp100 으로새로운모듈을추가하면모듈이바로로드됩니다. 또는사용할이더넷카드들을커널에정적으로포함하였을때에는 ( 즉 3Com 과 eepro100 등사용할이더넷카드를모두선택하였을때에는 ) 별도의설정없이부팅시바로인식됩니다. 문 ). 관리하는리눅스서버가 50대가넘습니다. 모든서버에서일일이커널컴파일을해주어야하나요? 답 ) 만약커널컴파일을하여야할시스템이 1 대가아니라여러대라면일일이복잡한과정을거치는것이여간번거롭지않을수없습니다. 이러한경우, 시스템의하드웨어구성이완전히똑같을때는커널컴파일과정없이단지 vmlinuz 와 System.map 파일만그대로복사해서 /etc/lilo.conf 에설정하여부팅해도사용이가능합니다. 어차피커널컴파일이라는복잡한과정이결국은 vmlinuz 라는커널이미지파일을생성하는단계이기때문이죠. 만약하드웨어나기타설정이다소차이가있을경우에는아래와같이해주시면시간과노력을절약하실수있습니다. make menuconfig 에서설정한커널옵션의설정내용은 /usr/src/linux 에.config 라는파일에저장됩니다. 따라서하드웨어구성이다른시스템이있다면다른리눅스시스템의커널컴파일시기존의서버에서이파일을복사하여 /usr/src/linux 디렉토리에복사하여 make menuconfig 를하면기존의선택사항이그대로적용되므로일일이옵션을다시선택할필요없이새롭게커널을컴파일할시스템에해당하는몇가지옵션만변경하여그대로사용하는방법을이용할수도있습니다. 만약새로운커널버전을다운로드받아설치할때도이전버전의.config 를복사하여사용하셔도됩니다. 문 ) 커널컴파일을하려면 make dep 을실행하고이명령어가끝나면 make clean 이후 make bzlilo make modules --> make modules_install 등을순서대로하여야하는데, 너무불편합니다. 한번에실행할수있는방법이없나요? 답 ) 위명령어를한번에이어서쓰시면됩니다. 즉 # make dep; make clean; make bzlilo; make modules; make modules_install 과같이각각의명령어에세미콜론 (;) 을붙이거나또는 make dep clean bzlilo modules modules_install 와같이 make 뒤에한번에붙여서사용하는방법도같은방법입니다.
문 ) 커널컴파일시시간이너무오래걸립니다. 좀더빨리할수있는방법은없나요? 답 ) nice 를이용하면됩니다. nice 는실행되는프로세스에우선순위를주는명령어로서 -20부터 19까지설정해줄수있습니다. (-20이가장우선순위가높은것이고 19가가장낮은것입니다.) 아무런옵션을주지않았을때기본적인프로세스선호도는 10인데, 가장우선순위를높게하기위해서는 20 을설정해주면됩니다. nice 는비단커널컴파일뿐만아니라어떠한프로그램을컴파일할때라도모두적용이가능합니다. 따라서커널컴파일시다른프로세스보다우선순위를높게하려면 # nice 20 make dep clean bzlilo 와같이실행하면됩니다. 또한멀티 CPU 일경우에는 CPU 를동시에할당하기위해 make 에 j 옵션을쓸수있습니다. 즉 CPU가 2개일경우에는 make j 3 dep clean bzlilo 와같이할수있습니다. 실제커널컴파일시얼마나소요가되는지는 time 명령어를이용하여 # time make j 3 dep clean bzlilo 와같이확인할수있습니다. 문 ) 커널컴파일이끝난후 /sbin/lilo 를실행해주니 error Kernel vmlinuz_2.4.4 is too big 과같은메시지가뜨면서에러가납니다. 왜그런가요? 답 ) 에러메시지대로커널이미지사이즈가너무크기때문에발생하는에러입니다. 커널컴파일시 bzlilo 나 bzimage 로압축을하여커널이미지의크기를작게만드시기바랍니다. 또는커널옵션에서메뉴선택시불필요한내용은최대한선택하지말고아울러선택해야하는내용중모듈로설정할수있는부분이있다면모듈로설정한후재컴파일해보시기바랍니다. 커널이미지를압축해야하는이유에대해서는 http://kernel.pe.kr/ 운영자이신정원영님께서잘설명하신글이있습니다. 아래의내용을참고하시기바랍니다. 우리는커널컴파일을할때 make zimage, make bzimage 이런식으로커널이미지를압축한다.( make zlilo, zdisk, bzlilo 모두마찬가지...) 아무런의문없이무의식적으로당연히이렇게쓰고있다. 여기에는약간의배경지식이필요한데간략히설명하겠다. 우리가흔히아는매킨토시의 M68 계열 processor 는 8bit 환경에서 32bit 환경으로발전되었지만인텔의 8086 계열은 DOS 의대중성때문에바로 32bit 환경으로가지못하고 16bit 환경을가지게되었다. 대중적으로많이쓰이고있는 DOS 를계속쓸수있도록하기위해서였다. 이러한이유때문에리얼모드, 보호모드, 가상 86 모드가생겼다. 리얼모드, 보호모드, 가상 86 모드모두세그먼트레지스터와오프셋레지스터를이용하여주소를지정하는데이들레지스터의사용방법이다르다.
리얼모드는세그먼트 x10h + 오프셋으로주소를만드는데 16bit 에서세그먼트와오프셋의최대값은 FFFF 이다. 그러므로최대로지정할수있는주소는 FFFF0 + FFFF 가된다. 이걸계산하면 1MB + 64KB 가된다. 보호모드에선주소지정방식이리얼모드와는많이다르며페이징등을이용하여 32bit 모두주소값을만들수있으므로이론적으론 4GB 의메모리를이용할수있으며가상 86 모드또한선형주소를만들어내는과정만다르므로기본매커니즘은보호모드와같다. ( 보호모드와가상 86 모드의주소생성법은생략한다.) 프로그램은 code 부분과 data 부분으로나누어지는데리얼모드에서프로그램의 code 부분은반드시위최대주소지정영역내에있어야한다는것이다. 리얼모드에서는여러개의프로그램이메모리에올라와서수행될수없으며 ( 만약여러개의프로그램이메모리에서수행된다면다른프로그램영역을침범할수있기때문이다.) interrupt 를이용하는 RAM 상주프로그램만이메모리를같이차지할수있다. 위에서설명한리얼모드의약 1MB 정도의영역중 Coventional Memory 가 640KB 를차지하고나머지는비디오램이나기타디바이스가차지한다. 그러므로커널이미지는 Coventional Memory 즉 640KB 내에들어가야하므로커널이미지의크기가 640KB 보나작아야한다. 커널이미지의압축으로이러한제약을부분적으로극복하였으나 640KB 의일부는여러가지버퍼 (DMA buffer) 나특정주소가시스템에예약되어있으므로 640KB 보다더작은크기의커널이요구된다. 이러한문제의대안으로커널을 Extended Memory 에적재하는방법을생각해볼수있다. Extended Memory 영역에자유로이적재하기위해서는보호모드를사용해야하는데보호모드에서는 BIOS 와같이시스템이완전히준비되기전의기본적인기능들을사용할수없다. 이럴경우디스크를액세스하는자체적인함수를준비하여커널을 Extended Memory 에적재하거나아니면커널을줄이는수밖에없는것이다. 문 ) 2.2.X 커널에서는한파일사이즈에 2G 제한이있는데, 2.4.X 에서는이제한이없어졌다고알고있습니다. 이에관련된설명을부탁드립니다. 답 ) 이에대해서는이호님께서자세하게설명한글이도움이되실것입니다. 아래의글을참고하시기바랍니다. x86에서 2.2.x 버전의커널까지는파일크기가 2GB를넘을수없다는제한이있습니다. 이는리눅스에서사용하는 EXT2 파일시스템의문제가아니라리눅스에서파일시스템을추상화한계층인 VFS(Virtual File System) 와 glibc의문제입니다. EXT2 파일시스템에서는이미파일크기를나타내는데 64비트를사용하고있기때문에문제가되지않습니다. 그러나 VFS에서는그냥 long을사용하고있기때문에 32비트시스템에서는 2GB(32비트로는
4G까지표시할수있지만, signed이기때문에 2G가됩니다 ) 의제한이생깁니다. 그렇지만알파같은시스템에서는 long이 64비트이기때문에이런제한은없습니다. 커널외에도 C Library인 glibc의문제도있습니다. glibc에서는파일크기와 offset을나타내는데모두 long을쓰기때문에여기서도 2GB의제한이발생합니다. 2.4.x 커널부터는파일크기와 offset을나타내는데 long long을사용합니다. 따라서커널자체에서의제한은사라졌습니다. 프로그램에서 2GB를넘는파일을사용하려면 glibc를 2.1.3 버전이상을사용해야합니다. 이버전부터 64비트 offset을지원합니다. 2.2.x 버전에서도커널패치를하면 2G를넘는파일을사용할수있습니다. 이패치는 LFS(Large File System) 이라고부르며 http://www.scyld.com/software/lfs.html에서구할수있습니다. 여기서는 LFS와관련된이슈들을다루고있습니다. 문 ) 커널에대한가장빠른소식이나정보를알고싶습니다. 어떤방법이좋을까요? 답 ) 가장빠르고확실한방법은커널개발자메일링리스트에가입하시는방법입니다. 이메일링리스트를통해새로운커널개발에대한정보나의견및토론, 버그리포트, 새로운커널발표등에대한정보를빠르게받아보실수있습니다. 이메일링리스트에가입하는방법은메시지본문에 subscribe linux-kernel your_email@your_domain 라고기입하여 majordomo@vger.kernel.org 로메일을보내시면됩니다. 이메일링리스트를통해각국의커널개발자는물론알랜콕스나리누스도자주만나실수있습니다. 그러나이메일링리스트에가입을하게되면매일엄청난양의메일을받게되므로메일링리스트가입시신중하게판단하신후가입하셔야합니다. 메일링리스트에서도커널개발에아주관심이많아서적어도 1 주일에한번씩커널패치를하지않을것이라면가입하지말라고경고 (?) 하고있습니다. 해지하는방법은메시지본문에 unsubscribe linux-kernel 라고기입후 majordomo@vger.kernel.org 로메일을발송하시면됩니다. 이와관련하여더자세한안내는 http://vger.kernel.org/majordomo-info.html 를참고하시기바랍니다. 또한 http://www.uwsg.indiana.edu/hypermail/linux/kernel/index.html 에접속하시면 95년부터현재까지의모든메일링리스트의내용을검색하거나살펴볼수있으며커널트래픽홈페이지인 http://kt.zork.net/ 에서는메일링리스트에서논의되고있는내용을매주정리하여제공하고있으니굳이메일링리스트에가입하지않아도많은정보를검색하실수있습니다. 문 ) 리눅스커널에대해공부하려고합니다. 좋은자료나사이트있으면알려주세요. 답 ) 본문서를작성하면서도움을많이받은사이트들이기도합니다. 특히 http://kernel.pe.kr/ 은큰도움이되실것입니다.
http://kernel.pe.kr/ http://kldp.org/ 리눅스 _ 커널 / http://www.tux.org/lkml/ http://www.linuxhq.com/kernel/ http://members.aa.net/~swear/pedia/kernel.html