2014年10月28日 星期二

建立虛擬 SD Card



目標是建立一個 1GB 的 sdcard.img ,其分割區如下圖:



一、先建一個空的 sdcard.img (User 權限)

(其中 bs 是 block size)
dd if=/dev/zero of=sdcard.img bs=1G count=1

查看一下檔案屬性:
file sdcard.img
hexdump sdcard.img

會發現都是 0 組成的空檔案。

二、連接到 /dev/loop0 (Root 權限)

losetup /dev/loop0 sdcard.img

三、磁區分割 (Root 權限)

fdisk 指令參考
sudo fdisk /dev/loop0
n
p
1
[enter]
+80M

n
p
2
[enter]
[enter]
t
1
b

p
w

四、做 Offset (Root 權限)

fdisk -lu /dev/loop0
查看分割,輸出如下:
所用裝置 開機      開始         結束      區塊   識別號  系統
/dev/loop0p1            2048      165887       81920    b  W95 FAT32
/dev/loop0p2          165888     2097151      965632   83  Linux

losetup -o `expr 512 \* 2048` /dev/loop1  /dev/loop0
losetup -o `expr 512 \* 165888` /dev/loop2 /dev/loop0

查看連接結果,輸出如下:
losetup -a
/dev/loop0: [0804]:9701359 (/home/lin/qemu/sdcard.img)
/dev/loop1: [0005]:1218 (/dev/loop0),偏移值 1048576
/dev/loop2: [0005]:1218 (/dev/loop0),偏移值 84934656

五、格式化 (Root 權限)

先裝 filesystem tools
apt-get install dosfstools

fdisk -lu /dev/loop0
查看分割,輸出如下:
所用裝置 開機      開始         結束      區塊   識別號  系統
/dev/loop0p1            2048      165887       81920    b  W95 FAT32
/dev/loop0p2          165888     2097151      965632   83  Linux

開始格式化記得如入 blocks:
mkfs.vfat /dev/loop1 81920
mkfs.ext4 /dev/loop2 965632

看一下 block id ,如下:
blkid /dev/loop1 
/dev/loop1: SEC_TYPE="msdos" UUID="3A38-5A24" TYPE="vfat"
blkid /dev/loop2
/dev/loop2: UUID="dec7a9d5-b0bb-433b-aefb-6b4eecc28aba" TYPE="ext4"

Debug 1: 
如果找不到 mkfs.vfat 的指令

解決 1:
sudo apt-get install dosfstools

七、掛載  (Root 權限)

先建立要掛的目錄
mkdir  /sd1 /sd2

掛載
mount /dev/loop1 /sd1
mount /dev/loop2 /sd2

查看掛載
df -h

八、清除全部(Root 權限)

先卸載
umount /sd1
umount /sd2
df -h

解除連接(注意由下到上)
losetup -a
losetup -d /dev/loop2
losetup -d /dev/loop1
losetup -d /dev/loop0
losetup -a

九、連接及掛載(Root 權限)

  (可以8. 及 9. 反覆練習)
losetup /dev/loop0 sdcard.img
losetup -o `expr 512 * 2048` /dev/loop1
losetup -o `expr 512 * 165888` /dev/loop2
losetup -a

mount /dev/loop1 /sd1
mount /dev/loop2 /sd2
df -h

十、產生檔案

1. bootloader 可參考文章:u-boot 編譯
產生檔案:
MLO
u-boot
u-boot.bin
u-boot.img

2. kernel 可參考文章:編譯 ARM Linux 核心
產生檔案:
uImage
modules

3. Rootfs 可以參考文章:建立 Rootfs
瘦身過後的 Rootfs 全部檔案,
還需要含有步驟 2. 所編譯出來的核心 modules 

4. uEnv.txt 可參考文章:U-Boot 指令及建立 uEnv.txt
uEnv.txt        -> 開機設定檔

十一、分割區整理

sdcard1 -> 

第 1 個分割區,FAT 16/32 格式,有打開開機旗標,
內含檔案:
-rwxr-xr-x 1 root root   45128 2012-10-30 22:19 MLO
-rwxr-xr-x 1 root root 1215711 2012-10-30 22:19 u-boot
-rwxr-xr-x 1 root root  294672 2012-10-30 22:19 u-boot.bin
-rwxr-xr-x 1 root root  294736 2012-10-30 22:19 u-boot.img
-rwxr-xr-x 1 root root       1 2012-10-30 23:29 uEnv.txt
-rwxr-xr-x 1 root root 2475616 2012-10-30 22:15 uImage

sdcard2 -> 

第 2 個分割區,ext4 格式,
內含 rootfs 一些能正常開機執行的檔案,
還包含我們做好的核心 modules

十二、測試 sdcard.img

qemu-system-arm -M beagle -m 512 -nographic -sd sdcard.img








Reference:
http://pominglee.blogspot.tw/2012/10/sd-card.html

沒有留言:

張貼留言