建立虚拟 SD Card 映像档

前置作业

要先熟悉 fdisk 操作以及分割与格式化以及复习之前的虚拟平台建置环境,详见:

虚拟平台建置前置作业

fdisk 操作说明

随身碟分割与格式化

建立一个硬碟上的虚拟 SD Card

之前的练习都是用随身碟来做练习

现在要在系统上建立出一个虚拟的 SD 卡

进入之前虚拟平台建置的 ~/virtualarm 资料夹

cd ~eecs/virtualarm

那首先建立一个 1GB 的虚拟 SD 卡吧!

dd if=/dev/zero of=sdcard.img bs=1G count=1

查看一下这个档案

ls -l sdcard.img
file sdcard.img
hexdump sdcard.img
是一个 data 档案,啥都没有
hexdump 下查看,里面从头到脚都是0

分割及格式化这个虚拟 SD 卡

进入 root 权限

su -

再次进入 /eecs/virtualarm

cd /home/eecs/virtualarm

先用 fdisk 观察一下 sdcard.img 档案

fdisk -lu sdcard.img
他是一个空的,里面没有任何分割区

新增两个分割区

装置名称分区容量ID类型
sdcard.img1180MbW95 FAT32
sdcard.img22剩余容量83Linux
fdisk sdcard.img
n
p
1
Enter
+80M
t
b
n
p
2
Enter
Enter
w

都分割完成后,看一下现在的分割区状况

fdisk -lu sdcard.img
现在他是有分割区的完美虚拟SD卡了!!

再次查看一下这个档案!

file sdcard.img
完美!!

补充: 利用 losetup 分割硬碟

从以前到现在搞得装置几乎全部都是实体装置

但是现在新增的 sdcard.img 他是一个档案,并不是一个真正的装置

/dev/loop0 也是一个虚拟的装置,用以跟虚拟的装置(档案)做一个「连接」的动作

来达到类似于操作实体装置的目的

现在来试试看把 /dev/loop0 跟 sdcard 连在一起吧!

为了不跟上面的 sdcard.img 重叠到,新增一个 sdcard2.img 来做练习

dd if=/dev/zero of=sdcard2.img bs=1G count=1

首先检查一下 /dev/loop0 底下有无装置

losetup -a
fdisk /dev/loop0
现在 losetup 并无连接任何装置
fdisk 说并没有这个目录

发现没有装置,那现在来把两个东西连接起来

losetup /dev/loop0 sdcard2.img
没有消息就是好消息,现在已经连线囉

再次检查一下

losetup -a
fdisk /dev/loop0
/dev/loop0 已经跟 losetup 连接上了

再来就可以跟前面的操作一样,使用 fdisk 来做分割操作了

fdisk /dev/loop0

把这个装置分割成跟 sdcard.img 一样的分割区并查看

fdisk -lu /dev/loop0

然后接着格式化的流程,在上图知道了分割区1装置为 /dev/loop0p1,但是…

格式化出错惹

这是因为 /dev/loop0 并不是一个真正的装置,所以连代号都是虚拟代号

所以无法直接用一般的格式化指令去处理这个虚拟装置

那透过观察的指令可以发现,每一个 Sector 是 512 bytes

再来要使用 losetup 的有一个功能叫作 -o offset

可以跳过多少个 bytes 再来做连接,现在要跳过第一个分割区

那第一个分割区要跳过 2048 个,第二个分区要跳过 165888 个

再来要计算跳过 2048*512 是多少

linux 底下有提供简单的运算功能,指令与定义如下(注意:expr在运算子前后一定要空格,不然会错误)

expr 运算式
  • expr 1 + 1 (加法)
  • expr 1 – 1 (减法)
  • expr 1 \* 1 (乘法,因为 * 号在 linux 下是万用字元,所以要加上反斜线)
  • expr 5 / 2 (除法,在 expr 底下除法只会回传整数,意即 5/2 回传2)

那因为要计算 2048*512 是多少,所以下指令

expr 2048 \* 512

得到值 1048576

那如果要让他变成有回传值,指令变这如下

echo `expr 2048 \* 512`

好!终于可以真正的连接了,现在要把 /dev/loop0 的装置跳过 2048*512 个 bytes 连接到 /dev/loop1 上

losetup -o `expr 2048 \* 512` /dev/loop1 /dev/loop0
losetup -a
可以看到 /dev/loop1 已经挂上了跳过 2048 个 Sectors 的 /dev/loop0

来!再接再励!把 /dev/loop0 跳过 165888 个 Sectors 连接到 /dev/loop2 上

losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0
losetup -a
看到 /dev/loop2 已经挂上了跳过 165888 个 Sectors 的 /dev/loop0

暂停一下,因为再来要执行格式化了,所以要先介绍一下 blocks

在旧版 fdisk 用的是 blocks 现在的新版 fdisk 用的是 Sectors

一个 block 等于 1024 bytes 也就是把 Sectors 除以 2就等于 blocks

复习一下这张图

我们分割出来的两个分割区,第一个分割区为 163840 Sectors 等于 81920 个 blocks

第二个分割区为 1931264 Sectors 等于 965632 个 blocks

好,那现在知道了 blocks 数量了,那再来执行格式化,但是先来执行检查

blkid /dev/loop1
blkid /dev/loop2
现在啥都没有

首先讲一下 mkdosfs 的参数

  • -s 是每一个区块有多少个 Sectors(以这里的例子来说是 2 个)
  • 后面还要接一个 block-count (blocks 数量)
mkdosfs -s 2 /dev/loop1 81920
会跳出警告视窗,不要理他

检查第一个分割区

已经正常格式化完成

再来格式化第二个分割区

mkfs.ext4 /dev/loop2
格式化完成

检查第二个分割区

blkid /dev/loop2
格式化完成

挂载到实体目录

在之前的课程讲过要把SD卡第一个分割区挂载到 /mnt/sdcard1

第二个挂载到 /mnt/sdcard2

那首先建立这两个资料夹

mkdir -p /mnt/sdcard1
mkdir -p /mnt/sdcard2

开始挂载

mount /dev/loop1 /mnt/sdcard1
mount /dev/loop2 /mnt/sdcard2

查看一下挂载有没有成功

df -h
查看最后两个,已经挂载成功

解挂载(卸载)虚拟 SD Card

要解挂层层连接的 loop 装置一定要按照挂载顺序反向解挂回去

因为我们最后挂载的是挂到 /mnt/sdcard1 以及 /mnt/sdcard2

所以要先解挂这两个

umount /dev/loop2
umount /dev/loop1

然后在做连接的时候是照顺序

  • /dev/loop0
  • /dev/loop1
  • /dev/loop2

挂载的,那现在要按照反向解挂回去

losetup -d /dev/loop2
losetup -d /dev/loop1
losetup -d /dev/loop0

都卸载完之后,查看一下连接情况

都解除连接了,啥都没有了
SHXJ
Latest posts by SHXJ (see all)

在〈建立虚拟 SD Card 映像档〉中有 1 则留言

发布留言