From: Waldemar Kozaczuk <[email protected]> Committer: Waldemar Kozaczuk <[email protected]> Branch: master
build: allow building kernel-less ZFS and ROFS disk images This patch enhances the build shell script by adding new '--create-disk' option that allows building kernel-less disk images. Kernel-less disk images are intended to be used with direct kernel boot. Please note it can only be used with QEMU 4.0 or later as it requires PVH boot support. Signed-off-by: Waldemar Kozaczuk <[email protected]> Message-Id: <[email protected]> --- diff --git a/scripts/build b/scripts/build --- a/scripts/build +++ b/scripts/build @@ -34,6 +34,7 @@ usage() { (can be used to customize specific app/module build process) -j<N> Set number of parallel jobs for make --append-manifest Append build/<mode>/append.manifest to usr.manifest + --create-disk Instead of usr.img create kernel-less disk.img Examples: ./scripts/build -j4 fs=rofs image=native-example # Create image with native-example app @@ -75,7 +76,7 @@ do case $i in --help|-h) usage ;; - image=*|modules=*|fs=*|usrskel=*|check|--append-manifest) ;; + image=*|modules=*|fs=*|usrskel=*|check|--append-manifest|--create-disk) ;; clean) stage1_args=clean ;; *) # yuck... Is there a prettier way to append to array? @@ -147,6 +148,8 @@ do vars[image]=tests;; --append-manifest) vars[append_manifest]="true";; + --create-disk) + vars[create_disk]="true";; esac done @@ -261,26 +264,46 @@ if [ "$export" != "none" ]; then exit 0 fi -case $fs_type in -zfs) - cp loader.img bare.raw - zfs_size=$(($fs_size - $kernel_end)) - "$SRC"/scripts/imgedit.py setpartition "-f raw bare.raw" 2 $kernel_end $zfs_size +if [[ ${vars[create_disk]} == "true" ]]; then + partition_offset=512 + bare=boot.bin + raw_disk=disk + qcow2_disk=disk + upload_kernel_mode="-k" +else + partition_offset=$kernel_end + bare=loader.img + raw_disk=bare + qcow2_disk=usr +fi + +create_zfs_disk() { + cp $bare $raw_disk.raw + "$SRC"/scripts/imgedit.py setpartition "-f raw ${raw_disk}.raw" 2 $partition_offset $partition_size + qemu-img convert -f raw -O qcow2 $raw_disk.raw $qcow2_disk.img + qemu-img resize $qcow2_disk.img ${image_size}b >/dev/null 2>&1 + "$SRC"/scripts/upload_manifest.py -o $qcow2_disk.img -m usr.manifest -D libgcc_s_dir="$libgcc_s_dir" $upload_kernel_mode +} - qemu-img convert -f raw -O qcow2 bare.raw usr.img - qemu-img resize usr.img ${fs_size}b >/dev/null 2>&1 +create_rofs_disk() { + cp $bare $raw_disk.raw + "$SRC"/scripts/imgedit.py setpartition "-f raw ${raw_disk}.raw" 2 $partition_offset $partition_size + qemu-img resize ${raw_disk}.raw ${image_size}b >/dev/null 2>&1 + dd if=rofs.img of=${raw_disk}.raw obs=$partition_offset seek=1 >/dev/null 2>&1 + qemu-img convert -f raw -O qcow2 $raw_disk.raw $qcow2_disk.img +} - "$SRC"/scripts/upload_manifest.py -o usr.img -m usr.manifest -D libgcc_s_dir="$libgcc_s_dir" ;; +case $fs_type in +zfs) + partition_size=$((fs_size - partition_offset)) + image_size=$fs_size + create_zfs_disk ;; rofs) rm -rf rofs.img "$SRC"/scripts/gen-rofs-img.py -o rofs.img -m usr.manifest -D libgcc_s_dir="$libgcc_s_dir" - rofs_size=`stat --printf %s rofs.img` - img_size=$((kernel_end + rofs_size)) - cp loader.img bare.raw - "$SRC"/scripts/imgedit.py setpartition "-f raw bare.raw" 2 $kernel_end $rofs_size - qemu-img resize bare.raw ${img_size}b >/dev/null 2>&1 - dd if=rofs.img of=bare.raw obs=${kernel_end} seek=1 >/dev/null 2>&1 - qemu-img convert -f raw -O qcow2 bare.raw usr.img ;; + partition_size=`stat --printf %s rofs.img` + image_size=$((partition_offset + partition_size)) + create_rofs_disk ;; ramfs) qemu-img convert -f raw -O qcow2 loader.img usr.img ;; esac diff --git a/scripts/upload_manifest.py b/scripts/upload_manifest.py --- a/scripts/upload_manifest.py +++ b/scripts/upload_manifest.py @@ -134,6 +134,10 @@ def main(): metavar='VAR=DATA', action='callback', callback=add_var), + make_option('-k', + dest='kernel', + action='store_true', + help='run OSv in direct kernel mode') ]) (options, args) = opt.parse_args() @@ -147,7 +151,11 @@ def main(): image_path = os.path.abspath(options.output) upload_port = find_free_port() - osv = subprocess.Popen('cd ../..; scripts/run.py --vnc none -m 512 -c1 -i "%s" --block-device-cache unsafe -s -e "--norandom --nomount --noinit /tools/mkfs.so; /tools/cpiod.so --prefix /zfs/zfs/; /zfs.so set compression=off osv" --forward tcp:127.0.0.1:%s-:10000' % (image_path,upload_port), shell=True, stdout=subprocess.PIPE) + if options.kernel: + kernel_mode_flag = '-k --kernel-path build/release/loader-stripped.elf' + else: + kernel_mode_flag = '' + osv = subprocess.Popen('cd ../..; scripts/run.py %s --vnc none -m 512 -c1 -i "%s" --block-device-cache unsafe -s -e "--norandom --nomount --noinit /tools/mkfs.so; /tools/cpiod.so --prefix /zfs/zfs/; /zfs.so set compression=off osv" --forward tcp:127.0.0.1:%s-:10000' % (kernel_mode_flag,image_path,upload_port), shell=True, stdout=subprocess.PIPE) upload(osv, manifest, depends, upload_port) -- You received this message because you are subscribed to the Google Groups "OSv Development" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion on the web visit https://groups.google.com/d/msgid/osv-dev/0000000000000148b505a35a7dc3%40google.com.
