summaryrefslogtreecommitdiffstats
path: root/target/linux/x86-2.6/image/gen_image.sh
blob: 21deeee6acdecd5e942b438c575e01c23eae0863 (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 * 1024))K
n
p
2


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