summaryrefslogtreecommitdiff
path: root/draft/other-tools/clonezilla/ocs-restore-mbr
blob: 08fc697ae1e5d0046f66cf908a928c36071e00bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
#!/bin/bash

# Reinstall executable code area (first 446 bytes in MBR)

# Ref: http://en.wikipedia.org/wiki/Master_boot_record
# Master Boot Record (MBR) is the 512-byte boot sector:
# 446 bytes (executable code area) + 64 bytes (table of primary partitions) + 2 bytes (MBR signature; # 0xAA55) = 512 bytes.
# However, some people also call executable code area (first 446 bytes in MBR) as MBR.
#
DRBL_SCRIPT_PATH="${DRBL_SCRIPT_PATH:-/usr/share/drbl}"
. $DRBL_SCRIPT_PATH/sbin/drbl-conf-functions
. /etc/drbl/drbl-ocs.conf
. $DRBL_SCRIPT_PATH/sbin/ocs-functions

# Load the config in ocs-live.conf. This is specially for Clonezilla live. It will overwrite some settings of /etc/drbl/drbl-ocs.conf, such as $DIA...
[ -e "/etc/ocs/ocs-live.conf" ] && . /etc/ocs/ocs-live.conf

# Setings
# By default we do not restore the prebuild mbr from syslinux.
restore_prebuild_mbr="no"

#
USAGE() {
    echo "$ocs - To restore the MBR from an image to device"
    echo "Usage:"
    echo "To run $ocs:"
    echo "$ocs [OPTION] IMAGE_NAME DEVICE"
    echo "Options:"
    echo "-p, --prebuild_mbr  Use the prebuild bootloader from syslinux (For Windows only), not from the saved image"
    echo "-or, --ocsroot DIR  Specify DIR (absolute path) as directory ocsroot (i.e. overwrite the ocsroot assigned in drbl.conf)"
    echo "IMAGE_NAME is the image dir name, not absolute path"
    echo "DEVICE is the device name, e.g. sda, sda..."
    echo "Ex:"
    echo "To restore the the mbr saved in the image \"my-image\" to device sda, run:"
    echo "   $ocs my-image sda"
    echo
} # end of USAGE


####################
### Main program ###
####################

ocs_file="$0"
ocs=`basename $ocs_file`
#
#
while [ $# -gt 0 ]; do
 case "$1" in
   -p|--prebuild_mbr)
           restore_prebuild_mbr="yes"
           shift; 
           ;;
   -or|--ocsroot)
           # overwrite the ocsroot in drbl.conf
           shift; 
           if [ -z "$(echo $1 |grep ^-.)" ]; then
             # skip the -xx option, in case 
             ocsroot="$1"
             shift;
           fi
           [ -z "$ocsroot" ] && USAGE && exit 1
           ;;
   -*)     echo "${0}: ${1}: invalid option" >&2
           USAGE >& 2
           exit 2 ;;
   *)      break ;;
 esac
done

target_dir="$1"
shift
target_hd="$*"

# Fedora Core 1 seems to use dumb for rc1, we have to force it use linux.
# otherwise setterm will complain.
[ -z "$TERM" -o "$TERM" = "dumb" ] && TERM="linux"
echo "Setting the TERM as $TERM"
export TERM="$TERM"

#
check_if_root
ask_and_load_lang_set

if [ -z "$target_dir" ]; then
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo "No image was assigned!"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  USAGE
  echo "$msg_program_stop!"
  exit 1
fi
if [ -z "$target_hd" ]; then
  [ "$BOOTUP" = "color" ] && $SETCOLOR_FAILURE
  echo "No destination disk was assigned!"
  [ "$BOOTUP" = "color" ] && $SETCOLOR_NORMAL
  USAGE
  echo "$msg_program_stop!"
  exit 1
fi

#
target_dir_fullpath="$ocsroot/$target_dir"

for ihd in $target_hd; do
  # No matter it's msdos partition table or GPT one, here we restore the MBR.
  # If it's GPT format, this could make GPT one as "valid GPT with protective MBR",
  # and it's still GPT format. 
  # Some OS (e.g. VMware ESXi 5.5.0) need protective MBR even it's GPT partition table.
  # Ref: 
  # https://sourceforge.net/p/clonezilla/discussion/Clonezilla_live/thread/30662778/
  # https://sourceforge.net/p/clonezilla/discussion/Clonezilla_live/thread/ca825570/

  # Install MBR which displays a failure message on boot. This is for fault tolerance. If all the partitions are cloned successfully, the correcting MBR will be restored later. For more info, please check https://sourceforge.net/tracker/?func=detail&atid=671653&aid=2793248&group_id=115473
  cat /usr/share/partclone/fail-mbr.bin > /dev/$ihd
  if [ "$restore_prebuild_mbr" = "yes" ]; then
    # For M$ Windows system, sometimes it will fail if we restore the mbr from the one we saved (Ex. hda-mbr). Another option is to use mbr.bin from syslinux
    cat_cmd="cat $pxelinux_binsrc_dir/bios/mbr.bin > /dev/$ihd"
    echo "Restoring the mbr.bin from syslinux to /dev/$ihd by:"
    echo "$cmd_cmd"
    eval $cat_cmd
    echo "done."
  else
    dd_cmd="dd if=$target_dir_fullpath/$(to_filename ${ihd})-mbr of=/dev/$ihd bs=446 count=1 &>/dev/null"
    echo "Restoring the first 446 bytes of MBR data (executable code area) for $ihd by:"
    echo "$dd_cmd"
    eval $dd_cmd
    echo "done."
  fi
  echo $msg_delimiter_star_line
done