본문 바로가기

Hop the wag during working

Ramdisk porting Guide

이 포스팅은 kernel2.6.21에 ramdisk를 root filesystem으로 porting한 내용이다.

1. Ramdisk 만들기

ramdisk img 준비
     - block size=1KB인 4MB의 "ramdisk"라는 이름의 disk 이미지를 생성한다.
     $ dd if=/dev/zero of=ramdisk bs=1k count=4096
     - 이미지를 ext2파일 포맷으로 만든다.
     $ mke2fs ramdisk

ramdisk의 내용쓰기 
앞에 만든 4MB ramdisk에 필요한 파일들을 넣는다.
     - 우선 ramdisk를 특정 디렉토리에 mount한다. 
     $ mount -o loop ramdisk MNT_DIR
     - root filesystem에 필요한 bin, dev, etc등을 MNT_DIR에 복사한다.(여기서는 busybox를 컴파일하여 복사하였다.)
     $ cp -dpR busybox/_install/* MNT_DIR
     - 복사가 완료되면 ramdisk를 umount한다.
     $ umount MNT_DIR

ramdisk를 gzip으로 압축한다.
     $ gzip ramdisk
     ramdisk이미지가 ramdisk.gz로 변하였다.

ramdisk의 내용 변경
     - ramdisk.gz를 압축을 푼 후 다시 mount시켜 내용을 수정한다.
     $ gzip -d ramdisk.gz

참고 : mkimage를 이용하여 ramdisk.gz를 또 다른 포맷을 만들 수가 있는데 이것은 u-boot의 bootm명령의 2번째 파라메터로 들어가 booting명령을 수행할 수도 있다. 이는 kernel이미지를 uImage로 만드는 것과 같은 것으로 특정 메모리에 존재하는 ramdisk이미지를 u-boot에서 체크섬을 통해 제대로 된 이미지인지를 체크하기 위함이다.
     - mkimage 적용(host에서 img만들기)
     $ mkimage -n 'Ramdisk' -A arm -O linux -T ramdisk -C gzip -a 0x00a00000 -e 0x00a00000 -d ramdisk.gz
        ramdisk.img 

    
     - ramdisk.img로딩(target의 u-boot에서 bootm커맨드 실행)
     u-boot # tftp 0x7fc0 uImage (커널 이미지 다운로드)
     u-boot # tftp 0x00a00000 ramdisk.img (ramdisk.img 다운로드)
     u-boot # bootm 0x7fc0 0x00a00000

## Booting image at 00007fc0 ... 
   Image Name:   Linux-2.6.21-arm1 
   Image Type:   ARM Linux Kernel Image (uncompressed) 
   Data Size:    1194980 Bytes =  1.1 MB 
   Load Address: 00008000 
   Entry Point:  00008000
OK
## Loading Ramdisk Image at 00a00000 ... 
   Image Name:   Ramdisk 
   Image Type:   ARM Linux RAMDisk Image (gzip compressed) 
   Data Size:    966236 Bytes = 943.6 kB 
   Load Address: 00a00000 
   Entry Point:  00a00000

Starting kernel ...


허나..mkimage로 만들어진 이미지는 다음의 메세지를 뿌리며 동작하지 않았다..-_ -

RAMDISK: Couldn't find valid RAM disk image starting at 0.
No filesystem could mount root, tried:  ext2 romfs
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(1,0)

어쨌든 mkimage명령은 그냥 그렇게 알아두고 이전에 생성된 ramdisk.gz이미지를 사용하도록 하겠다.

2. Kernel option수정
커널 옵션에서 INITRDRAMDISK support를 설정하여준다.


물론 ramdisk가 ext2파일 포맷으로 되어있기 때문에 kernel config의 Filesystem에서 Second extended fs support옵션을 선택하여야 한다.

3. U-boot의 설정
- u-boot의 bootargs환경 변수를 다음과 같이 만들어 준다.
u-boot # setenv bootargs root=/dev/ram0 rw initrd=0x00a00000,4M ramdisk=4096 mem=16M console=ttyAMA0,15200
- 커널부팅
u-boot # tftp 0x7fc0 uImage
u-boot # tftp 0x00a00000 ramdisk.gz
u-boot # bootm 0x7fc

.........................................
RAMDISK driver initialized: 16 RAM disks of 4096K size 1024 blocksize
.........................................
RAMDISK: Compressed image found at block 0
VFS: Mounted root (ext2 filesystem).
Freeing init memory: 100K
init started: BusyBox v1.10.3 (2008-10-01 20:42:10 KST)
starting pid 177, tty '': '/etc/init.d/rcS'
Cannot run '/etc/init.d/rcS': No such file or directory

Please press Enter to activate this console.
#

bootargs중에 ramdisk=4096은 ramdisk의 크기이다. 그리고 initrd=0x00a00000은 ramdisk이미지의 load address일 것인데 4M의 옵션은 정확히 잘 모르겠다.
아시는 분은 가르쳐주시길..

참고 자료 :
http://blog.naver.com/hybusnet?Redirect=Log&logNo=40037553977
http://blog.naver.com/kingseft?Redirect=Log&logNo=140043220429
http://222.112.227.25/bbs/view.php?id=cquestion&page=2&sn1=&divpage=1&sn=off&ss=on&sc=on&keyword=ramdisk&select_arrange=headnum&desc=asc&no=394