ubunutu-cpc: Improvements for derivative image creation

* ubunutu-cpc:
    - extended hooks/functions to support creation of derivative images
      including mounting images.
    - added the ability to create qcow2 images in hooks/functions
    - simplified loop clean-up in hooks/functions
    - removed assumption that disk1.img would be built
    - switched qcow2 generation to use hooks/functions function
ubuntu/trusty
Robert C Jennings 8 years ago
parent 004ee17e1f
commit 65bb92f3a6

13
debian/changelog vendored

@ -1,3 +1,16 @@
livecd-rootfs (2.209.5) trusty; urgency=medium
[Ben Howard]
* ubuntu-cpc:
- extended hooks/functions to support creation of derivative images
including mounting images.
- added the ability to create qcow2 images in hooks/functions
- simplified loop clean-up in hooks/functions
- removed assumption that disk1.img would be built
- switched qcow2 generation to use hooks/functions function
-- Robert C Jennings <robert.jennings@canonical.com> Tue, 23 May 2017 20:21:47 -0500
livecd-rootfs (2.209.4) trusty; urgency=medium livecd-rootfs (2.209.4) trusty; urgency=medium
[Ben Howard] [Ben Howard]

@ -6,16 +6,23 @@ IMAGE_SIZE=$((2252*1024**2)) # 2.2G (the current size we ship)
rootfs_dev_mapper= rootfs_dev_mapper=
loop_device= loop_device=
loop_raw= loop_raw=
backing_img=
apt-get -qqy install dosfstools gdisk
clean_loops() { clean_loops() {
[ -z "${rootfs_dev_mapper}" ] || { if [ -z "${rootfs_dev_mapper}" ]; then
udevadm settle return 0
find /dev/mapper -iname "${loop_device///dev\//}*" | \ fi
xargs -n1 -I DEVICE dmsetup remove DEVICE ||
kpartx -d "${rootfs_dev_mapper}" if [ -n "${backing_img}" ]; then
losetup -d "${loop_device}" || echo "Failed to detach disk" kpartx -v -d "${backing_img}"
unset loop_raw fi
}
unset backing_img
unset loop_device
unset loop_raw
unset rootfs_dev_mapper
} }
create_empty_disk_image() { create_empty_disk_image() {
@ -32,6 +39,7 @@ make_ext4_partition() {
mount_image() { mount_image() {
apt-get install -qqy kpartx apt-get install -qqy kpartx
trap clean_loops EXIT trap clean_loops EXIT
backing_img="$1"
loop_raw="$(kpartx -s -v -a "$1" )" loop_raw="$(kpartx -s -v -a "$1" )"
loop_device="$(echo -e "${loop_raw}" | head -n1 | awk '{print($(NF-1))}')" loop_device="$(echo -e "${loop_raw}" | head -n1 | awk '{print($(NF-1))}')"
rootfs_dev_mapper="/dev/mapper${loop_device///dev/}p1" rootfs_dev_mapper="/dev/mapper${loop_device///dev/}p1"
@ -46,22 +54,80 @@ mount_partition() {
mount "$partition" "$mountpoint" mount "$partition" "$mountpoint"
mount --bind /dev "$mountpoint/dev" mount --bind /dev "$mountpoint/dev"
mount devpts-live -t devpts "$mountpoint/dev/pts" mount devpts-live -t proc "$mountpoint/dev/pts"
mount proc-live -t proc "$mountpoint/proc" mount proc-live -t proc "$mountpoint/proc"
mount sysfs-live -t sysfs "$mountpoint/sys" mount sysfs-live -t sysfs "$mountpoint/sys"
mount -t tmpfs none "$mountpoint/tmp"
mv "$mountpoint/etc/resolv.conf" resolv.conf.tmp mv "$mountpoint/etc/resolv.conf" resolv.conf.tmp
cp /etc/resolv.conf "$mountpoint/etc/resolv.conf" cp /etc/resolv.conf "$mountpoint/etc/resolv.conf"
} }
mount_disk_image() {
local disk_image=${1}
local mountpoint=${2}
mount_image ${disk_image}
mount_partition "${rootfs_dev_mapper}" $mountpoint
local uefi_dev="/dev/mapper${loop_device///dev/}p15"
if [ -b ${uefi_dev} -a -e $mountpoint/boot/efi ]; then
mount "${uefi_dev}" $mountpoint/boot/efi
fi
# This is needed to allow for certain operations
# such as updating grub and installing software
cat > $mountpoint/usr/sbin/policy-rc.d << EOF
#!/bin/sh
# ${CLOUD_IMG_STR}
echo "All runlevel operations denied by policy" >&2
exit 101
EOF
chmod 0755 $mountpoint/usr/sbin/policy-rc.d
}
umount_settle() {
# Unmount device, and let it settle
umount $1
udevadm settle
sleep 3
}
umount_partition() { umount_partition() {
local mountpoint=${1}
mv resolv.conf.tmp "$mountpoint/etc/resolv.conf"
for submnt in proc sys dev/pts dev tmp;
do
umount_settle $mountpoint/$submnt
done
umount_settle $mountpoint
if [ -n "${rootfs_dev_mapper}" -a -b "${rootfs_dev_mapper}" ]; then
# buildd's don't have /etc/mtab symlinked
# /etc/mtab is needed in order zerofree space for ext4 filesystems
[ -e /etc/mtab ] || ln -s /proc/mounts /etc/mtab
# both of these are likely overkill, but it does result in slightly
# smaller ext4 filesystem
apt-get -qqy install zerofree
e2fsck -y -E discard ${rootfs_dev_mapper}
zerofree ${rootfs_dev_mapper}
fi
}
umount_disk_image() {
mountpoint="$1" mountpoint="$1"
mv resolv.conf.tmp "$mountpoint/etc/resolv.conf" local uefi_dev="/dev/mapper${loop_device///dev/}p15"
umount "$mountpoint/proc" if [ -e "$mountpoint/boot/efi" -a -b "$uefi_dev" ]; then
umount "$mountpoint/sys" umount --detach-loop "$mountpoint/boot/efi"
umount "$mountpoint/dev/pts" fi
umount "$mountpoint/dev"
umount "$mountpoint" if [ -e $mountpoint/usr/sbin/policy-rc.d ]; then
rm $mountpoint/usr/sbin/policy-rc.d
fi
umount_partition $mountpoint
clean_loops
} }
modify_vmdk_header() { modify_vmdk_header() {
@ -129,3 +195,33 @@ create_vmdk() {
qemu-img info ${destination} qemu-img info ${destination}
rm -rf ${scratch_d} rm -rf ${scratch_d}
} }
create_derivative() {
# arg1 is the disk type
# arg2 is the new name
unset derivative_img
case ${1} in
uefi) disk_image="binary/boot/disk-uefi.ext4";
dname="${disk_image//-uefi/-$2-uefi}";;
*) disk_image="binary/boot/disk.ext4";
dname="${disk_image//.ext4/-$2.ext4}";;
esac
if [ ! -e ${disk_image} ]; then
echo "Did not find ${disk_image}!"; exit 1;
fi
cp ${disk_image} ${dname}
export derivative_img=${dname}
}
convert_to_qcow2() {
apt-get install -qqy qemu-utils
src="$1"
destination="$2"
qemu-img convert -c -O qcow2 -o compat=0.10 "$src" "$destination"
qemu-img info "$destination"
}

@ -2,15 +2,12 @@
apt-get install -qqy qemu-utils apt-get install -qqy qemu-utils
convert_image() { . /build/config/functions
src="$1"
destination="$2"
qemu-img convert -c -O qcow2 -o compat=0.10 "$src" "$destination"
qemu-img info "$destination"
}
convert_image binary/boot/disk.ext4 livecd.ubuntu-cpc.disk1.img if [ -f binary/boot/disk.ext4 ]; then
convert_to_qcow2 binary/boot/disk.ext4 livecd.ubuntu-cpc.disk1.img
fi
if [ -f binary/boot/disk-uefi.ext4 ]; then if [ -f binary/boot/disk-uefi.ext4 ]; then
convert_image binary/boot/disk-uefi.ext4 livecd.ubuntu-cpc.uefi1.img convert_to_qcow2 binary/boot/disk-uefi.ext4 livecd.ubuntu-cpc.uefi1.img
fi fi

@ -6,16 +6,18 @@
architecture=$(chroot chroot dpkg --print-architecture) architecture=$(chroot chroot dpkg --print-architecture)
extension="disk1.vmdk" extension="disk1.vmdk"
case ${architecture} in case ${architecture} in
i386) image_target="binary/boot/disk.ext4";; i386|amd64) ;;
amd64) image_target="binary/boot/disk-uefi.ext4"; extension="uefi1.vmdk";; *) echo "VMDK images are not supported for ${architecture} yet.";
*) echo "VMDK images are not supported for ${architecture} yet."; exit 0;;
exit 0;;
esac esac
. /build/config/functions . /build/config/functions
create_vmdk binary/boot/disk.ext4 livecd.ubuntu-cpc.disk1.vmdk if [ -e binary/boot/disk.ext4 ]; then
create_vmdk binary/boot/disk.ext4 livecd.ubuntu-cpc.disk1.vmdk
fi
if [ -e binary/boot/disk-uefi.ext4 ]; then if [ -e binary/boot/disk-uefi.ext4 ]; then
create_vmdk binary/boot/disk-uefi.ext4 livecd.ubuntu-cpc.uefi.vmdk create_vmdk binary/boot/disk-uefi.ext4 livecd.ubuntu-cpc.uefi.vmdk

@ -8,8 +8,11 @@ if [ ! -d ${my_dir}/extra ]; then
exit 0 exit 0
fi fi
# Export the common functions to the extras
. /build/config/functions
# Execute extra binary hooks # Execute extra binary hooks
for recipe in $(find ${extra_d} -type f -executable); for recipe in $(find ${extra_d} -type f -executable -maxdepth 1);
do do
bash ${recipe} bash -xue ${recipe}
done done

Loading…
Cancel
Save