summaryrefslogtreecommitdiffstats
path: root/meta/classes/boot-directdisk.bbclass
diff options
context:
space:
mode:
authorRichard Purdie <rpurdie@linux.intel.com>2010-03-25 11:44:25 +0000
committerRichard Purdie <rpurdie@linux.intel.com>2010-03-25 11:44:25 +0000
commit027c1678789dd6d04243bec23a9a91975b4e4a70 (patch)
tree17fb08ceea546b627c69d42625290667b27be6f0 /meta/classes/boot-directdisk.bbclass
parentf30bf93e14868e405999335d3db5af9e23a55425 (diff)
downloadpoky-027c1678789dd6d04243bec23a9a91975b4e4a70.tar.gz
boot-directdisk.bbclass: Add direct disk image creation class
Signed-off-by: Richard Purdie <rpurdie@linux.intel.com>
Diffstat (limited to 'meta/classes/boot-directdisk.bbclass')
-rw-r--r--meta/classes/boot-directdisk.bbclass92
1 files changed, 92 insertions, 0 deletions
diff --git a/meta/classes/boot-directdisk.bbclass b/meta/classes/boot-directdisk.bbclass
new file mode 100644
index 0000000000..f4abae991b
--- /dev/null
+++ b/meta/classes/boot-directdisk.bbclass
@@ -0,0 +1,92 @@
1# boot-directdisk.bbclass
2# (loosly based off bootimg.bbclass Copyright (C) 2004, Advanced Micro Devices, Inc.)
3#
4# Create an image which can be placed directly onto a harddisk using dd and then
5# booted.
6#
7# This uses syslinux. extlinux would have been nice but required the ext2/3
8# partition to be mounted. grub requires to run itself as part of the install
9# process.
10#
11# The end result is a 512 boot sector populated with an MBR and partition table
12# followed by an msdos fat16 partition containing syslinux and a linux kernel
13# completed by the ext2/3 rootfs.
14#
15# We have to push the msdos parition table size > 16MB so fat 16 is used as parted
16# won't touch fat12 partitions.
17
18# External variables needed
19
20# ${ROOTFS} - the rootfs image to incorporate
21
22do_bootdirectdisk[depends] += "dosfstools-native:do_populate_sysroot \
23 syslinux:do_populate_sysroot \
24 syslinux-installer-native:do_populate_sysroot"
25
26PACKAGES = " "
27EXCLUDE_FROM_WORLD = "1"
28
29HDDDIR = "${S}/hdd/boot"
30HDDIMG = "${S}/hdd.image"
31
32BOOTDD_VOLUME_ID ?= "boot"
33BOOTDD_EXTRA_SPACE ?= "16384"
34
35# Get the build_syslinux_cfg() function from the syslinux class
36
37AUTO_SYSLINUXCFG = "1"
38LABELS = "boot"
39APPEND = "root=/dev/sda2"
40TIMEOUT = "10"
41SYSLINUXCFG = "${HDDDIR}/syslinux.cfg"
42SYSLINUXMENU = "${HDDDIR}/menu"
43
44inherit syslinux
45
46build_boot_dd() {
47 IMAGE=${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hdddirect
48
49 install -d ${HDDDIR}
50 install -m 0644 ${STAGING_DIR}/${MACHINE}${HOST_VENDOR}-${HOST_OS}/kernel/bzImage ${HDDDIR}/vmlinuz
51 install -m 444 ${STAGING_DATADIR}/syslinux/ldlinux.sys ${HDDDIR}/ldlinux.sys
52
53 BLOCKS=`du -bks ${HDDDIR} | cut -f 1`
54 SIZE=`expr $BLOCKS + ${BOOTDD_EXTRA_SPACE}`
55
56 mkdosfs -n ${BOOTDD_VOLUME_ID} -d ${HDDDIR} -C ${HDDIMG} $SIZE
57 syslinux ${HDDIMG}
58 chmod 644 ${HDDIMG}
59
60 ROOTFSBLOCKS=`du -Lbks ${ROOTFS} | cut -f 1`
61 TOTALSIZE=`expr $SIZE + $ROOTFSBLOCKS`
62 END1=`expr $SIZE \* 1024`
63 END2=`expr $END1 + 512`
64 END3=`expr \( $ROOTFSBLOCKS \* 1024 \) + $END1`
65
66 echo $ROOTFSBLOCKS $TOTALSIZE $END1 $END2 $END3
67 rm -rf $IMAGE
68 dd if=/dev/zero of=$IMAGE bs=1024 seek=$TOTALSIZE count=1
69
70 parted $IMAGE mklabel msdos
71 parted $IMAGE mkpart primary fat16 0 ${END1}B
72 parted $IMAGE unit B mkpart primary ext2 ${END2}B ${END3}B
73 parted $IMAGE set 1 boot on
74 parted $IMAGE print
75
76 OFFSET=`expr $END2 / 512`
77 dd if=/tmp/mbr.bin of=$IMAGE conv=notrunc
78 dd if=${HDDIMG} of=$IMAGE conv=notrunc seek=1 bs=512
79 dd if=${ROOTFS} of=$IMAGE conv=notrunc seek=$OFFSET bs=512
80
81 cd ${DEPLOY_DIR_IMAGE}
82 rm -f ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.hdddirect
83 ln -s ${IMAGE_NAME}.hdddirect ${DEPLOY_DIR_IMAGE}/${IMAGE_LINK_NAME}.hdddirect
84}
85
86python do_bootdirectdisk() {
87 bb.build.exec_func('build_syslinux_cfg', d)
88 bb.build.exec_func('build_boot_dd', d)
89}
90
91addtask bootdirectdisk before do_build
92do_bootdirectdisk[nostamp] = "1"