期末考大補帖

快速導覽

整合虛擬 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
虛擬 SD 卡已經做完並且掛到系統上了

檢查一下有沒有成功掛到系統上

# 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 看看伺服器有沒有正常運作

成功看到 Welcome to LeeNIX!

考試到此結束。大家辛苦了!

SHXJ
Latest posts by SHXJ (see all)

發佈留言