2013년 9월 26일 목요일

Xen Server에서 Ubuntu 설치시 "Unable to access a required file in the specified repository" 에러 해결

에러 내용
Sep 26, 2013 3:22:14 PM Error: Starting VM 'Ubuntu Precise Pangolin 12.04 (64-bit)' - The bootloader for this VM returned an error -- did the VM installation succeed?  INVALID_SOURCE
Unable to access a required file in the specified repository: http://archive.ubunut.com/ubuntu/dists/precise/main/installer-amd64/current/images/netboot/xen/vmlinuz.



이런식으로 나오는걸
xe vm-list 로 설치하고자 하는 vm의 uuid를 얻어 온 뒤 boot 옵션들은 수정하여 재시작 한다

xe vm-param-set uuid=13005686-4547-599f-9e59-148982868d68 HVM-boot-policy="BIOS order"
xe vm-param-set uuid=13005686-4547-599f-9e59-148982868d68 HVM-boot-params:order=cd

2013년 9월 8일 일요일

Fedora18에서 크로스 컴파일을 이용한 RaspberryPI(RPI) 실행 파일 만들기 및 원격 디버깅 방법

상황은 이랬다.
pc에서 작성한 코드를 rpi에서 실행 시켜볼 일이 생겼는데 rpi에서 컴파일을 하니 pc보다 20여배는 느렸다. 코드를 저장하고 컴파일을 하던 습관이 rpi에서 작업하는 상당한 시간을 차지하여 크로스 컴파일을 구축하게 되었다.

크로스 컴파일을 사용하면 pc와 같은 고성능 시스템에서 빠르게 컴파일하여 target 시스템(지금은 RPI)에서 실행 시킬 수가 있다.
RPI에서 IDE를 사용하여 코딩을하고 싶으나 하드웨어 지원이 미약하여 무리가 따른다. 따라서 pc에서 IDE와 크로스 컴파일러를 이용하여 실행파일을 제작 원격(RPI)에서 실행 및 디버깅할 수 있는 방법을 적어본다.

참조 : http://akanto.wordpress.com/2012/09/25/cross-compiling-kernel-for-raspberry-pi-on-fedora-17-part-1/

나는 페도라18를 사용하는데 참조했던 사이트는 이전 버전이라서 그런가 디버그 세팅할 때 문제가 생겼었다.

일단 자세히 정리는 못하고 기억나는데로 정리하자.

크로스 툴 체인은 http://www.crosstool-ng.org 에서 1.17.0 버전을 다운 받았다.
최신 버전은 1.18.0 인데 root 권한으로 실행 할 수 없다는 오류를 내밷으면서 컴파일이 되지 않았다. 설치를 할 때 sudo로 하지 말고 root로 바꿔서 진행 할 것.

  1. 우선 pc에서 필요한 라이브러리를 설치한다.
    #yum install -y bison flex gperf libtool texinfo gcc gcc-c++ gmp-devel ncurses ncurses-devel expat expat-devel python python-devel
  2. crosstool-ng-1.17.0 버전을 다운받아 설치한다.
    #cd /opt
    #wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.17.0.tar.bz2
    #tar -jxvf crosstool-ng-1.17.0.tar.bz2
    #cd crosstool-ng-1.17.0/
    #./configure --prefix=/opt/crosstool-ng-1.17.0/
    #make && make install
    #cp ct-ng.comp /etc/bash_completion.d/

    이렇게 설치가 끝나면 ct-ng를 PATH에 등록해야 한다.
    PATH=$PATH:/opt/crosstool-ng-1.17.0/bin
  3. 이제 RPI용 컴파일러를 설치해야 한다.
    #mkdir /opt/crosstool-ng-1.17.0-config
    #cd /opt/crosstool-ng-1.17.0-config
    #ct-ng menuconfig
    이후 RPI에 맞게 컴파일러 옵션들을 설정해 줘야 한다.

    Paths and misc options
    >> Enable “Try features marked as EXPERIMENTAL”
    >> Set the “Prefix directory” from “${HOME}/x-tools/${CT_TARGET}” to “/opt/crosstool-ng-1.17.0-tools/${CT_TARGET}”

    Toolchain options
    >> Tuple’s version string is set to “rpi”.

    Target options
    >> Be sure that the “Target Architecture” is set to “arm”
    >> Be sure that “Little Endian” and “32bit” are selected
    >> Be sure that “Floating point” is set to “hardware (FPU)”
    >> Be sure that “Use EABI” is selected

    Operating system
    >> Set “Target OS” to Linux

    C compiler
    >> Enable “Show Linaro versions”
    >> Enable “C++” in order to have C++ compiler
    >> Disable “Link libstdc++ statically into gcc binary”
    >> Disable “GRAPHITE loop optimisations”

    Debug facilities
    >> Enable “gdb”
    >>>> Cross-gdb extra config "--with-expat"
    >> Enable “ltrace”
    >> Enable “duma”
    >> Enable “dmalloc”
    >> Keep “strace” on disable since it does not seem to build with crosstool-ng 1.17.0
  4. 환경설정이 끝났으면 컴파일을 시작한다.
    #ct-ng build 4
    4개의 core를 이용하여 병렬 컴파일을 한다. 대략 30분 정도 걸린다(i5이용).
  5. 컴파일이 끝나면 생성된 실행파일 경로를 PATH에 등록한다.
    PATH=$PATH:/opt/crostool-ng-1.17.0-tools/arm-rpi-linux-gnueabi/bin
  6. 이제 RPI용 컴파일러를 설치하였다. 이제 eclipse를 이용하여 RPI용 실행 파일을 만들고 RPI에서 실행 시켜보자.

    file > new > c++ project

       

    "Cross compiler prefix : arm-rpi-linux-gnueabi-",
    "Cross compiler path : /opt/crosstool-ng-1.17.0-tools/arm-rpi-linux-gnueabi/bin"
    으로 입력한다.

  7. Run > Run Configurations > C/C++ Remote Application
    Main > New 를 눌러 RPI에 접속할 수 있는 정보를 설정하고 "Run"을 실행시키면 원격에서 실행된 결과를 eclipse에서 볼 수 있다.






    하단 빨간 사각형은 RPI에서 실행되는 경로와 실행파일 명을 기록해야 한다.
    ex) /home/hkskyp/Projects/helloworld
  8. 이제 원격 디버깅을 해보자.
    우선 gdbserver를 RPI에 복사애햐 한다.
    #scp /opt/crosstool-ng-1.17.0-tools/arm-rpi-linux-gnueabi/arm-rpi-linux-gnueabi/debug-root/usr/bin/gdbserver root@192.168.0.2:/usr/local/bin/

    이제 eclipse에서
    Run > Debug Configurations > C/C++ Remote Application
    "GDB debugger : /opt/crosstool-ng-1.17.0-tools/arm-rpi-linux-gnueabi/bin/arm-rpi-linux-gnueabi-gdb"
    디버거 역시 RPI용 GDB를 선택해 주어야 한다.