summaryrefslogtreecommitdiffstats
path: root/target/image/x86/gen_image.sh
blob: 95be6cc8ef2403878f73ef234ffa8ad952097e2f (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
#!/usr/bin/env bash
# Copyright (C) 2006 OpenWrt.org

[ $# == 5 ] || {
	echo "SYNTAX: $0 <file> <kernel size> <kernel directory> <rootfs size> <rootfs image>"
	exit 1
}

file="$1"
part1s="$2"
part1d="$3"
part2s="$4"
part2f="$5"

head=16
sect=63
cyl=$(( ($part1s + $part2s) * 1024 * 1024 / ($head * $sect * 512)))

dd if=/dev/zero of="$file" bs=1M count=$(($part1s + $part2s))  2>/dev/null || exit
fdisk -u -C $cyl -H $head -S $sect "$file" > /dev/null 2>/dev/null <<EOF
n
p
1

+${part1s}M
n
p
2

+${part2s}M
w
q
EOF

block() {
	echo -e 'p\nq' | fdisk -u -C $cyl -H $head -S $sect "$file" | awk -v file="$file$1" -v n="$(($2 + 2))" '
$1 == file {
	print $n * 512
}'
}

start="$(block 1 0)"
end="$(block 1 1)"
blocks="$(( ($end - $start) / 1024 ))"

genext2fs -d "$part1d" -b "$blocks" "$file.kernel"
dd if="$file.kernel" of="$file" bs=512 seek="$(($start / 512))" conv=notrunc
rm -f "$file.kernel"

start="$(block 2 0)"
dd if="$part2f" of="$file" bs=512 seek="$(($start / 512))" conv=notrunc

which chpax >/dev/null && chpax -zp $(which grub)
grub --device-map=/dev/null <<EOF
device (hd0) $file
geometry (hd0) $cyl $head $sect
root (hd0,0)
setup (hd0)
EOF