8725a37861965b9fb661815edb33a5d532ac0df7
3 # Copyright (C) 2016 Josua Mayer
5 # This program is free software; you can redistribute it and/or
6 # modify it under the terms of the GNU General Public License
7 # as published by the Free Software Foundation; either version 2
8 # of the License, or (at your option) any later version.
10 # This program is distributed in the hope that it will be useful,
11 # but WITHOUT ANY WARRANTY; without even the implied warranty of
12 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 # GNU General Public License for more details.
15 # You should have received a copy of the GNU General Public License
16 # along with this program; if not, write to the Free Software
17 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
21 echo "$0 <sectors> <outfile> <bootloader> [<type_partitionN> <sectors_partitionN> <img_partitionN>]?"
24 # always require first 3 arguments
25 # then in pairs up to 8 more for a total of up to 4 partitions
26 if [ $# -lt 3 ] ||
[ $# -gt 15 ] ||
[ $
(($#%3)) -ne 0 ]; then
38 # calculate number of partitions from argument list
40 ((NUMPARTS
=(NUMPARTS-3
)/3))
42 # find required applications
43 FDISK
=$
(env PATH
="/usr/local/sbin:/usr/sbin:/sbin:$PATH" which fdisk
)
46 printf "Creating $OUTFILE from /dev/zero: "
47 dd if=/dev
/zero of
="$OUTFILE" bs
=512 count
=1 >/dev
/null
50 # generate fdisk argument list
51 printf "Generating fdisk argument list: "
54 # empty partition table
55 printf "o\n" >> $ARGSFILE
59 for i
in $
(seq 1 1 $NUMPARTS); do
60 ((n
=3+3*i-2
)); type=$
(eval echo \
${$n})
61 ((n
=3+3*i-1
)); size
=$
(eval echo \
${$n})
64 printf "n\np\n%i\n\n%i\n" $i $end >> $ARGSFILE
66 # special case on first aprtition: fdisk wont ask which one
68 printf "t\n%s\n" $type >> $ARGSFILE
70 printf "t\n%i\n%s\n" $i $type >> $ARGSFILE
73 # add this partitions size to offset for next partition
78 printf "w\n" >> $ARGSFILE
82 # create real partition table using fdisk
83 printf "Creating partition table: "
84 cat $ARGSFILE |
$FDISK "$OUTFILE" >/dev
/null
87 # remove temporary files
88 printf "Cleaning up: "
93 printf "Writing bootloader: "
94 dd of
="$OUTFILE" if="$BOOTLOADER" bs
=512 seek
=1 conv
=notrunc
2>/dev
/null
97 # write partition data
99 # offset of first partition is 2048
101 for i
in $
(seq 1 1 $NUMPARTS); do
102 ((n
=3+3*i-1
)); size
=$
(eval echo \
${$n})
103 ((n
=3+3*i
)); img
="$(eval echo \${$n})"
105 printf "Writing %s to partition %i: " "$img" $i
106 dd if="$img" of
="$OUTFILE" bs
=512 seek
=$offset conv
=notrunc
2>/dev
/null
109 # add this partitions size to offset for next partition
110 ((offset
=offset
+size
))