mirror of
https://github.com/genodelabs/genode.git
synced 2024-12-20 14:13:09 +00:00
18c5f1e90d
Set disk size to 1.5 times the run folder size and shrinked later to real content. Thanks to Roland for the patch.
94 lines
2.9 KiB
Plaintext
94 lines
2.9 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 ""} } {
|
|
|
|
set sgdisk [installed_command sgdisk]
|
|
|
|
# make copy of template grub2 header image
|
|
exec cp [get_grub2_dir]/boot/grub2-head.img [run_dir].header
|
|
|
|
# remove template partition
|
|
exec $sgdisk --delete=3 [run_dir].header
|
|
|
|
# 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]
|
|
} else {
|
|
# set disk size to 1.5 times the run folder size; will be shrinked later
|
|
set disk_size_kb [expr ($size_run * 3 / 2) / 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 [installed_command 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 [installed_command e2mkdir] [run_dir].partition:$filename
|
|
} else {
|
|
exec [installed_command e2cp] $file [run_dir].partition:$filename
|
|
}
|
|
}
|
|
|
|
if {[image_disk_size] == 0} {
|
|
# resize image to only needed size and get size of resized image
|
|
exec resize2fs -M [run_dir].partition 2>/dev/null
|
|
set disk_size_b [expr [regsub {\s.*} [exec wc -c [run_dir].partition] {}]]
|
|
set disk_size_kb [expr $disk_size_b / 1024]
|
|
}
|
|
|
|
# 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 $sgdisk --info=1 [run_dir].header]
|
|
set sector_backup [regexp -all -line -inline {First sector: ([0-9]+)} $sector_backup]
|
|
set sector_backup [lindex $sector_backup 1]
|
|
|
|
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
|
|
|
|
# move backup GPT to the end of the disk
|
|
exec $sgdisk --move-second-header [run_dir].img
|
|
|
|
# create partition table entry pointing to the content
|
|
exec $sgdisk --new=3:$first_sector:$last_sector [run_dir].img
|
|
exec $sgdisk --change-name=3:GENODE [run_dir].img
|
|
|
|
# create hybrid MBR
|
|
exec $sgdisk --hybrid [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)"
|
|
}
|