|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Minios-devel] [UNIKRAFT PATCH] doc: Update documentation to consolidate information in single place
Hi Sharan,
Please see comments inline.
-- Felipe
On 04.11.19, 14:26, "Minios-devel on behalf of Sharan Santhanam"
<minios-devel-bounces@xxxxxxxxxxxxxxxxxxxx on behalf of
sharan.santhanam@xxxxxxxxx> wrote:
Hello Felipe,
Please find the comment inline:
The patch does not apply cleanly. I got these error when try to apply
the patch.
git apply --ignore-whitespace 1031.patch
1031.patch:264: trailing whitespace.
1031.patch:370: trailing whitespace.
for parsing the trace buffer.
1031.patch:484: trailing whitespace.
1031.patch:593: trailing whitespace.
1031.patch:609: trailing whitespace.
* `Mailing list subscription
<https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel>`_
error: patch failed: doc/guides/users.rst:1
error: doc/guides/users.rst: patch does not apply
Ok, I'll try to see what the issue is.
On 11/4/19 12:14 PM, Felipe Huici wrote:
> We update all pages of the documentationa and include additional
> content such as a tutorial and links to Unikraft resources. This is
> part of an effort to consolidate all such information, which is now
> spread across a set of sites, in a single location: this guide, which
> should be available at docs.unikraft.org .
>
> Signed-off-by: Felipe Huici <felipe.huici@xxxxxxxxx>
> ---
> README.md | 15 +-
> doc/guides/_static | 0
> doc/guides/conf.py | 6 +-
> doc/guides/contribute.rst | 15 +-
> doc/guides/developers-app.rst | 8 +-
> doc/guides/developers-debugging.rst | 77 ++++---
> doc/guides/developers-external-plat.rst | 4 +-
> doc/guides/intro.rst | 14 +-
> doc/guides/users-downloads.rst | 5 +
> doc/guides/users-gettingstarted.rst | 133 +++++++++++
> doc/guides/users-resources.rst | 8 +
> doc/guides/users-tutorial.rst | 285 ++++++++++++++++++++++++
> doc/guides/users.rst | 112 +---------
> 13 files changed, 521 insertions(+), 161 deletions(-)
> create mode 100644 doc/guides/_static
> create mode 100644 doc/guides/users-downloads.rst
> create mode 100644 doc/guides/users-gettingstarted.rst
> create mode 100644 doc/guides/users-resources.rst
> create mode 100644 doc/guides/users-tutorial.rst
>
> diff --git a/README.md b/README.md
> index 328f001f..8e39259a 100644
> --- a/README.md
> +++ b/README.md
> @@ -31,21 +31,20 @@ time-consuming, expert work that is required today to
build such
> images.
>
> For more information information about Unikraft, including user and
> -developer guides, please refer to the `docs/guides` directory.
> +developer guides, please refer to the `docs/guides` directory or point
> +your browser to the Unikraft
> +[documentation](http://docs.unikraft.org/)
>
> -Open Projects
> +Contributing
> -----------------
>
> If you're interested in contributing please take a look at the list of
> [open projects](https://github.com/unikraft/unikraft/issues). If one
> -of these interests you please drop us a line via the mailing list (see
> -below).
> +of these interests you please drop us a line via the mailing list or
> +directly at unikraft@xxxxxxxxxxxxxxxxxx .
>
> Further Resources
> -----------------
> -* [Sources at
Xenbits](http://xenbits.xen.org/gitweb/?a=project_list;pf=unikraft)
> -* [Project Wiki](https://wiki.xenproject.org/wiki/Category:Unikraft)
> -* [Unikraft
Team](https://www.xenproject.org/developers/teams/unikraft.html)
> +* [Unikraft Core
Team](https://www.xenproject.org/developers/teams/unikraft.html)
> * [Mailing List
Archive](https://lists.xenproject.org/archives/html/minios-devel)
We could point to patch work also for the patch set and discussion.
Yes, it should be on there, I'll add it.
> * [Mailing List
Subscription](mailto:minios-devel-request@xxxxxxxxxxxxxxxxxxxx)
> -* [Research Project at NEC Labs
Europe](http://sysml.neclab.eu/projects/unikraft/)
> diff --git a/doc/guides/_static b/doc/guides/_static
> new file mode 100644
> index 00000000..e69de29b
> diff --git a/doc/guides/conf.py b/doc/guides/conf.py
> index 5f7259e8..55eeb7be 100644
> --- a/doc/guides/conf.py
> +++ b/doc/guides/conf.py
> @@ -49,8 +49,8 @@ master_doc = 'index'
>
> # General information about the project.
> project = u'Unikraft'
> -copyright = u'2017, NEC Europe Ltd.'
> -author = u'Simon Kuenzer, Felipe Huici, Florian Schmidt'
> +copyright = u'2019, NEC Laboratories Europe GmbH'
> +author = u'Simon Kuenzer, Felipe Huici'
>
> # The version info for the project you're documenting, acts as
replacement for
> # |version| and |release|, also used in various other places throughout
the
> @@ -226,7 +226,7 @@ latex_elements = {
> # author, documentclass [howto, manual, or own class]).
> latex_documents = [
> (master_doc, 'Unikraft.tex', u'Unikraft Documentation',
> - u'Simon Kuenzer, Felipe Huici, Florian Schmidt', 'manual'),
> + u'Simon Kuenzer, Felipe Huici', 'manual'),
> ]
>
> # The name of an image file (relative to this directory) to place at
the top of
> diff --git a/doc/guides/contribute.rst b/doc/guides/contribute.rst
> index 10aefd1f..c292d78b 100644
> --- a/doc/guides/contribute.rst
> +++ b/doc/guides/contribute.rst
> @@ -2,9 +2,12 @@
> Contribute to Unikraft
> ****************************
>
> -If you would like to get ideas regarding possible contributions to
Unikraft,
> -we (normally) keep an up-to-date list on the project's wiki (see
> -``README.md`` for the URL). Please browse through it and don't
> -hesitate to contact us regarding any questions you may have.
> -Also have a look to the project's ``CONTRIBUTING.md`` and
``MAINTAINERS.md``
> -file.
> +If you would like to get ideas regarding possible contributions to
> +Unikraft, we (normally) keep an up-to-date list of open projects,
> +enhancements and bugs on the project's github main repo:
> +https://github.com/unikraft/unikraft/issues . Please browse through
> +it and don't hesitate to contact us regarding any questions you may
> +have at unikraft@xxxxxxxxxxxxxxxxxx .
> +
> +Also have a look to the project's ``CONTRIBUTING.md`` and
> +``MAINTAINERS.md`` file.
The CONTRIBUTING.md and MAINTAINERS.md are useful to check before
submitting a patch series.
It is better to put in separate section and not combine with the list of
issues.
Ok, though I think it should probably still be under the header of " Contribute
to Unikraft", either as sub-sections or I can at least begin by pointing out
CONTRIBUTING.md and only afterwards mentioning issues/open projects.
> diff --git a/doc/guides/developers-app.rst b/doc/guides/developers-app.rst
> index c9e4a6eb..d288bb61 100644
> --- a/doc/guides/developers-app.rst
> +++ b/doc/guides/developers-app.rst
> @@ -1,6 +1,6 @@
> -****************************
> +************************************
> Application Development and Porting
> -****************************
> +************************************
> Porting an application to Unikraft should be for the most part
> relatively painless given that the available Unikraft libraries
> provide all of the application's dependencies. In most cases, the
> @@ -400,7 +400,7 @@ charp C strings.
> ======== ========================
>
> Register a library parameter with Unikraft
> ------------------------------------------
> +--------------------------------------------
> In order for a library to configure options at execution time, it needs
> to select the `uklibparam` library while configuring the Unikraft build.
> The library should also be registered with the `uklibparam` library
using
> @@ -459,7 +459,7 @@ helper function:
>
> .. code-block:: c
>
> - static const char \*test_string = "Hello World";
> + static const char *test_string = "Hello World";
> UK_LIB_PARAM_STR(test_string);
>
> We can override the default value using the following command:
> diff --git a/doc/guides/developers-debugging.rst
b/doc/guides/developers-debugging.rst
> index ae5a447e..40d89fc7 100644
> --- a/doc/guides/developers-debugging.rst
> +++ b/doc/guides/developers-debugging.rst
> @@ -55,11 +55,26 @@ in a paused state (`-S` parameter): ::
>
> qemu-system-x86_64 -s -S -cpu host -enable-kvm -m 128 -nodefaults
-no-acpi -display none -serial stdio -device isa-debug-exit -kernel
build/helloworld_kvm-x86_64 -append verbose
>
> -and connect gdb by using the debug image with: ::
> +Note that the `-s` parameter is shorthand for `-gdb tcp::1234`. Now
> +connect gdb by using the debug image with: ::
>
> gdb --eval-command="target remote :1234"
build/helloworld_kvm-x86_64.dbg
>
> -You can initiate qemu to start the guest's execution by typing `c`
within gdb.
> +Unless you're debugging early boot code (until ``_libkvmplat_start32``),
you'll need to set a hardware break point: ::
> +
> + hbreak [location]
> + run
> +
> +We'll now need to set the right CPU architecture: ::
> +
> + disconnect
> + set arch i386:x86-64:intel
> +
> +And reconnect: ::
> +
> + tar remote localhost:1234
> +
> +You can now run ``continue`` and debug as you would normally.
>
> For Xen the process is slightly more complicated and depends on Xen's
> gdbsx tool. First you'll need to make sure you have the tool on your
> @@ -91,8 +106,8 @@ Trace points
> ----------------------------
> Dependencies
> ----------------------------
> -The ``support/scripts/uk_trace/trace.py`` depends on python modules
> -click and tabulate. You can install them by running: ::
> +The file ``support/scripts/uk_trace/trace.py`` depends on the click
> +and tabulate Python modules; you can install them by running: ::
>
> sudo apt-get install python3-click python3-tabulate
>
> @@ -106,29 +121,29 @@ Or, you can install trace.py into a local virtual
environment: ::
> deactivate
> cd -
>
> -All the dependencies will be installed in the 'env' folder, not to
> +All the dependencies will be installed in the 'env' folder, not
> your machine. You do not have to enter your virtual environment, you
> can call the installed script directly: ::
>
> env/bin/uk-trace --help
>
> -Because of ``--editable`` flag, any modifications made to
> +Because of the ``--editable`` flag, any modifications made to
> ``support/scripts/uk_trace/trace.py`` will be reflected in the
> installed file.
>
> ----------------------------
> -Reading tracepoints
> +Reading Tracepoints
> ----------------------------
>
> Tracepoints are provided by ``libukdebug``. To make Unikraft collect
> -tracing data enable the option ``CONFIG_LIBUKDEBUG_TRACEPOINTS`` in your
> +tracing data, enable the option ``CONFIG_LIBUKDEBUG_TRACEPOINTS`` in your
> config (via ``make menuconfig``).
>
> Because tracepoints can noticeably affect performance, selective
> -enabling is implemented. Option ``CONFIG_LIBUKDEBUG_TRACEPOINTS`` just
> -enables the functionality, but all the tracepoints are compiled into
> -nothing by default (have no effect). If you would like one library to
> -collect tracing data, add to it's Makefile.uk
> +enabling is implemented. The ``CONFIG_LIBUKDEBUG_TRACEPOINTS`` option
> +just enables the functionality, but all the tracepoints are compiled
> +into nothing by default (i.e., they have no effect). If you would like
> +a library to collect tracing data, add the following to its Makefile.uk:
::
>
> .. code-block:: make
>
> @@ -140,41 +155,41 @@ If you need just the information about tracepoints
in one file, define
> If you wish to enable **ALL** existing tracepoints, enable
> ``CONFIG_LIBUKDEBUG_ALL_TRACEPOINTS`` in menuconfig.
>
> -When tracing is enabled, unikraft will write samples into internal
> -trace buffer. Currently it is not a circular buffer, as soon as it
> -overflows, unikraft will stop collecting data.
> +When tracing is enabled, Unikraft will write samples into an internal
> +trace buffer. Currently this is not a circular buffer, so as soon as
> +it overflows, Unikraft will stop collecting data.
>
> To read the collected data you have 2 options:
>
> -1. Inside gdb
> +1. Use gdb
>
> -2. Using trace.py
> +2. Use trace.py
>
> For the first option, you need the 'uk-gdb.py' helper loaded into the
> -gdb session. To make this happen all you need to do is to add the
> +gdb session. To make this happen all you need to do is add the
> following line into ~/.gdbinit: ::
>
> add-auto-load-safe-path /path/to/your/build/directory
>
> -With this, gdb will load helper automatically, each time you start gdb
> -with a *.dbg image. For example ::
> +With this, gdb will load the helper automatically each time you start gdb
> +with a \*.dbg image. For example ::
>
> gdb helloworld/build/helloworld_kvm-x86_64.dbg
>
> -Now you can print tracing log by issuing command ``uk
> +Now you can print the tracing log by issuing the command ``uk
> trace``. Alternatively, you can save all trace data into a binary file
> with ``uk trace save <filename>``. This tracefile can be processed
> later offline using the trace.py script: ::
>
> support/scripts/uk_trace/trace.py list <filename>
>
> -Which brings us to the second option. Trace.py can run gdb and fetch
> +Which brings us to the second option: trace.py can run gdb and fetch
> the tracefile for you. Just run: ::
>
> support/scripts/uk_trace/trace.py fetch <your_unikraft_image>.dbg
>
> -.. note:: The *.dbg image is required, as it have offline data needed
> - for parsing the trace buffer.
> +.. note:: The \*.dbg image is required, as it have offline data needed
> + for parsing the trace buffer.
>
> ----------------------------
> Adding your tracepoints
> @@ -193,13 +208,13 @@ Bellow is a snippet for using tracepoints:
> return 0;
> }
>
> -Macro ``UK_TRACEPOINT(trace_name, fmt, type1, type2, ... typeN)``
> -generates a static function `trace_name()`, accepting N parameters, of
> -types **type1**, **type2** and so on. Up to 7 parameters supported. The
> +The macro ``UK_TRACEPOINT(trace_name, fmt, type1, type2, ... typeN)``
> +generates a static function `trace_name()`, accepting N parameters of
> +types **type1**, **type2** and so on. Up to 7 parameters are supported.
The
> **fmt** is a printf-style format which will be used to form a message
> corresponding to the trace sample.
>
> -The **fmt** is static and stored offline. Only parameters values are
> +The **fmt** is static and stored offline. Only parameter values are
> saved on the trace buffer. It is the job of the offline parser to
> match them together and print out resulting messages.
>
> @@ -210,13 +225,13 @@ place in your code.
> ----------------------------
> Troubleshooting
> ----------------------------
> -If you are getting a message::
> +If you are getting the message::
>
> Error getting the trace buffer. Is tracing enabled?
>
> This might be because:
>
> -1. Because you indeed need to enable tracing
> +1. You indeed need to enable tracing.
>
> 2. Not a single tracepoint has been called, and dead-code elimination
> - removed (rightfully) the tracing functionality
> + removed (rightfully) the tracing functionality.
> diff --git a/doc/guides/developers-external-plat.rst
b/doc/guides/developers-external-plat.rst
> index 7021ab28..ac4f5368 100644
> --- a/doc/guides/developers-external-plat.rst
> +++ b/doc/guides/developers-external-plat.rst
> @@ -1,6 +1,6 @@
> -****************************
> +******************************
> External Platform Development
> -****************************
> +******************************
> External platform development is exactly like developing an internal
> platform, so please refer to that section of the developer's
> guide. The only exceptions are that points 5, 7, and 8 in that guide do
not
> diff --git a/doc/guides/intro.rst b/doc/guides/intro.rst
> index 19101934..8dcad4ab 100644
> --- a/doc/guides/intro.rst
> +++ b/doc/guides/intro.rst
> @@ -27,13 +27,13 @@ Unikraft, you get support for these platforms and
architectures for
> ***********************
> Unikraft Libraries
> ***********************
> -Unikraft libraries are grouped into two large groups: core libraries,
> -and external libraries. Core libraries generally provide functionality
> -typically found in operating systems. Such libraries are grouped into
> -categories such as memory allocators, schedulers, filesystems, network
> -stacks and drivers, among others. Core libraries are part of the main
> -Unikraft repo which also contains the build tool and configuration
> -menu.
> +Unikraft libraries are grouped into two large groups: core (or
> +internal) libraries, and external libraries. Core libraries generally
> +provide functionality typically found in operating systems. Such
> +libraries are grouped into categories such as memory allocators,
> +schedulers, filesystems, network stacks and drivers, among
> +others. Core libraries are part of the main Unikraft repo which also
> +contains the build tool and configuration menu.
>
> External libraries consist of existing code not specifically meant for
> Unikraft. This includes standard libraries such as libc or openssl, but
> diff --git a/doc/guides/users-downloads.rst
b/doc/guides/users-downloads.rst
> new file mode 100644
> index 00000000..901598fd
> --- /dev/null
> +++ b/doc/guides/users-downloads.rst
> @@ -0,0 +1,5 @@
> +************************************
> +Downloads
> +************************************
> +All the Unikraft repos and sources can be found on `Github
> +<https://github.com/unikraft>`_
> diff --git a/doc/guides/users-gettingstarted.rst
b/doc/guides/users-gettingstarted.rst
> new file mode 100644
> index 00000000..c8830e90
> --- /dev/null
> +++ b/doc/guides/users-gettingstarted.rst
> @@ -0,0 +1,133 @@
> +.. _rst_users_getting_started:
> +
> +************************************
> +Getting Started
> +************************************
> +
> +To begin using Unikraft you'll need a few packages. On Ubuntu/Debian
> +distributions run the command ::
> +
> + apt-get install bison flex build-essential python3 libncurses5-dev
libncursesw5
> +
> +Optionally, if you want to use the Python front-end to Unikraft's
> +menu, please also run ::
> +
> + apt-get install gtk+-2.0 gmodule-2.0 libglade-2.0
> +
> +With this in place, we are ready to begin cloning Unikraft
> +repos. First, start by cloning the main Unikraft repo: ::
> +
> + git clone https://github.com/unikraft/unikraft.git
> +
> +If you are thinking of using Unikraft external libraries, this would
> +be the time to clone those too. You can see a list of available
> +libraries at (any repo whose name has a ``lib-`` prefix): ::
> +
> + https://github.com/unikraft
> +
> +As you can see, Each external library has its own separate repo, so
> +you'll need to clone each one separately. Likewise, if you are
> +planning on using any external platforms, please clone those too. You
> +can see a list of available external platforms at the same link as for
> +the libraries; the platform repos have a ``plat-`` prefix.
> +
> +Finally, you'll need to create a Unikraft application. To quickly get
> +started, the easiest is to clone the hello world app (once again, each
> +Unikraft app has its own repo, this time with a ``app-`` prefix): ::
> +
> + git clone https://github.com/unikraft/app-helloworld.git
> +
> +Now edit the Makefile in the app directory. In particular, set the
> +``UK_ROOT``, ``UK_LIBS``, and ``UK_PLATS`` variables to point to the
> +directories where you cloned the repos above. For instance, assuming
> +the following directory structure ::
> +
> + ├── unikraft
> + ├── apps
> + │ ├── helloworld
> + │ ├── app1
> + │ ├── app2
> + │ ...
> + │ ├── appN
> + ├── libs
> + │ ├── lib1
> + │ ├── lib2
> + │ ...
> + │ └── libN
> + └── plats
> + ├── plat1
> + ├── plat2
> + ...
> + └── platN
> +
> +where your app is located at ``apps/helloworld``, you would set
> +the variables as follows: ::
> +
> + UK_ROOT ?= $(PWD)/../../unikraft
> + UK_LIBS ?= $(PWD)/../../libs
> + UK_PLATS ?= $(PWD)/../../plats
> +
> +If your app uses external libraries, set the ``LIBS`` variable to
> +reflect this. For instance : ::
> +
> + LIBS := $(UK_LIBS)/lib1:$(UK_LIBS)/lib2:$(UK_LIBS)/libN
> +
> +Note that the list has to be colon-separated.
> +
> +Finally, if your app uses external platforms, set the ``PLATS``
> +variable: ::
> +
> + PLATS ?= $(UK_PLATS)/plat1:$(UK_PLATS)/plat2:$(UK_PLATS)/platN
> +
> +Also make sure that you hand-over these platforms with the
> +``P=`` parameter to the sub make call in your main ``Makefile``: ::
> +
> + @make -C $(UK_ROOT) A=$(PWD) L=$(LIBS) P=$(PLATS)
Since we have a broken dependency in the fetch prepare. Wouldn't it make
it sense to add them as separate the stages in Makefile.
@make -C $(UK_ROOT) A=$(PWD) L=$(LIBS) P=$(PLATS) fetch
@make -C $(UK_ROOT) A=$(PWD) L=$(LIBS) P=$(PLATS) prepare
Yeah, might be better to document it this way until we fix the issue.
> +
> +With all of this in place, we're now ready to start configuring the
> +application image via Unikraft's menu. To access it, from within the
> +app's directory simply type ::
> +
> + make menuconfig
> +
> +The menu system is fairly self-explanatory and will be familiar to
> +anyone who has configured a Linux kernel before. Select the options
> +you want, the libraries you'll like to include and don't forget to
> +select at least one platform (e.g., an external one, KVM, Xen, or
> +Linux user-space -- the latter is quite useful for quick testing and
> +debugging).
> +
> +Finally, quit the menu while saving the configuration changes you've
> +made and build your application by just typing ``make``. Unikraft will
> +then build each library in turn as well as the source files for your
> +application, producing one image in the ``./build`` directory for each
> +platform type you selected.
> +
> +Running the image will depend on which platform you targeted. For
> +Linux user-space, for instance, the image is just a standard ELF, so
> +you can simply run it with ::
> +
> + ./build/helloworld_linuxu-x86_64
> +
> +For KVM, the following QEMU line should do the trick: ::
> +
> + qemu-system-x86_64 -s -S -cpu host -enable-kvm -m 128 -nodefaults
-no-acpi -display none -serial stdio -device isa-debug-exit -kernel
build/helloworld_kvm-x86_64
Why are we including -s -S
That's a copy and paste error, I'll remove that.
> +
> +For Xen, create a ``helloworld.xen`` file as follows::
> +
> + kernel = "path_to_build_dir/build/helloworld_xen-x86_64"
> + memory = "8"
> + vcpus = "1"
> + name = "helloworld"
> +
> + on_poweroff = "preserve"
> + on_crash = "preserve"
> + on_reboot = "preserve"
> +
> +and instantiate the Xen virtual machine with: ::
> +
> + xl create -c helloworld.xen
> +
> +That's it! For more information regarding porting and developing
> +apps (and libraries and platforms) in Unikraft please read the
> +developer's guide.
> diff --git a/doc/guides/users-resources.rst
b/doc/guides/users-resources.rst
> new file mode 100644
> index 00000000..51f8048a
> --- /dev/null
> +++ b/doc/guides/users-resources.rst
> @@ -0,0 +1,8 @@
> +************************************
> +Additional Resources
> +************************************
> +Below is a short list of additional resources related to Unikraft:
> +
> + * `Unikraft team
<https://www.xenproject.org/developers/teams/unikraft/>`_
> + * `Mailing list subscription
<https://lists.xenproject.org/cgi-bin/mailman/listinfo/minios-devel>`_
> + * `Mailing list archives
<https://lists.xenproject.org/archives/html/minios-devel/>`_
> diff --git a/doc/guides/users-tutorial.rst b/doc/guides/users-tutorial.rst
> new file mode 100644
> index 00000000..98f944c5
> --- /dev/null
> +++ b/doc/guides/users-tutorial.rst
> @@ -0,0 +1,285 @@
> +************************************
> +Tutorial
> +************************************
> +
> +For this tutorial you will need a Linux host running Xen and/or KVM in
> +order to run Unikraft images. Please check the manual of your Linux
> +distribution regarding how to install these environments. This
> +tutorial expects that you have the essential build and debugging tools
> +installed (see :ref:`rst_users_getting_started`). In addition, for
> +Xen you will need to have the ``xl`` toolstack installed and running,
> +and for KVM ``qemu``
> +
> +===========================
> +Cloning Repositories
> +===========================
> +You can easily build Unikraft Unikernels on your Linux host. If you
> +have all tools and libraries installed to compile a Linux kernel you
> +are ready to do this with Unikraft too.
> +
> +A Unikraft build consists mostly of a combination of multiple
> +repositories. We differentiate them into: (1) Unikraft, (2) external
> +libraries, (3) application. The build system assumes these to be
> +structured as follows: ::
> +
> + my-workspace/
> + ├── apps/
> + │ └── helloworld/
> + │ └── httpreply/
> + ├── libs/
> + │ ├── lwip/
> + │ └── newlib/
> + └── unikraft/
> +
> +Clone the following repositories with git ::
> +
> + git clone [URL] [DESTINATION PATH]
> +
> +* Unikraft base repository directly under your workspace root
> + * `Unikraft repo <https://github.com/unikraft/unikraft.git>`_
> +* External libraries into a `libs` subdirectory:
> + * `newlib repo <https://github.com/unikraft/lib-newlib.git>`_
> + * `lwip repo <https://github.com/unikraft/lib-lwip.git>`_
> +* Applications into an `apps` subdirectory:
> + * `helloworld repo <https://github.com/unikraft/app-helloworld.git>`_
> + * `httpreply repo <https://github.com/unikraft/app-httpreply.git>`_
> +
> +Make sure that the directory structure under your workspace is exactly
> +the same as shown in the overview ahead.
> +
> +===========================
> +Your First Unikernel
> +===========================
> +
> +-------------------
> +Configuring
> +-------------------
> +After you cloned the repos, go to the ``helloworld`` application and
> +run ``make menuconfig`` to configure the build. Unikraft uses the same
> +configuration system as the Linux kernel (Kconfig). We will build
> +Unikraft images for Xen, KVM, and Linux, so the first step is to go to
> +the ``Platform Configuration`` option and make the following changes:
> +
> +* select ``Xen guest image``
> +* select ``KVM guest``
> +* select ``Linux user space``
> +
> +Under ``Library configuration`` we also need to choose a scheduler:
> +select ``ukschedcoop``.
> +
> +-------------------
> +Building
> +-------------------
> +Save your configuration and build the image by typing ``make``. The
> +build system will create three binaries, one for each platform: ::
> +
> + $ ls -sh build/
> + [...]
> + 88K helloworld_kvm-x86_64
> + 40K helloworld_linuxu-x86_64
> + 72K helloworld_xen-x86_64
> + [...]
> +
> +-------------------
> +Running
> +-------------------
> +
> +Let's execute the unikernel.
> +
> +* The easiest is to run the one built as a Linux user space
> + application. It should execute on any Linux environment: ::
> +
> + $ ./build/helloworld_linuxu-x86_64
> + Welcome to _ __ _____
> + __ _____ (_) /__ _______ _/ _/ /_
> + / // / _ \/ / '_// __/ _ `/ _/ __/
> + \_,_/_//_/_/_/\_\/_/ \_,_/_/ \__/
> + Titan 0.2~10ce3f2
> + Hello world!
> +
> +* You can execute the KVM image (``helloworld_kvm-x86_64``) on the KVM
> + host: ::
> +
> + $ qemu-system-x86_64 -nographic -vga none -device sga -m 4 -kernel
> + build/helloworld_kvm-x86_64
> +
> +* For Xen you first need to create a VM configuration (save it under
> + ``helloworld.cfg``): ::
> +
> + name = 'helloworld'
> + vcpus = '1'
> + memory = '4'
> + kernel = 'build/helloworld_xen-x86_64'
> +
> +Start the virtual machine with: ::
> +
> + $ xl create -c helloworld.cfg
> +
> +---------------------------------
> +Modifying the Application
> +---------------------------------
> +After ``Hello world!`` is printed, the unikernel shuts down right
> +away. We do not have a chance to see that a VM was actually created,
> +so let's modify the source code. Open ``main.c`` in your favorite
> +editor (``nano``, ``vim``, ``emacs``) and add the following busy loop
> +inside the ``main`` function:
> +
> +.. code-block:: c
> +
> + for (;;);
> +
> +Rebuild the images with ``make`` and execute them. The shell prompt
> +should not return. With a second shell you can check that the
> +unikernel is still executing:
> +
> +* Use ``top`` or ``htop`` for Linux and KVM.
> +* Use ``xl top`` in Xen.
> +
> +**Note**: You can terminate the KVM and Linux unikernel with
> + ``CTRL`` + ``C``, and on Xen with ``CTRL`` + ``]``.
> +
> +
> +===========================
> +External Libraries
> +===========================
> +
> +The ``helloworld`` application uses a very minimalistic ``libc``
> +implementation of libc functionality called ``nolibc`` which is part
> +of the Unikraft base, and so it is an "internal" library. Internal
> +libraries are located within the ``lib`` directory of Unikraft.
> +
> +In order to enhance the functionality provided by Unikraft, "external"
> +libraries can be added to the build. In the following we want to swap
> +``nolibc`` with `newlib <http://www.sourceware.org/newlib/>`_, a
Instead of the newlib origin repo shouldn't we point to github.
> +standard libc implementation that you can find in various Linux
> +distributions and embedded environments.
> +
> +We need to add newlib to the library includes. Edit the ``Makefile``
> +of the ``helloworld`` application and put the text below in it. Please
> +type ``make properclean`` before; this will delete the build directory
> +(but not your configuration) and will force a full rebuild later. ::
> +
> + diff --git a/Makefile b/Makefile
> + --- a/Makefile
> + +++ b/Makefile
> + @@ -1,6 +1,6 @@
> + UK_ROOT ?= $(PWD)/../../unikraft
> + UK_LIBS ?= $(PWD)/../../libs
> + -LIBS :=
> + +LIBS := $(UK_LIBS)/newlib
> +
> + all:
> + @make -C $(UK_ROOT) A=$(PWD) L=$(LIBS)
> +
> +Run ``make menuconfig``; ``newlib`` should now appear in the ``Library
> +Configuration`` menu. Select it, save and exit the menu, and type
> +``make``. Unikraft's build system will download newlib's sources and
> +build it together with all the other Unikraft libraries and
> +application. Our ``newlib`` repository consists only of glue code that
> +is needed to port ``newlib`` to Unikraft.
> +
> +You will notice that the unikernels are now bigger than before. Try to
> +run them again.
> +
> +
> +=========================
> +Code Your Own Library
> +=========================
> +Let's add some functionality to our unikernel. Create a directory
> +``libs/mylib``, this will be the root folder of your library.
> +
> +As mentioned earlier, Unikraft uses Linux's kconfig system. In order
> +to make your library selectable in the "menuconfig", create the file
> +``Config.uk`` with the following content: ::
> +
> + config LIBMYLIB
> + bool "mylib: My awesome lib"
> + default n
> +
> +To test if it worked, we need to tell Unikraft's build system to pick
> +this library. Go back to your ``helloworld`` application and edit it
> +its ``Makefile``. Earlier we added newlib to the ``LIBS`` variable,
> +let's now add the new library: ::
> +
> + LIBS := $(UK_LIBS)/newlib:$(UK_LIBS)/mylib
> +
> +Now if you run ``make menuconfig`` you should see your library under
> +the "Library Configuration" sub-menu: ::
> +
> + [ ] mylib: My awesome lib
> +
> +Select it, exit the configuration menu, and save the changes. If you
> +run ``make`` right now, the build will produce an error about a
> +missing ``Makefile.uk``: ::
> +
> + make[1]: *** No rule to make target
'/root/demo/libs/mylib/Makefile.uk'. Stop.
> +
> +Go back to your library directory and create one with the following
> +content: ::
> +
> + # Register your lib to Unikraft's build system
> + $(eval $(call addlib_s,libmylib,$(CONFIG_LIBMYLIB)))
> +
> + # Add library source code to compilation
> + LIBMYLIB_SRCS-y += $(LIBMYLIB_BASE)/mylib.c
> +
> + # Extend the global include paths with library's folder
> + CINCLUDES-$(CONFIG_LIBMYLIB) += -I$(LIBMYLIB_BASE)/include
> +
> +And finally the library code ``mylib.c``:
> +
> +.. code-block:: c
> +
> + #include <stdio.h>
> +
> + void libmylib_api_func(void)
> + {
> + printf("Hello from my awesome lib!\n");
> + }
> +
> +Now in your helloworld's ``main.c`` add a call to
> +``libmylib_api_func()``.
> +
> +
> +=========================
> +Socket Example
> +=========================
> +As a last task, we are going to build a small webserver that replies
> +with a single page. The server uses ``lwip`` for creating a socket and
> +to accept incoming connections. Go to the ``httpreply`` application
> +directory. Have a look at ``main.c``: it is a really short program and
> +looks similar to what you would write as a user-space Linux
> +program. Its dependencies are defined within ``Config.uk``. Having
> +this, there is actually not much left to configure. Any mandatory
> +options are locked in ``make menuconfig``. All we need to do is select
> +our target platforms, select network drivers, save the config, and
> +type ``make``.
> +
> +For now, we support virtio for networking only (but more functionality
> +is coming). You can enable the driver by going to the KVM platform
> +configuration and selecting ``Virtio PCI device support`` and ``Virtio
> +Net device``.
> +
> +The image can be started on the KVM host. Replace ``virbr0`` with the
> +name of your local bridge on your system and make sure you have a DHCP
Shouldn't we explicitly ask them to enable dhcp client option within
lwip as it not the default option?
> +server listening there (e.g., ``dnsmasq``): ::
> +
> + $ qemu-system-x86_64 -nographic -vga none -device sga -m 8 -netdev
bridge,id=en0,br=br0 -device virtio-net-pci,netdev=en0 -kernel
build/httpreply_kvm-x86_64
s/br0/virbr0
> +
> +This unikernel is requesting an IPv4 address via DHCP. In case you
> +enabled ``ICMP`` in the ``lwip`` configuration, you should also be
> +able to ping the host from a second terminal (replace the IP with
> +yours): ::
> +
> + $ ping 192.168.1.100
> +
> +For debugging, you can also try to enable ``Debug messages`` in
> +``lwip``. With this you can now have a deeper look in the network
> +stack.
> +
> +If networking is working well, you can use the text-based browser
> +``lynx`` (or any other that you like) to see the web page served on a
> +second terminal (replace the IP with yours): ::
> +
> + $ lynx 192.168.1.100:8123
> +
> diff --git a/doc/guides/users.rst b/doc/guides/users.rst
> index 3c55653d..0500b8fa 100644
> --- a/doc/guides/users.rst
> +++ b/doc/guides/users.rst
> @@ -1,103 +1,15 @@
> ####################
> User's Guide
> ####################
> -To begin using Unikraft you'll need to have gcc, make and git
> -installed. First clone the Unikraft main repo: ::
> -
> - git clone http://xenbits.xen.org/git-http/unikraft/unikraft.git
> -
> -If you'll be using Unikraft external libraries, this would be the time
> -to clone those too. You can see a list of available libraries at
> -http://xenbits.xen.org/gitweb/?a=project_list;pf=unikraft/libs .
> -Each external library has its own separate repo, so you'll need to clone
each
> -one separately.
> -
> -Likewise, if you will be using any external platforms, please clone
those too.
> -You can see a list of available external platforms at
> -http://xenbits.xen.org/gitweb/?a=project_list;pf=unikraft/plats .
> -
> -Finally, you'll need to create a Unikraft application. To get quickly
> -started, the easiest is to clone the hello world app (once again, each
> -Unikraft app has its own repo): ::
> -
> - git clone http://xenbits.xen.org/git-http/unikraft/apps/helloworld.git
> -
> -Now edit the Makefile in the app directory. In particular, set the
> -``UK_ROOT``, ``UK_LIBS``, and ``UK_PLATS`` variables to point to the
> -directories where you cloned the repos above. For instance, assuming
> -the following directory structure ::
> -
> - ├── unikraft
> - ├── apps
> - │ ├── helloworld
> - │ ├── app1
> - │ ├── app2
> - │ ...
> - │ ├── appN
> - ├── libs
> - │ ├── lib1
> - │ ├── lib2
> - │ ...
> - │ └── libN
> - └── plats
> - ├── plat1
> - ├── plat2
> - ...
> - └── platN
> -
> -where your app is located at ``apps/helloworld``, you would set
> -the variables as follows: ::
> -
> - UK_ROOT ?= $(PWD)/../../unikraft
> - UK_LIBS ?= $(PWD)/../../libs
> - UK_PLATS ?= $(PWD)/../../plats
> -
> -If your app will be using external libraries, set the ``LIBS``
> -variable to reflect this. For instance : ::
> -
> - LIBS := $(UK_LIBS)/lib1:$(UK_LIBS)/lib2:$(UK_LIBS)/libN
> -
> -Note that the list has to be colon-separated.
> -
> -Finally, if your app will use external platforms, set the ``PLATS``
> -variable: ::
> -
> - PLATS ?= $(UK_PLATS)/plat1:$(UK_PLATS)/plat2:$(UK_PLATS)/platN
> -
> -Also make sure that you hand-over these platforms with the
> -``P=`` parameter to the sub make call in your main ``Makefile``: ::
> -
> - @make -C $(UK_ROOT) A=$(PWD) L=$(LIBS) P=$(PLATS)
> -
> -With all of this in place, we're now ready to start configuring the
> -application image via Unikraft's menu. To access it, from within the
> -app's directory simply type ::
> -
> - make menuconfig
> -
> -The menu system is fairly self-explanatory and will be familiar to
> -anyone who has configured a Linux kernel before. Select the options
> -you want, the libraries you'll like to include and don't forget to
> -select at least one platform (e.g., an external one, KVM, Xen, or
> -Linux user-space -- the latter is quite useful for quick testing and
> -debugging).
> -
> -Finally, quit the menu while saving the configuration changes you've
> -made and build your application by just typing ``make``. Unikraft will
> -then build each library in turn as well as the source files for your
> -application, producing one image in the ``./build`` directory for each
> -platform type you selected.
> -
> -Running the image will depend on which platform you targeted. For
> -Linux user-space, for instance, the image is just a standard ELF, so
> -you can simply run it with ::
> -
> - ./build/helloworld_linuxu-x86_64
> -
> -And that's it! We'll be posting further Unikraft application repos at
> -::
> -
> - http://xenbits.xen.org/gitweb/?a=project_list;pf=unikraft/apps
> -
> -For more information regarding porting and developing apps (and
> -libraries) in Unikraft please read the developer's guide.
> +This section of the guide provides all the information you should need
> +to get started with and to use Unikraft. If you have never used
> +Unikraft before, read the getting started page and optionally run
> +through the tutorials.
> +
> +.. toctree::
> + :maxdepth: 2
> +
> + users-gettingstarted
> + users-tutorial
> + users-downloads
> + users-resources
>
> _______________________________________________
> Minios-devel mailing list
> Minios-devel@xxxxxxxxxxxxxxxxxxxx
> https://lists.xenproject.org/mailman/listinfo/minios-devel
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |