#!/bin/sh # SPDX-License-Identifier: GPL-2.0-or-later # # Build a partitioned SchOS disk: the image a real machine boots from. # # tools/posix/mkdisk.sh # # A GUID partition table with two entries: # # 1 EFI system partition FAT, holding (the loader and kernel) # 2 SchFS , byte for byte, typed # 47138FA9-B79C-47A6-9F7D-AC1F7F572D5E # # This is the layout every UEFI machine expects: the firmware finds the ESP by # its type and runs EFI/BOOT/BOOTX64.EFI from it, and the kernel finds the root # by scanning the same table -- the SchFS type first, anything else after (see # rootdev_mount() in kernel/proc/proc.c). Write it to a USB stick or a disk # with dd and it boots; attach it to QEMU's q35 as its only disk and it boots # the same way. # # The SchFS partition holds the volume unchanged. A filesystem addresses # blocks from the start of whatever it is on, and the kernel hands a partition # to it as a device whose block 0 is the partition's first sector -- so the # image mkschfs writes for a whole disk is already the right content for a # partition, and so is anything a Linux SchFS driver is given as /dev/sdX2. # # Needs sfdisk (util-linux) and mtools. Nothing here needs root or loop # devices: the FAT is built in a file and copied in at its offset. set -eu esp=$1 vol=$2 out=$3 SCHFS_TYPE=47138FA9-B79C-47A6-9F7D-AC1F7F572D5E ESP_TYPE=C12A7328-F81F-11D2-BA4B-00A0C93EC93B for t in sfdisk mformat mcopy; do command -v $t >/dev/null || { echo "mkdisk: needs $t" >&2; exit 1; } done # Sizes in 512-byte sectors. The ESP is 64 MB, which leaves room for the # kernel to grow by an order of magnitude; partitions start on 1 MB # boundaries, which is what every partitioning tool does and what flash # media erase in. esp_mb=64 esp_start=2048 esp_sectors=$((esp_mb * 2048)) vol_bytes=$(wc -c < "$vol") vol_start=$((esp_start + esp_sectors)) vol_sectors=$(( (vol_bytes + 511) / 512 )) # 1 MB at the end for the backup GPT, rounded the same way. total=$((vol_start + vol_sectors + 2048)) rm -f "$out" "$out.esp" dd if=/dev/zero of="$out" bs=512 count=0 seek=$total 2>/dev/null sfdisk --quiet --label gpt "$out" </dev/null mformat -i "$out.esp" -F -v SCHOS :: mcopy -i "$out.esp" -s "$esp"/* :: dd if="$out.esp" of="$out" bs=512 seek=$esp_start conv=notrunc 2>/dev/null rm -f "$out.esp" dd if="$vol" of="$out" bs=512 seek=$vol_start conv=notrunc 2>/dev/null echo "mkdisk: $out -- ESP ${esp_mb} MB, SchFS $((vol_bytes >> 20)) MB"