整合虛擬 SD 卡

前置作業

準備以下文章的檔案

核心: 編譯開不了機的 ARM HF Linux 核心

u-boot: u-boot 安裝與說明

rootfs: 建立 Root File System (rootfs)

STARTO! (用 root 權限執行)

先按照 建立 Root File System (rootfs) 的文章重做一個 rootfs 在 ~/virtualarm/rootfs

cd /home/eecs/virtualarm/
mkdir rootfs

注意:文章內的 /mnt/sdcard2 路徑要更換成 rootfs/

更新在 virtualarm 底下的 debootstrap_armhf.sh 腳本

ROOTFS_DIR=rootfs/
DEBIAN_VERSION=buster

debootstrap \
        --arch=armhf \
        --keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
        --verbose \
        --foreign \
        $DEBIAN_VERSION \
        $ROOTFS_DIR \
        file:///home/ftp/debian

做一個新的 sdcard.img,容量 500M,第一個分區容量 50M

nano create_image.sh
SD_IMAGE=sdcard2.img
SD_IMAGE_SIZE=500M
SD_IMAGE1=sdcard2.img1
SD_IMAGE2=sdcard2.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 ""
sh create_image.sh

檢查一下掛載有沒有成功

df -h
losetup -a
成功

先把核心複製到 /mnt/scard1 底下的目錄

cd ~eecs/virtualarm/
cp ~eecs/virtualarm/kernel/linux-3.16.81/arch/arm/boot/uImage /mnt/sdcard1

再來複製 root file system 到 rootfs 進去

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

試著開機吧!

cd bootloader/u-boot-2016.09
qemu-system-arm -machine vexpress-a9 -m 256 -nographic -kernel u-boot -drive file=../../sdcard2.img,if=sd,format=raw,index=0
開機失敗

載入核心

fatload mmc 0:1 0x60000000 uimage

再次試著重新開機

bootm 0x60000000
開機發生恐慌,按下 Ctrl+A 再按 X 即可退出

再來要設定環境變數讓他可以開機

setenv bootargs console=ttyAMA0,38400n8 root=/dev/mmcblk0p2

再次嘗試開機

bootm 0x60000000

已經成功開機,輸入帳號 root,密碼 leenix123 進入系統

至此,開幾完成

網路連線以及橋接設定

查看一下虛擬機的 IP 位址

ip addr show
如圖,IP位址為 192.168.10.100

※補充:如果沒有 IP 位址,說明 interfaces 沒有設定好,請編輯檔案

nano /etc/network/interfaces

將裡面的 enp2s0 改成 eth0 (共 2 處),修改完成後重新開機即可

將以下腳本存成 runsd.sh

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

會無法開機…下禮拜待續

SHXJ
Latest posts by SHXJ (see all)

在〈整合虛擬 SD 卡〉中有 1 則留言

發佈留言