自动化建立、分割、格式化、挂载虚拟映像档

前置作业(非常重要)

请务必!一定!绝对!要!弄清楚这篇文章的内容:建立虚拟 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 则留言

发布留言