lots of documentation updates
This commit is contained in:
parent
81e70556db
commit
792dd139ca
11
README.md
11
README.md
|
@ -3,3 +3,14 @@
|
|||
This is my setup for my
|
||||
[computeblade](https://publish.obsidian.md/ai6ua/Projects/Computing/ComputeBlade)
|
||||
cluster, which will theoretically be here around September 2023.
|
||||
|
||||
See `docs/` for the documentation. The docs are written using Sphinx, so either build
|
||||
the docs using the provided Makefile or see the documentation link below. The
|
||||
`install-dependencies` target in the Makefile can install Sphinx.
|
||||
|
||||
### Links
|
||||
|
||||
- [Docs](https://bladerunner-docs.wntrmute.dev/)
|
||||
- [Source](https://git.wntrmute.dev/kyle/bladerunner) ([Github mirror](https://github.com/kisom/bladerunner))
|
||||
- [Second brain project page](https://publish.obsidian.md/ai6ua/Projects/Computing/ComputeBlade)
|
||||
|
||||
|
|
9
TODO.md
9
TODO.md
|
@ -5,10 +5,16 @@
|
|||
- bazel setup
|
||||
- tooling setup
|
||||
|
||||
## Dockerfiles
|
||||
|
||||
- move to an OCI setup
|
||||
|
||||
## Provisioning
|
||||
|
||||
- packer image building
|
||||
- ansible deployment
|
||||
- initrd/initramfs for auto FDE
|
||||
- using dracut?
|
||||
|
||||
## Secure computing
|
||||
|
||||
|
@ -21,7 +27,4 @@
|
|||
|
||||
## Documentation
|
||||
|
||||
- meta
|
||||
- sphinx docs?
|
||||
- with bazel integration?
|
||||
- functional specs for everything
|
||||
|
|
|
@ -0,0 +1,8 @@
|
|||
- name: set up TPM tooling
|
||||
become: true
|
||||
ansible.builtin.apt: name={{ item }} state=present
|
||||
with_items:
|
||||
- clevis-tpm2
|
||||
- tpm-tools
|
||||
- tpm2-tools
|
||||
- tss2
|
|
@ -14,6 +14,9 @@ help:
|
|||
|
||||
.PHONY: help Makefile
|
||||
|
||||
install-dependencies:
|
||||
/usr/bin/env python3 -m pip install -r requirements.txt
|
||||
|
||||
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||
%: Makefile
|
||||
|
|
|
@ -11,6 +11,8 @@ There are some assumptions made:
|
|||
build system here will assume this. It may work on non-Ubuntu apt-based
|
||||
systems. For non-Debian systems, I've also been working on including
|
||||
container builds that may work.
|
||||
2. The primary target for this setup is Ubuntu 22.04. This needs to be
|
||||
validated still.
|
||||
|
||||
There are three types of systems:
|
||||
|
||||
|
@ -57,10 +59,34 @@ Below is a diagram of the planned system.
|
|||
}
|
||||
|
||||
|
||||
The hardware isn't slated to arrive until September at the earliest.
|
||||
|
||||
Hardware
|
||||
--------
|
||||
|
||||
Blades:
|
||||
The hardware isn't slated to arrive until September at the earliest. I am
|
||||
leaning towards having the 1TB NVMe drives go with the AI modules, and use
|
||||
the gateway system as the storage machine if needed.
|
||||
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| Item | Quantity | Notes |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| TPM blade | 5 | TPM 2.0 |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| DEV blade | 6 | TPM 2.0, µSD, nRPIBOOT |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| CM4 | 10 | 8GB RAM, no eMMC/WiFi/BT |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| CM4 | 2 | 8 GB RAM, eMMC/WiFi/BT (gw, dev blade) |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| SAMSUNG 970 EVO Plus 500GB | 4/7 | 2280 |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| SAMSUNG 970 EVO Plus 1 TB | 2/4 | 2280 (1 allocated to gw) |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| RTC module | 10 | DS3231 |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| AI module | 3 | 2x Coral TPU |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| CM4 carrier board | 1 | Dual-homed, NVMe slot, Zymbit 4i |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
| Netgear GS316PP | 1 | 16-port PoE+ (183W) |
|
||||
+----------------------------+----------+----------------------------------------+
|
||||
|
||||
|
|
|
@ -12,6 +12,9 @@ the workflow looks like:
|
|||
1. ``install-packer.sh``
|
||||
2. ``build-image.sh``
|
||||
|
||||
Alternatively, you can run ``run-docker.sh`` to optionally build a container
|
||||
from the provided Dockerfile and then run it.
|
||||
|
||||
``install-packer.sh``
|
||||
^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -34,6 +37,75 @@ The dependencies required to build images with ``packer`` are:
|
|||
Go will also need to be installed; there is a script provided in the :doc:`tools`
|
||||
directory.
|
||||
|
||||
If the ``FORCE_DEPENDENCY_INSTALL`` environment variable is set to ``"yes"``, it
|
||||
will attempt to install the dependencies even if ``git`` is installed.
|
||||
|
||||
``build-image.sh``
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
``build-image.sh`` will attempt to build a packer image. It requires that
|
||||
``packer`` and ``packer-builder-arm`` have been installed, e.g. via
|
||||
``install-packer.sh``. It will use a board file (see below) to build this
|
||||
image. If the board file contains both a remote file URL and a local file path,
|
||||
it will attempt to download the remote file to the local path to cache it. If
|
||||
the environment variable ``SKIP_LOCAL_CACHE=yes``, it will skip doing this. It
|
||||
will also skip caching if the local file exists, though it will print a command
|
||||
to remove the file to force redownloading.
|
||||
|
||||
Board files
|
||||
------------
|
||||
|
||||
A board file is a JSON [#]_ file describing the image that packer should build.
|
||||
There are a lot of examples in the packer-builder-arm boards_ directory.
|
||||
|
||||
.. [#] Hashicorp would like you to use their HCL, but I haven't switched
|
||||
over yet.
|
||||
|
||||
``ubuntu-board-gen``
|
||||
--------------------
|
||||
|
||||
A Go program is provided to generate an Ubuntu-based Packer board file from a
|
||||
YAML file description. It is a single-minded tool to solve an exact problem;
|
||||
for more control, or to handle edge case, the board JSON file may be
|
||||
handwritten or another generator written.
|
||||
|
||||
The YAML board specification has the following format:
|
||||
|
||||
.. yaml ::
|
||||
|
||||
boards:
|
||||
- version: 22.04.2
|
||||
size: 32G
|
||||
name: cm4-cluster-ubuntu-22.04.2.img
|
||||
scripts:
|
||||
- scripts/install-base.sh
|
||||
|
||||
It will set up a board file pointing to the preinstalled Ubuntu server image.
|
||||
The size parameter should be one of "4G", "8G", "16G", "32G", or "64G". The
|
||||
example above is only using a shell provisioner, but there are many different
|
||||
provisioners available. A longer example would look like
|
||||
|
||||
.. yaml ::
|
||||
|
||||
boards:
|
||||
- version: 22.04.2
|
||||
size: 4G
|
||||
name: cm4-cluster-ubuntu-22.04.2.img
|
||||
local-scripts:
|
||||
- scripts/generate-auth-keys
|
||||
- scripts/template-that-one-file
|
||||
files:
|
||||
- source: build/privkey.pem
|
||||
destination: /etc/myservice/privkey.pem
|
||||
- source: build/cert.pem
|
||||
destination: /etc/myservice/cert.pem
|
||||
- source: build/that-one-file
|
||||
destination: /etc/that-one-file
|
||||
scripts:
|
||||
- scripts/set-auth-key-permissions.sh
|
||||
- scripts/install-base-platform.sh
|
||||
|
||||
The order of precedence for provisioners is local scripts (which might be used
|
||||
to generate files), files, and then scripts.
|
||||
|
||||
.. _boards: https://github.com/mkaczanowski/packer-builder-arm/tree/master/boards
|
|
@ -1,4 +1,39 @@
|
|||
tools
|
||||
=====
|
||||
|
||||
The ``tools`` directory contains various helper scripts.
|
||||
The ``tools`` directory contains various helper scripts for building systems.
|
||||
|
||||
- ``install.sh`` will run all of the scripts in the expected order.
|
||||
|
||||
- ``install-dependencies.sh`` installs all of the dependencies required by the
|
||||
various parts of the build system.
|
||||
- ``install-go.sh`` attempts to install Go using godeb_. It requires some of
|
||||
the dependencies that would be installed by ``install-dependencies.sh``.
|
||||
- ``install-bazel.sh`` installs bazelisk_ and buildifier_. It requires Go in
|
||||
addition to some of the dependencies that would be installed by
|
||||
``install-depdencies.sh``.
|
||||
|
||||
Dependencies
|
||||
------------
|
||||
|
||||
Optional dependencies are marked with a *?*.
|
||||
|
||||
+-----------------------------+----------------------+------------------------------------------------+
|
||||
| Script | Dependencies | Solved by |
|
||||
+-----------------------------+----------------------+------------------------------------------------+
|
||||
| ``install-dependencies.sh`` | apt, sudo? | |
|
||||
+-----------------------------+----------------------+------------------------------------------------+
|
||||
| ``install-go.sh`` | curl, sudo, tar | ``install-dependencies.sh`` |
|
||||
+-----------------------------+----------------------+------------------------------------------------+
|
||||
| ``install-bazel.sh`` | curl, git, go, sudo? | ``install-dependencies.sh``, ``install-go.sh`` |
|
||||
+-----------------------------+----------------------+------------------------------------------------+
|
||||
|
||||
Dockerfile
|
||||
----------
|
||||
|
||||
The Dockerfile sets up an Ubuntu container and runs the install scripts. Its
|
||||
entrypoint is ``bash``.
|
||||
|
||||
.. _bazelisk: https://github.com/bazelbuild/bazelisk
|
||||
.. _buildifier: https://github.com/bazelbuild/buildtools
|
||||
.. _godeb: https://github.com/niemeyer/godeb
|
||||
|
|
|
@ -4,17 +4,30 @@ set -euxo pipefail
|
|||
|
||||
IMAGE_TYPE="${1:-ubuntu}"
|
||||
PACKER_BUILD_FILE="${2:-}"
|
||||
SKIP_LOCAL_CACHE="${SKIP_LOCAL_CACHE:-no}"
|
||||
|
||||
errmsg () {
|
||||
echo "$@" > /dev/stderr
|
||||
}
|
||||
|
||||
IMAGE_TYPE="${1:-ubuntu}"
|
||||
|
||||
preflight () {
|
||||
case "${IMAGE_TYPE}" in
|
||||
ubuntu) PACKER_BUILD_FILE="boards/cm4-cluster-ubuntu-22.04.2.json" ;;
|
||||
## TODO(kyle): look into building a Raspbian version if needed.
|
||||
# raspbian) PACKER_BUILD_FILE="boards/raspberry-pi/raspios-lite-arm.json" ;;
|
||||
ubuntu)
|
||||
PACKER_BUILD_FILE="boards/pi-cm4-ubuntu-22.04.2.json" ;;
|
||||
if [ "${SKIP_LOCAL_CACHE}" != "yes" ]
|
||||
then
|
||||
REMOTE_IMAGE_URL="$(jq '.builders[0].file_urls' boards/pi-cm4-ubuntu-22.04.2.json | grep https | tr -d ' \"')"
|
||||
fi
|
||||
|
||||
custom)
|
||||
PACKER_BUILD_FILE="${2:-}"
|
||||
if [ "${SKIP_LOCAL_CACHE}" != "yes" ]
|
||||
then
|
||||
REMOTE_IMAGE_URL="$(jq '.builders[0].file_urls' ${PACKER_BUILD_FILE} | grep https | tr -d ' \"')"
|
||||
fi
|
||||
|
||||
if [ -z "${PACKER_BUILD_FILE}" ]
|
||||
then
|
||||
errmsg "[!] custom board requires a board file path"
|
||||
|
@ -24,7 +37,6 @@ preflight () {
|
|||
*)
|
||||
errmsg "[!] invalid image type ${IMAGE_TYPE}."
|
||||
errmsg "[!] valid image types are"
|
||||
# errmsg " - raspbian"
|
||||
errmsg " - ubuntu"
|
||||
errmsg " - custom path/to/board/file"
|
||||
exit 1
|
||||
|
@ -32,10 +44,43 @@ preflight () {
|
|||
esac
|
||||
}
|
||||
|
||||
cache_remote_url () {
|
||||
if [ "${SKIP_LOCAL_CACHE}" != "yes" ]
|
||||
then
|
||||
echo "[+] skipping fetch of remote file: SKIP_LOCAL_CACHE=yes"
|
||||
return 0
|
||||
fi
|
||||
|
||||
local CACHED_FILE="$(jq '.builders[0].file_urls' boards/pi-cm4-ubuntu-22.04.2.json | grep -v https | tr -d ' \"')"
|
||||
if [ -z "${CACHED_FILE}" ]
|
||||
then
|
||||
echo "[+] skipping fetch of remote file: no local file provided"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ -z "${REMOTE_URL}" ]
|
||||
then
|
||||
echo "[+] skipping fetch of remote file: no remote file provided"
|
||||
return 0
|
||||
fi
|
||||
|
||||
if [ -s "${CACHED_FILE}" ]
|
||||
then
|
||||
echo "[+] skipping fetch of remote file: file already exists. To force redownloading,"
|
||||
echo " run the following:"
|
||||
echo ""
|
||||
echo " rm ${CACHED_FILE}"
|
||||
return 0
|
||||
fi
|
||||
|
||||
curl -fsSL -o "${CACHED_FILE}" "${REMOTE_URL}"
|
||||
}
|
||||
|
||||
build_image () {
|
||||
sudo packer build ${PACKER_BUILD_FILE}
|
||||
}
|
||||
|
||||
preflight
|
||||
cache_remote_url
|
||||
build_image
|
||||
|
||||
|
|
|
@ -9,12 +9,12 @@ PACKER_FILE=packer_${PACKER_VERSION}_linux_${ARCH}
|
|||
UPSTREAM="https://github.com/mkaczanowski/packer-builder-arm"
|
||||
UPGRADE="false"
|
||||
BUILD_DIR="$(pwd)/build"
|
||||
FORCE_DEPENDENCY_INSTALL="no"
|
||||
FORCE_DEPENDENCY_INSTALL="${FORCE_DEPENDENCY_INSTALL:-no}"
|
||||
|
||||
prep () {
|
||||
if [ -z "$(command -v git)" -o "${FORCE_DEPENDENCY_INSTALL}" = "yes" ]
|
||||
then
|
||||
sudo apt-get update && sudo apt-get -y install git unzip qemu-user-static e2fsprogs dosfstools libarchive-tools
|
||||
sudo apt-get update && sudo apt-get -y install git unzip qemu-user-static e2fsprogs dosfstools libarchive-tools xz-utils jq
|
||||
fi
|
||||
mkdir -p ${BUILD_DIR}
|
||||
pushd ${BUILD_DIR}
|
||||
|
|
|
@ -3,9 +3,10 @@
|
|||
set -euxo pipefail
|
||||
|
||||
PACKER_IMAGE_NAME="bladerunner/packer:latest"
|
||||
FORCE_DOCKER_BUILD="${FORCE_DOCKER_BUILD:-no}"
|
||||
|
||||
preflight () {
|
||||
if [ -z "$(docker image ls -q ${PACKER_IMAGE_NAME})" ]
|
||||
if [ "${FORCE_DOCKER_BUILD}" = "yes" -o -z "$(docker image ls -q ${PACKER_IMAGE_NAME})" ]
|
||||
then
|
||||
docker image build -t "${PACKER_IMAGE_NAME}" .
|
||||
fi
|
||||
|
|
|
@ -1,34 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euxo pipefail
|
||||
|
||||
IMAGE_TYPE="${1:-ubuntu}"
|
||||
|
||||
select_image () {
|
||||
case "${IMAGE_TYPE}" in
|
||||
ubuntu)
|
||||
PACKER_BUILD_FILE="boards/pi-cm4-ubuntu-22.04.2.json" ;;
|
||||
REMOTE_IMAGE_URL="$(jq '.builders[0].file_urls' boards/pi-cm4-ubuntu-22.04.2.json | grep https | tr -d ' \"')"
|
||||
|
||||
raspbian) PACKER_BUILD_FILE="boards/raspberry-pi/raspios-lite-arm.json" ;;
|
||||
PACKER_BUILD_FILE="boards/pi-cm4-ubuntu-22.04.2.json" ;;
|
||||
REMOTE_IMAGE_URL="$(jq '.builders[0].file_urls' boards/pi-cm4-ubuntu-22.04.2.json | grep https | tr -d ' \"')"
|
||||
|
||||
custom)
|
||||
PACKER_BUILD_FILE="${2:-}"
|
||||
if [ -z "${PACKER_BUILD_FILE}" ]
|
||||
then
|
||||
errmsg "[!] custom board requires a board file path"
|
||||
exit 1
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
errmsg "[!] invalid image type ${IMAGE_TYPE}."
|
||||
errmsg "[!] valid image types are"
|
||||
errmsg " - raspbian"
|
||||
errmsg " - ubuntu"
|
||||
errmsg " - custom path/to/board/file"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
}
|
|
@ -14,7 +14,9 @@ preflight () {
|
|||
|
||||
apt_packages () {
|
||||
$SUDO apt-get update
|
||||
$SUDO apt-get -y install git bash curl sudo build-essential
|
||||
$SUDO apt-get -y install git bash curl sudo build-essential unzip \
|
||||
qemu-user-static e2fsprogs dosfstools \
|
||||
libarchive-tools xz-utils
|
||||
}
|
||||
|
||||
preflight
|
||||
|
|
Loading…
Reference in New Issue