Skip to content

Instantly share code, notes, and snippets.

@vitalfadeev
Last active November 15, 2022 10:07
Show Gist options
  • Select an option

  • Save vitalfadeev/fa16ad4f7fda7dc3ad2e49d027580bda to your computer and use it in GitHub Desktop.

Select an option

Save vitalfadeev/fa16ad4f7fda7dc3ad2e49d027580bda to your computer and use it in GitHub Desktop.
Create disk image with GRUB2 installd
# Create disk image with GRUB2 installd
# Requires: grub-install rm mkdir dd parted kpartx mkfs.vfat mkfs.ext2 cp mount umount chown
# Source tree:
# img/
# ext2 fat16 fat32
FS=ext2
#
DISK_FILE=disk.img
DISK_SIZE=20
BUILD_FOLDER=.build
IMAGE_FOLDER=img
DISK_MOUNT_POINT=$(BUILD_FOLDER)/tmp/p1
DEVICE_MAP_FILE=$(BUILD_FOLDER)/tmp/device.map
IMAGE_BOOT_FOLDER=$(DISK_MOUNT_POINT)/boot
# sudo kpartx -l disk.img | cut -d : -f 1
LOOPPART=loop0p1
LOOPDEV=/dev/loop0
#
LOGNAME=$(shell who am i | awk '{print $$1}')
LOGGROUP=$(shell groups $(LOGNAME) | awk '{print $$3}')
#
ifeq ($(FS),ext2)
GRUB_FS_MODULE=ext2
else
GRUB_FS_MODULE=fat
endif
all: \
check_sudo \
create_build_folder \
create_image \
create_fs_$(FS) \
mount_image \
copy_files \
install_grub \
umount_image \
free_loop_device \
set_permissions \
clear_build_folder
check_sudo:
ifneq ($(shell id -u), 0)
echo "Usage: sudo make" ; exit 1
endif
create_build_folder:
rm -rf $(BUILD_FOLDER)
mkdir $(BUILD_FOLDER)
remode_build_folder:
rm -rf $(BUILD_FOLDER)
create_image:
dd if=/dev/zero of=$(DISK_FILE) count=$(DISK_SIZE) bs=1048576
create_fs_ext2:
parted --script $(DISK_FILE) mklabel msdos mkpart p ext2 1 $(DISK_SIZE) set 1 boot on
kpartx -a $(DISK_FILE)
sleep 1
mkfs.ext2 /dev/mapper/$(LOOPPART)
create_fs_fat32:
parted --script ${DISK_FILE} mklabel msdos mkpart p fat32 1 $(DISK_SIZE) set 1 boot on
kpartx -a ${DISK_FILE}
sleep 1
mkfs.vfat -F32 /dev/mapper/$(LOOPPART)
create_fs_fat16:
parted --script $(DISK_FILE) mklabel msdos mkpart p fat16 1 $(DISK_SIZE) set 1 boot on
kpartx -a $(DISK_FILE)
sleep 1
mkfs.vfat -F16 /dev/mapper/$(LOOPPART)
mount_image:
mkdir -p $(DISK_MOUNT_POINT)
mount /dev/mapper/$(LOOPPART) $(DISK_MOUNT_POINT)
copy_files:
cp -r $(IMAGE_FOLDER)/* $(DISK_MOUNT_POINT)
install_grub:
echo "(hd0) $(LOOPDEV)" > $(DEVICE_MAP_FILE)
grub-install \
--no-floppy \
--grub-mkdevicemap=$(DEVICE_MAP_FILE) \
--modules="biosdisk part_msdos $(GRUB_FS_MODULE) configfile normal multiboot" \
--root-directory=$(DISK_MOUNT_POINT) \
--boot-directory=$(IMAGE_BOOT_FOLDER) \
$(LOOPDEV)
umount_image:
umount $(DISK_MOUNT_POINT)
free_loop_device:
kpartx -d $(DISK_FILE)
set_permissions:
chown -R $(LOGNAME):$(LOGGROUP) $(BUILD_FOLDER)
chown $(LOGNAME):$(LOGGROUP) $(DISK_FILE)
clear_build_folder:
rm -rf $(BUILD_FOLDER)/*
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment