建立虛擬 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 則留言

發佈留言