自動化建立、分割、格式化、掛載虛擬映像檔

前置作業(非常重要)

請務必!一定!絕對!要!弄清楚這篇文章的內容:建立虛擬 SD Card 映像檔

然後如果對以下的指令有任何疑問,建議搭配觀看:批次硬碟分割與格式化

開始練習

在前一篇文章已經學好了如何手動建立、分割、格式化、掛載虛擬映像檔

再來要寫一個腳本自動化完成以上那些事情

首先要先學會如何抓出對自動化腳本有用的參數,寫進腳本,讓腳本可以動作

加油!

如何取得自動化腳本所需要的參數(變數)

fdisk -lu sdcard.img

再來要操作如何撰寫自動化腳本,要先知道分割區的起始位置,所以要把 2048 撈出來

先來看看怎麼撈指令

fdisk -lu sdcard.img | grep sdcard.img
東西太多了,不是我們要的

繼續縮小範圍

fdisk -lu sdcard.img | grep sdcard.img[0-9]
接近了,繼續縮減
fdisk -lu sdcard.img | grep sdcard.img1
很好,逐漸縮小範圍囉
fdisk -lu sdcard.img | grep sdcard.img1 | tr -s ' '
再來把不必要的空格拿掉
fdisk -lu sdcard.img | grep sdcard.img1 | tr -s ' ' | cut -d\  -f 2
                                                              ↑注意一下這裡是兩個空格,因為 \空格 是一個參數
恭喜!!撈到 2048 這個數字了

編寫自動化腳本(自動建立、分割、格式化、掛載)

現在我們可以用這串撈出來的數字來寫自動化執行腳本了!

來吧廢話不多說,上腳本!!

nano createsdimg.sh
SD_IMAGE=sdcard.img
SD_IMAGE_SIZE=1G
SD_IMAGE1=sdcard.img1
SD_IMAGE2=sdcard.img2

PART1_SIZE=100M

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 "開始執行虛擬映像 $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 "裝置連接完成,執行格式化..."
apt-get install dosfstools -y >/dev/null
mkdosfs -s 2 $LOOP1 $PART1_BLOCKS 2>/dev/null
mkfs.ext4 $LOOP2 >/dev/null
sleep 1
echo "格式化完成,執行掛載..."
mount $LOOP1 $MOUNT_DIR1
mount $LOOP2 $MOUNT_DIR2
echo "掛載完成。"
echo ""

腳本說明

  • 1 定義創建出來的虛擬映像檔名稱
  • 2 定義虛擬映像檔的容量
  • 3-4 定義分割區1、2的名稱
  • 6 定義第一個分割區的容量
  • 8-14 定義分割區1、2 Sectors 與 Blocks 的預設值
  • 16-18 定義 loop 連接裝置的路徑
  • 20-21 定義掛載資料夾的路徑
  • 24-25 建立最終掛載用的兩個資料夾
  • 32-37 如果前面有已經連接過的 loop 裝置則把他們連接斷開
  • 41 建立虛擬映像檔
  • 46-60 建立分割用的 fdisk 腳本
  • 64 使用剛剛建立的腳本分割虛擬映像檔
  • 68 計算分割區1的起始 Sector
  • 69 計算分割區1的總 Sectors 數量
  • 70 計算分割區1的 Blocks 數量
  • 72 計算分割區2的起始 Sector
  • 73 計算分割區2的總 Sectors 數量
  • 74 計算分割區2的 Blocks 數量
  • 78 連接虛擬映像與 /dev/loop0 裝置
  • 80 連接分割區1與 /dev/loop1 裝置
  • 82 連接分割區2與 /dev/loop2 裝置
  • 87 如果沒有安裝 dos 的格式化工具則安裝
  • 88-89 執行分割區1、2的格式化
  • 92-93 把分割區1、2掛載到 /mnt/sdcard1、/mnt/sdcard2 上

執行自動化腳本

進入 root 權限

su -

執行這個腳本

sh createsdimg.sh

看到掛載完成了,確認一下吧!

df -h
看倒數兩個,果然已經掛載成功

再看一下 loop 的連接情況

losetup -a
確認三個裝置都連接的好好的

最後看一下分割區的狀況,查看有沒有格式化成功

blkid /dev/loop1
blkid /dev/loop2
確認都格式化成功了
SHXJ
Latest posts by SHXJ (see all)

在〈自動化建立、分割、格式化、掛載虛擬映像檔〉中有 1 則留言

發佈留言