Compare commits

..

4 Commits
r9 ... r8

Author SHA1 Message Date
bf41e7c325 added rpm db rebuild in post section 2023-11-21 23:12:57 -05:00
Skip Grube
8bfc816e12 Small fixes to readme
-Skip G.
2023-06-09 13:29:44 -04:00
Skip Grube
fd4980215e Fixed naming of .ks file
-Skip G.
2023-06-05 22:56:56 -04:00
Skip Grube
bd2bea3bfc
Updated kickstart for 8.7
-Skip G.
2022-11-27 21:55:23 -05:00
6 changed files with 83 additions and 160 deletions

View File

@ -2,7 +2,7 @@
Scripts and kickstarts for building Rocky Linux for Raspberry Pi
## Purpose of this Repo
This repository contains kickstart scripts and commands for producing your own Rocky Linux 9 image for the Raspberry Pi. It's intended mostly for developers or other technical users. If you are simply interested in using Rocky on your Pi, it's much easier to grab the latest image from (currently): https://dl.rockylinux.org/pub/rocky/9/rockyrpi/aarch64/images/
This repository contains kickstart scripts and commands for producing your own Rocky Linux 8 image for the Raspberry Pi. It's intended mostly for developers or other technical users. If you are simply interested in using Rocky on your Pi, it's much easier to grab the latest image from (currently): https://dl.rockylinux.org/pub/rocky/8/rockyrpi/aarch64/images/
The readme.image.txt file has information and instructions for those interested in downloading and using the ready-made image.
@ -12,13 +12,12 @@ The readme.image.txt file has information and instructions for those interested
Producing the Rpi Image requires:
* Fedora 34 or higher, OR an EL9-based distribution **running on aarch64 hardware**
* NOTE: It MUST be EL9, or you will have RPMDB+SELinux issues! We do not support building this image on EL8 or lower
* A Fedora or EL-based distribution (Rocky/CentOS/RHEL/etc.) **running on aarch64 hardware**
* Packages
* git
* epel-release (if using an EL distro)
* appliance-tools (contains the appliance-creator program that makes the image)
* EPEL repo enabled (extra packages for enterprise linux)
* The appliance-creator program from appliance-tools package ( ```sudo dnf install appliance-tools``` )
## Making an Image
@ -26,7 +25,7 @@ The included script to create the image is quite simple. Simply run it (with su
For example:
`sudo ./createRocky9_Image.sh /home/myhomefolder/Rocky9_image/`
`sudo ./createRocky8_Image.sh /home/myhomefolder/Rocky8_image/`
The kickstart/image build process takes approximately 10 minutes on a Raspberry Pi 4 with a decently fast internet connection. Alternatively, you should be able to use any aarch64 hardware that meets the above requirements(Amazon EC2, etc)
@ -34,7 +33,7 @@ The kickstart/image build process takes approximately 10 minutes on a Raspberry
## Customizing the Kickstart
All the setup logic for the image is contained within the kickstart file (Rocky9_Rpi.ks). It is intended to be readable and well documented, and you can of course change it anyway you please to produce custom images yourself.
All the setup logic for the image is contained within the kickstart file (Rocky8_Rpi.ks). It is intended to be readable and well documented, and you can of course change it anyway you please to produce custom images yourself.
# Contributing

View File

@ -1,5 +1,27 @@
# Kickstart to build Rocky 8 image for Raspberry Pi 4 hardware (aarch64)
#
# (many parts liberally grabbed from pgreco: https://github.com/psgreco/sig-core-AltArch/tree/master/image_build )
#
# Here is how to build this kickstart Raspberry Pi image, inside a clean mock chroot environment with livemedia-creator:
# (it is very similar to how the other kickstarts are built, but aarch64 must be used, and the livemedia appliance option)
#
#
# Set up mock env, and get a shell inside the chroot:
#
# mock -r rocky-8-aarch64 --init
# mock -r rocky-8-aarch64 --install lorax-lmc-novirt vim pykickstart git
# sudo setenforce 0
# mock -r rocky-8-aarch64 --shell --isolation=simple --enable-network
#
# Inside the shell:
# git clone https://github.com/rocky-linux/kickstarts
# git checkout r8
# cd kickstarts/altarch
#
# Finally, run the image creation:
#
# livemedia-creator --ks rockyrpi.ks --image-only --image-name RockyRpi --make-disk --resultdir /rockyrpi_result --no-virt
# Disk setup
clearpart --initlabel --all
@ -8,16 +30,16 @@ part swap --asprimary --fstype=swap --size=512 --label=swap
part / --asprimary --fstype=ext4 --size=2800 --label=RPIROOT
# Repos setup:
url --url http://download.rockylinux.org/pub/rocky/9/BaseOS/aarch64/os/
repo --name="BaseOS" --baseurl=http://download.rockylinux.org/pub/rocky/9/BaseOS/aarch64/os/ --cost=100
repo --name="AppStream" --baseurl=http://download.rockylinux.org/pub/rocky/9/AppStream/aarch64/os/ --cost=200 --install
repo --name="CRB" --baseurl=http://download.rockylinux.org/pub/rocky/9/CRB/aarch64/os/ --cost=300 --install
url --url http://download.rockylinux.org/pub/rocky/8/BaseOS/aarch64/os/
repo --name="BaseOS" --baseurl=http://download.rockylinux.org/pub/rocky/8/BaseOS/aarch64/os/ --cost=100
repo --name="AppStream" --baseurl=http://download.rockylinux.org/pub/rocky/8/AppStream/aarch64/os/ --cost=200 --install
repo --name="PowerTools" --baseurl=http://download.rockylinux.org/pub/rocky/8/BaseOS/aarch64/os/ --cost=300 --install
# Rocky Rpi kernel repo, we need a more permanent place for this:
repo --name="rockyrpi" --baseurl=https://download.rockylinux.org/pub/sig/9/altarch/aarch64/altarch-rockyrpi/ --cost=20
repo --name="rockyextras" --baseurl=https://download.rockylinux.org/pub/rocky/9/extras/aarch64/os/ --cost=20
repo --name="rockyrpi" --baseurl=https://download.rockylinux.org/pub/sig/8/altarch/aarch64/altarch-rockyrpi/ --cost=20
repo --name="rockyextras" --baseurl=https://download.rockylinux.org/pub/rocky/8/extras/aarch64/os/ --cost=20
# Install process:
#text
# Install proces:
install
keyboard us --xlayouts=us --vckeymap=us
rootpw --lock
# FIXME user creation here does not work ?
@ -26,19 +48,14 @@ timezone --isUtc --nontp UTC
selinux --enforcing
firewall --enabled --port=22:tcp
network --bootproto=dhcp --device=link --activate --onboot=on
services --enabled=sshd,NetworkManager,chronyd,cpupower
services --enabled=sshd,NetworkManager,chronyd,tuned
shutdown
bootloader --location=none
lang en_US.UTF-8
skipx
# Package selection:
%packages
@core
#-grub2-tools-minimal
#-grub2-tools
#-grubby
#-grub2-common
chrony
cloud-utils-growpart
net-tools
@ -46,13 +63,8 @@ NetworkManager-wifi
vim
bash-completion
nano
kernel-tools
tuned
# Need these for setting default locale of en-US:
langpacks-en
glibc-all-langpacks
# will enable rocky-release-rpi after full 9 release (and we have it in the -extras repo)
rocky-release-rpi
raspberrypi2-firmware
raspberrypi2-kernel4
@ -67,6 +79,9 @@ cat > /boot/cmdline.txt << EOF
console=ttyAMA0,115200 console=tty1 root= rootfstype=ext4 elevator=deadline rootwait
EOF
# Run this once to fix the wifi:
sed -i 's/boardflags3=0x48200100/boardflags3=0x44200100/g' /lib/firmware/brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt
# Apparently kickstart user was not working, attempt to do it here?
/sbin/useradd -c "Rocky Linux default user" -G wheel -m -U rocky
echo "rockylinux" | passwd --stdin rocky
@ -75,18 +90,18 @@ echo "rockylinux" | passwd --stdin rocky
# First, the all-important README :
cat >/home/rocky/README << EOF
== Rocky 9 Raspberry Pi Image ==
== Rocky 8 Raspberry Pi Image ==
This is a Rocky 9 install intended for Raspberry Pi 3b and 4 devices (architecture is aarch64).
This is a Rocky 8 install intended for Raspberry Pi 3b and 4 devices (architecture is aarch64).
This image WILL NOT WORK on a Raspberry Pi 1 or 2 (1.1 or earlier), we are 64-bit only, and have no support for 32-bit ARM processors. Sorry :-/.
The newer Pi Zero devices should be supported, as well as the Raspberry Pi 2 version 1.2 boards, which are 64-bit
The newer Pi Zero devices should be supported, as well as the Raspberry Pi 2 v. 1.2 boards, which are 64-bit
IMAGE NOTES / DIFFERENCES FROM STOCK ROCKY 8:
- Based on Rocky Linux 9, points to production Rocky 9 aarch64 repositories
- Based on Rocky Linux 8, points to production Rocky 8 aarch64 repositories
- Has an additional repository that contains kernel packages for Raspberry Pi
- Includes script that fixes the wifi. Simple edit of a txt firmware settings file. Will need to be run whenever linux-firmware gets upgraded
- Includes @minimal-install , plus a few quality of life packages like vim, bash-completion, etc.
- Initial User "rocky" (default password: "rockylinux"). Root password disabled, rocky user is a sudoer
@ -105,9 +120,20 @@ Thanks for your interest on Rocky-on-Rpi, feel free to share your experience or
EOF
# Run the fix-wifi script (extracts the .xz firmware) - should be installed via the rocky-release-rpi package
# (shouldn't be needed anymore - fixed in newer rpi kernel builds)
#fix-wifi-rpi.sh
# Next, script to fix the wifi firmware setting:
cat >/home/rocky/fix-wifi-rpi4.sh << 'EOF'
#!/bin/bash
# Simple hacky fix to correct wifi settings on the Rpi4 so it loads properly:
sed -i 's/boardflags3=0x48200100/boardflags3=0x44200100/g' /lib/firmware/brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt
echo "Patched /lib/firmware/brcm/brcmfmac43455-sdio.raspberrypi,4-model-b.txt . You can reboot and wifi should work, or do: rmmod brcmfmac; modprobe brcmfmac; "
EOF
chmod 755 /home/rocky/fix-wifi-rpi4.sh
chown -R rocky:rocky /home/rocky
# Cleanup before shipping an image
@ -121,23 +147,16 @@ touch /etc/machine-id
# Ensure no ssh keys are present
rm -f "/etc/ssh/*_key*"
# Setting tuned profile to powersave by default -> sets the CPU governor to "ondemand". This prevents overheating issues
echo "powersave" > /etc/tuned/active_profile
# Clean yum cache
yum clean all
# Fix weird sssd bug, where it gets its folder owned by the unbound user:
chown -R sssd:sssd /var/lib/sss/{db,pipes,mc,pubconf,gpo_cache}
# Setting tuned profile to powersave by default -> sets the CPU governor to "ondemand". This prevents overheating issues
cat > /etc/sysconfig/cpupower << EOF
# See 'cpupower help' and cpupower(1) for more info
CPUPOWER_START_OPTS="frequency-set -g ondemand"
CPUPOWER_STOP_OPTS="frequency-set -g ondemand"
EOF
# rebuild rpm database
rpm --rebuilddb
%end
# Add the PARTUUID of the rootfs partition to the kernel command line
# We must do this *outside* of the chroot, by grabbing the UUID of the loopmounted rootfs
%post --nochroot
# Extract the UUID of the rootfs partition from /etc/fstab
@ -160,9 +179,4 @@ UUID_SWAP=$(/bin/grep 'swap' $INSTALL_ROOT/etc/fstab | awk '{print $1}' | awk
/usr/sbin/mkswap -L "_swap" -p 4096 -U "${UUID_SWAP}" /dev/disk/by-uuid/${UUID_SWAP}
%end
%post
# WiFi fix on Pi 3 Model B(image wont boot on Pi 3B w/o this fix)
cd /lib/firmware/brcm
xz -d -k brcmfmac43430-sdio.raspberrypi,3-model-b.txt.xz
%end

View File

@ -1,84 +0,0 @@
List of technical issues encountered in building the Rocky 9 Raspberry Pi image, and how they were overcome:
###
1)
SELinux file label issues during image create:
When SELinux is enforcing in the image, it attempts to label files as the kickstart is running.
Unfortunately, if building an EL9 image on an EL8 kernel + host system, there will be incompatibilities with the labels on the SELinux implementations, which causes the errors.
SOLUTION: Build the image on an EL9 or equivalent Fedora host, or disable SELinux in the kickstart (it can be turned on later in the image, but there is a relabel process to go through)
###
2)
RPMDB + libdnf issues:
When trying to install new packages, you get repeated warnings from DNF saying "warning: Found bdb Packages database while attempting sqlite backend: using bdb backend."
It also prevents the import of RPM GPG keys, which effectively means no package installs.
Similar to this:
https://bugzilla.redhat.com/show_bug.cgi?id=1836108
SOLUTION: Build the image on an EL9 host, OR run "rpmdb --rebuilddb" at the end of %post in kickstart, or on the Raspberry Pi itself.
###
3)
RPi Broadcom Wifi Issue
Since Fedora 34(?), the linux-firmware package has all of its artifacts xz-compressed in order to save space.
This breaks the Raspberry Pi wifi driver, as the firmware file locations are hard-coded, and will not use the .xz files.
SOLUTION:
As a workaround, a script is included in the rocky-rpi-release package which copies the firmware .xz files, extracts them, and puts them back in the proper directory (alongside the original .xz files).
The script (fix-wifi-rpi.sh) is run during the kickstart to fix wireless, and can be run by root at any time.
The files in question live in /lib/firmware/brcm/.
A better, non-workaround solution will require more research - likely a rpi-kernel patch.
###
4)
DNF/Appliance Creator Unmount issues:
When finishing image creation, the host machine's DNF can "hang" on to open files, causing the various unmounts at the end of the process to fail, and thus the whole image process.
The errors vary in their locations, but look like this:
umount: /var/tmp/imgcreate-e84ozsji/install_root/sys/fs/selinux/load: not mounted.
Traceback (most recent call last):
File "/usr/bin/livecd-creator", line 265, in
sys.exit(main())
Livecd-Tools Bug Report and discussion: https://github.com/livecd-tools/livecd-tools/issues/232
Related RH Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2087734
LibDNF patch: https://github.com/rpm-software-management/dnf/commit/5ce5ed1ea08ad6e198c1c1642c4d9ea2db6eab86
SOLUTION:
A simple patch needs to be applied to the HOST system's libdnf base.py (ex: /usr/lib/python3.9/site-packages/dnf/base.py )
The patch is here: https://github.com/rpm-software-management/dnf/commit/5ce5ed1ea08ad6e198c1c1642c4d9ea2db6eab86
Basically: "import gc" (at the top)
and at the bottom of the reset() method:
if sack and goal:
gc.collect()
This fixes the hanging file handle/unmount issue

View File

@ -1,17 +1,13 @@
#!/bin/bash
# Simple script that runs a Rocky Raspberry pi creation (via appliance-creator), then inserts a UUID to the kernel boot line of the image
# after-the-fact
#
# Usage: ./createRocky9_Image.sh /path/to/outputfolder/
#
# Usage: ./createRocky8_Image.sh /path/to/outputfolder/
#
# Needs to be run in the same directory as the rocky rpi kickstart, as it relies on it!
#
# Exit with error if we don't have an output directory:
OUTDIR=$1
OUTDIR=$1
LOGDIR="logs"
@ -30,24 +26,16 @@ else
touch $LOGDIR/$LOGFILE
fi
if [[ -d ${OUTDIR} ]]; then
echo "$OUTDIR exists..."
else
mkdir -p "${OUTDIR}"
fi
mkdir -p "${OUTDIR}"
# Actually create the image. Our kickstart data should be in the same git repo as this script:
# (This takes a while, especially building on an rpi. Patience!)
appliance-creator -v -c ./Rocky9_Rpi.ks -n RockyRpi \
--version=`date +"%Y%m%d"` --release=1 \
-d --logfile $LOGDIR/LOGFILE \
--vmem=2048 --vcpu=2 --no-compress -o "${OUTDIR}"
appliance-creator -v -c ./Rocky8_Rpi.ks -n RockyRpi \
--version=`date +"%Y%m%d"` --release=1 \
-d --logfile $LOGDIR/LOGFILE \
--vmem=2048 --vcpu=2 --no-compress -o "${OUTDIR}"
#chown -R $SUDO_USER. "${OUTDIR}"

View File

@ -1,12 +1,12 @@
(This file comes from the kickstart/appliance-creator repo: https://git.resf.org/sig_altarch/RockyRpi )
Rocky 9 Raspberry Pi Image version 9.2
Rocky 8 Raspberry Pi Image version 8.8
They have been tested on Raspberry Pi 3 and 4.
Rocky Linux WILL NOT WORK on a Raspberry Pi 1 or 2. They are 32-bit only, and Rocky Linux only supports arm64 (aarch64).
(edit: Raspberry Pi 2 version 1.2 boards are in fact 64-bit. There aren't too many of these, but they might work. Tell us if you have one!)
(edit: Raspberry Pi 2 version 1.2 boards are in fact 64-bit. There aren't too many of these, but they might work. Tell us on chat.rockylinux.org if you have one!)
QUICK START:
@ -50,7 +50,7 @@ TECHNICAL DETAILS ABOUT THE IMAGES:
Thanks for your interest on Rocky-on-Rpi, feel free to share your experience or contribute in our chat channel at: https://chat.rockylinux.org/rocky-linux/channels/altarch !
Feel free to share your experience or contribute in our chat channel at: https://chat.rockylinux.org/rocky-linux/channels/altarch !
-The Rocky Linux Team

View File

@ -1,7 +1,13 @@
- Build fixes for wifi on 9
#- Disable root pw, disable root ssh, add rocky login w/ default pw
- Finalize and release rpi Rocky 9 image
- Detect PARTUUID and automatically swap /boot/cmdline.txt
- re-sync kernel RPM from pgreco upstream
#- script to fix wifi txt file, in /root/, and also run it at the end
- port builds and imports to Peridot
#- install extra packages: nano,vim,bash-completion
#- Add rpi-kernel repo file
- Add README , with notes and how-to's for writing sd card, fixing wifi, and expanding partition
- Adjust swap/rootfs sizes(?)