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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171 | $ sudo /tmp/even-partition /dev/vdb 20
size=40960M numparts=20 partitions_of=2047M label=gpt dev=/dev/vdb
curstart=2048 curend=4194304 part=0
curstart=4194304 curend=8386560 part=1
curstart=8386560 curend=12578816 part=2
curstart=12578816 curend=16771072 part=3
curstart=16771072 curend=20963328 part=4
curstart=20963328 curend=25155584 part=5
curstart=25155584 curend=29347840 part=6
curstart=29347840 curend=33540096 part=7
curstart=33540096 curend=37732352 part=8
curstart=37732352 curend=41924608 part=9
curstart=41924608 curend=46116864 part=10
curstart=46116864 curend=50309120 part=11
curstart=50309120 curend=54501376 part=12
curstart=54501376 curend=58693632 part=13
curstart=58693632 curend=62885888 part=14
curstart=62885888 curend=67078144 part=15
curstart=67078144 curend=71270400 part=16
curstart=71270400 curend=75462656 part=17
curstart=75462656 curend=79654912 part=18
curstart=79654912 curend=83884032 part=19
created 20 partitions on /dev/vdb
$ ls -l /sys/class/block/vdb* -d
lrwxrwxrwx 1 root root 0 Dec 10 18:58 /sys/class/block/vdb -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb1 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb1
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb10 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb10
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb11 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb11
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb12 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb12
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb13 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb13
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb14 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb14
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb15 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb15
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb2 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb2
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb3 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb3
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb4 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb4
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb5 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb5
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb6 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb6
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb7 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb7
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb8 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb8
lrwxrwxrwx 1 root root 0 Dec 15 16:25 /sys/class/block/vdb9 -> ../../devices/pci0000:00/0000:00:04.0/virtio2/block/vdb/vdb9
$ grep vdb /proc/partitions
253 16 41943040 vdb
253 17 2096128 vdb1
253 18 2096128 vdb2
253 19 2096128 vdb3
253 20 2096128 vdb4
253 21 2096128 vdb5
253 22 2096128 vdb6
253 23 2096128 vdb7
253 24 2096128 vdb8
253 25 2096128 vdb9
253 26 2096128 vdb10
253 27 2096128 vdb11
253 28 2096128 vdb12
253 29 2096128 vdb13
253 30 2096128 vdb14
253 31 2096128 vdb15
$ cat /tmp/
# sfdisk --label=gpt /dev/vdb
/dev/vdb1: start=2048, size=4192256, type=83, name=foopart1
/dev/vdb2: start=4194304, size=4192256, type=83, name=foopart2
/dev/vdb3: start=8386560, size=4192256, type=83, name=foopart3
/dev/vdb4: start=12578816, size=4192256, type=83, name=foopart4
/dev/vdb5: start=16771072, size=4192256, type=83, name=foopart5
/dev/vdb6: start=20963328, size=4192256, type=83, name=foopart6
/dev/vdb7: start=25155584, size=4192256, type=83, name=foopart7
/dev/vdb8: start=29347840, size=4192256, type=83, name=foopart8
/dev/vdb9: start=33540096, size=4192256, type=83, name=foopart9
/dev/vdb10: start=37732352, size=4192256, type=83, name=foopart10
/dev/vdb11: start=41924608, size=4192256, type=83, name=foopart11
/dev/vdb12: start=46116864, size=4192256, type=83, name=foopart12
/dev/vdb13: start=50309120, size=4192256, type=83, name=foopart13
/dev/vdb14: start=54501376, size=4192256, type=83, name=foopart14
/dev/vdb15: start=58693632, size=4192256, type=83, name=foopart15
/dev/vdb16: start=62885888, size=4192256, type=83, name=foopart16
/dev/vdb17: start=67078144, size=4192256, type=83, name=foopart17
/dev/vdb18: start=71270400, size=4192256, type=83, name=foopart18
/dev/vdb19: start=75462656, size=4192256, type=83, name=foopart19
/dev/vdb20: start=79654912, size=4229120, type=83, name=foopart20
$ cat /tmp/even-partition
#!/bin/bash
VERBOSITY=${VERBOSITY:-1}
dev="/dev/vdb"
error() { echo "$@" 1>&2; }
fail() { [ $# -eq 0 ] || error "$@"; exit 1; }
debug() {
[ "${VERBOSITY:-0}" -ge "$1" ] || return 0;
shift;
error "$@";
}
wipedev() {
python -c '
import sys
unit=512
numbufs = ((1024 * 1024) / unit)
buf = unit * b'\''\0'\''
args = sys.argv[1:]
print("args: %s" % args)
dev=args[0]
if len(args) > 1:
# offsets are in k
offsets = [int(i)*unit for i in args[1:]]
else:
# the start and end
offsets = [0] + [-numbufs*unit]
print("dev=%s. offsets: %s" % (dev, offsets))
with open(dev, "wb") as fp:
for offset in offsets:
if offset >= 0:
fp.seek(offset, 0)
else:
fp.seek(offset, 2)
print("wiping %s" % fp.tell())
for i in range(numbufs):
fp.write(buf)
' "$@"
}
even_partition() {
local dev="$1" numparts="$2" label="${3:-gpt}"
local ret=0 bname="" size1024="" size512="" sizeM="" psizeM=""
local endM=1 skipM=1 wipe=false bname=""
bname=${dev##*/}
size1024=$(awk '$4 == bname { print $3 }' bname=$bname /proc/partitions)
[ $? -eq 0 ] || { error "failed get size $dev"; return 1; }
size512=$((${size1024}*2))
skipM=1
endM=1
sizeM=$(($size512/(1024*2)))
psizeM=$((($sizeM-$skipM-$endM)/$numparts))
debug 1 "size=${sizeM}M numparts=$numparts partitions_of=${psizeM}M label=$label dev=$dev"
local sfdisk_in=$(mktemp)
local wipes=""
wipes=( 0 )
echo "# sfdisk --label=$label $dev" > "$sfdisk_in"
for((p=0;p<$numparts;p++)); do
curstartM=$(($skipM+($psizeM*$p)))
pnum=$(($p+1))
if [ $pnum -eq $numparts ]; then
cursizeM=$(($sizeM-$endM-$curstartM))
else
cursizeM=$psizeM
fi
curstart=$(($curstartM*2048))
cursize=$(($cursizeM*2048))
curend=$(($curstart+$cursize))
echo "curstart=$curstart curend=$curend part=$p" 1>&2
wipes[${#wipes[@]}]="$curstart"
wipes[${#wipes[@]}]="$(($curend-2048))"
#echo "$curstart,$cursizeM,," # old style
echo "${dev}$pnum: start=$curstart, size=$cursize, type=83, name=foopart$pnum"
done >> "$sfdisk_in"
wipes[${#wipes[@]}]=$((size512-2048))
if $wipe; then
wipedev "$dev" "${wipes[@]}" || return
fi
cat "$sfdisk_in" >/tmp/out.sfdisk_in
out=$(sfdisk --label=$label "$dev" < "$sfdisk_in")
ret=$?
[ $? -eq 0 ] && error "created $numparts partitions on $dev"
rm -f "$sfdisk_in"
return $ret
}
even_partition "$@"
|