OSv, a new operating system for the cloud.
C C++ Python Java Roff Makefile Other
Latest commit 4c24250 Feb 17, 2017 @justinc1 justinc1 committed with nyh httpserver: optionaly start app in new ELF namespace
Running multiple instances of same program at the same time (or even
same program multiple times) can fail as ELF object and requied libraries
are already loaded. When program is run for the second time, global
data is not reinitialized and program can fail in unexpected way.

This can be solved by starting program in new ELF namespace, so that
the program and libraries get new copy of global data.

The commit extends REST API /app handler with optional new_program
parameter, to allow starting programs in ELF namespaces from REST too.

Indentation in app.json is also fixed.

Signed-off-by: Justin Cinkelj <justin.cinkelj@xlab.si>
Message-Id: <20170217121511.16781-1-justin.cinkelj@xlab.si>
Permalink
Failed to load latest commit information.
apps @ 3bf4a46 update apps submodule Feb 6, 2017
arch signals: proper support for sigaltstack() and SA_ONSTACK sigaction flag Feb 12, 2017
bsd bsd: xen: place __ffs() into proper header Feb 7, 2017
compiler osv: use __ASSEMBLY__ instead of ASSEMBLY Jan 24, 2017
conf build: move arch-specific configuration to conf/$(arch).mk Jun 18, 2014
core command line: report if runscript file is missing Feb 16, 2017
documentation Update devices-and-drivers.txt Sep 22, 2013
drivers osv: xen: move common code outside of arch/x64 Feb 7, 2017
external nfs: Add a makefile option to build in libnfs. Dec 20, 2015
fastlz build.mk: replace kernel base include file Sep 2, 2014
fs mount: fix deadlock Jan 16, 2017
images Remove deprecated "mgmt" submodule Jul 26, 2016
include osv: xen: move common code outside of arch/x64 Feb 7, 2017
java/jvm Move java/* to modules/java* and modularize java images build process Dec 21, 2016
libc signals: proper support for sigaltstack() and SA_ONSTACK sigaction flag Feb 12, 2017
licenses zfs: Port lz4 compression algorithm from FreeBSD May 23, 2014
modules httpserver: optionaly start app in new ELF namespace Feb 19, 2017
musl @ 372a948 Add musl git submodule Aug 4, 2014
scripts gdb: search for binary with help of usr.manifest Feb 5, 2017
static/etc mount: read initial entries from fstab May 30, 2014
tests signals: proper support for sigaltstack() and SA_ONSTACK sigaction flag Feb 12, 2017
todo Move two todo/* files to bug tracker Jun 23, 2013
tools Avoid unsized array in union Jul 23, 2016
.gitignore Move java/* to modules/java* and modularize java images build process Dec 21, 2016
.gitmodules Remove deprecated "mgmt" submodule Jul 26, 2016
CODINGSTYLE.md Add line breaks to CODINGSTYLE Jan 26, 2015
CONTRIBUTING Add "CONTRIBUTING" file Sep 15, 2013
Doxyfile doxygen: add include strip path Sep 16, 2014
LICENSE Add LICENSE files to the main project Sep 15, 2013
Makefile osv: xen: move common code outside of arch/x64 Feb 7, 2017
PORTING build.mk: enable first AArch64 stubbed support Apr 2, 2014
README.md Add `yaml-cpp' in package list for Arch Linux in README Jul 26, 2016
bootfs.S Encapsulate boot filesystem image in an object file for direct linking Dec 23, 2012
bootfs.manifest.skel mkfs.so: split mkfs.so in mkfs.so and cpiod.so. Dec 3, 2013
config.json Remove deprecated "mgmt" submodule Jul 26, 2016
dummy-shlib.cc loader: add a dummy shared library to the build Dec 23, 2012
gen-ctype-data.cc locale: fix std::toupper(), std::tolower(), and std::regex Feb 1, 2016
linux.cc syscall: save/restore FPU state on syscall Oct 31, 2016
loader.cc loader: fix page fault at /init scan Feb 9, 2017
runtime.cc Add mkfifo stub. May 23, 2016
usr.manifest.skel build: don't put unnecessary libraries in every image May 23, 2016
usr_nozfs.manifest.skel build: don't put unnecessary libraries in every image May 23, 2016

README.md

OSv

OSv is a new open-source operating system for virtual-machines. OSv was designed from the ground up to execute a single application on top of a hypervisor, resulting in superior performance and effortless management when compared to traditional operating systems which were designed for a vast range of physical machines.

OSv has new APIs for new applications, but also runs unmodified Linux applications (most of Linux's ABI is supported) and in particular can run an unmodified JVM, and applications built on top of one.

For more information about OSv, see http://osv.io/ and https://github.com/cloudius-systems/osv/wiki

Documentation

Building

OSv can only be built on a 64-bit x86 Linux distribution. Please note that this means the "x86_64" or "amd64" version, not the 32-bit "i386" version.

If you wish, you can run the script 'scripts/setup.py' as root to install all dependencies. Otherwise, you may follow the manual instructions below.

First, install prerequisite packages:

Fedora

scripts/setup.py

Debian stable(wheezy) Debian stable(wheezy) requires to compile gcc, gdb and qemu. And also need to configure bridge manually.

More details are available on wiki page: Building OSv on Debian stable

Debian testing(jessie)

apt-get install build-essential libboost-all-dev genromfs autoconf libtool openjdk-7-jdk ant qemu-utils maven libmaven-shade-plugin-java python-dpkt tcpdump gdb qemu-system-x86 gawk gnutls-bin openssl python-requests lib32stdc++-4.9-dev p11-kit

Arch Linux

pacman -S base-devel git python apache-ant maven qemu gdb boost yaml-cpp

Before start building OSv, you'll need to add your account to kvm group.

usermod -aG kvm <user name>

Ubuntu:

scripts/setup.py

You may use Oracle JDK if you don't want to pull too many dependencies for openjdk-7-jdk

To ensure functional C++11 support, Gcc 4.8 or above is required, as this was the first version to fully comply with the C++11 standard.

Make sure all git submodules are up-to-date:

git submodule update --init --recursive

Finally, build everything at once:

make

to build only the OSv kernel, or more usefully,

scripts/build

to build an image of the OSv kernel and the default application.

scripts/build creates the image build/last/usr.img in qcow2 format. To convert this image to other formats, use the scripts/convert tool, which can create an image in the vmdk, vdi, raw, or qcow2-old formats (qcow2-old is an older qcow2 format, compatible with older versions of QEMU). For example:

scripts/convert raw

By default make will use the static libraries and headers of gcc in external submodule. To change this pass host via *_env variables:

make build_env=host

This will use static libraries and headers in the system instead (make sure they are installed before run make), if you only want to use C++ static libraries in the system, just set cxx_lib_env to host:

make cxx_lib_env=host

Running OSv

./scripts/run.py

By default, this runs OSv under KVM, with 4 VCPUs and 2GB of memory, and runs the default management application containing a shell, a REST API server and a browser base dashboard (at port 8000).

If running under KVM you can terminate by hitting Ctrl+A X.

External Networking

To start osv with external networking:

sudo ./scripts/run.py -n -v

The -v is for kvm's vhost that provides better performance and its setup requires a tap and thus we use sudo.

By default OSv spawns a dhcpd that auto config the virtual nics. Static config can be done within OSv, configure networking like so:

ifconfig virtio-net0 192.168.122.100 netmask 255.255.255.0 up
route add default gw 192.168.122.1

Test networking:

test invoke TCPExternalCommunication

Running Java or C applications that already reside within the image:

# Building and running a simple java application example
$ scripts/build image=java-example
$ scripts/run.py -e "java.so -cp /java-example Hello"

# Running an ifconfig by explicit execution of ifconfig.so (compiled C++ code)
$ scripts/build
$ sudo scripts/run.py -nv -e "/tools/ifconfig.so"