간혹 라즈베리파이를 사용하다가 무선랜을 잡아야 할 경우가 있다.

물론 startx를 이용하여 GUI모드로 잡는 방법이 편하지만

이번 포스팅에서는 텍스트모드에서 설정을 하고자 한다.


$lsusb        //USB 장치 목록 확인 

  //무선랜 드라이브가 보이면 연결은 된 상태


$iwlist wlan0 scan    //적용할 SSID  이름을 확인하여야 된다.

$su                 //root권한 획득 필요 (raspberry에서는 그냥 sudo su만 해줘도 super모드로 바뀜)

#wpa_passphrase "SSID_NAME" SSID_PASSWORD >> /etc/wpa_supplicant/wpa_supplicant.conf


#vi /etc/network/interfaces    //네트워크 설정


auto lo


iface lo inet loopback

iface eth0 inet dhcp


allow-hotplug wlan0

auto wlan0

iface wlan0 inet manual

wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf

iface default inet dhcp


#/etc/init.d/networking restart


위에서 했는데 적용이 안된다면


#vi /etc/wpa_supplicant/wpa_supplicant.conf


ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev //이부분 추가

update_config=1 //이부분 추가


network={

        ssid="AndroidHotspotxxxx"

        #psk="123456789"

        psk=14775ae036b8204a42cb0e9d6fb7d88f29ff7f4a078c8e29f53e29d5243ce4b9

}


위의 내용은 사용자의 SSID와 Password에 따라 달라진다.


위 내용 적용 후 reboot 하거나 네트워크 재시작하면 된다.

프로젝트를 하다 라즈베리파이 wheezy version중에 3.18.11을 써야 될 일이 생겼다.


github.com/raspberrypi - linux에 들어가본 결과 3.18.11은 없었다. 

홈페이지를 방문하면 최신 커널소스와 3.18의 경우에는 

1.rpi-3.18.y-rebase

2.rpi-3.18.y 

두 개를 받을 수 있는데 rebase의 경우 3.18.9, rpi-3.18.y의 경우에는 3.18.16이다.

실제로 raspbian wheezy이미지를 받으면 3.18.11이지만 해당 커널 소스를 받을 수가 없었다.


그래서 찾아본 결과 branch를 이용한 방법을 알게되었다.


1. branch  받기

$git clone --depth 500 -b rpi-3.18.y https://github.com/raspberrypi/linux linux-3.18

-> 위의 500의 경우 숫자가 크면 클수록 깊어지지만 시간이 오래걸릴 것임

   뒤의 linux-3.18은 생성되는 폴더명이기 때문에 바꿔도 무관



2. commit id 얻기

라즈베리파이의 sd카드를 리눅스 hostpc에 연결한 후 하는 것이 가장 좋다.

$sudo mount /dev/sdb1 mnt/fat32

$sudo mount /dev/sdb2 mnt/ext4

(위의 명령어를 왜 입력하는지 모르는 분들은 http://kkn1220.tistory.com/14 를 보고 오시는 걸 추천드립니다.)


$FIRMWARE_HASH=$(zgrep "* firmware as of" mnt/ext4/usr/share/doc/raspberrypi-bootloader/changelog.Debian.gz | head -1 | awk '{ print $5 }')

  

# get git hash for this kernel

    $KERNEL_HASH=$(wget https://raw.github.com/raspberrypi/firmware/$FIRMWARE_HASH/extra/git_hash -O -)

 

3. checkout

$git checkout $KERNEL_HASH

-> hash값 뜨면서 -b 새로운 브런치 어쩌구 나온다.

$git checkout -b $KERNEL_HASH

-> hash값으로 checkout되었다고 메시지 뜸


4. 소스빌드

$make ARCH=arm CROSS_COMPILE=<tools path>/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- bcm2709_defconfig


$make ARCH=arm CROSS_COMPILE=<tools path>/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- zImage modules dtbs


(tools path의 경우 크로스컴파일용 툴체인으로 역시 http://kkn1220.tistory.com/14 참고)


5. 모듈 설치

$sudo make ARCH=arm CROSS_COMPILE=<tools path>/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install


6. 커널이미지 생성

최신 git clone으로 github linux를 받으면 mkknlimg가 있으나 해당 버전에서는 존재하지가 않는다.

https://github.com/raspberrypi/linux/blob/rpi-3.18.y/scripts/mkknlimg에 들어가서 코드를 복사한다.

혹은 밑의 더보기를 눌러 해당 내용을 복사한다.

해당 스크립트를 linux-3.18/scripts 내에 생성한다.

예)vi linux-3.18/scripts/mkknlimg 에서 해당 스크립트 복사

주의* sudo chmod로 실행권한 줘야됨

예)$sudo chmod 755 linux-3.18/scripts/mkknlimg



$sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/kernel7.img 


7. umount

$sudo umount mnt/fat32

$sudo umount mnt/ext4


8. 확인


기존의 4.0.8-v7에서



3.18.11-v7로 바뀐 것을 확인할 수가 있다.




지난 시간 리눅스 환경에서 dkms mkdeb을 통한 리눅스 커널 파일을 deb파일로 생성해보았다.

(http://kkn1220.tistory.com/51 참고)

이번에는 라즈베리파이용으로 커널모듈을 deb패키지로 하고자 한다.

(라즈베리파이2 크로스컴파일에 대한 내용은 http://kkn1220.tistory.com/14 를 참고하면됩니다.)


실습환경: vmware11 ubuntu-mate 14.04

타겟단말: 라즈베리파이2

타겟단말 커널버전: 4.0.9-v7+


지난 시간 /usr/src/hello-0.1 에는 리눅스 버전으로 사용하였기 때문에

이번에는 /usr/src/hello-0.2 로 생성한다.


c소스


Makefile 소스 (아래의 내용이 이해가 안가시면 http://kkn1220.tistory.com/14를 참고하시면 됩니다.)


dkms.conf 소스



준비는 끝났다.


이전 강좌와 방식이 똑같다.


1. dkms add

$sudo dkms add -m hello -v 0.2



2. dkms build

$sudo dkms build -m hello -v 0.2



3. dkms install

$sudo dkms install -m hello -v 0.2

(이미 설치하여서 그런건데 할 때 이상없음)


modinfo를 통한 모듈 확인



4. dkms mkdeb

$sudo dkms mkdeb -m hello -v 0.2


deb파일 생성 확인


scp를 통한 타겟 단말에 deb파일 전달

$scp <deb 파일> pi@192.168.0.xx:<path>


raspberry2 단말에서 전송 확인


원래는 repository에 등록하여 apt-get update 및 install을 통해 확인하려고 했으나 

시간 제약 상 dpkg를 이용하여 설치


$sudo dpkg -i hello-dkms_0.2_all.deb


raspberrypi2 단말에서 lsmod를 통하여 모듈이 올라온것을 확인.

만약 안올라올 경우 init에서 모듈이 부팅될 때 자동으로 올라오도록 설정하면됨.



지난시간과 이번시간에는 dkms mkdeb를 통하여 모듈을 deb파일로 패키징하는 것을 해보았습니다.

리눅스 host에서와 타겟 단말의 크로스 컴파일까지 같이 해보았습니다.

다음 번에는 repository 구조에 대해 포스팅하고자 합니다.


잘 되던 라즈베리파이에서 갑자기 sd카드가 안될 수가 있다.

포맷을 하려고해도 input output 에러가 나오고

리눅스의 fdisk, 윈도우의 diskpart를 해도 포맷이 절대로 안된다.


또한, sdformatter로 overwriting 포맷을 해도 오류가 나오고 ( Input/output error)

단순 erase로 했을 때에는 성공을 했을지도 몰라도 win32diskimager에서 이미지를 write할 때 에러가 나온다.


처음에는 sd카드가 망가졌다고 생각했으나 이것저것 테스트한 결과 카드리더기가 문제다....

라즈베리파이 start kit를 샀거나 싼 리더기(2,000)원 미만의 제품은 복구기능이나 보호기능이 전~~~~혀 없어서

망가지기 쉽다.


대체할 수 있는 방법으로는

1. 좋은 카드리더기 구매

2. adapter가 포함된 sd카드 구매(인터넷에서 sandisk type10 8GB 시 6,000원 정도 밖에 안함)


개인적으로 2번 추천


2번으로 한 결과 잘되고 망가졌다고 생각했던 sd카드 또한 포맷도 잘되고 이미지도 잘 구워진다.


같은 이슈가 있으신분들은

멀쩡한 sd카드를 버리지마시고 리더기나 어댑터를 사용하시기 바랍니다...



아침부터 라즈베리를 키는데 갑자기 에러가 출력되었다.


fsck: Warning... fsck.vfat for device /dev/mmcblk0p1 exited with signal6.

fsck died with exit satus 8

failed (code 8).

[FAIL] File system check failed. A log is being saved in /var/log/fsck/ckeckfs  ~~




에러 로그 확인




급한마음에 막 unmount하지 않고 sd카드리더기에서 빼고 그랬는데 문제가 생겼나보다..


해결방법

https://www.raspberrypi.org/forums/viewtopic.php?f=28&t=53365 참고


sudo dosfsck -w -r -l -a -v -t /dev/mmcblk0p1

본인의 경우(sudo dosfsck -w -r -l -a -v -t /dev/sdb1)


결과값


dosfsck이란 (MAN 참고)

MS-DOS 파일 시스템을 체크하고 수리하기 위함

Synopsis

dosfsck [-aAflrtvVwy] [-d path -d ...] [-u path -u...] device

Options    



.  라즈베리 확장

임베디드 개발 환경 구축


§module built-in
http://poplinux.tistory.com/106 참고 (Makefile 내용)
http://sonseungha.tistory.com/112 참고(모듈 빌트인 방법)
http://chlrbgh0.tistory.com/110 참고(모듈 빌트인 방법)
저번 시간에는 커널 모듈을 insmod로 적재하는 것을 해보았고 이번에는 모듈을 커널 이미지에 built-in을 해보고자 한다. (http://kkn1220.tistory.com/14)

- Makefile을 살펴보면 
obj-y := audio_device.o
obj-m := audio_device.o
obj-$(CONFIG_TEST) := audio_device.o 를 살펴볼 수 있다.
위의 -y 옵션은 built-in을 할 때의 옵션이고 -m은 모듈 형식으로의 옵션이다. 
마지막의 경우 리눅스 커널 configure 할 때 사용되는 옵션은
- (*) : built-in
- (M) : Module
- ( ) : not built
이 있는데 해당 옵션을 체크했을 때 make menuconfig 결과에 따라 모듈이나 빌트인으로 알아서 컴파일 된다. 

- 예제
      - hello.c code


- Makefile


- hello 파일 내부(cd linux/driver/hello)  linux폴더-driver폴더 내 hello 폴더 생성


- Makefile 수정

- vi linux/driver/Makefile        //리눅스 폴더 내 드라이버의 Makefile을 수정하는 것이다.


마지막에 obj-y += hello/ 를 적어준당


리눅스 폴더에 가서(cd ../../) 

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig 실행

(*여기에서 arm-linux-gnueabihf-bcm2709_defconfig의 위치는 각자 설정해주어야 된다)

(본인의 경우 make ARCH=arm CROSS_COMPILE=/home/kkn/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- bcm2709_defconfig가 경로이다)



make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs

(make ARCH=arm CROSS_COMPILE=/home/kkn/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- zImage modules dtbs)

(사실 dtbs는 필요한지 아닌지는 모르겠당.. 어차피 make clean하지 않아서 금방 진행되므로 무시하고 컴파일 했음)




새로 생성한 hello폴더 내 hello가 built-in되는 것을 확인할 수 있다.



진행이 끝나면 위의 메시지를 확인할 수 있다.(한 10초 걸린듯)


sd카드에 설치 (lsblk 명령어로 sd카드가 올라와있는지 확인해야함)

-mount

$ mkdir mnt/fat32

$ mkdir mnt/ext4

$ sudo mount /dev/sdb1 mnt/fat32

$ sudo mount /dev/sdb2 mnt/ext4

-모듈 설치
  $ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

*arm-linux-gnueabihf는 앞 장의 컴파일러 path, INSTALL_MOD_PATH는 설치할 path 경로

- kernel image(mkknlimg 스크립트로 변환 필요), dtb(device tree blob) 복사

$ sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img    //필수 항목은 아님(백업용)

$ sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img        

(scripts는 linux폴더 에서 실행해야함, $KERNEL.img 는 kernel7.img를 지칭(kernel.img 조심하자))

$ sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/   

(dtb는 사실 안바뀌었을 거 같지만 난 초보기 때문에 그냥 복사...)

$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/

$ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

$ sudo umount mnt/fat32

$ sudo umount mnt/ext4


라즈베리파이에 sd카드를 넣고 booting


uname -a로 확인


dmesg로 확인



lsmod는 로딩된 모듈만 확인하는 것이고 built-in 된 것은 출력되지 않는다고 한다..
왜 안나오나 잘못되었나 싶었음..


시스템콜 후킹한 것을 테스트해보았을 때에는 부팅 될 때 메시지가 출력되면서 멈춤..

너무 많은 메시지를 호출해서 멈춘걸까 아니면 init에서 필수 드라이버가 로딩되기 전에 진행이 되어서 그런걸까 좀 더 공부해야할듯..




* module을 insmod할 때에는 linux폴더 내 System.map에는 모듈 심볼이 없지만 built-in을 할 때에는 있는 것을 확인할 수 있다.


(이런식으로..)







라즈베리 확장

임베디드 개발 환경 구축


§시스템 콜 후킹
후킹이란 사전적 단어 그래도 가로채다의 뜻. 즉 시스템 콜 후킹이란 정상적인 시스템을 가로채서 원하는 것을 실행시키는 것을 의미
시스템 콜을 후킹하기 위해서는 시스템 콜 테이블의 시작 주소를 담은 커널 내 포인트 변수인 sys_call_table 주소를 알아야 됨

- $cat linux/System.map | grep sys_call_table

후킹 할 시스템 콜 검색
$vi linux/arch/arm/include/uapi/asm/unistd.h

예제에서는 NR_open 후킹

Makefile 생성


Test c코드 작성


make


- ls로 생성된 파일 확인


- Target에 전달

- $scp hook1.ko pi@192.168.0.9:/home/pi/test


라즈베리에서 확인



위의 화면을 보면 sys_open을 후킹하여 내가 원하는 것을 확인할 수 있다.
또한 rmmod를 통해 모듈을 내렸을 때 Module exit 메시지를 확인할 수 있다.

다음번에는 모듈을 insmod, rmmod하는 것이 아닌 직접 박아서 test할 계획.


라즈베리 확장

임베디드 개발 환경 구축

§시스템 콜(System call)
운영체제에 의하여 보호되는 자원인 커널 메모리, 커널 데이터 등을 사용자 프로세스가 이용하려면 컨널과
사용자 프로세스가 공유할 수  있는 인터페이스가 필요
권한 레벨을 설정하여 사용자 공간과 커널 공간 구분
서로 다른 공간에 대한 접근은 시스템 호출로만 가능하도록 제한

시스템 호출을 실행하면 사용자 모드에서 시스템 모드로 전환되며, 커널에서 시스템 호출을 종료하면 사용자
모드로 다시 복귀


§리눅스에서 지원하는 시스템 호출
프로세스 관리: fork(), execve(), getpid(), signal()
파일시스템: open(), read(), write(), close()
메모리 관리: brk() emd
네트워크 관리: socket(), bind(), connect()

기타 시스템 정보나 제어 time()


§사용자 프로그램의 번역 과정

§시스템 콜 원리
Linux 에서의 system call 처리
Interrupt 처리 매커니즘 사용
-Interrupt
주변 장치와 커널이 통신하는 방식 중 하나로

주변 장치가 자신에게 발생한 비동기적 사건을

kernel에게 알리는 매커니즘




§시스템 호출 동작 과정(fork 시스템 호출 과정)



§시스템 호출 동작 과정(fork 시스템 호출 과정)

소프트 웨어 인터럽트를 통하여 사용자 모드에서 커널 모드로 전환되어 커널 자원에 접근
Swi 900002;
시스템 호출 번호 900002

시스템 호출 번호를 포함하는 테이블의 시작점이 900000이기 때문에 fork() 시스템 호출 번호는 2

(등록된 시스템 호출 함수 중 세 번째 위치)

호출 번호 2에 해당하는 커널 함수 sys_fork() 호출 


§시스템 호출 구현
hello() 시스템 호출 구현 예
-시스템 호출 후 /var/log/messgaes에 출력 (“hello, I am system call example”)
-$ vi linux/kernel/hello.c  //해당 리눅스 커널 폴더에 파일 생성해야 됨


#include <linux/kernel.h>

Asmlinkage void sys_myhello()

{

    printk(“hello, I am system call example”);

}


시스템 호출 번호 테이블에 등록

$ vi linux/arch/arm/include/uapi/asm/unistd.h  //버전마다 다를 수 있음
-시스템 호출 함수 등록

-$ vi linux/arch/arm/kernel calls.S  //버전마다 다를 수 있음

-Makefile 파일 수정

-$ vi linux/kernel/Makefile

-수정된 커널을 다시 빌드 후 이미지 생성
-$ make ARCH=arm CROSS_COMPILE=/home/kkn/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin/arm-linux-gnueabihf- zImage   
-Kernel imagetarget에 복사


라즈베리 확장

임베디드 개발 환경 구축


https://www.raspberrypi.org/documentation/linux/kernel/building.md 참고

http://cs.sch.ac.kr/lecture/Embedd/2012/12-EmbedSW-11-Module.pdf 참고

§크로스 컴파일
대부분의 사용자들은 PC라는 동일한 환경에서 프로그램을 작성 및 컴파일하고 동일한 환경에서 실행한다. 이 때 컴파일을 네이티브  컴파일이라 하고 PC 환경에서 라즈베리용 모듈을 컴파일하여 라즈베리 환경에서 실행. 즉 컴파일은 PC에서 하였고 실행은 라즈베리 파이 환경에서 하는데 이렇게 동작하는 환경과 시스템이 다를 때 이 컴파일을 크로스 컴파일이라고 함

1. 라즈베리 파이 커널 소스 다운로드

$ git clone --depth=1 https://github.com/raspberrypi/linux  //depth의 경우 히스토리는 복제하지 않기 때문에 빠름

2. 툴체인 설치

$ git clone https://github.com/raspberrypi/tools

-컴파일러 위치를 아는 것이 중요한데

          32bit: /tool/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian/bin

          64bit: /tool/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/bin  이다.

3. 소스 빌드  

$ cd linux

$ KERNEL=kernel7 

$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- bcm2709_defconfig

-2번째 줄의 경우 라즈베리파이2kernel7이다. 라즈베리파이2boot partition에는 kernel도 있고 kernel7도 있으니 혼동 주의

   $ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- zImage modules dtbs
-Note: To speed up compilation on multiprocessor systems, and get some improvement on single processor ones, use -j n where n is number of processors * 1.5. Alternatively, feel free to experiment and see what works


4. SD card에 직접 설치

-리눅스 머신에서 $lsblk을 입력할 경우(SD card input) sdb1,2가 나오는 것을 확인할 수 있다.(NOOBS의 경우 최소 5) 이 때, 1FAT partion, 2ext4 partion이다.
-mount

$ mkdir mnt/fat32

$ mkdir mnt/ext4

$ sudo mount /dev/sdb1 mnt/fat32

$ sudo mount /dev/sdb2 mnt/ext4

-모듈 설치
  $ sudo make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- INSTALL_MOD_PATH=mnt/ext4 modules_install

*arm-linux-gnueabihf는 앞 장의 컴파일러 path, INSTALL_MOD_PATH는 설치할 path 경로

- kernel image(mkknlimg 스크립트로 변환 필요), dtb(device tree blob) 복사

$ sudo cp mnt/fat32/$KERNEL.img mnt/fat32/$KERNEL-backup.img    //필수 항목은 아님(백업용)

$ sudo scripts/mkknlimg arch/arm/boot/zImage mnt/fat32/$KERNEL.img

$ sudo cp arch/arm/boot/dts/*.dtb mnt/fat32/

$ sudo cp arch/arm/boot/dts/overlays/*.dtb* mnt/fat32/overlays/

$ sudo cp arch/arm/boot/dts/overlays/README mnt/fat32/overlays/

$ sudo umount mnt/fat32

$ sudo umount mnt/ext4


5. 모듈 임베디드 장치에서 실행

-샘플코드 hello.c 


- 샘플코드 Makefile


기존의 폴더에서


- Make를 했을 때 아래와 같이 실행이 된다.


다음과 같이 파일이 생성된 것을 확인할 수 있다.

modinfo hello모듈을 확인한 결과 armv7으로 컴파일 된 것을 확인할 수 있다.

scp를 통한 라즈베리로 모듈 전달
lsmod 현재 모듈 확인  
- insmod 후 모듈 확인

-dmesg로 메시지 확인  
- rmmod dmesg로 메시지 확인

















라즈베리 확장

SD card 분석


§SD card 파티션 분석
-Noobs 설치할 경우 적어도 5개 이상으로 SD card 파티션을 분할한다. 이는 Raspbian 이미지같이 전통적인 Standalone image로 설치하는 것과 차이가 있다.(raspbian으로 설치할 경우 파티션은 2개로 분할됨)
Img 파일을 SD카드에 기록하는 방식은 설치속도와 부팅속도가 빠르지만 이미지 기록 프로그램을 사용하여야 하는 단점이 있고,  NOOBS를 이용하는 방식은 다양한 OS를 설치할 수 잇고 부팅 시 바로 운영체제 설치를 선택할 수 있지만 설치속도와 부팅속도 느림
§Standalone partitioning
- A standalone .img file is a complete byte-for-byte image of an entire SD card. It includes the MBR (which stores the partition table) as well as all the raw partitions. This is the lowest-level possible way of writing an SD card, but it's the only way to access multiple partitions on an SD card using Windows (via the Win32DiskImager software).
-Raspbian 이미지를 설치하면 2개의 파티션 boot(fat)file system(ext4)로 나뉘게 됨
-Boot(fat, sdb1) – boot partion으로 라즈베리파이 펌웨어와 컴파일드리눅스 커널과 몇 개의 config 파일을 가짐
-File system(ext4, sdb2)- root partition으로 applicationhome directory리눅스에서 사용되는 파일들을 포함
-SD카드에 직접 이미지를 복사하게 때문에 큰 용량의 SD카드의 경우 지정된 용량의 공간을 할당하게 된다. 그렇기 때문에 앞서 설명했듯이, raspi-config에서 1. Expand_FileSystem 으로 최적화 시켜야 됨
§Standalone booting
-라즈베리파이는 bootstrap code를 사용하지 않음
1.Boot partition에 있는 bootcode.binload
2.Run start.elf(and fixup.dat)
3.Config.txt 파일을 읽고 GPU configurationset up
4.Cmdline.txt(ext4 읽으라는 내용 포함 되어 있음)파일을 읽고 kernel.img 파일을 실행
5.mmcblk0p2(file system partition) mount

6.Continues booting the rest of the system from 6


§NOOBS partitioning

-NOOBS를 처음 FAT-format SD card에 카피하면 하나의 파티션만 SD card에 할당 된다.


 Primary partition

Logical partition 

Type 

Label 

Contents 

 

FAT 

New Volume 

Noobs bootfiles & initramfs, 

OS recovery images


§NOOBS bootup(low-level)
1.FAT-format /dev/mmcblk0p1으로부터 bootcode.bin을 로드하고 실행
2.start.elf 가 없기 때문에 recovery.elf 파일을 로드하고 실행
3.Running recovery.elf then switches the firmware into "NOOBS mode" it usesrecovery.img instead of kernel.img, 

    recovery.cmdline instead of cmdline.txt, and it sets the root filesystem to recovery.rfs.

4.recovery.elfrecovery.cmdline을 읽고 recovery.img를 실행 recovery.cmdline으로부터 읽은 커맨드라인을 파싱하여 recovery.rfsload


§NOOBS bootup(setup mode)
1.NOOBS가 부트 되면 자동적으로 setup mode로 진입하게 되고 자동적으로 하나뿐인 파티션인 /dev/mmcblk0p1을 축소
2.RECOVERY라고 이름 붙여진 파티션을 만드는데 NOOBS의 경우 XGB, NOOBS lite의 경우 XMB로 생성됨
3.만들어진 파티션 /dev/mmcblk0p2은 확장파티션으로 대부분을 차지할 것임
4.Ext4-format partitiondev/mmcblk0p3 (32MB) 생성됨(SETTINGS으로 명명됨). 이것은 언어, 키보드, NOOBS가 필요한 것 들 등에 대한

     기본적인 OS가 로드되어야 되는 것들에 대해 저장하는 파티션

5.   다시 트리거 될 수 있는 프로세스를 방지하기 위해 recovery.cmdlineruninstaller를 삭제


 Primary partition

Logical partition 

Type 

Label 

Contents 

 

FAT 

RECOVERY 

NOOBS bootfiles & initramfs, 

OS recovery images 

 

extended 

 

Any logical partitons 

 

ext4 

SETTINGS 

NOOBS settings 


§NOOBS OS installation
-OS를 설치하면 해당 OS에 맞게 파티션을 할당하여 boot 파티션과

 file system 파티션을 가지게 됨

- 자세한 내용은 https://github.com/raspberrypi/noobs/wiki/NOOBS-partitioning-explained 참고

*NOOBS의 경우 기본적으로 Raspbian 외에 

Arch, OpenELEC등 설치 가능




만약 Arch를 추가 설치할 경우 파티션이 할당되고 부팅 시 선택 가능

(표 삽입에 암걸릴거 같아서 사진으로 대체..)




'프로그래밍 > Raspberry' 카테고리의 다른 글

Raspberry pi2 (시스템 콜)  (0) 2015.08.13
Raspberry pi2 (크로스컴파일)  (0) 2015.08.13
Raspberry pi2 (config.txt 분석)  (0) 2015.08.13
Raspberry pi2 (라즈베리 기본 설정)  (0) 2015.08.13
Raspberry pi2 (Raspbian 설치)  (0) 2015.08.13

+ Recent posts