前置作業
要先熟悉 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 則留言