duplicated.. This is to freeze a working version before I try to make macros work via call blocks...main
| @@ -0,0 +1,73 @@ | |||||
| --- | |||||
| title: Building bhyve Images using makefs and mkimg | |||||
| description: > | |||||
| this is a test blog post and a sample for things | |||||
| created: !!timestamp '2014-10-29' | |||||
| tags: | |||||
| - bhyve | |||||
| - FreeBSD | |||||
| --- | |||||
| Recently Neel Natu [committed](https://svnweb.freebsd.org/changeset/base/r273375) | |||||
| work to enable bhyve to run on AMD processors. My main development | |||||
| machine is an AMD A10-5700, so the commit enables me to use bhyve for | |||||
| testing. | |||||
| EDIT: Anish Gupta did the work that Neel Natu commited. Thanks Anish! | |||||
| I had previously built images using makefs and mkimg for a CF card for | |||||
| use in another machine, so being able to build images to use with bhyve | |||||
| makes sense. | |||||
| First, you need to make sure that you have a complete source check out | |||||
| along with a completed buildworld and buildkernel. Then follow these steps: | |||||
| 1. Install world and distribution into a temporary directory using the `NO_ROOT` option: | |||||
| <pre>``` | |||||
| make installworld DESTDIR=<tmpdir> -DDB_FROM_SRC -DNO_ROOT | |||||
| make distribution DESTDIR=<tmpdir> -DDB_FROM_SRC -DNO_ROOT | |||||
| ```</pre> | |||||
| This preps everything with the defaults as necessary. | |||||
| 2. Install a kernel either into a different directory (I do this) or into the same directory above: | |||||
| <pre>``` | |||||
| make installkernel DESTDIR=<tmpkerndir> -DNO_ROOT KERNCONF=<conf> | |||||
| ```</pre> | |||||
| 3. Make a directory with your custom configuration files. The basics | |||||
| are `/etc/rc.conf` and `/etc/fstab` and you might want `/firstboot` on | |||||
| there too. You will also need a METALOG file which contains the | |||||
| permissions for the files. This is just a standard mtree file, so | |||||
| you could use mtree to generate this instead of creating it by hand. | |||||
| The file contents are below. | |||||
| 4. Build the ufs image using the `makeroot.sh` script in the src tree at `tools/tools/makeroot/makeroot.sh`: | |||||
| <pre>``` | |||||
| /usr/src/tools/tools/makeroot/makeroot.sh -e <custdir>/METALOG -e <tmpkerndir>/METALOG -p <tmpdir>/etc/master.passwd -s 2g ufs.img root | |||||
| ```</pre> | |||||
| 5. Build the disc image: | |||||
| <pre>``` | |||||
| mkimg -s gpt -b <tmpdir>/boot/pmbr -p freebsd-boot:=<tmpdir>/boot/gptboot -p freebsd-swap::1G -p freebsd-ufs:=ufs.img -o disc.img | |||||
| ```</pre> | |||||
| 6. Run the image: | |||||
| <pre>``` | |||||
| sh /usr/share/examples/bhyve/vmrun.sh -d disc.img vm0 | |||||
| ```</pre> | |||||
| There you have it. Besides running the image, all the other steps can | |||||
| be done as a normal user w/o root access. | |||||
| EDIT: You also might want to include an `/entropy` file (populated with 4k | |||||
| from `/dev/random`) in your custom directory so that the image has a good | |||||
| seed for entropy at first boot for things such as sshd key generation. | |||||
| File contents: | |||||
| * `/etc/fstab`: | |||||
| <pre>``` | |||||
| /dev/vtbd0p3 / ufs rw 1 1 | |||||
| ```</pre> | |||||
| * Custom `METALOG`: | |||||
| <pre>``` | |||||
| #mtree 2.0 | |||||
| ./etc/rc.conf type=file uname=root gname=wheel mode=0644 | |||||
| ./etc/fstab type=file uname=root gname=wheel mode=0644 | |||||
| ./firstboot type=file uname=root gname=wheel mode=0644 | |||||
| ```</pre> | |||||
| @@ -0,0 +1,3 @@ | |||||
| extends: blog.j2 | |||||
| default_block: post | |||||
| listable: true | |||||
| @@ -0,0 +1,6 @@ | |||||
| --- | |||||
| title: encthenet Ramblings | |||||
| description: Blog of John-Mark Gurney | |||||
| extends: frontpage.j2 | |||||
| listable: false | |||||
| --- | |||||
| @@ -0,0 +1 @@ | |||||
| extends: false | |||||
| @@ -0,0 +1,28 @@ | |||||
| <article class="post"> | |||||
| <h1><a class="no-tufte-underline" href="{{ res.url }}">{{ res.meta.title }}</a></h1> | |||||
| <p>Posted: {{ res.meta.created.strftime('%B %e, %Y') }}</p> | |||||
| {% if res.meta.tags %} | |||||
| <ul class="tags clear"> | |||||
| {% for tag in res.meta.tags %} | |||||
| <li> | |||||
| <a class="small" href="{{ content_url('blog/tags/'~tag~'.html') }}"> | |||||
| {{ tag }} | |||||
| </a> | |||||
| </li> | |||||
| {% endfor %} | |||||
| </ul> | |||||
| {% endif %} | |||||
| <div class="clear"/> | |||||
| {% refer to res.relative_path as post %} | |||||
| {{ post.post|markdown|typogrify }} | |||||
| {# | |||||
| {% filter markdown|typogrify -%} | |||||
| {% mark post -%} | |||||
| {% block post -%}{%- endblock %} | |||||
| {%- endmark %} | |||||
| {%- endfilter %} | |||||
| #} | |||||
| </article> | |||||
| @@ -0,0 +1,92 @@ | |||||
| <!doctype html> | |||||
| <!-- https://github.com/paulirish/html5-boilerplate/blob/master/index.html --> | |||||
| <!-- paulirish.com/2008/conditional-stylesheets-vs-css-hacks-answer-neither/ --> | |||||
| <!--[if (gte IE 9)|!(IE)]><!--> <html lang="en" class="no-js"> <!--<![endif]--> | |||||
| <head> | |||||
| {% block starthead %}{% endblock starthead %} | |||||
| <meta charset="{{ resource.meta.charset }}"> | |||||
| <!-- Always force latest IE rendering engine (even in intranet) & Chrome Frame | |||||
| Remove this if you use the .htaccess --> | |||||
| <meta http-equiv="X-UA-Compatible" content="{{ resource.meta.compatibility }}"> | |||||
| <!-- encoding must be specified within the first 512 bytes | |||||
| www.whatwg.org/specs/web-apps/current-work/multipage/semantics.html#charset --> | |||||
| <!-- meta element for compatibility mode needs to be before | |||||
| all elements except title & meta | |||||
| msdn.microsoft.com/en-us/library/cc288325(VS.85).aspx --> | |||||
| <!-- Chrome Frame is only invoked if meta element for | |||||
| compatibility mode is within the first 1K bytes | |||||
| code.google.com/p/chromium/issues/detail?id=23003 --> | |||||
| <!-- automatically refresh, add/remove closing comment to enable/disable | |||||
| <meta http-equiv="refresh" content="2"> | |||||
| <!-- end comment for above refresh --> | |||||
| <!-- Twitter cards, OpenGraph and Slack unfurling --> | |||||
| <meta name="twitter:card" content="summary" /> | |||||
| {% if resource.meta.twittertitle %} | |||||
| <meta property="og:title" content="{{ resource.meta.twittertitle }}" /> | |||||
| {% else %} | |||||
| <meta property="og:title" content="{{ resource.meta.title }}" /> | |||||
| {% endif %} | |||||
| <meta property="og:description" content="{{ resource.meta.description }}" /> | |||||
| {% if resource.meta.image %} <meta property="og:image" content="{{ resource.meta.image }}" />{% endif %} | |||||
| {% if resource.meta.imagealt %} <meta name="twitter:image:alt" content="{{ resource.meta.imagealt }}" />{% endif %} | |||||
| {% if resource.meta.twitterlabel1 %} <meta name="twitter:label1" content="{{ resource.meta.twitterlabel1 }}" />{% endif %} | |||||
| {% if resource.meta.twitterlabel2 %} <meta name="twitter:label2" content="{{ resource.meta.twitterlabel2 }}" />{% endif %} | |||||
| {% if resource.meta.twitterdata1 %} <meta name="twitter:data1" content="{{ resource.meta.twitterdata1 }}" />{% endif %} | |||||
| {% if resource.meta.twitterdata2 %} <meta name="twitter:data2" content="{{ resource.meta.twitterdata2 }}" />{% endif %} | |||||
| <title>{% block title %}{{ resource.meta.title }}{% endblock %}</title> | |||||
| <meta name="description" content="{{ resource.meta.description }}"> | |||||
| <meta name="author" content="{{ resource.meta.author }}"> | |||||
| <!-- Mobile viewport optimized: j.mp/bplateviewport --> | |||||
| <meta name="viewport" content="{{ resource.meta.viewport }}"> | |||||
| {% block css %} | |||||
| <link rel="stylesheet" href="{{ media_url('css/tufte.css') }}"> | |||||
| {% endblock css %} | |||||
| {% block endhead %}{% endblock endhead %} | |||||
| </head> | |||||
| <body id="{{ resource.meta.id if resource.meta.id else resource.slug }}"> | |||||
| {% block content %} | |||||
| <div class="site" id="main" role="main"> | |||||
| {% block container %} | |||||
| <header class="banner clearfix title"> | |||||
| {% block header -%} | |||||
| <h1>{{ site.context.title }}</h1> | |||||
| {%- endblock %} | |||||
| </header> | |||||
| {% block main %} | |||||
| {% endblock main %} | |||||
| {% endblock container %} | |||||
| <footer> | |||||
| <div class="footer"> | |||||
| <div class="contact"> | |||||
| <ul> | |||||
| <li><a href="https://twitter.com/{{ site.context.tweet_via }}">Twitter</a></li> | |||||
| </ul> | |||||
| </div> | |||||
| </div> | |||||
| </footer> | |||||
| </div> | |||||
| {% endblock content%} | |||||
| {% block js %} | |||||
| <!-- Javascript at the bottom for fast page loading --> | |||||
| {% block scripts %} | |||||
| {% endblock scripts %} | |||||
| <!--[if lt IE 7 ]> | |||||
| <script src="js/libs/dd_belatedpng.js"></script> | |||||
| <script>DD_belatedPNG.fix('img, .png_bg'); // Fix any <img> or .png_bg bg-images. Also, please read goo.gl/mZiyb </script> | |||||
| <![endif]--> | |||||
| {% endblock js %} | |||||
| </body> | |||||
| </html> | |||||
| @@ -0,0 +1,35 @@ | |||||
| {% from "macros.j2" import render with context %} | |||||
| {% extends "base.j2" %} | |||||
| {% block main -%} | |||||
| starting test | |||||
| {% include "article.j2" %} | |||||
| ending test | |||||
| <article class="post"> | |||||
| <h1><a class="no-tufte-underline" href="{{ resource.url }}">{{ resource.meta.title }}</a></h1> | |||||
| <p>Posted: {{ resource.meta.created.strftime('%B %e, %Y') }}</p> | |||||
| {{ resource.meta.created.tz }} | |||||
| {% if resource.meta.tags %} | |||||
| <ul class="tags clear"> | |||||
| {% for tag in resource.meta.tags %} | |||||
| <li> | |||||
| <a class="small" href="{{ content_url('blog/tags/'~tag~'.html') }}"> | |||||
| {{ tag }} | |||||
| </a> | |||||
| </li> | |||||
| {% endfor %} | |||||
| </ul> | |||||
| {% endif %} | |||||
| <div class="clear"/> | |||||
| {% filter markdown|typogrify -%} | |||||
| {% mark post -%} | |||||
| {% block post -%}{%- endblock %} | |||||
| {%- endmark %} | |||||
| {%- endfilter %} | |||||
| </article> | |||||
| {%- endblock %} | |||||
| @@ -0,0 +1,21 @@ | |||||
| {% extends "base.j2" %} | |||||
| {% from "macros.j2" import render with context %} | |||||
| {% block main %} | |||||
| <!-- | |||||
| {% block page_title %}<h1 class="title">{{ resource.meta.title }}</h1>{% endblock %} | |||||
| --> | |||||
| {% for res in resource.node.walk_resources_sorted_by_time()[0:1] %} | |||||
| block test | |||||
| prerender macro | |||||
| {% include "article.j2" %} | |||||
| old data | |||||
| <h1><a href="{{ res.relative_path }}">{{ res.meta.title }}</a></h1> | |||||
| {% refer to res.relative_path as post %} | |||||
| {{ post.post|markdown|typogrify }} | |||||
| {% endfor %} | |||||
| {% endblock %} | |||||
| @@ -0,0 +1,31 @@ | |||||
| {% macro render(res) %} | |||||
| {% refer to res.relative_path as post %} | |||||
| <article class="post"> | |||||
| <h1><a class="no-tufte-underline" href="{{ res.url }}">{{ res.meta.title }}</a></h1> | |||||
| <p>Posted: {{ res.meta.created.strftime('%B %e, %Y') }}</p> | |||||
| {% if res.meta.tags %} | |||||
| <ul class="tags clear"> | |||||
| {% for tag in res.meta.tags %} | |||||
| <li> | |||||
| <a class="small" href="{{ content_url('blog/tags/'~tag~'.html') }}"> | |||||
| {{ tag }} | |||||
| </a> | |||||
| </li> | |||||
| {% endfor %} | |||||
| </ul> | |||||
| {% endif %} | |||||
| <div class="clear"/> | |||||
| {% refer to res.relative_path as post %} | |||||
| {{ post.post|markdown|typogrify }} | |||||
| {# | |||||
| {% filter markdown|typogrify -%} | |||||
| {% mark post -%} | |||||
| {% block post -%}{%- endblock %} | |||||
| {%- endmark %} | |||||
| {%- endfilter %} | |||||
| #} | |||||
| </article> | |||||
| {% endmacro %} | |||||