qq
上週我們講的 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
編譯完的話,理論上你應該可以執行底下指令:
/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