RTLinux 설치방법 (Ubuntu Breezy Version) Last update: 2006.03.17 by deathymn - Mechatrobotics Lab, Mechanical Eng.Dep. Yonsei Univ * 이작업은반드시 root 사용자로로그인해서수행한다. * * 이문서는 Ubuntu linux 5.10 버전을기준으로설명된다 * * 이문서를작성할당시, 사용한커널은, 2.6.9 를사용했다. 사실, 2.6 버전대로오면서, 커널내부적으로모듈을다루는방식에많은변화가발생했다. 그러므로, 왠만하면 2.6.9 버전의커널을사용하자. * Ubuntu 에서패키지관리자는, 시냅틱패키지관리자 를사용해도되며, 만약 Kubuntu 환경일경우에는 Adept 패키지관리자 를사용해도상관없다. * 준비작업 : 커널을컴파일하기위해서는, gcc 와 ncurse library 등이미리깔려있어야한다. 처음 ubuntu 를설치하면개발환경이설치되어있지않기때문에, 다음과같은명령으로기본적인개발환경을설치한다. apt-get install build-essential apt-get install kernel-package 시스템 -> 관리 -> 시냅틱패키지관리자를실행시켜, Search 로 ncurse 를검색해본다. 결과창에서봤을때, libncurses5, libncurses5-dev, libncursesw5, ncurses-base, ncurses-bin 이설치되어있어야한다. 또한시냅틱패키지관리자에서, 이번에는 gcc 로검색해본다. 이경우, gcc, gcc-4.0, gcc-4.0-b ase 정도가설치되어있음을확일할수있을것이다. 여기에추가적으로검색창에서 gcc-2.95 란패키지를설치해준다. 테스트해본결과, gcc-4.0 을이용해서컴파일할경우, 에러가나는것을확인... 커널컴파일을위해서는 gcc-2.95 패키지가절대적으로필요하다.. 터미널을하나띄워서, ls -al /usr/bin/gcc 를확인해보자. 결과창에보면, gcc 라는화일이 gcc-4.0 을가르키는링크화일임을알수있다. 앞의과정에서 gcc-2.95 패키지가정상적으로설치되었으면, /usr /bin/ 폴더안에, gcc-2.95 화일이존재할것이다. (ls -al /usr/bin/gcc-2.95) 결국, 커널컴파일을위해서 gcc-2.95 를이용하기위해서는, gcc 의링크만바꾸어주면되는것이다. 다음과같은명령으로일단 gcc 를지운다. rm -rf /usr/bin/gcc 그리고, gcc-2.95 화일을가르키는링크를다음과같이건다. ln -s /usr/bin/gcc-2.95 /usr/bin/gcc 링크가제대로걸렸는지확인해본다. ls -al /usr/bin/gcc result) /usr/bin/gcc->/usr/bin/gcc-2.95-1-
리눅스커널및, RTLinux 구하기. 1. RTLinux 를설치하기위해서는, 일반적인리눅스커널과 RTLinux 모듈이들어있는화일이필요하다. 일반적인리눅스커널 : linux-2.4.29.tgz or linux-2.6.9.tgz RTLinux 모듈화일 : rtlinux-3.1.tgz or rtlinux-3.1-2.6_kernel.tgz 2. 두화일을다운받는경로는다음과같다. 일반적인리눅스커널 : ftp.kernel.org RTLinux 모듈화일 : www.rtlinuxfree.com ( 회원가입필요 ) 참고 ) www.rtlinuxfree.com 사이트에들어가면, 다운받을수있는곳에 rtlinux 에대한문서화일이있다. ex) rtldoc-3.2-pre1.tar.bz2 이문서화일에는설치방법과튜토리얼이들어있다. 3. 설치의모든작업은 /usr/src 폴더에서진행하기때문에이쪽으로다운받은화일들을카피한다. ex) cp linux-2.4.29.tgz /usr/src/linux-2.4.29.tgz cp rtlinux-3.1.tgz /usr/src/rtlinux-3.1.tgz 카피가끝난후, 이폴더로이동한다. ex) cd /usr/src 리눅스커널컴파일. ( 참고 ) www.rtlinuxfree.com 사이트에보면, prepatched 커널이라는게있다. (ex) prepatched_linux_ker nel-2.4.29-rtl.tgz 즉, 이화일을다운받으면, RT 커널로변환된리눅스커널을얻을수있다. 즉, 10 과정이필요없다는말이다. 하지만이화일안에모든것이포함되어있는게아니라, 일반적인리눅스커널 + RT 패치만들어있기때문에, RT 모듈이들어있는화일도반드시받아주어야한다. 4. 먼저리눅스커널을압축을푼다. ex) tar xvzf linux-2.4.29.tgz 만약 prepatch 커널일경우, tar xvzf prepatched_linux_kernel-2.4.29-rtl 압축을푼후에, /usr/src/ 폴더밑에새로운폴더가하나생겼음을볼수있다. ex) /usr/src/linux-2.4.29/, or /usr/src/linux-2.6.9/ 5. 작업을편하게하기위해이폴더를 'linux' 라고링크를걸어둔다. ex) ln -s /usr/src/linux-2.4.29 linux or, ln -s /usr/src/linux-2.6.9 linux 링크가걸렸는지확인 ls -al result) lwxrwxrwx linux -> linux-2.4.29 or lwxrwxrwx linux -> linux-2.6.9 * 커널컴파일을진행하기전에, 이커널을 RT 커널로만들어주는과정이필요하다. 이는앞에서언급했듯이, RTLinux 모듈화일에들어있는패치화일로패치해주는과정이필요하다는의미이다. (Prepatch kernel 을받은경우에는이과정이필요없다.. 패치가되어있는걸받았기때문... 즉, 7 -> 11 까지의과정이필요없다. ) 6. 커널을패치하기위해, RTLinux 모듈화일을압축을푼다. -2-
ex) tar xvzf rtlinux-3.1.tgz 압축을푼후에, /usr/src/ 폴더밑에새로운폴더가하나생겼음을볼수있다. ex) /usr/src/rtlinux-3.1/ 나중에작업이끝나고나면, RTLinux 에관련된화일들이, /usr/rtlinux-3.1 이라는폴더로자동생성되어저장된다. 즉, 이두폴더가이름이똑같이때문에 ( 물론경로는틀리지만 ) 혼동될수있으므로, /usr/src/rtlinu x-3.1 폴더를 rtlinux-3.1_source 이런식으로이름을바꾸어주자. 결국작업을할폴더들의구조는다음과같다. (kernel 2.4.29 일경우 ) /-------/usr--------/src------/linux-2.4.29 ------/rtlinux-3.1_source --------/rtlinux-3.1 ( 작업이끝난후, 자동으로생성되는폴더 ) (kernel 2.6.9 일경우 ) /-------/usr--------/src------/linux-2.6.9 ------/rtlinux-3.1_source --------/rtlinux-3.1 ( 작업이끝난후, 자동으로생성되는폴더 ) 7. 이폴더로이동후 (cd /rtlinux-3.1_source), 폴더안을보면 (ls -al) 'patches' 라는폴더가보일것이다. 이폴더로이동한다. (cd patches) 8. 그럼현재폴더는 /usr/src/rtlinux-3.1_source/patches 이어야한다. 이폴더안에내용을보면 (ls -al), kernel_patch-2.4.20-rtl kernel_patch-2.4.29-rtl kernel_patch-2.6.9rtlfree 등의화일이보일것이다. 이중다운받은리눅스커널, 예를들어 linux-2.4.29 에맞는패치화일은 kernel _patch_2.4.29-rtl 이다. 9. 이제패치를진행하기위해 linux 폴더로이동한다. ex) cd /usr/src/linux 10. 다음의명령으로커널패치를진행한다. patch -p1 < /usr/src/rtlinux-3.1_source/patches/kernel_patch-2.4.29-rtl 또는 patch -p1 < /usr/src/rtlinux-3.1_source/patches/kernel_patch-2.6.9rtlfree 11. 여기까지해서, 일반적인리눅스커널의소스를 RT 커널의소스로변환하였다. 12. 이제부터커널컴파일을시작한다. 커널컴파일을하기위해커널소스가있는폴더로이동한다. ex) cd /usr/src/linux 13. 커널컴파일을크게세가지과정으로진행된다. -3-
1) 자신의컴퓨터에달려있는장치들에적합한커널옵션설정 2) 커널컴파일 3) 여러장치디바이스드라이버들의컴파일 14. 커널컴파일을하기전에먼저, 기존환경설정값을없애기위해, make mrproper 15. 또한한번이상커널컴파일을수행한경우, 여러쓰레기화일들이남아있을수있으므로, make clean 16. 다음으로, 커널의옵션을설정하기위해, make menuconfig 또는, make xconfig 주의 ) 가장어려운부분이이부분이아닐까싶다. 가장쉬운방법은커널옵션세팅이되어있는기존배포판의 config 화일을 load 해서, 필요없는부분을지워가는것이라할수있다. 커널옵션중에다음사항은반드시체크하자. ( 단, 2.6.9 버전의커널옵션에대해설명 ) Power management setup -> APM(Advanced Power Management) BIOS Support -> APM(Advanced Power Management) BIOS Support 는 n 으로설정 Power management setup -> CPU Frequency Scaling -> CPU Frequency Scaling 는 n 으로설정 Processor Type and Features-> Processor Family-> 에서자신의 CPU 에맞는 Processor 설정 Processor Type and Features-> Local APIC Support on uniprocessors 는 n 으로설정 ( 선택안함 ) 현재, Ubuntu 5.10 (Breezy) 에대한, 커널옵션설정화일 (UbuntuSetting.config) 을같이첨부한다. 이를로드하기위해서는, 일단이화일을 /usr/src/linux 에복사해놓고, make menuconfig 설정창에서, Load an Alternative Configuration File 으로불러오면된다. 이렇게불러온후, 위에서언급한 processor 부분은반드시해당컴퓨터의 processor 에맞게변경하자. 주의 ) 혹, 이설정이해당컴퓨터환경과안맞을수도있다. 이경우, 현재부팅되어있는커널설정의환경을불러와서필요한것만바꿀수있다. 현재부팅되어있는커널이 2.6.10 이라하자. 그러면 /boot 폴더에 config-2.6.10 이라는화일을볼수있다. 그러면일단현재커널컴파일하는폴더로이동후 (cd /usr/src /linux), 위화일을다음과같이카피한다. (cp /boot/config-2.6.10./.config) 그런후에, 다음과같은명령을수행한다. (make oldconfig). 그러면 config-2.6.10 에설정되어있는환경설정파라미터가, 현재컴파일하려는커널의환경설정파라미터에있으면자동으로설정하고, 그렇지않은것은사용자에게물어보게된다. 이경우, 왠만한건, no, 즉, n 을치고넘어가고록하자. 그러면 make oldconfig 이끝난후에, 다시 ma ke menuconfig 등을실행해서다시한번검토해볼수있다. 17. 커널옵션을다설정한후에는, make dep 명령을수행해서, 옵션들사이의의존관계가제대로되어있는지체크한다. (2.6.9 커널인경우, 이과정이필요없음 ) 18. 커널을컴파일하여, 바이너리화일로만들기위해, make-kpkg initrd stem linux -append-to-version=.01 kernel_image kernel_headers : 여기서 -append-to-version 다음의.01 은임의값을설정해도된다. 즉, 말그대로자신만의버전명을임의로붙이는것이다. 위의명령으로컴파일하게되면화일이름이 linux-headers-2.6.9rtlfree.01_10.00.c ustom_i386.deb 와같은방식으로생성되게된다. 커널을컴파일한후, 20 번과정으로설치를하게되면, 커널과관련된모듈들이 /lib/modules/ 커널버전 폴더에설치되게된다. 즉, 위의옵션없이하나의커널소스를여러번컴파일하게되면, 모듈들이 /lib/modules/ 커널버전 폴더에계속 overwrite 되게되는것이다. 그러므로, 위의옵션을주어같은커널이라도버젼을달리해서컴파일하게되면, 서로다른폴더에모듈 -4-
들이설치되므로모듈들이중복되지않고, 커널을관리하는것도쉬워진다. 19. 약간의시간이지난후, 커널컴파일이정상적으로수행됐다면, /usr/src 폴더를보면, 다음과같이두화일이생성된것을볼수있다. : linux-headers-2.6.9rtlfree.01_10.00.custom_i386.deb linux-image-2.6.9rtlfree.01_10.00.custom_i386.deb 20. 이를시스템에 install 하는것은다음과같은명령을사용한다. ( 현재폴더 : /usr/src) dpkg -i linux-headers-2.6.9rtlfree.01_10.00.custom_i386.deb dpkg -i linux-image-2.6.9rtlfree.01_10.00.custom_i386.deb : 이렇게설치된커널이미지는시냅틱패키지관리자를통해서제거가능하다. 21. 지금컴파일한커널이부트로더에등록되어있는지확인해보자. vi /boot/grub/menu.lst 22. 여기까지해서, 커널컴파일하는과정은모두끝났다. 23. 만약, 커널컴파일이잘못됐거나, 옵션설정을다시해서다시컴파일해줘야하는경우, 일단다른커널로부팅한다. 24. 부팅후에, 시냅틱패키지관리자 를실행해서, 지우려는커널을찾는다. 즉, search 버튼을눌러서, 20 과정에서설치한이름을이용해서찾는다. 찾은후에, 삭제를하면된다. ( 만약지우지않고, 같은커널을다른옵션을주어서추가로설치할경우는, 이과정은생략 ) 25. 그리고나서, /usr/src/linux 폴더로이동. cd /usr/src/linux 26. 여기서, 기존컴파일했던, 중간생성화일들과결과물들을삭제하기위해다음명령을실행한다. make-kpkg clean 27. 이명령을실행한후에, 16 과정부터다시실행한다. RT 모듈컴파일. 28. 컴퓨터를재부팅하고, Boot Loader 에 21 과정에서확인한타이틀이뜨는지확인하고, 그걸선택해부팅한다. 29. 부팅과정에서 Kernel panic 하고멈추는경우가발생할수있다. 이경우, 기존커널로다시부팅해서 1 2 과정부터다시수행한다. 30. 정상적으로부팅에성공하면, 커널컴파일은성공적으로이루어진것이다. 이제 RT 모듈을컴파일하기위해, 터미널을하나띄우고, RTLinux 폴더로이동한다. ex) cd /usr/src/rtlinux-3.1_source 31. 이폴더아래에, 리눅스커널을가르키는링크를하나만든다. ex) ln -s /usr/src/linux-2.6.9 linux -5-
그러면, /usr/src/rtlinux-3.1_source 폴더안에, linux 라는링크화일을볼수있다. 32. RT 모듈들에대한옵션을설정하기위해 (ex, RTFifo 의개수등..) make menuconfig 또는 make xconfi g 을수행한다. 33. 이를수행하면, 라이센스관련텍스트화일이나오는데, q 키를치고빠져나오면라이센스에동의하는지물어본다. 여기서 y 키를누른다. 옵션은그냥기본적인설정을사용하고저장을하고나온다. 34. 모듈을컴파일하기전에, make dep 명령으로의존관계를설정한다. ( 주의 ) 이명령을수행하고나면, /usr/src/rtlinux-3.1_source/scripts 라는폴더안에, rtlinux 와 rtl-con fig 이라는링크화일이만들어진다. 그러나, Makefile 의버그인지는몰라도, 이링크가깨져있다. 이를수정하기위해 scripts 란폴더로이동후 ( cd./scripts) rm -rf rtlinux rm -rf rtl-config 으로두링크화일을지워준다. 다음으로현재 RTLinux 를사용하는커널버전에따라서다음과같이링크를걸어둔다. ln -s rtlinux-2.6 rtlinux ln -s rtl-config-2.6 rtl-config ls -al 명령으로두화일의링크가제대로걸렸는지확인한후, 상위폴더로이동한다. cd.. 또는 cd /usr/src/rtlinux-3.1_source 35. 다음으로 make 를입력하여, 모듈들을컴파일하여생성한다. 36. 컴파일하는도중, warning 이많이뜨는데, 컴파일만정상적으로끝나면이는상관없다. 다음으로 /dev 폴더안에, Rtlinux 와관련된장치화일들을만들기위해다음명령을수행한다. make devices 37. 적절한위치에화일들을옮기기위해, make install 명령을수행한다. 이명령의결과로, 6 번과정에서언급했던, /usr/rtlinux-3.1 이라는폴더가자동생성되며, 또한 /usr 폴더아래에 rtlinux 라는링크화일이생성된다. 38. 모든과정은끝났다. 마지막으로제대로모든것들이설치되었는지를확인하기위해서, 임의의폴더에서 rtlinux start 를실행해보자. 그러면결과는다음과같다. -6-
Scheme: (-) not loaded, (+) loaded (+) rtl (+) rtl_fifo (+) rtl_posixio (+) rtl_sched (+) rtl_time 만약, 이중하나라도 (-) 가뜨면, 이는어딘가잘못되었다는것이다. 보통두가지문제를지적한다. 첫번째는, 16 과정에서제시된옵션설정이제대로안되어있을경우이고, 두번째는 31 과정을하지않아, /dev/ 밑에디바이스화일들이제대로생성되지않은경우이다. 이를체크해본다. 39. kernel 2.6.9 인경우, rtlinux 모듈을위해사용하는 rtlinux stop 명령에약간의오류가있다. rtlinux st op 은내부적으로 rmmod 명령을사용하여모듈을내리는데, rtlinux stop 명령에서는 rmmod -r 을수행한다. 그러나 rmmod 의버전이바뀌면서, -r 이란옵션이없어진것같다. 그래서모듈을내리기위해 rtlin ux stop 명령을치면, 오류가출력되며모듈이안내려간다. 이는다음과같이수정할수있다. 일단 /etc/r c.d/init.d/rtlinux 화일을편집기로불러들인다. ( ex: vi /etc/rc.d/init.d/rtlinux ) 그러면, 66 번째줄과, 68 번째줄에서, RMMOD= /sbin/rmmod -r 과 RMMOD= which rmmod -r 이있을것이다. 여기서 -r 옵션을모두지우고저장을한다. 40. 다음, rtlinux stop 명령을내린다. 그러면, 실행결과는다음과같을것이다. Scheme: (-) not loaded, (+) loaded (+) rtl (-) rtl_fifo (-) rtl_posixio (-) rtl_sched (-) rtl_time 여기서도, 아직오류가있다. 즉, 모든모듈이내려가야하는데, rtl 은안내려간다. 이는내부적으로모듈을다른모듈들을내린다음에, rtl 을마지막으로내려야하는데, 그순서가잘못되어있는것같다. rtlinux stop 명령을한번더치면 rtl 모듈마저도내려가지만, 깔끔하지가않다. ( 참고 :) 이를해결하기위한한가지편법으로, 다시편집기로 /etc/rc.d/init.d/rtlinux 화일을연다. 그리고 1 43 번째줄정도에다음과같은코드를삽입한다. for modules in ${RTL_MODULES_LIST} do MODINS= ${LSMOD} ${GREP} ^$modules if [ $MODINS ]; then ${RMMOD} $modules fi done ${RMMOD} rtl <- 삽입한코드 즉, 정말편법으로 rmmod 명령을한번더실행시켜서, rmmod rtl 을실행한거와똑같다.. 이로써 RTLinux 를사용하기위한준비는다아끝났다. 제대로되는지확인해보기위해서, /usr/src/rtlinux-3.1_source/examples/frank 폴더에있는내용을실행해보자. 폴더안을보면, 다음과같은두화일을볼수있다. frank_app & frank_module.ko 실행순서는먼저모듈을올린다. 즉, rtlinux start frank_module.ko :.ko 를반드시붙인다. -7-
다음으로 frank_app 을실행시킨다. 즉,./frank_app 그러면화면에 frank, zappa 가교대로뜨는걸볼수있다. 응용프로그램이종료하면, rtlinux stop frank_module 명령을내려서모듈을내려준다... 41. 만약리눅스커널을재컴파일한경우에는 RTLinux 도다시컴파일해주어야한다. 일단 30 번과정으로해당폴더로이동한다. 42. 다음명령을실행하여, 재컴파일을위한준비를한다. make clean 43. 다음으로 34 과정을수행한다. 하지만이번에는 rtlinux 와 rtl-config 링크화일이안깨져있을것이다. 44. 그리고 35 38 과정을수행한다. 이번에도역시 rtlinux 관련스크립트에오류가있으므로, 38 과정처럼수정해준다. 마지막으로, 40 번과정에서언급된예제를실행해보고제대로되는지확인하자.. -8-