網路教學(e-Learning)校園社群(e-Community)服務台(e-Service)系所班網(e-Class)登入
位置: 伍柏勲 > 未分類
qq
by 伍柏勲 2013-12-03 10:01:16, 回應(0), 人氣(585)
上週我們講的 qemu 編譯,各位編譯完了嗎 ?

編譯完的話,理論上你應該可以執行底下指令:

/usr/local/bin/qemu-system-arm -version

/usr/local/bin/qemu-system-arm -version
QEMU emulator version 1.5.0 (qemu-linaro 2013.06), Copyright (c) 2003-2008 Fabrice Bellard

如果此時你再執行 qemu-system-arm -version 的話,會發生什麼事 ?

有些人執行 qemu-system-arm -version,結果會出現系統原始版本之 qemu,如底下所示:

/usr/bin/qemu-system-arm -version
QEMU emulator version 1.1.2 (Debian 1.1.2+dfsg-6a), Copyright (c) 2003-2008 Fabrice Bellard

這是因為搜尋路徑中,/usr/bin 在 /usr/local/bin 之前,因此我們會找到舊版的 qemu,
請各位確定你現在執行的 qemu 是 1.5.0,然後照上回上課最後一小段作練習。

當我們執行

qemu-system-arm -M beagle -nographic -sd sd.img

之後,你可以看到我們的確把 u-boot 的 2013.10 版啟動,這個版本也就是我們上回請各
位下載的版本。

如果各位回憶一下 ARM 開機流程的話,U-boot 開機完之後是要抓什麼東西進來 ?

現在我們所兜的 sd.img 只有 u-boot,沒有 kernel,因此一開機就立刻當機。
               ^^^^^^

這是正常的,我們要再把核心及 rootfs 整合進來即可正常開機。

先前我們已經完成核心編譯,也請各位安裝好一個虛擬的 ARM 版 Debian Linux,因此請
各位確定你現在可以使用 qemu 開 sd.img 後,我們即可開始來兜 sdcard.img
                                                           ^^^^^^^^^^

現在請各位準備一下東西,待會我來教整合系統,請準備以下東西:

1. 編譯完之核心,本週核心版本為 3.4.71
2. 編譯完之 u-boot,其版本是 2013.10
3. 把先前教各位製作的 sdcard.img 檔找出來,其中:
   第一個分割區掛在 /media/sdcard1 目錄
   第二個分割區掛在 /media/sdcard2 目錄

   如果你的系統沒有 /media/sdcard1 /media/sdcard2 目錄,請自行建立。

4. 先前安裝之 arm.img,我們要從其中抽 rootfs 出來。

準備好上述四樣東西,我們即可以開始整合出可以開機的 sdcard.img。

下一節我們開始整理,這個檔案請至 My 數位學習中下載。

各位在掛載 sdcard.img 前,請先確認 sdcard.img 已經完成分割、格式化的流程了,
如果不確定的話,請看之前建立 sdcard.img 的講義!!

如果你的 sdcard.img 已經完成分割、格式化的流程,理論上你現在可以掛載到

/media/sdcard1 /media/sdcard2 目錄!!

5. 現在我們將 arm.img 掛到 /mnt 目錄下

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

我們可以使用 df -h /mnt /media/sdcard* 來觀察目前掛載情況,如底下所示:

檔案系統        容量  已用  可用 已用% 掛載點
/dev/loop3      1.9G  693M  1.1G   40% /mnt
/dev/loop1       80M     0   80M    0% /media/sdcard1
/dev/loop2      913M  1.2M  848M    1% /media/sdcard2

接下來我們要將 rootfs 「移植」至 /media/sdcard1 及 /media/sdcard2 目錄,請注意:

/media/sdcard1 只有 80MB,主要存放開機核心及 bootloader,此分割區為 /boot 目錄
/media/sdcard2 才是其它檔案存放目錄


6. 在複製 rootfs 前,我們要了解一下檔案系統,課本的第 7 章有說明整個 Linux
作業系統的目錄樹,在作 rootfs 的移植前,我們要先清除不必要的檔案,以節省空間。
問題是:什麼是不必要的檔案 ?? 請參考部落格

7. 複製檔案:

cd /media/sdcard2

rsync -av /mnt/* .

問題:

a. 為什麼加 -av 參數 ?
b. 為什麼不用 cp 指令來複製檔案,而是用 rsync 來複製檔案 ?

複製完畢後,我們可以看到 /media/sdcard2 已經用了 700 MB 的容量,接下來我們要清
檔案:

cd /media/sdcard2/boot -> 清掉此目錄的主要原因是裡面的核心為舊版!!

rm -f *

cd /media/sdcard2/lib/modules -> 清掉此目錄的主要原因是裡面的核心模組為舊版!!

rm -rf * (加 -r 參數的意義是什麼 ?)

**** 複製完畢再來刪檔案 ****
**** 下刪檔案前請注意你目前的目錄為何 ? 萬一你刪錯自己的 /boot 目錄的話,
     不必來找我,直接重灌!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ****

沒有問題的舉手!

複製完了沒 ?

現在問各位另一個問題,還有哪些檔案可以清掉 ?

我們剛剛清掉的是舊核心及其相關模組,現在有那邊檔案可以刪除「而且」不會影響系統
效能 ?

這個問題作為各位的作業,下週我們再來討論。
請修改 /media/sdcard2/etc/fstab,將其內容改為:

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

再修改 /media/sdcard2/etc/inittab,加上底下這行:

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


複製新建核心模組:

cd /media/sdcard2/lib/modules

rsync -av ~eecs/qemu_image/kernel/modules/lib/modules/3.4.71 .




接下來我們將 bootloader 及開機核心放回去 /media/sdcard1 目錄
cd /media/sdcard1

cp -a ~eecs/qemu_image/kernel/linux-3.4.71/arch/arm/boot/uImage .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/MLO .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/u-boot .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/u-boot.img .
cp -a ~eecs/qemu_image/uboot/u-boot-2013.10/u-boot.bin .

uEnv.txt 請至 校內 ftp 的 files 目錄中下載

wget ftp://120.117.72.71/files/uEnv.txt




8. 準備模擬:-> 這個步驟下週再來作,先將 sdcard.img 準備好以便模擬

a. 將 /media/sdcard1 /media/sdcard2 解除掛載
b. 以 losetup -d 將所有 loop 裝置解除連接
losetup -d /dev/loop2
   losetup -d /dev/loop1
   losetup -d /dev/loop0

以 eecs 權限執行底下指令:

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