基于共享精神,自己写的bash(dragon_bash.sh)内容分享出来。如有需要的随便拿去用。
毕竟技术不太好,花了2周时间搞这个事情。一些细节来回调试花太多时间了,主要是VIM我不大会用,想顺利改一点东西感觉好难,U盘来来回回在2台电脑上使用。每次测试都要重启电脑从U盘启动,效率很低。
#!bin/bash
sudo mount --bind /run/live/medium/home/partimag /home/partimag/
#取得当前LIVE系统的盘符,sda,sdb
#liveusb=$(if (df|grep 'sda'>nul);then echo 'sda';elif (df|grep 'sdb'>nul);then echo 'sdb';fi)
liveusb=''
if df | grep 'sda' > /dev/null; then
liveusb='sda';
elif df | grep 'sdb' > /dev/null; then
liveusb='sdb';
fi
echo "liveusb=$liveusb"
#取得镜像image的文件名,如果有多个只用第1个,所以正常情况下只放一个
img=$(ls /home/partimag/|xargs -n1 basename)
#echo "img=$img"
#多个的话,出个选择的功能
if [ $(ls /home/partimag/|wc -l) -gt 1 ]; then
clear
echo "There are more than one image in /home/partimag/, please choose one:1,2,3 ..."
#ls /home/partimag/|xargs -n1 basename
#!/bin/bash
img=($(ls -d /home/partimag/*/|xargs -n1 basename))
j=1
for i in "${img[@]}"; do
echo "$j - $i"
((j++))
done
# 设置倒计时时间(以秒为单位)
countdown=30
# 初始化用户输入变量
user_input=""
echo " $countdown (enter 0,1,2,3... to confirm):"
echo -n "time left: $countdown seconds"
# 开始倒计时
while [ $countdown -gt 0 ]; do
echo -n "$countdown ..."
# 使用 read 命令等待用户输入
read -t 1 -n 1 user_input
# 如果用户输入了内容,退出倒计时
if [ -n "$user_input" ]; then
break
fi
# 倒计时减少一秒
countdown=$((countdown - 1))
done
# 检查用户是否在倒计时内输入了内容
if [ -z "$user_input" ]; then
echo "no input, exit"
else
#echo "you input: $user_input"
user_input=$((user_input-1))
img=${img[user_input]}
echo "you choose: $img"
fi
# 为了更好的用户体验,可以清空输入缓冲区
read -n 9999 -s -t 0.1 user_input 2>/dev/null
# 继续脚本的其他部分
echo "continue..."
fi
echo "img=$img"
echo "liveusb=$liveusb"
#取得当前emmc名
disk=''
if lsblk | grep 'mmcblk0'>/dev/null; then
disk='mmcblk0';
elif lsblk | grep 'mmcblk1'>/dev/null; then
disk='mmcblk1';
elif lsblk | grep 'mmcblk2'>/dev/null; then
disk='mmcblk2';
elif [ "$liveusb" == 'sdb' ]; then
disk='sda';
fi
echo "disk=$disk"
#对将要恢复的分区进行划分
# 获取当前目标硬盘的总容量
total_size=$(lsblk -b -o NAME,SIZE | grep -i "$disk " | awk '{print $2}')
echo "total_size=$total_size"
#取源镜像UUID ,先取硬盘名,再对应取label-id, part3 UUID
#取备份文件里面的硬盘名称。 s取source的意思,就是备份镜像中硬盘名
sdisk=$(tr -cd '[:alnum:]'</home/partimag/${img}/disk)
echo "sdisk=$sdisk"
#导入分区表内容
pt=$(tr -d '\n' </home/partimag/${img}/${sdisk}-pt.sf)
echo "pt=$pt"
#硬盘的UUID
label_id=$(echo ${pt}|awk -F 'label-id: |device' '{print $2}')
echo "label-id=$label_id"
#硬盘不同的区,后接 mmcblk0p3 ,sda3 因为nvme的硬盘还没去弄,后面再增加
#目标硬盘分区
case "$disk" in
mmcblk0|mmcblk1|mmcblk2)
p="p"
;;
sda|sdb)
p=""
;;
esac
echo "p=$p"
#镜像硬盘分区
case "$sdisk" in
mmcblk0|mmcblk1|mmcblk2)
sp="p"
;;
sda|sdb)
sp=""
;;
esac
echo "sp=$sp"
#第3分区的UUID
#echo "${sdisk}${sp}3|${sdisk}${sp}4"
#echo $pt|awk -F "${sdisk}${sp}3|${sdisk}${sp}4" '{print $2}'
#echo $pt|awk -F "${sdisk}${sp}3|${sdisk}${sp}4" '{print $2}'|awk -F 'uuid=|, name' '{print $2}'
d3=$(echo $pt|awk -F "${sdisk}${sp}3|${sdisk}${sp}4" '{print $2}'|awk -F 'uuid=|, name' '{print $2}')
#echo "label-id=$label_id"
echo "part3-id=$d3"
echo "--------------------------------------- "
# 分区表定义
#分区计算 |34扇区|2048-34扇区|EFI 100M 204800扇区|WINDOWS 总容量 - 其余区|RE 1000M 2048000扇区|
cat > /tmp/sfdisk_script << EOF
label: gpt
label-id: ${label_id}
unit: sectors
first-lba: 34
sector-size: 512
/dev/${disk}${p}1 : start=2048, size=204800, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, name="EFI system partition"
/dev/${disk}${p}2 : start=206848, size=32768, type=E3C9E316-0B5C-4DB8-817D-F92DF00215AE, name="Microsoft reserved partition"
/dev/${disk}${p}3 : start=239616, size=$(((total_size/512) - 2048000 - 2048 - 239616)), type=EBD0A0A2-B9E5-4433-87C0-68B6B72699C7, uuid=${d3}, name="Basic data partition"
/dev/${disk}${p}4 : start=$(((total_size/512) - 2048000-2048)), size=2048000, type=DE94BBA4-06D1-4D40-A16A-BFD50179D6AC, name="Basic data partition"
EOF
#cat /tmp/sfdisk_script
# 应用分区表
sfdisk /dev/${disk} < /tmp/sfdisk_script
#开始恢复镜像
sudo /usr/sbin/ocs-sr -batch -iefi -k -scr -p true restoredisk $img $disk
#sudo /usr/sbin/ocs-sr -g auto -e1 auto -e2 -batch -iefi -k0 -scr -p true restoredisk $img $disk