{"id":19900084,"url":"https://github.com/m-lab/epoxy-images","last_synced_at":"2026-02-24T22:02:39.423Z","repository":{"id":17205237,"uuid":"81351346","full_name":"m-lab/epoxy-images","owner":"m-lab","description":"Support for building linux kernels, rootfs images, and ROMs for ePoxy","archived":false,"fork":false,"pushed_at":"2024-10-16T21:44:17.000Z","size":22805,"stargazers_count":3,"open_issues_count":6,"forks_count":4,"subscribers_count":11,"default_branch":"main","last_synced_at":"2024-10-29T17:29:29.722Z","etag":null,"topics":["platform"],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/m-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-02-08T16:38:44.000Z","updated_at":"2024-10-16T20:10:38.000Z","dependencies_parsed_at":"2023-11-22T17:30:09.220Z","dependency_job_id":"6b72bd1e-6f21-4f76-a746-7bb3f6dab7ee","html_url":"https://github.com/m-lab/epoxy-images","commit_stats":{"total_commits":531,"total_committers":7,"mean_commits":75.85714285714286,"dds":0.4764595103578154,"last_synced_commit":"445a2b0db39aec0475184326a20c51983f3a7884"},"previous_names":[],"tags_count":88,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fepoxy-images","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fepoxy-images/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fepoxy-images/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/m-lab%2Fepoxy-images/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/m-lab","download_url":"https://codeload.github.com/m-lab/epoxy-images/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224016228,"owners_count":17241650,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["platform"],"created_at":"2024-11-12T20:11:06.745Z","updated_at":"2026-02-24T22:02:34.383Z","avatar_url":"https://github.com/m-lab.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"| Branch | Status |\n|--------|--------|\n| master | [![Build Status](https://travis-ci.org/m-lab/epoxy-images.svg?branch=master)](https://travis-ci.org/m-lab/epoxy-images) |\n\n# epoxy-images\n\nSupport for building Linux kernels, rootfs images, and ROMs for ePoxy\n\nAn ePoxy managed system depends on several image types:\n\n * generic Linux images that provide a minimal network boot environment.\n * stage1 images that embed node network configuration and are either flashed\n   to NICs, or burned to CDs.\n * stage3 Linux ROM update images, that (re)flash iPXE ROMs to NICs.\n\n# Build Automation\n\nThe epoxy-images repo is connected to Google Cloud Build.\n\n* mlab-sandbox - push to a branch matching `sandbox-*` builds cloudbuild.yaml \u0026\n  cloudbuild-stage1.yaml.\n* mlab-staging - push to `master` builds both cloudbuild.yaml and\n  cloudbuild-stage1.yaml\n* mlab-oti - tags matching `v[0-9]+.[0-9]+.[0-9]+` builds cloudbuild.yaml \u0026\n  cloudbuild-stage1.yaml\n\n# Building images\n\nSee cloudbuild-stage1.yaml for current steps for stage1 images.\n\nYou can also run the build locally using `docker`.\n\n```sh\ndocker build -t epoxy-images-builder  .\n\ndocker run --privileged -e PROJECT=mlab-sandbox -e ARTIFACTS=/workspace/output \\\n  -v $PWD:/workspace -it epoxy-images-builder /workspace/builder.sh stage1_minimal\n\ndocker run --privileged -e PROJECT=mlab-sandbox -e ARTIFACTS=/workspace/output \\\n  -v $PWD:/workspace -it epoxy-images-builder /workspace/builder.sh stage1_mlxrom\n\ndocker run --privileged -e PROJECT=mlab-sandbox -e ARTIFACTS=/workspace/output \\\n  -v $PWD:/workspace -it epoxy-images-builder /workspace/builder.sh stage1_isos\n```\n\nUsing an ISO, you should be able to boot the image using VirtualBox or a\nsimilar tool. If your ssh key is in `configs/stage2/authorized_keys`, and the VM\nis configured to attach to a Host-only network on the 192.168.0.0/24 subnet,\nthen you can ssh to the machine at:\n\n```sh\nssh root@192.168.0.2\n```\n\n# Deploying images\n\nThe M-Lab deployment of the ePoxy server reads images from GCS. The cloudbuild\nsteps deploy images to similarly named folders:\n\n* `output/stage1_mlxrom/*` -\u003e `gs://epoxy-mlab-sandbox/stage1_mlxrom/`\n* `output/stage1_isos/*` -\u003e `gs://epoxy-mlab-sandbox/stage1_isos/`\n\n## BIOS \u0026 UEFI Support\n\nThe `simpleiso` command creates ISO images that are capable of booting from\neither BIOS or UEFI systems. BIOS systems use isolinux while UEFI systems use\ngrub. These images should also work with USB media.\n\n### Testing USB images\n\nVirtualBox natively supports boot from ISO images \u0026 supports BIOS or UEFI\nboot environments. To support VM boot from USB images we must create a\nvirtualbox disk image from the raw USB disk image.\n\n```bash\nVBoxManage convertdd boot.fat16.gpt.img boot.vdi --format VDI\n```\n\nThen select that image in the VM configuration.\n\n# Upgrading Kubernetes components\n\nUpgrading Kubernetes components on platform nodes is a separate process from\n[upgrading them in the API\ncluster](https://github.com/m-lab/k8s-support/#upgrading-the-api-cluster).\nUpgrading Kubernetes on platform nodes should _always_ occur _after_ the API\ncluster has been upgraded for a given project. The script\n./setup\\_stage3\\_ubuntu.sh has logic which is designed to enforce this\nrequirement, but it is still worth mentioning here.\n\nUpgrading Kubernetes components on platform nodes should be as simple as\ncopying the values for the [identially named config\nvariables](https://github.com/m-lab/k8s-support/blob/master/manage-cluster/k8s_deploy.conf#L31)\nfrom the k8s-support repository to the ones in ./config.sh in this repository:\n\n* K8S\\_VERSION\n* K8S\\_CNI\\_VERSION\n* K8S\\_CRICTL\\_VERSION\n\nOnce the version strings are updated, and match those in the k8s-support\nrepository, just follow the usual deployment path for epoxy-images i.e., push\nto sandbox, create PR, merge to master, tag repository. The Cloud Builds for\nthis repository will generate new boot images with the updated Kubernetes\ncomponents. In mlab-sandbox and mlab-staging, the newly built images will be\nautomatically deployed to a node upon reboot. However, in production (mlab-oti)\nthey will not be automatically deployed without further action. See the\nfollowing section for more details.\n\n## Configure ePoxy to use a newer image version\n\nIn order to deploy the new boot images to production you will need to modify\nthe `ImagesVersion` property of every ePoxy Host GCD entity to match the tag\nname of the production release for this repository. This can be done using the\n`epoxy_admin` tool. If you don't already have it installed, then install it\nwith:\n\n```\n$ go get github.com/m-lab/epoxy/cmd/epoxy_admin\n```\n\nOnce installed, you can update the ePoxy Host GCD entities in the mlab-oti\nproject with a command like the following. **NOTE**: do not run this command\nagainst the mlab-sandbox or mlab-staging projects, as `ImagesVersion` is a\nstatic value in those projects and should always be \"latest\":\n\n```\n$ epoxy_admin update --project mlab-oti --images-version \u003ctag\u003e --hostname \"^mlab[1-3]\"\n```\n\n## Trigger a rolling reboot\n\nNone of the nodes in any project will be running the updated images until they\nare rebooted. You can trigger a rolling reboot of all nodes in a cluster with a\nsmall shell command like the following:\n\n```\n$ for node in $(kubectl --context \u003cproject\u003e get nodes | grep '^mlab[1-4]' | awk '{print $1}'); do \\\n    ssh $node 'sudo touch /var/run/mlab-reboot'; \\\n  done\n```\n\nThe former command assumes you have ssh access to every platform node. It\nleverages the [Kured\nDaemonSet](https://github.com/m-lab/k8s-support/blob/master/k8s/daemonsets/core/kured.jsonnet)\nrunning on the platform by creating the \"reboot sentinel\" file\n(/var/run/mlab-reboot) on every node, which tells Kured that a reboot is\nrequired. From there, Kured handles rebooting all flagged nodes in a safe way\n(one node a time).\n\nYou can check the progress and/or completion of the upgrade by looking at the\nkubelet version for a node as reported by kubectl:\n\n```\n$ kubectl --context \u003cproject\u003e get nodes\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm-lab%2Fepoxy-images","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fm-lab%2Fepoxy-images","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fm-lab%2Fepoxy-images/lists"}