mirror of
https://github.com/genodelabs/genode.git
synced 2025-02-24 19:01:12 +00:00
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.
91 lines
2.8 KiB
Plaintext
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)"
|
|
}
|