{"id":13499822,"url":"https://github.com/u-root/u-root","last_synced_at":"2026-02-27T23:58:56.701Z","repository":{"id":36994189,"uuid":"46462030","full_name":"u-root/u-root","owner":"u-root","description":"A fully Go userland with Linux bootloaders! u-root can create a one-binary root file system (initramfs) containing a busybox-like set of tools written in Go.","archived":false,"fork":false,"pushed_at":"2025-05-07T12:29:11.000Z","size":112913,"stargazers_count":2750,"open_issues_count":151,"forks_count":420,"subscribers_count":95,"default_branch":"main","last_synced_at":"2025-05-12T02:42:47.784Z","etag":null,"topics":["busybox","coreboot","embedded","hacktoberfest","initramfs","kernel","linux","linuxboot","ramfs","system","tinycore"],"latest_commit_sha":null,"homepage":"https://u-root.org","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/u-root.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":"roadmap.md","authors":"AUTHORS","dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2015-11-19T02:28:59.000Z","updated_at":"2025-05-11T16:00:26.000Z","dependencies_parsed_at":"2025-05-08T22:15:38.762Z","dependency_job_id":null,"html_url":"https://github.com/u-root/u-root","commit_stats":{"total_commits":4743,"total_committers":221,"mean_commits":21.46153846153846,"dds":0.770820156019397,"last_synced_commit":"3e056e5f1679be96c135915efe743cde61719b61"},"previous_names":[],"tags_count":27,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fu-root","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fu-root/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fu-root/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/u-root%2Fu-root/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/u-root","download_url":"https://codeload.github.com/u-root/u-root/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253672701,"owners_count":21945480,"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":["busybox","coreboot","embedded","hacktoberfest","initramfs","kernel","linux","linuxboot","ramfs","system","tinycore"],"created_at":"2024-07-31T22:00:43.531Z","updated_at":"2026-02-27T23:58:51.647Z","avatar_url":"https://github.com/u-root.png","language":"Go","readme":"# u-root\n\n[![Build Status](https://circleci.com/gh/u-root/u-root/tree/main.png?style=shield)](https://circleci.com/gh/u-root/u-root/tree/main)\n[![codecov](https://codecov.io/gh/u-root/u-root/branch/main/graph/badge.svg?token=1qjHT02oCB)](https://codecov.io/gh/u-root/u-root)\n[![Go Report Card](https://goreportcard.com/badge/github.com/u-root/u-root)](https://goreportcard.com/report/github.com/u-root/u-root)\n[![CodeQL](https://github.com/u-root/u-root/workflows/CodeQL/badge.svg)](https://github.com/u-root/u-root/actions?query=workflow%3ACodeQL)\n[![GoDoc](https://godoc.org/github.com/u-root/u-root?status.svg)](https://godoc.org/github.com/u-root/u-root)\n[![Slack](https://slack.osfw.dev/badge.svg)](https://slack.osfw.dev)\n[![License](https://img.shields.io/badge/License-BSD%203--Clause-blue.svg)](https://github.com/u-root/u-root/blob/main/LICENSE)\n[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8160/badge)](https://www.bestpractices.dev/projects/8160)\n\n\n# Description\n\nu-root embodies four different projects.\n\n*   Go versions of many standard Linux tools, such as [ls](cmds/core/ls/ls.go),\n    [cp](cmds/core/cp/cp.go), or [shutdown](cmds/core/shutdown/shutdown_linux.go). See\n    [cmds/core](cmds/core) for most of these.\n\n*   A way to compile many Go programs into a single binary with\n    [busybox mode](#build-modes).\n\n*   A way to create initramfs (an archive of files) to use with Linux kernels,\n    [embeddable into firmware](#build-an-embeddable-u-root).\n\n*   Go [bootloaders](#systemboot) that use `kexec` to boot Linux or multiboot\n    kernels such as ESXi, Xen, or tboot. They are meant to be used with\n    [LinuxBoot](https://www.linuxboot.org).\n\n# Usage\n\nMake sure your Go version is \u003e= 1.21.\n\nDownload and install u-root either via git:\n\n```shell\ngit clone https://github.com/u-root/u-root\ncd u-root\ngo install\n```\n\nOr install directly with go:\n\n```shell\ngo install github.com/u-root/u-root@latest\n```\n\n\u003e [!NOTE]\n\u003e The `u-root` command will end up in `$GOPATH/bin/u-root`, so you may\n\u003e need to add `$GOPATH/bin` to your `$PATH`.\n\n# Examples\n\nHere are some examples of using the `u-root` command to build an initramfs.\n\n```shell\ngit clone https://github.com/u-root/u-root\ncd u-root\n\n# Build an initramfs of all the Go cmds in ./cmds/core/... (default)\nu-root\n\n# Generate an archive with bootloaders\n#\n# core and boot are templates that expand to sets of commands\nu-root core boot\n\n# Generate an archive with only these given commands\nu-root ./cmds/core/{init,ls,ip,dhclient,wget,cat,gosh}\n\n# Generate an archive with all of the core tools with some exceptions\nu-root core -cmds/core/{ls,losetup}\n```\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e `u-root` works exactly when `go build` and `go list` work as well.\n\u003e\n\u003e See also the section below discussing the\n\u003e [AMD64 architecture level](#amd64-architecture-level).\n\n\u003e [!NOTE]\n\u003e\n\u003e The `u-root` tool is the same as the\n\u003e [mkuimage](https://github.com/u-root/mkuimage) tool with some defaults\n\u003e applied.\n\u003e\n\u003e In the near future, `uimage` will replace `u-root`.\n\n\u003e [!TIP]\n\u003e\n\u003e To just build Go busybox binaries, try out\n\u003e [gobusybox](https://github.com/u-root/gobusybox)'s `makebb` tool.\n\n## Multi-module workspace builds\n\nThere are several ways to build multi-module command images using standard Go\ntooling.\n\n```shell\n$ mkdir workspace\n$ cd workspace\n$ git clone https://github.com/u-root/u-root\n$ git clone https://github.com/u-root/cpu\n\n$ go work init ./u-root\n$ go work use ./cpu\n\n$ u-root ./u-root/cmds/core/{init,gosh} ./cpu/cmds/cpud\n\n$ cpio -ivt \u003c /tmp/initramfs.linux_amd64.cpio\n...\n-rwxr-x---   0 root     root      6365184 Jan  1  1970 bbin/bb\nlrwxrwxrwx   0 root     root            2 Jan  1  1970 bbin/cpud -\u003e bb\nlrwxrwxrwx   0 root     root            2 Jan  1  1970 bbin/gosh -\u003e bb\nlrwxrwxrwx   0 root     root            2 Jan  1  1970 bbin/init -\u003e bb\n...\n\n# Works for offline vendored builds as well.\n$ go work vendor # Go 1.22 feature.\n\n$ u-root ./u-root/cmds/core/{init,gosh} ./cpu/cmds/cpud\n```\n\nWhen creating a new Go workspace is too much work, the `goanywhere` tool can\ncreate one on the fly. This works **only with local file system paths**:\n\n```shell\n$ go install github.com/u-root/gobusybox/src/cmd/goanywhere@latest\n\n$ goanywhere ./u-root/cmds/core/{init,gosh} ./cpu/cmds/cpud -- u-root\n```\n\n`goanywhere` creates a workspace in a temporary directory with the given\nmodules, and then execs `u-root` in the workspace passing along the command\nnames.\n\n\u003e [!TIP]\n\u003e\n\u003e While workspaces are good for local compilation, they are not meant to be\n\u003e checked in to version control systems.\n\u003e\n\u003e For a non-workspace way of building multi-module initramfs images, read more\n\u003e in the [mkuimage README](https://github.com/u-root/mkuimage). (The `u-root`\n\u003e tool is `mkuimage` with more defaults applied.)\n\n## Extra Files\n\nYou may also include additional files in the initramfs using the `-files` flag.\n\nIf you add binaries with `-files` are listed, their ldd dependencies will be\nincluded as well.\n\n```shell\n$ u-root -files /bin/bash\n\n$ cpio -ivt \u003c /tmp/initramfs.linux_amd64.cpio\n...\n-rwxr-xr-x   0 root     root      1277936 Jan  1  1970 bin/bash\n...\ndrwxr-xr-x   0 root     root            0 Jan  1  1970 lib/x86_64-linux-gnu\n-rwxr-xr-x   0 root     root       210792 Jan  1  1970 lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n-rwxr-xr-x   0 root     root      1926256 Jan  1  1970 lib/x86_64-linux-gnu/libc.so.6\nlrwxrwxrwx   0 root     root           15 Jan  1  1970 lib/x86_64-linux-gnu/libtinfo.so.6 -\u003e libtinfo.so.6.4\n-rw-r--r--   0 root     root       216368 Jan  1  1970 lib/x86_64-linux-gnu/libtinfo.so.6.4\ndrwxr-xr-x   0 root     root            0 Jan  1  1970 lib64\nlrwxrwxrwx   0 root     root           42 Jan  1  1970 lib64/ld-linux-x86-64.so.2 -\u003e /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2\n...\n```\n\nYou can determine placement with colons:\n\n```shell\n$ u-root -files \"/bin/bash:sbin/sh\"\n\n$ cpio -ivt \u003c /tmp/initramfs.linux_amd64.cpio\n...\n-rwxr-xr-x   0 root     root      1277936 Jan  1  1970 sbin/sh\n...\n```\n\nFor example on Debian, if you want to add two kernel modules for testing,\nexecuting your currently booted kernel:\n\n```shell\n$ u-root -files \"$HOME/hello.ko:etc/hello.ko\" -files \"$HOME/hello2.ko:etc/hello2.ko\"\n$ qemu-system-x86_64 -kernel /boot/vmlinuz-$(uname -r) -initrd /tmp/initramfs.linux_amd64.cpio\n```\n\n## Init and Uinit\n\nu-root has a very simple (exchangable) init system controlled by the `-initcmd`\nand `-uinitcmd` command-line flags.\n\n*   `-initcmd` determines what `/init` is symlinked to. `-initcmd` may be a\n    u-root command name or a symlink target.\n\n*   `-uinitcmd` is run by the default u-root [init](cmds/core/init) after some\n    basic file system setup. There is no default, users should optionally supply\n    their own. `-uinitcmd` may be a u-root command name with arguments or a\n    symlink target with arguments.\n\n*   After running a uinit (if there is one), [init](cmds/core/init) will start a\n    shell determined by the `-defaultsh` argument.\n\nWe expect most users to keep their `-initcmd` as [init](cmds/core/init), but to\nsupply their own uinit for additional initialization or to immediately load\nanother operating system.\n\nAll three command-line args accept both a u-root command name or a target\nsymlink path. **Only `-uinitcmd` accepts command-line arguments, however.** For\nexample,\n\n```bash\nu-root -uinitcmd=\"echo Go Gopher\" ./cmds/core/{init,echo,gosh}\n\ncpio -ivt \u003c /tmp/initramfs.linux_amd64.cpio\n# ...\n# lrwxrwxrwx   0 root     root           12 Dec 31  1969 bin/uinit -\u003e ../bbin/echo\n# lrwxrwxrwx   0 root     root            9 Dec 31  1969 init -\u003e bbin/init\n\nqemu-system-x86_64 -kernel $KERNEL -initrd /tmp/initramfs.linux_amd64.cpio -nographic -append \"console=ttyS0\"\n# ...\n# [    0.848021] Freeing unused kernel memory: 896K\n# 2020/05/01 04:04:39 Welcome to u-root!\n#                              _\n#   _   _      _ __ ___   ___ | |_\n#  | | | |____| '__/ _ \\ / _ \\| __|\n#  | |_| |____| | | (_) | (_) | |_\n#   \\__,_|    |_|  \\___/ \\___/ \\__|\n#\n# Go Gopher\n# ~/\u003e\n```\n\nPassing command line arguments like above is equivalent to passing the arguments\nto uinit via a flags file in `/etc/uinit.flags`, see [Extra Files](#extra-files).\n\nAdditionally, you can pass arguments to uinit via the `uroot.uinitargs` kernel\nparameters, for example:\n\n```bash\nu-root -uinitcmd=\"echo Gopher\" ./cmds/core/{init,echo,gosh}\n\ncpio -ivt \u003c /tmp/initramfs.linux_amd64.cpio\n# ...\n# lrwxrwxrwx   0 root     root           12 Dec 31  1969 bin/uinit -\u003e ../bbin/echo\n# lrwxrwxrwx   0 root     root            9 Dec 31  1969 init -\u003e bbin/init\n\nqemu-system-x86_64 -kernel $KERNEL -initrd /tmp/initramfs.linux_amd64.cpio -nographic -append \"console=ttyS0 uroot.uinitargs=Go\"\n# ...\n# [    0.848021] Freeing unused kernel memory: 896K\n# 2020/05/01 04:04:39 Welcome to u-root!\n#                              _\n#   _   _      _ __ ___   ___ | |_\n#  | | | |____| '__/ _ \\ / _ \\| __|\n#  | |_| |____| | | (_) | (_) | |_\n#   \\__,_|    |_|  \\___/ \\___/ \\__|\n#\n# Go Gopher\n# ~/\u003e\n```\n\nNote the order of the passed arguments in the above example.\n\nThe command you name must be present in the command set. The following will *not\nwork*:\n\n```bash\nu-root -uinitcmd=\"echo Go Gopher\" ./cmds/core/{init,gosh}\n# 21:05:57 could not create symlink from \"bin/uinit\" to \"echo\": command or path \"echo\" not included in u-root build: specify -uinitcmd=\"\" to ignore this error and build without a uinit\n```\n\nYou can also refer to non-u-root-commands; they will be added as symlinks. We\ndon't presume to know whether your symlink target is correct or not.\n\nThis will build, but not work unless you add a /bin/foobar to the initramfs.\n\n```bash\nu-root -uinitcmd=\"/bin/foobar Go Gopher\" ./cmds/core/{init,gosh}\n```\n\nThis will boot the same as the above.\n\n```bash\nu-root -uinitcmd=\"/bin/foobar Go Gopher\" -files /bin/echo:bin/foobar -files your-hosts-file:/etc/hosts ./cmds/core/{init,gosh}\n```\n\nThe effect of the above command:\n*   Sets up the uinit command to be /bin/foobar, with 2 arguments: Go Gopher\n*   Adds /bin/echo as bin/foobar\n*   Adds your-hosts-file as etc/hosts\n*   builds in the cmds/core/init, and cmds/core/gosh commands.\n\nThis will bypass the regular u-root init and just launch a shell:\n\n```bash\nu-root -initcmd=gosh ./cmds/core/{gosh,ls}\n\ncpio -ivt \u003c /tmp/initramfs.linux_amd64.cpio\n# ...\n# lrwxrwxrwx   0 root     root            9 Dec 31  1969 init -\u003e bbin/gosh\n\nqemu-system-x86_64 -kernel $KERNEL -initrd /tmp/initramfs.linux_amd64.cpio -nographic -append \"console=ttyS0\"\n# ...\n# [    0.848021] Freeing unused kernel memory: 896K\n# failed to put myself in foreground: ioctl: inappropriate ioctl for device\n# ~/\u003e\n```\n\n(It fails to do that because some initialization is missing when the shell is\nstarted without a proper init.)\n\n## AMD64 Architecture Level\n\nBefore building an initramfs for AMD64 with `u-root`, verify that the command\n\n```shell\ngo env GOAMD64\n```\n\nprints `v1`. A [`GOAMD64` setting](https://go.dev/wiki/MinimumRequirements#amd64)\nof any higher version may produce such binaries that don't execute on old AMD64\nprocessors (including the default CPU model of QEMU).\n\n`GOAMD64` can be reset to `v1` with one of the following methods:\n\n*   through the `GOAMD64` environment variable:\n\n    ```shell\n    export GOAMD64=v1\n    ```\n\n*   through `go env` (only takes effect if the `GOAMD64` environment variable\n    is not set):\n\n    ```shell\n    go env -w GOAMD64=v1\n    ```\n\n## Cross Compilation (targeting different architectures and OSes)\n\nCross-OS and -architecture compilation comes for free with Go. In fact, every PR\nto the u-root repo is built against the following architectures: amd64, x86\n(i.e. 32bit), mipsle, armv7, arm64, and ppc64le.\n\nFurther, we run integration tests on linux/amd64, and linux/arm64, using several\nCI systems. If you need to add another CI system, processor or OS, please let us\nknow.\n\nTo cross compile for an ARM, on Linux:\n\n```shell\nGOARCH=arm u-root\n```\n\nIf you are on OSX, and wish to build for Linux on AMD64:\n\n```shell\nGOOS=linux GOARCH=amd64 u-root\n```\n\n## Testing in QEMU\n\nA good way to test the initramfs generated by u-root is with qemu:\n\n```shell\nqemu-system-x86_64 -nographic -kernel path/to/kernel -initrd /tmp/initramfs.linux_amd64.cpio\n```\n\nNote that you do not have to build a special kernel on your own, it is\nsufficient to use an existing one. Usually you can find one in `/boot`.\n\nIf you don't have a kernel handy, you can also get the one we use for VM testing:\n\n```shell\ngo install github.com/hugelgupf/vmtest/tools/runvmtest@latest\n\nrunvmtest -- bash -c \"cp \\$VMTEST_KERNEL ./kernel\"\n```\n\nIt may not have all features you require, however.\n\n### Framebuffer\n\nFor framebuffer support, append a VESA mode via the `vga` kernel parameter:\n\n```shell\nqemu-system-x86_64 \\\n  -kernel path/to/kernel \\\n  -initrd /tmp/initramfs.linux_amd64.cpio \\\n  -append \"vga=786\"\n```\n\nFor a list of modes, refer to the\n[Linux kernel documentation](https://github.com/torvalds/linux/blob/master/Documentation/fb/vesafb.rst#how-to-use-it).\n\n### Entropy / Random Number Generator\n\nSome utilities, e.g., `dhclient`, require entropy to be present. For a speedy\nvirtualized random number generator, the kernel should have the following:\n\n```shell\nCONFIG_VIRTIO_PCI=y\nCONFIG_HW_RANDOM_VIRTIO=y\nCONFIG_CRYPTO_DEV_VIRTIO=y\n```\n\nThen you can run your kernel in QEMU with a `virtio-rng-pci` device:\n\n```shell\nqemu-system-x86_64 \\\n    -device virtio-rng-pci \\\n    -kernel vmlinuz \\\n    -initrd /tmp/initramfs.linux_amd64.cpio\n```\n\nIn addition, you can pass your host's RNG:\n\n```shell\nqemu-system-x86_64 \\\n    -object rng-random,filename=/dev/urandom,id=rng0 \\\n    -device virtio-rng-pci,rng=rng0 \\\n    -kernel vmlinuz \\\n    -initrd /tmp/initramfs.linux_amd64.cpio\n```\n\n## SystemBoot\n\nSystemBoot is a set of bootloaders written in Go. It is meant to be a\ndistribution for LinuxBoot to create a system firmware + bootloader. All of\nthese use `kexec` to boot. The commands are in [cmds/boot](cmds/boot).\nParsers are available for [GRUB](pkg/boot/grub), [syslinux](pkg/boot/syslinux),\nand other config files to make the transition to LinuxBoot easier.\n\n*   `pxeboot`: a network boot client that uses DHCP and HTTP or TFTP to get a\n    boot configuration which can be parsed as PXELinux or iPXE configuration\n    files to get a boot program.\n\n*   `boot`: finds all bootable kernels on local disk, shows a menu, and boots\n    them. Supports (basic) GRUB, (basic) syslinux, (non-EFI) BootLoaderSpec, and\n    ESXi configurations.\n\nMore detailed information about the build process for a full LinuxBoot firmware\nimage using u-root/systemboot and coreboot can be found in the\n[LinuxBoot book](https://book.linuxboot.org) chapter about\n[LinuxBoot using coreboot, u-root and systemboot](https://book.linuxboot.org/coreboot.u-root.systemboot/index.html).\n\nThis project started as a loose collection of programs in u-root by various\nLinuxBoot contributors, as well as a personal experiment by\n[Andrea Barberio](https://github.com/insomniacslk) that has since been merged\nin. It is now an effort of a broader community and graduated to a real project\nfor system firmwares.\n\n## Compression\n\nYou can compress the initramfs. However, for xz compression, the kernel has some\nrestrictions on the compression options and it is suggested to align the file to\n512 byte boundaries:\n\n```shell\nxz --check=crc32 -9 --lzma2=dict=1MiB \\\n   --stdout /tmp/initramfs.linux_amd64.cpio \\\n   | dd conv=sync bs=512 \\\n   of=/tmp/initramfs.linux_amd64.cpio.xz\n```\n\n## Getting Packages of TinyCore\n\nUsing the `tcz` command included in u-root, you can install tinycore linux\npackages for things you want.\n\nYou can use QEMU NAT to allow you to fetch packages. Let's suppose, for example,\nyou want bash. Once u-root is running, you can do this:\n\n```shell\n% tcz bash\n```\n\nThe tcz command computes and fetches all dependencies. If you can't get to\ntinycorelinux.net, or you want package fetching to be faster, you can run your\nown server for tinycore packages.\n\nYou can do this to get a local server using the u-root srvfiles command:\n\n```shell\n% srvfiles -p 80 -d path-to-local-tinycore-packages\n```\n\nOf course you have to fetch all those packages first somehow :-)\n\n## Build an Embeddable u-root\n\nYou can build the cpio image created by u-root into a Linux kernel via the\n`CONFIG_INITRAMFS_SOURCE` config variable or coreboot config variable, and\nfurther embed the kernel image into firmware as a coreboot payload.\n\nIn the kernel and coreboot case, you may need to configure ethernet. We have a\n`dhclient` command that works for both ipv4 and ipv6. Since v6 does not yet work\nthat well for most people, a typical invocation looks like this:\n\n```shell\n% dhclient -ipv4 -ipv6=false\n```\n\nOr, on newer linux kernels (\u003e 4.x) boot with ip=dhcp in the command line,\nassuming your kernel is configured to work that way.\n\n## Build Modes\n\nu-root can create an initramfs in two different modes, specified by `-build`:\n\n*   `gbb` mode: One busybox-like binary comprising all the Go tools you ask to\n    include.\n    See [the gobusybox README for how it works](https://github.com/u-root/gobusybox).\n    In this mode, u-root copies and rewrites the source of the tools you asked\n    to include to be able to compile everything into one busybox-like binary.\n\n*   `binary` mode: each specified binary is compiled separately and all binaries\n    are added to the initramfs.\n\n## Updating Dependencies\n\n```shell\ngo get -u\ngo mod tidy\ngo mod vendor\n```\n\n## Building without network access\n\nThe u-root command supports building with workspace vendoring and module\nvendoring. In both of those cases, if all dependencies are found in the vendored\ndirectories, the build happens completely offline.\n\nRead more in the [mkuimage README](https://github.com/u-root/mkuimage).\n\nu-root also still supports `GO111MODULE=off` builds.\n\n# Hardware\n\nIf you want to see u-root on real hardware, this\n[board](https://www.pcengines.ch/apu2.htm) is a good start.\n\n# Using with Plan 9\nU-root works with Plan 9. The best distro to use for it is 9front, as the\n9front cpiofs works with newc-format cpio (the format of Linux initramfs, which\nu-root generates).\n\nHere is a script for Plan 9. Once this script runs, all the u-root commands\nappear in /bin. You will need to have go1.22 installed on Plan 9; or\ncreate the u-root initramfs on some other system and copy it to Plan 9.\n\n```shell\n#!/bin/rc\nu-root '-defaultsh=' '-initcmd=' '-shellbang=true'\nfs/cpiofs /tmp/initram*cpio\nbind -a /n/tapefs /\nbind -a /bbin /bin\n```\n\n# Contributions\n\nFor information about contributing, including how we sign off commits, please\nsee [CONTRIBUTING.md](CONTRIBUTING.md).\n\nImproving existing commands (e.g., additional currently unsupported flags) is\nvery welcome. In this case it is not even required to build an initramfs, just\nenter the `cmds/` directory and start coding. A list of commands that are on the\nroadmap can be found [here](roadmap.md).\n\n## Website\n\nThe sources of [u-root.org](https://u-root.org) are inside the `docs/` directory and\nare deployed to the gh-pages branch. The CNAME file is currently not part of the CI\nwhich deploys to the branch which shall be evaluated if this makes futures deployments easier.\n","funding_links":[],"categories":["Go","Projects","linux","Wireless Communication"],"sub_categories":["WASI and WASM Unknown"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fu-root%2Fu-root","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fu-root%2Fu-root","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fu-root%2Fu-root/lists"}