{"id":13587593,"url":"https://github.com/skiffos/SkiffOS","last_synced_at":"2025-04-07T22:31:25.838Z","repository":{"id":37017667,"uuid":"56822637","full_name":"skiffos/SkiffOS","owner":"skiffos","description":"Any Linux distribution, anywhere.","archived":false,"fork":false,"pushed_at":"2025-04-04T18:22:59.000Z","size":8225,"stargazers_count":759,"open_issues_count":11,"forks_count":54,"subscribers_count":19,"default_branch":"master","last_synced_at":"2025-04-07T00:08:52.420Z","etag":null,"topics":["containers","linux","linux-distribution","operating-system","raspberry-pi"],"latest_commit_sha":null,"homepage":"https://skiffos.com","language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/skiffos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":"CITATION.cff","codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-04-22T03:10:51.000Z","updated_at":"2025-04-04T18:23:03.000Z","dependencies_parsed_at":"2023-10-15T23:10:39.175Z","dependency_job_id":"575e92c7-6cb7-46fd-895e-db46f00c2300","html_url":"https://github.com/skiffos/SkiffOS","commit_stats":{"total_commits":3514,"total_committers":21,"mean_commits":"167.33333333333334","dds":"0.015936254980079667","last_synced_commit":"a8420dca6f3f1fb2df1bf81090d30ce6eb9476f3"},"previous_names":[],"tags_count":131,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiffos%2FSkiffOS","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiffos%2FSkiffOS/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiffos%2FSkiffOS/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/skiffos%2FSkiffOS/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/skiffos","download_url":"https://codeload.github.com/skiffos/SkiffOS/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247740790,"owners_count":20988270,"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":["containers","linux","linux-distribution","operating-system","raspberry-pi"],"created_at":"2024-08-01T15:06:16.782Z","updated_at":"2025-04-07T22:31:25.819Z","avatar_url":"https://github.com/skiffos.png","language":"Shell","funding_links":[],"categories":["Shell","HarmonyOS","raspberry-pi"],"sub_categories":["Windows Manager"],"readme":"[![View Demo](https://asciinema.org/a/529928.svg)](https://asciinema.org/a/529928)\n\n## Introduction\n\n[![Web Browser Demo](https://img.shields.io/badge/demo-try%20in%20browser-blue?style=for-the-badge\u0026logo=firefoxbrowser)](https://copy.sh/v86/?profile=copy/skiffos)\n\n[SkiffOS] is a config package system for the [Buildroot] OS cross-compiler.\n\n - **Run any distribution anywhere**: decouples hardware support from user distro environments.\n - **Reliable**: minimal read-only host system for unbreakable boot-ups and over-the-air updates.\n - **Reproducible**: offline builds, pinned package versions, source-controlled custom configs.\n\nConfiguration packages are merged together to configure the system:\n\n - `SKIFF_CONFIG=pi/4,core/debian` - run Debian desktop on a Raspberry Pi 4.\n - `SKIFF_CONFIG=odroid/xu4,core/fedora` - run Fedora desktop on a Odroid XU4.\n - `SKIFF_CONFIG=virt/qemu,custom/config` - run a custom config in a Qemu VM.\n\nThere is a [project template] you can use for version-controlled customizations.\n\nLinux devices have varying requirements for kernel, firmware, and other hardware\nsupport packages. SkiffOS decouples this support from the containerized\nenvironments. The containers are portable across devices with the same CPU\narchitecture, while ordinary OS images (Board Support Packages) are not.\n\nSupports [any Linux-compatible computer], ranging from [RPi], [Odroid], [NVIDIA\nJetson], to [Desktop PCs], Laptops (i.e. [Apple MacBook]), [Phones], [Cloud\nVMs], and even [Web Browsers].\n\n[any Linux-compatible computer]: https://linux-hardware.org/index.php?d=SkiffOS\n[Apple MacBook]: https://linux-hardware.org/?probe=6dc90bec41\n[Buildroot]: https://buildroot.org\n[Cloud VMs]: https://imgur.com/a/PXCYnjT\n[Desktop PCs]: https://linux-hardware.org/?probe=267ab5de51\n[project template]: https://github.com/skiffos/skiff-ext-example\n[NVIDIA Jetson]: https://linux-hardware.org/?probe=184d1b1c05\n[Odroid]: https://linux-hardware.org/?probe=927be03a24\n[Phones]: https://linux-hardware.org/?probe=329e6f9308\n[RPi]: https://linux-hardware.org/?probe=c3d8362f28\n[Web Browsers]: https://copy.sh/v86/?profile=copy/skiffos\n[Web Browser Demo]: https://copy.sh/v86/?profile=copy/skiffos\n[SkiffOS]: ./resources/paper.pdf\n\n## Supported Systems\n\nThe Buildroot OS cross-compiler can target any Linux-compatible device or\nvirtual machine. These system configuration packages are available in the\nmain SkiffOS repository:\n\n| **System**            | **Config Package**        | **Bootloader**   | **Kernel**      |\n|-----------------------|---------------------------|------------------|-----------------|\n| VirtualBox            | [virt/virtualbox]         | N/A              | ✔ 6.13.9        |\n| [Docker Img]          | [virt/docker]             | N/A              | N/A             |\n| [Incus]               | [virt/incus]              | N/A              | ✔ 6.13.9        |\n| [Qemu]                | [virt/qemu]               | N/A              | ✔ 6.13.9        |\n| [UTM] on MacOS        | [apple/arm] + [virt/qemu] | N/A              | ✔ 6.13.9        |\n| [V86] on WebAssembly  | [browser/v86]             | [V86]            | ✔ 6.13.9        |\n| [WSL] on Windows      | [virt/wsl]                | N/A              | N/A             |\n|-----------------------|---------------------------|------------------|-----------------|\n| [Allwinner Nezha]     | [allwinner/nezha]         | ✔ U-boot 2022.10 | ✔ sm-6.1-rc3    |\n| [Apple Macbook Intel] | [apple/intel]             | ✔ [rEFInd]       | ✔ 6.13.9        |\n| [Apple Silicon]       | [apple/arm]               | ✔ UTM (as VM)    | ✔ 6.13.9        |\n| [BananaPi M1+/Pro]    | [bananapi/m1plus]         | ✔ U-Boot 2025.01 | ✔ 6.13.9        |\n| [BananaPi M1]         | [bananapi/m1]             | ✔ U-Boot 2025.01 | ✔ 6.13.9        |\n| [BananaPi M2]         | [bananapi/m2]             | ✔ U-Boot 2025.01 | ✔ 6.13.9        |\n| [BananaPi M2+]        | [bananapi/m2plus]         | ✔ U-Boot 2025.01 | ✔ 6.13.9        |\n| [BananaPi M2 Ultra]   | [bananapi/m2ultra]        | ✔ U-Boot 2025.01 | ✔ 6.13.9        |\n| [BananaPi M3]         | [bananapi/m3]             | ✔ U-Boot 2025.01 | ✔ 6.13.9        |\n| [BeagleBoard X15]     | [beaglebone/x15]          | ✔ U-Boot 2022.04 | ✔ 5.10.168-ti   |\n| [BeagleBone AI]       | [beaglebone/ai]           | ✔ U-Boot 2022.04 | ✔ 5.10.168-ti   |\n| [BeagleBone Black]    | [beaglebone/black]        | ✔ U-Boot 2022.04 | ✔ 5.10.168-ti   |\n| [BeagleBoard BeagleV] | [starfive/visionfive]     | ✔ U-Boot 2021.04 | ✔ sv-5.19-rc3   |\n| **[Intel x86/64]**    | [intel/desktop]           | ✔ [rEFInd]       | ✔ 6.13.9        |\n| [ModalAI Voxl2]       | [modalai/voxl2]           | N/A              | ✔ msm-4.19.125  |\n| [NVIDIA Jetson AGX]   | [jetson/agx]              | ✔ UEFI           | ✔ [nv-5.10.120] |\n| [NVIDIA Jetson Nano]  | [jetson/nano]             | ✔ U-Boot         | ✔ [nv-4.9.337]  |\n| [NVIDIA Jetson TX2]   | [jetson/tx2]              | ✔ U-Boot         | ✔ [nv-4.9.337]  |\n| [Odroid C2]           | [odroid/c2]               | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid C4]           | [odroid/c4]               | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid H2]           | [odroid/h3]               | ✔ [rEFInd]       | ✔ 6.13.9        |\n| [Odroid H2+]          | [odroid/h3]               | ✔ [rEFInd]       | ✔ 6.13.9        |\n| [Odroid H3]           | [odroid/h3]               | ✔ [rEFInd]       | ✔ 6.13.9        |\n| [Odroid H3+]          | [odroid/h3]               | ✔ [rEFInd]       | ✔ 6.13.9        |\n| [Odroid HC1]          | [odroid/xu]               | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid HC2]          | [odroid/xu]               | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid HC4]          | [odroid/hc4]              | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid M1]           | [odroid/m1]               | ✔ U-Boot 2017.09 | ✔ tb-6.4.3      |\n| [Odroid N2]+          | [odroid/n2]               | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid N2L]          | [odroid/n2l]              | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid U]            | [odroid/u]                | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid XU3]          | [odroid/xu]               | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [Odroid XU4]          | [odroid/xu]               | ✔ U-Boot 2023.07 | ✔ tb-6.4.3      |\n| [OrangePi Lite]       | [orangepi/lite]           | ✔ U-Boot 2018.05 | ✔ 6.13.9        |\n| [OrangePi Zero]       | [orangepi/zero]           | ✔ U-Boot 2018.07 | ✔ 6.13.9        |\n| [PcDuino 3]           | [pcduino/3]               | ✔ U-Boot 2019.07 | ✔ 6.13.9        |\n| [PcEngines APU2]      | [pcengines/apu2]          | ✔ CoreBoot       | ✔ 6.13.9        |\n| [Pi 0]                | [pi/0]                    | N/A              | ✔ rpi-6.12.15   |\n| [Pi 1]                | [pi/1]                    | N/A              | ✔ rpi-6.12.15   |\n| [Pi 3] + 1, 2         | [pi/3]                    | N/A              | ✔ rpi-6.12.15   |\n| [Pi 4]                | [pi/4]                    | N/A              | ✔ rpi-6.12.15   |\n| [Pi 4] (32bit mode)   | [pi/4x32]                 | N/A              | ✔ rpi-6.12.15   |\n| [Pi 5]                | [pi/5]                    | N/A              | ✔ rpi-6.12.15   |\n| [Pine64 H64]          | [pine64/h64]              | ✔ U-Boot 2022.04 | ✔ megi-6.11.10  |\n| [PineBook A64]        | [pine64/book_a64]         | ✔ U-Boot (bin)   | ✔ megi-6.11.10  |\n| [PineBook Pro]        | [pine64/book]             | ✔ U-Boot (bin)   | ✔ megi-6.11.10  |\n| [PinePhone]           | [pine64/phone]            | ✔ U-Boot (bin)   | ✔ megi-6.11.10  |\n| [PinePhone Pro]       | [pine64/phone_pro]        | ✔ U-Boot (bin)   | ✔ megi-6.11.10  |\n| [Rock64] rk3328       | [pine64/rock64]           | ✔ U-Boot 2022.04 | ✔ megi-6.11.10  |\n| [RockPro64]           | [pine64/rockpro64]        | ✔ U-Boot (bin)   | ✔ megi-6.11.10  |\n| [Sipeed LicheeRV]     | [allwinner/licheerv]      | ✔ U-Boot 2022.07 | ✔ sm-5.19-rc1   |\n| [VisionFive]          | [starfive/visionfive]     | ✔ U-Boot 2021.04 | ✔ sv-5.19-rc3   |\n| [VisionFive2] v1.2    | [starfive/visionfive2_12] | ✔ U-Boot 2024.07 | ✔ 6.13.9        |\n| [VisionFive2] v1.3    | [starfive/visionfive2]    | ✔ U-Boot 2024.07 | ✔ 6.13.9        |\n| [USBArmory Mk2]       | [usbarmory/mk2]           | ✔ U-Boot 2020.10 | ✔ 6.13.9        |\n| Valve [Steam Deck]    | [valve/deck]              | N/A              | ✔ valve-6.8.12  |\n| [Wandboard]           | [freescale/wandboard]     | ✔ U-Boot 2022.04 | ✔ 6.13.9        |\n\n[Allwinner Nezha]: https://linux-sunxi.org/Allwinner_Nezha\n[Apple Macbook Intel]: https://wiki.gentoo.org/wiki/Apple_Macbook_Pro_Retina_(early_2013)\n[Apple Silicon]: https://support.apple.com/en-us/116943\n[BananaPi M1+/Pro]: http://linux-sunxi.org/LeMaker_Banana_Pi#Variants\n[BananaPi M1]: http://linux-sunxi.org/LeMaker_Banana_Pi#Variants\n[BananaPi M2]: http://linux-sunxi.org/LeMaker_Banana_Pi#Variants\n[BananaPi M2+]: http://linux-sunxi.org/LeMaker_Banana_Pi#Variants\n[BananaPi M2 Ultra]: http://linux-sunxi.org/LeMaker_Banana_Pi#Variants\n[BananaPi M3]: http://linux-sunxi.org/Banana_Pi_M3\n[BeagleBone AI]: http://beagleboard.org/ai\n[BeagleBone Black]: http://beagleboard.org/black\n[BeagleBoard X15]: http://beagleboard.org/x15\n[BeagleBoard BeagleV]: https://beagleboard.org/static/beagleV/beagleV.html\n[Docker Img]: ./docker\n[Intel x86/64]: ./configs/intel/x64\n[ModalAI Voxl2]: https://www.modalai.com/products/voxl-2\n[NVIDIA Jetson AGX]: https://developer.nvidia.com/embedded/jetson-agx-xavier-developer-kit\n[NVIDIA Jetson Nano]: https://developer.nvidia.com/embedded/jetson-nano-developer-kit\n[NVIDIA Jetson TX2]: https://developer.nvidia.com/embedded/jetson-tx2\n[Odroid C2]: https://wiki.odroid.com/odroid-c2/odroid-c2\n[Odroid C4]: https://wiki.odroid.com/odroid-c4/odroid-c4\n[Odroid H2]: https://www.hardkernel.com/shop/odroid-h2/\n[Odroid H2+]: https://www.hardkernel.com/shop/odroid-h2plus/\n[Odroid H3]: https://www.hardkernel.com/shop/odroid-h3/\n[Odroid H3+]: https://www.hardkernel.com/shop/odroid-h3-plus/\n[Odroid HC1]: https://www.hardkernel.com/shop/odroid-hc1-home-cloud-one/\n[Odroid HC2]: https://www.hardkernel.com/shop/odroid-hc2-home-cloud-two/\n[Odroid HC4]: https://www.hardkernel.com/shop/odroid-hc4/\n[Odroid M1]: https://wiki.odroid.com/odroid-m1/odroid-m1\n[Odroid N2]: https://wiki.odroid.com/odroid-n2/odroid-n2\n[Odroid N2L]: https://wiki.odroid.com/odroid-n2l\n[Odroid U]: https://wiki.odroid.com/old_product/odroid-x_u_q/odroid_u3/odroid-u3\n[Odroid XU3]: https://wiki.odroid.com/old_product/odroid-xu3/odroid-xu3\n[Odroid XU4]: https://wiki.odroid.com/odroid-xu4/odroid-xu4\n[OrangePi Lite]: http://linux-sunxi.org/Xunlong_Orange_Pi_One_%26_Lite\n[OrangePi Zero]: http://linux-sunxi.org/Xunlong_Orange_Pi_Zero\n[PcDuino 3]: https://linux-sunxi.org/LinkSprite_pcDuino3\n[PcEngines APU2]: https://www.pcengines.ch/apu2.htm\n[Pi 0]: https://www.raspberrypi.org/products/raspberry-pi-zero/\n[Pi 1]: https://www.raspberrypi.org/products/raspberry-pi-1-model-b-plus/\n[Pi 3]: https://www.raspberrypi.org/products/raspberry-pi-3-model-b/\n[Pi 4]: https://www.raspberrypi.org/products/raspberry-pi-4-model-b/\n[Pi 5]: https://www.raspberrypi.org/products/raspberry-pi-5/\n[Pine64 H64]: https://www.pine64.org/pine-h64-ver-b/\n[PineBook A64]: https://www.pine64.org/pinebook/\n[PineBook Pro]: https://www.pine64.org/pinebook-pro/\n[PinePhone]: https://www.pine64.org/pinephone/\n[PinePhone Pro]: https://www.pine64.org/pinephonepro/\n[Incus]: https://linuxcontainers.org/incus/\n[Qemu]: https://www.qemu.org/\n[Rock64]: https://www.pine64.org/devices/single-board-computers/rock64/\n[RockPro64]: https://www.pine64.org/rockpro64/\n[Sipeed LicheeRV]: https://linux-sunxi.org/Sipeed_Lichee_RV\n[VisionFive]: https://ameridroid.com/products/visionfive-starfive\n[VisionFive2]: https://ameridroid.com/products/visionfive-2\n[Steam Deck]: https://store.steampowered.com/steamdeck\n[USBArmory Mk2]: https://github.com/f-secure-foundry/usbarmory\n[UTM]: https://getutm.app/\n[V86]: https://copy.sh/v86/?profile=copy/skiffos\n[Wandboard]: https://elinux.org/Wandboard\n[WSL]: https://docs.microsoft.com/en-us/windows/wsl/\n[nv-4.9.337]: https://github.com/skiffos/linux/tree/skiff-jetson-4.9.x\n[nv-5.10.120]: https://github.com/skiffos/linux/tree/skiff-jetson-5.10.x\n[rEFInd]: https://www.rodsbooks.com/refind/\n\n[allwinner/licheerv]: ./configs/allwinner/licheerv\n[allwinner/nezha]: ./configs/allwinner/nezha\n[apple/arm]: ./configs/apple/arm\n[apple/intel]: ./configs/apple/intel\n[bananapi/m1]: ./configs/bananapi/m1\n[bananapi/m1plus]: ./configs/bananapi/m1plus\n[bananapi/m2]: ./configs/bananapi/m2\n[bananapi/m2plus]: ./configs/bananapi/m2plus\n[bananapi/m2ultra]: ./configs/bananapi/m2ultra\n[bananapi/m3]: ./configs/bananapi/m3\n[beaglebone/ai]: ./configs/beaglebone\n[beaglebone/black]: ./configs/beaglebone\n[beaglebone/x15]: ./configs/beaglebone\n[browser/v86]: ./configs/browser/v86\n[freescale/wandboard]: ./configs/freescale/wandboard\n[intel/desktop]: ./configs/intel/desktop\n[jetson/agx]: ./configs/jetson/agx\n[jetson/nano]: ./configs/jetson/nano\n[jetson/tx2]: ./configs/jetson/tx2\n[modalai/voxl2]: ./configs/modalai/voxl2\n[odroid/c2]: ./configs/odroid\n[odroid/c4]: ./configs/odroid\n[odroid/m1]: ./configs/odroid\n[odroid/h3]: ./configs/odroid\n[odroid/hc4]: ./configs/odroid\n[odroid/n2]: ./configs/odroid\n[odroid/n2l]: ./configs/odroid\n[odroid/u]: ./configs/odroid\n[odroid/xu]: ./configs/odroid\n[orangepi/lite]: ./configs/orangepi/lite\n[orangepi/zero]: ./configs/orangepi/zero\n[pcduino/3]: ./configs/pcduino/3\n[pcengines/apu2]: ./configs/pcengines/apu2\n[pi/0]: ./configs/pi\n[pi/1]: ./configs/pi\n[pi/3]: ./configs/pi\n[pi/4]: ./configs/pi\n[pi/4x32]: ./configs/pi\n[pi/5]: ./configs/pi\n[pine64/book_a64]: ./configs/pine64/book_a64\n[pine64/book]: ./configs/pine64/book\n[pine64/h64]: ./configs/pine64/h64\n[pine64/phone]: ./configs/pine64/phone\n[pine64/phone_pro]: ./configs/pine64/phone_pro\n[pine64/rock64]: ./configs/pine64/rock64\n[pine64/rockpro64]: ./configs/pine64/rockpro64\n[starfive/visionfive]: ./configs/starfive/visionfive\n[starfive/visionfive2]: ./configs/starfive/visionfive2\n[starfive/visionfive2_12]: ./configs/starfive/visionfive2_12\n[usbarmory/mk2]: ./configs/usbarmory\n[valve/deck]: ./configs/valve/deck\n[virt/docker]: ./configs/virt/docker\n[virt/incus]: ./configs/virt/incus\n[virt/qemu]: ./configs/virt/qemu\n[virt/virtualbox]: ./configs/virt/virtualbox\n[virt/wsl]: ./configs/virt/wsl\n\nAdding support for a board involves creating a Skiff configuration package for\nthe board, as described above. If you have a device that is not yet supported by\nSkiffOS, please **[open an issue].**\n\n[open an issue]: https://github.com/skiffos/SkiffOS/issues/new\n\n## Getting started\n\n[![Support Server](https://img.shields.io/discord/803825858599059487.svg?label=Discord\u0026logo=Discord\u0026colorB=7289da\u0026style=for-the-badge)](https://discord.gg/EKVkdVmvwT)\n\n[Buildroot dependencies] must be installed as a prerequisite, assuming apt:\n\n```\nsudo apt-get install -y \\\n  bash \\\n  bc \\\n  binutils \\\n  build-essential \\\n  bzip2 \\\n  cpio \\\n  diffutils \\\n  file \\\n  findutils \\\n  gzip \\\n  libarchive-tools \\\n  libncurses-dev \\\n  make \\\n  patch \\\n  perl \\\n  rsync \\\n  sed \\\n  tar \\\n  unzip \\\n  wget\n```\n\n[Buildroot dependencies]: https://buildroot.org/downloads/manual/manual.html#requirement-mandatory\n\nThis example uses `pi/4` for the Raspberry Pi 4, see [Supported Systems].\n\n[Supported Systems]: #supported-systems\n\n[Create a SSH key] on your development machine. Add the public key to your build\nwith `cp ~/.ssh/*.pub ./overrides/root_overlay/etc/skiff/authorized_keys`. This\nwill be needed to enable SSH access.\n\n[Create a SSH key]: https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent#generating-a-new-ssh-key\n\n```sh\n$ git submodule update             # make sure buildroot is up to date\n$ make                             # lists all available options\n$ export SKIFF_WORKSPACE=default   # optional: supports multiple SKIFF_CONFIG at once\n$ export SKIFF_CONFIG=pi/4,skiff/core\n$ make configure                   # configure the system\n$ make compile                     # build the system\n```\n\nAfter you run `make configure` your `SKIFF_CONFIG` selection will be saved. The\nbuild can be interrupted and later resumed with `make compile`.\n\n`SKIFF_WORKSPACE` defaults to `default` and is used to compile multiple\n`SKIFF_CONFIG` simultaneously.\n\nThere are many other utility commands made available by Buildroot, which can be\nlisted using `make br/help`, some examples:\n\n```sh\n$ make br/menuconfig # explore Buildroot config menu\n$ make br/sdk        # build relocatable SDK for target\n$ make br/graph-size # graph the target packages sizes\n```\n\nThere are other [application packages] available i.e. `apps/podman` and `apps/crio`.\n\n[application packages]: ./configs/apps\n\n### Flashing the SD Card\n\nOnce the build is complete, it's time to flash the system to a SD card. You will\nneed to switch to `sudo bash` for this on most systems.\n\n```sh\n$ sudo bash             # switch to root\n$ blkid                 # look for your SD card's device file\n$ export PI_SD=/dev/sdz # make sure this is right!\n$ make cmd/pi/common/format  # tell skiff to format the device\n$ make cmd/pi/common/install # tell skiff to install the os\n```\n\nThe device needs to be formatted only one time, after which, the install command\ncan be used to update the SkiffOS images without clearing the persistent data.\nThe persist partition is not touched in this step, so anything you save there,\nincluding all Docker containers and system configuration, will not be modified.\n\n### Connecting\n\nConnect using SSH to `root@my-ip-address` to access the SkiffOS system, and\nconnect to `core@my-ip-address` to access the \"Core\" system container. See the\nsection above about SSH public keys if you get a password prompt.\n\nThe mapping between users and containers can be edited in the\n`/mnt/persist/skiff/core/config.yaml` file.\n\n### OTA Upgrade\n\nThe system can then be upgraded over-the-air (OTA) using the rsync script:\n\n```sh\n$ ./scripts/push_image.bash root@my-ip-address\n```\n\nThe SkiffOS upgrade (or downgrade) will take effect on next reboot.\n\n### Compile on MacOS\n\nBuilding directly on MacOS is not yet possible, particularly due to the\ncase-insensitivity of the MacOS file system. You can use Lima to build the OS:\n\n[Install Lima](https://github.com/lima-vm/lima?tab=readme-ov-file#getting-started), then:\n\n```bash\nlimactl start --name=skiffos-build https://raw.githubusercontent.com/skiffos/SkiffOS/master/build/lima/lima.yaml\nlimactl shell skiffos-build\n```\n\nThen in the lima shell:\n\n```bash\ncd\ngit clone https://github.com/skiffos/skiffos\ncd skiffos\n```\n\nProceed with usual build sequence.\n\nSee the [apple/arm] docs for building a VM to run on MacOS.\n\n[apple/arm]: ./configs/apple/arm\n\n### Podman\n\nUse the `apps/podman` configuration package to enable Podman support.\n\n## Running any distro in containers\n\nSkiffOS Core runs Linux distributions in privileged containers:\n\n - [YAML configuration] format for mapping containers, images, and users.\n - systemd and/or other init processes operate as PID 1 inside the container.\n - images can be pulled or compiled from scratch on first boot.\n\n[YAML configuration]: https://github.com/skiffos/SkiffOS/blob/2022.08.1/configs/skiff/core/buildroot_ext/package/skiff-core-defconfig/coreenv-defconfig.yaml#L11\n\nAdding **skiff/core** to `SKIFF_CONFIG` enables Debian Sid with an XFCE desktop.\n\nOther distributions and images supported:\n\n| **Distribution** | **Config Package** | **Notes**              |\n|------------------|--------------------|------------------------|\n| [Alpine]         | core/alpine        | OpenRC                 |\n| [Arch] Linux     | core/arch          | Minimal desktop        |\n| [Debian] Sid     | skiff/core         | Default: XFCE desktop  |\n| [Fedora]         | core/fedora        | Minimal desktop        |\n| [Gentoo]         | core/gentoo        | Based on latest stage3 |\n| [Ubuntu]         | core/ubuntu        | Snaps \u0026 Ubuntu Desktop |\n\nOther less frequently updated images:\n\n| **Distribution**        | **Config Package** | **Notes**                 |\n|-------------------------|--------------------|---------------------------|\n| [DietPi]                | [core/dietpi]      | DietPi applications tool  |\n| [NASA cFS] Framework    | [core/nasa_cfs]    | Flight software framework |\n| [NASA Fprime] Framework | [core/nasa_fprime] | Flight software framework |\n| [NixOS]                 | core/nixos         |                           |\n| [NixOS] with [XFCE]     | core/nixos_xfce    |                           |\n\nThere are also core images specific to [pine64/phone] and [pine64/book] and [jetson/common].\n\n[Arch]: https://archlinux.org/\n[Debian]: https://debian.org/\n[DietPi]: https://github.com/MichaIng/DietPi\n[Alpine]: https://www.alpinelinux.org/\n[Gentoo]: https://www.gentoo.org/\n[Fedora]: https://www.getfedora.org/\n[KDE Neon]: https://neon.kde.org/\n[NASA cFS]: https://github.com/nasa/cFS\n[NASA Fprime]: https://github.com/nasa/fprime\n[NixOS]: https://nixos.org\n[UBTouch]: https://ubuntu-touch.io\n[Ubuntu]: https://ubuntu.com/\n[XFCE]: https://www.xfce.org/\n\n[core/debian]: ./configs/core/debian\n[core/dietpi]: ./configs/core/dietpi\n[core/nasa_cfs]: ./configs/core/nasa_cfs\n[core/nasa_fprime]: ./configs/core/nasa_fprime\n[pine64/book]: ./configs/pine64/book\n[pine64/phone]: ./configs/pine64/phone\n[jetson/common]: ./configs/jetson/common\n\n### Customize container config\n\nThe default configuration creates a user named \"core\" mapped into a container,\nbut this can be adjusted with the `skiff-core.yaml` configuration file:\n\n```yaml\ncontainers:\n  core:\n    image: skiffos/skiff-core-gentoo:latest\n    [...]\nusers:\n  core:\n    container: core\n    containerUser: core\n    [...]\n```\n\nThe provided [example configs] for the above supported distros are a good\nstarting point for further customization.\n\n[example configs]: https://github.com/skiffos/SkiffOS/blob/2022.08.1/configs/skiff/core/buildroot_ext/package/skiff-core-defconfig/coreenv-defconfig.yaml#L11\n\nTo customize a running system, edit `/mnt/persist/skiff/core/config.yaml` and\nrun `systemctl restart skiff-core` to apply. You may need to delete existing\ncontainers and restart skiff-core to re-create them after changing their config.\n\nThe configuration format and skiff-core source is in [the skiff-core repo].\n\n[the skiff-core repo]: https://github.com/skiffos/skiff-core/blob/master/config/core_config.go\n\n## Configuration Packages\n\nSkiffOS supports modular configuration packages: kernel \u0026 buildroot configs,\nroot filesystem overlays, patches, hooks, and other resources.\n\nLayers are named as `namespace/name`. For example, a Raspberry Pi 4\nconfiguration would be `pi/4` and Docker is `apps/docker`.\n\n```\n├── cflags:         compiler flags in files\n├── buildroot:      buildroot configuration fragments\n├── buildroot_ext:  buildroot extensions (extra packages)\n├── buildroot_patches: extra Buildroot global patches\n│   ├── \u003cpackagename\u003e: patch files for Buildroot \u003cpackagename\u003e\n│   └── \u003cpackagename\u003e/\u003cversion\u003e: patches for package version\n├── busybox:        busybox configuration fragments\n├── extensions:     extra commands to add to the build system\n│   └── Makefile\n├── hooks:          scripts hooking pre/post build steps\n│   ├── post.sh\n│   └── pre.sh\n├── kernel:         kernel configuration fragments\n├── kernel_patches: kernel .patch files\n├── root_overlay:   root overlay files\n├── metadata:       metadata files\n│   ├── commands\n│   ├── dependencies\n│   ├── description\n│   └── unlisted\n├── resources:     files used by the configuration package\n├── scripts:       any scripts used by the extensions\n├── uboot:         u-boot configuration fragments\n├── uboot_patches: u-boot .patch files\n└── users:         additional buildroot user config files\n```\n\nAll files are optional.\n\n### Custom Users\n\nTo add custom users, add files in the \"users\" dir with the [makeuser syntax].\n\n[makeuser syntax]: https://buildroot.org/downloads/manual/manual.html#makeuser-syntax\n\n### Out-of-tree configuration packages\n\nYou can set the following env variables to control this process:\n\n - `SKIFF_CONFIG_PATH_ODROID_XU`: Set the path for the ODROID_XU config package. You can set this to add new packages or override old ones.\n - `SKIFF_EXTRA_CONFIGS_PATH`: Colon `:` separated list of paths to look for config packages.\n - `SKIFF_CONFIG`: Name of skiff config to use, or comma separated list to overlay, with the later options taking precedence\n\nThese packages will be available in the SkiffOS system.\n\n### Overrides\n\nIt's often useful to be able to adjust the configs during development without\nactually creating a new configuration layer. This can be easily done with the\n[overrides](./overrides) layer.\n\nThe overrides directory is treated as an additional configuration layer. The\nlayout of the configuration layers is described above. Overrides is ignored by\nGit, and serves as a quick and easy way to modify the configuration.\n\nTo apply the changes \u0026 re-pack the build, run \"make configure compile\" again.\n\n## Workspaces\n\nUse Workspaces to compile multiple `SKIFF_CONFIG` combinations simultaneously.\n\nThe `SKIFF_WORKSPACE` environment variable controls which workspace is selected.\n\nThe directory at `workspaces/$SKIFF_WORKSPACE` contains the Buildroot build directory. \n\nConfiguration files in `overrides/workspaces/$SKIFF_WORKSPACE/` will override\nsettings for that workspace using the configuration package structure.\n\n## Virtualization\n\nThe virt/ packages are designed for running Skiff in various virtualized environments.\n\n### Qemu\n\nHere is a minimal working example of running Skiff in Qemu:\n\n```sh\n$ SKIFF_CONFIG=virt/qemu,util/rootlogin make configure compile\n$ make cmd/virt/qemu/run\n```\n\nThe `util/rootlogin` package is used here to enable logging in as \"root\" on the\nqemu debug console shown when running \"cmd/virt/qemu/run\".\n\nQemu can emulate other architectures, for example, riscv64:\n\n```\nexport SKIFF_WORKSPACE=qemu\nexport SKIFF_CONFIG=virt/qemu,core/gentoo,util/rootlogin\nmkdir -p ./overrides/workspaces/qemu/buildroot\necho \"BR2_riscv=y\" \u003e ./overrides/workspaces/qemu/buildroot/arch\nmake compile\n```\n\nMost Buildroot-supported architectures can be selected \u0026 emulated.\n\nThe parameters for running the VM can also be adjusted:\n\n```\nexport ROOTFS_MAX_SIZE=120G\nexport QEMU_MEMORY=8G\nexport QEMU_CPUS=8\nmake cmd/virt/qemu/run\n```\n\n### Docker\n\nHere is a minimal working example of running SkiffOS in Docker:\n\n```sh\n$ SKIFF_CONFIG=virt/docker,skiff/core make configure compile\n$ make cmd/virt/docker/buildimage\n$ make cmd/virt/docker/run\n\n# inside container\n$ su - core\n```\n\nThe build command compiles the image, and run executes it.\n\nYou can execute a shell inside the container with:\n\n```sh\n$ make cmd/virt/docker/exec\n# alternatively\n$ docker exec -it skiff sh\n```\n\nOr run the latest demo release on Docker Hub:\n\n```\ndocker run -t -d --name=skiff \\\n  --privileged \\\n  --cap-add=NET_ADMIN \\\n  --security-opt seccomp=unconfined \\\n  --stop-signal=SIGRTMIN+3 \\\n  -v /sys/fs/cgroup:/sys/fs/cgroup:ro \\\n  -v $(pwd)/skiff-persist:/mnt/persist \\\n  skiffos/skiffos:latest\n```\n\n## Configuration\n\nSkiffOS can also be configured with files in the \"persist\" partition.\n\n### Hostname\n\nSet the hostname by placing the desired hostname in the `skiff/hostname` file on\nthe persist partition. You could also set this in one of your config packages by\nwriting the desired hostname to `/etc/hostname`.\n\n### NetworkManager\n\nYou can use `nmcli` on the device to manage `NetworkManager`, and any connection\ndefinitions written by `nmcli device wifi connect` or similar will automatically\nbe written to the persist partition and persisted to future boots.\n\nTo connect to WiFi: `nmcli device wifi connect myssid password mypassword.`\n\nThe configuration file format for these connections is [documented\nhere](http://manpages.ubuntu.com/manpages/wily/man5/nm-settings-keyfile.5.html)\nwith examples.\n\nExample for a WiFi network called `mywifi` with password `mypassword`:\n\n```\n[connection]\nid=mywifi\nuuid=12f6c21d-f077-4b95-a4cb-bf41555d87a5\ntype=wifi\n\n[wifi]\nmode=infrastructure\nssid=mywifi\n\n[wifi-security]\nkey-mgmt=wpa-psk\npsk=mypassword\n\n[ipv4]\nmethod=auto\n\n[ipv6]\naddr-gen-mode=stable-privacy\nmethod=auto\n```\n\nNetwork configuration files are plaintext files located at either of:\n\n - `/etc/NetworkManager/system-connections/` inside the build image\n - `/mnt/persist/skiff/connections/` on the persist partition.\n\nTo add the above example to your build:\n\n - `gedit ./overrides/root_overlay/etc/NetworkManager/system-connections/mywifi`\n - paste the above plaintext \u0026 save\n - run \"make compile\" to update the image with the changes.\n\n### SSH Keys\n\nThe system will generate the authorized_keys file for the users on startup.\n\nIt takes SSH public key files (`*.pub`) from these locations:\n\n - `/etc/skiff/authorized_keys` from inside the image\n - `skiff/keys` from inside the persist partition\n \nYour SSH public key will usually be located at `~/.ssh/id_ed25519.pub`.\n\n### Mount a Disk to a Container\n\nTo mount a Linux disk, for example an `ext4` partition, to a path inside a\nDocker container, you can use the Docker Volumes feature:\n\n```sh\n# create a volume for the storage drive\ndocker volume create --driver=local --opt device=/dev/disk/by-label/storage storage\n\n# run a temporary container to view the contents\ndocker run --rm -it -v storage:/storage --workdir /storage alpine:edge sh\n```\n\nThe volume can be mounted into a Skiff Core container by adding to the mounts\nlist in `/mnt/persist/skiff/core/config.yaml`:\n\n```yaml\ncontainers:\n  core:\n    image: skiffos/skiff-core-gentoo:latest\n    mounts:\n      - storage:/mnt/storage\n```\n\nAfter adding the mount, delete and re-create the container:\n\n```sh\ndocker rm -f core\nsystemctl restart skiff-core\n```\n\n## Whitepaper\n\n[![arXiv](https://img.shields.io/badge/arXiv-2104.00048-b31b1b.svg?style=flat-square)](https://arxiv.org/abs/2104.00048)\n[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.4629835.svg)](https://doi.org/10.5281/zenodo.4629835)\n[![Paper Cites](https://img.shields.io/badge/Paper-Citations-darkgreen?style=flat-square\u0026logo=semanticscholar)](https://www.semanticscholar.org/paper/SkiffOS%3A-Minimal-Cross-compiled-Linux-for-Embedded-Stewart/9319544182705c73b5e2ccdd98f9c7cb3b984039?sort=pub-date#citing-papers)\n\nThe [SkiffOS Whitepaper] overviews the project motivation and goals.\n\n[SkiffOS Whitepaper]: https://arxiv.org/pdf/2104.00048\n\n## Support\n\nCommunity contributions are welcomed!\n\nPlease file a [GitHub issue] and/or [Join Discord] with any questions.\n\n[GitHub issue]: https://github.com/skiffos/skiffos/issues/new\n[Join Discord]: https://discord.gg/EKVkdVmvwT\n\n... or feel free to reach out on [Matrix Chat]!\n\n[Matrix Chat]: https://matrix.to/#/#aperturerobotics:matrix.org\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskiffos%2FSkiffOS","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fskiffos%2FSkiffOS","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fskiffos%2FSkiffOS/lists"}