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.

Reply via email to