genode/tool/run/image/disk
Norman Feske 48bc69b14b run/image/disk: consider ext2 overhead
The original value of 256K does not suffice for images of the size of
sculpt.
2018-05-30 13:36:10 +02:00

80 lines
2.5 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] }
##
# Create disk image with the content of the run directory
#
proc run_image { {unused ""} } {
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 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 + 256 + 128) / 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 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 parted -a none [run_dir].img -- mkpart Fix GENODE* ext2 [expr $first_sector]s ${last_sector}s }
set size_image [expr [regsub {\s.*} [exec du -sk [run_dir].img] {}]]
puts "Created image file [run_dir].img (${size_image}kiB)"
}