Modify file structure of docs source files.

Changed the file structure to allow for easier and better maintenance of
the docs. Files were renamed as needed and following a consistent
convention. Added a index.rst to every folder allowing for partial
builds of the docs. Included content previously left out of the docs
build. The commit also performs minimal housekeeping.

Signed-off-by: Rodrigo Caballero <rodrigo.caballero.abraham@intel.com>
This commit is contained in:
Rodrigo Caballero
2016-10-24 14:12:00 -05:00
parent b18458758e
commit a4b61aecf9
99 changed files with 9764 additions and 9743 deletions
+192 -192
View File
@@ -1,192 +1,192 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ClearLinuxDocumentation.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ClearLinuxDocumentation.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/ClearLinuxDocumentation"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ClearLinuxDocumentation"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = _build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/ClearLinuxDocumentation.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/ClearLinuxDocumentation.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/ClearLinuxDocumentation"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/ClearLinuxDocumentation"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

Before

Width:  |  Height:  |  Size: 328 KiB

After

Width:  |  Height:  |  Size: 328 KiB

Before

Width:  |  Height:  |  Size: 360 KiB

After

Width:  |  Height:  |  Size: 360 KiB

Before

Width:  |  Height:  |  Size: 385 KiB

After

Width:  |  Height:  |  Size: 385 KiB

Before

Width:  |  Height:  |  Size: 388 KiB

After

Width:  |  Height:  |  Size: 388 KiB

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 59 KiB

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

Before

Width:  |  Height:  |  Size: 43 KiB

After

Width:  |  Height:  |  Size: 43 KiB

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Before

Width:  |  Height:  |  Size: 265 KiB

After

Width:  |  Height:  |  Size: 265 KiB

+125 -125
View File
@@ -1,125 +1,125 @@
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="Ytxqo6u4bXdch1mBIQXjVpw05a7xest8E7A2ODox8f0=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="Ytxqo6u4bXdch1mBIQXjVpw05a7xest8E7A2ODox8f0=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="Ytxqo6u4bXdch1mBIQXjVpw05a7xest8E7A2ODox8f0=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="Ytxqo6u4bXdch1mBIQXjVpw05a7xest8E7A2ODox8f0=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="Ytxqo6u4bXdch1mBIQXjVpw05a7xest8E7A2ODox8f0=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="Ytxqo6u4bXdch1mBIQXjVpw05a7xest8E7A2ODox8f0=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>
+125 -125
View File
@@ -1,125 +1,125 @@
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="rZLe6DTuc4TRf8DnGIbU26p59xH3Eq8aWYC4NvVc1pM=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="rZLe6DTuc4TRf8DnGIbU26p59xH3Eq8aWYC4NvVc1pM=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="rZLe6DTuc4TRf8DnGIbU26p59xH3Eq8aWYC4NvVc1pM=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="rZLe6DTuc4TRf8DnGIbU26p59xH3Eq8aWYC4NvVc1pM=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="rZLe6DTuc4TRf8DnGIbU26p59xH3Eq8aWYC4NvVc1pM=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="rZLe6DTuc4TRf8DnGIbU26p59xH3Eq8aWYC4NvVc1pM=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>
+125 -125
View File
@@ -1,125 +1,125 @@
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="orwKZnvQVEFT09F4bNkHKLCcIQkcaL7tZw1Dj55jqVY=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="orwKZnvQVEFT09F4bNkHKLCcIQkcaL7tZw1Dj55jqVY=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="orwKZnvQVEFT09F4bNkHKLCcIQkcaL7tZw1Dj55jqVY=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="orwKZnvQVEFT09F4bNkHKLCcIQkcaL7tZw1Dj55jqVY=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="orwKZnvQVEFT09F4bNkHKLCcIQkcaL7tZw1Dj55jqVY=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="orwKZnvQVEFT09F4bNkHKLCcIQkcaL7tZw1Dj55jqVY=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>
+125 -125
View File
@@ -1,125 +1,125 @@
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="BYgN41Swlhaocx5zAtsekHQP9MSc9qwtQDgk2kQ1n+w=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="BYgN41Swlhaocx5zAtsekHQP9MSc9qwtQDgk2kQ1n+w=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="BYgN41Swlhaocx5zAtsekHQP9MSc9qwtQDgk2kQ1n+w=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang='en'>
<head>
<meta charset='utf-8'>
<meta content='GitLab Community Edition' name='description'>
<title>
GitLab
</title>
<link href="/assets/favicon-baaa14bade1248aa6165e9d34e7d83c0.ico" rel="shortcut icon" type="image/vnd.microsoft.icon" />
<link href="/assets/application-b98c4e3de10f80b29e9d63b433eea3ff.css" media="all" rel="stylesheet" />
<link href="/assets/print-1df3ea9b8ff148a6745321899e0cb213.css" media="print" rel="stylesheet" />
<script src="/assets/application-c4186ca579dd09b3e48eaf1b5a3e4434.js"></script>
<meta content="authenticity_token" name="csrf-param" />
<meta content="BYgN41Swlhaocx5zAtsekHQP9MSc9qwtQDgk2kQ1n+w=" name="csrf-token" />
<script type="text/javascript">
//<![CDATA[
window.gon={};gon.default_issues_tracker="gitlab";gon.api_version="v3";gon.relative_url_root="";gon.default_avatar_url="http://clrgitlab.intel.com/assets/no_avatar-adffbfe10d45b20495cd2a9b88974150.png";
//]]>
</script>
<meta content='width=device-width, initial-scale=1.0' name='viewport'>
</head>
<body class='ui_basic login-page'>
<div class='container'>
<div class='content'>
<div class='login-title'>
<h1>GitLab Community Edition</h1>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='content'>
<div class='flash-container'>
<div class='flash-alert'>
You need to sign in before continuing.
</div>
</div>
<div class='row'>
<div class='col-md-7 brand-holder'>
<div class='brand-image default-brand-image hidden-sm hidden-xs'>
<img alt="Brand logo" src="/assets/brand_logo-c37eb221b456bb4b472cc1084480991f.png" />
</div>
<div class='brand_text hidden-xs'>
<h2>Open source software to collaborate on code</h2>
<p class='lead'>
Manage git repositories with fine grained access controls that keep your code secure.
Perform code reviews and enhance collaboration with merge requests.
Each project can also have an issue tracker and a wiki.
</p>
</div>
</div>
<div class='col-md-5'>
<div class='login-box'>
<div class='login-heading'>
<h3>Sign in</h3>
</div>
<div class='login-body'>
<ul class='nav nav-tabs'>
<li class='active'>
<a data-toggle="tab" href="#tab-ldapmain">Intel Corporation</a>
</li>
<li>
<a data-toggle="tab" href="#tab-signin">Standard</a>
</li>
</ul>
<div class='tab-content'>
<div class='active tab-pane' id='tab-ldapmain'>
<form accept-charset="UTF-8" action="/users/auth/ldapmain/callback" id="new_ldap_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="BYgN41Swlhaocx5zAtsekHQP9MSc9qwtQDgk2kQ1n+w=" /></div>
<input autofocus="autofocus" class="form-control top" id="username" name="username" placeholder="LDAP Login" type="text" />
<input class="form-control bottom" id="password" name="password" placeholder="Password" type="password" />
<br>
<button class="btn-save btn" name="button" type="submit">LDAP Sign in</button>
</form>
</div>
<div class='tab-pane' id='tab-signin'>
<form accept-charset="UTF-8" action="/users/sign_in" class="new_user" id="new_user" method="post"><div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="BYgN41Swlhaocx5zAtsekHQP9MSc9qwtQDgk2kQ1n+w=" /></div><input autofocus="autofocus" class="form-control top" id="user_login" name="user[login]" placeholder="Username or Email" type="text" />
<input class="form-control bottom" id="user_password" name="user[password]" placeholder="Password" type="password" />
<div class='clearfix append-bottom-10'>
<label class='checkbox remember_me' for='user_remember_me'>
<input name="user[remember_me]" type="hidden" value="0" /><input id="user_remember_me" name="user[remember_me]" type="checkbox" value="1" />
<span>Remember me</span>
<div class='pull-right'>
<a href="/users/password/new">Forgot your password?</a>
</div>
</label>
</div>
<div>
<input class="btn btn-save" name="commit" type="submit" value="Sign in" />
</div>
</form>
</div>
</div>
</div>
<div class='login-footer'>
<p>
<span class='light'>Did not receive confirmation email?</span>
<a href="/users/confirmation/new">Send again</a>
</p>
</div>
</div>
</div>
</div>
</div>
</div>
<hr>
<div class='container'>
<div class='footer-links'>
<a href="/explore">Explore</a>
<a href="http://doc.gitlab.com/" rel="nofollow">Documentation</a>
<a href="https://about.gitlab.com/" rel="nofollow">About GitLab</a>
</div>
</div>
</body>
</html>

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 167 KiB

After

Width:  |  Height:  |  Size: 168 KiB

+20 -20
View File
@@ -1,20 +1,20 @@
import os
from alabaster import _version as version
def get_path():
"""
Shortcut for users whose theme is next to their conf.py.
"""
# Theme directory is defined as our parent directory
return os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
def update_context(app, pagename, templatename, context, doctree):
context['alabaster_version'] = version.__version__
def setup(app):
app.connect('html-page-context', update_context)
return {'version': version.__version__,
'parallel_read_safe': True}
import os
from alabaster import _version as version
def get_path():
"""
Shortcut for users whose theme is next to their conf.py.
"""
# Theme directory is defined as our parent directory
return os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
def update_context(app, pagename, templatename, context, doctree):
context['alabaster_version'] = version.__version__
def setup(app):
app.connect('html-page-context', update_context)
return {'version': version.__version__,
'parallel_read_safe': True}
+2 -2
View File
@@ -1,2 +1,2 @@
__version_info__ = (0, 7, 6)
__version__ = '.'.join(map(str, __version_info__))
__version_info__ = (0, 7, 6)
__version__ = '.'.join(map(str, __version_info__))
+39 -39
View File
@@ -1,39 +1,39 @@
{% if theme_logo %}
<p class="logo">
<a href="{{ pathto(master_doc) }}">
<img class="logo" src="{{ pathto('_static/' ~ theme_logo, 1) }}" alt="Logo"/>
{% if theme_logo_name|lower == 'true' %}
<h1 class="logo logo-name">{{ project }}</h2>
{% endif %}
</a>
</p>
{% else %}
<h1 class="logo"><a href="{{ pathto(master_doc) }}">{{ project }}</a></h1>
{% endif %}
{% if theme_description %}
<p class="blurb">{{ theme_description }}</p>
{% endif %}
{% if theme_github_button|lower == 'true' %}
<p>
<iframe src="https://ghbtns.com/github-btn.html?user={{ theme_github_user }}&repo={{ theme_github_repo }}&type={{ theme_github_type }}&count={{ theme_github_count }}&size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
{% endif %}
{% if theme_travis_button|lower != 'false' %}
{% if theme_travis_button|lower == 'true' %}
{% set path = theme_github_user + '/' + theme_github_repo %}
{% else %}
{% set path = theme_travis_button %}
{% endif %}
<p>
<a href="https://travis-ci.org/{{ path }}">
<img
alt="https://secure.travis-ci.org/{{ path }}.png?branch=master"
src="https://secure.travis-ci.org/{{ path }}.png?branch=master"
>
</a>
</p>
{% endif %}
{% if theme_logo %}
<p class="logo">
<a href="{{ pathto(master_doc) }}">
<img class="logo" src="{{ pathto('_static/' ~ theme_logo, 1) }}" alt="Logo"/>
{% if theme_logo_name|lower == 'true' %}
<h1 class="logo logo-name">{{ project }}</h2>
{% endif %}
</a>
</p>
{% else %}
<h1 class="logo"><a href="{{ pathto(master_doc) }}">{{ project }}</a></h1>
{% endif %}
{% if theme_description %}
<p class="blurb">{{ theme_description }}</p>
{% endif %}
{% if theme_github_button|lower == 'true' %}
<p>
<iframe src="https://ghbtns.com/github-btn.html?user={{ theme_github_user }}&repo={{ theme_github_repo }}&type={{ theme_github_type }}&count={{ theme_github_count }}&size=large"
allowtransparency="true" frameborder="0" scrolling="0" width="200px" height="35px"></iframe>
</p>
{% endif %}
{% if theme_travis_button|lower != 'false' %}
{% if theme_travis_button|lower == 'true' %}
{% set path = theme_github_user + '/' + theme_github_repo %}
{% else %}
{% set path = theme_travis_button %}
{% endif %}
<p>
<a href="https://travis-ci.org/{{ path }}">
<img
alt="https://secure.travis-ci.org/{{ path }}.png?branch=master"
src="https://secure.travis-ci.org/{{ path }}.png?branch=master"
>
</a>
</p>
{% endif %}
+14 -14
View File
@@ -1,14 +1,14 @@
{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
{% if page_source_suffix %}
{% set suffix = page_source_suffix %}
{% else %}
{% set suffix = source_suffix %}
{% endif %}
<div id="site-breadcrumb" class="hidden-sm">
<h2 class="element-invisible"></h2>
<div class="breadcrumb">
<a href="/">Home</a> » <a href="{{ pathto(master_doc) }}">Documentation</a> » {{ title }}
</div>
</div>
{# Support for Sphinx 1.3+ page_source_suffix, but don't break old builds. #}
{% if page_source_suffix %}
{% set suffix = page_source_suffix %}
{% else %}
{% set suffix = source_suffix %}
{% endif %}
<div id="site-breadcrumb" class="hidden-sm">
<h2 class="element-invisible"></h2>
<div class="breadcrumb">
<a href="/">Home</a> » <a href="{{ pathto(master_doc) }}">Documentation</a> » {{ title }}
</div>
</div>
+9 -9
View File
@@ -1,9 +1,9 @@
{% if theme_gratipay_user or theme_gittip_user %}
<h3>Donate</h3>
<p>
Consider supporting the authors on <a href="https://www.gratipay.com/">Gratipay</a>:
<script data-gratipay-username="{{ theme_gratipay_user or theme_gittip_user }}"
data-gratipay-widget="button"
src="//gttp.co/v1.js"></script>
</p>
{% endif %}
{% if theme_gratipay_user or theme_gittip_user %}
<h3>Donate</h3>
<p>
Consider supporting the authors on <a href="https://www.gratipay.com/">Gratipay</a>:
<script data-gratipay-username="{{ theme_gratipay_user or theme_gittip_user }}"
data-gratipay-widget="button"
src="//gttp.co/v1.js"></script>
</p>
{% endif %}
+32 -32
View File
@@ -1,32 +1,32 @@
<footer id="footer">
<div class="project-footer container clearfix">
<span class="intel-sw-logo"></span>
<div class="mobile-menu"></div>
<div class="region region-footer">
<div id="block-menu-menu-footer-menu" class="block block-menu">
<ul class="menu"><li class="first leaf"><a href="/about/privacy-policy">Privacy Policy</a></li>
<li class="leaf"><a href="mailto:dev@lists.clearlinux.org" class="mailto">Contact us</a></li>
<li class="leaf"><a href="/about/terms-service">Terms of Service</a></li>
<li class="leaf"><a href="http://www.intel.com/content/www/us/en/legal/trademarks.html" target="_blank" class="ext">* Trademarks</a></li>
<li class="last leaf"><a href="http://www.intel.com/content/www/us/en/privacy/intel-cookie-notice.html" target="_blank" class="ext">Cookies</a></li>
</ul>
</div>
<div id="block-menu-block-1" class="block block-menu-block">
<div class="menu-block-wrapper menu-block-1 menu-name-menu-social-media parent-mlid-0 menu-level-1">
<ul class="menu"><li class="first leaf menu-mlid-8277"><a href="https://twitter.com/clearlinux" class="social-media icon twitter">Twitter</a></li>
<li class="leaf menu-mlid-8286"><a href="https://plus.google.com/u/2/b/110130641055512104222/110130641055512104222/posts/p/pub?_ga=1.28912252.1365239857.1461340816" class="social-media icon googleplus">Google +</a></li>
<li class="last leaf menu-mlid-8279"><a href="https://github.com/clearlinux" class="social-media icon github">Github</a></li>
</ul></div>
</div>
</div>
</div>
<div class="footer-copyright">
<small>Copyright © 2016 Intel Corporation. All rights reserved</small> <br>
<small>*Other names and brands may be claimed as the property of others</small>
</div>
</footer>
<footer id="footer">
<div class="project-footer container clearfix">
<span class="intel-sw-logo"></span>
<div class="mobile-menu"></div>
<div class="region region-footer">
<div id="block-menu-menu-footer-menu" class="block block-menu">
<ul class="menu"><li class="first leaf"><a href="/about/privacy-policy">Privacy Policy</a></li>
<li class="leaf"><a href="mailto:dev@lists.clearlinux.org" class="mailto">Contact us</a></li>
<li class="leaf"><a href="/about/terms-service">Terms of Service</a></li>
<li class="leaf"><a href="http://www.intel.com/content/www/us/en/legal/trademarks.html" target="_blank" class="ext">* Trademarks</a></li>
<li class="last leaf"><a href="http://www.intel.com/content/www/us/en/privacy/intel-cookie-notice.html" target="_blank" class="ext">Cookies</a></li>
</ul>
</div>
<div id="block-menu-block-1" class="block block-menu-block">
<div class="menu-block-wrapper menu-block-1 menu-name-menu-social-media parent-mlid-0 menu-level-1">
<ul class="menu"><li class="first leaf menu-mlid-8277"><a href="https://twitter.com/clearlinux" class="social-media icon twitter">Twitter</a></li>
<li class="leaf menu-mlid-8286"><a href="https://plus.google.com/u/2/b/110130641055512104222/110130641055512104222/posts/p/pub?_ga=1.28912252.1365239857.1461340816" class="social-media icon googleplus">Google +</a></li>
<li class="last leaf menu-mlid-8279"><a href="https://github.com/clearlinux" class="social-media icon github">Github</a></li>
</ul></div>
</div>
</div>
</div>
<div class="footer-copyright">
<small>Copyright © 2016 Intel Corporation. All rights reserved</small> <br>
<small>*Other names and brands may be claimed as the property of others</small>
</div>
</footer>
+43 -43
View File
@@ -1,43 +1,43 @@
<header>
<div id="o1-header">
<div class="o1-logo-container hidden-xs">
<div class="container"><a href="http://01.org" class="o1-logo ext" target="_blank"></a></div>
</div>
<div class="project-header container clearfix">
<div class="left inline">
<a href="/" id="project-name">
<span id="project-name-left">Clear Linux&nbsp; <sup>*</sup></span>
<span id="project-name-right">Project</span>
<span id="project-name-bottom">for Intel* Architecture</span>
</a>
</div>
<div class="right">
<div class="mobile-menu"></div>
<div class="region region-header">
<div id="block-system-main-menu" class="block block-system block-menu">
<ul class="menu"><li class="first leaf"><a href="https://download.clearlinux.org" title="Downloads" target="_blank">Downloads</a></li>
<li class="collapsed"><a href="/features" title="Features">Features</a></li>
<li class="collapsed"><a href="/documentation" title="Documentation" class="active">Documentation</a></li>
</ul>
</div>
<div id="block-menu-menu-get-involved" class="block block-menu">
<h4>Get Involved</h4>
<ul class="menu">
<li class="first leaf"><a href="http://freenode.net/" target="_blank">IRC #clearlinux</a></li>
<li class="leaf"><a href="https://lists.clearlinux.org/mailman/listinfo/dev">Mailing list</a></li>
<li class="last leaf"><a href="/blogs">Blogs</a></li>
</ul>
</div>
</div>
<ul class="nav-tools">
<li><a href="/search"><i class="fa fa-search"></i></a></li>
<!--<li><i class="fa fa-mail-forward"></i></li>-->
</ul>
</div>
</div>
</div></header>
<header>
<div id="o1-header">
<div class="o1-logo-container hidden-xs">
<div class="container"><a href="http://01.org" class="o1-logo ext" target="_blank"></a></div>
</div>
<div class="project-header container clearfix">
<div class="left inline">
<a href="/" id="project-name">
<span id="project-name-left">Clear Linux&nbsp; <sup>*</sup></span>
<span id="project-name-right">Project</span>
<span id="project-name-bottom">for Intel* Architecture</span>
</a>
</div>
<div class="right">
<div class="mobile-menu"></div>
<div class="region region-header">
<div id="block-system-main-menu" class="block block-system block-menu">
<ul class="menu"><li class="first leaf"><a href="https://download.clearlinux.org" title="Downloads" target="_blank">Downloads</a></li>
<li class="collapsed"><a href="/features" title="Features">Features</a></li>
<li class="collapsed"><a href="/documentation" title="Documentation" class="active">Documentation</a></li>
</ul>
</div>
<div id="block-menu-menu-get-involved" class="block block-menu">
<h4>Get Involved</h4>
<ul class="menu">
<li class="first leaf"><a href="http://freenode.net/" target="_blank">IRC #clearlinux</a></li>
<li class="leaf"><a href="https://lists.clearlinux.org/mailman/listinfo/dev">Mailing list</a></li>
<li class="last leaf"><a href="/blogs">Blogs</a></li>
</ul>
</div>
</div>
<ul class="nav-tools">
<li><a href="/search"><i class="fa fa-search"></i></a></li>
<!--<li><i class="fa fa-mail-forward"></i></li>-->
</ul>
</div>
</div>
</div></header>
+183 -183
View File
@@ -1,183 +1,183 @@
{# TEMPLATE VAR SETTINGS #}
{% set script_files = script_files + ['_static/js/affix.js'] %}
{% set script_files = script_files + ['_static/js/project.js'] %}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
{{ metatags }}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{% block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{% endblock %}
<link rel="icon" type="image/png" sizes="192x192" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_android_192x192.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_180x180.png" />
<link rel="apple-touch-icon" sizes="152x152" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_152x152.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_web_32x32.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_web_96x96.png" />
<meta name="google-site-verification" content="xDIK6ZRF9BKNIeBUstAHF3zS6bpi2eCjBHemCQAEH8o" />
<meta name="msapplication-TileImage" href="sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_microsoft_144x144.png" />
<meta name="theme-color" content="#7DD2F7" />
<link rel="icon" type="image/png" sizes="16x16" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_web_16x16.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_144x144.png" />
<link rel="apple-touch-icon" sizes="120x120" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_120x120.png" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<link rel="shortcut icon" href="/sites/all/themes/custom/clearlinux_theme/favicon.ico" type="image/vnd.microsoft.icon" />
<link rel="apple-touch-icon" sizes="57x57" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_57x57.png" />
<link rel="apple-touch-icon" sizes="76x76" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_76x76.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_72x72.png" />
<link rel="apple-touch-icon" sizes="60x60" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_60x60.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_114x114.png" />
{# CSS #}
{# OPENSEARCH #}
{% if not embedded %}
{% if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{% endif %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
{% endif %}
{% for cssfile in css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
{% for cssfile in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
<link rel="stylesheet" href="{{ '/sites/all/themes/custom/clearlinux_theme/css/main.css' }}" type="text/css" />
<link rel="stylesheet" href="{{ pathto('_static/css/overrides.css', 1) }}" type="text/css" />
{%- block linktags %}
{%- if hasdoc('about') %}
<link rel="author" title="{{ _('About these documents') }}"
href="{{ pathto('about') }}"/>
{%- endif %}
{%- if hasdoc('genindex') %}
<link rel="index" title="{{ _('Index') }}"
href="{{ pathto('genindex') }}"/>
{%- endif %}
{%- if hasdoc('search') %}
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}"/>
{%- endif %}
{%- if hasdoc('copyright') %}
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}"/>
{%- endif %}
<link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}"/>
{%- if parents %}
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}"/>
{%- endif %}
{%- if next %}
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}"/>
{%- endif %}
{%- if prev %}
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}"/>
{%- endif %}
{%- endblock %}
{%- block extrahead %}
{% if theme_touch_icon %}
<link rel="apple-touch-icon" href="{{ pathto('_static/' ~ theme_touch_icon, 1) }}" />
{% endif %}
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
{% endblock %}
{# Keep modernizr in head - http://modernizr.com/docs/#installing #}
<script src="{{ '/sites/all/themes/custom/clearlinux_theme/js/modernizr.custom.19994.js' }}"></script>
</head>
<body role="document" >
<div id="wrapper">
{% include "header.html" %}
{# PAGE CONTENT #}
<div class="main-content">
<div id="site-breadcrumb" class="hidden-sm">
<div class="container">{% include "breadcrumbs.html" %}</div>
</div>
<div class="container clearfix">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="region region-content">
<div class="content">
<div class="container-fluid">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-12">
<div class="row"><div class="col-md-12 col-sm-12 col-xs-12">{% include "navigation.html" %}</div></div>
<div class="row"><div class="col-md-12 col-sm-12 col-xs-12">{% include "searchbox.html" %}</div></div>
</div>
<div class="col-md-8 col-sm-8 col-xs-12">{% block body %}{% endblock %}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include "footer.html" %}
</div>
{% if not embedded %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }}
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{% endif %}
{# STICKY NAVIGATION #}
{% if theme_sticky_navigation %}
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
{% endif %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
<script type="text/javascript" id="searchindexloader"></script>
{# Adding the google analytics tracking code #}
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-61272224-1', 'auto');
ga('send', 'pageview');
</script>
{# Disable base theme's top+bottom related navs; we have our own in sidebar #}
{%- block relbar1 %}{% endblock %}
{%- block relbar2 %}{% endblock %}
{%- block footer %} {% endblock %}
</body>
</html>
{# TEMPLATE VAR SETTINGS #}
{% set script_files = script_files + ['_static/js/affix.js'] %}
{% set script_files = script_files + ['_static/js/project.js'] %}
{%- set url_root = pathto('', 1) %}
{%- if url_root == '#' %}{% set url_root = '' %}{% endif %}
<!DOCTYPE html>
<!--[if IE 8]><html class="no-js lt-ie9" lang="en" > <![endif]-->
<!--[if gt IE 8]><!--> <html class="no-js" lang="en" > <!--<![endif]-->
<head>
<meta charset="utf-8">
{{ metatags }}
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
{% block htmltitle %}
<title>{{ title|striptags|e }}{{ titlesuffix }}</title>
{% endblock %}
<link rel="icon" type="image/png" sizes="192x192" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_android_192x192.png" />
<link rel="apple-touch-icon" sizes="180x180" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_180x180.png" />
<link rel="apple-touch-icon" sizes="152x152" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_152x152.png" />
<link rel="icon" type="image/png" sizes="32x32" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_web_32x32.png" />
<link rel="icon" type="image/png" sizes="96x96" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_web_96x96.png" />
<meta name="google-site-verification" content="xDIK6ZRF9BKNIeBUstAHF3zS6bpi2eCjBHemCQAEH8o" />
<meta name="msapplication-TileImage" href="sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_microsoft_144x144.png" />
<meta name="theme-color" content="#7DD2F7" />
<link rel="icon" type="image/png" sizes="16x16" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_web_16x16.png" />
<link rel="apple-touch-icon" sizes="144x144" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_144x144.png" />
<link rel="apple-touch-icon" sizes="120x120" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_120x120.png" />
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<link rel="shortcut icon" href="/sites/all/themes/custom/clearlinux_theme/favicon.ico" type="image/vnd.microsoft.icon" />
<link rel="apple-touch-icon" sizes="57x57" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_57x57.png" />
<link rel="apple-touch-icon" sizes="76x76" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_76x76.png" />
<link rel="apple-touch-icon" sizes="72x72" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_72x72.png" />
<link rel="apple-touch-icon" sizes="60x60" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_60x60.png" />
<link rel="apple-touch-icon" sizes="114x114" href="/sites/all/themes/custom/clearlinux_theme/images/favicons/favicon_apple_114x114.png" />
{# CSS #}
{# OPENSEARCH #}
{% if not embedded %}
{% if use_opensearch %}
<link rel="search" type="application/opensearchdescription+xml" title="{% trans docstitle=docstitle|e %}Search within {{ docstitle }}{% endtrans %}" href="{{ pathto('_static/opensearch.xml', 1) }}"/>
{% endif %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<link rel="stylesheet" href="{{ pathto('_static/' + style, 1) }}" type="text/css" />
{% endif %}
{% for cssfile in css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
{% for cssfile in extra_css_files %}
<link rel="stylesheet" href="{{ pathto(cssfile, 1) }}" type="text/css" />
{% endfor %}
<link rel="stylesheet" href="{{ '/sites/all/themes/custom/clearlinux_theme/css/main.css' }}" type="text/css" />
<link rel="stylesheet" href="{{ pathto('_static/css/overrides.css', 1) }}" type="text/css" />
{%- block linktags %}
{%- if hasdoc('about') %}
<link rel="author" title="{{ _('About these documents') }}"
href="{{ pathto('about') }}"/>
{%- endif %}
{%- if hasdoc('genindex') %}
<link rel="index" title="{{ _('Index') }}"
href="{{ pathto('genindex') }}"/>
{%- endif %}
{%- if hasdoc('search') %}
<link rel="search" title="{{ _('Search') }}" href="{{ pathto('search') }}"/>
{%- endif %}
{%- if hasdoc('copyright') %}
<link rel="copyright" title="{{ _('Copyright') }}" href="{{ pathto('copyright') }}"/>
{%- endif %}
<link rel="top" title="{{ docstitle|e }}" href="{{ pathto('index') }}"/>
{%- if parents %}
<link rel="up" title="{{ parents[-1].title|striptags|e }}" href="{{ parents[-1].link|e }}"/>
{%- endif %}
{%- if next %}
<link rel="next" title="{{ next.title|striptags|e }}" href="{{ next.link|e }}"/>
{%- endif %}
{%- if prev %}
<link rel="prev" title="{{ prev.title|striptags|e }}" href="{{ prev.link|e }}"/>
{%- endif %}
{%- endblock %}
{%- block extrahead %}
{% if theme_touch_icon %}
<link rel="apple-touch-icon" href="{{ pathto('_static/' ~ theme_touch_icon, 1) }}" />
{% endif %}
<meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9">
{% endblock %}
{# Keep modernizr in head - http://modernizr.com/docs/#installing #}
<script src="{{ '/sites/all/themes/custom/clearlinux_theme/js/modernizr.custom.19994.js' }}"></script>
</head>
<body role="document" >
<div id="wrapper">
{% include "header.html" %}
{# PAGE CONTENT #}
<div class="main-content">
<div id="site-breadcrumb" class="hidden-sm">
<div class="container">{% include "breadcrumbs.html" %}</div>
</div>
<div class="container clearfix">
<div class="row">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="region region-content">
<div class="content">
<div class="container-fluid">
<div class="row">
<div class="col-md-4 col-sm-4 col-xs-12">
<div class="row"><div class="col-md-12 col-sm-12 col-xs-12">{% include "navigation.html" %}</div></div>
<div class="row"><div class="col-md-12 col-sm-12 col-xs-12">{% include "searchbox.html" %}</div></div>
</div>
<div class="col-md-8 col-sm-8 col-xs-12">{% block body %}{% endblock %}</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
{% include "footer.html" %}
</div>
{% if not embedded %}
<script type="text/javascript">
var DOCUMENTATION_OPTIONS = {
URL_ROOT:'{{ url_root }}',
VERSION:'{{ release|e }}',
COLLAPSE_INDEX:false,
FILE_SUFFIX:'{{ '' if no_search_suffix else file_suffix }}',
HAS_SOURCE: {{ has_source|lower }}
};
</script>
{%- for scriptfile in script_files %}
<script type="text/javascript" src="{{ pathto(scriptfile, 1) }}"></script>
{%- endfor %}
{% endif %}
{# RTD hosts this file, so just load on non RTD builds #}
{% if not READTHEDOCS %}
<script type="text/javascript" src="{{ pathto('_static/js/theme.js', 1) }}"></script>
{% endif %}
{# STICKY NAVIGATION #}
{% if theme_sticky_navigation %}
<script type="text/javascript">
jQuery(function () {
SphinxRtdTheme.StickyNav.enable();
});
</script>
{% endif %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
<script type="text/javascript" id="searchindexloader"></script>
{# Adding the google analytics tracking code #}
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-61272224-1', 'auto');
ga('send', 'pageview');
</script>
{# Disable base theme's top+bottom related navs; we have our own in sidebar #}
{%- block relbar1 %}{% endblock %}
{%- block relbar2 %}{% endblock %}
{%- block footer %} {% endblock %}
</body>
</html>
+12 -12
View File
@@ -1,12 +1,12 @@
<sidebar>
<h2>Content Map</h2>
{% set toctree = toctree(maxdepth=2, collapse=theme_collapse_navigation, includehidden=True) %}
{% set toctree = toctree|replace("<ul>", "<ul class=\"custom-dropdown-menu\">", -1) %}
{% set toctree = toctree|replace("<ul class=\"current\">", "<ul class=\"custom-dropdown-menu\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l1 current\">", "<li class=\"menu-item-open parent-item\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l1\">", "<li class=\"menu-item-closed parent-item\">", -1) %}
{% set toctree = toctree|replace("<a class=\"current reference internal\" href=\"\">", "<a class=\"active\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l2\">", "<li class=\"child-item first-level no-childs\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l2 current\">", "<li class=\"child-item first-level no-childs\">", -1) %}
{{ toctree }}
</sidebar>
<sidebar>
<h2>Content Map</h2>
{% set toctree = toctree(maxdepth=2, collapse=theme_collapse_navigation, includehidden=True) %}
{% set toctree = toctree|replace("<ul>", "<ul class=\"custom-dropdown-menu\">", -1) %}
{% set toctree = toctree|replace("<ul class=\"current\">", "<ul class=\"custom-dropdown-menu\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l1 current\">", "<li class=\"menu-item-open parent-item\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l1\">", "<li class=\"menu-item-closed parent-item\">", -1) %}
{% set toctree = toctree|replace("<a class=\"current reference internal\" href=\"\">", "<a class=\"active\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l2\">", "<li class=\"child-item first-level no-childs\">", -1) %}
{% set toctree = toctree|replace("<li class=\"toctree-l2 current\">", "<li class=\"child-item first-level no-childs\">", -1) %}
{{ toctree }}
</sidebar>
+21 -21
View File
@@ -1,21 +1,21 @@
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="{{ pathto(master_doc) }}">Documentation overview</a><ul>
{%- for parent in parents %}
<li><a href="{{ parent.link|e }}">{{ parent.title }}</a><ul>
{%- endfor %}
{%- if prev %}
<li>Previous: <a href="{{ prev.link|e }}" title="{{ _('previous chapter')
}}">{{ prev.title }}</a></li>
{%- endif %}
{%- if next %}
<li>Next: <a href="{{ next.link|e }}" title="{{ _('next chapter')
}}">{{ next.title }}</a></li>
{%- endif %}
{%- for parent in parents %}
</ul></li>
{%- endfor %}
</ul></li>
</ul>
</div>
<div class="relations">
<h3>Related Topics</h3>
<ul>
<li><a href="{{ pathto(master_doc) }}">Documentation overview</a><ul>
{%- for parent in parents %}
<li><a href="{{ parent.link|e }}">{{ parent.title }}</a><ul>
{%- endfor %}
{%- if prev %}
<li>Previous: <a href="{{ prev.link|e }}" title="{{ _('previous chapter')
}}">{{ prev.title }}</a></li>
{%- endif %}
{%- if next %}
<li>Next: <a href="{{ next.link|e }}" title="{{ _('next chapter')
}}">{{ next.title }}</a></li>
{%- endif %}
{%- for parent in parents %}
</ul></li>
{%- endfor %}
</ul></li>
</ul>
</div>
+50 -50
View File
@@ -1,50 +1,50 @@
{#
basic/search.html
~~~~~~~~~~~~~~~~~
Template for the search page.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = _('Search') %}
{% set script_files = script_files + ['_static/searchtools.js'] %}
{% block footer %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
<script type="text/javascript" id="searchindexloader"></script>
{{ super() }}
{% endblock %}
{% block body %}
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
{% trans %}Please activate JavaScript to enable the search
functionality.{% endtrans %}
</p>
</div>
</noscript>
{% if search_performed %}
<h2>{{ _('Search Results') }}</h2>
{% if not search_results %}
<p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
{% endif %}
{% endif %}
<div id="search-results">
{% if search_results %}
<ul>
{% for href, caption, context in search_results %}
<li>
<a href="{{ pathto(item.href) }}">{{ caption }}</a>
<p class="context">{{ context|e }}</p>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% endblock %}
{#
basic/search.html
~~~~~~~~~~~~~~~~~
Template for the search page.
:copyright: Copyright 2007-2013 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
#}
{%- extends "layout.html" %}
{% set title = _('Search') %}
{% set script_files = script_files + ['_static/searchtools.js'] %}
{% block footer %}
<script type="text/javascript">
jQuery(function() { Search.loadIndex("{{ pathto('searchindex.js', 1) }}"); });
</script>
{# this is used when loading the search index using $.ajax fails,
such as on Chrome for documents on localhost #}
<script type="text/javascript" id="searchindexloader"></script>
{{ super() }}
{% endblock %}
{% block body %}
<noscript>
<div id="fallback" class="admonition warning">
<p class="last">
{% trans %}Please activate JavaScript to enable the search
functionality.{% endtrans %}
</p>
</div>
</noscript>
{% if search_performed %}
<h2>{{ _('Search Results') }}</h2>
{% if not search_results %}
<p>{{ _('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.') }}</p>
{% endif %}
{% endif %}
<div id="search-results">
{% if search_results %}
<ul>
{% for href, caption, context in search_results %}
<li>
<a href="{{ pathto(item.href) }}">{{ caption }}</a>
<p class="context">{{ context|e }}</p>
</li>
{% endfor %}
</ul>
{% endif %}
</div>
{% endblock %}
+12 -12
View File
@@ -1,12 +1,12 @@
{%- if builder != 'singlehtml' %}
<br />
<div id="searchbox" role="search">
<h2>Quick Search</h2>
<form class="search" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
<input type="submit" value="Go" class="pull-right">
</form>
</div>
{%- endif %}
{%- if builder != 'singlehtml' %}
<br />
<div id="searchbox" role="search">
<h2>Quick Search</h2>
<form class="search" action="{{ pathto('search') }}" method="get">
<input type="text" name="q" placeholder="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
<input type="submit" value="Go" class="pull-right">
</form>
</div>
{%- endif %}
File diff suppressed because it is too large Load Diff
@@ -1,2 +1,2 @@
#Ignore css files ands sass cache
.sass-cache
#Ignore css files ands sass cache
.sass-cache
@@ -1 +1 @@
// main
// main
+162 -162
View File
@@ -1,162 +1,162 @@
// Put all css overrides below
#clear-linux-project-for-intel-architecture-documentation li.toctree-l1{
list-style-type: none;
}
#clear-linux-project-for-intel-architecture-documentation li.toctree-l1 > a{
display: none;
}
#clear-linux-project-for-intel-architecture-documentation li.toctree-l2{
list-style-type: disc;
margin-left: -40px;
}
#searchbox {
margin-bottom: 45px;
}
@media (min-width: 992px) {
#searchbox {
margin-bottom: 0; } }
#searchbox input[type=text] {
width: 100%;
padding-right: 80px; }
#searchbox input[type=submit] {
position: absolute;
right: 0;
top: 0; }
#searchbox form.search {
position: relative; }
sidebar .custom-dropdown-menu {
margin-bottom: 5px;
padding: 0; }
sidebar .custom-dropdown-menu .no-childs .fa:before {
display: none; }
sidebar .custom-dropdown-menu li {
list-style-type: none;
margin: 0; }
sidebar .custom-dropdown-menu li a {
color: #2d3237 !important;
cursor: pointer;
text-decoration: none;
display: block;
padding: 10px 25px 10px 10px; }
sidebar .custom-dropdown-menu li a:focus, sidebar .custom-dropdown-menu li a:visited {
color: #2d3237 !important;
text-decoration: none; }
sidebar .custom-dropdown-menu li a:focus span, sidebar .custom-dropdown-menu li a:visited span {
color: #fff !important; }
sidebar .custom-dropdown-menu li a:hover {
color: #fff !important;
cursor: pointer;
text-decoration: none; }
sidebar .custom-dropdown-menu li a:hover span {
color: #fff !important;
cursor: pointer; }
sidebar .custom-dropdown-menu li a:hover, sidebar .custom-dropdown-menu li a.active {
background-color: #D1D3D5;
color: #2d3237 !important; }
sidebar .custom-dropdown-menu li a:hover span.fa, sidebar .custom-dropdown-menu li a.active span.fa {
color: #fff !important; }
sidebar .custom-dropdown-menu li a span.fa {
color: #2d3237 !important;
cursor: pointer; }
sidebar .custom-dropdown-menu li.parent-item a {
position: relative;
border: none !important;
}
sidebar .custom-dropdown-menu li.parent-item a .fa {
padding: 5px;
position: absolute;
right: 5px;
top: 10px; }
sidebar .custom-dropdown-menu li.parent-item a.active .fa {
color: #fff !important;
}
sidebar .custom-dropdown-menu li.parent-item > a {
background-color: #D1D3D5;
color: #2d3237 !important;
}
sidebar .custom-dropdown-menu li.parent-item > a.active, sidebar .custom-dropdown-menu li.parent-item > a:hover {
background-color: #00AEFF;
color: #fff !important; }
sidebar .custom-dropdown-menu li.parent-item a.active {
background-color: #00AEFF;
color: #fff; }
sidebar .custom-dropdown-menu li ul {
background-color: #F0F2F4;
margin-left: 0 !important;
height: 0;
visibility: hidden; }
sidebar .custom-dropdown-menu li ul ul {
margin-top: 0; }
sidebar .custom-dropdown-menu li.menu-item-closed ul {
height: 0 !important;
visibility: hidden !important; }
sidebar .custom-dropdown-menu li li.second-level {
margin: 0; }
sidebar .custom-dropdown-menu li li.second-level a {
padding-left: 20px; }
sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a {
background-color: #D1D3D5;
color: #2d3237 !important;
border-bottom: none !important;
}
sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a, sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a:hover {
background-color: #00AEFF;
color: #fff !important; }
sidebar .custom-dropdown-menu li.menu-item-open > ul{
height: auto;
padding: 0;
visibility: visible; }
sidebar .custom-dropdown-menu li.active a > .fa:before {
position: relative;
float: right;
top: -3px; }
sidebar .custom-dropdown-menu li.menu-item-open a > .fa {
color: #fff !important;
}
sidebar .custom-dropdown-menu li.menu-item-open li.child-item a:active {
color: #000 !important;
}
li.child-item > a.active {
background-color: #D1D3D5 !important;
color: #000 !important;
border-bottom: none !important;
border-right: 2px solid #00AEFF !important;
}
.main-content{
padding-top: 110px !important;
}
#site-breadcrumb {
margin-bottom: 0px !important;
}
.region-content {
padding-top: 25px;
padding-bottom: 200px;
}
input[type=text] {
min-height: 46px !important;
}
button, .button, .btn, input[type=button],
input[type=submit], input[type=reset]{
margin: 0px;
}
footer .menu-name-menu-social-media {
text-align: left;
margin-right: 15px;
position: absolute;
right: 0;
top: 25px;
}
// Put all css overrides below
#clear-linux-project-for-intel-architecture-documentation li.toctree-l1{
list-style-type: none;
}
#clear-linux-project-for-intel-architecture-documentation li.toctree-l1 > a{
display: none;
}
#clear-linux-project-for-intel-architecture-documentation li.toctree-l2{
list-style-type: disc;
margin-left: -40px;
}
#searchbox {
margin-bottom: 45px;
}
@media (min-width: 992px) {
#searchbox {
margin-bottom: 0; } }
#searchbox input[type=text] {
width: 100%;
padding-right: 80px; }
#searchbox input[type=submit] {
position: absolute;
right: 0;
top: 0; }
#searchbox form.search {
position: relative; }
sidebar .custom-dropdown-menu {
margin-bottom: 5px;
padding: 0; }
sidebar .custom-dropdown-menu .no-childs .fa:before {
display: none; }
sidebar .custom-dropdown-menu li {
list-style-type: none;
margin: 0; }
sidebar .custom-dropdown-menu li a {
color: #2d3237 !important;
cursor: pointer;
text-decoration: none;
display: block;
padding: 10px 25px 10px 10px; }
sidebar .custom-dropdown-menu li a:focus, sidebar .custom-dropdown-menu li a:visited {
color: #2d3237 !important;
text-decoration: none; }
sidebar .custom-dropdown-menu li a:focus span, sidebar .custom-dropdown-menu li a:visited span {
color: #fff !important; }
sidebar .custom-dropdown-menu li a:hover {
color: #fff !important;
cursor: pointer;
text-decoration: none; }
sidebar .custom-dropdown-menu li a:hover span {
color: #fff !important;
cursor: pointer; }
sidebar .custom-dropdown-menu li a:hover, sidebar .custom-dropdown-menu li a.active {
background-color: #D1D3D5;
color: #2d3237 !important; }
sidebar .custom-dropdown-menu li a:hover span.fa, sidebar .custom-dropdown-menu li a.active span.fa {
color: #fff !important; }
sidebar .custom-dropdown-menu li a span.fa {
color: #2d3237 !important;
cursor: pointer; }
sidebar .custom-dropdown-menu li.parent-item a {
position: relative;
border: none !important;
}
sidebar .custom-dropdown-menu li.parent-item a .fa {
padding: 5px;
position: absolute;
right: 5px;
top: 10px; }
sidebar .custom-dropdown-menu li.parent-item a.active .fa {
color: #fff !important;
}
sidebar .custom-dropdown-menu li.parent-item > a {
background-color: #D1D3D5;
color: #2d3237 !important;
}
sidebar .custom-dropdown-menu li.parent-item > a.active, sidebar .custom-dropdown-menu li.parent-item > a:hover {
background-color: #00AEFF;
color: #fff !important; }
sidebar .custom-dropdown-menu li.parent-item a.active {
background-color: #00AEFF;
color: #fff; }
sidebar .custom-dropdown-menu li ul {
background-color: #F0F2F4;
margin-left: 0 !important;
height: 0;
visibility: hidden; }
sidebar .custom-dropdown-menu li ul ul {
margin-top: 0; }
sidebar .custom-dropdown-menu li.menu-item-closed ul {
height: 0 !important;
visibility: hidden !important; }
sidebar .custom-dropdown-menu li li.second-level {
margin: 0; }
sidebar .custom-dropdown-menu li li.second-level a {
padding-left: 20px; }
sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a {
background-color: #D1D3D5;
color: #2d3237 !important;
border-bottom: none !important;
}
sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a, sidebar .custom-dropdown-menu li.menu-item-open.parent-item > a:hover {
background-color: #00AEFF;
color: #fff !important; }
sidebar .custom-dropdown-menu li.menu-item-open > ul{
height: auto;
padding: 0;
visibility: visible; }
sidebar .custom-dropdown-menu li.active a > .fa:before {
position: relative;
float: right;
top: -3px; }
sidebar .custom-dropdown-menu li.menu-item-open a > .fa {
color: #fff !important;
}
sidebar .custom-dropdown-menu li.menu-item-open li.child-item a:active {
color: #000 !important;
}
li.child-item > a.active {
background-color: #D1D3D5 !important;
color: #000 !important;
border-bottom: none !important;
border-right: 2px solid #00AEFF !important;
}
.main-content{
padding-top: 110px !important;
}
#site-breadcrumb {
margin-bottom: 0px !important;
}
.region-content {
padding-top: 25px;
padding-bottom: 200px;
}
input[type=text] {
min-height: 46px !important;
}
button, .button, .btn, input[type=button],
input[type=submit], input[type=reset]{
margin: 0px;
}
footer .menu-name-menu-social-media {
text-align: left;
margin-right: 15px;
position: absolute;
right: 0;
top: 25px;
}
+9 -9
View File
File diff suppressed because one or more lines are too long
+9 -9
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+162 -162
View File
@@ -1,162 +1,162 @@
/* ========================================================================
* Bootstrap: affix.js v3.3.5
* http://getbootstrap.com/javascript/#affix
* ========================================================================
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// AFFIX CLASS DEFINITION
// ======================
var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, options)
this.$target = $(this.options.target)
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
this.$element = $(element)
this.affixed = null
this.unpin = null
this.pinnedOffset = null
this.checkPosition()
}
Affix.VERSION = '3.3.5'
Affix.RESET = 'affix affix-top affix-bottom'
Affix.DEFAULTS = {
offset: 0,
target: window
}
Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
var targetHeight = this.$target.height()
if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
if (this.affixed == 'bottom') {
if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
}
var initializing = this.affixed == null
var colliderTop = initializing ? scrollTop : position.top
var colliderHeight = initializing ? targetHeight : height
if (offsetTop != null && scrollTop <= offsetTop) return 'top'
if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
return false
}
Affix.prototype.getPinnedOffset = function () {
if (this.pinnedOffset) return this.pinnedOffset
this.$element.removeClass(Affix.RESET).addClass('affix')
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
return (this.pinnedOffset = position.top - scrollTop)
}
Affix.prototype.checkPositionWithEventLoop = function () {
setTimeout($.proxy(this.checkPosition, this), 1)
}
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return
var height = this.$element.height()
var offset = this.options.offset
var offsetTop = offset.top
var offsetBottom = offset.bottom
var scrollHeight = Math.max($(document).height(), $(document.body).height())
if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
if (this.affixed != affix) {
if (this.unpin != null) this.$element.css('top', '')
var affixType = 'affix' + (affix ? '-' + affix : '')
var e = $.Event(affixType + '.bs.affix')
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
this.affixed = affix
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
this.$element
.removeClass(Affix.RESET)
.addClass(affixType)
.trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
}
if (affix == 'bottom') {
this.$element.offset({
top: scrollHeight - height - offsetBottom
})
}
}
// AFFIX PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.affix')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.affix
$.fn.affix = Plugin
$.fn.affix.Constructor = Affix
// AFFIX NO CONFLICT
// =================
$.fn.affix.noConflict = function () {
$.fn.affix = old
return this
}
// AFFIX DATA-API
// ==============
$(window).on('load', function () {
$('[data-spy="affix"]').each(function () {
var $spy = $(this)
var data = $spy.data()
data.offset = data.offset || {}
if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
if (data.offsetTop != null) data.offset.top = data.offsetTop
Plugin.call($spy, data)
})
})
}(jQuery);
/* ========================================================================
* Bootstrap: affix.js v3.3.5
* http://getbootstrap.com/javascript/#affix
* ========================================================================
* Copyright 2011-2015 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
* ======================================================================== */
+function ($) {
'use strict';
// AFFIX CLASS DEFINITION
// ======================
var Affix = function (element, options) {
this.options = $.extend({}, Affix.DEFAULTS, options)
this.$target = $(this.options.target)
.on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))
.on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))
this.$element = $(element)
this.affixed = null
this.unpin = null
this.pinnedOffset = null
this.checkPosition()
}
Affix.VERSION = '3.3.5'
Affix.RESET = 'affix affix-top affix-bottom'
Affix.DEFAULTS = {
offset: 0,
target: window
}
Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) {
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
var targetHeight = this.$target.height()
if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false
if (this.affixed == 'bottom') {
if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom'
return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom'
}
var initializing = this.affixed == null
var colliderTop = initializing ? scrollTop : position.top
var colliderHeight = initializing ? targetHeight : height
if (offsetTop != null && scrollTop <= offsetTop) return 'top'
if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom'
return false
}
Affix.prototype.getPinnedOffset = function () {
if (this.pinnedOffset) return this.pinnedOffset
this.$element.removeClass(Affix.RESET).addClass('affix')
var scrollTop = this.$target.scrollTop()
var position = this.$element.offset()
return (this.pinnedOffset = position.top - scrollTop)
}
Affix.prototype.checkPositionWithEventLoop = function () {
setTimeout($.proxy(this.checkPosition, this), 1)
}
Affix.prototype.checkPosition = function () {
if (!this.$element.is(':visible')) return
var height = this.$element.height()
var offset = this.options.offset
var offsetTop = offset.top
var offsetBottom = offset.bottom
var scrollHeight = Math.max($(document).height(), $(document.body).height())
if (typeof offset != 'object') offsetBottom = offsetTop = offset
if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)
if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)
var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom)
if (this.affixed != affix) {
if (this.unpin != null) this.$element.css('top', '')
var affixType = 'affix' + (affix ? '-' + affix : '')
var e = $.Event(affixType + '.bs.affix')
this.$element.trigger(e)
if (e.isDefaultPrevented()) return
this.affixed = affix
this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null
this.$element
.removeClass(Affix.RESET)
.addClass(affixType)
.trigger(affixType.replace('affix', 'affixed') + '.bs.affix')
}
if (affix == 'bottom') {
this.$element.offset({
top: scrollHeight - height - offsetBottom
})
}
}
// AFFIX PLUGIN DEFINITION
// =======================
function Plugin(option) {
return this.each(function () {
var $this = $(this)
var data = $this.data('bs.affix')
var options = typeof option == 'object' && option
if (!data) $this.data('bs.affix', (data = new Affix(this, options)))
if (typeof option == 'string') data[option]()
})
}
var old = $.fn.affix
$.fn.affix = Plugin
$.fn.affix.Constructor = Affix
// AFFIX NO CONFLICT
// =================
$.fn.affix.noConflict = function () {
$.fn.affix = old
return this
}
// AFFIX DATA-API
// ==============
$(window).on('load', function () {
$('[data-spy="affix"]').each(function () {
var $spy = $(this)
var data = $spy.data()
data.offset = data.offset || {}
if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom
if (data.offsetTop != null) data.offset.top = data.offsetTop
Plugin.call($spy, data)
})
})
}(jQuery);
+70 -70
View File
@@ -1,70 +1,70 @@
jQuery(document).ready(function($){
var classItem = $('.custom-dropdown-menu li.parent-item').attr('class');
if(classItem == 'menu-item-open parent-item') {
$('.custom-dropdown-menu li.parent-item a').append('<span class="fa fa-chevron-down"></span>');
} else {
$('.custom-dropdown-menu li.parent-item a').append('<span class="fa fa-chevron-up"></span>');
}
$('header .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
$('.o1-logo-container-mobile').toggleClass('menu-open');
$('body').toggleClass('menu-opened');
});
$('footer .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
});
$('#block-menu-menu-social-media, #block-menu-menu-get-involved').click(function(){
$(this).find('.menu').slideToggle();
});
$('.custom-dropdown-menu li.parent-item .fa').click(function(evt){
evt.stopPropagation();
$(this).toggleClass('fa-chevron-up fa-chevron-down');
$(this).closest('li').toggleClass('menu-item-closed menu-item-open');
return false;
});
$('div[id^=heading-]').click(function(){
var section = $(this).attr('id').replace('heading-', '');
$('#collapse-' + section).slideToggle();
$('#title-'+ section +' a i').toggleClass('fa-plus-square fa-minus-square');
});
$('header .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
$('.o1-logo-container-mobile').toggleClass('menu-open');
$('body').toggleClass('menu-opened');
});
$('footer .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
});
$('div[id^=heading-]').click(function(){
var section = $(this).attr('id').replace('heading-', '');
$('#collapse-' + section).slideToggle();
$('#title-'+ section +' a i').toggleClass('fa-plus-square fa-minus-square');
});
function onScroll(el) {
var $header = $('.project-header').first();
var scrollTop = $(el.currentTarget).scrollTop();
if (!$header.hasClass('scrolled') && scrollTop >= 200) {
$header.addClass('scrolled');
}
if ($header.hasClass('scrolled') && scrollTop < 200) {
$header.removeClass('scrolled');
}
}
//Animates logo on scroll
$('body, html').scroll(onScroll);
$(window).scroll(onScroll);
});
jQuery(document).ready(function($){
var classItem = $('.custom-dropdown-menu li.parent-item').attr('class');
if(classItem == 'menu-item-open parent-item') {
$('.custom-dropdown-menu li.parent-item a').append('<span class="fa fa-chevron-down"></span>');
} else {
$('.custom-dropdown-menu li.parent-item a').append('<span class="fa fa-chevron-up"></span>');
}
$('header .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
$('.o1-logo-container-mobile').toggleClass('menu-open');
$('body').toggleClass('menu-opened');
});
$('footer .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
});
$('#block-menu-menu-social-media, #block-menu-menu-get-involved').click(function(){
$(this).find('.menu').slideToggle();
});
$('.custom-dropdown-menu li.parent-item .fa').click(function(evt){
evt.stopPropagation();
$(this).toggleClass('fa-chevron-up fa-chevron-down');
$(this).closest('li').toggleClass('menu-item-closed menu-item-open');
return false;
});
$('div[id^=heading-]').click(function(){
var section = $(this).attr('id').replace('heading-', '');
$('#collapse-' + section).slideToggle();
$('#title-'+ section +' a i').toggleClass('fa-plus-square fa-minus-square');
});
$('header .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
$('.o1-logo-container-mobile').toggleClass('menu-open');
$('body').toggleClass('menu-opened');
});
$('footer .mobile-menu').click(function(){
$(this).parent().toggleClass('menu-open');
});
$('div[id^=heading-]').click(function(){
var section = $(this).attr('id').replace('heading-', '');
$('#collapse-' + section).slideToggle();
$('#title-'+ section +' a i').toggleClass('fa-plus-square fa-minus-square');
});
function onScroll(el) {
var $header = $('.project-header').first();
var scrollTop = $(el.currentTarget).scrollTop();
if (!$header.hasClass('scrolled') && scrollTop >= 200) {
$header.addClass('scrolled');
}
if ($header.hasClass('scrolled') && scrollTop < 200) {
$header.removeClass('scrolled');
}
}
//Animates logo on scroll
$('body, html').scroll(onScroll);
$(window).scroll(onScroll);
});
+153 -153
View File
@@ -1,153 +1,153 @@
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"sphinx-rtd-theme":[function(require,module,exports){
var jQuery = (typeof(window) != 'undefined') ? window.jQuery : require('jquery');
// Sphinx theme nav state
function ThemeNav () {
var nav = {
navBar: null,
win: null,
winScroll: false,
winResize: false,
linkScroll: false,
winPosition: 0,
winHeight: null,
docHeight: null,
isRunning: null
};
nav.enable = function () {
var self = this;
jQuery(function ($) {
self.init($);
self.reset();
self.win.on('hashchange', self.reset);
// Set scroll monitor
self.win.on('scroll', function () {
if (!self.linkScroll) {
self.winScroll = true;
}
});
setInterval(function () { if (self.winScroll) self.onScroll(); }, 25);
// Set resize monitor
self.win.on('resize', function () {
self.winResize = true;
});
setInterval(function () { if (self.winResize) self.onResize(); }, 25);
self.onResize();
});
};
nav.init = function ($) {
var doc = $(document),
self = this;
this.navBar = $('div.wy-side-scroll:first');
this.win = $(window);
// Set up javascript UX bits
$(document)
// Shift nav in mobile when clicking the menu.
.on('click', "[data-toggle='wy-nav-top']", function() {
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
})
// Nav menu link click operations
.on('click', ".wy-menu-vertical .current ul li a", function() {
var target = $(this);
// Close menu when you click a link.
$("[data-toggle='wy-nav-shift']").removeClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
// Handle dynamic display of l3 and l4 nav lists
self.toggleCurrent(target);
self.hashChange();
})
.on('click', "[data-toggle='rst-current-version']", function() {
$("[data-toggle='rst-versions']").toggleClass("shift-up");
})
// Make tables responsive
$("table.docutils:not(.field-list)")
.wrap("<div class='wy-table-responsive'></div>");
// Add expand links to all parents of nested ul
$('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () {
var link = $(this);
expand = $('<span class="toctree-expand"></span>');
expand.on('click', function (ev) {
self.toggleCurrent(link);
ev.stopPropagation();
return false;
});
link.prepend(expand);
});
};
nav.reset = function () {
// Get anchor from URL and open up nested nav
var anchor = encodeURI(window.location.hash);
if (anchor) {
try {
var link = $('.wy-menu-vertical')
.find('[href="' + anchor + '"]');
$('.wy-menu-vertical li.toctree-l1 li.current')
.removeClass('current');
link.closest('li.toctree-l2').addClass('current');
link.closest('li.toctree-l3').addClass('current');
link.closest('li.toctree-l4').addClass('current');
}
catch (err) {
console.log("Error expanding nav for anchor", err);
}
}
};
nav.onScroll = function () {
this.winScroll = false;
var newWinPosition = this.win.scrollTop(),
winBottom = newWinPosition + this.winHeight,
navPosition = this.navBar.scrollTop(),
newNavPosition = navPosition + (newWinPosition - this.winPosition);
if (newWinPosition < 0 || winBottom > this.docHeight) {
return;
}
this.navBar.scrollTop(newNavPosition);
this.winPosition = newWinPosition;
};
nav.onResize = function () {
this.winResize = false;
this.winHeight = this.win.height();
this.docHeight = $(document).height();
};
nav.hashChange = function () {
this.linkScroll = true;
this.win.one('hashchange', function () {
this.linkScroll = false;
});
};
nav.toggleCurrent = function (elem) {
var parent_li = elem.closest('li');
parent_li.siblings('li.current').removeClass('current');
parent_li.siblings().find('li.current').removeClass('current');
parent_li.find('> ul li.current').removeClass('current');
parent_li.toggleClass('current');
}
return nav;
};
module.exports.ThemeNav = ThemeNav();
if (typeof(window) != 'undefined') {
window.SphinxRtdTheme = { StickyNav: module.exports.ThemeNav };
}
},{"jquery":"jquery"}]},{},["sphinx-rtd-theme"]);
require=(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({"sphinx-rtd-theme":[function(require,module,exports){
var jQuery = (typeof(window) != 'undefined') ? window.jQuery : require('jquery');
// Sphinx theme nav state
function ThemeNav () {
var nav = {
navBar: null,
win: null,
winScroll: false,
winResize: false,
linkScroll: false,
winPosition: 0,
winHeight: null,
docHeight: null,
isRunning: null
};
nav.enable = function () {
var self = this;
jQuery(function ($) {
self.init($);
self.reset();
self.win.on('hashchange', self.reset);
// Set scroll monitor
self.win.on('scroll', function () {
if (!self.linkScroll) {
self.winScroll = true;
}
});
setInterval(function () { if (self.winScroll) self.onScroll(); }, 25);
// Set resize monitor
self.win.on('resize', function () {
self.winResize = true;
});
setInterval(function () { if (self.winResize) self.onResize(); }, 25);
self.onResize();
});
};
nav.init = function ($) {
var doc = $(document),
self = this;
this.navBar = $('div.wy-side-scroll:first');
this.win = $(window);
// Set up javascript UX bits
$(document)
// Shift nav in mobile when clicking the menu.
.on('click', "[data-toggle='wy-nav-top']", function() {
$("[data-toggle='wy-nav-shift']").toggleClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
})
// Nav menu link click operations
.on('click', ".wy-menu-vertical .current ul li a", function() {
var target = $(this);
// Close menu when you click a link.
$("[data-toggle='wy-nav-shift']").removeClass("shift");
$("[data-toggle='rst-versions']").toggleClass("shift");
// Handle dynamic display of l3 and l4 nav lists
self.toggleCurrent(target);
self.hashChange();
})
.on('click', "[data-toggle='rst-current-version']", function() {
$("[data-toggle='rst-versions']").toggleClass("shift-up");
})
// Make tables responsive
$("table.docutils:not(.field-list)")
.wrap("<div class='wy-table-responsive'></div>");
// Add expand links to all parents of nested ul
$('.wy-menu-vertical ul').not('.simple').siblings('a').each(function () {
var link = $(this);
expand = $('<span class="toctree-expand"></span>');
expand.on('click', function (ev) {
self.toggleCurrent(link);
ev.stopPropagation();
return false;
});
link.prepend(expand);
});
};
nav.reset = function () {
// Get anchor from URL and open up nested nav
var anchor = encodeURI(window.location.hash);
if (anchor) {
try {
var link = $('.wy-menu-vertical')
.find('[href="' + anchor + '"]');
$('.wy-menu-vertical li.toctree-l1 li.current')
.removeClass('current');
link.closest('li.toctree-l2').addClass('current');
link.closest('li.toctree-l3').addClass('current');
link.closest('li.toctree-l4').addClass('current');
}
catch (err) {
console.log("Error expanding nav for anchor", err);
}
}
};
nav.onScroll = function () {
this.winScroll = false;
var newWinPosition = this.win.scrollTop(),
winBottom = newWinPosition + this.winHeight,
navPosition = this.navBar.scrollTop(),
newNavPosition = navPosition + (newWinPosition - this.winPosition);
if (newWinPosition < 0 || winBottom > this.docHeight) {
return;
}
this.navBar.scrollTop(newNavPosition);
this.winPosition = newWinPosition;
};
nav.onResize = function () {
this.winResize = false;
this.winHeight = this.win.height();
this.docHeight = $(document).height();
};
nav.hashChange = function () {
this.linkScroll = true;
this.win.one('hashchange', function () {
this.linkScroll = false;
});
};
nav.toggleCurrent = function (elem) {
var parent_li = elem.closest('li');
parent_li.siblings('li.current').removeClass('current');
parent_li.siblings().find('li.current').removeClass('current');
parent_li.find('> ul li.current').removeClass('current');
parent_li.toggleClass('current');
}
return nav;
};
module.exports.ThemeNav = ThemeNav();
if (typeof(window) != 'undefined') {
window.SphinxRtdTheme = { StickyNav: module.exports.ThemeNav };
}
},{"jquery":"jquery"}]},{},["sphinx-rtd-theme"]);
+86 -86
View File
@@ -1,86 +1,86 @@
from pygments.style import Style
from pygments.token import Keyword, Name, Comment, String, Error, \
Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
# Originally based on FlaskyStyle which was based on 'tango'.
class Alabaster(Style):
background_color = "#f8f8f8" # doesn't seem to override CSS 'pre' styling?
default_style = ""
styles = {
# No corresponding class for the following:
#Text: "", # class: ''
Whitespace: "underline #f8f8f8", # class: 'w'
Error: "#a40000 border:#ef2929", # class: 'err'
Other: "#000000", # class 'x'
Comment: "italic #8f5902", # class: 'c'
Comment.Preproc: "noitalic", # class: 'cp'
Keyword: "bold #004461", # class: 'k'
Keyword.Constant: "bold #004461", # class: 'kc'
Keyword.Declaration: "bold #004461", # class: 'kd'
Keyword.Namespace: "bold #004461", # class: 'kn'
Keyword.Pseudo: "bold #004461", # class: 'kp'
Keyword.Reserved: "bold #004461", # class: 'kr'
Keyword.Type: "bold #004461", # class: 'kt'
Operator: "#582800", # class: 'o'
Operator.Word: "bold #004461", # class: 'ow' - like keywords
Punctuation: "bold #000000", # class: 'p'
# because special names such as Name.Class, Name.Function, etc.
# are not recognized as such later in the parsing, we choose them
# to look the same as ordinary variables.
Name: "#000000", # class: 'n'
Name.Attribute: "#c4a000", # class: 'na' - to be revised
Name.Builtin: "#004461", # class: 'nb'
Name.Builtin.Pseudo: "#3465a4", # class: 'bp'
Name.Class: "#000000", # class: 'nc' - to be revised
Name.Constant: "#000000", # class: 'no' - to be revised
Name.Decorator: "#888", # class: 'nd' - to be revised
Name.Entity: "#ce5c00", # class: 'ni'
Name.Exception: "bold #cc0000", # class: 'ne'
Name.Function: "#000000", # class: 'nf'
Name.Property: "#000000", # class: 'py'
Name.Label: "#f57900", # class: 'nl'
Name.Namespace: "#000000", # class: 'nn' - to be revised
Name.Other: "#000000", # class: 'nx'
Name.Tag: "bold #004461", # class: 'nt' - like a keyword
Name.Variable: "#000000", # class: 'nv' - to be revised
Name.Variable.Class: "#000000", # class: 'vc' - to be revised
Name.Variable.Global: "#000000", # class: 'vg' - to be revised
Name.Variable.Instance: "#000000", # class: 'vi' - to be revised
Number: "#990000", # class: 'm'
Literal: "#000000", # class: 'l'
Literal.Date: "#000000", # class: 'ld'
String: "#4e9a06", # class: 's'
String.Backtick: "#4e9a06", # class: 'sb'
String.Char: "#4e9a06", # class: 'sc'
String.Doc: "italic #8f5902", # class: 'sd' - like a comment
String.Double: "#4e9a06", # class: 's2'
String.Escape: "#4e9a06", # class: 'se'
String.Heredoc: "#4e9a06", # class: 'sh'
String.Interpol: "#4e9a06", # class: 'si'
String.Other: "#4e9a06", # class: 'sx'
String.Regex: "#4e9a06", # class: 'sr'
String.Single: "#4e9a06", # class: 's1'
String.Symbol: "#4e9a06", # class: 'ss'
Generic: "#000000", # class: 'g'
Generic.Deleted: "#a40000", # class: 'gd'
Generic.Emph: "italic #000000", # class: 'ge'
Generic.Error: "#ef2929", # class: 'gr'
Generic.Heading: "bold #000080", # class: 'gh'
Generic.Inserted: "#00A000", # class: 'gi'
Generic.Output: "#888", # class: 'go'
Generic.Prompt: "#745334", # class: 'gp'
Generic.Strong: "bold #000000", # class: 'gs'
Generic.Subheading: "bold #800080", # class: 'gu'
Generic.Traceback: "bold #a40000", # class: 'gt'
}
from pygments.style import Style
from pygments.token import Keyword, Name, Comment, String, Error, \
Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
# Originally based on FlaskyStyle which was based on 'tango'.
class Alabaster(Style):
background_color = "#f8f8f8" # doesn't seem to override CSS 'pre' styling?
default_style = ""
styles = {
# No corresponding class for the following:
#Text: "", # class: ''
Whitespace: "underline #f8f8f8", # class: 'w'
Error: "#a40000 border:#ef2929", # class: 'err'
Other: "#000000", # class 'x'
Comment: "italic #8f5902", # class: 'c'
Comment.Preproc: "noitalic", # class: 'cp'
Keyword: "bold #004461", # class: 'k'
Keyword.Constant: "bold #004461", # class: 'kc'
Keyword.Declaration: "bold #004461", # class: 'kd'
Keyword.Namespace: "bold #004461", # class: 'kn'
Keyword.Pseudo: "bold #004461", # class: 'kp'
Keyword.Reserved: "bold #004461", # class: 'kr'
Keyword.Type: "bold #004461", # class: 'kt'
Operator: "#582800", # class: 'o'
Operator.Word: "bold #004461", # class: 'ow' - like keywords
Punctuation: "bold #000000", # class: 'p'
# because special names such as Name.Class, Name.Function, etc.
# are not recognized as such later in the parsing, we choose them
# to look the same as ordinary variables.
Name: "#000000", # class: 'n'
Name.Attribute: "#c4a000", # class: 'na' - to be revised
Name.Builtin: "#004461", # class: 'nb'
Name.Builtin.Pseudo: "#3465a4", # class: 'bp'
Name.Class: "#000000", # class: 'nc' - to be revised
Name.Constant: "#000000", # class: 'no' - to be revised
Name.Decorator: "#888", # class: 'nd' - to be revised
Name.Entity: "#ce5c00", # class: 'ni'
Name.Exception: "bold #cc0000", # class: 'ne'
Name.Function: "#000000", # class: 'nf'
Name.Property: "#000000", # class: 'py'
Name.Label: "#f57900", # class: 'nl'
Name.Namespace: "#000000", # class: 'nn' - to be revised
Name.Other: "#000000", # class: 'nx'
Name.Tag: "bold #004461", # class: 'nt' - like a keyword
Name.Variable: "#000000", # class: 'nv' - to be revised
Name.Variable.Class: "#000000", # class: 'vc' - to be revised
Name.Variable.Global: "#000000", # class: 'vg' - to be revised
Name.Variable.Instance: "#000000", # class: 'vi' - to be revised
Number: "#990000", # class: 'm'
Literal: "#000000", # class: 'l'
Literal.Date: "#000000", # class: 'ld'
String: "#4e9a06", # class: 's'
String.Backtick: "#4e9a06", # class: 'sb'
String.Char: "#4e9a06", # class: 'sc'
String.Doc: "italic #8f5902", # class: 'sd' - like a comment
String.Double: "#4e9a06", # class: 's2'
String.Escape: "#4e9a06", # class: 'se'
String.Heredoc: "#4e9a06", # class: 'sh'
String.Interpol: "#4e9a06", # class: 'si'
String.Other: "#4e9a06", # class: 'sx'
String.Regex: "#4e9a06", # class: 'sr'
String.Single: "#4e9a06", # class: 's1'
String.Symbol: "#4e9a06", # class: 'ss'
Generic: "#000000", # class: 'g'
Generic.Deleted: "#a40000", # class: 'gd'
Generic.Emph: "italic #000000", # class: 'ge'
Generic.Error: "#ef2929", # class: 'gr'
Generic.Heading: "bold #000080", # class: 'gh'
Generic.Inserted: "#00A000", # class: 'gi'
Generic.Output: "#888", # class: 'go'
Generic.Prompt: "#745334", # class: 'gp'
Generic.Strong: "bold #000000", # class: 'gs'
Generic.Subheading: "bold #800080", # class: 'gu'
Generic.Traceback: "bold #a40000", # class: 'gt'
}
+3 -3
View File
@@ -1,3 +1,3 @@
[theme]
inherit = basic
stylesheet = css/main.css
[theme]
inherit = basic
stylesheet = css/main.css
@@ -1,146 +1,146 @@
.. _bulk_provisioning:
Bulk Provisioning
=================
Data centers tend to land and install new machines in bulk. When dealing with
large quantities of new machines or hardware upgrades, data center admins may need
a way to install and configure with a minimal amount of effort. To support this
use case, the Clear Linux team has developed some tooling and instructions for
how to bulk-load machines with Clear Linux using iPXE.
This bulk provisioning scenario is a variation on the :ref:`network_boot` scenario,
with some alterations to facilitate installing and configuring many hosts. The Clear
Linux installer (``Ister``) was augmented to detect and find ``cloud-init`` configuration
data during the install. When this data is found, a :file:`cloud-init` file is fetched,
and the host, after being rebooted by ``ister``, uses micro-config drive (``ucf``) to
configure the host as directed by the :file:`cloud-init` configuration file.
In our pilot of this workflow, we used ``clear-cloud-init`` (which will become ucf - micro config drive)
to install the trust relationships for the host to be further managed by Ansible. The
:file:`cloud-init` configuration file was served by a simple little web application
that ``Ister`` knows how to query for host configuration data. This allowed us to
simultaneously power-on one hundred machines, each of which
* picked up the Clear Linux installer via PXE,
* installed Clear Linux,
* rebooted, and
* entered into a mode that can be managed through Ansible.
The web application that serves cloud-init configurations to ``Ister`` is uninspiringly named
"Ister Cloud Init Service" (ICIS), and is available at github - https://github.com/clearlinux/ister-cloud-init-svc
One nice attribute of this system is that once the iPXE bits are created, many installer
behaviors can be configured without having to regenerate the iPXE bits.
System Architecture
~~~~~~~~~~~~~~~~~~~
The following diagrams illustrate the system architecture.
.. image:: _static/images/icis_pxe_diagram.png
:align: center
:alt: pxe-server-overview
As can be seen, ICIS is a web application (specifically a Flask application, hence managed by ``uwsgi``
under nginx) that can run **anywhere** visible to hosts booting from PXE. In our example, we simply
hosted it on the same system serving the pxe content.
The following diagram illustrates the flow of information between the pxe server and a host booting
into the installer via pxe. This diagram is intended to show the logical flow of information, and
is not a literal depiction of the protocol-level exchanges.
.. image:: _static/images/icis_installer_workflow.png
:align: center
:alt: pxe-icis-install-workflow
Configuration Overview
~~~~~~~~~~~~~~~~~~~~~~
Here is a high-level overview describing set up and configuration of a bulk-provisioning solution.
* First, stand up an iPXE server as described in the :ref:`network_boot` docs. Note that you will
be generating your own artifacts to be served by PXE in a later step.
* Land `Ister Cloud Init Service <https://github.com/clearlinux/ister-cloud-init-svc>`_ on the
pxe server. The README in the ICIS github repo has directions on how to install and configure.
* Generate the installer that will load and boot over PXE. Copy the relevant files into the
appropriate location on the iPXE server.
A pxe installer is generated for every release of Clear Linux OS. It can be found alongside the
published images in https://download.clearlinux.org/releases/XXXXX/clear/clear-XXXXX-pxe.tar.xz
Alternatively, use the `create_pxe.sh <https://github.com/bryteise/ister/blob/master/create_pxe.sh>`_
script to roll your own. Note this creates the pxe-installer from the "provisioning" installer in
Clear Linux. This is a touchless installer that takes all installation information from a config
file. You can get this image from a given Clear Linux release by looking
in https://download.clearlinux.org/releases/XXXX/clear/ where XXXX is a Clear Linux release number.
Just download the image alongside the ``create_pxe.sh`` script and name it ``provision.img``.
* Stage config files for ``ister`` that will govern Ister's behavior. This includes modifying the
script for ipxe boot, getting it to pass an additional parameter to the kernel.
The magic that ties all of this together is that the pxe script conveys to ister the location of its configuration files via the kernel command line of the installer it kicks off. The kernel preserves its command line precisely, and ister inspects it via ``/proc/cmdline``.
Here is an example pxe script:
.. code-block:: console
#!ipxe
kernel linux quiet rdinit=/usr/lib/systemd/systemd-bootchart initcall_debug tsc=reliable
no_timer_check noreplace-smp rw initrd=initrd isterconf=http://192.168.1.1/icis/static/ister/ister.conf
initrd initrd
boot
When the pxe installer kicks off ``ister``, it will make note of the location of the ``conf`` file
that was given on the kernel command line, and fetch the file. This file then tells ``ister`` where
to get the json template file that describes partition schemes, and which version of Clear Linux to
install. This means that so long as the contents of a release are compatible with the version of
software update (``swupd``) in the installer, this pxe installer can be told to install a newer
version of Clear Linux simply by tweaking the json on the web server, rather than rolling an
entirely new installer.
One other important piece of configuration data in the json configuration file is the location of
an ICIS configuration service. Ister will query ICIS for a role using the MAC address of the network
interface being used to communicate with the ICIS service. Ister will then fetch that specific
:file:`cloud-init` file and ``configure ucd`` to run on first-boot against that config file.
The `Ister Cloud Init Service <https://github.com/clearlinux/ister-cloud-init-svc>`_ github repo
has example ister configuration files under ``static/ister``.
Here is an example ister-template.json file.
.. code-block:: console
{
"DestinationType" : "phyiscal",
"PartitionLayout" : [ { "disk" : "/dev/sda", "partition" : 1,
"size" : "64M", "type" : "EFI" },
{ "disk" : "/dev/sda", "partition" : 2,
"size" : "2G", "type" : "linux" } ],
"FilesystemTypes" : [ { "disk" : "/dev/sda", "partition" : 1, "type" : "vfat" },
{ "disk" : "/dev/sda", "partition" : 2, "type" : "ext4" } ],
"PartitionMountPoints" : [ { "disk" : "/dev/sda", "partition" : 1,
"mount" : "/boot" },
{ "disk" : "/dev/sda", "partition" : 2,
"mount" : "/" } ],
"Version": 6580,
"Bundles": ["kernel-native", "os-core-update", "os-core",
"bootloader", "sysadmin-hostmgmt", "openssh-server"],
"PostNonChroot": ["./installation-image-post-update-version.py"],
"IsterCloudInitSvc": ["http://192.168.1.1/icis/"]
}
* Configure ICIS to map MAC addresses to role files appropriately. Then create the role files, which
are ``cloud-init`` configuration files. Note, it is possible to simply specify a "default" role for
any unmatched MAC address; this may be handy when all install targets are to be configured identically.
* Final pre-flight check. Assuming your iPXE server is at 192.168.1.1, all of the following urls need to be working.
- http://192.168.1.1/icis/static/ister/ister.conf
- http://192.168.1.1/icis/static/ister/ister_config.json
- http://192.168.1.1/icis/get_config/<MAC ADDR>
- http://192.168.1.1/icis/get_role/<role returned from previous url>
- http://192.168.1.1/ipxe_boot_script.txt
* Boot an iPXE client and watch Clear Linux install.
.. _bulk_provisioning:
Bulk Provisioning
=================
Data centers tend to land and install new machines in bulk. When dealing with
large quantities of new machines or hardware upgrades, data center admins may need
a way to install and configure with a minimal amount of effort. To support this
use case, the Clear Linux team has developed some tooling and instructions for
how to bulk-load machines with Clear Linux using iPXE.
This bulk provisioning scenario is a variation on the :ref:`network_boot` scenario,
with some alterations to facilitate installing and configuring many hosts. The Clear
Linux installer (``Ister``) was augmented to detect and find ``cloud-init`` configuration
data during the install. When this data is found, a :file:`cloud-init` file is fetched,
and the host, after being rebooted by ``ister``, uses micro-config drive (``ucf``) to
configure the host as directed by the :file:`cloud-init` configuration file.
In our pilot of this workflow, we used ``clear-cloud-init`` (which will become ucf - micro config drive)
to install the trust relationships for the host to be further managed by Ansible. The
:file:`cloud-init` configuration file was served by a simple little web application
that ``Ister`` knows how to query for host configuration data. This allowed us to
simultaneously power-on one hundred machines, each of which
* picked up the Clear Linux installer via PXE,
* installed Clear Linux,
* rebooted, and
* entered into a mode that can be managed through Ansible.
The web application that serves cloud-init configurations to ``Ister`` is uninspiringly named
"Ister Cloud Init Service" (ICIS), and is available at github - https://github.com/clearlinux/ister-cloud-init-svc
One nice attribute of this system is that once the iPXE bits are created, many installer
behaviors can be configured without having to regenerate the iPXE bits.
System Architecture
~~~~~~~~~~~~~~~~~~~
The following diagrams illustrate the system architecture.
.. image:: ../_static/images/advanced/icis_pxe_diagram.png
:align: center
:alt: pxe-server-overview
As can be seen, ICIS is a web application (specifically a Flask application, hence managed by ``uwsgi``
under nginx) that can run **anywhere** visible to hosts booting from PXE. In our example, we simply
hosted it on the same system serving the pxe content.
The following diagram illustrates the flow of information between the pxe server and a host booting
into the installer via pxe. This diagram is intended to show the logical flow of information, and
is not a literal depiction of the protocol-level exchanges.
.. image:: ../_static/images/advanced/icis_installer_workflow.png
:align: center
:alt: pxe-icis-install-workflow
Configuration Overview
~~~~~~~~~~~~~~~~~~~~~~
Here is a high-level overview describing set up and configuration of a bulk-provisioning solution.
* First, stand up an iPXE server as described in the :ref:`network_boot` docs. Note that you will
be generating your own artifacts to be served by PXE in a later step.
* Land `Ister Cloud Init Service <https://github.com/clearlinux/ister-cloud-init-svc>`_ on the
pxe server. The README in the ICIS github repo has directions on how to install and configure.
* Generate the installer that will load and boot over PXE. Copy the relevant files into the
appropriate location on the iPXE server.
A pxe installer is generated for every release of Clear Linux OS. It can be found alongside the
published images in https://download.clearlinux.org/releases/XXXXX/clear/clear-XXXXX-pxe.tar.xz
Alternatively, use the `create_pxe.sh <https://github.com/bryteise/ister/blob/master/create_pxe.sh>`_
script to roll your own. Note this creates the pxe-installer from the "provisioning" installer in
Clear Linux. This is a touchless installer that takes all installation information from a config
file. You can get this image from a given Clear Linux release by looking
in https://download.clearlinux.org/releases/XXXX/clear/ where XXXX is a Clear Linux release number.
Just download the image alongside the ``create_pxe.sh`` script and name it ``provision.img``.
* Stage config files for ``ister`` that will govern Ister's behavior. This includes modifying the
script for ipxe boot, getting it to pass an additional parameter to the kernel.
The magic that ties all of this together is that the pxe script conveys to ister the location of its configuration files via the kernel command line of the installer it kicks off. The kernel preserves its command line precisely, and ister inspects it via ``/proc/cmdline``.
Here is an example pxe script:
.. code-block:: console
#!ipxe
kernel linux quiet rdinit=/usr/lib/systemd/systemd-bootchart initcall_debug tsc=reliable
no_timer_check noreplace-smp rw initrd=initrd isterconf=http://192.168.1.1/icis/static/ister/ister.conf
initrd initrd
boot
When the pxe installer kicks off ``ister``, it will make note of the location of the ``conf`` file
that was given on the kernel command line, and fetch the file. This file then tells ``ister`` where
to get the json template file that describes partition schemes, and which version of Clear Linux to
install. This means that so long as the contents of a release are compatible with the version of
software update (``swupd``) in the installer, this pxe installer can be told to install a newer
version of Clear Linux simply by tweaking the json on the web server, rather than rolling an
entirely new installer.
One other important piece of configuration data in the json configuration file is the location of
an ICIS configuration service. Ister will query ICIS for a role using the MAC address of the network
interface being used to communicate with the ICIS service. Ister will then fetch that specific
:file:`cloud-init` file and ``configure ucd`` to run on first-boot against that config file.
The `Ister Cloud Init Service <https://github.com/clearlinux/ister-cloud-init-svc>`_ github repo
has example ister configuration files under ``static/ister``.
Here is an example ister-template.json file.
.. code-block:: console
{
"DestinationType" : "phyiscal",
"PartitionLayout" : [ { "disk" : "/dev/sda", "partition" : 1,
"size" : "64M", "type" : "EFI" },
{ "disk" : "/dev/sda", "partition" : 2,
"size" : "2G", "type" : "linux" } ],
"FilesystemTypes" : [ { "disk" : "/dev/sda", "partition" : 1, "type" : "vfat" },
{ "disk" : "/dev/sda", "partition" : 2, "type" : "ext4" } ],
"PartitionMountPoints" : [ { "disk" : "/dev/sda", "partition" : 1,
"mount" : "/boot" },
{ "disk" : "/dev/sda", "partition" : 2,
"mount" : "/" } ],
"Version": 6580,
"Bundles": ["kernel-native", "os-core-update", "os-core",
"bootloader", "sysadmin-hostmgmt", "openssh-server"],
"PostNonChroot": ["./installation-image-post-update-version.py"],
"IsterCloudInitSvc": ["http://192.168.1.1/icis/"]
}
* Configure ICIS to map MAC addresses to role files appropriately. Then create the role files, which
are ``cloud-init`` configuration files. Note, it is possible to simply specify a "default" role for
any unmatched MAC address; this may be handy when all install targets are to be configured identically.
* Final pre-flight check. Assuming your iPXE server is at 192.168.1.1, all of the following urls need to be working.
- http://192.168.1.1/icis/static/ister/ister.conf
- http://192.168.1.1/icis/static/ister/ister_config.json
- http://192.168.1.1/icis/get_config/<MAC ADDR>
- http://192.168.1.1/icis/get_role/<role returned from previous url>
- http://192.168.1.1/ipxe_boot_script.txt
* Boot an iPXE client and watch Clear Linux install.
@@ -1,439 +1,439 @@
.. _clear_containers.rst:
Intel® Clear Containers
#######################
Introduction
============
Intel® Clear Containers is a collection of tools, configurations,
and techniques anchored on an implementation that leverages Intel®
Architecture to optimize container launching and execution workflow.
These optimizations improve speed, size, and efficiency while offering
a number of benefits that can be derived only from hardware-backed
virtual machines (hardware-enforced isolation and security, for
example) on Intel® VT technology.
These methods are applied across all levels of the host/virtual machine
hierarchy: from the host-side userland software stack down through the host
Linux* kernel, and into the client-side kernel and userland.
Although it is available as a standalone offering, the Clear Containers
technology works best when it is able to leverage optimizations designed
into the Clear Linux Project.
Customers can integrate all or parts of Intel Clear Containers into a
container infrastructure.
.. _architecture_overview.rst:
Architecture Overview
=====================
Intel Clear Containers are architected around the Linux
:abbr:`Kernel Virtual Machine (KVM)` virtualization infrastructure to
make best use of Intel Architecture VT features. Operational speed
gets improved and overhead gets reduced by optimizing existing code,
removing redundant components, and implementing new techniques for
containers with :abbr:`KVM (Kernel Virtual Machine)`.
Version 1.0 of Clear Containers was designed as a lightweight container
system based around `kvmtool`_'s ``lkvm``,
:abbr:`KVM (Kernel Virtual Machine)` and Intel VT-x features; the
initial version was aimed primarily at Docker* integration. Version
2.0 replaces ``lkvm`` with a lightweight version of
:abbr:`QEMU (Quick EMUlator)` `(link) <http:www.qemu.org>`_.
Version 2.0 also expands the feature set to include key technologies, such
as `SR-IOV`_, and the :abbr:`Open Container Initiative (OCI)` runtime API.
V1.0
====
V1.0 (also known as **Intel® Clear Containers for Docker
Engine**) is based around `kvmtool`_, with example host integrations for
Docker and `rkt`_.
.. figure:: _static/images/clear-containers-v1.png
:align: center
:alt: Intel Clear Containers V1.0
Host kernel optimizations
-------------------------
Intel Clear Containers operate better when a number of host kernel features and
optimizations are applied:
* Enabling :abbr:`Kernel Samepage Merging (KSM)` in the host kernel
is recommended for efficient page sharing of VM pages. Kernel documentation
can be found in Documentation/vm/ksm.txt Config symbol: ``CONFIG_KSM``
* Using a kernel version >= v4.0 (or backporting appropriate
patches if your kernel version is less than v4.0), to get the best
:abbr:`KVM (Kernel Virtual Machine)` VM startup times
.. note::
Intel :abbr:`Extended Page Table (EPT)` acceleration will be
automatically detected and used by your host kernel if supported
by your hardware. You can check whether this feature is present by
looking for the ``ept`` string in the :file:`/proc/cpuinfo` of your
system. See `mmu.txt`_ for more details.
Host user space
---------------
Intel Clear Containers V1.0 host user space is based around `kvmtool`_ as a fast
and lightweight hypervisor. Optimizations to `kvmtool`_ include:
* **File access**, enabling efficient *shmem* / *pci-bar* / :abbr:`Direct
Access (DAX)` file access to client.
* **Less verbosity**.
* **Minimal UART scanning** to improve speed.
* **TSC timer functionality changes** passing the client apic timer
calibration step speeds up container creation time.
* Adding ability to **skip unused features**, (such as creation of a
custom rootfs).
* **Removing need for BIOS** saves boot time.
* **No bootloader required** speeds up initial booting of a machine.
* **Direct kernel boot** -- The hypervisor can boot the kernel directly as
an uncompressed ELF binary. Although the kernel image is slightly larger
than a compressed one, it is faster to read and boot the larger
file than it is to uncompress and boot the slightly smaller file.
Client mini-OS
--------------
Intel Clear Containers V1.0 uses an optimized client user space (mini-OS) as its
primary launch vehicle to execute workload commands. The mini-OS is built
with a Clear Linux distribution that has an optimized configuration for
time and space efficiency. The mini-OS includes:
* Minimized ``systemd`` configuration
* Optimized ``libc``
* Custom AutoFDO settings
* Optimized multi-lib runtime support
* Optimized kernel config (speed and size)
The mini-OS configuration can be modified and rebuilt by customers for their
own use cases, which may preclude the need to load further client images.
Client customer images
----------------------
Intel Clear Containers V1.0 mini-OS workloads can be used to bootstrap further
customer images. These customer images would generally be mapped into the
client via the host filesystem using :abbr:`9p (Plan 9 9p remote filesystem
protocol)`, :abbr:`DAX (Direct Access)` or other filesystem and virtual
device interfaces. These customer images could, for example:
* Mount a new subtree containing a payload and execute it.
* Mount a new subsystem and chroot to it for contained execution.
The mini-OS image has been optimized for size and speed. It may be replaced
or superseded -- in whole or in part -- by customer-created images. Keep
in mind, of course, that any benefits the mini-OS provides may be lost
unless equivalent optimizations exist in the customer-created image, or have
been migrated into the image they create.
V2.0
====
Intel Clear Containers V2.0 adopts an optimized version of the established `QEMU`_
host virtualization engine, in order to support extra features not found in
Clear Containers V1.0. Clear Containers. V2.0 is also compatible with the
:abbr:`OCI (Open Container Initiative)` runtime-specification standard,
introducing a host-side abstraction tool to ease host-side integration and to
isolate integration instances from future changes to the underlying Clear
Containers architecture.
.. figure:: _static/images/clear-containers-v2.png
:align: center
:alt: Clear Containers V2.0
Host kernel optimizations
-------------------------
V2.0 host kernel optimizations are currently the same as
the V1.0 optimizations.
Host user space
---------------
Host user space is based around an optimized version of `QEMU`_ called
``qemu-lite``, with an :abbr:`OCI (Open Container Initiative)`
runtime-compliant wrapper called ``cor``.
Our version of ``qemu-lite`` has the following modifications:
* :abbr:`DAX (Direct Access)` support, **enabling fast and space efficient**
file access through zero-copy mapping and multi-container sharing of raw
client filesystem images from the host filesystem.
* **Reduced "slimline" PC model** to reduce startup costs in both `QEMU`_
and the client kernel.
* **Removed need for BIOS**, saving boot time.
* **No bootloader requirement**, to speed up boot.
* **Reduced memory footprint** by disabling memory-hungry features that
are not required by the client system.
* **Direct kernel boot**, allowing fast booting by loading the kernel as
an uncompressed ELF binary. Although the kernel image is slightly larger
than a compressed one, it is faster to read and boot the larger
file than it is to uncompress and boot the slightly smaller file.
* **Added an** :abbr:`OCI (Open Container Initiative)` **runtime-compliant
wrapper**, AKA ``cor``, for easier integration with
:abbr:`OCI (Open Container Initiative)`-compliant host orchestration systems.
Client mini-OS
--------------
The Client mini-OS is based on the same Clear Linux OS-based system as
used in Intel Clear Containers V1.0; however, it may be built from more
recent versions and with more current components, such as the kernel version.
Client customer images
----------------------
Client customer images are supported in the same manner as they are
in V1.0.
Architectural component details
===============================
Host kernel components
----------------------
:abbr:`Kernel SamePage Merging (KSM)`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Linux Kernel Documentation: Documentation/vm/ksm.txt
:abbr:`KSM (Kernel Samepage Merging)` allows the kernel to locate
and merge (share) identical memory pages within the system, even
when they are not sourced from the same binary. When sourced from
the same binary, the kernel will naturally share through the
:abbr:`copy-on-write (COW)` method.
:abbr:`KSM (Kernel Samepage Merging)` also allows the kernel to
localize and to coalesce pages from within virtual machine memory
spaces that would not normally be shared, thus saving memory space.
To enable :abbr:`KSM (Kernel Samepage Merging)`, check that your host kernel
config includes ``CONFIG_KSM``, and that your host system is running the
``ksmd`` daemon.
:abbr:`EPT (Extended Page Tables)`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Linux Kernel Documentation: Documentation/virtual/kvm/mmu.txt
:abbr:`EPT (Extended Page Tables)` is an acceleration technology for virtual
machine memory mappings. It reduces the number of Virtual Machine Manager
entry/exits from the host system, thus improving system performance. If your
hardware system supports :abbr:`EPT (Extended Page Tables)`, you'll see the
``ept`` feature listed in the ``/proc/cpuinfo`` information from your system.
The kernel, :abbr:`KVM (Kernel Virtual Machine)` and `QEMU`_ will
automatically use and benefit from :abbr:`EPT (Extended Page Tables)`
when supported by your system hardware.
You can also check on the `Intel ARK website`_ to see if your Intel CPU
supports **Intel VT-x with Extended Page Tables**; check under the
*Advanced Technologies* table on the specific page for your CPU.
:abbr:`KVM (Kernel Virtual Machine)` startup optimizations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Host kernel startup was optimized before the Linux kernel v4.0
release by removing some unnecessary ``synchronize_rcu()`` calls. You
should ensure your kernel is at least v4.0, or that you have backported
any appropriate patches to your host kernel: the ``synchronize_rcu() opt``,
at the very least.
.. We should add a Persistent data (how do we do that on R/O or COW'd
filesystems for instance?
[do we have a standard pattern to do for these docs?]
Persistence
~~~~~~~~~~~
Host tooling
------------
Kvmtool
~~~~~~~
Kvmtool is used in Intel Clear Containers V1.0 for virtual machine
configuration and management. It was chosen because it is lighter
and faster than the alternatives, and it's also easy to modify.
Modifications to `kvmtool`_ include:
* Implementation of **copy-free** :abbr:`DAX (Direct Access)` **file-system
access**.
* **Less verbosity**.
* **Minimal UART scanning** to improve speed.
* **TSC timer functionality changes** passing the client apic timer
calibration step speeds up container creation time.
* Adding ability to **skip unused features**, (such as creation of a
custom rootfs).
* **Removing need for BIOS** saves boot time.
* **No bootloader required** speeds up initial booting of a machine.
* **Direct kernel boot** -- The hypervisor can boot the kernel directly as
an uncompressed ELF binary. Although the kernel image is slightly larger
than a compressed one, it ends up being faster to read and boot the larger
file than it is to uncompress and boot the slightly smaller file.
.. _qemu-lite:
qemu-lite
~~~~~~~~~
``qemu-lite`` is a modified version of `QEMU`_ used for the virtual
machine configuration and management in Intel Clear Containers 2.0.
The modifications made beyond generic `QEMU`_ are described in the
following sections:
:abbr:`DAX (Direct Access)` enablement
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:abbr:`DAX (Direct Access)` enablement under ``qemu-lite`` utilizes
existing `QEMU`_ ``nvdimm memdev`` functionality.
PC-lite
^^^^^^^
A new `QEMU`_ PC model, called pc-lite, has been added that removes
all unused or unnecessary PC style elements from the machine emulation
that are not required for the client VM. This improves both speed of
execution and memory footprint.
Cor
^^^
Cor (the Clear :abbr:`OCI (Open Container Initiative)` runtime manager)
implements the :abbr:`OCI (Open Container Initiative)` runtime specification
atop of the V2.0 infrastructure (such as ``qemu-lite``). By
utilizing Cor, your :abbr:`OCI (Open Container Initiative)`-compliant system
can be implemented with Clear Containers whilst also insulating
the user against any future underlying changes in Clear Containers,
thus allowing easier future integration of upgrades. Cor currently
supports :abbr:`OCI (Open Container Initiative)` runtime version 0.6.0.
Client components
~~~~~~~~~~~~~~~~~
The client-side components consist of the mini-OS kernel and root
filesystem, and optionally further customer specific items, such as
a further fuller distribution or system to load. The intention is
that customers may either extend and expand the mini-OS as required,
or they can use the mini-OS to further load a complete self-contained
image of their choice.
Client mini-OS
^^^^^^^^^^^^^^
The mini-OS is an optimized version of Clear Linux OS for Intel Architecture
which has been designed for the fastest and smallest container boot. The
mini-OS consists of a Linux kernel image and root filesystem image.
* **Kernel** -- The mini-OS's kernel is a Clear Linux kernel containing
the minimum feature set required to boot the client container. The kernel
has optimized for space and speed. This kernel can be modified and
re-built as desired, for specific requirements.
* **DAX** -- The :abbr:`Direct Access (DAX)` filesystem.
(Linux Kernel Documentation: ``Documentation/filesystems/dax.txt``).
Mapping host-side files into the memory map of the client allows the use of
:abbr:`DAX (Direct Access)` to directly mount those files, bypassing the
client side page cache and the virtual device mechanisms between host and
client. This allows efficient zero-copy mapping and replaces costly virtual
device manipulations with efficient page fault handling, thus being faster
and more space-efficient than other filesystem mount methods. :abbr:`DAX
(Direct Access)` is enabled in Intel Clear Containers V1.0 using a shmem
PCI-BAR mechanism configured by `kvmtool`_.
.. figure:: _static/images/dax-v1.png
:align: center
:abbr:`DAX (Direct Access)` is enabled in Intel Clear Containers
V2.0 using an NVDIMM `QEMU`_ memdev mechanism:
.. figure:: _static/images/dax-v2.png
:align: center
:abbr:`DAX (Direct Access)` can only be used to mount single flat files
from the host side (such as uncompressed filesystems), and not trees of
files in the host filesystem. More than one :abbr:`DAX (Direct Access)`
mount can be utilized though. :abbr:`DAX (Direct Access)` is limited only
by the virtual address space available, so it can easily accommodate large
file mappings.
:abbr:`DAX (Direct Access)` support was introduced in v4.0 of the kernel.
Also see the `qemu-lite`_ section.
* **Rootfs image** -- The mini-OS rootfs image is a Clear Linux
rootfs. It can execute the client workload and be modified and
extended using the bundle method to enable further features as
necessary. It can also be used to further execute another client
container image, such as a different Linux distribution.
Customer Client images and workloads
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Customers may use their own client images by instructing
the mini-OS to execute them using the mini-OS workload. Please
refer to the `Intel Clear Containers integration guide`_ for
further detail.
.. removed this section since it is in the GSG
FAQ
===
**Q.** "Can I run Clear Containers on any host Linux?"
**A.** Yes, any up-to-date or recent Linux host should be able to run Clear
Containers, as long as the host system kernel contains the necessary
features and is configured with the necessary support enabled.
.. [to do: finish this section]
**Q.** "Do I need to use all of Clear Containers, or can I cherry pick parts?"
**A.** You can cherry pick the parts of Clear Containers you need. Some parts
will make your life generally easier (such as the `QEMU`_ wrapper tool
``cor``) and will help insulate you from future development changes, so you
should consider which parts you need for which features. The client
side obviously can be quite flexible in its configuration depending
on the deployment environment.
**Q.** "Can I use Clear Containers technology to run other VMs, not just
container style ones?"
**A.** Yes, the underlying mechanisms and accelerations used for Clear
Containers can be applied to any Virtual Machine setup, not just
those that are based around a container style workflow.
.. _SR-IOV: http://www.intel.com/content/www/us/en/pci-express/pci-sig-sr-iov-primer-sr-iov-technology-paper.html
.. _QEMU: http://www.qemu.org
.. _mmu.txt: Documentation/virtual/kvm/mmu.txt
.. _Intel ARK website: http://ark.intel.com
.. _kvmtool: https://git.kernel.org/cgit/linux/kernel/git/will/kvmtool.git/
.. _rkt: https://coreos.com/rkt/
.. _clear_containers.rst:
Intel® Clear Containers
#######################
Introduction
============
Intel® Clear Containers is a collection of tools, configurations,
and techniques anchored on an implementation that leverages Intel®
Architecture to optimize container launching and execution workflow.
These optimizations improve speed, size, and efficiency while offering
a number of benefits that can be derived only from hardware-backed
virtual machines (hardware-enforced isolation and security, for
example) on Intel® VT technology.
These methods are applied across all levels of the host/virtual machine
hierarchy: from the host-side userland software stack down through the host
Linux* kernel, and into the client-side kernel and userland.
Although it is available as a standalone offering, the Clear Containers
technology works best when it is able to leverage optimizations designed
into the Clear Linux Project.
Customers can integrate all or parts of Intel Clear Containers into a
container infrastructure.
.. _architecture_overview.rst:
Architecture Overview
=====================
Intel Clear Containers are architected around the Linux
:abbr:`Kernel Virtual Machine (KVM)` virtualization infrastructure to
make best use of Intel Architecture VT features. Operational speed
gets improved and overhead gets reduced by optimizing existing code,
removing redundant components, and implementing new techniques for
containers with :abbr:`KVM (Kernel Virtual Machine)`.
Version 1.0 of Clear Containers was designed as a lightweight container
system based around `kvmtool`_'s ``lkvm``,
:abbr:`KVM (Kernel Virtual Machine)` and Intel VT-x features; the
initial version was aimed primarily at Docker* integration. Version
2.0 replaces ``lkvm`` with a lightweight version of
:abbr:`QEMU (Quick EMUlator)` `(link) <http:www.qemu.org>`_.
Version 2.0 also expands the feature set to include key technologies, such
as `SR-IOV`_, and the :abbr:`Open Container Initiative (OCI)` runtime API.
V1.0
====
V1.0 (also known as **Intel® Clear Containers for Docker
Engine**) is based around `kvmtool`_, with example host integrations for
Docker and `rkt`_.
.. figure:: ../_static/images/advanced/clear-containers-v1.png
:align: center
:alt: Intel Clear Containers V1.0
Host kernel optimizations
-------------------------
Intel Clear Containers operate better when a number of host kernel features and
optimizations are applied:
* Enabling :abbr:`Kernel Samepage Merging (KSM)` in the host kernel
is recommended for efficient page sharing of VM pages. Kernel documentation
can be found in Documentation/vm/ksm.txt Config symbol: ``CONFIG_KSM``
* Using a kernel version >= v4.0 (or backporting appropriate
patches if your kernel version is less than v4.0), to get the best
:abbr:`KVM (Kernel Virtual Machine)` VM startup times
.. note::
Intel :abbr:`Extended Page Table (EPT)` acceleration will be
automatically detected and used by your host kernel if supported
by your hardware. You can check whether this feature is present by
looking for the ``ept`` string in the :file:`/proc/cpuinfo` of your
system. See `mmu.txt`_ for more details.
Host user space
---------------
Intel Clear Containers V1.0 host user space is based around `kvmtool`_ as a fast
and lightweight hypervisor. Optimizations to `kvmtool`_ include:
* **File access**, enabling efficient *shmem* / *pci-bar* / :abbr:`Direct
Access (DAX)` file access to client.
* **Less verbosity**.
* **Minimal UART scanning** to improve speed.
* **TSC timer functionality changes** passing the client apic timer
calibration step speeds up container creation time.
* Adding ability to **skip unused features**, (such as creation of a
custom rootfs).
* **Removing need for BIOS** saves boot time.
* **No bootloader required** speeds up initial booting of a machine.
* **Direct kernel boot** -- The hypervisor can boot the kernel directly as
an uncompressed ELF binary. Although the kernel image is slightly larger
than a compressed one, it is faster to read and boot the larger
file than it is to uncompress and boot the slightly smaller file.
Client mini-OS
--------------
Intel Clear Containers V1.0 uses an optimized client user space (mini-OS) as its
primary launch vehicle to execute workload commands. The mini-OS is built
with a Clear Linux distribution that has an optimized configuration for
time and space efficiency. The mini-OS includes:
* Minimized ``systemd`` configuration
* Optimized ``libc``
* Custom AutoFDO settings
* Optimized multi-lib runtime support
* Optimized kernel config (speed and size)
The mini-OS configuration can be modified and rebuilt by customers for their
own use cases, which may preclude the need to load further client images.
Client customer images
----------------------
Intel Clear Containers V1.0 mini-OS workloads can be used to bootstrap further
customer images. These customer images would generally be mapped into the
client via the host filesystem using :abbr:`9p (Plan 9 9p remote filesystem
protocol)`, :abbr:`DAX (Direct Access)` or other filesystem and virtual
device interfaces. These customer images could, for example:
* Mount a new subtree containing a payload and execute it.
* Mount a new subsystem and chroot to it for contained execution.
The mini-OS image has been optimized for size and speed. It may be replaced
or superseded -- in whole or in part -- by customer-created images. Keep
in mind, of course, that any benefits the mini-OS provides may be lost
unless equivalent optimizations exist in the customer-created image, or have
been migrated into the image they create.
V2.0
====
Intel Clear Containers V2.0 adopts an optimized version of the established `QEMU`_
host virtualization engine, in order to support extra features not found in
Clear Containers V1.0. Clear Containers. V2.0 is also compatible with the
:abbr:`OCI (Open Container Initiative)` runtime-specification standard,
introducing a host-side abstraction tool to ease host-side integration and to
isolate integration instances from future changes to the underlying Clear
Containers architecture.
.. figure:: ../_static/images/advanced/clear-containers-v2.png
:align: center
:alt: Clear Containers V2.0
Host kernel optimizations
-------------------------
V2.0 host kernel optimizations are currently the same as
the V1.0 optimizations.
Host user space
---------------
Host user space is based around an optimized version of `QEMU`_ called
``qemu-lite``, with an :abbr:`OCI (Open Container Initiative)`
runtime-compliant wrapper called ``cor``.
Our version of ``qemu-lite`` has the following modifications:
* :abbr:`DAX (Direct Access)` support, **enabling fast and space efficient**
file access through zero-copy mapping and multi-container sharing of raw
client filesystem images from the host filesystem.
* **Reduced "slimline" PC model** to reduce startup costs in both `QEMU`_
and the client kernel.
* **Removed need for BIOS**, saving boot time.
* **No bootloader requirement**, to speed up boot.
* **Reduced memory footprint** by disabling memory-hungry features that
are not required by the client system.
* **Direct kernel boot**, allowing fast booting by loading the kernel as
an uncompressed ELF binary. Although the kernel image is slightly larger
than a compressed one, it is faster to read and boot the larger
file than it is to uncompress and boot the slightly smaller file.
* **Added an** :abbr:`OCI (Open Container Initiative)` **runtime-compliant
wrapper**, AKA ``cor``, for easier integration with
:abbr:`OCI (Open Container Initiative)`-compliant host orchestration systems.
Client mini-OS
--------------
The Client mini-OS is based on the same Clear Linux OS-based system as
used in Intel Clear Containers V1.0; however, it may be built from more
recent versions and with more current components, such as the kernel version.
Client customer images
----------------------
Client customer images are supported in the same manner as they are
in V1.0.
Architectural component details
===============================
Host kernel components
----------------------
:abbr:`Kernel SamePage Merging (KSM)`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Linux Kernel Documentation: Documentation/vm/ksm.txt
:abbr:`KSM (Kernel Samepage Merging)` allows the kernel to locate
and merge (share) identical memory pages within the system, even
when they are not sourced from the same binary. When sourced from
the same binary, the kernel will naturally share through the
:abbr:`copy-on-write (COW)` method.
:abbr:`KSM (Kernel Samepage Merging)` also allows the kernel to
localize and to coalesce pages from within virtual machine memory
spaces that would not normally be shared, thus saving memory space.
To enable :abbr:`KSM (Kernel Samepage Merging)`, check that your host kernel
config includes ``CONFIG_KSM``, and that your host system is running the
``ksmd`` daemon.
:abbr:`EPT (Extended Page Tables)`
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Linux Kernel Documentation: Documentation/virtual/kvm/mmu.txt
:abbr:`EPT (Extended Page Tables)` is an acceleration technology for virtual
machine memory mappings. It reduces the number of Virtual Machine Manager
entry/exits from the host system, thus improving system performance. If your
hardware system supports :abbr:`EPT (Extended Page Tables)`, you'll see the
``ept`` feature listed in the ``/proc/cpuinfo`` information from your system.
The kernel, :abbr:`KVM (Kernel Virtual Machine)` and `QEMU`_ will
automatically use and benefit from :abbr:`EPT (Extended Page Tables)`
when supported by your system hardware.
You can also check on the `Intel ARK website`_ to see if your Intel CPU
supports **Intel VT-x with Extended Page Tables**; check under the
*Advanced Technologies* table on the specific page for your CPU.
:abbr:`KVM (Kernel Virtual Machine)` startup optimizations
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Host kernel startup was optimized before the Linux kernel v4.0
release by removing some unnecessary ``synchronize_rcu()`` calls. You
should ensure your kernel is at least v4.0, or that you have backported
any appropriate patches to your host kernel: the ``synchronize_rcu() opt``,
at the very least.
.. We should add a Persistent data (how do we do that on R/O or COW'd
filesystems for instance?
[do we have a standard pattern to do for these docs?]
Persistence
~~~~~~~~~~~
Host tooling
------------
Kvmtool
~~~~~~~
Kvmtool is used in Intel Clear Containers V1.0 for virtual machine
configuration and management. It was chosen because it is lighter
and faster than the alternatives, and it's also easy to modify.
Modifications to `kvmtool`_ include:
* Implementation of **copy-free** :abbr:`DAX (Direct Access)` **file-system
access**.
* **Less verbosity**.
* **Minimal UART scanning** to improve speed.
* **TSC timer functionality changes** passing the client apic timer
calibration step speeds up container creation time.
* Adding ability to **skip unused features**, (such as creation of a
custom rootfs).
* **Removing need for BIOS** saves boot time.
* **No bootloader required** speeds up initial booting of a machine.
* **Direct kernel boot** -- The hypervisor can boot the kernel directly as
an uncompressed ELF binary. Although the kernel image is slightly larger
than a compressed one, it ends up being faster to read and boot the larger
file than it is to uncompress and boot the slightly smaller file.
.. _qemu-lite:
qemu-lite
~~~~~~~~~
``qemu-lite`` is a modified version of `QEMU`_ used for the virtual
machine configuration and management in Intel Clear Containers 2.0.
The modifications made beyond generic `QEMU`_ are described in the
following sections:
:abbr:`DAX (Direct Access)` enablement
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:abbr:`DAX (Direct Access)` enablement under ``qemu-lite`` utilizes
existing `QEMU`_ ``nvdimm memdev`` functionality.
PC-lite
^^^^^^^
A new `QEMU`_ PC model, called pc-lite, has been added that removes
all unused or unnecessary PC style elements from the machine emulation
that are not required for the client VM. This improves both speed of
execution and memory footprint.
Cor
^^^
Cor (the Clear :abbr:`OCI (Open Container Initiative)` runtime manager)
implements the :abbr:`OCI (Open Container Initiative)` runtime specification
atop of the V2.0 infrastructure (such as ``qemu-lite``). By
utilizing Cor, your :abbr:`OCI (Open Container Initiative)`-compliant system
can be implemented with Clear Containers whilst also insulating
the user against any future underlying changes in Clear Containers,
thus allowing easier future integration of upgrades. Cor currently
supports :abbr:`OCI (Open Container Initiative)` runtime version 0.6.0.
Client components
~~~~~~~~~~~~~~~~~
The client-side components consist of the mini-OS kernel and root
filesystem, and optionally further customer specific items, such as
a further fuller distribution or system to load. The intention is
that customers may either extend and expand the mini-OS as required,
or they can use the mini-OS to further load a complete self-contained
image of their choice.
Client mini-OS
^^^^^^^^^^^^^^
The mini-OS is an optimized version of Clear Linux OS for Intel Architecture
which has been designed for the fastest and smallest container boot. The
mini-OS consists of a Linux kernel image and root filesystem image.
* **Kernel** -- The mini-OS's kernel is a Clear Linux kernel containing
the minimum feature set required to boot the client container. The kernel
has optimized for space and speed. This kernel can be modified and
re-built as desired, for specific requirements.
* **DAX** -- The :abbr:`Direct Access (DAX)` filesystem.
(Linux Kernel Documentation: ``Documentation/filesystems/dax.txt``).
Mapping host-side files into the memory map of the client allows the use of
:abbr:`DAX (Direct Access)` to directly mount those files, bypassing the
client side page cache and the virtual device mechanisms between host and
client. This allows efficient zero-copy mapping and replaces costly virtual
device manipulations with efficient page fault handling, thus being faster
and more space-efficient than other filesystem mount methods. :abbr:`DAX
(Direct Access)` is enabled in Intel Clear Containers V1.0 using a shmem
PCI-BAR mechanism configured by `kvmtool`_.
.. figure:: ../_static/images/advanced/dax-v1.png
:align: center
:abbr:`DAX (Direct Access)` is enabled in Intel Clear Containers
V2.0 using an NVDIMM `QEMU`_ memdev mechanism:
.. figure:: ../_static/images/advanced/dax-v2.png
:align: center
:abbr:`DAX (Direct Access)` can only be used to mount single flat files
from the host side (such as uncompressed filesystems), and not trees of
files in the host filesystem. More than one :abbr:`DAX (Direct Access)`
mount can be utilized though. :abbr:`DAX (Direct Access)` is limited only
by the virtual address space available, so it can easily accommodate large
file mappings.
:abbr:`DAX (Direct Access)` support was introduced in v4.0 of the kernel.
Also see the `qemu-lite`_ section.
* **Rootfs image** -- The mini-OS rootfs image is a Clear Linux
rootfs. It can execute the client workload and be modified and
extended using the bundle method to enable further features as
necessary. It can also be used to further execute another client
container image, such as a different Linux distribution.
Customer Client images and workloads
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Customers may use their own client images by instructing
the mini-OS to execute them using the mini-OS workload. Please
refer to the `Intel Clear Containers integration guide`_ for
further detail.
.. removed this section since it is in the GSG
FAQ
===
**Q.** "Can I run Clear Containers on any host Linux?"
**A.** Yes, any up-to-date or recent Linux host should be able to run Clear
Containers, as long as the host system kernel contains the necessary
features and is configured with the necessary support enabled.
.. [to do: finish this section]
**Q.** "Do I need to use all of Clear Containers, or can I cherry pick parts?"
**A.** You can cherry pick the parts of Clear Containers you need. Some parts
will make your life generally easier (such as the `QEMU`_ wrapper tool
``cor``) and will help insulate you from future development changes, so you
should consider which parts you need for which features. The client
side obviously can be quite flexible in its configuration depending
on the deployment environment.
**Q.** "Can I use Clear Containers technology to run other VMs, not just
container style ones?"
**A.** Yes, the underlying mechanisms and accelerations used for Clear
Containers can be applied to any Virtual Machine setup, not just
those that are based around a container style workflow.
.. _SR-IOV: http://www.intel.com/content/www/us/en/pci-express/pci-sig-sr-iov-primer-sr-iov-technology-paper.html
.. _QEMU: http://www.qemu.org
.. _mmu.txt: Documentation/virtual/kvm/mmu.txt
.. _Intel ARK website: http://ark.intel.com
.. _kvmtool: https://git.kernel.org/cgit/linux/kernel/git/will/kvmtool.git/
.. _rkt: https://coreos.com/rkt/
.. _Intel Clear Containers integration guide: https://clearlinux.org/documentation/gs-clear-containers-getting-started.html
+364 -364
View File
@@ -1,364 +1,364 @@
.. _ac-dpdk:
DPDK
####
Introduction
============
DPDK_ is a set of libraries and drivers for fast packet processing.
This document describes how to run a basic use case for **l3fwd
DPDK example**. The objective is to *send packages between two platforms* using a
traffic generator called :ref:`pktgen <sec_pktgen>`, where the l3fwd example
application will forward those packages. See (:ref:`f1`)
.. _f1:
.. figure:: _static/images/pktgen_lw3fd.png
:align: center
:alt: platform A and B
Figure 1: environment for l3fwd DPDK application.
**Requirements:**
* Two platforms using Clear Linux* for Intel® Architecture (recommended release `7160`_ or higher).
* Both images have the **kernel-native bundle** added.
* Installation of ``dpdk-dev``, ``os-core-dev`` and ``sysadmin-basic`` bundles:
.. code-block:: bash
# swupd bundle-add dpdk-dev os-core-dev sysadmin-basic
* The platforms must have two NICs, at least one each. It's very important to check network card
compatibility with the DPDK project. You can do this on the `dpdk.org NICS`_ site.
* Two network cables.
Disabling iommu on Clear Linux OS for Intel Architecture (Platforms A and B)
============================================================================
#. Mount the :abbr:`ESP (EFI system partition)`.
.. code-block:: bash
# systemctl start boot.mount
#. Move to entries directory.
.. code-block:: bash
# cd /boot/loader/entries/
#. Edit ``clear-linux-native.conf`` by adding ``intel_iommu=off`` after the last line.
#. Umount ESP and reboot.
.. code-block:: bash
# cd /
# systemctl stop boot.mount
# reboot
Installing dpdk and build l3fwd example (Platform B)
====================================================
#. Install ``dpdk`` bundle.
.. code-block:: bash
# swupd bundle-add dpdk-dev
#. Move to ``l3fwd`` example.
.. code-block:: bash
# cd /usr/share/dpdk/examples/l3fwd
#. Assign ``RTE_SDK var`` to the makefiles path.
.. code-block:: bash
# export RTE_SDK=/usr/share/dpdk/
#. Assign ``RTE_TARGET var`` the value where the gcc config file is located.
.. code-block:: bash
# export RTE_TARGET=x86_64-native-linuxapp-gcc
#. Build the ``l3fwd`` application, and add the configuration header to the ``CFLAGS`` var.
.. code-block:: bash
# make CFLAGS+="-include /usr/include/rte_config.h"
.. _sec_pktgen:
Building Pktgen (Platform A)
============================
Since the ``pktgen`` project is currently not included in Clear Linux OS for Intel
Architecture, you must download it from upstream and build it:
#. Install ``dpdk`` bundle.
.. code-block:: bash
# swupd bundle-add dpdk-dev
#. Download the `pktgen tar package 2.9.12`_.
#. Decompress packages and move to uncompressed source directory.
#. Assign ``RTE_SDK var`` the path where makefiles are located.
.. code-block:: bash
# export RTE_SDK=/usr/share/dpdk/
#. Assign ``RTE_TARGET var`` the value where the gcc config file is located.
.. code-block:: bash
# export RTE_TARGET=x86_64-native-linuxapp-gcc
#. Build pktgen project, and set the ``CONFIG_RTE_BUILD_SHARED_LIB`` variable with "n".
.. code-block:: bash
# make CONFIG_RTE_BUILD_SHARED_LIB=n
Binding NICs to DPDK kernel drivers (Platforms A and B)
=======================================================
The ``l3fwd`` application uses two NICs. DPDK has useful tools for binding NICs to
DPDK modules to run DPDK applications.
#. Load the dpdk I/O kernel module
.. code-block:: bash
# modprobe igb_uio
#. Check the status of your NICs; this will show which network cards are not busy. When
another application is using them, the status shows ``Active``, and those NICs cannot be
bound.
.. code-block:: bash
# dpdk_nic_bind.py --status
#. Bind two available NICs. The general syntax for binding is
**dpdk_nic_bind.py --bind=igb_uio <device-entry>**,
and the following is a working example:
.. code-block:: bash
# dpdk_nic_bind.py --bind=igb_uio 01:00.0
#. Check that your NICs binded correctly by checking the status; ``drv`` should have ``igb_uio``
value; at this point, the NICs are using the DPDK modules.
Setting hugepages (platforms A and B)
=====================================
Clear Linux OS for Intel Architecture supports ``hugepages`` for the large memory pool
allocation used for packet buffers.
#. Set number of hugepages.
.. code-block:: bash
# echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
#. Allocate pages on NUMA machines.
.. code-block:: bash
# echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
# echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
#. Make memory available for DPDK.
.. code-block:: bash
# mkdir -p /mnt/huge $ mount -t hugetlbfs nodev /mnt/huge
If you would like to know more about this, refer to the `DPDK guide`_.
Setting a physical environment (Platforms A and B)
==================================================
To achieve the model proposed in the introduction of this topic, (:ref:`f1`), we need
to connect the first Grantleys NICs to the second Grantleys NICs using the network cables
(:ref:`f2`).
.. _f2:
.. figure:: _static/images/pyshical_net.png
Figure 2: Physical network environment.
Running l3fwd application (Platform B)
======================================
The ``l3fwd`` application is one of the DPDK examples available when you install the ``dpdk-dev``
bundle; this application forwards packages from one NIC to another.
#. Open the l3fwd example directory.
.. code-block:: bash
# cd /usr/share/dpdk/examples/l3fwd
#. **This step is very important.** DPDK needs poll drivers for work; these poll drivers are
shared objects in :file:`/usr/lib64`. DPDK supports some NICs. The full list available at the
`dpdk.org NICS`_ docs. You should know which kernel module the NIC is using and choose a poll
driver according to your NICs.
#. At this point the system must have ``hugepages`` requirements. The NICs bound and the
configuration for running ``pktgen`` depends upon network use cases and available system
resources. Use the ``-d`` flag for setting the pull driver. For example, if the NICs are
using ``e1000`` network driver, they are going to use ``e1000`` poll driver
(``librte_pmd_e1000.so``); it should be in :file:`/usr/lib64` in Clear Linux OS for Intel Architecture, and it
should be enough to add the name. For example
.. code-block:: bash
# ./build/l3fwd -c 0x3 -n 2 -d librte_pmd_e1000.so -- -p 0x3 --config="(0,0,0),(1,0,1)"
#. When the application starts to run, it will show information about the ``l3fwd`` running, so
pay attention when the application is Initializing ports. After port 0 initialization, you'll
see a MAC address and the same for port 1. Save this information for setting configuration
to `Pktgen` project.
Running Pktgen application (Platform A)
===========================================
The `Pktgen` is network traffic generator. It measures the network packaging performance
in a forwarding use case.
#. At this point the system must have ``hugepages`` requirements and the NICs bound. The
configuration for running ``pktgen`` depends upon the network use case and the available
system resources. The following is a basic configuration.
.. code-block:: bash
# ./app/app/x86_64-native-linuxapp-gcc/pktgen -c 0xf -n 4 -- -p 0xf -P -m "1.0, 2.1"
#. Enable active colorful output (optional).
.. code-block:: console
Pktgen> theme enable
#. The ``l3fwd`` application showed a MAC address per-port initialized; this MAC addresses
should have been set in the pktgen environment::
> set mac <port number> <mac address>
And a working example:
.. code-block:: console
Pktgen> set mac 0 00:1E:67:CB:E8:C9
Pktgen> set mac 1 00:1E:67:CB:E8:C9
#. Start to send packages using the next command:
.. code-block:: console
Pktgen> start 0-1
#. If you followed these steps correctly, you'll see that ``pktgen`` is sending and receiving
packages. For more information, see the `Pktgen documentation`_.
Annex A: Using pass-through for running on virtual machines
===========================================================
This section explains how to set up a virtual environment where virtual machines
control the host's NICs.
#. Create a new directory and move to it.
#. Download or create a ``start_qemu.sh`` script for running a kvm virtual machine:
.. code-block:: bash
$ curl -O https://download.clearlinux.org/image/start_qemu.sh
#. Download a bare-metal image of Clear Linux OS for Intel Architecture and rename it as ``clear.img``.
#. Look for an entry for device and vendor & device ID:
.. code-block:: bash
$ lspci -nn | grep Ethernet
An output example from the last step::
03:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521]
where ``8086:1521`` is ``vendor:device ID`` and ``03:00.0`` is the entry for device. Make
note of this information; it is necessary for unbinding a host's NICs.
#. Unbind NICs from host to do passthrough with virtual machines. Clear Linux OS for Intel Architecture
currently supports this action. You can use the following commands::
echo "vendor device_ID" > /sys/bus/pci/drivers/pci-stub/new_id
echo "entry for device" > /sys/bus/pci/drivers/igb/unbind
echo "entry for device" > /sys/bus/pci/drivers/pci-stub/bind
echo "vendor device_ID" > /sys/bus/pci/drivers/pci-stub/remove_id
.. code-block:: bash
$ echo "8086 1521" > /sys/bus/pci/drivers/pci-stub/new_id
$ echo "0000:03:00.0" > /sys/bus/pci/drivers/igb/unbind
$ echo "0000:03:00.0" > /sys/bus/pci/drivers/pci-stub/bind
$ echo "8086 1521" > /sys/bus/pci/drivers/pci-stub/remove_id
#. Assign to the KVM virtual machine (guest) the unbound NICs previously noted. Modify the
``start_qemu.sh`` script in ``qemu-system-x86_64`` arguments, and add the lines with
the host's NICs information::
-device pci-assign,host="<entry for device>",id=passnic0,addr=03.0
-device pci-assign,host="<entry for device>",id=passnic1,addr=04.0
A working example:
.. code-block:: bash
-device pci-assign,host=03:00.0,id=passnic0,addr=03.0 \
-device pci-assign,host=03:00.3,id=passnic1,addr=04.0 \
#. If you would like to add more NUMA machines to the virtual machine, you can add the next
line in the Makefile boot target::
-numa node,mem=<memory>,cpus=<number of cpus>
As a working example for a virtual machine with 4096 of memory and four CPUs, the configuration
would look like this::
-numa node,mem=2048,cpus=0-1 \
-numa node,mem=2048,cpus=2-3 \
This means that each NUMA machine has to use the same quantity of memory.
#. Finally, run the ``start_qemu.sh`` script.
.. _7160: https://download.clearlinux.org/releases/7160/
.. _DPDK: http://dpdk.org
.. _dpdk.org NICS: http://dpdk.org/doc/nics
.. _pktgen tar package 2.9.12: http://dpdk.org/browse/apps/pktgen-dpdk/refs
.. _DPDK guide: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html
.. _Pktgen documentation: `Pktgen documentation`_ https://media.readthedocs.org/pdf/pktgen/latest/pktgen.pdf
.. _ac-dpdk:
DPDK
####
Introduction
============
DPDK_ is a set of libraries and drivers for fast packet processing.
This document describes how to run a basic use case for **l3fwd
DPDK example**. The objective is to *send packages between two platforms* using a
traffic generator called :ref:`pktgen <sec_pktgen>`, where the l3fwd example
application will forward those packages. See (:ref:`f1`)
.. _f1:
.. figure:: ../_static/images/advanced/pktgen_lw3fd.png
:align: center
:alt: platform A and B
Figure 1: environment for l3fwd DPDK application.
**Requirements:**
* Two platforms using Clear Linux* for Intel® Architecture (recommended release `7160`_ or higher).
* Both images have the **kernel-native bundle** added.
* Installation of ``dpdk-dev``, ``os-core-dev`` and ``sysadmin-basic`` bundles:
.. code-block:: bash
# swupd bundle-add dpdk-dev os-core-dev sysadmin-basic
* The platforms must have two NICs, at least one each. It's very important to check network card
compatibility with the DPDK project. You can do this on the `dpdk.org NICS`_ site.
* Two network cables.
Disabling iommu on Clear Linux OS for Intel Architecture (Platforms A and B)
============================================================================
#. Mount the :abbr:`ESP (EFI system partition)`.
.. code-block:: bash
# systemctl start boot.mount
#. Move to entries directory.
.. code-block:: bash
# cd /boot/loader/entries/
#. Edit ``clear-linux-native.conf`` by adding ``intel_iommu=off`` after the last line.
#. Umount ESP and reboot.
.. code-block:: bash
# cd /
# systemctl stop boot.mount
# reboot
Installing dpdk and build l3fwd example (Platform B)
====================================================
#. Install ``dpdk`` bundle.
.. code-block:: bash
# swupd bundle-add dpdk-dev
#. Move to ``l3fwd`` example.
.. code-block:: bash
# cd /usr/share/dpdk/examples/l3fwd
#. Assign ``RTE_SDK var`` to the makefiles path.
.. code-block:: bash
# export RTE_SDK=/usr/share/dpdk/
#. Assign ``RTE_TARGET var`` the value where the gcc config file is located.
.. code-block:: bash
# export RTE_TARGET=x86_64-native-linuxapp-gcc
#. Build the ``l3fwd`` application, and add the configuration header to the ``CFLAGS`` var.
.. code-block:: bash
# make CFLAGS+="-include /usr/include/rte_config.h"
.. _sec_pktgen:
Building Pktgen (Platform A)
============================
Since the ``pktgen`` project is currently not included in Clear Linux OS for Intel
Architecture, you must download it from upstream and build it:
#. Install ``dpdk`` bundle.
.. code-block:: bash
# swupd bundle-add dpdk-dev
#. Download the `pktgen tar package 2.9.12`_.
#. Decompress packages and move to uncompressed source directory.
#. Assign ``RTE_SDK var`` the path where makefiles are located.
.. code-block:: bash
# export RTE_SDK=/usr/share/dpdk/
#. Assign ``RTE_TARGET var`` the value where the gcc config file is located.
.. code-block:: bash
# export RTE_TARGET=x86_64-native-linuxapp-gcc
#. Build pktgen project, and set the ``CONFIG_RTE_BUILD_SHARED_LIB`` variable with "n".
.. code-block:: bash
# make CONFIG_RTE_BUILD_SHARED_LIB=n
Binding NICs to DPDK kernel drivers (Platforms A and B)
=======================================================
The ``l3fwd`` application uses two NICs. DPDK has useful tools for binding NICs to
DPDK modules to run DPDK applications.
#. Load the dpdk I/O kernel module
.. code-block:: bash
# modprobe igb_uio
#. Check the status of your NICs; this will show which network cards are not busy. When
another application is using them, the status shows ``Active``, and those NICs cannot be
bound.
.. code-block:: bash
# dpdk_nic_bind.py --status
#. Bind two available NICs. The general syntax for binding is
**dpdk_nic_bind.py --bind=igb_uio <device-entry>**,
and the following is a working example:
.. code-block:: bash
# dpdk_nic_bind.py --bind=igb_uio 01:00.0
#. Check that your NICs binded correctly by checking the status; ``drv`` should have ``igb_uio``
value; at this point, the NICs are using the DPDK modules.
Setting hugepages (platforms A and B)
=====================================
Clear Linux OS for Intel Architecture supports ``hugepages`` for the large memory pool
allocation used for packet buffers.
#. Set number of hugepages.
.. code-block:: bash
# echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
#. Allocate pages on NUMA machines.
.. code-block:: bash
# echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
# echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
#. Make memory available for DPDK.
.. code-block:: bash
# mkdir -p /mnt/huge $ mount -t hugetlbfs nodev /mnt/huge
If you would like to know more about this, refer to the `DPDK guide`_.
Setting a physical environment (Platforms A and B)
==================================================
To achieve the model proposed in the introduction of this topic, (:ref:`f1`), we need
to connect the first Grantleys NICs to the second Grantleys NICs using the network cables
(:ref:`f2`).
.. _f2:
.. figure:: ../_static/images/advanced/pyshical_net.png
Figure 2: Physical network environment.
Running l3fwd application (Platform B)
======================================
The ``l3fwd`` application is one of the DPDK examples available when you install the ``dpdk-dev``
bundle; this application forwards packages from one NIC to another.
#. Open the l3fwd example directory.
.. code-block:: bash
# cd /usr/share/dpdk/examples/l3fwd
#. **This step is very important.** DPDK needs poll drivers for work; these poll drivers are
shared objects in :file:`/usr/lib64`. DPDK supports some NICs. The full list available at the
`dpdk.org NICS`_ docs. You should know which kernel module the NIC is using and choose a poll
driver according to your NICs.
#. At this point the system must have ``hugepages`` requirements. The NICs bound and the
configuration for running ``pktgen`` depends upon network use cases and available system
resources. Use the ``-d`` flag for setting the pull driver. For example, if the NICs are
using ``e1000`` network driver, they are going to use ``e1000`` poll driver
(``librte_pmd_e1000.so``); it should be in :file:`/usr/lib64` in Clear Linux OS for Intel Architecture, and it
should be enough to add the name. For example
.. code-block:: bash
# ./build/l3fwd -c 0x3 -n 2 -d librte_pmd_e1000.so -- -p 0x3 --config="(0,0,0),(1,0,1)"
#. When the application starts to run, it will show information about the ``l3fwd`` running, so
pay attention when the application is Initializing ports. After port 0 initialization, you'll
see a MAC address and the same for port 1. Save this information for setting configuration
to `Pktgen` project.
Running Pktgen application (Platform A)
===========================================
The `Pktgen` is network traffic generator. It measures the network packaging performance
in a forwarding use case.
#. At this point the system must have ``hugepages`` requirements and the NICs bound. The
configuration for running ``pktgen`` depends upon the network use case and the available
system resources. The following is a basic configuration.
.. code-block:: bash
# ./app/app/x86_64-native-linuxapp-gcc/pktgen -c 0xf -n 4 -- -p 0xf -P -m "1.0, 2.1"
#. Enable active colorful output (optional).
.. code-block:: console
Pktgen> theme enable
#. The ``l3fwd`` application showed a MAC address per-port initialized; this MAC addresses
should have been set in the pktgen environment::
> set mac <port number> <mac address>
And a working example:
.. code-block:: console
Pktgen> set mac 0 00:1E:67:CB:E8:C9
Pktgen> set mac 1 00:1E:67:CB:E8:C9
#. Start to send packages using the next command:
.. code-block:: console
Pktgen> start 0-1
#. If you followed these steps correctly, you'll see that ``pktgen`` is sending and receiving
packages. For more information, see the `Pktgen documentation`_.
Annex A: Using pass-through for running on virtual machines
===========================================================
This section explains how to set up a virtual environment where virtual machines
control the host's NICs.
#. Create a new directory and move to it.
#. Download or create a ``start_qemu.sh`` script for running a kvm virtual machine:
.. code-block:: bash
$ curl -O https://download.clearlinux.org/image/start_qemu.sh
#. Download a bare-metal image of Clear Linux OS for Intel Architecture and rename it as ``clear.img``.
#. Look for an entry for device and vendor & device ID:
.. code-block:: bash
$ lspci -nn | grep Ethernet
An output example from the last step::
03:00.0 Ethernet controller [0200]: Intel Corporation I350 Gigabit Network Connection [8086:1521]
where ``8086:1521`` is ``vendor:device ID`` and ``03:00.0`` is the entry for device. Make
note of this information; it is necessary for unbinding a host's NICs.
#. Unbind NICs from host to do passthrough with virtual machines. Clear Linux OS for Intel Architecture
currently supports this action. You can use the following commands::
echo "vendor device_ID" > /sys/bus/pci/drivers/pci-stub/new_id
echo "entry for device" > /sys/bus/pci/drivers/igb/unbind
echo "entry for device" > /sys/bus/pci/drivers/pci-stub/bind
echo "vendor device_ID" > /sys/bus/pci/drivers/pci-stub/remove_id
.. code-block:: bash
$ echo "8086 1521" > /sys/bus/pci/drivers/pci-stub/new_id
$ echo "0000:03:00.0" > /sys/bus/pci/drivers/igb/unbind
$ echo "0000:03:00.0" > /sys/bus/pci/drivers/pci-stub/bind
$ echo "8086 1521" > /sys/bus/pci/drivers/pci-stub/remove_id
#. Assign to the KVM virtual machine (guest) the unbound NICs previously noted. Modify the
``start_qemu.sh`` script in ``qemu-system-x86_64`` arguments, and add the lines with
the host's NICs information::
-device pci-assign,host="<entry for device>",id=passnic0,addr=03.0
-device pci-assign,host="<entry for device>",id=passnic1,addr=04.0
A working example:
.. code-block:: bash
-device pci-assign,host=03:00.0,id=passnic0,addr=03.0 \
-device pci-assign,host=03:00.3,id=passnic1,addr=04.0 \
#. If you would like to add more NUMA machines to the virtual machine, you can add the next
line in the Makefile boot target::
-numa node,mem=<memory>,cpus=<number of cpus>
As a working example for a virtual machine with 4096 of memory and four CPUs, the configuration
would look like this::
-numa node,mem=2048,cpus=0-1 \
-numa node,mem=2048,cpus=2-3 \
This means that each NUMA machine has to use the same quantity of memory.
#. Finally, run the ``start_qemu.sh`` script.
.. _7160: https://download.clearlinux.org/releases/7160/
.. _DPDK: http://dpdk.org
.. _dpdk.org NICS: http://dpdk.org/doc/nics
.. _pktgen tar package 2.9.12: http://dpdk.org/browse/apps/pktgen-dpdk/refs
.. _DPDK guide: http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html
.. _Pktgen documentation: `Pktgen documentation`_ https://media.readthedocs.org/pdf/pktgen/latest/pktgen.pdf
@@ -5,11 +5,11 @@ Advanced configuration
:maxdepth: 2
clear-containers
network_boot
bulk_provisioning
network-boot
bulk-provisioning
mixer
ac-dpdk
ac-ovs-dpdk
validate_sigs
dpdk
ovs-dpdk
validate-signs
clear_linux_os_on_azure
+254 -254
View File
@@ -1,254 +1,254 @@
.. _mixer_tool:
Mixer Tool
##########
*Mixing* refers to composing an operating system for specific use cases.
While the default Clear Linux* OS for Intel® Architecture provides options to install
bundles for various server capabilities, some developers may wish to 1) augment the
operating system itself with functionality from their own packages or 2) modify the
structure of current bundles to cater to their particular needs.
Current Workflow
================
Prerequisites
-------------
To start working with the Mixer tools, you'll need a recent image of Clear Linux OS for Intel Architecture
with the following bundle installed. If you don't have it already,
you can add it with the :command:`swupd bundle-add` command like so::
# swupd bundle-add mixer
Mixing
------
#. **Create a workspace**. Create an empty directory in your Clear image to
use as a "workspace" for mixing. For these steps, we assume your workspace
location is :file:`/home/clr/mix`.
#. **Configure builder.conf**. Copy the template conf file::
# cp /usr/share/defaults/bundle-chroot-builder/builder.conf /home/clr/mix/
The file ``builder.conf`` will be read automatically from the current workspace directory,
but all of the scripts accept a ``-c/--config`` option to specify where
the file is if you want to store it elsewhere. To use one in your current workspace,
copy the template to /home/clr/mix.
The :file:`.yum-mix.conf` file will be auto-generated for you, as will the :file:`ClearLinuxRoot.pem`. A yum configuration is needed for the chroot-builder to know where the RPMs are hosted, and the certificate file is needed to sign the root Manifest to provide security for content verification.
Note there are different sections to the builder.conf. The ``[Builder]`` section
provides the mixer tools with required configuration options, defining where
generated bundles and update metadata should get published. The ``[swupd]`` section
is used by swupd-server to create an update with specific update parameters.
Edit the template configuration file according to your needs. For this example,
your ``builder.conf`` should look like this, with the ``VER`` replaced by valid build
numbers, and both *URL variables set to the domain or IP of the update server::
# vim /etc/bundle-chroot-builder/builder.conf:
[Builder]
SERVER_STATE_DIR=/home/clr/mix/update
BUNDLE_DIR=/home/clr/mix/mix-bundles
YUM_CONF=/home/clr/mix/.yum-mix.conf
CERT=/home/clr/mix/ClearLinuxRoot.pem
CLEAR_VERSION=VER
MIX_VERSION=VER
[swupd]
BUNDLE=os-core-update
CONTENTURL=<URL where the content will be hosted>
VERSIONURL=<URL where the version of the mix will be hosted>
FORMAT=1
The SERVER_STATE_DIR is where the mix content will be outputted to, and it is automatically created for you by the mixer scripts. This can be set to any location, but for this example let us use the workspace directory. The same applies for BUNDLE_DIR; it will be generated for you in the location specified in the builder.conf, in this case - /home/clr/mix/mix-bundles. It is where the bundle definitions are stored for your mix, and where the chroot-builder looks in to know what bundles must be installed.
You may change the ``CERT=/path/to/cert`` line, which tells the chroot builder to insert the certificate
specified for the mix in ``/os-core-update/usr/share/clear/update-ca/``. This is the certificate used by
the software update client to verify the Manifest.MoM signature. For now, it is `HIGHLY` recommended that
you do not modify this line, as the certificate swupd expects needs a very specific configuration to sign
and verify properly. The certificate will be automatically generated for you, and the Manifest.MoM will
be signed automatically as well, providing security for the update content you create.
The CLEAR_VERSION is the upstream Clear Linux* OS for Intel® Architecture version that the mix will be based
off of, and all required content (RPMs) not provided by the mixer will be downloaded from that release.
The MIX_VERSION is the version you want your mix to be.
For this example, set CLEAR_VERSION=11580 and MIX_VERSION=10. You can of course choose any numbers you like
for the MIX_VERSION, but it is recommended to use the current latest version of upstream for the CLEAR_VERSION.
The CLEAR_VERSION can be updated as new upstream versions are released if needed.
The CONTENTURL and VERSIONURL may be an IP address, or a domain name, which hosts the /home/clr/mix/update/www (SERVER_STATE_DIR) directory. Creating a symlink to the directory in your server webdir is an easy way to host the content. A client running the mix will look to that URL to figure out if there is a new version available,
and where to download update content from.
To learn more about the FORMAT option, please refer to the bottom of this document "Format Version" and
https://github.com/clearlinux/swupd-server/wiki/Format-Bumps. For now leave the FORMAT
value alone and do not increment it.
#. **Generate the starting point for your Mix**. In your workspace, run::
# sudo mixer-init-mix.sh
*If you wish to just build a mix that includes all Clear bundles with no modifications, run*::
# sudo mixer-init-mix.sh --all-bundles
And skip to ``Creating an image``. All the required content will be automatically built, and this mix
will be identical to the version of Clear it is being composed from.
#. **Create/locate RPMs for mix.**. (Steps 4-6 are necessary only if you
want to add your own RPMs to the Mix. If you are working only with Clear
bundles, then skip to Step 7.)
If you are creating RPMs from scratch, you may use ``autospec``,
``mock``, ``rpmbuild``, etc. to build them. If they are not
built on Clear, make sure your configuration and toolchain builds them correctly for Clear.
#. **Import RPMs into workspace**. The way to do this is to create an
``rpms`` directory in your workspace (for example ``/home/clr/mix/rpms``),
and to copy the RPMs you want into that directory. The mixer script will
look here for RPMs in order to build a local RPM repo for yum to use.
#. **Create a local RPM repo**. Create an empty directory in your workspace
named ``local`` and add the paths in your builder.conf::
RPMDIR=/home/clr/mix/rpms
REPODIR=/home/clr/mix/local
These variables are automatically read; you simply need to run::
# sudo mixer-add-rpms.sh
After the script exits, you should see your RPMs and a repodata directory in
``/home/clr/mix/local``. If the RPMs are not all in the local directory, check
to make sure that they are indeed valid RPM files and not corrupt.
#. **Update/Add bundle definitions**. The mixer uses a local clone of the
``clr-bundles`` repo to define bundles for the mix.
To define your bundles:
#. Navigate to the ``mix-bundles/`` directory.
#. Make any needed modifications to the bundle set.
#. Commit the result::
$ git add .
$ git commit -s -m 'Update bundles for mix #<VER>'
You can easily copy bundles over from the ``clr-bundles/bundles`` directory in
the case that you want to simply use existing bundle sets. Note that
``mix-bundles`` should not have any folders inside of it, only bundle definitions.
Do *not* modify things in the clr-bundles dir, this is simply a mirror for you to
use or refer to the Clear Linux OS bundle definitions.
Why do this? With Git history, mixes are easy to revert to or refer
to in the future if something were to go wrong with a new mix. If
you're just testing this out, or if you really do not want to mess with Git,
you can ignore committing for now.
To add your own bundle, create a bundle definition file in ``mix-bundles/``
and refer to :file:`mix-bundles/os-core-update` for formatting, but be sure that
the name does not conflict with another bundle. Add your package
name(s) in that bundle definition file to tell it what package(s)
must be installed as part of that bundle.
#. **Build the bundle chroots** To build all of the ``chroots``
that are based on the bundles you defined, in your workspace run::
# sudo mixer-build-chroots.sh
If you have many bundles defined for your mix, this step may take some time.
#. **Create update**. In the workspace, run::
# sudo mixer-create-update.sh
When the script completes, you'll find your mix update content under
``/home/clr/mix/update/www/VER``, in this example, it will be located in
``/home/clr/mix/update//www/<MIXVERSION>``, where <MIXVERSION> is the mix version you
defined, or 10 by default.
All content to make a fully usable mix will be created by this step, but note that
only zero packs are automatically generated. To create optional delta packs, run
the pack-maker as follows::
# sudo mixer-pack-maker.sh --to <MIX_VERSION> --from <PAST_VERSION> -S /home/clr/mix/update
The pack-maker will generate all delta packs for changed bundles from PAST_VERSION
to MIX_VERSION. If your STATE_DIR is in a different location be sure to specify where
with the -S option.
For the first build, no delta packs can be created because the "update" is from version 0, which impicitly has no content, thus no deltas can be generated. For subsequent builds, mixer-pack-maker.sh can be run to generate delta content between them (i.e 10 to 20).
#. **Creating an image**
To create a bootable image from your update content, you will need the configuration file for
ister to create images::
# curl -O https://raw.githubusercontent.com/clearlinux/ister/master/release-image-config.json
Edit this to include all the bundles you want pre-installed into your image. For a minimal, base
image this would be::
"Bundles": ["os-core", "os-core-update", "kernel-native"]
And lastly, set the "Version:" to say which mix version content the image should be built from,
i.e. 10 for your first build. To build the image, run::
# sudo ister.py -t release-image-config.json -V file:///home/clr/mix/update/www/ -C file:///home/clr/mix/update/www/ -f 1
The output from this should be an image that is bootable as a VM or installable to baremetal. *Note* that
you may need to pass in -f/--format <FORMAT_NUMBER> if the format you are building is different than the
format of Clear Linux OS you are currently building on. Format version can be found via::
# cat /usr/share/defaults/swupd/format
Creating your next Mix version
#. **Initialize next Mix version info**. To update the versions and prep for your
next mix::
Update the MIX_VERSION in your builder.conf to the next version number you want to build.
From this point you can iterate through, starting again at step 4 and doing modifications
as needed. For example:
- Add/Remove/Modify Bundles
- sudo mixer-build-chroots.sh
- sudo mixer-create-update.sh
- (Optionally) sudo mixer-pack-maker.sh --to <NEWVERSION> --from <PREV_VERSION> -S /home/clr/mix/update
Next mix created.
#. **Update Bundles (Optional)**. Update ``clr-bundles``. In the workspace,
run::
# sudo mixer-update-bundles.sh
This step is optional because the script is already called by mixer-init-mix.sh,
and only needs to be called again when you want to update the upstream clr-bundles
folder in your workspace. It also does not need to be called unless you are updating
the CLEAR_VERSION number as well to match the newest upstream release.
Format Version
--------------------------
The "format" used in ``builder.conf`` might be more precisely referred to as an
OS "compatibility epoch". Versions of the OS within a given epoch are fully
compatible with themselves and can update to any version in that epoch. Across
the format boundary *something* has changed in the OS, such that updating from
build M in format X, to build N in format Y will not work. Generally this occurs
when the software updater or manifests changed in a way that is no longer
compatible with the previous update scheme.
A format increment is the way we insure pre- and co-requisite
changes flow out with proper ordering. The update client will only ever update
to the latest release in its respective format version (unless overridden by
command line flags), thus we can guarantee all clients will update to the final
version in their given format, which *must* contain all the changes needed
to understand the content built in the following format. Only after reaching the
final release in the old format will a client be able to continue to update to
releases in the new format.
For the creation of a custom mix, the format version should start at '1',
or some known number, and increment only when a compatibility breakage is
introduced. Normal updates (updating a software package for example)
do not require a format increment.
.. _mixer_tool:
Mixer Tool
##########
*Mixing* refers to composing an operating system for specific use cases.
While the default Clear Linux* OS for Intel® Architecture provides options to install
bundles for various server capabilities, some developers may wish to 1) augment the
operating system itself with functionality from their own packages or 2) modify the
structure of current bundles to cater to their particular needs.
Current Workflow
================
Prerequisites
-------------
To start working with the Mixer tools, you'll need a recent image of Clear Linux OS for Intel Architecture
with the following bundle installed. If you don't have it already,
you can add it with the :command:`swupd bundle-add` command like so::
# swupd bundle-add mixer
Mixing
------
#. **Create a workspace**. Create an empty directory in your Clear image to
use as a "workspace" for mixing. For these steps, we assume your workspace
location is :file:`/home/clr/mix`.
#. **Configure builder.conf**. Copy the template conf file::
# cp /usr/share/defaults/bundle-chroot-builder/builder.conf /home/clr/mix/
The file ``builder.conf`` will be read automatically from the current workspace directory,
but all of the scripts accept a ``-c/--config`` option to specify where
the file is if you want to store it elsewhere. To use one in your current workspace,
copy the template to /home/clr/mix.
The :file:`.yum-mix.conf` file will be auto-generated for you, as will the :file:`ClearLinuxRoot.pem`. A yum configuration is needed for the chroot-builder to know where the RPMs are hosted, and the certificate file is needed to sign the root Manifest to provide security for content verification.
Note there are different sections to the builder.conf. The ``[Builder]`` section
provides the mixer tools with required configuration options, defining where
generated bundles and update metadata should get published. The ``[swupd]`` section
is used by swupd-server to create an update with specific update parameters.
Edit the template configuration file according to your needs. For this example,
your ``builder.conf`` should look like this, with the ``VER`` replaced by valid build
numbers, and both *URL variables set to the domain or IP of the update server::
# vim /etc/bundle-chroot-builder/builder.conf:
[Builder]
SERVER_STATE_DIR=/home/clr/mix/update
BUNDLE_DIR=/home/clr/mix/mix-bundles
YUM_CONF=/home/clr/mix/.yum-mix.conf
CERT=/home/clr/mix/ClearLinuxRoot.pem
CLEAR_VERSION=VER
MIX_VERSION=VER
[swupd]
BUNDLE=os-core-update
CONTENTURL=<URL where the content will be hosted>
VERSIONURL=<URL where the version of the mix will be hosted>
FORMAT=1
The SERVER_STATE_DIR is where the mix content will be outputted to, and it is automatically created for you by the mixer scripts. This can be set to any location, but for this example let us use the workspace directory. The same applies for BUNDLE_DIR; it will be generated for you in the location specified in the builder.conf, in this case - /home/clr/mix/mix-bundles. It is where the bundle definitions are stored for your mix, and where the chroot-builder looks in to know what bundles must be installed.
You may change the ``CERT=/path/to/cert`` line, which tells the chroot builder to insert the certificate
specified for the mix in ``/os-core-update/usr/share/clear/update-ca/``. This is the certificate used by
the software update client to verify the Manifest.MoM signature. For now, it is `HIGHLY` recommended that
you do not modify this line, as the certificate swupd expects needs a very specific configuration to sign
and verify properly. The certificate will be automatically generated for you, and the Manifest.MoM will
be signed automatically as well, providing security for the update content you create.
The CLEAR_VERSION is the upstream Clear Linux* OS for Intel® Architecture version that the mix will be based
off of, and all required content (RPMs) not provided by the mixer will be downloaded from that release.
The MIX_VERSION is the version you want your mix to be.
For this example, set CLEAR_VERSION=11580 and MIX_VERSION=10. You can of course choose any numbers you like
for the MIX_VERSION, but it is recommended to use the current latest version of upstream for the CLEAR_VERSION.
The CLEAR_VERSION can be updated as new upstream versions are released if needed.
The CONTENTURL and VERSIONURL may be an IP address, or a domain name, which hosts the /home/clr/mix/update/www (SERVER_STATE_DIR) directory. Creating a symlink to the directory in your server webdir is an easy way to host the content. A client running the mix will look to that URL to figure out if there is a new version available,
and where to download update content from.
To learn more about the FORMAT option, please refer to the bottom of this document "Format Version" and
https://github.com/clearlinux/swupd-server/wiki/Format-Bumps. For now leave the FORMAT
value alone and do not increment it.
#. **Generate the starting point for your Mix**. In your workspace, run::
# sudo mixer-init-mix.sh
*If you wish to just build a mix that includes all Clear bundles with no modifications, run*::
# sudo mixer-init-mix.sh --all-bundles
And skip to ``Creating an image``. All the required content will be automatically built, and this mix
will be identical to the version of Clear it is being composed from.
#. **Create/locate RPMs for mix.**. (Steps 4-6 are necessary only if you
want to add your own RPMs to the Mix. If you are working only with Clear
bundles, then skip to Step 7.)
If you are creating RPMs from scratch, you may use ``autospec``,
``mock``, ``rpmbuild``, etc. to build them. If they are not
built on Clear, make sure your configuration and toolchain builds them correctly for Clear.
#. **Import RPMs into workspace**. The way to do this is to create an
``rpms`` directory in your workspace (for example ``/home/clr/mix/rpms``),
and to copy the RPMs you want into that directory. The mixer script will
look here for RPMs in order to build a local RPM repo for yum to use.
#. **Create a local RPM repo**. Create an empty directory in your workspace
named ``local`` and add the paths in your builder.conf::
RPMDIR=/home/clr/mix/rpms
REPODIR=/home/clr/mix/local
These variables are automatically read; you simply need to run::
# sudo mixer-add-rpms.sh
After the script exits, you should see your RPMs and a repodata directory in
``/home/clr/mix/local``. If the RPMs are not all in the local directory, check
to make sure that they are indeed valid RPM files and not corrupt.
#. **Update/Add bundle definitions**. The mixer uses a local clone of the
``clr-bundles`` repo to define bundles for the mix.
To define your bundles:
#. Navigate to the ``mix-bundles/`` directory.
#. Make any needed modifications to the bundle set.
#. Commit the result::
$ git add .
$ git commit -s -m 'Update bundles for mix #<VER>'
You can easily copy bundles over from the ``clr-bundles/bundles`` directory in
the case that you want to simply use existing bundle sets. Note that
``mix-bundles`` should not have any folders inside of it, only bundle definitions.
Do *not* modify things in the clr-bundles dir, this is simply a mirror for you to
use or refer to the Clear Linux OS bundle definitions.
Why do this? With Git history, mixes are easy to revert to or refer
to in the future if something were to go wrong with a new mix. If
you're just testing this out, or if you really do not want to mess with Git,
you can ignore committing for now.
To add your own bundle, create a bundle definition file in ``mix-bundles/``
and refer to :file:`mix-bundles/os-core-update` for formatting, but be sure that
the name does not conflict with another bundle. Add your package
name(s) in that bundle definition file to tell it what package(s)
must be installed as part of that bundle.
#. **Build the bundle chroots** To build all of the ``chroots``
that are based on the bundles you defined, in your workspace run::
# sudo mixer-build-chroots.sh
If you have many bundles defined for your mix, this step may take some time.
#. **Create update**. In the workspace, run::
# sudo mixer-create-update.sh
When the script completes, you'll find your mix update content under
``/home/clr/mix/update/www/VER``, in this example, it will be located in
``/home/clr/mix/update//www/<MIXVERSION>``, where <MIXVERSION> is the mix version you
defined, or 10 by default.
All content to make a fully usable mix will be created by this step, but note that
only zero packs are automatically generated. To create optional delta packs, run
the pack-maker as follows::
# sudo mixer-pack-maker.sh --to <MIX_VERSION> --from <PAST_VERSION> -S /home/clr/mix/update
The pack-maker will generate all delta packs for changed bundles from PAST_VERSION
to MIX_VERSION. If your STATE_DIR is in a different location be sure to specify where
with the -S option.
For the first build, no delta packs can be created because the "update" is from version 0, which impicitly has no content, thus no deltas can be generated. For subsequent builds, mixer-pack-maker.sh can be run to generate delta content between them (i.e 10 to 20).
#. **Creating an image**
To create a bootable image from your update content, you will need the configuration file for
ister to create images::
# curl -O https://raw.githubusercontent.com/clearlinux/ister/master/release-image-config.json
Edit this to include all the bundles you want pre-installed into your image. For a minimal, base
image this would be::
"Bundles": ["os-core", "os-core-update", "kernel-native"]
And lastly, set the "Version:" to say which mix version content the image should be built from,
i.e. 10 for your first build. To build the image, run::
# sudo ister.py -t release-image-config.json -V file:///home/clr/mix/update/www/ -C file:///home/clr/mix/update/www/ -f 1
The output from this should be an image that is bootable as a VM or installable to baremetal. *Note* that
you may need to pass in -f/--format <FORMAT_NUMBER> if the format you are building is different than the
format of Clear Linux OS you are currently building on. Format version can be found via::
# cat /usr/share/defaults/swupd/format
Creating your next Mix version
#. **Initialize next Mix version info**. To update the versions and prep for your
next mix::
Update the MIX_VERSION in your builder.conf to the next version number you want to build.
From this point you can iterate through, starting again at step 4 and doing modifications
as needed. For example:
- Add/Remove/Modify Bundles
- sudo mixer-build-chroots.sh
- sudo mixer-create-update.sh
- (Optionally) sudo mixer-pack-maker.sh --to <NEWVERSION> --from <PREV_VERSION> -S /home/clr/mix/update
Next mix created.
#. **Update Bundles (Optional)**. Update ``clr-bundles``. In the workspace,
run::
# sudo mixer-update-bundles.sh
This step is optional because the script is already called by mixer-init-mix.sh,
and only needs to be called again when you want to update the upstream clr-bundles
folder in your workspace. It also does not need to be called unless you are updating
the CLEAR_VERSION number as well to match the newest upstream release.
Format Version
--------------------------
The "format" used in ``builder.conf`` might be more precisely referred to as an
OS "compatibility epoch". Versions of the OS within a given epoch are fully
compatible with themselves and can update to any version in that epoch. Across
the format boundary *something* has changed in the OS, such that updating from
build M in format X, to build N in format Y will not work. Generally this occurs
when the software updater or manifests changed in a way that is no longer
compatible with the previous update scheme.
A format increment is the way we insure pre- and co-requisite
changes flow out with proper ordering. The update client will only ever update
to the latest release in its respective format version (unless overridden by
command line flags), thus we can guarantee all clients will update to the final
version in their given format, which *must* contain all the changes needed
to understand the content built in the following format. Only after reaching the
final release in the old format will a client be able to continue to update to
releases in the new format.
For the creation of a custom mix, the format version should start at '1',
or some known number, and increment only when a compatibility breakage is
introduced. Normal updates (updating a software package for example)
do not require a format increment.
File diff suppressed because it is too large Load Diff
@@ -1,327 +1,327 @@
.. _ac-ovs-dpdk:
OpenvSwitch and DPDK
####################
Introduction
============
Enabling `DPDK`_ support on the **OpenvSwitch project** can yield significant
network performance improvements. To illustrate one such example, we'll
cover a simple use case with :ref:`f1ovs`, where one virtual machine sends
1,000,000 HTTP requests to another virtual machine using
* *Linux bridges**
* **OpenvSwitch bridges**
* And custom-built **OpenvSwitch-DPDK bridges** as the network link.
.. _f1ovs:
.. figure:: _static/images/use_case.png
Figure 1: Basic virtual network environment.
**Requirements:**
To follow along with this example, you will need:
* At least one platform using Clear Linux* OS for Intel® Architecture
(recommended release >= ``7160``) as Host,
* The ``kernel-native`` bundle enabled on that particular Host,
* And the ``network-advanced``, and ``os-clr-on-clr`` bundles installed.
.. code-block:: bash
# swupd bundle-add network-advanced os-clr-on-clr
You'll also need two `kvm`_ images (recommended release >= ``7160``).
These images will create the guest virtual machines A and B. These virtual machines
must also have ``network-basic`` and ``lamp-basic`` bundles installed.
.. code-block:: bash
# swupd bundle-add network-basic lamp-basic
Using Linux Bridges
===================
#. Create a script named **qemu-ifup** for a linux bridge in a virtual machine.
.. code-block:: bash
#!/bin/bash
set -x
switch=br0
if [ -n "$1" ];then
tunctl -u whoami -t $1
ip link set $1 up
sleep 0.5s
brctl addif $switch $1
exit 0
else
echo "Error: no interface specified"
exit 1
fi
#. Enable execute permission on the script, preserving its group permissions with
respect to other files.
.. code-block:: bash
# chmod a+x qemu-ifup
#. Create a bridge using the OpenvSwitch tool; you can verify whether the bridge
was successfully created by using ip tool.
.. code-block:: bash
# brctl addbr br0
Note: At this point, you have the option to add a NIC with ``brctl addif br0 <network interface>``. Sample interface below should be replaced with your local
NIC's designation.
.. code-block:: bash
# brctl addif br0 enp3s0f0
When the above option is used, and the NIC is connected to DHCP server, so Steps
1 and 2 under the `Setting IP address`_ section.
#. Set up the Linux bridge.
.. code-block:: bash
# ip link set dev br0 up
#. Run guest virtual machine A using the next configuration as reference, where
the **$IMAGE** var is the Clear Linux image name.
.. code-block:: bash
qemu-system-x86_64 \
-enable-kvm -m 1024 \
-bios OVMF.fd \
-smp cpus=2,cores=1 -cpu host \
-vga none -nographic \
-drive file="$IMAGE",if=virtio,aio=threads \
-net nic,macaddr=00:11:22:33:44:55,model=virtio -net tap,script=qemu-ifup \
-debugcon file:debug.log -global isa-debugcon.iobase=0x402
#. Run guest virtual machine B using the configuration from the previous step;
take care to update the MAC address.
#. Follow the instructions from the `Setting IP Address`_ section.
#. And to clean the previous environment, turn off the virtual machines and delete
the bridge.
.. code-block:: bash
# ip link set dev br0 down
# brctl delbr br0
Using OpenvSwitch
=================
#. Start the OpenvSwitch service.
.. code-block:: bash
# systemctl start openvswitch.service
#. Create a bridge using the OpenvSwitch tool; you can verify whether or not the
bridge was successfully created by running ip tool.
.. code-block:: bash
# ovs-vsctl add-br br0
# ip a
#. Create **UP-DOWN** scripts which can bring up the tap devices through the
bridge we created in Step 2.
The **ovs-ifdown** script should look something like:
.. code-block:: bash
#!/bin/sh
switch="br0"
/usr/bin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
And the **ovs-ifup script** should look something like:
.. code-block:: bash
#!/bin/sh
switch="br0"
/usr/bin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1
#. Enable execute permission on the scripts, preserving their group permissions
with respect to other files.
.. code-block:: bash
# chmod a+x ovs-ifdown
# chmod a+x ovs-ifup
#. Run guest virtual machine A using the next configuration as reference, where
**$IMAGE** var is the name of the Clear Linux* OS for Intel Architecture image.
Notice the network configuration uses the up-down scripts.
.. code-block:: bash
qemu-system-x86_64 \
-enable-kvm -m 1024 \
-bios OVMF.fd \
-smp cpus=2,cores=1 -cpu host \
-vga none -nographic \
-drive file="$IMAGE",if=virtio,aio=threads \
-net nic,model=virtio,macaddr=00:11:22:33:44:55 -net tap,script=ovs-ifup,downscript=ovs-ifdown \
-debugcon file:debug.log -global isa-debugcon.iobase=0x402
#. Run guest virtual machine B using the configuration from step 5, only
it's necessary to change the MAC address to something like *00:11:22:33:44:56*
#. Follow the instructions in the `Setting IP address`_ section.
Using Linux OpenvSwitch-DPDK
============================
#. Create a new environment and add **iommu=pt intel_iommu=on** to the kernel
command line.
.. code-block:: bash
# systemctl start boot.mount
# cd /boot/loader/entries/
#. Edit :file:`clear-linux-native-<kernel-version>.conf`, and add
**iommu=pt intel_iommu=on** to the end of the line.
#. Then ``umount`` and reboot the machine.
.. code-block:: bash
# cd /
# systemctl stop boot.mount
# reboot
#. Set number of hugepages.
.. code-block:: bash
# echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
#. Allocate pages on NUMA machines.
.. code-block:: bash
# echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
# echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
#. Making memory available for DPDK.
.. code-block:: bash
# mkdir -p /mnt/huge
# mount -t hugetlbfs nodev /mnt/huge
#. Add cores and memory configuration to the OpenvSwitch example; the
:file:`/usr/share/openvswitch/scripts/ovs-ctl` file can be edited on line 256
and DPDK configuration can be added.
It should look something like:
``set ovs-vswitchd --dpdk -c 0x2 -n 4 --socket-mem 2048 -- unix:"$DB_SOCK"``
The next regular expression could be helpful:
.. code-block:: bash
# sed -i s/"set ovs-vswitchd unix:"/"set ovs-vswitchd --dpdk -c 0x2 -n 4 --socket-mem 2048 -- unix:"/g /usr/share/openvswitch/scripts/ovs-ctl
#. Start the OpenvSwitch service:
.. code-block:: bash
# systemctl start openvswitch.service
#. Create a virtual bridge using openvswitch:
.. code-block:: bash
# ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
#. Add dpdk ports to the bridge:
.. code-block:: bash
# ovs-vsctl add-port br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser
# ovs-vsctl add-port br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser
#. Run guest virtual machine A using the next configuration as reference, where
**$IMAGE** var is the name of the Clear Linux* OS for Intel Architecture image.
.. code-block:: bash
qemu-system-x86_64 \
-enable-kvm -m 1024 \
-bios OVMF.fd \
-smp 4 -cpu host \
-vga none -nographic \
-drive file="$IMAGE",if=virtio,aio=threads \
-chardev socket,id=char1,path=/run/openvswitch/vhost-user1 \
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce \
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 \
-object memory-backend-file,id=mem,size=1024M,mem-path=/dev/ hugepages,share=on \
-numa node,memdev=mem -mem-prealloc \
-debugcon file:debug.log -global isa-debugcon.iobase=0x402
#. Run guest virtual machine B, use the configuration from the previous step;
simply change the MAC address and the port socket. You can use 00:00:00:00:00:02 as a
MAC address and vhost-user2 as a socket.
#. Follow the instructions from the `Setting IP address`_ section.
.. _Setting IP address:
Setting IP address
==================
#. Set an IP address to virtual machine for virtual machine A:
.. code-block:: bash
# ip addr add dev enp0s2 10.0.0.5/24
for virtual machine B:
.. code-block:: bash
# ip addr add dev enp0s2 10.0.0.6/24
#. Check if there is communication between both virtual machines using ping tool.
#. Verify that Apache service is running:
.. code-block:: bash
# systemctl status httpd.service
# systemctl start httpd.service
Start httpd service only if it is inactive. Use apache benchmark to get
information about the network performance between both virtual machines.
.. code-block:: bash
# ab -n 1000000 -c 100 http://10.0.0.6/
.. _DPDK: http://dpdk.org/
.. _kvm: https://download.clearlinux.org/releases/
.. _ac-ovs-dpdk:
OpenvSwitch and DPDK
####################
Introduction
============
Enabling `DPDK`_ support on the **OpenvSwitch project** can yield significant
network performance improvements. To illustrate one such example, we'll
cover a simple use case with :ref:`f1ovs`, where one virtual machine sends
1,000,000 HTTP requests to another virtual machine using
* *Linux bridges**
* **OpenvSwitch bridges**
* And custom-built **OpenvSwitch-DPDK bridges** as the network link.
.. _f1ovs:
.. figure:: ../_static/images/advanced/use_case.png
Figure 1: Basic virtual network environment.
**Requirements:**
To follow along with this example, you will need:
* At least one platform using Clear Linux* OS for Intel® Architecture
(recommended release >= ``7160``) as Host,
* The ``kernel-native`` bundle enabled on that particular Host,
* And the ``network-advanced``, and ``os-clr-on-clr`` bundles installed.
.. code-block:: bash
# swupd bundle-add network-advanced os-clr-on-clr
You'll also need two `kvm`_ images (recommended release >= ``7160``).
These images will create the guest virtual machines A and B. These virtual machines
must also have ``network-basic`` and ``lamp-basic`` bundles installed.
.. code-block:: bash
# swupd bundle-add network-basic lamp-basic
Using Linux Bridges
===================
#. Create a script named **qemu-ifup** for a linux bridge in a virtual machine.
.. code-block:: bash
#!/bin/bash
set -x
switch=br0
if [ -n "$1" ];then
tunctl -u whoami -t $1
ip link set $1 up
sleep 0.5s
brctl addif $switch $1
exit 0
else
echo "Error: no interface specified"
exit 1
fi
#. Enable execute permission on the script, preserving its group permissions with
respect to other files.
.. code-block:: bash
# chmod a+x qemu-ifup
#. Create a bridge using the OpenvSwitch tool; you can verify whether the bridge
was successfully created by using ip tool.
.. code-block:: bash
# brctl addbr br0
Note: At this point, you have the option to add a NIC with ``brctl addif br0 <network interface>``. Sample interface below should be replaced with your local
NIC's designation.
.. code-block:: bash
# brctl addif br0 enp3s0f0
When the above option is used, and the NIC is connected to DHCP server, so Steps
1 and 2 under the `Setting IP address`_ section.
#. Set up the Linux bridge.
.. code-block:: bash
# ip link set dev br0 up
#. Run guest virtual machine A using the next configuration as reference, where
the **$IMAGE** var is the Clear Linux image name.
.. code-block:: bash
qemu-system-x86_64 \
-enable-kvm -m 1024 \
-bios OVMF.fd \
-smp cpus=2,cores=1 -cpu host \
-vga none -nographic \
-drive file="$IMAGE",if=virtio,aio=threads \
-net nic,macaddr=00:11:22:33:44:55,model=virtio -net tap,script=qemu-ifup \
-debugcon file:debug.log -global isa-debugcon.iobase=0x402
#. Run guest virtual machine B using the configuration from the previous step;
take care to update the MAC address.
#. Follow the instructions from the `Setting IP Address`_ section.
#. And to clean the previous environment, turn off the virtual machines and delete
the bridge.
.. code-block:: bash
# ip link set dev br0 down
# brctl delbr br0
Using OpenvSwitch
=================
#. Start the OpenvSwitch service.
.. code-block:: bash
# systemctl start openvswitch.service
#. Create a bridge using the OpenvSwitch tool; you can verify whether or not the
bridge was successfully created by running ip tool.
.. code-block:: bash
# ovs-vsctl add-br br0
# ip a
#. Create **UP-DOWN** scripts which can bring up the tap devices through the
bridge we created in Step 2.
The **ovs-ifdown** script should look something like:
.. code-block:: bash
#!/bin/sh
switch="br0"
/usr/bin/ifconfig $1 0.0.0.0 down
ovs-vsctl del-port ${switch} $1
And the **ovs-ifup script** should look something like:
.. code-block:: bash
#!/bin/sh
switch="br0"
/usr/bin/ifconfig $1 0.0.0.0 up
ovs-vsctl add-port ${switch} $1
#. Enable execute permission on the scripts, preserving their group permissions
with respect to other files.
.. code-block:: bash
# chmod a+x ovs-ifdown
# chmod a+x ovs-ifup
#. Run guest virtual machine A using the next configuration as reference, where
**$IMAGE** var is the name of the Clear Linux* OS for Intel Architecture image.
Notice the network configuration uses the up-down scripts.
.. code-block:: bash
qemu-system-x86_64 \
-enable-kvm -m 1024 \
-bios OVMF.fd \
-smp cpus=2,cores=1 -cpu host \
-vga none -nographic \
-drive file="$IMAGE",if=virtio,aio=threads \
-net nic,model=virtio,macaddr=00:11:22:33:44:55 -net tap,script=ovs-ifup,downscript=ovs-ifdown \
-debugcon file:debug.log -global isa-debugcon.iobase=0x402
#. Run guest virtual machine B using the configuration from step 5, only
it's necessary to change the MAC address to something like *00:11:22:33:44:56*
#. Follow the instructions in the `Setting IP address`_ section.
Using Linux OpenvSwitch-DPDK
============================
#. Create a new environment and add **iommu=pt intel_iommu=on** to the kernel
command line.
.. code-block:: bash
# systemctl start boot.mount
# cd /boot/loader/entries/
#. Edit :file:`clear-linux-native-<kernel-version>.conf`, and add
**iommu=pt intel_iommu=on** to the end of the line.
#. Then ``umount`` and reboot the machine.
.. code-block:: bash
# cd /
# systemctl stop boot.mount
# reboot
#. Set number of hugepages.
.. code-block:: bash
# echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
#. Allocate pages on NUMA machines.
.. code-block:: bash
# echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
# echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
#. Making memory available for DPDK.
.. code-block:: bash
# mkdir -p /mnt/huge
# mount -t hugetlbfs nodev /mnt/huge
#. Add cores and memory configuration to the OpenvSwitch example; the
:file:`/usr/share/openvswitch/scripts/ovs-ctl` file can be edited on line 256
and DPDK configuration can be added.
It should look something like:
``set ovs-vswitchd --dpdk -c 0x2 -n 4 --socket-mem 2048 -- unix:"$DB_SOCK"``
The next regular expression could be helpful:
.. code-block:: bash
# sed -i s/"set ovs-vswitchd unix:"/"set ovs-vswitchd --dpdk -c 0x2 -n 4 --socket-mem 2048 -- unix:"/g /usr/share/openvswitch/scripts/ovs-ctl
#. Start the OpenvSwitch service:
.. code-block:: bash
# systemctl start openvswitch.service
#. Create a virtual bridge using openvswitch:
.. code-block:: bash
# ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
#. Add dpdk ports to the bridge:
.. code-block:: bash
# ovs-vsctl add-port br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser
# ovs-vsctl add-port br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser
#. Run guest virtual machine A using the next configuration as reference, where
**$IMAGE** var is the name of the Clear Linux* OS for Intel Architecture image.
.. code-block:: bash
qemu-system-x86_64 \
-enable-kvm -m 1024 \
-bios OVMF.fd \
-smp 4 -cpu host \
-vga none -nographic \
-drive file="$IMAGE",if=virtio,aio=threads \
-chardev socket,id=char1,path=/run/openvswitch/vhost-user1 \
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce \
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 \
-object memory-backend-file,id=mem,size=1024M,mem-path=/dev/ hugepages,share=on \
-numa node,memdev=mem -mem-prealloc \
-debugcon file:debug.log -global isa-debugcon.iobase=0x402
#. Run guest virtual machine B, use the configuration from the previous step;
simply change the MAC address and the port socket. You can use 00:00:00:00:00:02 as a
MAC address and vhost-user2 as a socket.
#. Follow the instructions from the `Setting IP address`_ section.
.. _Setting IP address:
Setting IP address
==================
#. Set an IP address to virtual machine for virtual machine A:
.. code-block:: bash
# ip addr add dev enp0s2 10.0.0.5/24
for virtual machine B:
.. code-block:: bash
# ip addr add dev enp0s2 10.0.0.6/24
#. Check if there is communication between both virtual machines using ping tool.
#. Verify that Apache service is running:
.. code-block:: bash
# systemctl status httpd.service
# systemctl start httpd.service
Start httpd service only if it is inactive. Use apache benchmark to get
information about the network performance between both virtual machines.
.. code-block:: bash
# ab -n 1000000 -c 100 http://10.0.0.6/
.. _DPDK: http://dpdk.org/
.. _kvm: https://download.clearlinux.org/releases/
@@ -1,137 +1,137 @@
.. _validate_sigs:
Validating Signatures
#####################
Clear Linux* OS for Intel® Architecture offers a way to validate signatures
to create verified build artifacts. Validations can be obtained by users and
by code to confirm that we are indeed dealing with official outputs.
Multiple types of artifacts have signing/verifying:
* Image checksums files; for example, `release 8890`_ has
* ``clear-*.img.xz`` image files,
* ``clear-*.img.xz-SHA512SUMS`` checksum files, and
* ``clear-*.img.xz-SHA512SUMS.sig`` signature files.
* The :command:`swupd` Manifest of Manifests (aka :abbr:`MoM (Manifest of Manifests)`)
``https://download.clearlinux.org/update/8890/`` has ``Manifest.MoM``
and ``Manifest.MoM.sig`` signature file.
Verifying a Clear Linux OS for Intel Architecture image
=======================================================
Verification of images is done by humans when they download an image via the following steps:
#. Download the current ``ClearLinuxRoot.pem`` certificate; this is provided
with the release being downloaded. For example, if you're interested in verifying
the ``8970`` release, obtain the certificate from https://download.clearlinux.org/releases/8970/clear/ClearLinuxRoot.pem.
#. Download the desired OS image, as well as the ``[image]-SHA512SUMS.sig`` file.
#. Download and validate the release's OS ``ClearLinuxRoot.pem`` certificate:
* Validate the certificate by comparing the downloaded certificate's
``sha256sum`` hash with what is published here:
.. code-block:: console
$ sha256sum ClearLinuxRoot.pem
You should see this (accurate as of 2016-06-16 00:00 UTC):
.. code-block:: console
4b0ca67300727477913c331ff124928a98bcf2fb12c011a855f17cd73137a890 ClearLinuxRoot.pem
* Now we verify that the signature file is valid, which also proves
the OS image tarball is as trusted as the ``ClearLinuxRoot`` certificate.
To do this, create the **SHA512SUMS** file of the tarball. This is the
content which is actually signed by the release team.
.. code-block:: console
$ sha512sum ./[image-####].img.xz > sha512sum.out
* Finally, we can use :command:`openssl` to validate the signed
:file:`SHA512SUMS.sig` was signed by the ``ClearLinuxRoot`` certificate:
.. code-block:: console
$ openssl smime -verify -in [image]-SHA512SUMS.sig -inform der -content sha512sum.out -CAfile ClearLinuxRoot.pem -out /dev/null
After running this, you should see: :code:`Verification successful`.
If you do not see this, you cannot be certain the OS you downloaded
can be trusted.
Verification of the signed MoM
==============================
An overview of the mechanism used internal to :command:`swupd`
(implemented in C calls to the openssl library API) is as follows:
#. A trusted certificate is distributed with all Clear Linux
OS for Intel Architecture releases in :file:`/usr/share/clear/update-ca/ClearLinuxRoot.pem`.
#. :command:`swupd` downloads the top-level manifest (MoM), as
well as the signed :file:`MoM.sig` for the currently-installed
image, and for the release being updated to in the case of an update.
#. :command:`swupd` generates a ``sha256sum`` of the MoM.
#. :command:`swupd` uses the :file:`MoM.sig` downloaded in step 1,
as well as the ``sha256sum``; and, using the openssl API, it makes
an equivalent call to the verification command:
.. code-block:: c
openssl smime -verify -in sha256sums.sig -inform der -content sha512sum.out -CAfile ClearLinuxRoot.pem
Note that the actual API call is to ``PKCS7_verify())``.
#. With a successful verification, we can proceed to trust this
MoM and its contents, which consist of hashes of the contents
of all bundle manifests.
* **Success** When a successful signature verification occurs, you
should see the following message as part of the :command:`swupd`
output:
.. code-block:: console
Signature check succeeded
* **Fail** Should verification fail, you will see:
.. code-block:: console
WARNING!!! FAILED TO VERIFY SIGNATURE OF Manifest.MoM
#. As :command:`swupd` then uses or installs bundle manifests, that
bundle manifest hash is matched to the trusted MoM, extending the
chain of trust from the MoM, to the bundle manifests, and out to
every file installed.
Clear Linux* OS for Intel® Architecture Public Key as of 06/16/2016 00:00 UTC
-----------------------------------------------------------------------------
.. code-block:: raw
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwfnY2m665SwYxr4/R+8L
X1IMAkVYmvNiI5KmV815WvVQwUQDDCY1HUag+wb2BhTxkotKUdm6LGY1ck+Eb742
rdICMToX+32vFM3XvIK16TKM6ficPsGA4xmbE/9qp01bn0O4MCwKjPAmxJkW+UOO
L5u8p9VBZ1MYMnsRkECPZif/fULqIU73aYD3HYtcYEk1+N8n1AcNkpRY9p3Qd92M
9aRlCNl1sb2g5DwSx9G0dWTS+YPchpclV7fBGQUiTuxb72hpVRE66CfR8tTd14np
IbsKGq0S5PzkR9ubilDywFQ/6XPc1Rur/4g0rm6pPPx7DLQK3EqC8d4Z/C2nywje
PwIDAQAB
-----END PUBLIC KEY-----
You can re-create this when given a cert with the command:
.. code-block:: console
$ openssl x509 -pubkey -noout -in ClearLinuxRoot.pem
.. _validate_sigs:
Validating Signatures
#####################
Clear Linux* OS for Intel® Architecture offers a way to validate signatures
to create verified build artifacts. Validations can be obtained by users and
by code to confirm that we are indeed dealing with official outputs.
Multiple types of artifacts have signing/verifying:
* Image checksums files; for example, `release 8890`_ has
* ``clear-*.img.xz`` image files,
* ``clear-*.img.xz-SHA512SUMS`` checksum files, and
* ``clear-*.img.xz-SHA512SUMS.sig`` signature files.
* The :command:`swupd` Manifest of Manifests (aka :abbr:`MoM (Manifest of Manifests)`)
``https://download.clearlinux.org/update/8890/`` has ``Manifest.MoM``
and ``Manifest.MoM.sig`` signature file.
Verifying a Clear Linux OS for Intel Architecture image
=======================================================
Verification of images is done by humans when they download an image via the following steps:
#. Download the current ``ClearLinuxRoot.pem`` certificate; this is provided
with the release being downloaded. For example, if you're interested in verifying
the ``8970`` release, obtain the certificate from https://download.clearlinux.org/releases/8970/clear/ClearLinuxRoot.pem.
#. Download the desired OS image, as well as the ``[image]-SHA512SUMS.sig`` file.
#. Download and validate the release's OS ``ClearLinuxRoot.pem`` certificate:
* Validate the certificate by comparing the downloaded certificate's
``sha256sum`` hash with what is published here:
.. code-block:: console
$ sha256sum ClearLinuxRoot.pem
You should see this (accurate as of 2016-06-16 00:00 UTC):
.. code-block:: console
4b0ca67300727477913c331ff124928a98bcf2fb12c011a855f17cd73137a890 ClearLinuxRoot.pem
* Now we verify that the signature file is valid, which also proves
the OS image tarball is as trusted as the ``ClearLinuxRoot`` certificate.
To do this, create the **SHA512SUMS** file of the tarball. This is the
content which is actually signed by the release team.
.. code-block:: console
$ sha512sum ./[image-####].img.xz > sha512sum.out
* Finally, we can use :command:`openssl` to validate the signed
:file:`SHA512SUMS.sig` was signed by the ``ClearLinuxRoot`` certificate:
.. code-block:: console
$ openssl smime -verify -in [image]-SHA512SUMS.sig -inform der -content sha512sum.out -CAfile ClearLinuxRoot.pem -out /dev/null
After running this, you should see: :code:`Verification successful`.
If you do not see this, you cannot be certain the OS you downloaded
can be trusted.
Verification of the signed MoM
==============================
An overview of the mechanism used internal to :command:`swupd`
(implemented in C calls to the openssl library API) is as follows:
#. A trusted certificate is distributed with all Clear Linux
OS for Intel Architecture releases in :file:`/usr/share/clear/update-ca/ClearLinuxRoot.pem`.
#. :command:`swupd` downloads the top-level manifest (MoM), as
well as the signed :file:`MoM.sig` for the currently-installed
image, and for the release being updated to in the case of an update.
#. :command:`swupd` generates a ``sha256sum`` of the MoM.
#. :command:`swupd` uses the :file:`MoM.sig` downloaded in step 1,
as well as the ``sha256sum``; and, using the openssl API, it makes
an equivalent call to the verification command:
.. code-block:: c
openssl smime -verify -in sha256sums.sig -inform der -content sha512sum.out -CAfile ClearLinuxRoot.pem
Note that the actual API call is to ``PKCS7_verify())``.
#. With a successful verification, we can proceed to trust this
MoM and its contents, which consist of hashes of the contents
of all bundle manifests.
* **Success** When a successful signature verification occurs, you
should see the following message as part of the :command:`swupd`
output:
.. code-block:: console
Signature check succeeded
* **Fail** Should verification fail, you will see:
.. code-block:: console
WARNING!!! FAILED TO VERIFY SIGNATURE OF Manifest.MoM
#. As :command:`swupd` then uses or installs bundle manifests, that
bundle manifest hash is matched to the trusted MoM, extending the
chain of trust from the MoM, to the bundle manifests, and out to
every file installed.
Clear Linux* OS for Intel® Architecture Public Key as of 06/16/2016 00:00 UTC
-----------------------------------------------------------------------------
.. code-block:: raw
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwfnY2m665SwYxr4/R+8L
X1IMAkVYmvNiI5KmV815WvVQwUQDDCY1HUag+wb2BhTxkotKUdm6LGY1ck+Eb742
rdICMToX+32vFM3XvIK16TKM6ficPsGA4xmbE/9qp01bn0O4MCwKjPAmxJkW+UOO
L5u8p9VBZ1MYMnsRkECPZif/fULqIU73aYD3HYtcYEk1+N8n1AcNkpRY9p3Qd92M
9aRlCNl1sb2g5DwSx9G0dWTS+YPchpclV7fBGQUiTuxb72hpVRE66CfR8tTd14np
IbsKGq0S5PzkR9ubilDywFQ/6XPc1Rur/4g0rm6pPPx7DLQK3EqC8d4Z/C2nywje
PwIDAQAB
-----END PUBLIC KEY-----
You can re-create this when given a cert with the command:
.. code-block:: console
$ openssl x509 -pubkey -noout -in ClearLinuxRoot.pem
.. _release 8890: https://download.clearlinux.org/releases/8890/clear/
@@ -1,85 +1,85 @@
.. _bdl-containers-basic:
containers-basic
################
This bundle provides container applications
Multiple runtime support for Docker
===================================
Docker\* 1.12+ provides a way to execute containers using different **"oci
runtimes"**. An **"oci runtime"** is software compatible with :abbr:`OCI
(Open Containers Initiative)` specification that is responsible to create
a container.
.. note:: Docker in Clear Linux is configured to use 2 runtimes:
**cc-oci-runtime**: This is the default runtime used by docker in Clear Linux (if
Vt-x support is enabled). This runtime provides the capability to create secure
containers using Clear Containers (based VM containers).
**runc**: This runtime is used to spawn and run containers using namespaces and
cgroups (this is the traditional way to create containers used by docker).
In Clear Linux, each time a container is created it uses cc-oci-runtime (*A.K.A*
**cor**).
To start a secure container with cc-oci-runtime aka cor::
docker run -ti debian sh
In the case you want to start a non secure container. You can
use the option **--runtime=runc** in the docker command **"run"**
To start an non-secure container using runc runtime::
docker run --runtime=runc -ti debian sh
Change default runtime
======================
To modify the default runtime you can override
the stateless docker daemon configuration
creating the file :file:`/etc/systemd/system/docker-cor.service.d/docker.conf`
and adding **--default-runtinme=runc**::
[Service]
ExecStart=/usr/bin/dockerd -H fd:// --storage-driver=overlay --add runtime cor=cc-oci-runtime --default-runtime=runc
HTTP proxy
==========
If you are behind an HTTP proxy server, for example in corporate settings, you
will need to add this configuration in the Docker systemd service file.
First, create a systemd drop-in directory for the docker service::
mkdir /etc/systemd/system/docker-cor.service.d
Now create a file called :file:`/etc/systemd/system/docker-cor.service.d/http-proxy.conf`
that adds the HTTP_PROXY environment variable::
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
If you have internal Docker registries that you need to contact without proxying
you can specify them via the NO_PROXY environment variable::
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
Flush changes::
$ sudo systemctl daemon-reload
Verify that the configuration has been loaded::
$ systemctl show --property=Environment docker-cor
Environment=HTTP_PROXY=http://proxy.example.com:80/
Restart Docker::
$ sudo systemctl restart docker-cor
To get more info you can view https://docs.docker.com/engine/admin/systemd/
.. _bdl-containers-basic:
containers-basic
################
This bundle provides container applications
Multiple runtime support for Docker
===================================
Docker\* 1.12+ provides a way to execute containers using different **"oci
runtimes"**. An **"oci runtime"** is software compatible with :abbr:`OCI
(Open Containers Initiative)` specification that is responsible to create
a container.
.. note:: Docker in Clear Linux is configured to use 2 runtimes:
**cc-oci-runtime**: This is the default runtime used by docker in Clear Linux (if
Vt-x support is enabled). This runtime provides the capability to create secure
containers using Clear Containers (based VM containers).
**runc**: This runtime is used to spawn and run containers using namespaces and
cgroups (this is the traditional way to create containers used by docker).
In Clear Linux, each time a container is created it uses cc-oci-runtime (*A.K.A*
**cor**).
To start a secure container with cc-oci-runtime aka cor::
docker run -ti debian sh
In the case you want to start a non secure container. You can
use the option **--runtime=runc** in the docker command **"run"**
To start an non-secure container using runc runtime::
docker run --runtime=runc -ti debian sh
Change default runtime
======================
To modify the default runtime you can override
the stateless docker daemon configuration
creating the file :file:`/etc/systemd/system/docker-cor.service.d/docker.conf`
and adding **--default-runtinme=runc**::
[Service]
ExecStart=/usr/bin/dockerd -H fd:// --storage-driver=overlay --add runtime cor=cc-oci-runtime --default-runtime=runc
HTTP proxy
==========
If you are behind an HTTP proxy server, for example in corporate settings, you
will need to add this configuration in the Docker systemd service file.
First, create a systemd drop-in directory for the docker service::
mkdir /etc/systemd/system/docker-cor.service.d
Now create a file called :file:`/etc/systemd/system/docker-cor.service.d/http-proxy.conf`
that adds the HTTP_PROXY environment variable::
[Service]
Environment="HTTP_PROXY=http://proxy.example.com:80/"
If you have internal Docker registries that you need to contact without proxying
you can specify them via the NO_PROXY environment variable::
Environment="HTTP_PROXY=http://proxy.example.com:80/" "NO_PROXY=localhost,127.0.0.1,docker-registry.somecorporation.com"
Flush changes::
$ sudo systemctl daemon-reload
Verify that the configuration has been loaded::
$ systemctl show --property=Environment docker-cor
Environment=HTTP_PROXY=http://proxy.example.com:80/
Restart Docker::
$ sudo systemctl restart docker-cor
To get more info you can view https://docs.docker.com/engine/admin/systemd/
+10
View File
@@ -0,0 +1,10 @@
Bundles
#######
.. toctree::
:maxdepth: 2
overview
basic-containers
openssh-server
os-core
@@ -1,40 +1,40 @@
.. _bdl-openssh-server:
openssh-server
##############
This bundle provides an ssh server.
SFTP
====
Clear Linux *disables* sftp subsystem by default for security reasons.
To enable sftp subsystem you will need to add this configuration in the sshd
service file.
First, create a systemd drop-in directory for the sshd service::
# mkdir /etc/systemd/system/sshd@.service.d
Now create a file called :file:`/etc/systemd/system/sshd@.service.d/sftp.conf`
that adds the OPTIONS environment variable::
[Service]
Environment="OPTIONS=-o Subsystem=\"sftp /usr/libexec/sftp-server\""
Now, sftp subsystem is enabled.
Root login
==========
To enable root login via ssh, you should do the following:
#. Create a *ssh* directory in /etc (if not exist)::
# mkdir /etc/ssh
#. Set config variable::
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
.. _bdl-openssh-server:
openssh-server
##############
This bundle provides an ssh server.
SFTP
====
Clear Linux *disables* sftp subsystem by default for security reasons.
To enable sftp subsystem you will need to add this configuration in the sshd
service file.
First, create a systemd drop-in directory for the sshd service::
# mkdir /etc/systemd/system/sshd@.service.d
Now create a file called :file:`/etc/systemd/system/sshd@.service.d/sftp.conf`
that adds the OPTIONS environment variable::
[Service]
Environment="OPTIONS=-o Subsystem=\"sftp /usr/libexec/sftp-server\""
Now, sftp subsystem is enabled.
Root login
==========
To enable root login via ssh, you should do the following:
#. Create a *ssh* directory in /etc (if not exist)::
# mkdir /etc/ssh
#. Set config variable::
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
@@ -1,83 +1,83 @@
.. _bdl-os-core:
os-core
#######
This bundle contains the basic core OS components.
Static IP
=========
To configure a static IP you should follow the next steps:
#. Create file :file:`/etc/systemd/network/50-static.network`. If a directory
does not exist, please create it.
#. The minimum lines the :file:`50-static.network` file should contain are::
[Match]
Name=<device_name>
[Network]
Address=<A static IPv4 or IPv6 address and its prefix length, separated by a "/" character>
Gateway=<The gateway address>
The *<device_name>* is your network device name (i.e. enp1s0 or enp0s25).
#. If you want to add more options you can consult the
`systemd network configuration`_ manual.
#. Restart *systemd-networkd* service using::
# systemctl restart systemd-networkd
or restart Clear Linux.
#. Check new IP with::
# ip addr
Setting Time
============
Clear Linux utilizes **systemd-timesyncd.service** to sync time.
Default :abbr:`NTP (Network Time Protocol)` servers are
configured as *time1.google.com, time2.google.com, time3.google.com, and
time4.google.com*. It is not possible to set the time manually, via
*timedatectl*
or to use RTC mode. In the event that those servers cannot be reached and the
time is incorrect on your system, try these steps:
#. Make sure that you've set your timezone:
* If you at Pacific time::
timedatectl set-timezone America/Los_Angeles
or you can choose a preferred timezone
* To see a list of timezones, do::
timedatectl list-timezones | grep <locale>
#. Create :file:`/etc/systemd/` directory
#. Open your chosen editor and type into the
:file:`/etc/systemd/timesyncd.conf` file::
[Time]
NTP=<Preferred Server>
FallbackNTP=<backup server 1> <backup server 2>
#. Restart timesync daemon::
# systemctl restart systemd-timesyncd
.. note:: Check to make sure your time is correctly set: date
.. _systemd network configuration: https://www.freedesktop.org/software/systemd/man/systemd.network.html
.. _bdl-os-core:
os-core
#######
This bundle contains the basic core OS components.
Static IP
=========
To configure a static IP you should follow the next steps:
#. Create file :file:`/etc/systemd/network/50-static.network`. If a directory
does not exist, please create it.
#. The minimum lines the :file:`50-static.network` file should contain are::
[Match]
Name=<device_name>
[Network]
Address=<A static IPv4 or IPv6 address and its prefix length, separated by a "/" character>
Gateway=<The gateway address>
The *<device_name>* is your network device name (i.e. enp1s0 or enp0s25).
#. If you want to add more options you can consult the
`systemd network configuration`_ manual.
#. Restart *systemd-networkd* service using::
# systemctl restart systemd-networkd
or restart Clear Linux.
#. Check new IP with::
# ip addr
Setting Time
============
Clear Linux utilizes **systemd-timesyncd.service** to sync time.
Default :abbr:`NTP (Network Time Protocol)` servers are
configured as *time1.google.com, time2.google.com, time3.google.com, and
time4.google.com*. It is not possible to set the time manually, via
*timedatectl*
or to use RTC mode. In the event that those servers cannot be reached and the
time is incorrect on your system, try these steps:
#. Make sure that you've set your timezone:
* If you at Pacific time::
timedatectl set-timezone America/Los_Angeles
or you can choose a preferred timezone
* To see a list of timezones, do::
timedatectl list-timezones | grep <locale>
#. Create :file:`/etc/systemd/` directory
#. Open your chosen editor and type into the
:file:`/etc/systemd/timesyncd.conf` file::
[Time]
NTP=<Preferred Server>
FallbackNTP=<backup server 1> <backup server 2>
#. Restart timesync daemon::
# systemctl restart systemd-timesyncd
.. note:: Check to make sure your time is correctly set: date
.. _systemd network configuration: https://www.freedesktop.org/software/systemd/man/systemd.network.html
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -1,220 +1,220 @@
.. _ciao-deploy:
.. contents::
Deploying ciao via automation -- Ubuntu 16.04
#############################################
Cloud Integrated Advanced Orchestrator (``ciao``) is a new workload
scheduler designed to address limitations of current cloud OS projects.
Ciao provides a lightweight, fully TLS-based minimal config, is
workload-agnostic, easy to update, offers an optimized-for-speed
scheduler, and is currently optimized for OpenStack*.
For more information, see https://clearlinux.org/ciao.
Environment
===========
For this example, we'll use a total of five nodes:
- A deployment machine which will be used to run the playbooks.
- A `controller`_ node which will be used to communicate with Keystone.
- Two `compute nodes`_, which will spawn the VMs and containers.
- A `network node`_ which will handle the networking for the workloads.
Note: The deployment machine is not a necessary part of the cluster; it could be
the sysadmin's computer or a CI/CD server.
.. _prerequisites:
Prerequisites
=============
Ansible* uses :command:`ssh` to run commands on the remote nodes. In
order to do that, the nodes must be configured to allow passwordless SSH
connections from the deployment machine to the cluster nodes. The user
should also have sudo privileges on the cluster nodes.
The deployment machine needs::
Python 2.7
Ansible >= 2.1
Golang >= 1.7
qemu-utils
python-docker
python-openstackclient
Ansible ciao roles from ansible-galaxy
The managed nodes need::
python 2.6 >=
Proxy
=====
If you are running behind a proxy, the following additional steps are needed:
In the deployment node
----------------------
Make sure apt can run. Edit ``/etc/apt/apt.conf`` (to install ansible and
dependencies), appending it with::
Acquire::http::Proxy "http://yourproxyaddress:proxyport";
Install the CIAO roles from ansible-galaxy:
$ sudo -E ansible-galaxy -r requirements --ignore-certs
In the managed nodes
--------------------
Make sure apt can run. Edit ``/etc/apt/apt.conf``, appending it with::
Acquire::http::Proxy "http://yourproxyaddress:proxyport";
Install Docker and make sure you can pull images. Edit
``/etc/systemd/system/docker.service.d/http-proxy.conf``, appending it
with::
[Service]
Environment="HTTP_PROXY=http://hostname:port/"
Environment="HTTPS_PROXY=http://hostname:port/"
Environment=”NO_PROXY=localhost,127.0.0.1,.example.com”
Note: replace the hostname and port of your proxy server and append your local domain name.
Reload and restart the docker daemon::
$ sudo systemctl daemon-reload && sudo systemctl restart docker
(OPTIONAL): You can download the docker images used in the CIAO deployment.
$ sudo docker pull clearlinux/keystone
$ sudo docker pull clearlinux/ciao-webui
Install the software
====================
Install ansible from ubuntu packages if the package version is >= 2.1.0;
otherwise, install it from pip (``pip install ansible``).
Install Dependencies in the deployment machine
----------------------------------------------
::
python-docker (apt-get) or docker-py (pip)
python-openstackclient (apt-get)
qemu-utils (apt-get)
Download the ``clear-config-management`` project from github::
$ git clone https://github.com/clearlinux/clear-config-management.git
Create the playbook
===================
The ``clear-config-management`` project includes some sample playbooks that
you may use and customize for your own needs. Start by making a copy of the
sample playbook into your home folder::
# cp -r clear-config-management/examples/ciao ~/
Note: These files are also hosted in github
The relevant files in the playbook are the following:
* The `ciao.yml`_ file is the master playbook file and includes a playbook
for each component of the cluster.
* The `hosts`_ file is the hosts inventory file and contains the IP
addresses/FQDN of your nodes, grouped under the roles they will serve
* The `groups_vars/all`_ file contains variables that will be applied
to your ciao setup. The mandatory variables are already there; be
sure to change the values accordingly to fit your environment
* The ``ciao_guest_key`` value in :file:`groups_var/all` is the key
to be used to connect to the VMs created by ciao; you can use the
``ssh-keygen`` command to create one.
A full list of available variables can be found in the :file:`defaults/main.yml`
file of each role at https://github.com/clearlinux/clear-config-management/tree/master/roles
Install the required ansible-roles
==================================
.. code-block:: console
# ansible-galaxy install -r requirements.yml
Run the playbook
================
Once you have your variables and hosts file configured, the deployment can
be started with the following command:
.. code-block:: console
$ ansible-playbook -i hosts ciao.yml --private-key=<ssh_key>
Note: If you want the latest CIAO changes, change the ``ciao_dev``
variable to ``True`` in the :file:`group_vars/all` file In the
``clear-config-management`` project.
Verify
======
After ansible is done with the setup, you can verify the cluster is ready
by running the following command on the controller node. Change the **username**,
**password**, **controller**, and **identity** values to match your setup, as
was specified in the ``groups_var/all`` file:
.. code-block:: console
# ciao-cli -identity=https://ciao-controller.example.com:35357 \
-username admin \
-password secret \
-controller=ciao-controller.example.com
# node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
You could also take a look at the :file:`./ciaorc` file created on your
deployment node, which contains the following environment variables:
.. code-block:: console
# cat ciaorc
export CIAO_CONTROLLER=ciao-controller.example.com
export CIAO_IDENTITY=https://ciao-controller.example.com:35357
export CIAO_USERNAME=csr
export CIAO_PASSWORD=secret
then you could verify with the following command:
.. code-block:: console
# source ciaorc
# ciao-cli node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
.. _controller: https://github.com/01org/ciao/tree/master/ciao-controller
.. _compute nodes: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _network node: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _ciao.yml: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/ciao.yml
.. _hosts: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/hosts
.. _groups_vars/all: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/group_vars/all
.. _github: https://github.com/clearlinux/clear-config-management/tree/master/examples/ciao
.. _ciao-deploy:
.. contents::
Deploying ciao via automation -- Ubuntu 16.04
#############################################
Cloud Integrated Advanced Orchestrator (``ciao``) is a new workload
scheduler designed to address limitations of current cloud OS projects.
Ciao provides a lightweight, fully TLS-based minimal config, is
workload-agnostic, easy to update, offers an optimized-for-speed
scheduler, and is currently optimized for OpenStack*.
For more information, see https://clearlinux.org/ciao.
Environment
===========
For this example, we'll use a total of five nodes:
- A deployment machine which will be used to run the playbooks.
- A `controller`_ node which will be used to communicate with Keystone.
- Two `compute nodes`_, which will spawn the VMs and containers.
- A `network node`_ which will handle the networking for the workloads.
Note: The deployment machine is not a necessary part of the cluster; it could be
the sysadmin's computer or a CI/CD server.
.. _prerequisites:
Prerequisites
=============
Ansible* uses :command:`ssh` to run commands on the remote nodes. In
order to do that, the nodes must be configured to allow passwordless SSH
connections from the deployment machine to the cluster nodes. The user
should also have sudo privileges on the cluster nodes.
The deployment machine needs::
Python 2.7
Ansible >= 2.1
Golang >= 1.7
qemu-utils
python-docker
python-openstackclient
Ansible ciao roles from ansible-galaxy
The managed nodes need::
python 2.6 >=
Proxy
=====
If you are running behind a proxy, the following additional steps are needed:
In the deployment node
----------------------
Make sure apt can run. Edit ``/etc/apt/apt.conf`` (to install ansible and
dependencies), appending it with::
Acquire::http::Proxy "http://yourproxyaddress:proxyport";
Install the CIAO roles from ansible-galaxy:
$ sudo -E ansible-galaxy -r requirements --ignore-certs
In the managed nodes
--------------------
Make sure apt can run. Edit ``/etc/apt/apt.conf``, appending it with::
Acquire::http::Proxy "http://yourproxyaddress:proxyport";
Install Docker and make sure you can pull images. Edit
``/etc/systemd/system/docker.service.d/http-proxy.conf``, appending it
with::
[Service]
Environment="HTTP_PROXY=http://hostname:port/"
Environment="HTTPS_PROXY=http://hostname:port/"
Environment=”NO_PROXY=localhost,127.0.0.1,.example.com”
Note: replace the hostname and port of your proxy server and append your local domain name.
Reload and restart the docker daemon::
$ sudo systemctl daemon-reload && sudo systemctl restart docker
(OPTIONAL): You can download the docker images used in the CIAO deployment.
$ sudo docker pull clearlinux/keystone
$ sudo docker pull clearlinux/ciao-webui
Install the software
====================
Install ansible from ubuntu packages if the package version is >= 2.1.0;
otherwise, install it from pip (``pip install ansible``).
Install Dependencies in the deployment machine
----------------------------------------------
::
python-docker (apt-get) or docker-py (pip)
python-openstackclient (apt-get)
qemu-utils (apt-get)
Download the ``clear-config-management`` project from github::
$ git clone https://github.com/clearlinux/clear-config-management.git
Create the playbook
===================
The ``clear-config-management`` project includes some sample playbooks that
you may use and customize for your own needs. Start by making a copy of the
sample playbook into your home folder::
# cp -r clear-config-management/examples/ciao ~/
Note: These files are also hosted in github
The relevant files in the playbook are the following:
* The `ciao.yml`_ file is the master playbook file and includes a playbook
for each component of the cluster.
* The `hosts`_ file is the hosts inventory file and contains the IP
addresses/FQDN of your nodes, grouped under the roles they will serve
* The `groups_vars/all`_ file contains variables that will be applied
to your ciao setup. The mandatory variables are already there; be
sure to change the values accordingly to fit your environment
* The ``ciao_guest_key`` value in :file:`groups_var/all` is the key
to be used to connect to the VMs created by ciao; you can use the
``ssh-keygen`` command to create one.
A full list of available variables can be found in the :file:`defaults/main.yml`
file of each role at https://github.com/clearlinux/clear-config-management/tree/master/roles
Install the required ansible-roles
==================================
.. code-block:: console
# ansible-galaxy install -r requirements.yml
Run the playbook
================
Once you have your variables and hosts file configured, the deployment can
be started with the following command:
.. code-block:: console
$ ansible-playbook -i hosts ciao.yml --private-key=<ssh_key>
Note: If you want the latest CIAO changes, change the ``ciao_dev``
variable to ``True`` in the :file:`group_vars/all` file In the
``clear-config-management`` project.
Verify
======
After ansible is done with the setup, you can verify the cluster is ready
by running the following command on the controller node. Change the **username**,
**password**, **controller**, and **identity** values to match your setup, as
was specified in the ``groups_var/all`` file:
.. code-block:: console
# ciao-cli -identity=https://ciao-controller.example.com:35357 \
-username admin \
-password secret \
-controller=ciao-controller.example.com
# node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
You could also take a look at the :file:`./ciaorc` file created on your
deployment node, which contains the following environment variables:
.. code-block:: console
# cat ciaorc
export CIAO_CONTROLLER=ciao-controller.example.com
export CIAO_IDENTITY=https://ciao-controller.example.com:35357
export CIAO_USERNAME=csr
export CIAO_PASSWORD=secret
then you could verify with the following command:
.. code-block:: console
# source ciaorc
# ciao-cli node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
.. _controller: https://github.com/01org/ciao/tree/master/ciao-controller
.. _compute nodes: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _network node: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _ciao.yml: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/ciao.yml
.. _hosts: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/hosts
.. _groups_vars/all: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/group_vars/all
.. _github: https://github.com/clearlinux/clear-config-management/tree/master/examples/ciao
+178 -178
View File
@@ -1,178 +1,178 @@
.. _ciao-deploy:
.. contents::
Deploying ciao via automation
#############################
Cloud Integrated Advanced Orchestrator (``ciao``) is a new workload
scheduler designed to address limitations of current cloud OS projects.
Ciao provides a lightweight, fully TLS-based minimal config, is
workload-agnostic, easy to update, offers an optimized-for-speed
scheduler, and is currently optimized for OpenStack*.
For more information, see https://clearlinux.org/ciao.
Environment
===========
For this example, we'll use a total of five nodes:
- A deployment machine which will be used to run the playbooks.
- A `controller`_ node which will be used to communicate with Keystone.
- Two `compute nodes`_, which will spawn the VMs and containers.
- A `network node`_ which will handle the networking for the workloads.
.. note::
The deployment machine is not a necessary part of the cluster; it could be
the sysadmin's computer or a CI/CD server.
.. _prerequisites:
Prerequisites
=============
Ansible* uses :command:`ssh` to run commands on the remote nodes. In order to do
that, configure a user for passwordless SSH connections from the deployment
container to the cluster nodes. This user must also have passwordless sudo
privileges on the cluster nodes.
This guide uses a Docker* container to provide all the needed deployment tools;
in order to use it, you will need Docker in the machine you're using to orchestrate
your deployment.
Configure your cluster setup
============================
You will need to download the ciao example deployment as follows:
.. code-block:: console
$ git clone https://github.com/01org/ciao.git
Once you're cloned the repo, continue working in the
`ciao/_DeploymentAndDistroPackaging/ansible/` directory
.. code-block:: console
# cd $(pwd)/ciao/_DeploymentAndDistroPackaging/ansible/
Next, edit the configuration files for the cluster:
* The `hosts`_ file is the hosts inventory file which contains the IP
addresses/FQDN of your nodes, grouped under the roles they will serve.
* The `groups_vars/all`_ file contains variables that will be applied
to your ciao setup. The mandatory variables are already there; be
sure to change the values accordingly to fit your environment.
* The ``ciao_guest_key`` value in :file:`groups_var/all` is the key to be
used to connect to the VMs created by ciao; you can use the
``ssh-keygen`` command to create one.
A full list of available variables can be found in the
:file:`defaults/main.yml` file of each role at
https://github.com/01org/ciao/tree/master/_DeploymentAndDistroPackaging/ansible/roles.
To start your cluster setup, we provide a ready-to-use Docker container.
Simply download it and run your setup:
.. code-block:: console
$ docker pull clearlinux/ciao-deploy
You can later launch the container with:
.. code-block:: console
$ docker run --privileged -v /dev/:/dev/
-v /path/to/your/.ssh/key:/root/.ssh/id_rsa \
-v $(pwd)/ciao:/root/ciao \
-it clearlinux/ciao-deploy
.. note::
The cotainer needs `--privileged -v /dev/:/dev/` in order to
install your certificates in the `CNCI image`_.
To learn more about the Docker options used, please refer to the
`Docker* documentation`_.
Run the playbook
================
Once the variables and hosts file are configured, continue in the
`/root/ciao/_DeploymentAndDistroPackaging/ansible` directory and
start the deployment:
.. code-block:: console
# cd /root/ciao/_DeploymentAndDistroPackaging/ansible
# ansible-playbook -i hosts ciao.yml \
--private-key=~/.ssh/id_rsa \
--user=<REMOTE_USER>
.. note::
Note: The playbook will create the following files in the current folder of
the machine running the playbooks.
* ``./certificates``: This directory contains the certificates
that where created and copied to the cluster nodes.
* ``./images``: This directory contains the images used by the
ciao cluster (fedora, clearlinux, cnci, ovmf.fd).
* ``./ciaorc``: This file contains environment variables needed
by ciao cli to authenticate to the ciao cluster.
* ``./openrc``: This file contains environment variables needed by
openstack cli to authenticate with the ciao cluster.
Verify
======
After Ansible is done with the setup, you can verify the cluster is ready
by running the following command on the controller node. Change the **username**,
**password**, **controller**, and **identity** values to match your setup, as
was specified in the ``groups_var/all`` file:
.. code-block:: console
# ciao-cli -identity=https://ciao-controller.example.com:35357 -username ciao -password ciaoUserPassword -controller=ciao-controller.example.com node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
You could also take a look at the ``./ciaorc`` file created on your
deployment node, which contains the following environment variables:
.. code-block:: console
# cat ciaorc
export CIAO_CONTROLLER=ciao-controller.example.com
export CIAO_IDENTITY=https://ciao-controller.example.com:35357
export CIAO_USERNAME=ciao
export CIAO_PASSWORD=ciaoUserPassword
Then you could verify with the following command:
.. code-block:: console
# source ciaorc
# ciao-cli node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
.. _controller: https://github.com/01org/ciao/tree/master/ciao-controller
.. _compute nodes: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _network node: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _hosts: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/hosts
.. _groups_vars/all: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/group_vars/all
.. _github: https://github.com/clearlinux/clear-config-management/tree/master/examples/ciao
.. _CNCI image: https://github.com/01org/ciao/tree/master/networking/ciao-cnci-agent#cnci-agent
.. _Docker* documentation: https://docs.docker.com/engine/reference/commandline/run/
.. _ciao-deploy:
.. contents::
Deploying ciao via automation
#############################
Cloud Integrated Advanced Orchestrator (``ciao``) is a new workload
scheduler designed to address limitations of current cloud OS projects.
Ciao provides a lightweight, fully TLS-based minimal config, is
workload-agnostic, easy to update, offers an optimized-for-speed
scheduler, and is currently optimized for OpenStack*.
For more information, see https://clearlinux.org/ciao.
Environment
===========
For this example, we'll use a total of five nodes:
- A deployment machine which will be used to run the playbooks.
- A `controller`_ node which will be used to communicate with Keystone.
- Two `compute nodes`_, which will spawn the VMs and containers.
- A `network node`_ which will handle the networking for the workloads.
.. note::
The deployment machine is not a necessary part of the cluster; it could be
the sysadmin's computer or a CI/CD server.
.. _prerequisites:
Prerequisites
=============
Ansible* uses :command:`ssh` to run commands on the remote nodes. In order to do
that, configure a user for passwordless SSH connections from the deployment
container to the cluster nodes. This user must also have passwordless sudo
privileges on the cluster nodes.
This guide uses a Docker* container to provide all the needed deployment tools;
in order to use it, you will need Docker in the machine you're using to orchestrate
your deployment.
Configure your cluster setup
============================
You will need to download the ciao example deployment as follows:
.. code-block:: console
$ git clone https://github.com/01org/ciao.git
Once you're cloned the repo, continue working in the
`ciao/_DeploymentAndDistroPackaging/ansible/` directory
.. code-block:: console
# cd $(pwd)/ciao/_DeploymentAndDistroPackaging/ansible/
Next, edit the configuration files for the cluster:
* The `hosts`_ file is the hosts inventory file which contains the IP
addresses/FQDN of your nodes, grouped under the roles they will serve.
* The `groups_vars/all`_ file contains variables that will be applied
to your ciao setup. The mandatory variables are already there; be
sure to change the values accordingly to fit your environment.
* The ``ciao_guest_key`` value in :file:`groups_var/all` is the key to be
used to connect to the VMs created by ciao; you can use the
``ssh-keygen`` command to create one.
A full list of available variables can be found in the
:file:`defaults/main.yml` file of each role at
https://github.com/01org/ciao/tree/master/_DeploymentAndDistroPackaging/ansible/roles.
To start your cluster setup, we provide a ready-to-use Docker container.
Simply download it and run your setup:
.. code-block:: console
$ docker pull clearlinux/ciao-deploy
You can later launch the container with:
.. code-block:: console
$ docker run --privileged -v /dev/:/dev/
-v /path/to/your/.ssh/key:/root/.ssh/id_rsa \
-v $(pwd)/ciao:/root/ciao \
-it clearlinux/ciao-deploy
.. note::
The cotainer needs `--privileged -v /dev/:/dev/` in order to
install your certificates in the `CNCI image`_.
To learn more about the Docker options used, please refer to the
`Docker* documentation`_.
Run the playbook
================
Once the variables and hosts file are configured, continue in the
`/root/ciao/_DeploymentAndDistroPackaging/ansible` directory and
start the deployment:
.. code-block:: console
# cd /root/ciao/_DeploymentAndDistroPackaging/ansible
# ansible-playbook -i hosts ciao.yml \
--private-key=~/.ssh/id_rsa \
--user=<REMOTE_USER>
.. note::
Note: The playbook will create the following files in the current folder of
the machine running the playbooks.
* ``./certificates``: This directory contains the certificates
that where created and copied to the cluster nodes.
* ``./images``: This directory contains the images used by the
ciao cluster (fedora, clearlinux, cnci, ovmf.fd).
* ``./ciaorc``: This file contains environment variables needed
by ciao cli to authenticate to the ciao cluster.
* ``./openrc``: This file contains environment variables needed by
openstack cli to authenticate with the ciao cluster.
Verify
======
After Ansible is done with the setup, you can verify the cluster is ready
by running the following command on the controller node. Change the **username**,
**password**, **controller**, and **identity** values to match your setup, as
was specified in the ``groups_var/all`` file:
.. code-block:: console
# ciao-cli -identity=https://ciao-controller.example.com:35357 -username ciao -password ciaoUserPassword -controller=ciao-controller.example.com node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
You could also take a look at the ``./ciaorc`` file created on your
deployment node, which contains the following environment variables:
.. code-block:: console
# cat ciaorc
export CIAO_CONTROLLER=ciao-controller.example.com
export CIAO_IDENTITY=https://ciao-controller.example.com:35357
export CIAO_USERNAME=ciao
export CIAO_PASSWORD=ciaoUserPassword
Then you could verify with the following command:
.. code-block:: console
# source ciaorc
# ciao-cli node status
Total Nodes 3
Ready 0
Full 3
Offline 0
Maintenance 0
.. _controller: https://github.com/01org/ciao/tree/master/ciao-controller
.. _compute nodes: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _network node: https://github.com/01org/ciao/tree/master/ciao-launcher
.. _hosts: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/hosts
.. _groups_vars/all: https://github.com/clearlinux/clear-config-management/blob/master/examples/ciao/group_vars/all
.. _github: https://github.com/clearlinux/clear-config-management/tree/master/examples/ciao
.. _CNCI image: https://github.com/01org/ciao/tree/master/networking/ciao-cnci-agent#cnci-agent
.. _Docker* documentation: https://docs.docker.com/engine/reference/commandline/run/
+10
View File
@@ -0,0 +1,10 @@
CIAO
####
.. toctree::
:maxdepth: 2
deploy
deploy-ubuntu
quick-cluster-setup.rst
cluster-setup
@@ -1,12 +1,12 @@
.. _ciao-cluster-setup-quick:
Easy ciao development cluster setup
###################################
For quick ciao development cluster setup, see:
https://github.com/01org/ciao/wiki/Single-Machine-Development-Environment
For more detailed and configurable manual setup of ciao, see:
https://clearlinux.org/documentation/ciao-cluster-setup.html
.. _ciao-cluster-setup-quick:
Easy ciao development cluster setup
###################################
For quick ciao development cluster setup, see:
https://github.com/01org/ciao/wiki/Single-Machine-Development-Environment
For more detailed and configurable manual setup of ciao, see:
https://clearlinux.org/documentation/ciao-cluster-setup.html
+296 -296
View File
@@ -1,297 +1,297 @@
# -*- coding: utf-8 -*-
#
# Clear Linux documentation build configuration file, created by
# sphinx-quickstart on Fri May 8 11:43:01 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import shlex
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
#extensions = [
# 'sphinx.ext.autodoc', 'breathe', 'sphinx.ext.todo'
#]
extensions = [
'sphinx.ext.autodoc', 'sphinx.ext.todo'
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Clear Linux* Project for Intel® Architecture'
copyright = u'2016, many'
author = u'many'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.1'
# The full version, including alpha/beta/rc tags.
release = '0.1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
rst_epilog = """
.. include:: /substitutions.rst
"""
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'clearlinux'
#html_theme = 'zephyr'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['_themes']
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
html_title = "Documentation for Clear Linux* Project for Intel(r) Architecture"
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants =
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
html_domain_indices = False
# If false, no index is generated.
html_use_index = True
# If true, the index is split into individual pages for each letter.
html_split_index = True
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink =
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'clrdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'clr.tex', u'Documentation for Clear Linux* Project for Intel® Architecture',
u'many', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'clearlinux', u'Documentation for Clear Linux* Project for Intel® Architecture',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'clearlinux', u'Documentation for Clear Linux* Project for Intel® Architecture',
author, 'Clear Linux', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# If true, generates permalinks on the HTML output.
# -*- coding: utf-8 -*-
#
# Clear Linux documentation build configuration file, created by
# sphinx-quickstart on Fri May 8 11:43:01 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import shlex
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
#extensions = [
# 'sphinx.ext.autodoc', 'breathe', 'sphinx.ext.todo'
#]
extensions = [
'sphinx.ext.autodoc', 'sphinx.ext.todo'
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'Clear Linux* Project for Intel® Architecture'
copyright = u'2016, many'
author = u'many'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '0.1'
# The full version, including alpha/beta/rc tags.
release = '0.1'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = ['_build']
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = False
rst_epilog = """
.. include:: /substitutions.rst
"""
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'clearlinux'
#html_theme = 'zephyr'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
html_theme_path = ['_themes']
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
html_title = "Documentation for Clear Linux* Project for Intel(r) Architecture"
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants =
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
html_domain_indices = False
# If false, no index is generated.
html_use_index = True
# If true, the index is split into individual pages for each letter.
html_split_index = True
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink =
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'clrdoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, 'clr.tex', u'Documentation for Clear Linux* Project for Intel® Architecture',
u'many', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'clearlinux', u'Documentation for Clear Linux* Project for Intel® Architecture',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'clearlinux', u'Documentation for Clear Linux* Project for Intel® Architecture',
author, 'Clear Linux', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# If true, generates permalinks on the HTML output.
html_add_permalinks = False
+11 -10
View File
@@ -1,10 +1,11 @@
.. _disclaimers:
.. rubric:: Disclaimer
.. important::
This documentation is a work in progress and is being provided for
informative purposes only. Because it is a work in progress, there are
parts that are either missing or will be revised as code development
continues.
.. _disclaimers:
Disclaimers
###########
.. important::
This documentation is a work in progress and is being provided for
informative purposes only. Because it is a work in progress, there are
parts that are either missing or will be revised as code development
continues.
+15 -10
View File
@@ -1,10 +1,15 @@
.. raw:: html
<a rel="license"
href="http://creativecommons.org/licenses/by/4.0/"><img
alt="Creative Commons License" style="border-width:0"
src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br
/>This work is licensed under a <a rel="license"
href="http://creativecommons.org/licenses/by/4.0/">Creative Commons
Attribution 4.0 International License</a>
.. _license:
License
#######
.. raw:: html
<a rel="license"
href="http://creativecommons.org/licenses/by/4.0/"><img
alt="Creative Commons License" style="border-width:0"
src="https://i.creativecommons.org/l/by/4.0/88x31.png" /></a><br
/>This work is licensed under a <a rel="license"
href="http://creativecommons.org/licenses/by/4.0/">Creative Commons
Attribution 4.0 International License</a>
@@ -1,78 +1,78 @@
.. _gs_creating_bootable_usb:
Creating a bootable USB to install the OS
##########################################
Here's how to create a USB drive that initiates the process for
:ref:`gs_installing_clr_as_host`. Alternatively, you can test the
OS by :ref:`vm-kvm`.
What you need
=============
* A USB stick, formatted as ``ext4``. Remember that the process of
flashing data to a USB completely deletes the contents of the
drive; as always, run ``dd`` with caution.
* A Clear Linux* OS for Intel® Architecture image; the most current
release versions can be found at the following link:
`https://download.clearlinux.org/image <https://download.clearlinux.org/image>`_
* Older versions can be found on our `downloads page`_.
Download and checksum
=====================
::
$ wget https://download.clearlinux.org/image/clear-[release_number]-installer.img.xz
$ sha512sum clear-[release_number]-installer.img.xz
Confirm the mount point on the USB drive
========================================
Using ``$ lsblk`` is helpful to show the block-level devices;
a USB drive usually shows up under ``/sdb`` or ``/sdc`` (almost never
under ``/sda``), and should indicate disk space approximately the
size of the USB drive::
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
?? sdb 8:16 1 14.9G 0
?? sdb1 8:17 1 14.9G 0 part
Make sure the drive isn't already mounted. The easiest way is with
``umount`` or
::
# df
Flash the image to the USB
==========================
Flash the image with the following command, adding the ``-v`` option
for verbose mode (recommended), as the image file may be large, and the
write can take a while. This may need to be done as root or with sudo::
$ xzcat -v clear-[release_number]-installer.img.xz | dd of=/dev/sdb
Wait for the final confirmation
===============================
This example shows ``clear-9130-installer.img.xz`` flashed to a 16GB
USB drive mounted on ``/sdb``.
.. image:: _static/images/gs_confirmation_screen.png
:align: center
:alt: confirmation
Success! Your USB stick is now ready to boot and initiate the process for
:ref:`gs_installing_clr_as_host`.
.. _downloads page: https://download.clearlinux.org
.. _gs_creating_bootable_usb:
Creating a bootable USB to install the OS
##########################################
Here's how to create a USB drive that initiates the process for
:ref:`gs_installing_clr_as_host`. Alternatively, you can test the
OS by :ref:`vm-kvm`.
What you need
=============
* A USB stick, formatted as ``ext4``. Remember that the process of
flashing data to a USB completely deletes the contents of the
drive; as always, run ``dd`` with caution.
* A Clear Linux* OS for Intel® Architecture image; the most current
release versions can be found at the following link:
`https://download.clearlinux.org/image <https://download.clearlinux.org/image>`_
* Older versions can be found on our `downloads page`_.
Download and checksum
=====================
::
$ wget https://download.clearlinux.org/image/clear-[release_number]-installer.img.xz
$ sha512sum clear-[release_number]-installer.img.xz
Confirm the mount point on the USB drive
========================================
Using ``$ lsblk`` is helpful to show the block-level devices;
a USB drive usually shows up under ``/sdb`` or ``/sdc`` (almost never
under ``/sda``), and should indicate disk space approximately the
size of the USB drive::
$ lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
?? sdb 8:16 1 14.9G 0
?? sdb1 8:17 1 14.9G 0 part
Make sure the drive isn't already mounted. The easiest way is with
``umount`` or
::
# df
Flash the image to the USB
==========================
Flash the image with the following command, adding the ``-v`` option
for verbose mode (recommended), as the image file may be large, and the
write can take a while. This may need to be done as root or with sudo::
$ xzcat -v clear-[release_number]-installer.img.xz | dd of=/dev/sdb
Wait for the final confirmation
===============================
This example shows ``clear-9130-installer.img.xz`` flashed to a 16GB
USB drive mounted on ``/sdb``.
.. image:: ../_static/images/gs/gs_confirmation_screen.png
:align: center
:alt: confirmation
Success! Your USB stick is now ready to boot and initiate the process for
:ref:`gs_installing_clr_as_host`.
.. _downloads page: https://download.clearlinux.org
@@ -1,47 +1,47 @@
.. _gs-clear-containers-getting-started:
Clear Containers getting started guide
######################################
Introduction
============
Intel® Clear Containers v2.0 beta release is now available for evaluation.
This enables executing existing Docker applications in the secure
and fast Intel Clear Containers environment under Docker* 1.12 and beyond
via an :abbr:`Open Container Initiative (OCI)` compatible `runtime`.
Installation instructions
=========================
The primary host platform is Clear Linux* Project for Intel®
Architecture. For instructions on installing Docker and Clear Containers under
Clear Linux, please refer to instructions from the runtime source tree:
• https://github.com/01org/cc-oci-runtime/wiki/Installation
If you have any feedback, questions, or would like to participate and
contribute, then please consult the contact details (mailing list, IRC etc.)
in the document at:
- https://github.com/01org/cc-oci-runtime/blob/master/CONTRIBUTING.md
Source Code
===========
The source code for the Clear Containers 2.0 runtime and corresponding
qemu-lite are publicly hosted on github:
- https://github.com/01org/cc-oci-runtime
- https://github.com/01org/qemu-lite
Architecture Overview
=====================
Please see the the `Architecture Overview`_ section.
.. _Architecture Overview: https://clearlinux.org/documentation/clear-containers.html#architecture-overview
.. _gs-clear-containers-getting-started:
Clear Containers getting started guide
######################################
Introduction
============
Intel® Clear Containers v2.0 beta release is now available for evaluation.
This enables executing existing Docker applications in the secure
and fast Intel Clear Containers environment under Docker* 1.12 and beyond
via an :abbr:`Open Container Initiative (OCI)` compatible `runtime`.
Installation instructions
=========================
The primary host platform is Clear Linux* Project for Intel®
Architecture. For instructions on installing Docker and Clear Containers under
Clear Linux, please refer to instructions from the runtime source tree:
• https://github.com/01org/cc-oci-runtime/wiki/Installation
If you have any feedback, questions, or would like to participate and
contribute, then please consult the contact details (mailing list, IRC etc.)
in the document at:
- https://github.com/01org/cc-oci-runtime/blob/master/CONTRIBUTING.md
Source Code
===========
The source code for the Clear Containers 2.0 runtime and corresponding
qemu-lite are publicly hosted on github:
- https://github.com/01org/cc-oci-runtime
- https://github.com/01org/qemu-lite
Architecture Overview
=====================
Please see the the `Architecture Overview`_ section.
.. _Architecture Overview: https://clearlinux.org/documentation/clear-containers.html#architecture-overview
@@ -1,32 +1,32 @@
.. _gs_installing_clr_as_host:
Installing the OS as host
#########################
Running Clear Linux* OS for Intel® Architecture natively on a system is
easy with the installer image. To get started you'll need the following:
* A USB stick flashed with the `installer image`_. For instructions on how to
do this, see :ref:`gs_creating_bootable_usb`.
* A host machine running :ref:`gs_supported_hardware`.
* Network access via DHCP.
Installing Clear Linux OS for Intel Architecture to a target system
===================================================================
#. Configure the BIOS; this may involve changing the priority of the boot
device to boot from USB port first.
#. Insert the USB device that is flashed with the
`installer image`_ into the target system, then reboot.
#. The installer user interface will appear. Once all appropriate configuration
options have been chosen, the installer will install the OS.
The entire installation should take no more than a few minutes.
For feedback on installation or other topics, please feel free to write in to our
`mailing list`_.
Note: You can also try :ref:`vm-kvm`.
.. _installer image: http://download.clearlinux.org/image
.. _mailing list: https://lists.clearlinux.org/mailman/listinfo/dev
.. _gs_installing_clr_as_host:
Installing the OS as host
#########################
Running Clear Linux* OS for Intel® Architecture natively on a system is
easy with the installer image. To get started you'll need the following:
* A USB stick flashed with the `installer image`_. For instructions on how to
do this, see :ref:`gs_creating_bootable_usb`.
* A host machine running :ref:`gs_supported_hardware`.
* Network access via DHCP.
Installing Clear Linux OS for Intel Architecture to a target system
===================================================================
#. Configure the BIOS; this may involve changing the priority of the boot
device to boot from USB port first.
#. Insert the USB device that is flashed with the
`installer image`_ into the target system, then reboot.
#. The installer user interface will appear. Once all appropriate configuration
options have been chosen, the installer will install the OS.
The entire installation should take no more than a few minutes.
For feedback on installation or other topics, please feel free to write in to our
`mailing list`_.
Note: You can also try :ref:`vm-kvm`.
.. _installer image: http://download.clearlinux.org/image
.. _mailing list: https://lists.clearlinux.org/mailman/listinfo/dev
+11
View File
@@ -0,0 +1,11 @@
Getting started
###############
.. toctree::
:maxdepth: 2
overview
supported-hardware
boot-usb
clear-host
clear-containers
@@ -1,83 +1,83 @@
.. _gs_getting_started:
Getting started
###############
There are a number of options available for downloading and running Clear
Linux* OS for Intel® Architecture. You can check your system hardware
capabilities against the list of `supported processors`_; alternatively,
download and run the `clear-linux-check-config`_ script to check the hardware
compatibility of your system from the command line.
Virtualized images
==================
Images are also available to run under Virtual Machines or containers.
To test whether your host contains the necessary components to run the OS in
a container, download the `clear-linux-check-config`_ script and run::
$ ./clear-linux-check-config.sh container
* **KVM Image** -- Download a recent KVM image, along with the UEFI firmware helper,
``OVMF.fd`` and the KVM start helper script ``start_qemu.sh.`` Find the
``clear-[version_number]-kvm.img.xz`` image in the `current`_ directory and see
:ref:`vm-kvm` for further detail.
* **Docker Image** -- A Clear Linux* Docker* image can be downloaded
directly from the Docker hub and executed within the Docker environment.
Details were posted in the blog post `Clear Linux Highlights 3`_, and
on a Docker* enabled system you can execute::
docker pull clearlinux
docker run -it clearlinux
and then follow the normal Clear Linux* instuctions to add bundles etc.
Bare metal installer images
===========================
To test whether your system contains the necessary components to run the OS natively,
download the `clear-linux-check-config`_ script and run::
$ ./clear-linux-check-config.sh host
* **Installer Image** -- The installer image allows you to manipulate and target
partitions, and to set other OS configuration features (hostname, administrative user)
commonly found in Linux installers. Find the ``clear-[version_number]-installer.img.xz``
in our `current`_ directory and see :ref:`gs_installing_clr_as_host`. This `blog post`_
contains more detail about the evolution of our installer.
* **Provisioning Image** -- This image is intended to be used in a provioning environment.
Find the ``clear-[version_number]-provision.img.xz`` image in our `current`_ directory.
*Warning*: This installer repartitions ``/dev/sda`` and installs the OS to the new
partition. Don't use this image on a system where you care about existing data on
``/dev/sda``.
Other installation options
==========================
* **Live Image** -- The live image can be used to boot the OS in a VM, or you can lay
the image down on a USB drive with a tool like ``dd`` and boot from USB.
This option is a great way to kick the tires with a minimal amount of effort. Be
aware, however, that if you do **not** manually configure the install and instead use
the auto-install, it will repartition ``/dev/sda``. This image also enables telemetry
by default; see the `telemetry`_ feature page for more details.
To select this option, download the ``clear-[version_number]-live.img.xz`` image in
the `current`_ version's download directory.
For older versions, see our `releases`_ page.
.. _clear-linux-check-config: http://download.clearlinux.org/current/clear-linux-check-config.sh
.. _current: http://download.clearlinux.org/current
.. _blog post: https://clearlinux.org/blogs/clear-linux-installer-v20
.. _Clear Linux Highlights 3: https://clearlinux.org/blogs/clear-linux-highlights-3
.. _telemetry: https://clearlinux.org/features/telemetry
.. _supported processors: http://clearlinux.org/documentation/gs_supported_hardware.html
.. _releases: https://download.clearlinux.org/releases
.. _gs_getting_started:
Getting started
###############
There are a number of options available for downloading and running Clear
Linux* OS for Intel® Architecture. You can check your system hardware
capabilities against the list of `supported processors`_; alternatively,
download and run the `clear-linux-check-config`_ script to check the hardware
compatibility of your system from the command line.
Virtualized images
==================
Images are also available to run under Virtual Machines or containers.
To test whether your host contains the necessary components to run the OS in
a container, download the `clear-linux-check-config`_ script and run::
$ ./clear-linux-check-config.sh container
* **KVM Image** -- Download a recent KVM image, along with the UEFI firmware helper,
``OVMF.fd`` and the KVM start helper script ``start_qemu.sh.`` Find the
``clear-[version_number]-kvm.img.xz`` image in the `current`_ directory and see
:ref:`vm-kvm` for further detail.
* **Docker Image** -- A Clear Linux* Docker* image can be downloaded
directly from the Docker hub and executed within the Docker environment.
Details were posted in the blog post `Clear Linux Highlights 3`_, and
on a Docker* enabled system you can execute::
docker pull clearlinux
docker run -it clearlinux
and then follow the normal Clear Linux* instuctions to add bundles etc.
Bare metal installer images
===========================
To test whether your system contains the necessary components to run the OS natively,
download the `clear-linux-check-config`_ script and run::
$ ./clear-linux-check-config.sh host
* **Installer Image** -- The installer image allows you to manipulate and target
partitions, and to set other OS configuration features (hostname, administrative user)
commonly found in Linux installers. Find the ``clear-[version_number]-installer.img.xz``
in our `current`_ directory and see :ref:`gs_installing_clr_as_host`. This `blog post`_
contains more detail about the evolution of our installer.
* **Provisioning Image** -- This image is intended to be used in a provioning environment.
Find the ``clear-[version_number]-provision.img.xz`` image in our `current`_ directory.
*Warning*: This installer repartitions ``/dev/sda`` and installs the OS to the new
partition. Don't use this image on a system where you care about existing data on
``/dev/sda``.
Other installation options
==========================
* **Live Image** -- The live image can be used to boot the OS in a VM, or you can lay
the image down on a USB drive with a tool like ``dd`` and boot from USB.
This option is a great way to kick the tires with a minimal amount of effort. Be
aware, however, that if you do **not** manually configure the install and instead use
the auto-install, it will repartition ``/dev/sda``. This image also enables telemetry
by default; see the `telemetry`_ feature page for more details.
To select this option, download the ``clear-[version_number]-live.img.xz`` image in
the `current`_ version's download directory.
For older versions, see our `releases`_ page.
.. _clear-linux-check-config: http://download.clearlinux.org/current/clear-linux-check-config.sh
.. _current: http://download.clearlinux.org/current
.. _blog post: https://clearlinux.org/blogs/clear-linux-installer-v20
.. _Clear Linux Highlights 3: https://clearlinux.org/blogs/clear-linux-highlights-3
.. _telemetry: https://clearlinux.org/features/telemetry
.. _supported processors: http://clearlinux.org/documentation/gs_supported_hardware.html
.. _releases: https://download.clearlinux.org/releases
@@ -1,25 +1,25 @@
.. _gs_supported_hardware:
Supported hardware
##################
Clear Linux* OS for Intel® Architecture can be successfully run in 4th
Generation Intel® Core™ processor family and later generations.
The following processors have been tested to work correctly:
- 4th Generation Intel® Core™ processor.
- 5th Generation Intel® Core™ processor.
- 6th Generation Intel® Core™ processor.
- Intel® Xeon® Processor E5 v3 processor.
- Intel® Xeon® Processor E3 v5 processor.
If you're unsure whether your system will be capable of running Clear Linux*
OS for Intel® Architecture, you can determine ahead of time by downloading
and running the simple `clear-linux-check-config.sh`_ script locally. This script
is available in the `current`_ download directory; it checks the hardware
capabilities of your system to determine whether it will work with the
latest release.
.. _clear-linux-check-config.sh: http://download.clearlinux.org/current/clear-linux-check-config.sh
.. _current: http://download.clearlinux.org/current
.. _gs_supported_hardware:
Supported hardware
##################
Clear Linux* OS for Intel® Architecture can be successfully run in 4th
Generation Intel® Core™ processor family and later generations.
The following processors have been tested to work correctly:
- 4th Generation Intel® Core™ processor.
- 5th Generation Intel® Core™ processor.
- 6th Generation Intel® Core™ processor.
- Intel® Xeon® Processor E5 v3 processor.
- Intel® Xeon® Processor E3 v5 processor.
If you're unsure whether your system will be capable of running Clear Linux*
OS for Intel® Architecture, you can determine ahead of time by downloading
and running the simple `clear-linux-check-config.sh`_ script locally. This script
is available in the `current`_ download directory; it checks the hardware
capabilities of your system to determine whether it will work with the
latest release.
.. _clear-linux-check-config.sh: http://download.clearlinux.org/current/clear-linux-check-config.sh
.. _current: http://download.clearlinux.org/current
-13
View File
@@ -1,13 +0,0 @@
OpenStack* implementation
#########################
.. toctree::
:maxdepth: 1
openstack_use_cases
openstack_bundle_and_service_summary
installing_openstack
configure_openstack_environment
openstack_env_inventory_file
openstack_conf_vars_about
openstack_conf_vars_list
-13
View File
@@ -1,13 +0,0 @@
Tutorials
#########
.. toctree::
:maxdepth: 2
gs-clear-containers-getting-started
ciao-deploy
ciao-cluster-setup-quick.rst
ciao-cluster-setup
+93 -84
View File
@@ -1,84 +1,93 @@
.. ClearLinux Documentation documentation master file, created by
sphinx-quickstart on Fri Nov 13 12:23:35 2015.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Clear Linux* Project for Intel® Architecture--Documentation
############################################################
Getting started
================
.. toctree::
:maxdepth: 2
index_gs.rst
Running in a virtualized environment
====================================
.. toctree::
:maxdepth: 2
index_vm.rst
Software update
===============
.. toctree::
:maxdepth: 2
index_sw_update.rst
Bundles
=======
.. toctree::
:maxdepth: 2
index_bundles.rst
Advanced configuration
======================
.. toctree::
:maxdepth: 2
index_advanced_configuration.rst
Storage solutions
=================
.. toctree::
:maxdepth: 2
index-storage.rst
Tutorials
=========
.. toctree::
:maxdepth: 2
index-ts.rst
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
License and disclaimers
=======================
.. toctree::
.. include:: documentation_license.rst
.. ClearLinux Documentation documentation master file, created by
sphinx-quickstart on Fri Nov 13 12:23:35 2015.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Clear Linux* Project for Intel® Architecture--Documentation
############################################################
Getting started
================
.. toctree::
:maxdepth: 2
gs/index.rst
Running in a virtualized environment
====================================
.. toctree::
:maxdepth: 2
vm/index.rst
Software update
===============
.. toctree::
:maxdepth: 2
update/index.rst
Bundles
=======
.. toctree::
:maxdepth: 2
bundles/index.rst
Advanced configuration
======================
.. toctree::
:maxdepth: 2
advanced/index.rst
Storage solutions
=================
.. toctree::
:maxdepth: 2
storage/index.rst
CIAO
====
.. toctree::
:maxdepth: 2
ciao/index.rst
OpenStack
=========
.. toctree::
:maxdepth: 2
openstack/index.rst
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
License and disclaimers
=======================
.. toctree::
documentation_license.rst
disclaimers.rst
-10
View File
@@ -1,10 +0,0 @@
Bundles
#######
.. toctree::
:maxdepth: 2
bundles_overview
bdl-containers-basic
bdl-openssh-server
bdl-os-core
-12
View File
@@ -1,12 +0,0 @@
Getting started
###############
.. toctree::
:maxdepth: 2
gs_getting_started
gs_supported_hardware
gs_creating_bootable_usb
gs_installing_clr_as_host
@@ -1,14 +1,14 @@
.. _openstack_conf_vars_about:
About "group_vars/all"
######################
The ``group_vars/all`` section is where you will specify the
values for your passwords and other required or optional parameters.
Variables in this section are built with yaml format.
For a more detailed reference of the numerous variables and parameters
that can be set, see the :ref:`openstack_conf_vars_list`.
**Back to Configuration Section** :ref:`configure_openstack_environment`
.. _openstack_conf_vars_about:
About "group_vars/all"
######################
The ``group_vars/all`` section is where you will specify the
values for your passwords and other required or optional parameters.
Variables in this section are built with yaml format.
For a more detailed reference of the numerous variables and parameters
that can be set, see the :ref:`openstack_conf_vars_list`.
**Back to Configuration Section** :ref:`configure_openstack_environment`
@@ -1,62 +1,62 @@
.. _openstack_conf_vars_list:
Variables for OpenStack* Deployment
###################################
This installer provides a variety of configurations you can set through
variables; below you will find a reference of the components supported
with Clear Linux* OS for Intel® Architecture.
Required Variables
==================
.. csv-table::
:header: "*(Component)* `Variable`", "Description"
:widths: 90, 150
"*(Heat, Neutron, Nova, RabbitMQ)* **rabbitmq_password**", "Password of RabbitMQ user "
"*(ALL)* **database_root_password**","Password for root database user"
"*(Keystone)* **keystone_database_password**", "Password for 'keystone' database"
"*(ALL)* **keystone_admin_password**", "Password for 'admin' user"
"*(Glance)* **glance_user_password**", "Password for 'glance' user"
"*(Glance)* **glance_database_password**", "Password for 'glance' database"
"*(Neutron, Nova)* **nova_user_password**", "Password for 'nova' user"
"*(Nova)* **nova_database_password**", "Password for 'nova' database"
"*(Neutron)* **neutron_database_password**", "Password for 'neutron' database"
"*(Neutron, Nova)* **neutron_user_password**", "Password for 'neutron' user"
"*(Neutron, Nova)* **metadata_proxy_shared_secret**", "Secret for the metadata proxy"
"*(Heat)* **heat_domain_admin_password**", "Password for heat domain admin user"
"*(Heat)* **heat_user_password**", "Password for heat user"
"*(Heat)* **heat_database_password**", "Password for heat database"
"*(Heat)* **heat_domain**", "The heat domain that contains projects and users for stacks"
"*(Swift)* **swift_user_password**", "Password for 'swift' user"
"*(Swift)* **swift_database_password**", "Password for 'swift' database"
"*(Swift)* **swift_replica_count**", "Replica number for each object. IMPORTANT: This number must be lower than the sum of all the storage devices among all storage nodes. It can be changed later."
"*(Swift)* **swift_hash_path_suffix**", "Suffix for the object path name"
"*(Swift)* **swift_hash_path_prefix**", "Prefix for the object path name"
"*(Swift)* **swift_storage_device_path**", "The path of the storage devices"
"*(Swift)* **swift_storage_devices**", "A list of the storage devices dedicated to swift deployment. For more information, see :ref:`openstack_swift_deployment_scenarios`"
Optional Variables
==================
.. csv-table::
:header: "*(Component)* **Variable** : Default value", "Description"
:widths: 90, 150
"*(ALL)* **swupd_args**: unset", "Optional arguments for swupd"
"*(ALL)* **log_debug**: False", "Set to True to enable debug log level on all services"
"*(Heat, Neutron, Nova, RabbitMQ)* **rabbitmq_username**: openstack", "User ID for RabbitMQ"
"*(Neutron, Nova)* **neutron_public_interface_name**: unset", "Public interface of Neutron machines, if is not set, it will take the default interface reported by **ip route**"
"*(Nova)* **nova_public_interface_name**: unset", "Public interface of Neutron machines, if is not set, it will take the default interface reported by **ip route**"
"*(Nova)* **nova_virt_type**: qemu", "Virtualization type (qemu | kvm), if this is not set, then the playbook will try to guess it"
"*(Neutron)* **os_tuning_params**: net.ipv4.ip_forward: 1, net.ipv4.conf.default.rp_filter: 0, net.ipv4.conf.all.rp_filter: 0, net.bridge.bridge-nf-call-iptables: 1, net.bridge.bridge-nf-call-ip6tables: 1", "syctl values needed by neutron when using openvswitch deployment scenario"
"*(Swift)* **swift_public_interface_name**, "Public interface of storage nodes, also known as the storage network interface name; If is not set, it will take the default interface reported by **ip route**"
Note:
-----
If you would like to override a default, you can define it in the
:ref:`openstack_conf_vars_about`.
**Back to Configuration Section** :ref:`configure_openstack_environment`
.. _openstack_conf_vars_list:
Variables for OpenStack* Deployment
###################################
This installer provides a variety of configurations you can set through
variables; below you will find a reference of the components supported
with Clear Linux* OS for Intel® Architecture.
Required Variables
==================
.. csv-table::
:header: "*(Component)* `Variable`", "Description"
:widths: 90, 150
"*(Heat, Neutron, Nova, RabbitMQ)* **rabbitmq_password**", "Password of RabbitMQ user "
"*(ALL)* **database_root_password**","Password for root database user"
"*(Keystone)* **keystone_database_password**", "Password for 'keystone' database"
"*(ALL)* **keystone_admin_password**", "Password for 'admin' user"
"*(Glance)* **glance_user_password**", "Password for 'glance' user"
"*(Glance)* **glance_database_password**", "Password for 'glance' database"
"*(Neutron, Nova)* **nova_user_password**", "Password for 'nova' user"
"*(Nova)* **nova_database_password**", "Password for 'nova' database"
"*(Neutron)* **neutron_database_password**", "Password for 'neutron' database"
"*(Neutron, Nova)* **neutron_user_password**", "Password for 'neutron' user"
"*(Neutron, Nova)* **metadata_proxy_shared_secret**", "Secret for the metadata proxy"
"*(Heat)* **heat_domain_admin_password**", "Password for heat domain admin user"
"*(Heat)* **heat_user_password**", "Password for heat user"
"*(Heat)* **heat_database_password**", "Password for heat database"
"*(Heat)* **heat_domain**", "The heat domain that contains projects and users for stacks"
"*(Swift)* **swift_user_password**", "Password for 'swift' user"
"*(Swift)* **swift_database_password**", "Password for 'swift' database"
"*(Swift)* **swift_replica_count**", "Replica number for each object. IMPORTANT: This number must be lower than the sum of all the storage devices among all storage nodes. It can be changed later."
"*(Swift)* **swift_hash_path_suffix**", "Suffix for the object path name"
"*(Swift)* **swift_hash_path_prefix**", "Prefix for the object path name"
"*(Swift)* **swift_storage_device_path**", "The path of the storage devices"
"*(Swift)* **swift_storage_devices**", "A list of the storage devices dedicated to swift deployment. For more information, see :ref:`openstack_swift_deployment_scenarios`"
Optional Variables
==================
.. csv-table::
:header: "*(Component)* **Variable** : Default value", "Description"
:widths: 90, 150
"*(ALL)* **swupd_args**: unset", "Optional arguments for swupd"
"*(ALL)* **log_debug**: False", "Set to True to enable debug log level on all services"
"*(Heat, Neutron, Nova, RabbitMQ)* **rabbitmq_username**: openstack", "User ID for RabbitMQ"
"*(Neutron, Nova)* **neutron_public_interface_name**: unset", "Public interface of Neutron machines, if is not set, it will take the default interface reported by **ip route**"
"*(Nova)* **nova_public_interface_name**: unset", "Public interface of Neutron machines, if is not set, it will take the default interface reported by **ip route**"
"*(Nova)* **nova_virt_type**: qemu", "Virtualization type (qemu | kvm), if this is not set, then the playbook will try to guess it"
"*(Neutron)* **os_tuning_params**: net.ipv4.ip_forward: 1, net.ipv4.conf.default.rp_filter: 0, net.ipv4.conf.all.rp_filter: 0, net.bridge.bridge-nf-call-iptables: 1, net.bridge.bridge-nf-call-ip6tables: 1", "syctl values needed by neutron when using openvswitch deployment scenario"
"*(Swift)* **swift_public_interface_name**, "Public interface of storage nodes, also known as the storage network interface name; If is not set, it will take the default interface reported by **ip route**"
Note:
-----
If you would like to override a default, you can define it in the
:ref:`openstack_conf_vars_about`.
**Back to Configuration Section** :ref:`configure_openstack_environment`
@@ -1,43 +1,43 @@
.. _configure_openstack_environment:
Configure environment
#####################
Before continuing with the installation process, it's important to understand:
* The :file:`hosts` file; this file defines the roles your machines play in the
overall scheme of your network mapping.
**Note**: For more in-depth information, see :ref:`openstack_env_inventory_file`
* The ``group_vars/all`` structuring can be used to override variable
values. **Note**: For more in-depth information, see :ref:`openstack_conf_vars_about`
Once you understand these components and are comfortable modifying them to affect
the network configuration, you can proceed as follows:
#. Copy ``/usr/share/ansible/examples/openstack`` to your working directory.
#. Move into the copied directory.
#. Edit the :file:`hosts` file to specify node roles.
#. Edit the contents under ``group_vars/all`` to set passwords and other needed
variables. **Note**: Default variables exist for every role in the
:file:`roles/<role>/defaults/main.yml` file. To override a default, define
it with specifications under ``group_vars/all``.
Run the installer
=================
Finally, you can run the installer.
#. Run the installer as follows, replacing ``<ssh_key>`` with the key you've
previously set up::
$ ansible-playbook -i hosts openstack_deployment.yml --private-key=<ssh_key>
After running the previous command you should see the output of the tasks
that are running.
At the end of the execution Ansible* will display a summary of the results.
.. _configure_openstack_environment:
Configure environment
#####################
Before continuing with the installation process, it's important to understand:
* The :file:`hosts` file; this file defines the roles your machines play in the
overall scheme of your network mapping.
**Note**: For more in-depth information, see :ref:`openstack_env_inventory_file`
* The ``group_vars/all`` structuring can be used to override variable
values. **Note**: For more in-depth information, see :ref:`openstack_conf_vars_about`
Once you understand these components and are comfortable modifying them to affect
the network configuration, you can proceed as follows:
#. Copy ``/usr/share/ansible/examples/openstack`` to your working directory.
#. Move into the copied directory.
#. Edit the :file:`hosts` file to specify node roles.
#. Edit the contents under ``group_vars/all`` to set passwords and other needed
variables. **Note**: Default variables exist for every role in the
:file:`roles/<role>/defaults/main.yml` file. To override a default, define
it with specifications under ``group_vars/all``.
Run the installer
=================
Finally, you can run the installer.
#. Run the installer as follows, replacing ``<ssh_key>`` with the key you've
previously set up::
$ ansible-playbook -i hosts openstack_deployment.yml --private-key=<ssh_key>
After running the previous command you should see the output of the tasks
that are running.
At the end of the execution Ansible* will display a summary of the results.
@@ -1,61 +1,61 @@
.. _openstack_env_inventory_file:
The "hosts" file
################
The :file:`hosts` file is an inventory file where you specify, via
``ini`` format, the roles your machine plays.
The :file:`hosts` file can be structured with different groups, where each
group plays a specific role in your environment and network mapping.
Consider the following example::
[openstack_identity]
192.168.50.13
Here, the role ``[openstack_identity]`` syntax defines the group, and
``192.168.50.13`` specifies the machine(s) that possess that role. You
may define multiple machines in the same group; this is a standard
configuration for role ``[openstack_compute]`` nodes::
[openstack_compute]
192.168.50.16
192.168.50.17
Inventory file groups
---------------------
Below you will find the description of each group in the `hosts` file.
.. csv-table:: "Inventory File Groups"
:header: "Group", "Components", "Comments"
:widths: 40, 40, 300
"[dbservers]", "MariaDB", ""
"[messaging_servers]", "RabbitMQ", ""
"[openstack_identity]", "Keystone, Horizon", ""
"[openstack_image]", "Glance", ""
"[openstack_compute_controller]", "Nova", ""
"[openstack_compute]", "Nova", "Accepts multiple entries to have multiple compute nodes. You can add more entries and re-run the installer to add them to your environment."
"[openstack_networking]", "Neutron", ""
"[openstack_orchestration]", "Heat", ""
"[openstack_object_storage_controller]", "Swift", "The Swift storage controller. It runs the swift proxy server and the memcache server"
"[openstack_object_storage]", "Swift", "The Swift Storage nodes. Accepts multiple entries to have multiple storage nodes"
Important notes
---------------
* To omit any role, do not add an entry under its group section.
* To create an ``All In One`` scenario, specify the same machine name or IPv4
Address under all of the groups.
For further reference, check out the `Ansible`_ documentation.
**Back to Configuration Section** :ref:`configure_openstack_environment`
.. _Ansible: http://docs.ansible.com/ansible/intro_inventory.html
.. _openstack_env_inventory_file:
The "hosts" file
################
The :file:`hosts` file is an inventory file where you specify, via
``ini`` format, the roles your machine plays.
The :file:`hosts` file can be structured with different groups, where each
group plays a specific role in your environment and network mapping.
Consider the following example::
[openstack_identity]
192.168.50.13
Here, the role ``[openstack_identity]`` syntax defines the group, and
``192.168.50.13`` specifies the machine(s) that possess that role. You
may define multiple machines in the same group; this is a standard
configuration for role ``[openstack_compute]`` nodes::
[openstack_compute]
192.168.50.16
192.168.50.17
Inventory file groups
---------------------
Below you will find the description of each group in the `hosts` file.
.. csv-table:: "Inventory File Groups"
:header: "Group", "Components", "Comments"
:widths: 40, 40, 300
"[dbservers]", "MariaDB", ""
"[messaging_servers]", "RabbitMQ", ""
"[openstack_identity]", "Keystone, Horizon", ""
"[openstack_image]", "Glance", ""
"[openstack_compute_controller]", "Nova", ""
"[openstack_compute]", "Nova", "Accepts multiple entries to have multiple compute nodes. You can add more entries and re-run the installer to add them to your environment."
"[openstack_networking]", "Neutron", ""
"[openstack_orchestration]", "Heat", ""
"[openstack_object_storage_controller]", "Swift", "The Swift storage controller. It runs the swift proxy server and the memcache server"
"[openstack_object_storage]", "Swift", "The Swift Storage nodes. Accepts multiple entries to have multiple storage nodes"
Important notes
---------------
* To omit any role, do not add an entry under its group section.
* To create an ``All In One`` scenario, specify the same machine name or IPv4
Address under all of the groups.
For further reference, check out the `Ansible`_ documentation.
**Back to Configuration Section** :ref:`configure_openstack_environment`
.. _Ansible: http://docs.ansible.com/ansible/intro_inventory.html
+17
View File
@@ -0,0 +1,17 @@
OpenStack* implementation
#########################
.. toctree::
:maxdepth: 1
use-cases
summary
installation
configuration
env-inventory
about-conf-variables
conf-variables
swift-deployment
telemetry/image
telemetry/compute
telemetry/verify
@@ -1,78 +1,78 @@
.. _installing_openstack:
Installing OpenStack*
#####################
This section details an OpenStack installation that uses
bundles available for Clear Linux* OS for Intel® Architecture.
The sample configuration files that are included will likely
require modification for your specific environment.
This Clear Config Management uses Ansible* as configuration management tool.
Components supported by Clear Config Management
===============================================
At the moment, this installer can deploy any or all of the following
components:
- MariaDB
- RabbitMQ
- Keystone
- Glance
- Nova
- Neutron
- Dashboard (In identity node)
- Heat
- Swift
Note:
-----
Below you will find the reference to componets supported on Clear Linux OS for Intel Architecture, but
its support in Clear Config Management is still pending development:
.. csv-table:: "Supported Components on ClearLinux*, but unsupported by Clear Config Management"
:header: "Component", "Bundles", "OpenStack* official documentation"
:widths: 20, 70, 100
"Cinder", "openstack-block-storage and openstack-block-storage-controller", "http://docs.openstack.org/developer/cinder/"
"Ceilometer", "openstack-telemetry", "http://docs.openstack.org/developer/ceilometer/"
Prerequisites
=============
Before the installer can set up your cloud environment, these prerequisites
should be completed (if they aren't already):
#. Create a pair of SSH keys.
#. Copy your public key to each node.
#. Create the :file:`sshd_config` in ``/etc/ssh`` if it doesn't exist::
# mkdir -p /etc/ssh && touch /etc/ssh/sshd_config
#. Allow ssh root access by adding "PermitRootLogin yes" to the ssh
configuration.::
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
Using the Installer
===================
This step presumes a machine running Clear Linux OS for Intel Architecture as the ansible host.
Install the bundle
------------------
#. Install the `sysadmin-hostmgmt` bundle::
# swupd bundle-add sysadmin-hostmgmt
**Next**: :ref:`configure_openstack_environment`
.. _installing_openstack:
Installing OpenStack*
#####################
This section details an OpenStack installation that uses
bundles available for Clear Linux* OS for Intel® Architecture.
The sample configuration files that are included will likely
require modification for your specific environment.
This Clear Config Management uses Ansible* as configuration management tool.
Components supported by Clear Config Management
===============================================
At the moment, this installer can deploy any or all of the following
components:
- MariaDB
- RabbitMQ
- Keystone
- Glance
- Nova
- Neutron
- Dashboard (In identity node)
- Heat
- Swift
Note:
-----
Below you will find the reference to componets supported on Clear Linux OS for Intel Architecture, but
its support in Clear Config Management is still pending development:
.. csv-table:: "Supported Components on ClearLinux*, but unsupported by Clear Config Management"
:header: "Component", "Bundles", "OpenStack* official documentation"
:widths: 20, 70, 100
"Cinder", "openstack-block-storage and openstack-block-storage-controller", "http://docs.openstack.org/developer/cinder/"
"Ceilometer", "openstack-telemetry", "http://docs.openstack.org/developer/ceilometer/"
Prerequisites
=============
Before the installer can set up your cloud environment, these prerequisites
should be completed (if they aren't already):
#. Create a pair of SSH keys.
#. Copy your public key to each node.
#. Create the :file:`sshd_config` in ``/etc/ssh`` if it doesn't exist::
# mkdir -p /etc/ssh && touch /etc/ssh/sshd_config
#. Allow ssh root access by adding "PermitRootLogin yes" to the ssh
configuration.::
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
Using the Installer
===================
This step presumes a machine running Clear Linux OS for Intel Architecture as the ansible host.
Install the bundle
------------------
#. Install the `sysadmin-hostmgmt` bundle::
# swupd bundle-add sysadmin-hostmgmt
**Next**: :ref:`configure_openstack_environment`
@@ -1,65 +1,65 @@
.. _openstack_bundle_and_service_summary:
OpenStack* bundle and service summary
#####################################
OpenStack provides an Infrastructure-as-a-Service (IaaS) solution
through a variety of complementary services. Each service offers an
application programming interface (API) that facilitates this
integration. The following table provides a list of OpenStack services:
.. csv-table:: OpenStack services
:header: "Bundle Name (service)", "Project Name", "Description"
:widths: 90, 90, 300
"openstack-compute-controller", "Nova", "Manages the lifecycle of
compute instances in an OpenStack environment. Responsibilities include
spawning, scheduling and decommissioning of virtual machines on demand."
"openstack-identity", "Keystone", "Provides an authentication and
authorization service for other OpenStack services. Provides a catalog
of endpoints for all OpenStack services."
"openstack-image", "Glance", "Stores and retrieves virtual machine disk
images. OpenStack Compute makes use of this during instance provisioning."
"openstack-dashboard", "Horizon", "Provides a web-based self-service portal
to interact with underlying OpenStack services."
"openstack-network", "Neutron", "Enables Network-Connectivity-as-a-Service
for some OpenStack services. Besides, it provides an API for users to define
networks and the attachments into them."
"openstack-object-storage", "Swift", "Stores and retrieves arbitrary
unstructured data objects. It is highly fault tolerant with its data
replication and scale-out architecture."
"openstack-block-storage/openstack-block-storage-controller", "Cinder", "Provides
persistent block storage to running instances."
"openstack-telemetry", "Ceilometer", "Monitors and meters the
OpenStack cloud for billing, benchmarking, scalability, and statistical
purposes."
"openstack-orchestration", "Heat", "Orchestrates multiple composite cloud
applications by using either the native Heat Orchestration Template (HOT)
template format or the AWS CloudFormation template format."
OpenStack is highly configurable to meet different needs. This guide
uses a two-node architecture.
- The controller node runs the Identity Service, Image Service, the
management portion of Compute, and the Dashboard. It also includes
supporting services, such as an SQL database and message queue.
Optionally, the controller node runs management portions of Block
Storage services.
- The compute node runs the hypervisor portion of Compute that operates
project virtual machines or instances. By default, Compute uses KVM
as the hypervisor. Compute also provisions project networks and
provides firewalling (security groups) services. You can run more
than one compute node.
- (Optional) Block Storage node contains the disks that the Block
Storage service provisions for instances. You can deploy more than
one block storage node.
- (Optional) Object Storage node contain the disks that the Object
Storage service uses for storing accounts, containers, and objects.
This service requires two nodes. Each node requires a minimum of one
network interface. You can deploy more than two object storage nodes.
- The self-service networks option augments the provider networks option
with layer-3 (routing) services that enable self-service networks
using overlay segmentation methods. Additionally, this option provides
the foundation for advanced services such as LBaaS and FWaaS.
Next topic: :ref:`installing_openstack`.
.. _openstack_bundle_and_service_summary:
OpenStack* bundle and service summary
#####################################
OpenStack provides an Infrastructure-as-a-Service (IaaS) solution
through a variety of complementary services. Each service offers an
application programming interface (API) that facilitates this
integration. The following table provides a list of OpenStack services:
.. csv-table:: OpenStack services
:header: "Bundle Name (service)", "Project Name", "Description"
:widths: 90, 90, 300
"openstack-compute-controller", "Nova", "Manages the lifecycle of
compute instances in an OpenStack environment. Responsibilities include
spawning, scheduling and decommissioning of virtual machines on demand."
"openstack-identity", "Keystone", "Provides an authentication and
authorization service for other OpenStack services. Provides a catalog
of endpoints for all OpenStack services."
"openstack-image", "Glance", "Stores and retrieves virtual machine disk
images. OpenStack Compute makes use of this during instance provisioning."
"openstack-dashboard", "Horizon", "Provides a web-based self-service portal
to interact with underlying OpenStack services."
"openstack-network", "Neutron", "Enables Network-Connectivity-as-a-Service
for some OpenStack services. Besides, it provides an API for users to define
networks and the attachments into them."
"openstack-object-storage", "Swift", "Stores and retrieves arbitrary
unstructured data objects. It is highly fault tolerant with its data
replication and scale-out architecture."
"openstack-block-storage/openstack-block-storage-controller", "Cinder", "Provides
persistent block storage to running instances."
"openstack-telemetry", "Ceilometer", "Monitors and meters the
OpenStack cloud for billing, benchmarking, scalability, and statistical
purposes."
"openstack-orchestration", "Heat", "Orchestrates multiple composite cloud
applications by using either the native Heat Orchestration Template (HOT)
template format or the AWS CloudFormation template format."
OpenStack is highly configurable to meet different needs. This guide
uses a two-node architecture.
- The controller node runs the Identity Service, Image Service, the
management portion of Compute, and the Dashboard. It also includes
supporting services, such as an SQL database and message queue.
Optionally, the controller node runs management portions of Block
Storage services.
- The compute node runs the hypervisor portion of Compute that operates
project virtual machines or instances. By default, Compute uses KVM
as the hypervisor. Compute also provisions project networks and
provides firewalling (security groups) services. You can run more
than one compute node.
- (Optional) Block Storage node contains the disks that the Block
Storage service provisions for instances. You can deploy more than
one block storage node.
- (Optional) Object Storage node contain the disks that the Object
Storage service uses for storing accounts, containers, and objects.
This service requires two nodes. Each node requires a minimum of one
network interface. You can deploy more than two object storage nodes.
- The self-service networks option augments the provider networks option
with layer-3 (routing) services that enable self-service networks
using overlay segmentation methods. Additionally, this option provides
the foundation for advanced services such as LBaaS and FWaaS.
Next topic: :ref:`installing_openstack`.
@@ -1,69 +1,69 @@
.. _openstack_swift_deployment_scenarios:
OpenStack* Swift* Deployment Scenarios
######################################
You can install OpenStack Swift using clear-config-management through two
possible scenarios.
- **Scenario #1:** All the storage nodes are identical, with the same number of storage devices with the same names.
- **Scenario #2:** The storage setup is heterogeneous. The list of storage devices must be provided for each storage node individually.
Scenario #1: Identical storage nodes scenario
=============================================
To set up this scenario, the ``swift_storage_devices`` variable needs to be
defined in ``../group_vars/all`` as follows:
.. code-block:: yaml
...
swift_storage_device_path: /dev/
swift_storage_devices:
- sda
- sdb
...
Scenario #2: Different storage nodes scenario
=============================================
With this setup, specific information about each storage node has to be provided.
First, in the root of your Ansible* directory setup, create a new directory called ``host_vars``.
Inside ``host_vars``, for each storage node, create a new file with the name of the
storage node's hostname or IP. In each file, provide the list of the storage
devices.
The Ansible directory setup should look similar to the following directory tree:
.. code-block:: console
openstack/
├── group_vars
│ └── all
├── hosts
├── host_vars
│ ├── storage-one
│ └── storage-two
├── openstack_deployment.yml
└── README.md
And the ``storage-one`` and ``storage-two`` storage node files should look similar to this:
.. code-block:: yaml
---
devices:
- sdb
- sdc
- sdd
.. code-block:: yaml
---
devices:
- vdb
- vdc
.. _openstack_swift_deployment_scenarios:
OpenStack* Swift* Deployment Scenarios
######################################
You can install OpenStack Swift using clear-config-management through two
possible scenarios.
- **Scenario #1:** All the storage nodes are identical, with the same number of storage devices with the same names.
- **Scenario #2:** The storage setup is heterogeneous. The list of storage devices must be provided for each storage node individually.
Scenario #1: Identical storage nodes scenario
=============================================
To set up this scenario, the ``swift_storage_devices`` variable needs to be
defined in ``../group_vars/all`` as follows:
.. code-block:: yaml
...
swift_storage_device_path: /dev/
swift_storage_devices:
- sda
- sdb
...
Scenario #2: Different storage nodes scenario
=============================================
With this setup, specific information about each storage node has to be provided.
First, in the root of your Ansible* directory setup, create a new directory called ``host_vars``.
Inside ``host_vars``, for each storage node, create a new file with the name of the
storage node's hostname or IP. In each file, provide the list of the storage
devices.
The Ansible directory setup should look similar to the following directory tree:
.. code-block:: console
openstack/
├── group_vars
│ └── all
├── hosts
├── host_vars
│ ├── storage-one
│ └── storage-two
├── openstack_deployment.yml
└── README.md
And the ``storage-one`` and ``storage-two`` storage node files should look similar to this:
.. code-block:: yaml
---
devices:
- sdb
- sdc
- sdd
.. code-block:: yaml
---
devices:
- vdb
- vdc
@@ -1,82 +1,82 @@
OpenStack* Telemetry - Enable compute service meters
############################################################
Telemetry uses a combination of notifications and an agent to
collect Compute meters. Perform these steps on each compute node.
Configure components
-----------------------------------------------
Edit the ``/etc/ceilometer/ceilometer.conf`` file and complete the following actions:
#. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, configure RabbitMQ message queue access::
[DEFAULT]
...
rpc_backend = rabbit
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
Replace the ``RABBIT_PASS`` with the password you chose for the openstack account in RabbitMQ.
#. In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure Identity service access::
[DEFAULT]
...
auth_strategy = keystone
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = ceilometer
password = CEILOMETER_PASS
Replace ``CEILOMETER_PASS`` with the password you chose for the Telemetry service database.
#. In the ``[service_credentials]`` section, configure service credentials::
[service_credentials]
...
os_auth_url = http://controller:5000/v2.0
os_username = ceilometer
os_tenant_name = service
os_password = CEILOMETER_PASS
os_endpoint_type = internalURL
os_region_name = RegionOne
Replace ``CEILOMETER_PASS`` with the password you chose for the ceilometer user in the Identity service.
Configure Compute to use Telemetry
-----------------------------------------------
#. Edit the ``/etc/nova/nova.conf`` file and configure notifications in the ``[DEFAULT]`` section::
[DEFAULT]
...
instance_usage_audit = True
instance_usage_audit_period = hour
notify_on_state_change = vm_and_task_state
notification_driver = messagingv2
Finalize the installation
-----------------------------------------------
#. Restart the agent::
# systemctl enable ceilometer-agent-compute.service
# systemctl restart ceilometer-agent-compute.service
#. Restart the compute service::
# systemctl restart nova-compute.service
OpenStack* Telemetry - Enable compute service meters
############################################################
Telemetry uses a combination of notifications and an agent to
collect Compute meters. Perform these steps on each compute node.
Configure components
-----------------------------------------------
Edit the ``/etc/ceilometer/ceilometer.conf`` file and complete the following actions:
#. In the ``[DEFAULT]`` and ``[oslo_messaging_rabbit]`` sections, configure RabbitMQ message queue access::
[DEFAULT]
...
rpc_backend = rabbit
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
Replace the ``RABBIT_PASS`` with the password you chose for the openstack account in RabbitMQ.
#. In the ``[DEFAULT]`` and ``[keystone_authtoken]`` sections, configure Identity service access::
[DEFAULT]
...
auth_strategy = keystone
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_plugin = password
project_domain_id = default
user_domain_id = default
project_name = service
username = ceilometer
password = CEILOMETER_PASS
Replace ``CEILOMETER_PASS`` with the password you chose for the Telemetry service database.
#. In the ``[service_credentials]`` section, configure service credentials::
[service_credentials]
...
os_auth_url = http://controller:5000/v2.0
os_username = ceilometer
os_tenant_name = service
os_password = CEILOMETER_PASS
os_endpoint_type = internalURL
os_region_name = RegionOne
Replace ``CEILOMETER_PASS`` with the password you chose for the ceilometer user in the Identity service.
Configure Compute to use Telemetry
-----------------------------------------------
#. Edit the ``/etc/nova/nova.conf`` file and configure notifications in the ``[DEFAULT]`` section::
[DEFAULT]
...
instance_usage_audit = True
instance_usage_audit_period = hour
notify_on_state_change = vm_and_task_state
notification_driver = messagingv2
Finalize the installation
-----------------------------------------------
#. Restart the agent::
# systemctl enable ceilometer-agent-compute.service
# systemctl restart ceilometer-agent-compute.service
#. Restart the compute service::
# systemctl restart nova-compute.service
@@ -1,35 +1,35 @@
OpenStack* Telemetry - Enable image service meters
############################################################
Telemetry uses notifications to collect Image service meters.
Perform these steps on the controller node.
Configure the Image service to use Telemetry
-----------------------------------------------
Edit the ``/etc/glance/glance-api.conf`` and ``/etc/glance/glance-registry.conf``
files and complete the following actions:
#. In the ``[DEFAULT]`` section, configure notifications and RabbitMQ message broker access::
[DEFAULT]
...
notification_driver = messagingv2
rpc_backend = rabbit
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
Replace the ``RABBIT_PASS`` with the password you chose for the openstack account in RabbitMQ.
Finalize the installation
----------------------------
#. Restart the image service::
# systemctl restart glance-registry.service
# systemctl restart glance-api.service
OpenStack* Telemetry - Enable image service meters
############################################################
Telemetry uses notifications to collect Image service meters.
Perform these steps on the controller node.
Configure the Image service to use Telemetry
-----------------------------------------------
Edit the ``/etc/glance/glance-api.conf`` and ``/etc/glance/glance-registry.conf``
files and complete the following actions:
#. In the ``[DEFAULT]`` section, configure notifications and RabbitMQ message broker access::
[DEFAULT]
...
notification_driver = messagingv2
rpc_backend = rabbit
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
Replace the ``RABBIT_PASS`` with the password you chose for the openstack account in RabbitMQ.
Finalize the installation
----------------------------
#. Restart the image service::
# systemctl restart glance-registry.service
# systemctl restart glance-api.service
@@ -1,59 +1,59 @@
OpenStack* Telemetry - Verify Operation
############################################################
Verify Operation
------------------
Verify operation of the Telemetry service. These steps only include the Image service meters to reduce clutter. Environments with ceilometer integration for additional services contain more meters.
#. Source the ``admin`` credentials to gain access to admin-only CLI
commands::
$ source admin-openrc.sh
#. List available meters::
$ ceilometer meter-list
+--------------+-------+-------+--------------------------------------+---------+------------+
| Name | Type | Unit | Resource ID | User ID | Project ID |
+--------------+-------+-------+--------------------------------------+---------+------------+
| image | gauge | image | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.size | gauge | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
+--------------+-------+-------+--------------------------------------+---------+------------+
#. Download the CirrOS image from the Image service::
$ IMAGE_ID=$(glance image-list | grep 'cirros' | awk '{ print $2 }')
$ glance image-download $IMAGE_ID > /tmp/cirros.img
#. List available meters again to validate detection of the image download::
$ ceilometer meter-list
+----------------+-------+-------+--------------------------------------+---------+------------+
| Name | Type | Unit | Resource ID | User ID | Project ID |
+----------------+-------+-------+--------------------------------------+---------+------------+
| image | gauge | image | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.download | delta | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.serve | delta | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.size | gauge | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
+----------------+-------+-------+--------------------------------------+---------+------------+
#. Retrieve usage statistics from the image.download meter::
$ ceilometer statistics -m image.download -p 60
+--------+---------------------+---------------------+------------+------------+------------+------------+-------+----------+----------------------------+----------------------------+
| Period | Period Start | Period End | Max | Min | Avg | Sum | Count | Duration | Duration Start | Duration End |
+--------+---------------------+---------------------+------------+------------+------------+------------+-------+----------+----------------------------+----------------------------+
| 60 | 2015-04-21T12:21:45 | 2015-04-21T12:22:45 | 13200896.0 | 13200896.0 | 13200896.0 | 13200896.0 | 1 | 0.0 | 2015-04-21T12:22:12.983000 | 2015-04-21T12:22:12.983000 |
+--------+---------------------+---------------------+------------+------------+------------+------------+-------+----------+----------------------------+----------------------------+
#. Remove the previously downloaded image file /tmp/cirros.img::
$ rm /tmp/cirros.img
OpenStack* Telemetry - Verify Operation
############################################################
Verify Operation
------------------
Verify operation of the Telemetry service. These steps only include the Image service meters to reduce clutter. Environments with ceilometer integration for additional services contain more meters.
#. Source the ``admin`` credentials to gain access to admin-only CLI
commands::
$ source admin-openrc.sh
#. List available meters::
$ ceilometer meter-list
+--------------+-------+-------+--------------------------------------+---------+------------+
| Name | Type | Unit | Resource ID | User ID | Project ID |
+--------------+-------+-------+--------------------------------------+---------+------------+
| image | gauge | image | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.size | gauge | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
+--------------+-------+-------+--------------------------------------+---------+------------+
#. Download the CirrOS image from the Image service::
$ IMAGE_ID=$(glance image-list | grep 'cirros' | awk '{ print $2 }')
$ glance image-download $IMAGE_ID > /tmp/cirros.img
#. List available meters again to validate detection of the image download::
$ ceilometer meter-list
+----------------+-------+-------+--------------------------------------+---------+------------+
| Name | Type | Unit | Resource ID | User ID | Project ID |
+----------------+-------+-------+--------------------------------------+---------+------------+
| image | gauge | image | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.download | delta | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.serve | delta | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
| image.size | gauge | B | acafc7c0-40aa-4026-9673-b879898e1fc2 | None | cf12a15... |
+----------------+-------+-------+--------------------------------------+---------+------------+
#. Retrieve usage statistics from the image.download meter::
$ ceilometer statistics -m image.download -p 60
+--------+---------------------+---------------------+------------+------------+------------+------------+-------+----------+----------------------------+----------------------------+
| Period | Period Start | Period End | Max | Min | Avg | Sum | Count | Duration | Duration Start | Duration End |
+--------+---------------------+---------------------+------------+------------+------------+------------+-------+----------+----------------------------+----------------------------+
| 60 | 2015-04-21T12:21:45 | 2015-04-21T12:22:45 | 13200896.0 | 13200896.0 | 13200896.0 | 13200896.0 | 1 | 0.0 | 2015-04-21T12:22:12.983000 | 2015-04-21T12:22:12.983000 |
+--------+---------------------+---------------------+------------+------------+------------+------------+-------+----------+----------------------------+----------------------------+
#. Remove the previously downloaded image file /tmp/cirros.img::
$ rm /tmp/cirros.img
@@ -1,210 +1,210 @@
.. _ceph-deploy:
Ceph*
#####
Ceph is a distributed storage system designed to scale well. It can be
integrated with OpenStack* as the storage backend for the OS images and
volumes.
Deploying a Ceph storage cluster is simple using Clear Linux* OS for
Intel® Architecture and Ansible*.
Environment
===========
For this example, we'll use a total of six nodes: a **deployment node**,
to run the playbooks, a **monitor node**, a **metadata node** and three
**storage nodes**.
Install each component on its own server for best results; however,
for testing purposes you can install the monitor, metadata, and storage
nodes all on the same host.
Prerequisites
=============
Ansible uses ``ssh`` to run commands on the remote servers. In order to
do that, the servers must be configured to allow passwordless ssh
connections from the root user. Follow these steps to configure
your nodes.
On your cluster nodes
---------------------
#. Enable root login::
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
#. Enable sshd service::
# systemctl enable sshd
# systemctl start sshd
On your deployment node
-----------------------
#. Generate an ssh key if you have not already::
# ssh-keygen
#. Copy your public key (:file:`~/.ssh/id_rsa.pub`) to :file:`/root/.ssh/authorized_keys` on each node::
# ssh-copy-id root@node
Install the software
====================
Install the `sysadmin-hostmgmt`_ bundle on the deployment node. This
bundle contains the Ansible software required to run the playbooks, as
well as some Ansible roles and sample playbooks that you can use to
build your own::
# swupd bundle-add sysadmin-hostmgmt
Create the playbook
===================
The ``sysadmin-hostmgmt`` bundle includes some sample playbooks that
can be customized for your own needs. Start by making a copy of the
sample playbook into your home folder.::
# cp -r /usr/share/ansible/examples/ceph ~/
The playbook consist of four files that you should modify to fit
your needs::
ceph
|-- group_vars/
| |-- all
| +-- mons
|-- hosts
+-- ceph_deploy.yml
The ``hosts`` file contains the IP addresses of your servers grouped
under the roles they will serve::
[mons]
172.28.128.7
[osds]
172.28.128.8
172.28.128.9
172.28.128.10
[mdss]
172.28.128.11
This :file:`groups_var/all` file contains variables that will be applied
to all your nodes. The mandatory variables are already there; be sure
to change the values accordingly to fit your environment. It should
look something like this::
---
journal_size: 1024
monitor_interface: enp0s8
public_network: 172.28.128.0/24
cluster_network: "{{ public_network }}"
A full list of available variables can be found under each role
in ``defaults/main.yml``::
* `ceph-common/defaults/main.yml`_
* `ceph-mon/defaults/main.yml`_
* `ceph-mds/defaults/main.yml`_
* `ceph-osd/defaults/main.yml`_
This :file:`groups_var/osd` file contains variables that apply only
to the hosts under the ``[mons]`` section in your hosts file. You can
choose one of the three available scenarios for this playbook.
#. **Journal and osd_data on the same device**: This will co-locate both
journal and data on the same disk, creating a partition at the
beginning of the device::
journal_collocation: true
devices:
- /dev/sdb
- /dev/sdc
- /dev/sdd
#. **N journal devices for N OSDs**: In this example, the ``sdb``
partition will be used for journaling of ``sdc``. The ``sdd sdf``
will be used for journaling of ``sde``::
raw_multi_journal: true
devices:
- /dev/sdc
- /dev/sdd
- /dev/sde
raw_journal_devices:
- /dev/sdb
- /dev/sdb
- /dev/sdf
#. **Specify a directory instead of disk for OSDs**::
osd_directory: true
osd_directories:
- /var/lib/ceph/osd/mydir1
- /var/lib/ceph/osd/mydir2
- /var/lib/ceph/osd/mydir3
Note: The directories should reside on an XFS filesystem. EXT4 is not supported.
Run the playbook
================
Once the variables and hosts file is configured,
deployment is as simple as issuing the command::
# ansible-playbook -i hosts ceph_deploy.yml
Verify
======
After Ansible has finished deployment, you may
like to verify and watch the health of the cluster
with Ceph utilites such as ``ceph status`` and
``ceph osd tree``::
# ceph status
cluster ee1fae3b-b95b-494c-abd7-f0629d113446
health HEALTH_OK
monmap e1: 1 mons at {node2=172.28.128.5:6789/0}
election epoch 2, quorum 0 node2
osdmap e8: 3 osds: 3 up, 3 in
flags sortbitwise
pgmap v14: 64 pgs, 1 pools, 0 bytes data, 0 objects
7566 MB used, 49647 MB / 59896 MB avail
64 active+clean
::
# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.05699 root default
-2 0.01900 host node3
0 0.01900 osd.0 up 1.00000 1.00000
-3 0.01900 host node4
1 0.01900 osd.1 up 1.00000 1.00000
-4 0.01900 host node5
2 0.01900 osd.2 up 1.00000 1.00000
::
# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
.. _ceph-common/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-common/defaults/main.yml
.. _ceph-mon/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-mon/defaults/main.yml
.. _ceph-mds/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-mds/defaults/main.yml
.. _ceph-osd/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-osd/defaults/main.yml
.. _sysadmin-hostmgmt: https://github.com/clearlinux/clr-bundles/blob/master/bundles/sysadmin-hostmgmt
.. _ceph-deploy:
Ceph*
#####
Ceph is a distributed storage system designed to scale well. It can be
integrated with OpenStack* as the storage backend for the OS images and
volumes.
Deploying a Ceph storage cluster is simple using Clear Linux* OS for
Intel® Architecture and Ansible*.
Environment
===========
For this example, we'll use a total of six nodes: a **deployment node**,
to run the playbooks, a **monitor node**, a **metadata node** and three
**storage nodes**.
Install each component on its own server for best results; however,
for testing purposes you can install the monitor, metadata, and storage
nodes all on the same host.
Prerequisites
=============
Ansible uses ``ssh`` to run commands on the remote servers. In order to
do that, the servers must be configured to allow passwordless ssh
connections from the root user. Follow these steps to configure
your nodes.
On your cluster nodes
---------------------
#. Enable root login::
# echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
#. Enable sshd service::
# systemctl enable sshd
# systemctl start sshd
On your deployment node
-----------------------
#. Generate an ssh key if you have not already::
# ssh-keygen
#. Copy your public key (:file:`~/.ssh/id_rsa.pub`) to :file:`/root/.ssh/authorized_keys` on each node::
# ssh-copy-id root@node
Install the software
====================
Install the `sysadmin-hostmgmt`_ bundle on the deployment node. This
bundle contains the Ansible software required to run the playbooks, as
well as some Ansible roles and sample playbooks that you can use to
build your own::
# swupd bundle-add sysadmin-hostmgmt
Create the playbook
===================
The ``sysadmin-hostmgmt`` bundle includes some sample playbooks that
can be customized for your own needs. Start by making a copy of the
sample playbook into your home folder.::
# cp -r /usr/share/ansible/examples/ceph ~/
The playbook consist of four files that you should modify to fit
your needs::
ceph
|-- group_vars/
| |-- all
| +-- mons
|-- hosts
+-- ceph_deploy.yml
The ``hosts`` file contains the IP addresses of your servers grouped
under the roles they will serve::
[mons]
172.28.128.7
[osds]
172.28.128.8
172.28.128.9
172.28.128.10
[mdss]
172.28.128.11
This :file:`groups_var/all` file contains variables that will be applied
to all your nodes. The mandatory variables are already there; be sure
to change the values accordingly to fit your environment. It should
look something like this::
---
journal_size: 1024
monitor_interface: enp0s8
public_network: 172.28.128.0/24
cluster_network: "{{ public_network }}"
A full list of available variables can be found under each role
in ``defaults/main.yml``::
* `ceph-common/defaults/main.yml`_
* `ceph-mon/defaults/main.yml`_
* `ceph-mds/defaults/main.yml`_
* `ceph-osd/defaults/main.yml`_
This :file:`groups_var/osd` file contains variables that apply only
to the hosts under the ``[mons]`` section in your hosts file. You can
choose one of the three available scenarios for this playbook.
#. **Journal and osd_data on the same device**: This will co-locate both
journal and data on the same disk, creating a partition at the
beginning of the device::
journal_collocation: true
devices:
- /dev/sdb
- /dev/sdc
- /dev/sdd
#. **N journal devices for N OSDs**: In this example, the ``sdb``
partition will be used for journaling of ``sdc``. The ``sdd sdf``
will be used for journaling of ``sde``::
raw_multi_journal: true
devices:
- /dev/sdc
- /dev/sdd
- /dev/sde
raw_journal_devices:
- /dev/sdb
- /dev/sdb
- /dev/sdf
#. **Specify a directory instead of disk for OSDs**::
osd_directory: true
osd_directories:
- /var/lib/ceph/osd/mydir1
- /var/lib/ceph/osd/mydir2
- /var/lib/ceph/osd/mydir3
Note: The directories should reside on an XFS filesystem. EXT4 is not supported.
Run the playbook
================
Once the variables and hosts file is configured,
deployment is as simple as issuing the command::
# ansible-playbook -i hosts ceph_deploy.yml
Verify
======
After Ansible has finished deployment, you may
like to verify and watch the health of the cluster
with Ceph utilites such as ``ceph status`` and
``ceph osd tree``::
# ceph status
cluster ee1fae3b-b95b-494c-abd7-f0629d113446
health HEALTH_OK
monmap e1: 1 mons at {node2=172.28.128.5:6789/0}
election epoch 2, quorum 0 node2
osdmap e8: 3 osds: 3 up, 3 in
flags sortbitwise
pgmap v14: 64 pgs, 1 pools, 0 bytes data, 0 objects
7566 MB used, 49647 MB / 59896 MB avail
64 active+clean
::
# ceph osd tree
ID WEIGHT TYPE NAME UP/DOWN REWEIGHT PRIMARY-AFFINITY
-1 0.05699 root default
-2 0.01900 host node3
0 0.01900 osd.0 up 1.00000 1.00000
-3 0.01900 host node4
1 0.01900 osd.1 up 1.00000 1.00000
-4 0.01900 host node5
2 0.01900 osd.2 up 1.00000 1.00000
::
# ceph fs ls
name: cephfs, metadata pool: cephfs_metadata, data pools: [cephfs_data ]
.. _ceph-common/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-common/defaults/main.yml
.. _ceph-mon/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-mon/defaults/main.yml
.. _ceph-mds/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-mds/defaults/main.yml
.. _ceph-osd/defaults/main.yml: https://github.com/clearlinux/clear-config-management/blob/master/roles/ceph-osd/defaults/main.yml
.. _sysadmin-hostmgmt: https://github.com/clearlinux/clr-bundles/blob/master/bundles/sysadmin-hostmgmt
@@ -1,7 +1,7 @@
Storage solutions
#################
.. toctree::
:maxdepth: 2
ceph-deploy
Storage solutions
#################
.. toctree::
:maxdepth: 2
ceph-deploy
+5 -5
View File
@@ -1,5 +1,5 @@
.. |codename| replace:: Zephyr Kernel
.. |PM| replace:: Hirally Rodriguez Santiago
.. |project| replace:: Zephyr Project
.. |codename| replace:: Zephyr Kernel
.. |PM| replace:: Hirally Rodriguez Santiago
.. |project| replace:: Zephyr Project
@@ -1,132 +1,132 @@
About software update
#####################
The traditional way
===================
Traditional Linux-based operating systems are often a mix of several
hundred, if not thousands, of open source projects. To make them
manageable, most distributions use the concept of "packages" to configure
and compile source code into binaries for installation.
Many distributions then combine these compiled binaries into so-called
packages, resolving dependencies and providing everything needed to
install. This is the granularity at which typical distributions deploy
their software, enabling system administrators to install and update
each package individually or as a set, using tools such as ``yum`` and
``apt-get``.
The Clear way
=============
Clear Linux OS for Intel® Architecture does things a little differently.
Following here are a few notable features that distinguish it from
standard OSes: bundles, versioning, updating, and update speed.
Bundles
-------
While we use the concept of packages to manage compiling source code into
installable binaries, we do not deploy software through packages. Instead,
we provide "bundles" which operate as a self-contained set of functionality
for the system administrator -- functionality that gets enabled by composing
all the required upstream open-source projects into one logical unit: a
bundle.
Versioning
----------
On a traditional distribution, the process of describing current software
versioning usually involves:
- Listing and keeping track of the current OS release (generally
uninformative about any singular packages or functionality),
- Keeping track of packages and repositories being used, updating them
individually,
- Listing and tracking every package available and installed on the
system, none of which are directly tied to the current OS release
This can be done effectively, but given the nearly endless combinations of
packages and versions of packages a server may have, it quickly becomes
non-trivial to define what "version" the system is and what software it
is running without explicitly going through each system and inspecting
every package.
With the Clear Linux OS for Intel Architecture, we need only track:
- One single number
A number representing the **current** release of the OS is sufficient to
describe the versions of all the software on the OS. Each build is
composed of a specific set of bundles made from a particular version of
packages. This matters on a daily basis to system administrators, who
need to determine which of their systems do not have the latest security
fixes, or which combinations of software have been tested, and on what
other pieces. Every release of the same number is guaranteed to contain
the same versions of software, so there's no ambiguity between two
systems running the same Clear Linux OS for Intel Architecture.
Updating
--------
Another notable difference between package-based distributions and Clear Linux
is how updates are managed. On a package-based OS, system administrators update
each individual package or piece of software to a newer (or older!) version. With
Clear Linux OS for Intel Architecture, an update translates to an entirely new
OS version, containing one or many updates. It is not possible to update a
piece of the system while remaining on the same version of Clear Linux.
How is this useful? Although it seems, at first, like a huge restriction
or limitation, this method has many non-obvious benefits. Imagine a
cloud environment composed of numerous machines. Here, a homogeneous set of
software makes sense -- from the system administrator's level down to the
user level. Homogeneous systems allow users the ability to focus on their
contributions and/or code, rather than configuring environments or worrying
about synchronizing versions and updates. At the system admin level, it
ensures security is tighter and makes it far easier to monitor and update
patches.
Clear Linux OS will automatically check for updates and apply them. This default
can be disabled by running::
# systemctl mask swupd-update.timer
And reenabled by running::
# systemctl unmask swupd-update.timer
Update speed
------------
Software updates with Clear Linux OS for Intel Architecture are also
efficient. Bundles simply describe a set of files, and the update
technology updates *only* files that actually changed by using so-called
binary-delta technology for efficiency [1]_. Operating systems that use
packages as the unit of deployment require full package updates (thus
hogging resources), even when one small file in that package has changed.
It is quite common for a full OS update fixing a security hole to be
only 15 kilobytes in total update size. If only several kilobytes need
to be changed, it does not make sense to re-download and reinstall an
entire package or suite of programs just to incorporate a minuscule (yet
important) update. Through binary deltas, the OS is able to update only
those bits that changed, yielding very small update content (deltas)
that can be applied exceedingly fast. As a result, major security patches
and core update take merely seconds.
We realize that while our definition of bundles makes sense to us, each
data center operator may have special needs and ideas. For that reason
we're hard at work on a "mixer" tool, which allows users of Clear Linux OS
for Intel Architecture the ability to customize and add bundles and
their own software while keeping the content of the operating
system, and its updates, as the base. With this tool, system administrators
can focus on the pieces of their OS deployment that are custom to their
environment, while continuing to stay on a controlled update stream.
.. [1] The software update technology for Clear Linux* OS for Intel Architecture
was first presented at the Linux Plumbers conference in 2012.
About software update
#####################
The traditional way
===================
Traditional Linux-based operating systems are often a mix of several
hundred, if not thousands, of open source projects. To make them
manageable, most distributions use the concept of "packages" to configure
and compile source code into binaries for installation.
Many distributions then combine these compiled binaries into so-called
packages, resolving dependencies and providing everything needed to
install. This is the granularity at which typical distributions deploy
their software, enabling system administrators to install and update
each package individually or as a set, using tools such as ``yum`` and
``apt-get``.
The Clear way
=============
Clear Linux OS for Intel® Architecture does things a little differently.
Following here are a few notable features that distinguish it from
standard OSes: bundles, versioning, updating, and update speed.
Bundles
-------
While we use the concept of packages to manage compiling source code into
installable binaries, we do not deploy software through packages. Instead,
we provide "bundles" which operate as a self-contained set of functionality
for the system administrator -- functionality that gets enabled by composing
all the required upstream open-source projects into one logical unit: a
bundle.
Versioning
----------
On a traditional distribution, the process of describing current software
versioning usually involves:
- Listing and keeping track of the current OS release (generally
uninformative about any singular packages or functionality),
- Keeping track of packages and repositories being used, updating them
individually,
- Listing and tracking every package available and installed on the
system, none of which are directly tied to the current OS release
This can be done effectively, but given the nearly endless combinations of
packages and versions of packages a server may have, it quickly becomes
non-trivial to define what "version" the system is and what software it
is running without explicitly going through each system and inspecting
every package.
With the Clear Linux OS for Intel Architecture, we need only track:
- One single number
A number representing the **current** release of the OS is sufficient to
describe the versions of all the software on the OS. Each build is
composed of a specific set of bundles made from a particular version of
packages. This matters on a daily basis to system administrators, who
need to determine which of their systems do not have the latest security
fixes, or which combinations of software have been tested, and on what
other pieces. Every release of the same number is guaranteed to contain
the same versions of software, so there's no ambiguity between two
systems running the same Clear Linux OS for Intel Architecture.
Updating
--------
Another notable difference between package-based distributions and Clear Linux
is how updates are managed. On a package-based OS, system administrators update
each individual package or piece of software to a newer (or older!) version. With
Clear Linux OS for Intel Architecture, an update translates to an entirely new
OS version, containing one or many updates. It is not possible to update a
piece of the system while remaining on the same version of Clear Linux.
How is this useful? Although it seems, at first, like a huge restriction
or limitation, this method has many non-obvious benefits. Imagine a
cloud environment composed of numerous machines. Here, a homogeneous set of
software makes sense -- from the system administrator's level down to the
user level. Homogeneous systems allow users the ability to focus on their
contributions and/or code, rather than configuring environments or worrying
about synchronizing versions and updates. At the system admin level, it
ensures security is tighter and makes it far easier to monitor and update
patches.
Clear Linux OS will automatically check for updates and apply them. This default
can be disabled by running::
# systemctl mask swupd-update.timer
And reenabled by running::
# systemctl unmask swupd-update.timer
Update speed
------------
Software updates with Clear Linux OS for Intel Architecture are also
efficient. Bundles simply describe a set of files, and the update
technology updates *only* files that actually changed by using so-called
binary-delta technology for efficiency [1]_. Operating systems that use
packages as the unit of deployment require full package updates (thus
hogging resources), even when one small file in that package has changed.
It is quite common for a full OS update fixing a security hole to be
only 15 kilobytes in total update size. If only several kilobytes need
to be changed, it does not make sense to re-download and reinstall an
entire package or suite of programs just to incorporate a minuscule (yet
important) update. Through binary deltas, the OS is able to update only
those bits that changed, yielding very small update content (deltas)
that can be applied exceedingly fast. As a result, major security patches
and core update take merely seconds.
We realize that while our definition of bundles makes sense to us, each
data center operator may have special needs and ideas. For that reason
we're hard at work on a "mixer" tool, which allows users of Clear Linux OS
for Intel Architecture the ability to customize and add bundles and
their own software while keeping the content of the operating
system, and its updates, as the base. With this tool, system administrators
can focus on the pieces of their OS deployment that are custom to their
environment, while continuing to stay on a controlled update stream.
.. [1] The software update technology for Clear Linux* OS for Intel Architecture
was first presented at the Linux Plumbers conference in 2012.
@@ -1,8 +1,8 @@
Software update
###############
.. toctree::
:maxdepth: 2
swupdate_about_sw_update
swupdate_how_to_run_the_updater
Software update
###############
.. toctree::
:maxdepth: 2
about
updater
@@ -1,41 +1,41 @@
How to run the updater
######################
This section describes how to manually trigger the software update code in Clear Linux* OS for Intel® Architecture.
Prerequisites
~~~~~~~~~~~~~
- System is up and running a Clear Linux OS for Intel
Architecture official build, 300 or later.
- Device is on a well-connected network.
- Device is able to connect to release infrastructure. For example:
http://update.clearlinux.org/update/300/
Running the updater
~~~~~~~~~~~~~~~~~~~
#. Open a Terminal Emulator.
#. Become root and trigger an update with this command::
# swupd update
#. If the updater console output indicates a kernel update occurred,
then at your convenience reboot to begin using the new OS version.
Updater options
~~~~~~~~~~~~~~~
Help options:
- ``-h, --help`` Display help options.
Application options:
- ``-d, --download`` Download all content, but do not actually install
the update.
- ``-v, --verbose`` Increase verbosity of log and console messages.
How to run the updater
######################
This section describes how to manually trigger the software update code in Clear Linux* OS for Intel® Architecture.
Prerequisites
~~~~~~~~~~~~~
- System is up and running a Clear Linux OS for Intel
Architecture official build, 300 or later.
- Device is on a well-connected network.
- Device is able to connect to release infrastructure. For example:
http://update.clearlinux.org/update/300/
Running the updater
~~~~~~~~~~~~~~~~~~~
#. Open a Terminal Emulator.
#. Become root and trigger an update with this command::
# swupd update
#. If the updater console output indicates a kernel update occurred,
then at your convenience reboot to begin using the new OS version.
Updater options
~~~~~~~~~~~~~~~
Help options:
- ``-h, --help`` Display help options.
Application options:
- ``-d, --download`` Download all content, but do not actually install
the update.
- ``-v, --verbose`` Increase verbosity of log and console messages.
+75 -75
View File
@@ -1,75 +1,75 @@
.. _vm-hyper-v:
Using Hyper-V
#############
This section explains how to run Clear Linux OS for Intel® Architecture
inside a `Windows Server Virtualization`_ *A.K.A.* **Hyper-V** environment.
Install Hyper-V*
================
Please refer to `Microsoft documentation`_ to install and configure
*Hyper-V* on your machine.
Create a virtual machine
========================
#. Download the `latest`_ live version (clear-XXXX-live.img.xz) of Clear Linux OS
for Intel Architecture.
#. Decompress the downloaded image. Uncompressed image size is ~ **5GB**.
#. To convert a raw image to :abbr:`VHD (Virtual Hard Disk)`
format, you can use VirtualBox_ or QEMU_.
* With *VirtualBox*, you can use one of the following commands::
> VBoxManage convertfromraw clear-XXXX-live.img clear-XXXX-live.vhd --format VHD
or::
> vbox-img convert --srcfilename clear-XXXX-live.img --dstfilename clear-XXXX-live.vhd --srcformat raw --dstformat vhd
* With *QEMU*, you can use the following command::
> qemu-img convert -f raw -O vpc clear-XXXX-live.img clear-XXXX-live.vhd
You can test your new *VHD image* using the **PowerShell** command line::
PS C:\> Test-VHD -Path c:\path\to\clear-XXXX-live.vhd
Clear Linux OS for Intel Architecture uses *EFI* to boot. Since this feature
is availible only in `Generation 2`_ or later virtual machines, you'll need
to convert from **VHD** to **VHDX**. To do this, you can use the following
*PowerShell* command::
PS C:\> Convert-VHD -Path c:\path\to\clear-XXXX-live.vhd -DestinationPath c:\path\to\clear-XXXX-live.vhdx
You can save the new *VHDX* virtual hard disk in :file:`C:\\Users\\Public\\Documents\\Hyper-V\\Virtual Hard Disks`.
#. Create a virtual machine using the **Hyper-V Manager**:
* Choose **Generation 2** when you need to *specify VM generation*.
* Choose **Use an existing virtual hard disk** and browse to find the :file:`clear-XXXX-live.vhdx` file.
* When finised, open VM settings, select Firmware Section and in Secure Boot
config, **uncheck** Enable Secure Boot.
+ Currently Clear Linux does not boot with secure boot enabled.
#. Finally, connect to your new VM and start it. You should see a prompt asking for
a user; use::
> User: root
and set a root user password.
.. _Windows Server Virtualization: https://www.microsoft.com/en-us/server-cloud/solutions/virtualization.aspx
.. _Microsoft documentation: https://www.microsoft.com/en-us/server-cloud/solutions/virtualization.aspx
.. _latest: https://download.clearlinux.org/image/
.. _7zip: http://www.7-zip.org/
.. _VirtualBox: https://www.virtualbox.org/
.. _QEMU: http://wiki.qemu.org/Links
.. _Generation 2: https://technet.microsoft.com/en-us/library/dn282285.aspx
.. _vm-hyper-v:
Using Hyper-V
#############
This section explains how to run Clear Linux OS for Intel® Architecture
inside a `Windows Server Virtualization`_ *A.K.A.* **Hyper-V** environment.
Install Hyper-V*
================
Please refer to `Microsoft documentation`_ to install and configure
*Hyper-V* on your machine.
Create a virtual machine
========================
#. Download the `latest`_ live version (clear-XXXX-live.img.xz) of Clear Linux OS
for Intel Architecture.
#. Decompress the downloaded image. Uncompressed image size is ~ **5GB**.
#. To convert a raw image to :abbr:`VHD (Virtual Hard Disk)`
format, you can use VirtualBox_ or QEMU_.
* With *VirtualBox*, you can use one of the following commands::
> VBoxManage convertfromraw clear-XXXX-live.img clear-XXXX-live.vhd --format VHD
or::
> vbox-img convert --srcfilename clear-XXXX-live.img --dstfilename clear-XXXX-live.vhd --srcformat raw --dstformat vhd
* With *QEMU*, you can use the following command::
> qemu-img convert -f raw -O vpc clear-XXXX-live.img clear-XXXX-live.vhd
You can test your new *VHD image* using the **PowerShell** command line::
PS C:\> Test-VHD -Path c:\path\to\clear-XXXX-live.vhd
Clear Linux OS for Intel Architecture uses *EFI* to boot. Since this feature
is availible only in `Generation 2`_ or later virtual machines, you'll need
to convert from **VHD** to **VHDX**. To do this, you can use the following
*PowerShell* command::
PS C:\> Convert-VHD -Path c:\path\to\clear-XXXX-live.vhd -DestinationPath c:\path\to\clear-XXXX-live.vhdx
You can save the new *VHDX* virtual hard disk in :file:`C:\\Users\\Public\\Documents\\Hyper-V\\Virtual Hard Disks`.
#. Create a virtual machine using the **Hyper-V Manager**:
* Choose **Generation 2** when you need to *specify VM generation*.
* Choose **Use an existing virtual hard disk** and browse to find the :file:`clear-XXXX-live.vhdx` file.
* When finised, open VM settings, select Firmware Section and in Secure Boot
config, **uncheck** Enable Secure Boot.
+ Currently Clear Linux does not boot with secure boot enabled.
#. Finally, connect to your new VM and start it. You should see a prompt asking for
a user; use::
> User: root
and set a root user password.
.. _Windows Server Virtualization: https://www.microsoft.com/en-us/server-cloud/solutions/virtualization.aspx
.. _Microsoft documentation: https://www.microsoft.com/en-us/server-cloud/solutions/virtualization.aspx
.. _latest: https://download.clearlinux.org/image/
.. _7zip: http://www.7-zip.org/
.. _VirtualBox: https://www.virtualbox.org/
.. _QEMU: http://wiki.qemu.org/Links
.. _Generation 2: https://technet.microsoft.com/en-us/library/dn282285.aspx
+12 -12
View File
@@ -1,12 +1,12 @@
Running in a virtualized environment
####################################
.. toctree::
:maxdepth: 2
vm-kvm
vm-virtualbox
vm-vmware-esxi
vm-vmware-player
vm-hyper-v
Running in a virtualized environment
####################################
.. toctree::
:maxdepth: 2
kvm
virtualbox
vmware/esxi
vmware/player
hyper-v
+51 -51
View File
@@ -1,52 +1,52 @@
.. _vm-kvm:
Using KVM
#########
The easiest way to get started in a virtualized environment is to download
a recent KVM image from the `images`_ directory. Here you'll find a kvm
image file, the UEFI firmware helper, and the KVM start helper script.
Starter script
==============
To start the image, run the `qemu shell script`_ available in the
`images`_ directory.
SSH is needed for remote logins; however, SSH not enabled by default. To enable
it, log in through serial console with the username ``root``. After setting the
password, enable root login via SSH by configuring :file:`/etc/ssh/sshd_config`
with this line::
PermitRootLogin yes
Now you may connect from host via SSH through 2223::
$ ssh -p 10022 root@localhost
Alternatively, there are a few other ways to approach this.
* To run the script without modifying its permissions::
$ bash start_qemu.sh clr_image
* To run it as a background process::
$ bash start_qemu.sh clr_image &
* If you'd like to run the script with execute permission::
$ chmod +x start_qemu.sh
$ ./start_qemu.sh clr_image
* And to run it as a background process::
$ ./start_qemu.sh clr_image &
If you run into any trouble with qemu getting locked up, try editing the `qemu shell script`_
and removing the ``aio=threads``
.. _qemu shell script: http://download.clearlinux.org/image/start_qemu.sh
.. _vm-kvm:
Using KVM
#########
The easiest way to get started in a virtualized environment is to download
a recent KVM image from the `images`_ directory. Here you'll find a kvm
image file, the UEFI firmware helper, and the KVM start helper script.
Starter script
==============
To start the image, run the `qemu shell script`_ available in the
`images`_ directory.
SSH is needed for remote logins; however, SSH not enabled by default. To enable
it, log in through serial console with the username ``root``. After setting the
password, enable root login via SSH by configuring :file:`/etc/ssh/sshd_config`
with this line::
PermitRootLogin yes
Now you may connect from host via SSH through 2223::
$ ssh -p 10022 root@localhost
Alternatively, there are a few other ways to approach this.
* To run the script without modifying its permissions::
$ bash start_qemu.sh clr_image
* To run it as a background process::
$ bash start_qemu.sh clr_image &
* If you'd like to run the script with execute permission::
$ chmod +x start_qemu.sh
$ ./start_qemu.sh clr_image
* And to run it as a background process::
$ ./start_qemu.sh clr_image &
If you run into any trouble with qemu getting locked up, try editing the `qemu shell script`_
and removing the ``aio=threads``
.. _qemu shell script: http://download.clearlinux.org/image/start_qemu.sh
.. _images: http://download.clearlinux.org/image/
@@ -1,136 +1,136 @@
.. _vm-virtualbox:
Using VirtualBox
################
This section explains how to run Clear Linux OS for Intel® Architecture
inside a `VirtualBox`_\* environment.
Download VirtualBox
===================
VirtualBox is a hypervisor supported by Oracle. You can
download it from the `official VirtualBox website`_ and select
the operating system you are using.
Download **version 5.0 or greater** to ensure support for
the :abbr:`AVX (Advanced Vector Extensions)` needed to run
Clear Linux OS for Intel Architecture.
Create a virtual machine in VirtualBox
======================================
#. Download the `latest`_ live version (clear-XXXX-live.img.xz)
from https://download.clearlinux.org/image/.
#. Decompress the downloaded image. Uncompressed image size is ~ **5GB**.
- On Linux ::
$ xz -d clear-XXXX-live.img.xz
- On Windows you can use `7zip`_.
#. To convert a raw image to :abbr:`VDI (VirtualBox Disk Image)`
format, you can use one of the following commands::
$ VBoxManage convertfromraw clear-XXXX-live.img clear-XXXX-live.vdi --format VDI
or::
$ vbox-img convert --srcfilename clear-XXXX-live.img --dstfilename clear-XXXX-live.vdi --srcformat raw --dstformat vdi
Note: Be sure you have Virtual box directory in your PATH (i.e.: on Windows
:file:`C:\\Program Files\\Oracle\\VirtualBox`).
#. Create a virtual machine using the VirtualBox assistant:
* Type: **Linux**
* Version: **Linux 2.6 / 3.x / 4.x (64-bit)**
* Attach the virtual disk created in the step number 3 as virtual hard disk file
#. After it is created, go to settings to enable **EFI support**
* System -> Enable EFI (special OSes only)
Run your new VM
===============
Clear Linux OS for Intel Architecture supports VirtualBox kernel modules used
by the Linux kernel 4.4 :abbr:`LTS (Long Term Support)` (*kernel-lts bundle*).
This kernel was selected because Clear Linux OS's main kernel
(``kernel-native``) bundle keeps up-to-date with the upstream Linux kernel,
and sometimes VirtualBox kernel modules aren't compatible with pre-kernel
releases.
In the first boot, Clear Linux will ask for a login user, type **root** and
then the system will ask you for a new password.
To install the VirtualBox kernel modules, here are the steps:
#. Install the bundle that supports VirtualBox modules::
# swupd bundle-add kernel-lts
#. Set a timeout in the bootmanager to shows a menu at boot time::
# clr-boot-manager set-timeout 10
#. Update the bootloader entries with::
# clr-boot-manager update
#. Reboot your system with::
# reboot
and choose LTS kernel version.
#. (*Optional*) Unset timeout to boot directly to LTS version::
# clr-boot-manager set-timeout 0
#. (*Mandatory*) Update bootmanger to use always LTS version::
# clr-boot-manager update
Install Guest Additions
-----------------------
The kernel modules are shipped with the ``kernel-lts`` bundle; however,
you'll need to install the *user* Linux Guest Additions. To install the
VirtualBox Guest Additions, follow these steps:
#. Install the **sysadmin-basic** bundle::
# swupd bundle-add sysadmin-basic
#. Insert Guest Additions CD image using *Devices* menu
#. Install Linux users Guest Additions::
# install-vbox-lga
#. Reboot your system::
# reboot
#. (*Optional*) To use Clear Linux graphical user interface, add the GUI bundle::
# swupd bundle-add os-utils-gui
once the ``os-utils-gui`` bundle is installed, start your graphical
user interface with::
# startxfce4
Clear Linux doesn't provide a graphical display manager.
.. _official VirtualBox website: https://www.virtualbox.org/wiki/Downloads
.. _VirtualBox: https://www.virtualbox.org/
.. _latest: https://download.clearlinux.org/image/
.. _7zip: http://www.7-zip.org/
.. _vm-virtualbox:
Using VirtualBox
################
This section explains how to run Clear Linux OS for Intel® Architecture
inside a `VirtualBox`_\* environment.
Download VirtualBox
===================
VirtualBox is a hypervisor supported by Oracle. You can
download it from the `official VirtualBox website`_ and select
the operating system you are using.
Download **version 5.0 or greater** to ensure support for
the :abbr:`AVX (Advanced Vector Extensions)` needed to run
Clear Linux OS for Intel Architecture.
Create a virtual machine in VirtualBox
======================================
#. Download the `latest`_ live version (clear-XXXX-live.img.xz)
from https://download.clearlinux.org/image/.
#. Decompress the downloaded image. Uncompressed image size is ~ **5GB**.
- On Linux ::
$ xz -d clear-XXXX-live.img.xz
- On Windows you can use `7zip`_.
#. To convert a raw image to :abbr:`VDI (VirtualBox Disk Image)`
format, you can use one of the following commands::
$ VBoxManage convertfromraw clear-XXXX-live.img clear-XXXX-live.vdi --format VDI
or::
$ vbox-img convert --srcfilename clear-XXXX-live.img --dstfilename clear-XXXX-live.vdi --srcformat raw --dstformat vdi
Note: Be sure you have Virtual box directory in your PATH (i.e.: on Windows
:file:`C:\\Program Files\\Oracle\\VirtualBox`).
#. Create a virtual machine using the VirtualBox assistant:
* Type: **Linux**
* Version: **Linux 2.6 / 3.x / 4.x (64-bit)**
* Attach the virtual disk created in the step number 3 as virtual hard disk file
#. After it is created, go to settings to enable **EFI support**
* System -> Enable EFI (special OSes only)
Run your new VM
===============
Clear Linux OS for Intel Architecture supports VirtualBox kernel modules used
by the Linux kernel 4.4 :abbr:`LTS (Long Term Support)` (*kernel-lts bundle*).
This kernel was selected because Clear Linux OS's main kernel
(``kernel-native``) bundle keeps up-to-date with the upstream Linux kernel,
and sometimes VirtualBox kernel modules aren't compatible with pre-kernel
releases.
In the first boot, Clear Linux will ask for a login user, type **root** and
then the system will ask you for a new password.
To install the VirtualBox kernel modules, here are the steps:
#. Install the bundle that supports VirtualBox modules::
# swupd bundle-add kernel-lts
#. Set a timeout in the bootmanager to shows a menu at boot time::
# clr-boot-manager set-timeout 10
#. Update the bootloader entries with::
# clr-boot-manager update
#. Reboot your system with::
# reboot
and choose LTS kernel version.
#. (*Optional*) Unset timeout to boot directly to LTS version::
# clr-boot-manager set-timeout 0
#. (*Mandatory*) Update bootmanger to use always LTS version::
# clr-boot-manager update
Install Guest Additions
-----------------------
The kernel modules are shipped with the ``kernel-lts`` bundle; however,
you'll need to install the *user* Linux Guest Additions. To install the
VirtualBox Guest Additions, follow these steps:
#. Install the **sysadmin-basic** bundle::
# swupd bundle-add sysadmin-basic
#. Insert Guest Additions CD image using *Devices* menu
#. Install Linux users Guest Additions::
# install-vbox-lga
#. Reboot your system::
# reboot
#. (*Optional*) To use Clear Linux graphical user interface, add the GUI bundle::
# swupd bundle-add os-utils-gui
once the ``os-utils-gui`` bundle is installed, start your graphical
user interface with::
# startxfce4
Clear Linux doesn't provide a graphical display manager.
.. _official VirtualBox website: https://www.virtualbox.org/wiki/Downloads
.. _VirtualBox: https://www.virtualbox.org/
.. _latest: https://download.clearlinux.org/image/
.. _7zip: http://www.7-zip.org/
@@ -1,83 +1,83 @@
.. _vm-vmware-esxi:
Using *VMware** ESXi guest
##########################
This topic, which is based on *VMware vSphere 6*, explains how to use Clear Linux* OS
for Intel® Architecture as ESXi Guest.
Run Clear Linux OS for Intel Architecture
=========================================
#. Download the `latest`_ live version of the disk image.
#. Decompress the downloaded image. Uncompressed image size is ~ **5GB**.
#. Create a virtual machine with the following configuration:
- **Guest OS**: Linux, Distribution Other 3.x Linux (64-bits)
- **UEFI support**: Clear Linux uses `systemd-boot` as the UEFI boot manager
for EFI images. Find the settings for this option using the vSphere GUI; go
to the configuration settings of the virtual machine and select
**EFI boot firmware**.
- **IDE disk**: Convert to vmdk and attach the Clear Linux image you downloaded
above. To convert Clear Linux image to VMware disk (vmdk) you can use the
``qemu-img`` command::
$ qemu-img convert -f raw -O vmdk -p clear-vmware.img clear-vmware.vmdk
#. Start the virtual machine
Using an optimized kernel for *VMware*
======================================
Clear Linux provides an optional bundle called *kernel-vmware* that contains a
specialized kernel with specific configuration for VMware hypervisor, including:
* **vmw_balloon** -- A technique for memory reclamation that works like a
balloon. A guest can be inflated to reclaim physical memory. The balloon
can also be deflated to allow the guest free memory pages.
* **vmw_pvscsi** -- A driver that allows use of the para-virtualized SCSI provided
by *VMware* hypervisors.
* **vmxnet3** -- Allows use of VMware virtual ethernet NICs.
* **vmwgfx** -- Allows use of a DRM driver for the VMware virtual hardware
To use these features, add the ``kernel-vmware`` bundle to your Clear Linux install::
# swupd bundle-add kernel-vmware
Now turn off the virtual machine and change the configuration as follows:
- **Guest OS**: Linux / 3.x Linux (64-bits)
- **UEFI support**: Clear Linux uses `systemd-boot` as the UEFI boot manager
for EFI images. To add UEFI support, go to "Configuration settings of the
virtual machine" -> "General Tab" -> "And select EFI boot firmware"
- **SCSI Para-virtualized disk**: Convert the Clear Linux image to an SCSI
VMware disk image and re-attach it.
#. Extract the image from the EXSi server to one Linux machine and use
``qemu-img`` command::
$ qemu-img convert -f raw -O vmdk -o adapter_type=lsilogic -o compat6 -p clear-vmware.img clear-vmware.vmdk
#. Transfer the Clear Linux image to the VMware ESXi server and use the
:command:`vmkfstools` command (you need to access to ESXi command line )::
$ vmkfstools -i clear-vmware.vmdk -d zeroedthick clear-vmware-fix.vmdk
#. Add the converted image to the guest by using VMware vSphere virtual
machine settings
Finally, start the modified virtual machine.
.. _latest: https://download.clearlinux.org/image/
.. _vm-vmware-esxi:
Using *VMware** ESXi guest
##########################
This topic, which is based on *VMware vSphere 6*, explains how to use Clear Linux* OS
for Intel® Architecture as ESXi Guest.
Run Clear Linux OS for Intel Architecture
=========================================
#. Download the `latest`_ live version of the disk image.
#. Decompress the downloaded image. Uncompressed image size is ~ **5GB**.
#. Create a virtual machine with the following configuration:
- **Guest OS**: Linux, Distribution Other 3.x Linux (64-bits)
- **UEFI support**: Clear Linux uses `systemd-boot` as the UEFI boot manager
for EFI images. Find the settings for this option using the vSphere GUI; go
to the configuration settings of the virtual machine and select
**EFI boot firmware**.
- **IDE disk**: Convert to vmdk and attach the Clear Linux image you downloaded
above. To convert Clear Linux image to VMware disk (vmdk) you can use the
``qemu-img`` command::
$ qemu-img convert -f raw -O vmdk -p clear-vmware.img clear-vmware.vmdk
#. Start the virtual machine
Using an optimized kernel for *VMware*
======================================
Clear Linux provides an optional bundle called *kernel-vmware* that contains a
specialized kernel with specific configuration for VMware hypervisor, including:
* **vmw_balloon** -- A technique for memory reclamation that works like a
balloon. A guest can be inflated to reclaim physical memory. The balloon
can also be deflated to allow the guest free memory pages.
* **vmw_pvscsi** -- A driver that allows use of the para-virtualized SCSI provided
by *VMware* hypervisors.
* **vmxnet3** -- Allows use of VMware virtual ethernet NICs.
* **vmwgfx** -- Allows use of a DRM driver for the VMware virtual hardware
To use these features, add the ``kernel-vmware`` bundle to your Clear Linux install::
# swupd bundle-add kernel-vmware
Now turn off the virtual machine and change the configuration as follows:
- **Guest OS**: Linux / 3.x Linux (64-bits)
- **UEFI support**: Clear Linux uses `systemd-boot` as the UEFI boot manager
for EFI images. To add UEFI support, go to "Configuration settings of the
virtual machine" -> "General Tab" -> "And select EFI boot firmware"
- **SCSI Para-virtualized disk**: Convert the Clear Linux image to an SCSI
VMware disk image and re-attach it.
#. Extract the image from the EXSi server to one Linux machine and use
``qemu-img`` command::
$ qemu-img convert -f raw -O vmdk -o adapter_type=lsilogic -o compat6 -p clear-vmware.img clear-vmware.vmdk
#. Transfer the Clear Linux image to the VMware ESXi server and use the
:command:`vmkfstools` command (you need to access to ESXi command line )::
$ vmkfstools -i clear-vmware.vmdk -d zeroedthick clear-vmware-fix.vmdk
#. Add the converted image to the guest by using VMware vSphere virtual
machine settings
Finally, start the modified virtual machine.
.. _latest: https://download.clearlinux.org/image/
@@ -1,99 +1,99 @@
.. _vm-vmware-player:
Using VMware* Player
####################
This section explains how to run Clear Linux OS for Intel® Architecture
within a `VMware Player`_ environment.
Install VMware Player
=====================
VMware Workstation Player, formerly VMware Player, is a virtualization
software package for x64 computers running Microsoft Windows or Linux. Download
VMware player from the `VMware website`_.
Player on Linux
---------------
For the Linux option, you should have a ``VMware-Player-[version]_FILE.bundle`` file. To
install it, run:
::
$ sudo bash ./VMware-Player-[version].x86_64.bundle
Player on Windows
-----------------
Follow the instructions from the Setup Assistant.
Prepare Image
=============
#. Download the `latest`_ Clear Linux OS for Intel Architecture **live**
disk image, named ``[clear-[version_number]-live.img.xz]``.
#. Decompress the image. Uncompressed image size ~ **5GB**.
* On Linux ::
$ unxz clear-VERSION-live.img.xz
* On Windows you can use `7zip`_.
#. Convert the installer to :abbr:`VMDK (Virtual Machine Disk)` format.
* On Linux, you can use ``qemu-img convert``::
$ qemu-img convert -O vmdk clear-VERSION-live.img clear.vmdk
* On Windows, you can convert the live image to vmdk format (from raw format to vmdk)
with a tool like VBoxManage from `VirtualBox`_.
Run using VMware* Player
========================
#. Create a new virtual machine.
#. Click on “Create a new Virtual Machine”.
* Select “**I will install the operating system later**”, and click on “Next”.
* Select “**Linux**” as “Guest operating system” and version **Other Linux 3.x kernel 64-bit**.
* Type a name for the new virtual machine.
* Perform the *remaining steps* using the default options.
#. Change boot type to EFI. You must change the VMware virtual machine *configuration*
to **Support EFI firmware**; you can do this by editing the configuration ``.vmx``
file located in the virtual machine folder and adding the following line::
firmware = "efi"
#. Attach the prepared image as SATA disk. And when you have a new virtual machine,
edit its configuration as follows:
* Click on “Edit virtual machine settings”.
* Remove any default attached hard disk.
* Click on “Add” option below devices list tab and choose Hard disk.
* Choose **SATA** as the virtual disk type.
* Use the existing Clear Linux OS for Intel Architecture virtual disk
The live disk must be set as ``SATA 0:1 Hard Disk (SATA)``; you can verify
this under the “Advanced" section of the disk settings.
Start the virtual machine
=========================
After configuring the settings above, start the virtual machine.
.. _VMware website: https://www.vmware.com/products/player/playerpro-evaluation.html
.. _VMware Player: http://www.vmware.com/products/player/
.. _latest: https://download.clearlinux.org/image/
.. _7zip: http://www.7-zip.org/
.. _VirtualBox: https://www.virtualbox.org/
.. _vm-vmware-player:
Using VMware* Player
####################
This section explains how to run Clear Linux OS for Intel® Architecture
within a `VMware Player`_ environment.
Install VMware Player
=====================
VMware Workstation Player, formerly VMware Player, is a virtualization
software package for x64 computers running Microsoft Windows or Linux. Download
VMware player from the `VMware website`_.
Player on Linux
---------------
For the Linux option, you should have a ``VMware-Player-[version]_FILE.bundle`` file. To
install it, run:
::
$ sudo bash ./VMware-Player-[version].x86_64.bundle
Player on Windows
-----------------
Follow the instructions from the Setup Assistant.
Prepare Image
=============
#. Download the `latest`_ Clear Linux OS for Intel Architecture **live**
disk image, named ``[clear-[version_number]-live.img.xz]``.
#. Decompress the image. Uncompressed image size ~ **5GB**.
* On Linux ::
$ unxz clear-VERSION-live.img.xz
* On Windows you can use `7zip`_.
#. Convert the installer to :abbr:`VMDK (Virtual Machine Disk)` format.
* On Linux, you can use ``qemu-img convert``::
$ qemu-img convert -O vmdk clear-VERSION-live.img clear.vmdk
* On Windows, you can convert the live image to vmdk format (from raw format to vmdk)
with a tool like VBoxManage from `VirtualBox`_.
Run using VMware* Player
========================
#. Create a new virtual machine.
#. Click on “Create a new Virtual Machine”.
* Select “**I will install the operating system later**”, and click on “Next”.
* Select “**Linux**” as “Guest operating system” and version **Other Linux 3.x kernel 64-bit**.
* Type a name for the new virtual machine.
* Perform the *remaining steps* using the default options.
#. Change boot type to EFI. You must change the VMware virtual machine *configuration*
to **Support EFI firmware**; you can do this by editing the configuration ``.vmx``
file located in the virtual machine folder and adding the following line::
firmware = "efi"
#. Attach the prepared image as SATA disk. And when you have a new virtual machine,
edit its configuration as follows:
* Click on “Edit virtual machine settings”.
* Remove any default attached hard disk.
* Click on “Add” option below devices list tab and choose Hard disk.
* Choose **SATA** as the virtual disk type.
* Use the existing Clear Linux OS for Intel Architecture virtual disk
The live disk must be set as ``SATA 0:1 Hard Disk (SATA)``; you can verify
this under the “Advanced" section of the disk settings.
Start the virtual machine
=========================
After configuring the settings above, start the virtual machine.
.. _VMware website: https://www.vmware.com/products/player/playerpro-evaluation.html
.. _VMware Player: http://www.vmware.com/products/player/
.. _latest: https://download.clearlinux.org/image/
.. _7zip: http://www.7-zip.org/
.. _VirtualBox: https://www.virtualbox.org/