## # 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 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 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 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 } exec 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)" }