2012年10月19日 星期五

如何自行建立 rootfs (舊版, 2014)

如何自行建立 rootfs

0. 請確定你已經有使用 qemu arm 版建立起來的 arm.img

1. 備份 arm.img -> arm2.img

   cp arm.img arm2.img

2. 將 arm.img 掛載至 /mnt 目錄,請先確定兩個魔術數字:2048 512

   mount -o loop,offset=`expr 2048 \* 512` arm.img /mnt -t ext3
                                                                                        ext4

此時 /mnt 目錄下的檔案即為我們要截取的 rootfs,但是我們要先修改一下。


3. 清除檔案:

a. /mnt/lib/modules/* -> 此目錄中為舊版 Linux 核心模組,我們已自行編譯
   linux-3.4.X 核心,因此我們應該清掉舊版核心模組,改放新版核心模組。

b. /mnt/boot -> 舊版 Linux 核心,我們可以清掉。

c. /mnt/dev/.udev -> 清除不必要的 udev 檔案


4. 設定檔案:

a. /mnt/lib/modules/ -> 放回 linux-3.4.X 之模組檔案。

  cp -a DIR/modules/lib/modules/* /mnt/lib/modules
        ^^^^^^^^^^^^^^^^^^^^^^^^^
b. /mnt/etc/fstab 請改成以下內容:

/dev/mmcblk0p2   /       ext3   errors=remount-ro   0   1
/dev/mmcblk0p1   /boot vfat   defaults                  0   0

c. 接著請編輯 /mnt/etc/inittab 檔案,修改最後一行成為底下內容:

T2:23:respawn:/sbin/getty -L ttyO2 115200 vt102

d. 檢查 /mnt/etc/network/interfaces 檔案,看其內容是否如下:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

5. 將 rootfs 截取成為 rootfs.tar.xz 以便 deploy (部屬至虛擬 sdcard.img)

/mnt# tar cfva /root/rootfs.tar.xz .

 6. 解除掛載 arm.img

當我們將 rootfs 截取出來後,/mnt 目錄即不再需要使用,此時可以解除掛載,請執行
底下指令:

umount /mnt


7. 將 sdcard.img 掛載至 /mnt/sdcard1 /mnt/sdcard2 目錄

8. 複製 bootloader、Linux 核心及 uEnv.txt 至 /mnt/sdcard1,其檔案如下:

-rwxr-xr-x 1 root root   45444 2012-10-08 00:28 MLO
-rwxr-xr-x 1 root root 1370958 2012-10-08 00:29 u-boot
-rwxr-xr-x 1 root root  344872 2012-10-08 00:29 u-boot.bin
-rwxr-xr-x 1 root root  344936 2012-10-08 00:29 u-boot.img
-rwxr-xr-x 1 root root    2400 2012-10-08 00:29 uEnv.txt
-rwxr-xr-x 1 root root 2475288 2012-10-08 00:29 uImage

9. 將 rootfs.tar.xz deploy 至 /mnt/sdcard2 目錄

tar xfva rootfs.tar.xz -C /mnt/sdcard2


10. 將 sdcard.img 解除掛載


11. 執行 qemu
qemu-system-arm -M beagle -m 512 -sd ./sdcard.img -clock unix -serial stdio \
        -device usb-mouse -device usb-kbd


如何確保開機正常!!

1. 核心編譯時要加入正確參數,特別是:
   ext2 ext3 ext4 vfat 均要加入編譯選項,而且要為 <*>
   <M> -> 模組,核心載入後才有作用
   <*> -> 內建至核心中,無需載入即有作用


2. uEnv.txt 中的 uenvcmd 要設定正確,特別是要加上
   run mmcargs;fatload mmc 0:1 0x8000000 uImage; bootm 0x8000000

3. 將新編之核心、uEnv.txt、MLO、u-boot.* 等檔案放入 sdcard 的第一個分割區
   將修改過之 rootfs 放入 sdcard 的第二個分割區

4. 第一個分割區一定要設定 boot 旗標


沒有留言:

張貼留言