[완료]리눅스 커널 컴파일이 원래 이렇게 시간이 많이 걸리는 걸까요??

mbcls의 이미지

VirtualBox로 구동하는 Ubutu 11.04 입니다.

Operation System Concepts(녹색 공룡책)의 2장 끝 프로그래밍 문제인 커널에 새로운 시스템 콜을 추가해서 새로 컴파일하기를 하고 있습니다.
전체적인 과정은 다음과 같습니다.
http://blog.naver.com/boybanx/70094301335

1. 커널 빌드를 위한 패키지 다운로드
명령어(이하 '명') : sudo apt get install build-essential fakeroot kernel-package
다운 완료시 usr/src/디렉토리에 해당 폴더들 생성

2. 유저를 src 그룹에 포함
명 : sudo adduser username /* 자신의 계정 이름 */ src

3. 내 계정으로 들어가서 그룹 확인
명 : su username
명 : groups

4. 커널 설정을 위한 libncurses5-dev와 libqt3-mt-dev 패키지 설치
전자는 menuconfig, 후자는 xconfig에 필요. 둘 중 하나 반드시 설치
시스템 - 관리 - 시넵틱 패키지 관리에서 검색을 통해 설치

5. 커널 최신 버전 다운로드
명 : sudo apt-get install linux-source
다운된 소스는 /usr/src 디렉토리에 있음 -> 압축풀기
명 : tar xjvf linux-source-2.6.35.5.tar.bz2 /* 해당 리눅스 버전을 적으면 됨 */

6. linux 디렉토리로 링크 걸기
명 : ln -s linux-source-2.6.35.5 linux
정상설치 확인 명령어 : ls

7. 시스템 콜 등록하기-1
/usr/src/linux2.6.35/arch/x86/kernel/syscall_table_32.s에 내가 만들 함수 추가
즉, .long sys_helloworld를 끝에 넣어줌. 이때 오른쪽 끝에 주석으로 적혀있는
번호(몇번째 시스템 콜인지 나타내는 번호)를 기억할 것

8. 시스템 콜 등록하기-2
/usr/src/linux2.6.35/include/asm-generic/unistd.h에서 __NR_syscalls를 찾아
그 위에 아래와 같이 적는다.
#define __NR_helloworld 338 /*이 숫자는 방금 전에 기억한 번호*/
__SYSCALL(__NR_helloworld, sys_helloworld)
그리고 아래에 있는 __NR_syscalls 옆의 숫자는 마지막 시스템 콜의 숫자 +1을 적는다.

9. 시스템 콜 호출 처리 함수
gedit을 이용하여 아래 같은시스템 콜을 작성하여 /usr/src/linux2.6.35/kernel/helloworld.c
에 저장

#include
#include
#include
#include

asmlinkage long sys_helloworld(void)
{
printk("Hello world");
return 0;
}

10. /usr/src/linux-2.6.24/kernel/Makefile 에 오브젝트 추가
obj-y의 끝에 helloworld.o를 적어 넣는다.

11. 시스템 콜을 실행할 테스트 파일을 작성
위치 : /usr/src/test.c

#define __NR_helloworld 338
int main(void)
{
syscall(__NR_helloworld);
return 0;
}

12. 커널 빌드하기
명 : cd /usr/src/linux (linux폴더로 입장)
명 : make xconfig 또는 make menuconfig (처음 다운받은 패키지에 따라)
자신의 CPU에 맞는 적당한 설정을 해줌
이전에 만든 이미지 파일 삭제
명 : fakeroot make-kpkg
커널의 빌드
명 : fakeroot make-kpkg --append-to-version=.12042108 kernel_image -initrd
(2~3시간 소요)

13. 커널 이미지 패키지 설치하기
/usr/src 디렉토리로 가서 확인(ls 명령어) 및 패키지 설치

14. 재부팅 후 커널 선택창에서 새로운 커널을 선택하여 부팅함

15. 테스트 파일 컴파일
명 : gcc test.c -o test
./tsst
로그메세지 확인을 위한 명 : dmesg

-----------------------------------------------------------------------------------------------------------
저는 kernel 파일을 Ubuntu Software center에서 받았고요(linux-source-2.6.38), 터미널에서 fakeroot 명령어 대신 sudo -s로 루트 권한을 획득한 것 외의 과정은 이와 거의 일치합니다.
그리고 컴파일 명령어를 make-kpkg --append-to-version=.helloworld kernel_image --initrd 로 주었습니다.

그런데 2~3시간 걸린다는 블로그의 내용과는 달리 거의 한 9시간은 걸린 것 같네요.... 오늘 오후 1시에 컴파일해서 방금 전에 끝났습니다....
왜 이렇게 시간이 많이 걸린 걸까요?
원래 이정도 시간이 걸리는 것인가요?
아니면 가상머신에서 구동하기 때문에 필연적으로 느릴 수밖에 없는 것일까요?
그것도 아니면 제가 명령어 인수를 잘못 줬기 때문일까요??

이렇게 시간이 많이 걸린다면 커널 프로그래밍 하기 정말 힘들겠네요ㅠㅠ

-----------------------------------------------------------------------------------------------------------
아, 그리고 커널 컴파일 관련 내용을 검색했을 시 으례 make dep, make bzImage 등의 make 명령어가 등장했었는데요, 여기서는 make-kpkg라는 명령어로 한번에 컴파일을 수행하네요. 이 두 방법에 차이점이 있나요?

declspec의 이미지

PC 의 성능에 따라 차이가 큽니다
심한경우 천차만별이 될 수도 있습니다

가상머신을 쓴건 크게 상관없는것 같구요
제 경험으론 임베디드 리눅스 커널 컴파일할때
성능 좋은 PC 에서 2~30분쯤 걸리던것이
오래된 노트북에서는 5~6시간 넘게 걸리기도 합니다

자기실력이 좋다고 느껴지는건 공부를 안하고 있다는 신호.

익명 사용자의 이미지

봤는데 굉장한 명언이네요...막 입문하는 제게 큰 지침이 됩니다. 감사합니다.

snowall의 이미지

펜3 800MHz에서 한 10시간 넘게 걸렸던 것 같네요...-_-

피할 수 있을때 즐겨라! http://melotopia.net/b

mbcls의 이미지

visual studio 2010으로 컴파일 할 때는 전혀 느리거나 하는 것을 못 느꼈거든요. 올바른 비교가 될 수 있을지는 모르겠지만.... 2년 전에 산 놋북이라 펜티엄 3 수준까지는 아닐 테고요...흠...

일단 제가 입력한 명령어에는 문제가 없는 걸까요??

익명 사용자의 이미지

make-kpkg는 데비안의 패키지인 deb파일을 만들어 주는 방식이고

make menuconfig; make bzImage; make modules 뭐 이런 과정은
패키지를 만들지 않는 여느 배포판에서 다되는 그냥 소스컴파일입니다.

poplinux의 이미지

오래걸릴수도 있고, 빨리 될수도 있고 컴파일만 문제 없이 된다면 그리 신경 쓸 부분은 아닌듯합니다.

컴파일 빨리 하는걸 목적으로 작업 하신걸 아니실테니까요.

========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux

임베디드 리눅스 관련 프리렌서 지향

planetarium의 이미지

온갖 모듈들을 다 컴파일하느라 시간을 더 잡아먹었을 공산이 큽니다.
make menuconfig 이후에 make localmodconfig 를 사용하면 현재 사용중인 모듈들을 제외하고 전부 선택 해제해주게 되는데,
이렇게 설정하신후 컴파일하시면 시간이 많이 단축됩니다.

다만 저렇게 설정하면 당연히 설정 이후에 새로 연결하는 장치(특히 USB 장치) 들은 인식 못하니까 주의하셔야겠죠.
깜박하고 왜 안되는지 한참 헤매실수 있습니다...

wanderer의 이미지

아마도 Ubuntu 의 기본 Config 는 다양한 종류의 Device 를 지원하기 위해서는 덩치가 큰편입니다

약간의 커스터마이징만 하더라도 커널 자체의 용량뿐만 아니라 컴파일 시간도 단축할것 입니다

(대표적으로 Kernel Hacking 에 있는 Debug 관련 Option 을 비활성화)

그리고 VBox 로 해도 저렇게 느린것은 아마 CPU 가 가상화를 지원하지 않는것 같은데
그렇다면 Ubuntu 를 VBox 로 설치하는것보다는 Wubi 를 통해서 Image 형태로 구동하는 것이
훨씬더 빠르게 할수 있을것 입니다

planetarium의 이미지

아 그리고... make-kpkg 사용 전에
export CONCURRENCY_LEVEL=4
옵션을 주시면 make가 4개 스레드로 돌기 때문에...
특히 가상머신에 CPU 코어 여러개를 붙인 경우 큰 성능향상을 얻을수 있습니다.

heartthief의 이미지

-j# 옵션을 사용하면 make로 빌드할때 한번에 여러 자식 프로세스가 생겨서 병렬빌드 할 수 있습니다.
#에는 병렬로 처리할 프로세스 개수나 작업 개수가 들어갑니다.

ex) make -j2

p.s. 병렬빌드로 처리할 수 없도록 되어 있으면 -j 옵션을 빼고 처음부터 다시 빌드하는게 안전하다고 합니다.

planetarium의 이미지

make-kpkg 사용시에는 -j 옵션 대신 CONCURRENCY_LEVEL 환경변수를 사용하는게 안전하다고 어딘가에 적혀있습니다.
(중간중간 필요한 make 명령들에 알아서 -j 옵션을 적용시켜 줍니다)
뭐 데비안 계열을 사용하지 않는다면 굳이 알아둘 필요가 없는 내용입니다.

익명 사용자의 이미지

make-dpkg 의 경우 make -j# 의 #은 무시하고 CONCURRENCT_LEVEL 변수를 export 해서 사용해야만
병령 컴파일이 가능하다고 한거 같네요

익명 사용자의 이미지

아무리 오래 걸린다고 해도 개발할 때에 반드시 clean상태에서 rebuild할 필요는 없겠죠.

커널 트리에서 make하면 부분적으로 config 옵션 수정해도 부분 컴파일이 잘 되고요,

개발할 때에 부분 컴파일을 좀 더 쉽게 하려면 (보통은 한두개 파일을 수정할 것입니다)
make에 V=1 옵션을 걸어주어서 실패했을 때의 커널 컴파일 명령을 보여주게끔 하면,
해당 컴파일 명령을 cut&paste해서 shell스크립트 쓰듯 쓰면 더 빠르고 간단하게 끝냅니다.

mbcls의 이미지

안 본 사이에 답변들이 많이 달렸네요^^
이번에는 책을 보면서 제대로 공부해서 컴파일 해봐야겠습니다.
다들 답변해주셔서 감사합니다~~

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.