지난번에 Ubuntu에 ADB를 인스톨했지만, 웬지 아직까지는 Window가 편한지라 Window를 이용해서 진행을 해보았다.

Android Debug Bidge를 이용하여 현재 동작 중인 Beaglebone Black(BBB)에 PacktHAL files을 넣을 수 있다.

참고로 본인은 Window10에서 이 작업을 실시하였다.

먼저 Eclipse에서 사용하는 ADB.exe가 위치한 경로를 파악한다. 본인의 경우는 경로가 D:\02_Dev_Tools\01_Android\eclipse_SDK\platform-tools이다.

윈도우에서 CMD 창을 열고 ADB.exe가 위치한 경로로 이동한 후, BBB를 USB케이블로 PC와 연결한다.

BBB가 정상 부팅이 된 후, 아까 열었던 윈도우 CMD 창에서 하기와 같이 adb devices를 입력하여 현재 연결된 Android 기기를 검색한다.

BBB가 정상적으로 연결되었다면, 위의 그림과 같이 adb devices 명령어로 BBB가 검색이 될 것이다.

이제 준비는 마쳤고, ADB Tool을 이용하여 PacktHAL 파일을 넣기위해 다음과 같은 명령어들을 하나씩 실행한다.

1. ADB를 통해 BBB의 Android 내부 Shell을 이용하여, BBB Android root filesystems을 read-only에서 read-write로 remount 한다.

$ adb shell

root@beagleboneblack:/ # mount -o rw,remount rootfs /

root@beagleboneblack:/ # exit

 

2. BBB의 Android root filesystem에 필요한 파일(BB-PACKTPUB-00A0.dtbo를 system/vendor/firmware에 그리고 init.genericam33xx(flatteneddevicetr.rc 파일은 root에)들을 넣는다.

본인의 경우 두 파일 모두 C:\Temp에 위치 시켰으므로 다음과 같이 명령어를 입력하였다.

$ adb push D:\Temp\BB-PACKTPUB-00A0.dtbo /system/vendor/firmware

$ adb push D:\Temp\init.genericam33xx(flatteneddevicetr.rc /

$ adb shell su -c "chmod 750 /init.genericam33xx*.rc"

3. BBB의 Android root filesystem안의 Shell로 Sync를 하고 read-only로 remount 해준다.

$ adb shell

root@beagleboneblack:/ # sync

root@beagleboneblack:/ # mount -o ro,remount rootfs /

root@beagleboneblack:/ # exit

이상으로 Android Debug Bidge(ADB)를 이용하여 현재 동작 중인 Beaglebone Black(BBB)에 PacktHAL files을 넣는 방법을 확인했다.

현재 Android Studio 3.5.2를 사용하고 있다.

간단한 Java 파일을 만들어 컴파일을 하려고 하는데, Error가 발생한다. 그 회피 방법을 구글링 끝에 찾아내어 이렇게 글을 써 본다.

우선, 내가 했던 작업은 다음과 같다.

Project를 하나 생성하고, app→java→com.example.myapplication 내부에 VariableAndType이라는 Java class를 만들었다.

그 다음 다음과 같이 간단한 코드를 입력하고 나서, 오른쪽 버튼 클릭 후 Run을 실행한다.

그랬더니 Error가 다음과 같이 발생한다.

오후 12:14:00: Executing task 'VariableAndType.main()'...

Executing tasks: [VariableAndType.main()] in project D:\01_MS_Work\99_Personal\01_Study\FastCampus\Java\Chapt4


FAILURE: Build failed with an exception.

* Where:
Initialization script 'C:\Users\MSKIM~1\AppData\Local\Temp\VariableAndType_main__.gradle' line: 20

* What went wrong:
A problem occurred configuring project ':app'.
> Could not create task ':app:VariableAndType.main()'.
   > SourceSet with name 'main' not found.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.

* Get more help at https://help.gradle.org

Deprecated Gradle features were used in this build, making it incompatible with Gradle 6.0.
Use '--warning-mode all' to show the individual deprecation warnings.
See https://docs.gradle.org/5.4.1/userguide/command_line_interface.html#sec:command_line_warnings

BUILD FAILED in 0s
오후 12:14:01: Task execution finished 'VariableAndType.main()'.

"SourceSet with name 'main' not found." 라는 키워드로 구글링을 하다 보니 다음 글을 찾을 수 있었다. 물론 번역을 해서 봐야한다. 유럽 국가 언어인거 같은데 자세히는 모르겠음...

http://kodlis.com/sourceset-with-name-main-not-found-hatasi-ve-cozumu/

 

"SourceSet with name 'main' not found." Hatası ve Çözümü | KodLis

Android Studio’nun son sürümünde herhangi bir sınıfı çalıştırdığınızda muhtemelen aşağıdaki hatayla karşılaşacaksınız. What went wrong: A problem occurred configuring project ':app'. Could not create task [...]

kodlis.com

여기에 나온 내용은 다음과 같다.

새로 업데이트된 Android Sutdio에서 앱을 실행하다 보면 내가 본 것과 동일한 Error를 접할 수 있고, 이에 대한 해결책을 알려준다는 것이다.

그 해결책은 먼저, Gradle Scriptsd에서 build.gradle (Module: app)을 열고서, dependencies 부분의 가장 끝에 하기의 문구를 넣으라는 것이다.

androidTestImplementation 'androidx.test.ext:junit:1.1.1'

그래서, 다음과 같이 위의 문장을 다음과 같이 적용해 보았다.

그리고 나서 왼쪽 상단에 "Sync Now'를 클릭.

그 다음 다시 Run을 실행하여 컴파일 진행.

그러나 이전과 동일한 Error가 발생한다.

그 다음 방법으로는 Android Sutdio를 종료 후 해당 프로젝트가 저장된 폴더로 가서 Gradle 폴더만 지우는 것이다.

그 다음 다시 Android Studio를 실행하면 해당 프로젝트가 로딩되면서 Gradle은 자동으로 업데이트 된다.

다시 Run을 실행하여 컴파일을 진행 한다. 그랬던니 Error 없이 결과 값을 정상적으로 출력한다.

- 끝

비글본 블랙에 안드로이드 이미지를 올리겠다.

이 이미지는 http://bbbandroid.sourceforge.net/에서 다운 받을 수 있다. 참고로 첨부 파일로 공유한다.

 

BBBAndroid: A custom Android OS for the BeagleBone Black

What is BBBAndroid? BBBAndroid is a port of AOSP Android KitKat 4.4.4 to the BeagleBone Black. Using the BeagleBone Black's custom Linux 3.8 kernel, BBBAndroid brings the BBB's "cape manager" functionality to the Android environment. This makes BBBAndroid

bbbandroid.sourceforge.net

비글본 블랙에 이미지를 올리기 위해서는 반드시 microSD 카드가 필요하다. 그리고 그 안드로이드에 이미지를 올리기 위한 Tool인 Win32 Disk Imager가 필요하다.

다음과 같은 순서로 이미지를 MicroSD카드에 굽는다.

1. bbbandorid의 옆 링크(또는 첨부한 이미지를 이용)를 통해 https://sourceforge.net/projects/bbbandroid/files/latest/download 안드로이드 이미지를 다운 받을 수 있다. 

2. RAR로 압축이 되었으므로, www.rarlab.com 에서 툴을 다운받아 이미지 압축을 해제하면 된다.

3. 압축된 이미지를 SD 카드에 굽기 위해서는 Win32 Disk Imager 툴이 필요하다. http://sourceforge.net/projects/win32diskimager 를 통하여 툴은 다운 받아 설치하면 된다.

4. 준비된 SD 카드를 삽입하고, 만약 SD 카드가 파티션이 여러개로 나뉘어 있는 경우 다음 방법을 따른다.

  • 윈도우에서 "Window key + x"를 눌러서 디스크 관리를 선택
  • 디스크 관리에서 SD카드에 해당 되는 부분을 확인

  • 오른쪽(data (H:) 영역)에서 부터 왼쪽 순서로 boot까지 오른쪽 클릭 후 볼륨삭제를 실시한다.

  • 볼륨을 하기와 같이 모두 삭제 한다.

  • 할당되지 않은 14.42GB을 선택 후 오른쪽 클리하여 새 단순 볼륨을 만든다. 그 다음 나오는 "단순 볼륨 만들기 마법사" 창에서 순차적으로 다음을 여러번 선택 후 포맷까지 완료 한다.

5. MicroSD 카드에 이미지를 굽기 위해 Win32 Disk Imager 툴을 실행한다.

6. 툴에서 Device는 MicroSD 드라이브를 지정하고, Image File은 안드로이드 이미지가 저장된 경로를 지정한다. 그 다음 Wirte 버튼을 클릭하여 실행한다.

그 다음은 이미지를 포함한 MicroSD 카드를 BBB에 삽입 후 전원을 키기만 하면 끝이다.

Ubuntu v18.04에 ADB를 설치한다.

$ sudo apt-get install android-tools-adb android-tools-fastboot

위의 명령어를 Ubuntu의 terminal 창을 이용하여 입력한다.

그 다음 하기의 명령어를 이용하여 현재 접속되어 있는 안드로이드 기기를 검색한다.

$ adb devices

하지만... 나의 경우는 표시되는 list에 접속한 기기가 없다.

adb devices 명령어를 실행했을때 접속된 기기가 list에 없는 경우는 어떻게 해야 하는 걸까?

USB에 연결된 안드로이드 기기를 뺐다가 다시 연결을 했다. VMware에서 돌아가고 있는 Ubuntu에서 USB 장치를 Host로 연결할지 현재 돌아가고 있는 Ubuntu에서 연결할지를 물어본다.

당연히 현재 돌아가고 있는 Ubuntu에서 연결을 선택 한 후, 다시 명령어를 입력.

다행히도 정상적으로 인식이 되었다.

 

안드로이드 소스 컴파일을 하기 위한 예비 작업 중에 하기 내용 중 #3/4번을 실행할 차례이다.

  1. Python 2.5 or 2.7
  2. Java JDK 설치
  3. 빌드도구들과 git, repo 설치
  4. 안드로이드 소스 다운로드

3. 빌드도구들과 git, repo 설치

4. 안드로이드 소스 다운로드

Beglebone Black용 안드로이드 소스 다운로드를 하는 방법은 대부분 다음과 같이 www.gitorious.org/rowboat repository를 통해 소스코드를 받으라고 되어 있다.

하지만, 불행히도 해당 서버에서 더 이상 지원을 하지 않기 때문에 이 방법은 사용할 수 없다.

그래서 2가지 방법을 찾아냈다.

그 첫번째는 아래 웹에서 말하는 방법을 따르는 것이고, 다른 하나는 우리가 사용하는 Beaglebone Black에 사용하는 Main SoC인 AM3559의 chip maker인 TI 홈페이지에서 DevKit용 안드로이드 Source 코드를 받는 방법이다.

첫번째 방법을 이용하기 위해서 아래 웹페이지를 따른다.

https://adinpro.tistory.com/34

 

Beaglebone Black 보드의 안드로이드 포팅

1.개발 목표 beagleboneblack의 android를 포팅하고 이름을 자신의 영문이름으로 올바르게 포팅 되었는지 beagleboneblack을 통해 확인해 봅니다. 2. 개발 환경 window 7 home premium K, VMware Workstation11, U..

adinpro.tistory.com

http://linux.hoseo.edu/ 에서 android_source.tar.xz를 다운 받은 후 그 웹페이지에 설명되어 있는 대로 차근차근 따라가다가 한 군데에서 막혀 버렸다.

make TARGET_PRODUCT=beagleboneblock OMAPES=4.x droid -j8

위의 명령어를 시작하자 make version 문제가 발생한 것이다.

그래서 make Downgrade 하는 방법을 찾아 보았더니 다음과 같은 방법이 있다.

https://m.blog.naver.com/PostView.nhn?blogId=chandong83&logNo=220766613564&proxyReferer=https%3A%2F%2Fwww.google.com%2F

 

make 다른 버전 설치

현재 Ubuntu 16.04LTS를 사용 중이다. 그러다 보니 오래된 소스를 빌드 하려고 하면 문제가 많이 발생...

blog.naver.com

그 내용은 다음과 같다.

아래의 사이트에서 원하는 버전을 다운로드한다.

http://ftp.gnu.org/gnu/make/

다운로드한 파일을 압축을 푼 후

>tar zxvf make-3.81.tar.gz

>cd make-3.81

make-3.81>./configure 

make-3.81>make

make-3.81>sudo make install

하지만 make 명령어를 실행하게 되면 다음과 같은 Error가 발생한다.

이 Error에 대해서 검색을 해보니 다음과 같은 웹페이지를 찾을 수 있었다.

https://stackoverflow.com/questions/51675200/install-older-version-of-gnu-make-in-ubuntu-18-04

 

Install older version of gnu-make in Ubuntu 18.04

I want to install make 3.81 on Ubuntu 18.04. So I download this version of make and run ./configure and then make. But when compiling it gives me this error: ./glob/glob.c: In function ‘glob’: ....

stackoverflow.com

언급된 해법과 같이 다음 구문을 변경해 주었다.

  • Before
# include  <gnu-versions.h>

# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION
  • After
# if _GNU_GLOB_INTERFACE_VERSION == GLOB_INTERFACE_VERSION

수정 후 make와 make install을 실행하면 정상적으로 실행이 되고 /usr/loc/bin/ 에서 install된 make 파일을 확인 할 수 있다.

새로 설치된 make file의 이름을 다음과 같이 변경한다.

sudo mv /usr/local/bin/make /usr/local/bin/make-3.81

그리고 기존 설치된 make file의 이름도 다음과 같이 변경한다.

sudo mv /usr/bin/make /usr/bin/make-4.1

쉽게 변경할 수 있도록 update-alternatives에 추가한다.

mskim@ubuntu:~$ sudo update-alternatives --install /usr/bin/make make /usr/bin/make-4.1 1

update-alternatives: using /usr/bin/make-4.1 to provide /usr/bin/make (make) in auto mode

 

mskim@ubuntu:~$ sudo update-alternatives --install /usr/bin/make make /usr/local/bin/make-3.81 2

update-alternatives: using /usr/local/bin/make-3.81 to provide /usr/bin/make (make) in auto mode

이제 사용하고 싶은 버전을 update-alternatives --config로 변경한 다음 사용하면 된다.

 

드디어 컴파일을 다시 시작 했다.

헌데...

또 무엇인 문제인지... 어렵군 어려워...

 

 

 

그래서 안드로이드 홈페이지를 방문하여 Android 2.3.x(Gingerbread)에서 필요로 하는 Ubuntu version은 12.04(Precise)로 확인 할 수 있다.

https://source.android.com/setup/build/older-versions

 

Supporting Older Versions  |  Android Open Source Project

이 다음은 나중에 시간될때 다시 정리를 해보겠다...

To be continue...

Overview

안드로이드 소스를 컴파일 하기 위해서는 아래와 같은 준비 사항이 필요하다.

  1. Python 2.5 or 2.7
  2. Java JDK 설치
  3. 빌드도구들과 git, repo 설치
  4. 안드로이드 소스 다운로드

 

1. Python 2.5 or 2.7 설치

Ubuntu를 설치하면 기본적으로 Python이 깔려 있다.

Jave -version 명령어로 현재 Ubuntu에 깔려있는 Java 버젼을 확인 할 수 있다.

 

2. Java JDK 설치

TI에서 제공하는 BeagleBone-Android-DevKit Guide에 다음과 같이 언급되어 있다.

Android Gingerbread (2.3.4) needs Java 6 on ubuntu, whereas the previous version FroYo (2.2) was using Java 5.

http://processors.wiki.ti.com/index.php/BeagleBone-Android-DevKit_Guide#Developing_with_source_code

 

BeagleBone-Android-DevKit Guide - Texas Instruments Wiki

What is BeagleBone The BeagleBone is a low-cost, high-expansion hardware-hacker focused BeagleBoard. It is a bare-bones BeagleBoard that acts as a USB or Ethernet connected expansion companion for your current BeagleBoard and BeagleBoard-xM or works stand-

processors.wiki.ti.com

우선 Java 6를 받아 보도록 하겠다.

그런데 위와 같이 문제가 있다.

여러 웹을 돌아다니며 자료를 찾아보면서 귀한 자료를 통해 Oracle에서 이전 버젼의 JDK를 받을 수 있는 것을 확인 하였다.

그 귀한 자료는 아래와 같다.

https://naltaengi.tistory.com/42

 

도커]Ubuntu Container 에 oracle java 6 설치하기

이번 글에서는 우분투 이미지를 올린 Container 에 Oracle java6 환경을 구축해 보도록 하겠습니다. 기존 sun사의 java에서 oracle로 변경 되면서 java 설치 방법이 변경되었고, 기본 패키지로 설치가 불가능합니..

naltaengi.tistory.com

 

그리고 Oracle에서 JDK6를 받을 수 있는 곳은 아래 링크이다.

https://www.oracle.com/java/technologies/javase-java-archive-javase6-downloads.html

 

Java Archive Downloads - Java SE 6

No results found Your search did not match any results. We suggest you try the following to help find what you're looking for: - Check the spelling of your keyword search. - Use synonyms for the keyword you typed, for example, try “application” instead of

www.oracle.com

위의 홈피를 보면 JDK6에 대한 여러 가지 버젼이 존재한다.

여기서는 아래로 내려가다 보면 발견할 수 있는 jdk-6u38-linux-i586.bin을 Ubuntu에 설치하기 위해 다운로드 받는다.

아래와 같이 Ubuntu Downloads 폴더에 해당 파일을 확인 할 수 있다.

Download한 폴더로 이동을 한다.

압축파일을 풀기 전에 해당 파일에 대한 실행 권한을 부여한다.

bin 파일에 대한 압축 풀기를 실시한다.

... 중략 ...

압축 풀은 폴더를 /usr/lib/jvm/로 옮긴다.

압축을 해제한 파일들을 이용하여 /usr/lib/jvm/jdk1.6.0_38/bin/ 폴더에 JDK 설치를 시작할 것이다.

update-alternatives 명령어를 이용해 JDK를 설치한다.

sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/jdk1.6.0_38/bin/javac 1

sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/jdk1.6.0_38/bin/java 1

sudo update-alternatives --install /usr/bin/javaws javaws /usr/lib/jvm/jdk1.6.0_38/bin/javaws 1

설치한 자바가 디폴트로 사용되도록 다음과 같이 명령어를 추가한다.

sudo update-alternatives --config javac

sudo update-alternatives --config java

sudo update-alternatives --config javaws

Verify the symlinks all point to the new java location을 위해 다음 명령어를 실행한다.

그리고 Enable Java plugin을 실행 한다. 그리고 나서 자바 버젼을 확인하면 다음과 같이 확인이 가능하다.

환경변수 설정을 통해 JAVA_HOME을 다음과 같이 정의한다.

명령어를 실행하면 environment 화면이 아래와 같이 뜨고, JAVA_HOME=/usr/lib/jvm/jdk1.6.0_38을 입력하면 된다.

왼쪽 상단의 Save를 누르고 창을 닫는다. 그런데, 하기와 같이 경고 메세지가 뜨는군...

그 다음 java -v 를 입력하면 java version을 확인 할 수 있다.

 

# Install Kernel and Root File System

지금까지 SD 카드에 Boot 로더를 올린 후 파티션을 나누고 포맷을 진행 그리고 임의의 디렉토리에 마운트를 진행했다.

이제부터는 커널과 루트 파일 시스템을 Install 하는 과정이다. 

우선 커널버젼에 대한 환경변수를 설정을 해야하는데, 기존 리눅스 소스를 다운받은 bb-kernel 포더에서 kenel_version 파일을 통해 커널버젼을 다음과 같이 확인이 가능하다.

현재 사용하고 있는 커널버젼은 "4.19.72-bone-rt-r40"임을 확인 할 수 있다.

따라서 다음과 같이 환경변수 설정을 할 수가 있다.

export kernel_version=4.19.72-bone-rt-r40

 

1. Copy Root File System

루트 파일 시스템을 복사하는 과정은 다음과 같다.

~/ (루트폴더에서)

sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/

sync

sudo chown root:root /media/rootfs/

sudo chmod 755 /media/rootfs/

첫번째 명령어는 기존에 우리가 "ubuntu-180.04.2-minimal-armhf-2019-02-16" 폴더에 다운로드한 우분투 파일시스템 압축 파일을, MicroSD 카드를 마운트한 /media/rootfs/ 폴더에 압축해제 하는 것이다.

...중략...

그 다음 위에 언급된 명령어들을 순차적으로 다음과 같이 진행 한다.

- sync : 메모리에 저장되어 있는 작업내용을 디스크에 저장을 한다.

- sudo chown root:root /media/rootfs/ : /media/rootfs/ 내부의 owner/group을 root로 바꾼다.

- sudo chmod 755 /media/rootfs/ : 파일의 권한을 755로 하겠다는 의미로 숫자가 각각 의미하는 것은 백/십/일의 자리는 각각 2진수 3자리로 xxx(x는 1 or 0)으로 구성이 되며, 2진수의 가장 왼쪽 자리는 읽기(Reading)로 이것이 1이 되면 10진수로 4가 되며, 2진수의 중간 자리는 쓰기(Writing)로 이것이 1이 되면 10진수로 2가 되며, 2진수의 마지막 자리는 실행(Executing)으로 이것이 1이 되면 10진수로 1이 된다. 따라서 파일 권한을 755로 하는 것에서 7이 의미하는 것은 쓰기/읽기/실행의 권한을 모두 준다는 의미이며, 5의 의미는 읽기/실행에 대해서만 권한을 준다는 것이다. 또한 755에서 백/십/일의 자리가 각각 의미하는 것은 소유자권한/그룹사용자권한/기타사용자권한을 의미한다. 결과적으로 755의 의미는 소유자권한은 읽기/쓰기/실행의 모든 권한을 부여하며, 그룹사용자권한/기타사용자권한은 읽기/실행의 권한을 부여한다는 것이다.

2. 부트이미지 이름설정

~/ (루트폴더에서)

sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"

uEnv.txt 파일에서 uname_r을 설정을 한다.

3. Copy Kernel Image

~/ (루트폴더에서)

sudo cp -v ./bb-kernel/deploy/${kernel_version}.zImage /media/rootfs/boot/vmlinuz-${kernel_version}

위의 명령어는 기존에 linux kernel을 컴파일 한 zImage 파일을 MicroSD 카드에 복사를 하는 것이다.

 

4. Copy Kernel Device Tree Binaries

~/

sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}/

sudo tar xfv ./bb-kernel/deploy/${kernel_version}-dtbs.tar.gz -C /media/rootfs/boot/dtbs/${kernel_version}/

하기와 같이 MicroSD 카드에 폴더를 만들고 기존에 다운로드했던 bb-kernel의 폴더 안의 deploy 폴더에서 디바이스 트리 바이너리 압축파일을 MicroSD 카드에 새로 만든 폴더에 압축을 푼다.

참고로, ARM에서 디바이스 트리 바이너리는 x86 계열에서의 BIOS라고 보면된다.

부트로더가 커널을 시작시키기 전에 디파이스 트리 바이너리(DTB)를 메모리 영역에 Copy를 한 후 커널을 시작한다고 한다.

하기 웹사이트에서 정보를 좀 더 자세히 볼 수 있다.

https://limit0.tistory.com/entry/%EB%94%94%EB%B0%94%EC%9D%B4%EC%8A%A4-%ED%8A%B8%EB%A6%AC%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B0%84%EB%9E%B5%ED%95%9C-%EC%84%A4%EB%AA%85

 

디바이스 트리에 대한 간략한 설명

ARM 리눅스에서 x86과 같은 bios 역할을 해 주는 것이 device tree 이다. device tree(DT) = open firmware(OF) = flattened device tree(FDT) 로 불리기도 한다. ㅇ 동작 bootloader는 kernel을 시작시키기 전에..

limit0.tistory.com

5. Copy Kernel Modules

~/ (루트폴더에서)

sudo tar xfv ./bb-kernel/deploy/${kernel_version}-modules.tar.gz -C /media/rootfs/

bb-kernel 폴더 내의 deploy 폴더에 기존에 다운로드 받았던 modules을 MicroSD카드에 압축을 해제합니다.

... 중략...

6. File Systems Table (/etc/fstab)

sudo sh -c "echo '/dev/mmcblk0p1  /  auto  errors=remount-ro  0  1' >> /media/rootfs/etc/fstab"

위의 명령어를 사용하여 파일시스템 테이블 정보를 생성한다.

7. Networking

네트워크 정보를 생성한다.

Edit: /etc/network/interfaces

sudo nano /media/rootfs/etc/network/interfaces

Add:

/etc/network/interfaces

auto lo

iface lo inet loopback

  

auto eth0

iface eth0 inet dhcp

 

8. Remove microSD/SD card

sync

sudo umount /media/rootfs

 

#1에서 SD 카드에 부트로더+리눅스커널+루트파일시스템을 넣을 준비를 모두 마쳤다.

이제 SD 카드 작업을 순차적으로 실시해보자.

 

1. DISK 환경 변수 설정

lsblk 명령어를 사용해서 현재 블럭 장치에 대해서 확인을 한다.

그 다음 SD카드를 삽입하고 동일하게 lsblk 명령어를 사용해서 다른 부분을 확인한다.

다른 부분은 보시다시피 sdb가 되겠다. sdb1이 SD카드 임을 확인 할 수 있다.

그래서 다음과 같이 환경 변수를 설정한다.

export DISK=/dev/sdb

 

2. MicroSD 카드 포맷

MicroSD 카드를 다음 명령어로 파티션을 지우고 포맷한다.

sudo dd if=/dev/zero of=${DISK} bs=1M count=10

 

3. Boot loader Install

~/ (루트폴더에서)

sudo dd if=./u-boot/MLO of=${DISK} count=1 seek=1 bs=128k

sudo dd if=./u-boot/u-boot.img of=${DISK} count=2 seek=1 bs=384k

u-boot 폴더안에서 MLO와 u-boot.img 파일의 크기를 보면 각각 92.6kB와 476.5kB 이다.

따라서 첫번째 행의 명령어를 하기와 같이 실행하면,

그 결과로, u-boot 폴더에 있는 MLO 파일이 이전에 환경 변수를 설정한 DISK위치 즉 MicroSD에 128k 크기 만큼 복사를 한다(MLO 파일이 92.6kB이므로 충분히 커버가 됨).

두번째 행의 명령어를 하기와 같이 입력.

그 결과로, u-boot 폴더에 있는 u-boot.img 파일이 위에 설명했던 내용과 동일하게 MicroSD에 384k*2 크기 만큼 복사를 한다.

4. 파티션 생성

부팅로더가 들어간 부분과 그렇지 않은 부분에 대해서 파티션을 생성해야 하는데, util-linux 버젼 별로 상이하다고 한다.

따라서 다음과 같이 먼저 버젼을 확인할 필요가 있다.

내가 사용하는 util-linux 버젼은 2.31.1이다.

아래와 같이 버젼에 따라 명령어가 다르다.

sfdisk >= 2.26.x

sudo sfdisk ${DISK} <<-__EOF__

4M,,L,*

__EOF__

sfdisk <= 2.25.x

sudo sfdisk --unit M ${DISK} <<-__EOF__

4,,L,*

__EOF__

 

sfdisk >= 2.26x를 사용해야 하므로 다음과 같이 명령어를 실행한다.

5. 파티션 포맷

mkfs.ext4에 대한 버젼을 확인 후 파티션 포맷을 실행한다.

버젼에 따라 명령어가 다른데, 현재 내가 사용하는 버젼은 1.44.1이다.

mkfs.ext4 >= 1.43

for: DISK=/dev/mmcblk0

sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}p1

  

for: DISK=/dev/sdX

sudo mkfs.ext4 -L rootfs -O ^metadata_csum,^64bit ${DISK}1

mkfs.ext4 <= 1.42

for: DISK=/dev/mmcblkX

sudo mkfs.ext4 -L rootfs ${DISK}p1

  

for: DISK=/dev/sdX

sudo mkfs.ext4 -L rootfs ${DISK}1

 

그래서 첫번째 방법을 이용하여 명령어를 다음과 같이 수행한다.

MicroSD 카드를 사용하기 위해서는 임의의 폴더를 만들고, 그곳에 마운트를 시켜야지만 MicroSD카드를 이용 가능하다.

따라서, 여기서는 /media/rootfs/ 라는 폴더를 만든 다음, SDcard에 mount한다.

sudo mkdir -p /media/rootfs/

  

for: DISK=/dev/mmcblkX

sudo mount ${DISK}p1 /media/rootfs/

  

for: DISK=/dev/sdX

sudo mount ${DISK}1 /media/rootfs/

다음과 같이 실행을 해보았다.

lsblk 명령어를 사용하여 실제 MicroSD 카드가 Mount된 이름(/media/rootfs/)을 다음과 같이 확인 할 수 있다. 

 

+ Recent posts