Christian Helmuth 7d4174bceb run: disable heuristics for apple gpt in parted
Newer revisions of parted require special privileges due to use of the
dmidecode tool, which logs permission errors to standard error. In these
cases parted still succeeds with its operation, so just ignore the
jabbering and prevent expect to exit.
2018-06-12 12:11:45 +02:00

91 lines
2.8 KiB
Plaintext

##
# Create disk image with contents of the run directory
#
# \param --image-disk-size disk size in MiB
#
source [genode_dir]/tool/run/grub2.inc
proc image_disk_size { } { return [get_cmd_arg --image-disk-size 0] }
#
# Disable parted heuristics for Apple to prevent error messages
#
set ::env(PARTED_GPT_APPLE) 0
##
# Create disk image with the content of the run directory
#
proc run_image { {unused ""} } {
requires_installation_of gdisk
requires_installation_of parted
requires_installation_of e2cp
# make copy of template grub2 header image
exec cp [get_grub2_dir]/boot/grub2-head.img [run_dir].header
# remove template partition
exec -ignorestderr parted -a none -s [run_dir].header -- rm 3
# calculate size of grub2 header and the size of Genode scenario
set size_header [expr [regsub {\s.*} [exec du -b [run_dir].header] {}]]
set size_run [expr [regsub {\s.*} [exec du -skL [run_dir]] {}]]
if {[image_disk_size] > 0} {
set disk_size_kb [expr [image_disk_size] * 1024 * 1024]
} else {
set disk_size_kb [expr ($size_run + 512) / 32 * 32]
}
# setup partition with content
exec dd if=/dev/zero of=[run_dir].partition bs=1k count=$disk_size_kb 2>/dev/null
exec mkfs.ext2 -L GENODE -q -T default [run_dir].partition
# copy content to disk image
foreach file [exec find [run_dir]] {
set filename [string replace $file 0 [string length [run_dir]] ""]
if {[string length $filename] == 0} {
continue
}
if {[file isdirectory $file]} {
exec e2mkdir [run_dir].partition:$filename
} else {
exec e2cp $file [run_dir].partition:$filename
}
}
# calculate start/end sector of content partition
set first_sector [expr $size_header / 512]
set last_sector [expr ((($size_header + ($disk_size_kb * 1024)) / 512) - 1)]
# add free space for the backup gpt at the end of disk
set sector_backup [exec -ignorestderr parted -s [run_dir].header 'unit s print']
set sector_backup [regexp -all -inline { 1 .*BIOSBOOT} $sector_backup]
set sector_backup [regexp -all -inline {([0-9]+)} $sector_backup]
set sector_backup [lindex $sector_backup 2]
exec dd if=/dev/zero of=[run_dir].empty bs=512 count=$sector_backup 2>/dev/null
# merge final image from GRUB2 head and partition
exec cat [run_dir].header [run_dir].partition [run_dir].empty > [run_dir].img
# cleanup
exec rm [run_dir].empty
exec rm [run_dir].header
exec rm [run_dir].partition
# create partition table entry pointing to the content
catch { exec -ignorestderr parted -a none [run_dir].img -- mkpart Fix GENODE ext2 [expr $first_sector]s ${last_sector}s }
exec -ignorestderr parted [run_dir].img -s 'name 3 GENODE'
# create hybrid MBR
exec echo -e "r\no\nh\n1\nn\n\ny\nn\no\nw\ny\n" | gdisk [run_dir].img
set size_image [expr [regsub {\s.*} [exec du -sk [run_dir].img] {}]]
puts "Created image file [run_dir].img (${size_image}kiB)"
}