summaryrefslogtreecommitdiffstats
path: root/classes
diff options
context:
space:
mode:
authorAndrei Gherzan <andrei@gherzan.ro>2012-05-18 22:51:02 +0300
committerAndrei Gherzan <andrei@gherzan.ro>2012-07-02 18:30:15 +0300
commit2567ba074cdeee3a9bc4c400cddcc34690b133cf (patch)
treee3f2a4feca1b041ade969ad05ce0523c346a3651 /classes
parent4b460a3f78d662f98ea2072a839d1881c2cde909 (diff)
downloadmeta-raspberrypi-2567ba074cdeee3a9bc4c400cddcc34690b133cf.tar.gz
sdcard_image-rpi.bbclass: Rewrite sdimage creation class - implemented with parted
This implementation doesn't use loop mounts, it uses mcopy to copy files to partitions. The partition creation is done with parted. Because of using these tools the IMAGE_DEPENDS was modified accordingly. Added a way of selecting the desired GPU firmware. Because we don't create the rootfs image but we rely on an already created rootfs image, the stamp is available only in the boot partition. By default the class needs an ext3 rootfs image. This is because we don't have yet a way of generating cmdline.txt in order to pass the partition type to the kernel. By default ext3 is mounted so we use this fs type until this will be selectable while generating a cmdline file. Signed-off-by: Andrei Gherzan <andrei@gherzan.ro>
Diffstat (limited to 'classes')
-rw-r--r--classes/sdcard_image-rpi.bbclass194
1 files changed, 81 insertions, 113 deletions
diff --git a/classes/sdcard_image-rpi.bbclass b/classes/sdcard_image-rpi.bbclass
index 1ac3e84..ef27ac6 100644
--- a/classes/sdcard_image-rpi.bbclass
+++ b/classes/sdcard_image-rpi.bbclass
@@ -1,131 +1,99 @@
1inherit image 1#
2 2# Create an image that can by written onto a SD card using dd.
3# Add the fstypes we need 3#
4IMAGE_FSTYPES_append = " tar.bz2 rpi-sdimg" 4# The disk layout used is:
5 5#
6# Ensure required utilities are present 6# 0 - 1M - reserved for other data
7IMAGE_DEPENDS_rpi-sdimg = "genext2fs-native e2fsprogs-native bcm2835-bootfiles bcm2835-kernel-image" 7# 1M - BOOT_SPACE - bootloader and kernel
8 8# BOOT_SPACE - SDIMG_SIZE - rootfs
9# Register this as an avalable type of image. 9#
10IMAGE_TYPES_append = " rpi-sdimg" 10
11 11inherit image_types
12# Change this to match your host distro 12
13LOSETUP ?= "/sbin/losetup" 13# Set kernel and boot loader
14 14IMAGE_BOOTLOADER ?= "bcm2835-bootfiles"
15# Since these need to go in /etc/fstab we can hardcode them 15
16# Since the vars are weakly assigned, you can override them from your local.conf 16# Default to 1.4GiB images
17LOOPDEV ?= "/dev/loop1" 17SDIMG_SIZE ?= "4000"
18LOOPDEV_BOOT ?= "/dev/loop2" 18
19LOOPDEV_FS ?= "/dev/loop3" 19# Boot partition volume id
20 20BOOTDD_VOLUME_ID ?= "${MACHINE}"
21# Default to 4GiB images 21
22SDIMG_SIZE ?= "444" 22# Addional space for boot partition
23 23BOOT_SPACE ?= "20MiB"
24# FS type for rootfs 24
25ROOTFSTYPE ?= "ext4" 25# Use an ext3 by default as rootfs
26 26SDIMG_ROOTFS_TYPE ?= "ext3"
27BOOTPARTNAME ?= "${MACHINE}" 27SDIMG_ROOTFS = "${IMAGE_NAME}.rootfs.${SDIMG_ROOTFS_TYPE}"
28 28
29IMAGEDATESTAMP = "${@time.strftime('%Y.%m.%d',time.gmtime())}" 29# Set GPU firmware image to be used
30# arm128 : 128M ARM, 128M GPU split
31# arm192 : 192M ARM, 64M GPU split
32# arm224 : 224M ARM, 32M GPU split
33RPI_GPU_FIRMWARE ?= "arm192"
34
35IMAGE_DEPENDS_rpi-sdimg = " \
36 parted-native \
37 mtools-native \
38 dosfstools-native \
39 virtual/kernel \
40 ${IMAGE_BOOTLOADER} \
41 "
42
43# SD card image name
44SDIMG = "${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.rootfs.rpi-sdimg"
30 45
31# Additional files and/or directories to be copied into the vfat partition from the IMAGE_ROOTFS. 46# Additional files and/or directories to be copied into the vfat partition from the IMAGE_ROOTFS.
32FATPAYLOAD ?= "" 47FATPAYLOAD ?= ""
33 48
34IMAGE_CMD_rpi-sdimg () { 49IMAGEDATESTAMP = "${@time.strftime('%Y.%m.%d',time.gmtime())}"
35 SDIMG=${WORKDIR}/sd.img
36
37 # sanity check fstab entry for boot partition mounting
38 if [ "x$(cat /etc/fstab | grep ${LOOPDEV_BOOT} | grep ${WORKDIR}/tmp-mnt-boot | grep user || true)" = "x" ]; then
39 echo "/etc/fstab entries need to be created with the user flag for the loop devices like:"
40 echo "${LOOPDEV_BOOT} ${WORKDIR}/tmp-mnt-boot vfat user 0 0"
41 false
42 fi
43
44 # cleanup loops
45 for loop in ${LOOPDEV} ${LOOPDEV_BOOT} ${LOOPDEV_FS} ; do
46 ${LOSETUP} -d $loop || true
47 done
48
49 # If an SD image is already present, reuse and reformat it
50 if [ ! -e ${SDIMG} ] ; then
51 dd if=/dev/zero of=${SDIMG} bs=$(echo '255 * 63 * 512' | bc) count=${SDIMG_SIZE}
52 fi
53 50
54 ${LOSETUP} ${LOOPDEV} ${SDIMG} 51IMAGE_CMD_rpi-sdimg () {
52 # Initialize sdcard image file
53 dd if=/dev/zero of=${SDIMG} bs=1 count=0 seek=$(expr 1000 \* 1000 \* ${SDIMG_SIZE})
55 54
56 # Create partition table 55 # Create partition table
57 dd if=/dev/zero of=${LOOPDEV} bs=1024 count=1024 56 parted -s ${SDIMG} mklabel msdos
58 SIZE=$(/sbin/fdisk -l ${LOOPDEV} | grep Disk | grep bytes | awk '{print $5}') 57 # Create boot partition and mark it as bootable
59 CYLINDERS=$(echo $SIZE/255/63/512 | bc) 58 parted -s ${SDIMG} mkpart primary fat32 1MiB ${BOOT_SPACE}
60 { 59 parted -s ${SDIMG} set 1 boot on
61 echo ,9,0x0C,* 60 # Create rootfs partition
62 echo ,,,- 61 parted -s ${SDIMG} mkpart primary ext2 ${BOOT_SPACE} 100%
63 } | /sbin/sfdisk -D -H 255 -S 63 -C ${CYLINDERS} ${LOOPDEV} 62 parted ${SDIMG} print
64 63
65 # Prepare loop devices for boot and filesystem partitions 64 # Create a vfat image with boot files
66 BOOT_OFFSET=32256 65 BOOT_BLOCKS=$(LC_ALL=C parted -s ${SDIMG} unit b print | awk '/ 1 / { print substr($4, 1, length($4 -1)) / 512 /2 }')
67 FS_OFFSET_SECT=$(/sbin/fdisk -l -u ${LOOPDEV} 2>&1 | grep Linux | perl -p -i -e "s/\s+/ /"|cut -d " " -f 2) 66 mkfs.vfat -n "${BOOTDD_VOLUME_ID}" -S 512 -C ${WORKDIR}/boot.img $BOOT_BLOCKS
68 FS_OFFSET=$(echo "$FS_OFFSET_SECT * 512" | bc) 67 case "${RPI_GPU_FIRMWARE}" in
69 FS_SIZE_BLOCKS=$(/sbin/fdisk -l -u ${LOOPDEV} 2>&1 | grep Linux | perl -p -i -e "s/\s+/ /g" \ 68 "arm128" | "arm192" | "arm224")
70 |cut -d " " -f 4 | cut -d "+" -f 1) 69 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/bcm2835-bootfiles/${RPI_GPU_FIRMWARE}_start.elf ::start.elf
71 70 ;;
72 LOOPDEV_BLOCKS=$(/sbin/fdisk -l -u ${LOOPDEV} 2>&1 | grep FAT | perl -p -i -e "s/\s+/ /g"|cut -d " " -f 5) 71 *)
73 LOOPDEV_BYTES=$(echo "$LOOPDEV_BLOCKS * 1024" | bc) 72 bberror "RPI_GPU_FIRMWARE is undefined or value not recongnised. Possible values: arm128, arm192 or arm224."
74 73 exit 1
75 ${LOSETUP} -d ${LOOPDEV} 74 ;;
76 75 esac
77 ${LOSETUP} ${LOOPDEV_BOOT} ${SDIMG} -o ${BOOT_OFFSET}
78
79 /sbin/mkfs.vfat ${LOOPDEV_BOOT} -n ${BOOTPARTNAME} $LOOPDEV_BLOCKS
80
81 # Prepare boot partion. First mount the boot partition, and copy the bootloader and supporting files.
82
83 mkdir -p ${WORKDIR}/tmp-mnt-boot
84 mount $LOOPDEV_BOOT ${WORKDIR}/tmp-mnt-boot
85 76
86 echo "Copying bootloader and prepended kernel.img into the boot partition" 77 # To do
87 cp -v ${DEPLOY_DIR_IMAGE}/bcm2835-bootfiles/* ${WORKDIR}/tmp-mnt-boot || true 78 # Copy here a cmdline.txt file generated taking into consideration the partition type
79 # of the rootfs
80 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/bcm2835-bootfiles/bootcode.bin ::
81 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/bcm2835-bootfiles/loader.bin ::
82 mcopy -i ${WORKDIR}/boot.img -s ${DEPLOY_DIR_IMAGE}/bcm2835-bootfiles/kernel.img ::
88 83
89 if [ -n ${FATPAYLOAD} ] ; then 84 if [ -n ${FATPAYLOAD} ] ; then
90 echo "Copying payload into VFAT" 85 echo "Copying payload into VFAT"
91 for entry in ${FATPAYLOAD} ; do 86 for entry in ${FATPAYLOAD} ; do
92 # add the || true to stop aborting on vfat issues like not supporting .~lock files 87 # add the || true to stop aborting on vfat issues like not supporting .~lock files
93 cp -av ${IMAGE_ROOTFS}$entry ${WORKDIR}/tmp-mnt-boot || true 88 mcopy -i ${WORKDIR}/boot.img -s -v ${IMAGE_ROOTFS}$entry :: || true
94 done 89 done
95 fi 90 fi
96 91
97 echo "${IMAGE_NAME}-${IMAGEDATESTAMP}" > ${IMAGE_ROOTFS}/etc/image-version-info 92 # Add stamp file
98 93 echo "${IMAGE_NAME}-${IMAGEDATESTAMP}" > ${WORKDIR}/image-version-info
99 cp -v ${IMAGE_ROOTFS}/etc/image-version-info ${WORKDIR}/tmp-mnt-boot || true 94 mcopy -i ${WORKDIR}/boot.img -v ${WORKDIR}//image-version-info ::
100
101 # Cleanup VFAT mount
102 echo "Cleaning up VFAT mount"
103 umount ${WORKDIR}/tmp-mnt-boot
104 ${LOSETUP} -d ${LOOPDEV_BOOT} || true
105
106 # Prepare rootfs parition
107 echo "Creating rootfs loopback"
108 ${LOSETUP} ${LOOPDEV_FS} ${SDIMG} -o ${FS_OFFSET}
109
110 FS_NUM_INODES=$(echo $FS_SIZE_BLOCKS / 4 | bc)
111
112 case "${ROOTFSTYPE}" in
113 ext3)
114 genext2fs -z -N $FS_NUM_INODES -b $FS_SIZE_BLOCKS -d ${IMAGE_ROOTFS} ${LOOPDEV_FS}
115 tune2fs -L ${IMAGE_NAME} -j ${LOOPDEV_FS}
116 ;;
117 ext4)
118 genext2fs -z -N $FS_NUM_INODES -b $FS_SIZE_BLOCKS -d ${IMAGE_ROOTFS} ${LOOPDEV_FS}
119 tune2fs -L ${IMAGE_NAME} -j -O extents,uninit_bg,dir_index ${LOOPDEV_FS}
120 ;;
121 *)
122 echo "Please set ROOTFSTYPE to something supported"
123 exit 1
124 ;;
125 esac
126
127 ${LOSETUP} -d ${LOOPDEV_FS} || true
128 95
129 gzip -c ${WORKDIR}/sd.img > ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}-${IMAGEDATESTAMP}.img.gz 96 # Burn Partitions
130 rm -f ${WORKDIR}/sd.img 97 dd if=${WORKDIR}/boot.img of=${SDIMG} conv=notrunc seek=1 bs=1M && sync && sync
98 dd if=${SDIMG_ROOTFS} of=${SDIMG} conv=notrunc seek=1 bs=${BOOT_SPACE} && sync && sync
131} 99}