整合虛擬 SD 卡
安裝基本套件
# apt-get install dosfstools -y
# apt-get install rsync -y
製作一個虛擬的 SD 卡
回到普通使用者 (eecs) 的家目錄
$ cd
進入 virtualarm 資料夾
$ cd virtualarm
先編輯一個腳本 (考試的時候SD卡大小、分區數量、分區容量等等的會不一樣,請自己修改腳本)
$ nano create_image.sh
SD_IMAGE=sdcard.img SD_IMAGE_SIZE=500M SD_IMAGE1=sdcard.img1 SD_IMAGE2=sdcard.img2 PART1_SIZE=50M PART1_OFFSET=1 PART1_SECTORS=1 PART1_BLOCKS=1 PART2_OFFSET=1 PART2_SECTORS=1 PART2_BLOCKS=1 LOOP0=/dev/loop0 LOOP1=/dev/loop1 LOOP2=/dev/loop2 MOUNT_DIR1=/mnt/sdcard1 MOUNT_DIR2=/mnt/sdcard2 echo "建立掛載資料夾" mkdir $MOUNT_DIR1 2>/dev/null mkdir $MOUNT_DIR2 2>/dev/null sleep 1 echo "建立完成,開始解除掛載資料夾 $MOUNT_DIR1 $MOUNT_DIR2" umount $MOUNT_DIR1 2>/dev/null umount $MOUNT_DIR2 2>/dev/null sleep 1 echo "清除連接裝置 $LOOP2" losetup -d $LOOP2 2>/dev/null echo "清除連接裝置 $LOOP1" losetup -d $LOOP1 2>/dev/null echo "清除連接裝置 $LOOP0" losetup -d $LOOP0 2>/dev/null sleep 1 echo "建立虛擬 SD 卡 $SD_IMAGE 中" dd if=/dev/zero of=$SD_IMAGE bs=$SD_IMAGE_SIZE count=1 2>/dev/null echo "建立完成" sleep 1 echo "更改使用者權限" chown eecs:eecs $SD_IMAGE echo "開始執行虛擬映像 $SD_IMAGE 的分割 (PART1: 建立腳本)..." cat > /tmp/fdisk.cmd << EOF n p 1 +$PART1_SIZE t b n p 2 w EOF echo "腳本建立完成" sleep 1 echo "開始執行虛擬映像 $SD_IMAGE 的分割 (PART2: 執行腳本)..." fdisk $SD_IMAGE < /tmp/fdisk.cmd >/dev/null echo "分割完成" sleep 1 echo "開始計算分割所需容量..." PART1_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\ -f 2` PART1_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\ -f 4` PART1_BLOCKS=`expr $PART1_SECTORS / 2` PART2_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\ -f 2` PART2_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\ -f 4` PART2_BLOCKS=`expr $PART2_SECTORS / 2` echo "計算完成" sleep 1 echo "開始將 $SD_IMAGE 連接至 $LOOP0 上" losetup $LOOP0 $SD_IMAGE echo "開始將 $SD_IMAGE1 連接至 $LOOP1 上" losetup -o `expr $PART1_OFFSET \* 512` $LOOP1 $LOOP0 echo "開始將 $SD_IMAGE2 連接至 $LOOP2 上" losetup -o `expr $PART2_OFFSET \* 512` $LOOP2 $LOOP0 # echo PART1_OFFSET=$PART1_OFFSET, PART1_BLOCKS=$PART1_BLOCKS # echo PART2_OFFSET=$PART2_OFFSET, PART2_BLOCKS=$PART2_BLOCKS sleep 1 echo "裝置連接完成,執行格式化..." mkdosfs -s 2 $LOOP1 $PART1_BLOCKS 2>/dev/null mkfs.ext4 -O ^metadata_csum,^64bit $LOOP2 >/dev/null sleep 1 echo "格式化完成,執行掛載..." mount $LOOP1 $MOUNT_DIR1 mount $LOOP2 $MOUNT_DIR2 echo "掛載完成。" echo ""
用 root 權限執行這個腳本
$ su -
# cd ~eecs/virtualarm
# sh create_image.sh
檢查一下有沒有成功掛到系統上
# df -h
將核心、開機引導與 rootfs 放到虛擬 SD 卡
先把核心 (uImage) 複製過去 /mnt/sdcard1
# cd ~eecs/virtualarm
# cp kernel/linux-3.16.81/arch/arm/boot/uImage /mnt/sdcard1
再來複製 root file system 到 /mnt/sdcard2 進去
# rsync -av rootfs/ /mnt/sdcard2
最後複製 uboot 檔案進去 /mnt/sdcard1,有以下兩個檔案
- u-boot
- u-boot.bin
# cp bootloader/u-boot-2016.09/u-boot /mnt/sdcard1
# cp bootloader/u-boot-2016.09/u-boot.bin /mnt/sdcard1
查看一下複製的所有檔案
# ls -l /mnt/sdcard1
# ls -l /mnt/sdcard2
試著開機吧! 要使用普通使用者 (eecs) 開機
$ cd bootloader/u-boot-2016.09
$ qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sdcard.img,if=sd,format=raw,index=0
載入核心
=> fatload mmc 0:1 0x60000000 uimage
設定環境變數
=> setenv bootargs console=ttyAMA0,38400n8 root=/dev/mmcblk0p2
試著開機
=> bootm 0x60000000
設定自動開機腳本
建立 runsd.sh 腳本
進入普通使用者家目錄,使用普通使用者 (eecs) 權限進行操作
$ cd
$ cd virtualarm
編輯 runsd.sh 腳本
$ nano runsd.sh
貼上以下內容 (核心版本與 UBOOT 版本記得依照考試的時候更改)
MACHINE=vexpress-a9 SD_IMAGE=sdcard.img #SD_IMAGE=sdcard2.img #SD_IMAGE=sd_512M.img #FLASH_IMG=flash.img KERNEL_VERSION=3.16.81 UBOOT_VERSION=2016.09 MAC="52:54:12:34:00:A0" BRIDGE=br10 MEMORY=256 #MEMORY=1024 qemu-system-arm -machine $MACHINE -m $MEMORY \ -serial stdio \ -drive file=./$SD_IMAGE,if=sd,format=raw,index=0 \ -kernel ./bootloader/u-boot-$UBOOT_VERSION/u-boot \ -net nic,macaddr=$MAC -net bridge,br=$BRIDGE
儲存並且退出,執行這個腳本
$ sh runsd.sh
在他倒數的時候按下任意按鍵停止
輸入這些東西開機
=> fatload mmc 0:1 0x60000000 uimage
=> setenv bootargs console=ttyAMA0,38400n8 root=/dev/mmcblk0p2
=> bootm 0x60000000

更改 vexpress 標頭檔
進入 vexpress 的標頭檔
$ cd ~eecs/virtualarm/bootloader/u-boot-2016.09/include/configs
$ nano vexpress_common.h
第一項,找到這裡
更改成這樣
第二項,找到這裡
更改成這樣
第三項,找到這裡
更改成這樣
儲存並退出,重新編譯一次 UBOOT
$ cd ~eecs/virtualarm/bootloader/u-boot-2016.09
$ makearm -j8
將 u-boot 以及 u-boot.bin 重新複製到 /mnt/sdcard1 (使用 root 權限)
# cp ~eecs/virtualarm/bootloader/u-boot-2016.09/u-boot /mnt/sdcard1
# cp ~eecs/virtualarm/bootloader/u-boot-2016.09/u-boot.bin /mnt/sdcard1
回到普通使用者(eecs)並且進入 virtualarm 資料夾
$ cd ~/virtualarm
執行自動開機腳本程序
$ sh runsd.sh
進入 http://192.168.10.100 看看伺服器有沒有正常運作
考試到此結束。大家辛苦了!
Latest posts by SHXJ (see all)
- 受保護的內容: NAS 版 Mathbot 管理網站與 Linebot 啟動方法 - 2024 年 11 月 15 日
- Realtime 啥鬼的 - 2021 年 6 月 15 日
- nodejs 數學遊戲 - 2021 年 6 月 8 日


















