From fbaa80270894a35f6eff2009daeced6220e060a5 Mon Sep 17 00:00:00 2001 From: Craig Schardt Date: Mon, 29 Jul 2024 19:19:07 -0500 Subject: [PATCH] Improvements for the OPi image (#19) Improve network configuration and boot behavior for the OrangePi5 Ubuntu 24.04 image and add support for the OrangePi5 Pro. --- .github/workflows/main.yml | 9 ++- OPi5_CIDATA/meta-data | 18 ++++++ OPi5_CIDATA/network-config | 35 +++++++++++ OPi5_CIDATA/user-data | 118 +++++++++++++++++++++++++++++++++++++ install_opi5.sh | 77 +++++++++++++++++------- 5 files changed, 232 insertions(+), 25 deletions(-) create mode 100644 OPi5_CIDATA/meta-data create mode 100644 OPi5_CIDATA/network-config create mode 100644 OPi5_CIDATA/user-data diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 66e96f6..e86d241 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -33,6 +33,9 @@ jobs: - name: opi5plus script: ./install_opi5.sh base_image: https://github.com/Joshua-Riek/ubuntu-rockchip/releases/download/v2.1.0/ubuntu-24.04-preinstalled-server-arm64-orangepi-5-plus.img.xz + - name: opi5pro + script: ./install_opi5.sh + base_image: https://github.com/Joshua-Riek/ubuntu-rockchip/releases/download/v2.1.0/ubuntu-24.04-preinstalled-server-arm64-orangepi-5-pro.img.xz name: "Build for ${{ matrix.name }}" @@ -58,7 +61,7 @@ jobs: mv ${{ steps.install_deps.outputs.image }} photonvision_${{ matrix.name }}.img sudo xz -T 0 -v photonvision_${{ matrix.name }}.img - - uses: actions/upload-artifact@v4.3.3 + - uses: actions/upload-artifact@v4.3.4 with: name: photonvision_${{ matrix.name }}.img.xz path: photonvision_${{ matrix.name }}.img.xz @@ -70,7 +73,7 @@ jobs: runs-on: ubuntu-22.04 steps: # Download literally every single artifact - - uses: actions/download-artifact@v4.1.7 + - uses: actions/download-artifact@v4.1.8 - run: find # Push to dev release - uses: pyTooling/Actions/releaser@v1.0.5 @@ -82,7 +85,7 @@ jobs: **/*.xz if: github.event_name == 'push' # Upload all xz archives to GH tag if tagged - - uses: softprops/action-gh-release@v2.0.6 + - uses: softprops/action-gh-release@v2.0.8 with: files: | **/*.xz diff --git a/OPi5_CIDATA/meta-data b/OPi5_CIDATA/meta-data new file mode 100644 index 0000000..c0ec3f7 --- /dev/null +++ b/OPi5_CIDATA/meta-data @@ -0,0 +1,18 @@ +# This is the meta-data configuration file for cloud-init. Please refer to the +# cloud-init documentation for more information: +# +# https://cloudinit.readthedocs.io/ + +# Set the datasource mode to "local". This ensures that user-data is acted upon +# prior to bringing up the network (because everything about the datasource is +# assumed to be local). If you wish to use an HTTP datasource instead, you can +# change this to "net" or override it on the kernel cmdline (see README). +dsmode: local + +# Specifies the "unique" identifier of the instance. Typically in cloud-init +# this is generated by the owning cloud and is actually unique (to some +# degree). Here our data-source is local, so this is just a fixed string. +# Warning: changing this will cause cloud-init to assume it is running on a +# "new" instance, and to go through first time setup again (the value is +# compared to a cached copy). +instance-id: cloud-image diff --git a/OPi5_CIDATA/network-config b/OPi5_CIDATA/network-config new file mode 100644 index 0000000..b5465a2 --- /dev/null +++ b/OPi5_CIDATA/network-config @@ -0,0 +1,35 @@ +# This file contains a netplan-compatible configuration which cloud-init will +# apply on first-boot (note: it will *not* update the config after the first +# boot). Please refer to the cloud-init documentation and the netplan reference +# for full details: +# +# https://netplan.io/reference +# https://cloudinit.readthedocs.io/en/latest/topics/network-config.html +# https://cloudinit.readthedocs.io/en/latest/topics/network-config-format-v2.html +# +# Please note that the YAML format employed by this file is sensitive to +# differences in whitespace; if you are editing this file in an editor (like +# Notepad) which uses literal tabs, take care to only use spaces for +# indentation. See the following link for more details: +# +# https://en.wikipedia.org/wiki/YAML + +# Some additional examples are commented out below + +network: + version: 2 + renderer: NetworkManager + ethernets: + zz-all-en: + renderer: NetworkManager + match: + name: "en*" + dhcp4: true + optional: true + zz-all-eth: + renderer: NetworkManager + match: + name: "eth*" + dhcp4: true + optional: true + diff --git a/OPi5_CIDATA/user-data b/OPi5_CIDATA/user-data new file mode 100644 index 0000000..a4bd227 --- /dev/null +++ b/OPi5_CIDATA/user-data @@ -0,0 +1,118 @@ +#cloud-config + +# This is the user-data configuration file for cloud-init. By default this sets +# up an initial user called "ubuntu" with password "ubuntu", which must be +# changed at first login. However, many additional actions can be initiated on +# first boot from this file. The cloud-init documentation has more details: +# +# https://cloudinit.readthedocs.io/ +# +# Please note that the YAML format employed by this file is sensitive to +# differences in whitespace; if you are editing this file in an editor (like +# Notepad) which uses literal tabs, take care to only use spaces for +# indentation. See the following link for more details: +# +# https://en.wikipedia.org/wiki/YAML +# +# Some additional examples are provided in comments below the default +# configuration. + +# The (default) ubuntu user must be in the video group for hardware acceleration +users: + - default + - name: ubuntu + groups: video + +# On first boot, set the (default) ubuntu user's password to "ubuntu" and +# expire user passwords +chpasswd: + expire: true + users: + - name: ubuntu + password: ubuntu + type: text + +## Set the system's hostname. Please note that, unless you have a local DNS +## setup where the hostname is derived from DHCP requests (as with dnsmasq), +## setting the hostname here will not make the machine reachable by this name. +## You may also wish to install avahi-daemon (see the "packages:" key below) +## to make your machine reachable by the .local domain +hostname: photonvision + +## Set up the keyboard layout. See localectl(1), in particular the various +## list-x11-* sub-commands, to determine the available models, layouts, +## variants, and options +#keyboard: +# model: pc105 +# layout: gb +# variant: +# options: ctrl:nocaps + +# Enable password authentication with the SSH daemon +ssh_pwauth: true + +## On first boot, use ssh-import-id to give the specific users SSH access to +## the default user +#ssh_import_id: +#- lp:my_launchpad_username +#- gh:my_github_username + +## Add users and groups to the system, and import keys with the ssh-import-id +## utility +#groups: +#- robot: [robot] +#- robotics: [robot] +#- pi +# +#users: +#- default +#- name: robot +# gecos: Mr. Robot +# primary_group: robot +# groups: users +# ssh_import_id: foobar +# lock_passwd: false +# passwd: $5$hkui88$nvZgIle31cNpryjRfO9uArF7DYiBcWEnjqq7L1AQNN3 + +## Update apt database and upgrade packages on first boot +#package_update: true +#package_upgrade: true + +## Install additional packages on first boot +#packages: +#- avahi-daemon +#- rng-tools +#- python3-gpiozero +#- [python3-serial, 3.5-1] + +## Write arbitrary files to the file-system (including binaries!) +#write_files: +#- path: /etc/default/console-setup +# content: | +# # Consult the console-setup(5) manual page. +# ACTIVE_CONSOLES="/dev/tty[1-6]" +# CHARMAP="UTF-8" +# VIDEOMODE= +# FONT="Lat15-Terminus18x10.psf.gz" +# FONTFACE= +# FONTSIZE= +# CODESET="Lat15" +# permissions: '0644' +# owner: root:root +#- encoding: gzip +# path: /root/Makefile +# content: !!binary | +# H4sICF2DTWIAA01ha2VmaWxlAFNWCM8syVBILMjPyU/PTC1WKMlXiPB2dlFQNjSx5MpNteLi +# dLDiSoRQxYl5KeWZyRkgXrSCkoqKRmaKgm6pppKCbmqhgoFCrIKamkK1QmpyRr6Ckn92YqWS +# NdC80uQMBZhOa4VahZoaqIrwjMQSewXfxOxUhcwShcr80qLi1Jw0RSUuAIYfEJmVAAAA +# owner: root:root +# permissions: '0644' + +## Run arbitrary commands at rc.local like time +#runcmd: +#- [ ls, -l, / ] +#- [ sh, -xc, "echo $(date) ': hello world!'" ] +#- [ wget, "http://ubuntu.com", -O, /run/mydir/index.html ] + +runcmd: +- [ touch, /etc/cloud/cloud-init.disabled ] diff --git a/install_opi5.sh b/install_opi5.sh index 146ff29..4f313d9 100755 --- a/install_opi5.sh +++ b/install_opi5.sh @@ -4,58 +4,91 @@ if id "$1" >/dev/null 2>&1; then echo 'user found' else echo "creating pi user" - useradd pi -b /home + useradd pi -m -b /home -s /bin/bash usermod -a -G sudo pi - mkdir /home/pi - chown -R pi /home/pi - echo 'pi ALL=(ALL) NOPASSWD: ALL' | tee -a /etc/sudoers.d/010_pi-nopasswd >/dev/null chmod 0440 /etc/sudoers.d/010_pi-nopasswd fi echo "pi:raspberry" | chpasswd -apt-get update +apt-get update --quiet + +before=$(df --output=used / | tail -n1) +# clean up stuff +echo 'Purging snaps' +# get rid of snaps +rm -rf /var/lib/snapd/seed/snaps/* +rm -f /var/lib/snapd/seed/seed.yaml +apt-get purge --yes --quiet lxd-installer lxd-agent-loader +apt-get purge --yes --quiet snapd + +# remove bluetooth daemon +apt-get purge --yes --quiet bluez + +apt-get --yes --quiet autoremove + +after=$(df --output=used / | tail -n1) +freed=$(( before - after )) + +echo "Freed up $freed KiB" + +# run Photonvision install script wget https://git.io/JJrEP -O install.sh chmod +x install.sh -sed -i 's/# AllowedCPUs=4-7/AllowedCPUs=4-7/g' install.sh +sed -i 's/# AllowedCPUs=4-7/AllowedCPUs=0-7/g' install.sh -./install.sh -n -q +./install.sh -m -q rm install.sh +echo "Installing additional things" -# Remove extra packages -echo "Purging extra things" -# apt-get remove -y gdb gcc g++ linux-headers* libgcc*-dev -# apt-get remove -y snapd -apt-get autoremove -y +apt-get install --yes --quiet network-manager net-tools libatomic1 +# let netplan create the config during cloud-init +rm -f /etc/netplan/00-default-nm-renderer.yaml -echo "Installing additional things" -sudo apt-get update -apt-get install -y network-manager net-tools libatomic1 +# set NetworkManager as the renderer in cloud-init +cp -f ./OPi5_CIDATA/network-config /boot/network-config -apt-get install -y libc6 libstdc++6 +# add customized user-data file for cloud-init +cp -f ./OPi5_CIDATA/user-data /boot/user-data -# cat > /etc/netplan/00-default-nm-renderer.yaml < /etc/NetworkManager/conf.d/50-ignore-carrier.conf <