前置作業(非常重要)
請務必!一定!絕對!要!弄清楚這篇文章的內容:建立虛擬 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
↑注意一下這裡是兩個空格,因為 \空格 是一個參數
編寫自動化腳本(自動建立、分割、格式化、掛載)
現在我們可以用這串撈出來的數字來寫自動化執行腳本了!
來吧廢話不多說,上腳本!!
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
Latest posts by SHXJ (see all)
- 受保護的內容: NAS 版 Mathbot 管理網站與 Linebot 啟動方法 - 2024 年 11 月 15 日
- Realtime 啥鬼的 - 2021 年 6 月 15 日
- nodejs 數學遊戲 - 2021 年 6 月 8 日










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