mirror of
				https://git.launchpad.net/livecd-rootfs
				synced 2025-10-31 08:54:06 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			184 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			184 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash -ex
 | |
| 
 | |
| IMAGE_STR="# CLOUD_IMG: This file was created/modified by the Cloud Image build process"
 | |
| FS_LABEL="cloudimg-rootfs"
 | |
| 
 | |
| . config/binary
 | |
| 
 | |
| . config/functions
 | |
| 
 | |
| BOOTPART_START=
 | |
| BOOTPART_END=
 | |
| BOOT_MOUNTPOINT=
 | |
| ROOTPART_START=1
 | |
| 
 | |
| case $ARCH:$SUBARCH in
 | |
| 	ppc64el:*|powerpc:*)
 | |
| 		echo "POWER disk images are handled separately"
 | |
| 		exit 0
 | |
| 		;;
 | |
| 	amd64|arm64)
 | |
| 		echo "We only create EFI images for $ARCH."
 | |
| 		exit 0
 | |
| 		;;
 | |
| 	armhf:raspi2)
 | |
| 		# matches the size of the snappy image
 | |
| 		IMAGE_SIZE=$((4*1000*1000*1000))
 | |
| 
 | |
| 		BOOTPART_START=8192s
 | |
| 		BOOTPART_END=138M
 | |
| 		BOOT_MOUNTPOINT=/boot/firmware
 | |
| 		;;
 | |
| 	*)
 | |
| 		;;
 | |
| esac
 | |
| 
 | |
| create_empty_partition_table() {
 | |
|     parted "$1" --script -- mklabel msdos
 | |
| }
 | |
| 
 | |
| create_empty_partition() {
 | |
|     local disk="$1"
 | |
|     local part="$2"
 | |
|     local start="$3"
 | |
|     local end="$4"
 | |
|     local type="$5"
 | |
|     local bootable="$6"
 | |
| 
 | |
|     parted_prefix="parted $disk --script --"
 | |
|     ${parted_prefix} mkpart primary "$type" "$start" "$end"
 | |
|     if [ -n "$bootable" ]; then
 | |
|         ${parted_prefix} set "$part" B
 | |
|     fi
 | |
|     ${parted_prefix} print
 | |
|     ${parted_prefix} align-check opt "$part"
 | |
| }
 | |
| 
 | |
| disk_image=binary/boot/disk.ext4
 | |
| 
 | |
| create_empty_disk_image "${disk_image}"
 | |
| create_empty_partition_table "${disk_image}"
 | |
| 
 | |
| ROOTPART=1
 | |
| ROOT_BOOTABLE=1
 | |
| if [ -n "$BOOTPART_START" ]; then
 | |
| 	ROOTPART=2
 | |
| 	ROOTPART_START="$BOOTPART_END"
 | |
| 	ROOT_BOOTABLE=
 | |
| 	create_empty_partition "$disk_image" 1 "$BOOTPART_START" "$BOOTPART_END" fat32 1
 | |
| fi
 | |
| create_empty_partition "${disk_image}" "$ROOTPART" "$ROOTPART_START" -1 ext2 "$ROOT_BOOTABLE"
 | |
| 
 | |
| mount_image "${disk_image}" "$ROOTPART"
 | |
| 
 | |
| partuuid=$(blkid -s PARTUUID -o value "$rootfs_dev_mapper")
 | |
| 
 | |
| # Copy the chroot in to the disk
 | |
| make_ext4_partition "${rootfs_dev_mapper}"
 | |
| mkdir mountpoint
 | |
| mount "${rootfs_dev_mapper}" mountpoint
 | |
| 
 | |
| if [ -n "$BOOT_MOUNTPOINT" ]; then
 | |
| 	boot_dev_mapper="${rootfs_dev_mapper%%[0-9]}1"
 | |
| 	# assume fat32 for now
 | |
| 	mkfs.vfat -n system-boot "$boot_dev_mapper"
 | |
| 	mkdir -p "mountpoint/$BOOT_MOUNTPOINT"
 | |
| 	mount "$boot_dev_mapper" "mountpoint/$BOOT_MOUNTPOINT"
 | |
| fi
 | |
| 
 | |
| cp -a chroot/* mountpoint/
 | |
| 
 | |
| setup_mountpoint mountpoint
 | |
| 
 | |
| case $ARCH:$SUBARCH in
 | |
| 	armhf:raspi2)
 | |
| 		chroot mountpoint flash-kernel \
 | |
| 			--machine "Raspberry Pi 2 Model B"
 | |
| 		# not the best place for this, but neither flash-kernel nor
 | |
| 		# u-boot have provisions for installing u-boot via maintainer
 | |
| 		# script
 | |
| 		config/hooks/raspi2/mkknlimg --dtok \
 | |
| 			mountpoint/usr/lib/u-boot/rpi_2/u-boot.bin \
 | |
| 			mountpoint/boot/firmware/uboot.bin
 | |
| 		;;
 | |
| 	*)	;;
 | |
| esac
 | |
| 
 | |
| case $ARCH in
 | |
|     amd64|i386) should_install_grub=1;;
 | |
|              *) should_install_grub=0;;
 | |
| esac
 | |
| 
 | |
| if [ "${should_install_grub}" -eq 1 ]; then
 | |
|     echo "(hd0) ${loop_device}" > mountpoint/tmp/device.map
 | |
|     chroot mountpoint grub-install ${loop_device}
 | |
|     chroot mountpoint grub-bios-setup \
 | |
|         --boot-image=i386-pc/boot.img \
 | |
|         --core-image=i386-pc/core.img \
 | |
|         --skip-fs-probe \
 | |
|         --device-map=/tmp/device.map \
 | |
|         ${loop_device}
 | |
| 
 | |
|     rm mountpoint/tmp/device.map
 | |
| 
 | |
| 	if [ "${SUBPROJECT:-}" = minimized ] && [ -n "$partuuid" ]; then
 | |
| 		echo "partuuid found for root device; forcing it in Grub"
 | |
| 		mkdir -p mountpoint/etc/default/grub.d
 | |
| 		echo "GRUB_FORCE_PARTUUID=$partuuid" >> mountpoint/etc/default/grub.d/40-force-partuuid.cfg
 | |
| 		divert_grub mountpoint
 | |
| 		chroot mountpoint update-grub
 | |
| 		undivert_grub mountpoint
 | |
| 	fi
 | |
| fi
 | |
| 
 | |
| if [ "$ARCH" = "s390x" ]; then
 | |
|     # Do ZIPL install bits
 | |
|     chroot mountpoint apt-get -qqy install s390-tools sysconfig-hardware
 | |
| 
 | |
|     # Write out cloudy zipl.conf for future kernel updates
 | |
|     cat << EOF > mountpoint/etc/zipl.conf
 | |
| # This has been modified by the cloud image build process
 | |
| [defaultboot]
 | |
| default=ubuntu
 | |
| 
 | |
| [ubuntu]
 | |
| target = /boot
 | |
| image = /boot/vmlinuz
 | |
| parameters = root=LABEL=cloudimg-rootfs
 | |
| EOF
 | |
| 
 | |
|     ZIPL_EXTRA_PARAMS=
 | |
|     if [ -e mountpoint/boot/initrd.img-* ]; then
 | |
|         # Kernel initramfs hooks end up creating a copy
 | |
|         # rather than a symlink FIXME
 | |
|         pushd mountpoint/boot
 | |
|         ln -sf initrd.img-* initrd.img
 | |
|         popd
 | |
| 
 | |
|         echo "ramdisk = /boot/initrd.img" >> mountpoint/etc/zipl.conf
 | |
| 
 | |
|         ZIPL_EXTRA_PARAMS=--ramdisk=/boot/initrd.img
 | |
|     fi
 | |
| 
 | |
|     # Create bootmap file
 | |
|     chroot mountpoint /sbin/zipl -V \
 | |
|         --image=/boot/vmlinuz \
 | |
|         --parameters='root=LABEL=cloudimg-rootfs' \
 | |
|         --target=/boot/ \
 | |
|         --targetbase=$loop_device \
 | |
|         --targettype=SCSI \
 | |
|         --targetblocksize=512 \
 | |
|         --targetoffset=2048 \
 | |
|         $ZIPL_EXTRA_PARAMS
 | |
| fi
 | |
| 
 | |
| if [ -n "$BOOT_MOUNTPOINT" ]; then
 | |
| 	umount "mountpoint/$BOOT_MOUNTPOINT"
 | |
| fi
 | |
| 
 | |
| umount_partition mountpoint
 | |
| rmdir mountpoint
 | |
| 
 | |
| clean_loops
 | |
| trap - EXIT
 |