├── .editorconfig ├── .github ├── FUNDING.yml └── workflows │ ├── os.yml │ ├── v1-hdmi-rpi2.yml │ ├── v1-hdmi-rpi3.yml │ ├── v1-hdmi-zero2w.yml │ ├── v1-hdmiusb-rpi2.yml │ ├── v1-hdmiusb-rpi3.yml │ ├── v1-hdmiusb-zero2w.yml │ ├── v2-hdmi-rpi3.yml │ ├── v2-hdmi-rpi4.yml │ ├── v2-hdmi-zero2w.yml │ ├── v2-hdmiusb-rpi4.yml │ ├── v3-hdmi-rpi4-box.yml │ ├── v3-hdmi-rpi4.yml │ ├── v4mini-hdmi-rpi4.yml │ └── v4plus-hdmi-rpi4.yml ├── .gitignore ├── Makefile ├── README.md ├── disk ├── v0.conf ├── v1.conf ├── v2.conf ├── v3.conf ├── v4mini.conf └── v4plus.conf └── stages └── arch ├── pikvm-otg-console ├── 0000-vendor-otg-serial.yaml ├── Dockerfile.part └── ttyGS0.override └── pikvm ├── Dockerfile.part ├── issue ├── motd └── nanorc /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | end_of_file = lf 5 | indent_style = tab 6 | indent_size = 4 7 | 8 | [*.{py,yaml}] 9 | indent_style = space 10 | indent_size = 4 11 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | patreon: pikvm 4 | custom: https://paypal.me/pikvm 5 | -------------------------------------------------------------------------------- /.github/workflows/os.yml: -------------------------------------------------------------------------------- 1 | name: __os__ 2 | on: 3 | workflow_call: 4 | inputs: 5 | BOARD: 6 | required: true 7 | type: string 8 | PLATFORM: 9 | required: true 10 | type: string 11 | SUFFIX: 12 | required: false 13 | type: string 14 | default: 15 | OLED: 16 | required: false 17 | type: string 18 | default: 19 | FAN: 20 | required: false 21 | type: string 22 | default: 23 | secrets: 24 | DEPLOY_KEY: 25 | required: true 26 | 27 | 28 | jobs: 29 | os: 30 | runs-on: ubuntu-latest 31 | env: 32 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 33 | BOARD: "${{inputs.BOARD}}" 34 | PLATFORM: "${{inputs.PLATFORM}}" 35 | SUFFIX: "${{inputs.SUFFIX}}" 36 | OLED: "${{inputs.OLED}}" 37 | FAN: "${{inputs.FAN}}" 38 | TERM: xterm 39 | steps: 40 | - name: Checkout 41 | uses: actions/checkout@v2 42 | 43 | - name: Configuring SSH 44 | run: | 45 | test -n "$DEPLOY_KEY" 46 | mkdir ~/.ssh 47 | chmod 700 ~/.ssh 48 | ssh-keyscan -H files.pikvm.org > ~/.ssh/known_hosts 49 | echo "$DEPLOY_KEY" > ~/.ssh/id_rsa 50 | chmod 600 ~/.ssh/id_rsa 51 | 52 | - name: Creating config.mk 53 | run: | 54 | echo "BOARD=$BOARD" > config.mk 55 | echo "PLATFORM=$PLATFORM" >> config.mk 56 | echo "DEPLOY_USER=data" >> config.mk 57 | echo "SUFFIX=$SUFFIX" >> config.mk 58 | echo "OLED=$OLED" >> config.mk 59 | echo "FAN=$FAN" >> config.mk 60 | 61 | - name: Building OS 62 | run: make os NC=1 63 | 64 | - name: Making image 65 | run: make image IMAGE_XZ=1 66 | 67 | - name: Uploading image 68 | run: make upload 69 | -------------------------------------------------------------------------------- /.github/workflows/v1-hdmi-rpi2.yml: -------------------------------------------------------------------------------- 1 | name: v1-hdmi-rpi2 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi2 10 | PLATFORM: v1-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v1-hdmi-rpi3.yml: -------------------------------------------------------------------------------- 1 | name: v1-hdmi-rpi3 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi3 10 | PLATFORM: v1-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v1-hdmi-zero2w.yml: -------------------------------------------------------------------------------- 1 | name: v1-hdmi-zero2w 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: zero2w 10 | PLATFORM: v1-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v1-hdmiusb-rpi2.yml: -------------------------------------------------------------------------------- 1 | name: v1-hdmiusb-rpi2 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi2 10 | PLATFORM: v1-hdmiusb 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v1-hdmiusb-rpi3.yml: -------------------------------------------------------------------------------- 1 | name: v1-hdmiusb-rpi3 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi3 10 | PLATFORM: v1-hdmiusb 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v1-hdmiusb-zero2w.yml: -------------------------------------------------------------------------------- 1 | name: v1-hdmiusb-zero2w 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: zero2w 10 | PLATFORM: v1-hdmiusb 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v2-hdmi-rpi3.yml: -------------------------------------------------------------------------------- 1 | name: v2-hdmi-rpi3 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi3 10 | PLATFORM: v2-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v2-hdmi-rpi4.yml: -------------------------------------------------------------------------------- 1 | name: v2-hdmi-rpi4 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi4 10 | PLATFORM: v2-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v2-hdmi-zero2w.yml: -------------------------------------------------------------------------------- 1 | name: v2-hdmi-zero2w 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: zero2w 10 | PLATFORM: v2-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v2-hdmiusb-rpi4.yml: -------------------------------------------------------------------------------- 1 | name: v2-hdmiusb-rpi4 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi4 10 | PLATFORM: v2-hdmiusb 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v3-hdmi-rpi4-box.yml: -------------------------------------------------------------------------------- 1 | name: v3-hdmi-rpi4-box 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi4 10 | PLATFORM: v3-hdmi 11 | SUFFIX: -box 12 | OLED: 1 13 | FAN: 1 14 | secrets: 15 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 16 | -------------------------------------------------------------------------------- /.github/workflows/v3-hdmi-rpi4.yml: -------------------------------------------------------------------------------- 1 | name: v3-hdmi-rpi4 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi4 10 | PLATFORM: v3-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v4mini-hdmi-rpi4.yml: -------------------------------------------------------------------------------- 1 | name: v4mini-hdmi-rpi4 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi4 10 | PLATFORM: v4mini-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.github/workflows/v4plus-hdmi-rpi4.yml: -------------------------------------------------------------------------------- 1 | name: v4plus-hdmi-rpi4 2 | on: workflow_dispatch 3 | 4 | 5 | jobs: 6 | os: 7 | uses: pikvm/os/.github/workflows/os.yml@master 8 | with: 9 | BOARD: rpi4 10 | PLATFORM: v4plus-hdmi 11 | secrets: 12 | DEPLOY_KEY: "${{secrets.DEPLOY_KEY}}" 13 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.pi-builder/ 2 | /images/ 3 | /config.mk 4 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | -include config.mk 2 | 3 | PLATFORM ?= v2-hdmi 4 | SUFFIX ?= 5 | export BOARD ?= rpi4 6 | export ARCH ?= arm 7 | export PROJECT ?= pikvm-os.$(PLATFORM)$(SUFFIX) 8 | export STAGES ?= __init__ os pikvm-repo pistat watchdog rootdelay ro pikvm restore-mirrorlist __cleanup__ 9 | export NC ?= 10 | 11 | export HOSTNAME ?= pikvm 12 | export LOCALE ?= en_US 13 | export TIMEZONE ?= UTC 14 | export ARCH_DIST_REPO_URL ?= http://de3.mirror.archlinuxarm.org 15 | BUILD_OPTS ?= 16 | 17 | ROOT_PASSWD ?= root 18 | WEBUI_ADMIN_PASSWD ?= admin 19 | IPMI_ADMIN_PASSWD ?= admin 20 | 21 | export DISK ?= $(shell pwd)/disk/$(word 1,$(subst -, ,$(PLATFORM))).conf 22 | export CARD ?= /dev/null 23 | export IMAGE_XZ ?= 24 | 25 | DEPLOY_USER ?= root 26 | 27 | 28 | # ===== 29 | SHELL = /usr/bin/env bash 30 | _BUILDER_DIR = ./.pi-builder/$(PLATFORM)-$(BOARD)-$(ARCH)$(SUFFIX) 31 | 32 | define optbool 33 | $(filter $(shell echo $(1) | tr A-Z a-z),yes on 1) 34 | endef 35 | 36 | define fv 37 | $(shell curl --silent "https://files.pikvm.org/repos/arch/$(BOARD)-$(ARCH)/latest/$(1)") 38 | endef 39 | 40 | 41 | # ===== 42 | all: 43 | @ echo "Available commands:" 44 | @ echo " make # Print this help" 45 | @ echo " make os # Build OS with your default config" 46 | @ echo " make shell # Run Arch-ARM shell" 47 | @ echo " make install # Install rootfs to partitions on $(CARD)" 48 | @ echo " make image # Create a binary image for burning outside of make install" 49 | @ echo " make scan # Find all RPi devices in the local network" 50 | @ echo " make clean # Remove the generated rootfs" 51 | @ echo " make clean-all # Remove the generated rootfs and pi-builder toolchain" 52 | 53 | 54 | shell: $(_BUILDER_DIR) 55 | $(MAKE) -C $(_BUILDER_DIR) shell 56 | 57 | 58 | os: $(_BUILDER_DIR) 59 | rm -rf $(_BUILDER_DIR)/stages/arch/{pikvm,pikvm-otg-console} 60 | cp -a stages/arch/{pikvm,pikvm-otg-console} $(_BUILDER_DIR)/stages/arch 61 | $(MAKE) -C $(_BUILDER_DIR) os \ 62 | BUILD_OPTS=' $(BUILD_OPTS) \ 63 | --build-arg PLATFORM=$(PLATFORM) \ 64 | --build-arg OLED=$(call optbool,$(OLED)) \ 65 | --build-arg VERSIONS=$(call fv,ustreamer)/$(call fv,kvmd)/$(call fv,kvmd-webterm)/$(call fv,kvmd-fan) \ 66 | --build-arg FAN=$(call optbool,$(FAN)) \ 67 | --build-arg ROOT_PASSWD=$(ROOT_PASSWD) \ 68 | --build-arg WEBUI_ADMIN_PASSWD=$(WEBUI_ADMIN_PASSWD) \ 69 | --build-arg IPMI_ADMIN_PASSWD=$(IPMI_ADMIN_PASSWD) \ 70 | ' 71 | 72 | 73 | $(_BUILDER_DIR): 74 | mkdir -p `dirname $(_BUILDER_DIR)` 75 | git clone --depth=1 https://github.com/mdevaev/pi-builder $(_BUILDER_DIR) 76 | 77 | 78 | update: $(_BUILDER_DIR) 79 | cd $(_BUILDER_DIR) && git pull --rebase 80 | git pull --rebase 81 | 82 | 83 | install: $(_BUILDER_DIR) 84 | $(MAKE) -C $(_BUILDER_DIR) install 85 | 86 | 87 | image: $(_BUILDER_DIR) 88 | $(eval _dir := images/$(PLATFORM)-$(BOARD)/$(ARCH)) 89 | $(eval _dated := $(PLATFORM)-$(BOARD)-$(ARCH)$(SUFFIX)-$(shell date +%Y%m%d).img) 90 | $(eval _latest := $(PLATFORM)-$(BOARD)-$(ARCH)$(SUFFIX)-latest.img) 91 | $(eval _suffix = $(if $(call optbool,$(IMAGE_XZ)),.xz,)) 92 | mkdir -p $(_dir) 93 | $(MAKE) -C $(_BUILDER_DIR) image IMAGE=$(shell pwd)/$(_dir)/$(_dated) 94 | cd $(_dir) && ln -sf $(_dated)$(_suffix) $(_latest)$(_suffix) 95 | cd $(_dir) && ln -sf $(_dated)$(_suffix).sha1 $(_latest)$(_suffix).sha1 96 | 97 | 98 | scan: $(_BUILDER_DIR) 99 | $(MAKE) -C $(_BUILDER_DIR) scan 100 | 101 | 102 | clean: $(_BUILDER_DIR) 103 | $(MAKE) -C $(_BUILDER_DIR) clean 104 | 105 | 106 | clean-all: 107 | - $(MAKE) -C $(_BUILDER_DIR) clean-all 108 | rm -rf $(_BUILDER_DIR) 109 | - rmdir `dirname $(_BUILDER_DIR)` 110 | 111 | 112 | upload: 113 | rsync -rl --progress \ 114 | images/ \ 115 | $(DEPLOY_USER)@files.pikvm.org:/var/www/files.pikvm.org/images 116 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # PiKVM OS Images 2 | [![os](https://github.com/pikvm/os/actions/workflows/v4mini-hdmi-rpi4.yml/badge.svg)](https://github.com/pikvm/os/actions/workflows/v4mini-hdmi-rpi4.yml) 3 | 4 | [![os](https://github.com/pikvm/os/actions/workflows/v4plus-hdmi-rpi4.yml/badge.svg)](https://github.com/pikvm/os/actions/workflows/v4plus-hdmi-rpi4.yml) 5 | 6 | [![os](https://github.com/pikvm/os/actions/workflows/v3-hdmi-rpi4.yml/badge.svg)](https://github.com/pikvm/os/actions/workflows/v3-hdmi-rpi4.yml) 7 | 8 | [![os](https://github.com/pikvm/os/actions/workflows/v3-hdmi-rpi4-box.yml/badge.svg)](https://github.com/pikvm/os/actions/workflows/v3-hdmi-rpi4-box.yml) 9 | 10 | [![os](https://github.com/pikvm/os/actions/workflows/v2-hdmi-rpi4.yml/badge.svg)](https://github.com/pikvm/os/actions/workflows/v2-hdmi-rpi4.yml) 11 | 12 | [![os](https://github.com/pikvm/os/actions/workflows/v2-hdmiusb-rpi4.yml/badge.svg)](https://github.com/pikvm/os/actions/workflows/v2-hdmiusb-rpi4.yml) 13 | 14 | [![os](https://github.com/pikvm/os/actions/workflows/v2-hdmi-zero2w.yml/badge.svg)](https://github.com/pikvm/os/actions/workflows/v2-hdmi-zero2w.yml) 15 | 16 | The built images are published here: https://files.pikvm.org 17 | -------------------------------------------------------------------------------- /disk/v0.conf: -------------------------------------------------------------------------------- 1 | mklabel msdos 2 | mkpart primary fat32 0 256MiB # label=PIBOOT mount=/boot 3 | mkpart primary ext4 256MiB 512MiB # label=PIPST mount=/var/lib/kvmd/pst 4 | mkpart primary ext4 512MiB 6656MiB # label=PIROOT mount=/ 5 | -------------------------------------------------------------------------------- /disk/v1.conf: -------------------------------------------------------------------------------- 1 | v0.conf -------------------------------------------------------------------------------- /disk/v2.conf: -------------------------------------------------------------------------------- 1 | mklabel msdos 2 | mkpart primary fat32 0 256MiB # label=PIBOOT mount=/boot 3 | mkpart primary ext4 256MiB 512MiB # label=PIPST mount=/var/lib/kvmd/pst reserved=0 4 | mkpart primary ext4 512MiB 6656MiB # label=PIROOT mount=/ 5 | mkpart primary ext4 6656MiB 100% # label=PIMSD mount=/var/lib/kvmd/msd reserved=0 6 | -------------------------------------------------------------------------------- /disk/v3.conf: -------------------------------------------------------------------------------- 1 | v2.conf -------------------------------------------------------------------------------- /disk/v4mini.conf: -------------------------------------------------------------------------------- 1 | v2.conf -------------------------------------------------------------------------------- /disk/v4plus.conf: -------------------------------------------------------------------------------- 1 | v2.conf -------------------------------------------------------------------------------- /stages/arch/pikvm-otg-console/0000-vendor-otg-serial.yaml: -------------------------------------------------------------------------------- 1 | # Generated by OS builder. Do not edit this file! 2 | otg: 3 | devices: 4 | serial: 5 | enabled: true 6 | -------------------------------------------------------------------------------- /stages/arch/pikvm-otg-console/Dockerfile.part: -------------------------------------------------------------------------------- 1 | RUN systemctl enable getty@ttyGS0.service 2 | 3 | RUN echo ttyGS0 >> /etc/securetty 4 | 5 | RUN mkdir /etc/systemd/system/getty@ttyGS0.service.d 6 | COPY stages/pikvm-otg-console/ttyGS0.override /etc/systemd/system/getty@ttyGS0.service.d/override.conf 7 | 8 | COPY stages/pikvm-otg-console/0000-vendor-otg-serial.yaml /etc/kvmd/override.d/ 9 | -------------------------------------------------------------------------------- /stages/arch/pikvm-otg-console/ttyGS0.override: -------------------------------------------------------------------------------- 1 | # https://github.com/raspberrypi/linux/issues/1929 2 | [Service] 3 | TTYReset=no 4 | TTYVHangup=no 5 | TTYVTDisallocate=no 6 | -------------------------------------------------------------------------------- /stages/arch/pikvm/Dockerfile.part: -------------------------------------------------------------------------------- 1 | ARG PLATFORM 2 | ENV PLATFORM=$PLATFORM 3 | 4 | ARG VERSIONS 5 | ENV VERSIONS=$VERSIONS 6 | 7 | ARG OLED 8 | ENV OLED=$OLED 9 | 10 | ARG FAN 11 | ENV FAN=$FAN 12 | 13 | RUN echo $PLATFORM $VERSIONS 14 | 15 | RUN pacman --noconfirm --ask=4 -Syu \ 16 | && pacman --noconfirm --ask=4 -S pikvm-os-raspberrypi \ 17 | && (mv /boot/config.txt.pacsave /boot/config.txt || true) \ 18 | && (mv /boot/cmdline.txt.pacsave /boot/cmdline.txt || true) \ 19 | && rm -rf /var/cache/pacman/pkg/* /boot/*.pacnew 20 | 21 | RUN pkg-install --assume-installed tessdata \ 22 | kvmd-platform-$PLATFORM-$BOARD \ 23 | kvmd-webterm \ 24 | kvmd-fan \ 25 | tesseract \ 26 | tesseract-data-eng \ 27 | wiringpi \ 28 | pastebinit \ 29 | tmate \ 30 | vi-vim-symlink \ 31 | nano-syntax-highlighting \ 32 | avahi \ 33 | hostapd \ 34 | && if [[ $PLATFORM =~ ^v4.*$ ]]; then pkg-install flashrom-pikvm; fi 35 | 36 | ENV PART_OPTS=nodev,nosuid,noexec,ro,errors=remount-ro 37 | RUN echo "LABEL=PIPST /var/lib/kvmd/pst ext4 $PART_OPTS,X-kvmd.pst-user=kvmd-pst 0 2" >> /etc/fstab 38 | RUN systemctl enable kvmd-bootconfig \ 39 | && systemctl enable kvmd \ 40 | && systemctl enable kvmd-pst \ 41 | && systemctl enable kvmd-nginx \ 42 | && systemctl enable kvmd-webterm \ 43 | && if [[ $PLATFORM =~ ^.*-hdmi$ ]]; then systemctl enable kvmd-tc358743; fi \ 44 | && if [[ $PLATFORM =~ ^v0.*$ ]]; then systemctl mask serial-getty@ttyAMA0.service; fi \ 45 | && if [[ $PLATFORM =~ ^v[234].*$ ]]; then \ 46 | systemctl enable kvmd-otg \ 47 | && echo "LABEL=PIMSD /var/lib/kvmd/msd ext4 $PART_OPTS,X-kvmd.otgmsd-user=kvmd 0 2" >> /etc/fstab \ 48 | ; fi \ 49 | && if [[ $BOARD =~ ^rpi4|zero2w$ && $PLATFORM =~ ^v[234].*-hdmi$ ]]; then systemctl enable kvmd-janus kvmd-media; fi \ 50 | && if [[ $BOARD =~ ^rpi3$ && $PLATFORM =~ ^v[1].*-hdmi$ ]]; then systemctl enable kvmd-janus kvmd-media; fi \ 51 | && if [[ $PLATFORM =~ ^v[34].*$ ]]; then systemctl enable kvmd-watchdog; fi \ 52 | && if [[ -n "$OLED" || $PLATFORM =~ ^v4.*$ ]]; then systemctl enable kvmd-oled kvmd-oled-reboot kvmd-oled-shutdown; fi \ 53 | && if [[ -n "$FAN" || $PLATFORM == v4plus-hdmi ]]; then systemctl enable kvmd-fan; fi 54 | 55 | COPY stages/pikvm/nanorc /etc/skel/.nanorc 56 | RUN cp -a /etc/skel/.nanorc /root \ 57 | && cp -a /etc/skel/.nanorc /home/kvmd-webterm \ 58 | && chown kvmd-webterm:kvmd-webterm /home/kvmd-webterm/.nanorc 59 | 60 | COPY stages/pikvm/motd /etc/ 61 | COPY stages/pikvm/issue /etc/ 62 | 63 | RUN sed -i -f /usr/share/kvmd/configs.default/os/cmdline/$PLATFORM-$BOARD.sed /boot/cmdline.txt \ 64 | && cp /usr/share/kvmd/configs.default/os/boot-config/$PLATFORM-$BOARD.txt /boot/config.txt 65 | 66 | ARG ROOT_PASSWD 67 | ENV ROOT_PASSWD=$ROOT_PASSWD 68 | RUN echo "root:$ROOT_PASSWD" | chpasswd \ 69 | && echo "PermitRootLogin yes" >> /etc/ssh/sshd_config \ 70 | && userdel -r -f alarm 71 | 72 | ARG WEBUI_ADMIN_PASSWD 73 | ENV WEBUI_ADMIN_PASSWD=$WEBUI_ADMIN_PASSWD 74 | RUN echo "$WEBUI_ADMIN_PASSWD" | kvmd-htpasswd set --read-stdin admin 75 | 76 | ARG IPMI_ADMIN_PASSWD 77 | ENV IPMI_ADMIN_PASSWD=$IPMI_ADMIN_PASSWD 78 | RUN sed -i "\$d" /etc/kvmd/ipmipasswd \ 79 | && echo "admin:$IPMI_ADMIN_PASSWD -> admin:$WEBUI_ADMIN_PASSWD" >> /etc/kvmd/ipmipasswd 80 | 81 | RUN rm -f /etc/ssh/ssh_host_*_key* /etc/kvmd/nginx/ssl/* /etc/kvmd/vnc/ssl/* 82 | 83 | RUN echo "FIRST_BOOT=1" > /boot/pikvm.txt 84 | -------------------------------------------------------------------------------- /stages/arch/pikvm/issue: -------------------------------------------------------------------------------- 1 | Welcome to PiKVM - The Open Source KVM over IP on Raspberry Pi 2 | \S \r (\l) 3 | IP: \4 4 | -------------------------------------------------------------------------------- /stages/arch/pikvm/motd: -------------------------------------------------------------------------------- 1 | _____ _ _ ____ ____ __ 2 | | __ (_)| |/ /\ \ / / \/ | 3 | | |__) | | ' / \ \ / /| \ / | 4 | | ___/ || < \ \/ / | |\/| | 5 | | | | || . \ \ / | | | | 6 | |_| |_||_|\_\ \/ |_| |_| 7 | 8 | Welcome to PiKVM - The Open Source KVM over IP on Raspberry Pi 9 | ____________________________________________________________________________ 10 | 11 | The root filesystem of PiKVM is mounted in the read-only mode by default. 12 | Use command "rw" to remount it in the RW-mode and "ro" to switch it back. 13 | If the filesystem is busy and doesn't switch to the RO-mode, use "reboot" 14 | to reboot the device, don't leave it in the RW-mode. 15 | 16 | Useful commands: 17 | * Preventing kernel messages in the console: dmesg -n 1 18 | * Changing the Web UI password: kvmd-htpasswd set admin 19 | * Changing the root password: passwd 20 | 21 | Links: 22 | * Official website: https://pikvm.org 23 | * Documentation: https://docs.pikvm.org 24 | * Auth & 2FA: https://docs.pikvm.org/auth 25 | * Networking: https://wiki.archlinux.org/title/systemd-networkd 26 | 27 | -------------------------------------------------------------------------------- /stages/arch/pikvm/nanorc: -------------------------------------------------------------------------------- 1 | include /usr/share/nano-syntax-highlighting/yaml.nanorc 2 | set linenumbers 3 | set tabsize 4 4 | set tabstospaces 5 | --------------------------------------------------------------------------------