前置作业
要先熟悉 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
分割及格式化这个虚拟 SD 卡
进入 root 权限
su -
再次进入 /eecs/virtualarm
cd /home/eecs/virtualarm
先用 fdisk 观察一下 sdcard.img 档案
fdisk -lu sdcard.img
新增两个分割区
| 装置名称 | 分区 | 容量 | ID | 类型 |
| sdcard.img1 | 1 | 80M | b | W95 FAT32 |
| sdcard.img2 | 2 | 剩余容量 | 83 | Linux |
fdisk sdcard.img
n
p
1
Enter
+80M
t
b
n
p
2
Enter
Enter
w
都分割完成后,看一下现在的分割区状况
fdisk -lu sdcard.img
再次查看一下这个档案!
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 /dev/loop0 sdcard2.img
再次检查一下
losetup -a
fdisk /dev/loop0
再来就可以跟前面的操作一样,使用 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/loop0 跳过 165888 个 Sectors 连接到 /dev/loop2 上
losetup -o `expr 165888 \* 512` /dev/loop2 /dev/loop0
losetup -a
暂停一下,因为再来要执行格式化了,所以要先介绍一下 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
都卸载完之后,查看一下连接情况
- 受保护的内容: NAS 版 Mathbot 管理网站与 Linebot 启动方法 - 2024 年 11 月 15 日
- Realtime 啥鬼的 - 2021 年 6 月 15 日
- nodejs 数学游戏 - 2021 年 6 月 8 日


























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