---
-{{<section container="full">}}
-{{<full-width-image src="/img/photos/xen-project-2023-group-photo.png" alt="Xen Project 2023 group photo" title="Xen Project 2023 group photo">}}
+{{<section >}}
+{{<full-width-image src="/img/photos/xen-project-2023-group-photo.png" alt="Xen Project 2023 group photo" title="Xen Project 2023 group photo" class="rounded-corners">}}
{{</section>}}
{{</section>}}
{{<section md="true">}}
-### Our architecture
+## Our architecture
The MirageOS architecture can be divided into operating system libraries, typed signatures, and a metaprogramming compiler. The operating system libraries implement various functionalities, ranging from low-level network card drivers to full reimplementations of the TLS protocol, as well as the Git protocol to store versioned data. A set of typed signatures ensures that the OS libraries are consistent and work well in conjunction with each other. Most importantly, MirageOS is also a metaprogramming compiler that can input OCaml source code along with its dependencies, and a deployment target description to generate an executable unikernel, i.e., a specialised binary artefact containing only the code needed to run on the target platform. Overall, MirageOS focuses on providing a small, well-defined, typed interface with the system components of the target architecture.
{{</section>}}
{{</media-block>}}
{{</section>}}
-{{<section>}}
- {{<vertical-lists cols="1">}}
- - title: Library pools
- text: Library pools would contain libraries that the user of Unikraft can select from to create the unikernel. From the bottom up, library pools are organized into (1) the architecture library tool, containing libraries specific to a computer architecture (e.g., x86_64, ARM32 or MIPS); (2) the platform tool, where target platforms can be Xen, KVM, bare metal (i.e. no virtualization) and user-space Linux; and (3) the main library pool, containing a rich set of functionality to build the unikernel from. This last library includes drivers (both virtual such as netback/netfront and physical such as ixgbe), filesystems, memory allocators, schedulers, network stacks, standard libs (e.g. libc, openssl, etc.), runtimes (e.g. a Python interpreter, debugging and profiling tools). These pools of libraries constitute a code base for creating unikernels. As shown, a library can be relatively large (e.g libc) or quite small (a scheduler), which should allow for a fair amount of customization for the unikernel.
- - title: The Unikraft build tool
- text: The Unikraft build tool is in charge of compiling the application and the selected libraries together to create a binary for a specific platform and architecture (e.g., Xen on x86_64). The tool is currently inspired by Linux’s kconfig system and consists of a set of Makefiles. It allows users to select libraries, to configure them, and to warn users when library dependencies are not met. In addition, the tool can also simultaneously generate binaries for multiple platforms.
- {{</vertical-lists>}}
-{{</section>}}
+{{<section >}}
+{{<md class="mg-l-md">}}
+ ### Library pools
+
+ Library pools would contain libraries that the user of Unikraft can select from to create the unikernel. From the bottom up, library pools are organized into (1) the architecture library tool, containing libraries specific to a computer architecture (e.g., x86_64, ARM32 or MIPS); (2) the platform tool, where target platforms can be Xen, KVM, bare metal (i.e. no virtualization) and user-space Linux; and (3) the main library pool, containing a rich set of functionality to build the unikernel from. This last library includes drivers (both virtual such as netback/netfront and physical such as ixgbe), filesystems, memory allocators, schedulers, network stacks, standard libs (e.g. libc, openssl, etc.), runtimes (e.g. a Python interpreter, debugging and profiling tools). These pools of libraries constitute a code base for creating unikernels. As shown, a library can be relatively large (e.g libc) or quite small (a scheduler), which should allow for a fair amount of customization for the unikernel.
+{{</md>}}
+
-{{<section md="true">}}
+{{<md class="mg-t-lg mg-l-md">}}
+ ### The Unikraft build tool
+
+ The Unikraft build tool is in charge of compiling the application and the selected libraries together to create a binary for a specific platform and architecture (e.g., Xen on x86_64). The tool is currently inspired by Linux’s kconfig system and consists of a set of Makefiles. It allows users to select libraries, to configure them, and to warn users when library dependencies are not met. In addition, the tool can also simultaneously generate binaries for multiple platforms.
+{{</md>}}
+
+{{<md class="mg-t-lg">}}
As an example, imagine a user wanting to generate a network driver domain unikernel. In this case, we would assume the “application” to be the netback driver. To select this application, the user would first run “make menuconfig” from within the netback application folder. The Makefile there would set a variable to indicate what the application is, and would include the main Unikraft Makefiles so that the unikernel can be built (Step 1 in the figure). Using the menu-based system, the user chooses the relevant libraries; for a Xen driver domain, this would include a physical network driver, the netback driver, the libxenplat library and a library from the architecture library pool such as libx86_64arch (Step 2 in the figure). With this in place, the user saves the configuration and types “make” to build the unikernel (Step 3) and “xl create” to run it (Step 4).
+
A note on the ABI/API exposed to the application: because Unikraft allows for customization of the unikernels, the ABI (or API since there is no kernel) would be custom, that is, defined by the libraries the user selected. Having said that, it would be perfectly possible, for instance, to build POSIX-compliant unikernels with it (e.g. similar to Rump, but in principle with much more specialized OS layers).
Finally, it is worth pointing out that we use the term application loosely: another clear target for Unikraft is the building of runtime-specific unikernels (e.g. a unikernel able to run Python or OCaml scripts as is the case with MirageOS).
+{{</md>}}
- ## Unikraft and Minios
+{{<md class="mg-t-lg mg-l-md">}}
+ ### Unikraft and Minios
The Unikraft project also aims to concentrate the various efforts currently going on in the Xen community regarding minimalistic OSes (essentially different variants of MiniOS). We think that splitting the community across these variants is counter-productive and hope that Unikraft will provide a common place for all or most improvements and customizations of minimalistic OSes. The long-term goal is to replace something like MiniOS with a tool that can automatically build such a minimalistic OS.
+{{</md>}}
{{</section>}}
## General
{{</md>}}
-{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3">}}
+{{<row-from-list class="align-flex-start" component="card" component-class="card--bg" titleLevel="2" cols="3">}}
- title: XEN-ANNOUNCE@
tags:
- Mailing list
### Xen Project Hypervisor
{{</md>}}
-{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-t-md">}}
+{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-t-md align-flex-start">}}
- title: XEN-DEVEL@
tags:
- Mailing list
{{<md>}}
### Mirage OS
{{</md>}}
- {{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="1" class="mg-t-md">}}
+ {{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="1" class="mg-t-md align-flex-start">}}
- title: MIRAGEOS-DEVEL@
tags:
- Mailing list
{{<md>}}
### Unikraft
{{</md>}}
- {{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="1" class="mg-t-md">}}
+ {{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="1" class="mg-t-md align-flex-start">}}
- title: MINIOS-DEVEL@ (INCLUDES UNIKRAFT DEVELOPMENT)
tags:
- Mailing list
{{<md>}}
### XAPI
{{</md>}}
- {{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="1" class="mg-t-md">}}
+ {{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="1" class="mg-t-md align-flex-start">}}
- title: XEN-API@
tags:
- Mailing list
{{<md>}}
### XCP-ng
{{</md>}}
-{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-t-md">}}
+{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-t-md align-flex-start">}}
- title: XCP-NG FORUMS
tags:
- Forum
{{<md class="mg-t-md">}}
### Windows PV Drivers
{{</md>}}
-{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-t-md">}}
+{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-t-md align-flex-start">}}
- title: WIN-PV-DEVEL@
tags:
- Mailing list
## Advisory board
{{</md>}}
-{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-v-md">}}
+{{<row-from-list component="card" component-class="card--bg" titleLevel="2" cols="3" class="mg-v-md align-flex-start">}}
- title: PREDISCLOSURE-APPLICATIONS@
tags:
- Mailing list
blogApiKey: "b047d7f627a90f40798d11dcba"
+minify:
+ disableXML: true
+ minifyOutput: true
+ tdewolff:
+ html:
+ keepWhitespace: false
+ keepEndTags: false
+ keepQuotes: false
+ keepComments: false
module:
hugoVersion:
extended: true
],
"classes": [
"active",
+ "align-flex-start",
"ancestor",
"animated-home-server",
"animated-home-shadow-screen",
"list-column--sublists",
"list-no-style",
"list-pages",
+ "m-t-md",
"main",
"media-block",
"media-block--left",
"menu",
"menu-toggle",
"mg-l-lg",
+ "mg-l-md",
"mg-r-md",
"mg-t-lg",
"mg-t-md",
"mg-v-xxl",
"mob-mg-v-xl",
"mt-2",
+ "mt-md",
+ "mt-sm",
"news-container",
"next",
"no-mt",
"page-top",
"presentation-list",
"prev",
+ "rounded-corners",
+ "rounded-img",
"row",
"row-from-list",
"search-container",
"join-the-conversation",
"lazy-consensus--lazy-voting",
"leadership-team-decisions",
+ "library-pools",
"local-decision-making",
"main-responsibilities",
"maintainer-elections",
"supports-multiple-guest-operating-systems-linux-windows-netbsd-freebsd",
"the-hypervisor-teams-openpgp-keys",
"the-linux-foundation",
+ "the-unikraft-build-tool",
"trademark-policy",
"transparency",
"unikraft",
}
}
}
-
-.animate .images-in-circle li {
- animation: rotate-images 1s ease-out forwards;
-}
}
}
+.row-from-list .card__content {
+}
+
@for $i from 1 through 5 {
.cols-#{$i} {
--cols: #{$i};
font-size: 1em;
&::before {
- right: calc(var(--icon-left) + var(--icon-width) + var(--icon-margin) + 0.2em + var(--padding));
+ right: calc(var(--icon-width) + var(--icon-margin) + 0.6em + var(--padding));
}
}
@import "./header/header.scss";
@import "./footer.scss";
@import "./animation/home-animation.scss";
+@import "./utils.scss";
// overrides classes
@import "./spaces.scss";
--color-hover: var(--color-action-fill-hover);
--color-primary: var(--color-action-fill);
--color-secondary: var(--color-action-on-fill);
- --icon-left: 0px;
+ --icon-left: 0em;
--icon-margin: 0.375em;
display: inline-block;
}
&:hover,
- &.hover {
+ &.hover,
+ body .card:hover & {
--color-primary: var(--color-hover);
--icon-left: 0.3em;
}
padding: var(--padding);
background-color: transparent;
border: none;
+ --decal: 0.2em;
&:hover {
text-decoration: none;
}
&:has(.fas) {
- --icon-width: 1em;
+ --icon-width: 0.9em;
}
&:has(.fa-arrow-right),
&:has(.fa-arrow-up-right-from-square) {
- --icon-width: 0.75em;
+ --icon-width: 0.85em;
}
&:has(.fas)::before {
- right: calc(var(--icon-left) + var(--icon-width) + var(--icon-margin) + 0.2em + var(--padding));
+ right: calc(var(--icon-width) + var(--icon-margin) + var(--decal) + var(--padding));
}
- &:hover::before {
+ &:hover::before,
+ body .card:hover &::before {
transform: scaleX(1);
}
}
&__content {
flex: 1;
line-height: 1.25;
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 6;
- line-clamp: 6;
- overflow: hidden;
- text-overflow: ellipsis;
- word-break: break-word;
}
&__link {
line-height: 150%;
letter-spacing: -0.025em;
}
+
+.carousel .card__content {
+ display: block;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: none;
+ line-clamp: none;
+}
+
+.card-blog {
+ .card__content {
+ display: -webkit-box;
+ -webkit-box-orient: vertical;
+ -webkit-line-clamp: 6;
+ line-clamp: 6;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ word-break: break-word;
+ }
+}
.full-width-image {
- max-width: calc(1920px + var(--container-paddings) * 2);
- margin-left: calc(var(--container-paddings) * -1);
- margin-right: calc(var(--container-paddings) * -1);
+ --paddings: 40px;
+ max-width: calc(1920px + var(--paddings) * 2);
+ //margin-left: calc(var(--container-paddings) * -1);
+ //margin-right: calc(var(--paddings) * -1);
@media (min-width: 2000px) {
margin-left: auto;
.title-with-gradient-underline {
strong {
+ --underline-height: 0.07em;
display: block;
white-space: nowrap;
position: relative;
- &::after {
- display: block;
- content: "";
- position: absolute;
- bottom: -0.04em;
- left: 0;
- right: 0;
- height: 0.07em;
- background: linear-gradient(90deg, #07c 0%, rgba(255, 255, 255, 0) 100%);
+ background: linear-gradient(90deg, #07c 0%, rgba(255, 255, 255, 0) 100%);
+ background-repeat: no-repeat;
+ background-size: 0% var(--underline-height);
+ background-position: bottom left;
+ padding-bottom: calc(var(--underline-height) - 0.02em);
+ animation: backgroundSizeAnimation 1s ease-in-out forwards;
+ animation-delay: 1s;
+ }
+
+ @keyframes backgroundSizeAnimation {
+ 0% {
+ background-size: 0% var(--underline-height);
+ }
+ 100% {
+ background-size: 100% var(--underline-height);
}
}
}
h2,
h3 {
strong {
+ font-weight: inherit;
color: var(--color-action-text);
}
--- /dev/null
+.align-flex-start {
+ align-items: flex-start;
+}
+
+.full-width-img {
+ width: 100%;
+}
+
+img.rounded-corners,
+.rounded-corners img {
+ border-radius: 16px;
+}
(() => {
- const selector = ".carousel-container";
+ const /* The `selector` constant is storing a CSS selector string that is used to select elements in
+ the DOM. In this code snippet, the `selector` constant is set to `".carousel-container"`,
+ which means it is targeting elements with the class name "carousel-container". This selector
+ is then used to find and initialize carousel functionality on those elements in the
+ document. */
+ selector = ".carousel-container";
const itemSelector = ".carousel-item";
const itemsBefore = 2;
const itemsAfter = 1;
const { debounce } = window.XenSiteUtils;
const carousel = async (element) => {
- const infiniteLoop = false;
+ const uniqueid = Math.random().toString(36).substring(2, 15);
+ element.classList.add("carousel-container-" + uniqueid);
+ const infiniteLoop = true;
const itemsBefore = 2;
const itemsAfter = 2;
}
rules.push(`
- .carousel-container {
+ .carousel-container-${uniqueid} {
--item-width: ${itemWidth}px;
--item-position: ${occupiedSpace}px;
--height: ${height}px;
</div>
` : ""}
<div class="card__actions">
- <a href="${_.url}" class="join-button">
+ <a href="${_.url}" class="join-button btn btn-tertiary">
Read more
<i class="fas fa-arrow-up-right-from-square"></i>
</a>
{{ $colClass := .Get "col-class" }}
{{ $headerLevel := .Get "headerLevel" }}
{{ $class := .Get "class" }}
+
{{ partial "vertical-lists.html" (dict "lists" $yaml "cols" $cols "colClass" $colClass "headerLevel" $headerLevel "class" $class) }}