这里的脚本是一个兄弟写的,有些命令是没用过的,所以在此处加些注释,记下,方便大家理解和自己以后如果用的话可以来此看看
#!/bin/sh
echo "Start script create MBR and filesystem"
# 这里是定义emmc的路径,肯能有的系统内emmc的路径是mmcblk0
DEV_EMMC=/dev/mmcblk1
echo "Start backup u-boot default"
#备份u-boot 将emmc备份到boot下 ,if 读取位置, of写入位置,bs单次读取大小,count 读取次数
dd if="${DEV_EMMC}" of=/boot/u-boot-default.img bs=1M count=4
echo "Start create MBR and partittion"
# 这里是给emmc分区(msdoc其实就相当于mbr,mbr只支持2T已下的硬盘)
parted -s "${DEV_EMMC}" mklabel msdos
# 建立主分区, 格式为fat32,从第700M开始,828M结束
parted -s "${DEV_EMMC}" mkpart primary fat32 700M 828M
# 建立主分区,格式为ext4 从829 到剩下的全部
parted -s "${DEV_EMMC}" mkpart primary ext4 829M 100%
echo "Start restore u-boot"
# dd命令恢复reboot conv:转化时的参数表示把文件的“数据”和“metadata”都写入磁盘(metadata包括size、访问时间st_atime & st_mtime等等),因为文件的数据和metadata通常存在硬盘的不同地方,因此fsync至少需要两次IO写操作,fsync 与fdatasync相差不大。
dd if=/boot/u-boot-default.img of="${DEV_EMMC}" conv=fsync bs=1 count=442
# skip:从输入文件跳过多少个块,seek 从输出文件跳过多少个块
dd if=/boot/u-boot-default.img of="${DEV_EMMC}" conv=fsync bs=512 skip=1 seek=1
echo "Done"
#将内存中的缓存文件写入到硬盘,sync 命令可以强制将内存中的文件缓冲写入磁盘,更新块信息。防止数据丢失
sync
echo "Start copy system for eMMC."
# 创建临时文件夹
mkdir -p /ddbr
# 赋予最高权限
chmod 777 /ddbr
# 定义emmc第一分区的路径(boot分区,系统引导分区)
PART_BOOT="/dev/mmcblk1p1"
# 定义emmc第二分区的路径(root分区,相当于文件分区吧)
PART_ROOT="/dev/mmcblk1p2"
# 定义安装路径
DIR_INSTALL="/ddbr/install"
# 判断如果安装路径不是空的话,先删除
if [ -d $DIR_INSTALL ] ; then
rm -rf $DIR_INSTALL
fi
# 然后再新建改目录
mkdir -p $DIR_INSTALL
# 查看boot分区是否存在挂载信息,如果有的话,卸载掉
if grep -q $PART_BOOT /proc/mounts ; then
echo "Unmounting BOOT partiton."
umount -f $PART_BOOT
fi
echo -n "Formatting BOOT partition..."
# 格式化boot分区并起名为BOOT_EMMC
mkfs.vfat -n "BOOT_EMMC" $PART_BOOT
echo "done."
# 以读写方式挂载文件系统PART_BOOT(引导分区路径)到DIR_INSTALL(安装文件路径) 即写入到安装过目录就是写入到了emmc内
mount -o rw $PART_BOOT $DIR_INSTALL
echo -n "Cppying BOOT..."
# 赋值boot下的文件到安装目录(也就是写入到了emmc内)
cp -r /boot/* $DIR_INSTALL && sync
echo "done."
echo -n "Edit init config..."
# 编辑配置文件uEnv.ini
sed -e "s/ROOTFS/ROOT_EMMC/g" \
-i "$DIR_INSTALL/uEnv.ini"
echo "done."
# 删除多余文件
rm $DIR_INSTALL/s9*
# 删除多余文件
rm $DIR_INSTALL/aml*
# 卸载安装目录(断开emmc的boot分区和安装目录的关系)
umount $DIR_INSTALL
# 同理查看root分区是否存在挂载,如果有就卸载掉
if grep -q $PART_ROOT /proc/mounts ; then
echo "Unmounting ROOT partiton."
umount -f $PART_ROOT
fi
echo "Formatting ROOT partition..."
# mke2fs 格式化root分区 为ext4格式
mke2fs -F -q -t ext4 -L ROOT_EMMC -m 0 $PART_ROOT
e2fsck -n $PART_ROOT
echo "done."
echo "Copying ROOTFS."
#以读写方式挂载文件系统 ,将root分区挂载在安装目录,往安装目录写东西就相当于向root分区写东西
mount -o rw $PART_ROOT $DIR_INSTALL
#切换顶级目录方便拷贝全系统
cd /
echo "Copy BIN"
# 怎么理解这句话呢,就是先打包bin文件夹,然后带着这些数据,切换到安装目录,然后解压(相当于cp+tar命令吧)
tar -cf - bin | (cd $DIR_INSTALL; tar -xpf -)
#echo "Copy BOOT"
#mkdir -p $DIR_INSTALL/boot
#tar -cf - boot | (cd $DIR_INSTALL; tar -xpf -)
echo "Create DEV"
mkdir -p $DIR_INSTALL/dev
#tar -cf - dev | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy ETC"
tar -cf - etc | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy HOME"
tar -cf - home | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy LIB"
tar -cf - lib | (cd $DIR_INSTALL; tar -xpf -)
echo "Create MEDIA"
mkdir -p $DIR_INSTALL/media
#tar -cf - media | (cd $DIR_INSTALL; tar -xpf -)
echo "Create MNT"
mkdir -p $DIR_INSTALL/mnt
#tar -cf - mnt | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy OPT"
tar -cf - opt | (cd $DIR_INSTALL; tar -xpf -)
echo "Create PROC"
mkdir -p $DIR_INSTALL/proc
echo "Copy ROOT"
tar -cf - root | (cd $DIR_INSTALL; tar -xpf -)
echo "Create RUN"
mkdir -p $DIR_INSTALL/run
echo "Copy SBIN"
tar -cf - sbin | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy SELINUX"
tar -cf - selinux | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy SRV"
tar -cf - srv | (cd $DIR_INSTALL; tar -xpf -)
echo "Create SYS"
mkdir -p $DIR_INSTALL/sys
echo "Create TMP"
mkdir -p $DIR_INSTALL/tmp
echo "Copy USR"
tar -cf - usr | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy VAR"
tar -cf - var | (cd $DIR_INSTALL; tar -xpf -)
echo "Copy fstab"
# 删除复制过去的fstab 信息
rm $DIR_INSTALL/etc/fstab
# 使用最新的来代替
cp -a /root/fstab $DIR_INSTALL/etc/fstab
#删除文件就不说了
rm $DIR_INSTALL/root/install.sh
rm $DIR_INSTALL/root/fstab
rm $DIR_INSTALL/usr/bin/ddbr
rm $DIR_INSTALL/usr/bin/ddbr_backup_nand
rm $DIR_INSTALL/usr/bin/ddbr_backup_nand_full
rm $DIR_INSTALL/usr/bin/ddbr_restore_nand
cd /
# 写入硬盘
sync
# 卸载root挂载
umount $DIR_INSTALL
echo "*******************************************"
echo "Complete copy OS to eMMC "
echo "*******************************************"
# 这里其实少了一个reboot ,直接重启就好了,可能怕不够灵活吧
评论 (0)