summaryrefslogtreecommitdiff
path: root/bugs/lp-1686514/disk-setup
blob: 66f38fb70fdda4ff7bad820fd0647e744313127f (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
#!/bin/sh
fmt=${1:-"ntfs1"}
dev=${2:-/dev/vdb}
LABEL=${LABEL:-"dos"}
PARTS=""
SIZE_100M="$((100*2048))"

UUID_LINUX="0FC63DAF-8483-4772-8E79-3D69D8477DE4"
UUID_MSFT_RES="E3C9E316-0B5C-4DB8-817D-F92DF00215AE"
UUID_MSFT_DATA="eBD0A0A2-B9E5-4433-87C0-68B6B72699C7"
DOS_LINUX=83
DOS_NTFS=7

if [ "$LABEL" = "dos" ]; then
   TYPE_MSFT_DATA="${DOS_NTFS}"
   TYPE_LINUX="${DOS_LINUX}"
   TYPE_MSFT_RES="${DOS_NTFS}"
else
   TYPE_MSFT_DATA="${UUID_MSFT_DATA}"
   TYPE_LINUX="${UUID_LINUX}"
   TYPE_MSFT_RES="${UUID_MSFT_RES}"
fi

msg() { echo "$@" 1>&2; }
rerror() { local r=$?; echo "$@" 1>&2; return $r; }
fail() { echo "$@" 1>&2; exit 1; }

set -e

pt_ntfs1() {
    local dev="$1"
    PARTS="${dev}1"
    do_sfdisk "$dev" "1 : start=2048, type=${TYPE_MSFT_DATA}, size=${SIZE_100M}"
}
pt_ntfs2() {
    local dev="$1"
    PARTS="${dev}1 ${dev}2"
    do_sfdisk "$dev" "
1 : start=2048, type=${TYPE_MSFT_RES}, size=${SIZE_100M}
2 : type=${TYPE_MSFT_DATA}, size=${SIZE_100M}"
}

pt_linux1() {
    local dev="$1"
    PARTS="${dev}1"
    do_sfdisk "$dev" "1 : start=2048, type=${TYPE_LINUX}, size=${SIZE_100M}"
}

pt_none() {
    PARTS=""
    msg "no disk label"
}

qrun() {
    local out=""
    [ "$1" = "--quiet" ] && shift || msg "$@"
    out=$("$@" 2>&1) ||
        { rerror "Failed[$?]: $*: $out"; return; }
}
mkfs_ntfs() {
    qrun mkfs.ntfs --fast "$1"
}

mkfs_ext4() {
    qrun mkfs.ext4 -F "$1"
}

do_sfdisk() {
    local out="" dev="$1" data="$2" label="${3:-${LABEL}}" pdata=""
    local cr="
"
    [ -n "$data" ] || data=$(cat)
    pdata="label: $label${cr}unit: sectors$cr${data}"
    echo "sfdisk --force $dev <<EOF"
    echo "$pdata" | sed -e '/^$/d' -e 's/^/    /'
    echo "EOF"
    echo "$pdata" | qrun --quiet sfdisk --force "$dev"
    udevadm settle
}

[ "$(id -u)" = "0" ] || fail "not root"
swapoff -a || :
umount /mnt >/dev/null 2>&1 || :
msg "wiping $dev"
# 4 of them to wipe any old filesystem data on first part
qrun --quiet python3 -c "import sys;
buf = b'\\0' * 1024 * 1024 * 4
with open(sys.argv[1], 'wb+') as fp:
   fp.write(buf)
   fp.seek(-(len(buf)), 2)
   fp.write(buf)" "$dev"
udevadm settle

sfile="sfdisk.in"
case "$fmt" in
    ntfs1)
        pt_ntfs1 "$dev"
        mkfs_ntfs "${dev}1"
	;;
    ntfs2)
        pt_ntfs2 "$dev"
        mkfs_ntfs "${dev}2"
	;;
    none)
        pt_none "$dev"
	;;
    ext4)
        pt_linux1 "$dev"
        mkfs_ext4 "${dev}1";;
    *) echo "unknown $fmt"; exit 1;;
esac

echo
echo -- sfdisk --list $dev --
sfdisk --list $dev | sed 's,^,  ,'
echo -- blkid $dev $PARTS --
blkid "$dev" ${PARTS} | sed 's,^,  ,'