제임스딘딘의
Tech & Life

개발자의 기록 노트/Embedded Linux

PandaBoard ES : 부팅용 SD card 준비

제임스-딘딘 2016. 12. 16. 00:50

PandaBoard ES : 보드 부팅을 위한 SD card 준비


TI 의 ARM Cortex A9 기반의 임베디드 보드인 PandaBoard ES에는 내장된 별도의 저장공간이 없다.

대신에 sd card슬롯을 제공하고, sd카드의 boot partition을 통해 부팅을 하게된다.

아무래도 trial(시험용) 보드 성격이 강해서 그런 것이리라..


우선 판다보드 부팅에 사용할 sd카드를 준비하는 작업이 필요하다.

다음 순서로 진행할 것이다.


1. SD카드 파티션 분할 및 각 파티션 포맷

2. U-Boot 소스코드 다운로드 및 빌드

3. Linux Kernel 소스코드 다운로드 및 빌드

4. Ubuntu의 Root File System 확보 및 SD카드에 복사

5. Wi-Fi driver firmware 확보 및 SD카드에 복사

6. /etc/fstab를 통해 각 파티션을 자동마운트 되도록 수정



파티션 구성


아래와 같이 4개의 파티션으로 구성했다.

16GB SD카드를 우분투로 동작중인 host pc에 꽂으니 /dev/sdc 로 인식되었다.

이를 sdc1 ~ sdc4 까지 4개의 파티션으로 나누었다.


이 부분은 각자의 환경에 따라 다르게 인식될 수 있다.

즉, /dev/sdb가 될 수도 있고... /dev/sdd가 될 수도 있으며.. /dev/mmcblk0 이런식이 될 수도 있다.



Command (m for help): p
Disk /dev/sdc: 14.7 GiB, 15719727104 bytes, 30702592 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x6114984e

Device     Boot    Start      End  Sectors  Size Id Type
/dev/sdc1  *        2048  2099199  2097152    1G  c W95 FAT32 (LBA)
/dev/sdc2        2099200 23070719 20971520   10G 83 Linux
/dev/sdc3       23070720 27265023  4194304    2G 83 Linux
/dev/sdc4       27265024 30702591  3437568  1.7G 82 Linux swap / Solaris


sdc1는 부팅 파티션으로, u-boot.img와 MLO를 넣고, boot flag를 true로 했다.

filesystem type은 FAT32 (LBA)로 하였다.


sdc2는 리눅스를 위한 root 파티션으로, 10GB를 할당했고, filesystem type은 ext4로 했다.

sdc3은 리눅스의 /var 디렉토리를 위한 파티션으로, 2GB를 할당했다. filesystem type은 ext4로 했다.

sdc4는 리눅스의 swap 파티션으로 남은 공간 전체를 할당했다.


파티션 포맷 (Format Partition)


나누어둔 파티션을 실제로 사용하기 위해서는 각각의 파티션을 포맷해야 한다.


jeon@ubuntu:~$ sudo mkfs.vfat -F 32 -n boot /dev/sdc1
[sudo] password for jeon:
mkfs.fat 3.0.28 (2015-05-16)
mkfs.fat: warning - lowercase labels might not work properly with DOS or Windows


jeon@ubuntu:~$ sudo mkfs.ext4 -L rootfs /dev/sdc2
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: 1257cd67-576f-47f8-a55b-d2c8c2a81539
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                           
Writing inode tables: done                           
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done


jeon@ubuntu:~$ sudo mkfs.ext4 -L data /dev/sdc3
mke2fs 1.42.13 (17-May-2015)
Creating filesystem with 524288 4k blocks and 131072 inodes
Filesystem UUID: c38ba4aa-a430-4d3f-b5ca-d5edce08379f
Superblock backups stored on blocks:
    32768, 98304, 163840, 229376, 294912

Allocating group tables: done                           
Writing inode tables: done                           
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done


jeon@ubuntu:~$ sudo mkswap -c -L swap /dev/sdc4
0 bad pages
Setting up swapspace version 1, size = 1.7 GiB (1760030720 bytes)
LABEL=swap, UUID=fa0383da-57ed-4a06-8e9a-e4a4a3659b85



커널 소스 확보 및 빌드


Pandaboard ES에서 사용할 커널이미지를 만들기 위해서, 직접 커널 소스를 빌드하기로 했다.

최대한 그런 일은 없어야 겠지만, 커널 수정이 필요할 경우가 발생하면... 수정의 용이성을 위해서이다.

만약 미리 빌드된 커널이미지를 보드에 올려서 사용한다면, 커널 수정이 필요한 순간, 일치하는 커널 소스를 찾고 빌드환경 만들고... 좀 번거로울 것이기 때문에.

처음부터 미리 번거롭기로 했다.(?)


CPU architecture 별로 커널 빌드를 위한 스크립트를 제공하는 고마운 git 저장소가 있다.



https://github.com/RobertCNelson/armv7-multiplatform/tree/v4.9.x



/dev/sdc2로 root file system 복사

ubuntu 16.04 LTS의 file system을 구해서 2번째 파티션 (리눅스의 root파티션)에 복사해 넣었다.

리눅스의 커널이미지와는 별개로, 우리는 리눅스 배포판의 root file system이 필요하다.

왜 이런 작업이 필요하나면...

커널이미지는 말그대로 커널부분만을 제공한다.

다시말하면 /usr/bin/ 에 존재하는 실행파일들... 즉 여러가지 커맨드들을 사용한다거나..

/etc 아래 존재하는 리눅스의 설정파일등을 통해 리눅스 설정을 한다거나...

systemd등을 통해 부팅시점에 여러가지 데몬들을 띄우거나 소켓을 생성하거나 ... 등등의 작업들은 커널이미지가 제공하지 않는다는 것이다.

이걸 일일히 코드를 구해서, 크로스컴파일 하고... directory 를 구조에 맞게 만들고... 직접하려면 번거로울 것 이다. 물론 한번 해보면 좋은 경험은 되겠지.


이런 것을 제공하기 위해 누군가가 미리 만들어둔 linux root file system을 구해다가 단순히 sd카드에 복사해 넣는 것으로 끝이다.



다운로드

wget -c https://rcn-ee.com/rootfs/eewiki/minfs/ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz



파일 검증

sha256sum ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz
2883cdd3416e0bd5988aa351c88db72ca089a184c5a670662d750568ca0869d8  ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz


압축해제

tar xf ubuntu-16.04.1-minimal-armhf-2016-09-17.tar.xz


참고로 이 ubuntu의 계정은 'ubuntu'이고 암호는 'temppwd' 이다.



root file 복사하기

sudo mount /dev/sdc2 /media/rootfs
sudo tar xfvp ./*-*-*-armhf-*/armhf-rootfs-*.tar -C /media/rootfs/



파일시스템 테이블 (/etc/fstab)


이 작업을 해두어야, 부팅시 자동으로 마운트가 된다.

/media/rootfs//etc/fstab 는 처음에 아무런 내용이 없이 주석이 달린 1줄만 있다.

나는 4개의 파티션으로 나누었으므로 아래와 같이 mount point및 mount option등을 지정해 주었다.

만약 fstab에 대해 익숙하지 않다면, 이에 대해 알아볼 것은 권한다.

내용은 많지 않으나, 여기서는 자세히 다루지 않겠다.


jeon@ubuntu:/media/jeon/rootfs$ cat etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
/dev/mmcblk0p1  /boot  vfat  errors=remount-ro  0  0
/dev/mmcblk0p2  /  ext4  errors=remount-ro  0  1
/dev/mmcblk0p3  /var  ext4  auto  0  0
/dev/mmcblk0p4  none  swap  sw  0  0


간략히 알아보면, fstab은 총 6개의 부분으로 나누어져 있다.

첫번째는 File System Device Name, 두번째는 Mount Point, 세번째는 FileSystem Type, 네번째는 Mount Option, 다섯번째와 여섯번째 숫자의 의미는 각각 Dump할지 말지여부와 File Sequence Check Option값 이다.