-
Notifications
You must be signed in to change notification settings - Fork 0
/
v-create.sh
107 lines (88 loc) · 2.76 KB
/
v-create.sh
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
#!/bin/sh
# shellcheck disable=1090
# ------------------
# Basic settings
_SCRIPT_DIR=$(dirname "$(readlink -f "$0")")
_SCRIPT_NAME=$(basename "$0")
. "${_SCRIPT_DIR}/.v-common.rc"
[ "${_LOG_PREFIX}" ] || _LOG_PREFIX="[${_SCRIPT_NAME}] "
# ------------------
# Default values
vdiskType="expandable" # fixed, expandable
fileSystem="ntfs" # ntfs, fat32
label="" # (anything)
optOverwrite="" # overwrite, (anything else)
optMkDir="" # mkdir, (anything else)
# ------------------
# Help
if [ $# -lt 2 ] || [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
cat << _EOF_
Usage: [VARIABLES] ${_SCRIPT_NAME} [OPTIONS] v-FILE FILE-SIZE
Create a vdisk of specified size and filesystem.
v-FILE Path to the vdisk file.
FILE-SIZE File size in megabytes (MB).
OPTIONS:
-s,--file-system SYS Format the vdisk as SYS. Default is NTFS.
-L,--label LABEL Label the vdisk. Default is "" (empty).
-f,--fixed Fixed size vdisk file, i.e. non-expandable.
-o,--overwrite Overwrite the vdisk file if already exists.
-m,--mkdir Create parent directory if not exists.
${_HELP_VARIABLES}
Example:
${_SCRIPT_NAME} x:/some/vdisk.vhdx 1024
_VERBOSE=4 _NO_COLOR=0 ${_SCRIPT_NAME} -fm --file-system fat32 --label "new-vdisk" x:/some/vdisk.vhdx 512
_EOF_
exit
fi
# ------------------
# Parse arguments
# Ref: https://www.tutorialspoint.com/unix_commands/getopt.htm
GETOPT=$(getopt -o fs:L:om -l fixed,file-system:,label:,overwrite,mkdir -- "$@")
eval set -- "$GETOPT"
while true; do
case "$1" in
-f|-fixed)
vdiskType="fixed"; shift;;
-s|--file-system)
fileSystem=$2; shift 2;;
-L|--label)
label="$2"; shift 2;;
-o|--overwrite)
optOverwrite="overwrite"; shift;;
-m|--mkdir)
optMkDir="mkdir"; shift;;
--)
shift; break;;
*)
echo "getopt error"; exit 1;;
esac
done
# ------------------
# Preparation
_check_dir_exist "$(dirname "$1")" $optMkDir
_check_file_not_exist "$1" $optOverwrite
vdiskFile=$(realpath "$1")
if [ "$2" = "" ]; then
_log_error "No size specified."
exit 1
fi
vdiskSize=$2
vdiskFile=$(toWindowsPath "${vdiskFile}")
diskpartScript=$(cat << _EOF_
create vdisk file="${vdiskFile}" maximum=${vdiskSize} type=${vdiskType}
attach vdisk
create partition primary
format fs=${fileSystem} label="${label}" quick
detach vdisk
_EOF_
)
# ------------------
# Action
_log_highlight "Creating '${vdiskFile}' ..."
_log_info "--- Diskpart script: begin"
_LOG_PREFIX="" _log_info "${diskpartScript}"
_log_info "--- Diskpart script: end"
_log_info "Running diskpart ..."
# ${_LOG_INFO_FD} is 3 (default), and >&3 is POSIX compliant.
# shellcheck disable=2039,2086
echo "${diskpartScript}" | ${_DISKPART} >&${_LOG_INFO_FD}