diff --git a/Dockerfile b/Dockerfile index f4192828b2..b4d3400cf2 100644 --- a/Dockerfile +++ b/Dockerfile @@ -85,7 +85,7 @@ FROM ${PKG_KERNEL} AS pkg-kernel FROM --platform=amd64 ${PKG_KERNEL} AS pkg-kernel-amd64 FROM --platform=arm64 ${PKG_KERNEL} AS pkg-kernel-arm64 -FROM --platform=arm64 ghcr.io/siderolabs/u-boot:${PKGS} AS pkg-u-boot-arm64 +FROM --platform=arm64 ghcr.io/nberlee/u-boot:v1.6.0-27-g2dcb3b4-dirty AS pkg-u-boot-arm64 FROM --platform=arm64 ghcr.io/siderolabs/raspberrypi-firmware:${PKGS} AS pkg-raspberrypi-firmware-arm64 # Resolve package images using ${EXTRAS} to be used later in COPY --from=. diff --git a/Makefile b/Makefile index cf029a8864..361634a5ca 100644 --- a/Makefile +++ b/Makefile @@ -17,7 +17,7 @@ CLOUD_IMAGES_EXTRA_ARGS ?= "" ARTIFACTS := _out TOOLS ?= ghcr.io/siderolabs/tools:v1.6.0-2-g5e034ec PKGS ?= v1.6.0-25-g6868f38 -PKG_KERNEL ?= ghcr.io/siderolabs/kernel:$(PKGS) +PKG_KERNEL ?= ghcr.io/nberlee/kernel:v1.6.0-27-g2dcb3b4 EXTRAS ?= v1.6.0-1-g113887a # renovate: datasource=github-tags depName=golang/go GO_VERSION ?= 1.21 @@ -317,11 +317,11 @@ images-essential: image-aws image-gcp image-metal secureboot-installer ## Builds images: image-aws image-azure image-digital-ocean image-exoscale image-gcp image-hcloud image-iso image-metal image-nocloud image-openstack image-oracle image-scaleway image-upcloud image-vmware image-vultr ## Builds all known images (AWS, Azure, DigitalOcean, Exoscale, GCP, HCloud, Metal, NoCloud, Openstack, Oracle, Scaleway, UpCloud, Vultr and VMware). -sbc-%: ## Builds the specified SBC image. Valid options are rpi_generic, rock64, bananapi_m64, libretech_all_h3_cc_h5, rockpi_4, rockpi_4c, pine64, jetson_nano and nanopi_r4s (e.g. sbc-rpi_generic) +sbc-%: ## Builds the specified SBC image. Valid options are rpi_generic, rock64, bananapi_m64, libretech_all_h3_cc_h5, rockpi_4, rockpi_4c, pine64, jetson_nano, nanopi_r4s and turing_rk1 (e.g. sbc-rpi_generic) @docker pull $(REGISTRY_AND_USERNAME)/imager:$(IMAGE_TAG) @docker run --rm -t -v /dev:/dev -v $(PWD)/$(ARTIFACTS):/out --network=host --privileged $(REGISTRY_AND_USERNAME)/imager:$(IMAGE_TAG) $* --arch arm64 $(IMAGER_ARGS) -sbcs: sbc-rpi_generic sbc-rock64 sbc-bananapi_m64 sbc-libretech_all_h3_cc_h5 sbc-rockpi_4 sbc-rockpi_4c sbc-pine64 sbc-jetson_nano sbc-nanopi_r4s ## Builds all known SBC images (Raspberry Pi 4, Rock64, Banana Pi M64, Radxa ROCK Pi 4, Radxa ROCK Pi 4c, Pine64, Libre Computer Board ALL-H3-CC, Jetson Nano and Nano Pi R4S). +sbcs: sbc-rpi_generic sbc-rock64 sbc-bananapi_m64 sbc-libretech_all_h3_cc_h5 sbc-rockpi_4 sbc-rockpi_4c sbc-pine64 sbc-jetson_nano sbc-nanopi_r4s sbc-turing_rk1 ## Builds all known SBC images (Raspberry Pi 4, Rock64, Banana Pi M64, Radxa ROCK Pi 4, Radxa ROCK Pi 4c, Pine64, Libre Computer Board ALL-H3-CC, Jetson Nano and Nano Pi R4S). .PHONY: iso iso: image-iso ## Builds the ISO and outputs it to the artifact directory. diff --git a/README.md b/README.md index 359dee9e0a..6b2dc58f76 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,48 @@

--- +# Friendly fork +This is a friendly fork of [siderolabs/talos](siderolabs/talos). It is only here to support [SBC Turing RK1](https://turingpi.com/product/turing-rk1/). And it will be integrated in some way using [community managed SBCs](https://github.com/siderolabs/talos/issues/8065) in Talos 1.7. +## Using this fork +[![asciicast](https://asciinema.org/a/635709.svg)](https://asciinema.org/a/635709) + +### Download the latest release on the right + +This describes the CLI commands, you may use the Turing PI webgui. Always first unpack the image yourself. Version 2.06 supports xz images, but it is slower. +```sh +xz -d metal-turing_rk1-arm64.raw.xz +tpi flash -n -i metal-turing_rk1-arm64.raw +tpi power on -n +``` + +To check bootmessages: +```sh +tpi uart -n get +``` + +Make sure when you use talosctl apply-config to have in this config: +```yaml +machine: + kernel: + modules: + - name: rockchip-cpufreq +``` + +for an extended installation guide with cilium see issue #1 + +### Updating + +Updating can also be done faster using the `talosctl upgrade` command. + +```sh +talosctl upgrade -i ghcr.io/nberlee/installer:v1.6.x-rk3588 +``` +when adding the `-rk3588` to the tag, the rk3588 extension is no longer needed in the machine-config. +For example the `ghcr.io/nberlee/installer:v1.6.4-rk3588` installer image has the rk3588 talos extension included + + +# Talos **Talos** is a modern OS for running Kubernetes: secure, immutable, and minimal. Talos is fully open source, production-ready, and supported by the people at [Sidero Labs](https://www.SideroLabs.com/) All system management is done via an API - there is no shell or interactive console. diff --git a/hack/modules-amd64.txt b/hack/modules-amd64.txt index fb63e16737..e5bd011ef5 100644 --- a/hack/modules-amd64.txt +++ b/hack/modules-amd64.txt @@ -20,12 +20,8 @@ kernel/drivers/md/persistent-data/dm-persistent-data.ko kernel/drivers/md/raid456.ko kernel/drivers/net/ethernet/aquantia/atlantic/atlantic.ko kernel/drivers/net/ethernet/atheros/alx/alx.ko -kernel/drivers/net/ethernet/broadcom/bnx2.ko -kernel/drivers/net/ethernet/broadcom/bnx2x/bnx2x.ko -kernel/drivers/net/ethernet/broadcom/bnxt/bnxt_en.ko kernel/drivers/net/ethernet/cisco/enic/enic.ko kernel/drivers/net/ethernet/emulex/benet/be2net.ko -kernel/drivers/net/ethernet/google/gve/gve.ko kernel/drivers/net/ethernet/intel/e100.ko kernel/drivers/net/ethernet/intel/e1000/e1000.ko kernel/drivers/net/ethernet/intel/e1000e/e1000e.ko @@ -35,19 +31,9 @@ kernel/drivers/net/ethernet/intel/ice/ice.ko kernel/drivers/net/ethernet/intel/igb/igb.ko kernel/drivers/net/ethernet/intel/igbvf/igbvf.ko kernel/drivers/net/ethernet/intel/igc/igc.ko -kernel/drivers/net/ethernet/intel/ixgb/ixgb.ko kernel/drivers/net/ethernet/intel/ixgbe/ixgbe.ko kernel/drivers/net/ethernet/intel/ixgbevf/ixgbevf.ko kernel/drivers/net/ethernet/marvell/sky2.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_core.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko -kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko -kernel/drivers/net/ethernet/mellanox/mlxfw/mlxfw.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_core.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_i2c.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_minimal.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_pci.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_spectrum.ko kernel/drivers/net/ethernet/qlogic/qed/qed.ko kernel/drivers/net/ethernet/qlogic/qede/qede.ko kernel/drivers/net/ethernet/qlogic/qlcnic/qlcnic.ko @@ -56,6 +42,8 @@ kernel/drivers/net/ethernet/realtek/r8169.ko kernel/drivers/net/ethernet/sfc/sfc.ko kernel/drivers/net/ethernet/sfc/siena/sfc-siena.ko kernel/drivers/net/mdio.ko +kernel/drivers/net/phy/ax88796b.ko +kernel/drivers/net/phy/smsc.ko kernel/drivers/net/vmxnet3/vmxnet3.ko kernel/drivers/net/vrf.ko kernel/drivers/scsi/aacraid/aacraid.ko @@ -67,9 +55,9 @@ kernel/drivers/scsi/vmw_pvscsi.ko kernel/drivers/virtio/virtio_balloon.ko kernel/drivers/virtio/virtio_input.ko kernel/drivers/virtio/virtio_mmio.ko +kernel/drivers/virtio/virtio_pci.ko kernel/drivers/virtio/virtio_pci_legacy_dev.ko kernel/drivers/virtio/virtio_pci_modern_dev.ko -kernel/drivers/virtio/virtio_pci.ko kernel/lib/objagg.ko kernel/lib/parman.ko kernel/lib/raid6/raid6_pq.ko diff --git a/hack/modules-arm64.txt b/hack/modules-arm64.txt index 92f9d0841e..ccb432794f 100644 --- a/hack/modules-arm64.txt +++ b/hack/modules-arm64.txt @@ -1,3 +1,4 @@ +kernel/arch/arm64/lib/xor-neon.ko kernel/crypto/async_tx/async_memcpy.ko kernel/crypto/async_tx/async_pq.ko kernel/crypto/async_tx/async_raid6_recov.ko @@ -5,6 +6,7 @@ kernel/crypto/async_tx/async_tx.ko kernel/crypto/async_tx/async_xor.ko kernel/crypto/xor.ko kernel/drivers/block/nbd.ko +kernel/drivers/dma/bcm-sba-raid.ko kernel/drivers/hwmon/i5k_amb.ko kernel/drivers/infiniband/sw/rxe/rdma_rxe.ko kernel/drivers/irqchip/irq-imx-mu-msi.ko @@ -17,19 +19,11 @@ kernel/drivers/md/dm-thin-pool.ko kernel/drivers/md/persistent-data/dm-persistent-data.ko kernel/drivers/md/raid456.ko kernel/drivers/net/ethernet/atheros/alx/alx.ko -kernel/drivers/net/ethernet/google/gve/gve.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_core.ko -kernel/drivers/net/ethernet/mellanox/mlx4/mlx4_en.ko -kernel/drivers/net/ethernet/mellanox/mlx5/core/mlx5_core.ko -kernel/drivers/net/ethernet/mellanox/mlxfw/mlxfw.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_core.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_i2c.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_minimal.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_pci.ko -kernel/drivers/net/ethernet/mellanox/mlxsw/mlxsw_spectrum.ko kernel/drivers/net/ethernet/sfc/sfc.ko kernel/drivers/net/ethernet/sfc/siena/sfc-siena.ko kernel/drivers/net/vrf.ko +kernel/drivers/net/ethernet/sfc/siena/sfc-siena.ko +kernel/drivers/net/mdio/mdio-mux-meson-gxl.ko kernel/lib/objagg.ko kernel/lib/parman.ko kernel/lib/raid6/raid6_pq.ko diff --git a/hack/release.toml b/hack/release.toml index 2b7f235932..711fdb3b01 100644 --- a/hack/release.toml +++ b/hack/release.toml @@ -16,13 +16,27 @@ preface = """\ [notes] [notes.updates] title = "Component Updates" + + description = """\ Kubernetes: 1.29.2 -Linux: 6.1.78 +Linux: 6.6.17 +arm-trusted-firmware: 2.10.2 Talos is built with Go 1.21.6. """ + [notes.fanspeed] + title = "Turing RK1: fan speed" + description = """\ +The fanspeed curve has been adjusted to be more idle in lite cpu load utilization scenarios. +""" + + [notes.usb2] + title = "Turing RK1: USB2" + description = """\ +USB2 support has been restored. It was broken in Talos 1.6.4. +""" [notes.k8supgrade] title = "Kubernetes Upgrade" diff --git a/internal/app/machined/pkg/runtime/v1alpha1/board/board.go b/internal/app/machined/pkg/runtime/v1alpha1/board/board.go index 743655caa7..3fd3fe0788 100644 --- a/internal/app/machined/pkg/runtime/v1alpha1/board/board.go +++ b/internal/app/machined/pkg/runtime/v1alpha1/board/board.go @@ -22,6 +22,7 @@ import ( rockpi4 "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/rockpi4" rockpi4c "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/rockpi4c" rpigeneric "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/rpi_generic" + turingrk1 "github.com/siderolabs/talos/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1" "github.com/siderolabs/talos/pkg/machinery/constants" ) @@ -70,6 +71,8 @@ func newBoard(board string) (b runtime.Board, err error) { b = &jetsonnano.JetsonNano{} case constants.BoardNanoPiR4S: b = &nanopir4s.NanoPiR4S{} + case constants.BoardTuringRK1: + b = &turingrk1.TuringRK1{} default: return nil, fmt.Errorf("unsupported board: %q", board) } diff --git a/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1/turing_rk1.go b/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1/turing_rk1.go new file mode 100644 index 0000000000..4be4c0a659 --- /dev/null +++ b/internal/app/machined/pkg/runtime/v1alpha1/board/turing_rk1/turing_rk1.go @@ -0,0 +1,94 @@ +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +// Package TuringRK1 provides the Turing RK1 implementation. +package TuringRK1 + +import ( + "os" + "path/filepath" + + "github.com/siderolabs/go-procfs/procfs" + "golang.org/x/sys/unix" + + "github.com/siderolabs/talos/internal/app/machined/pkg/runtime" + "github.com/siderolabs/talos/pkg/copy" + "github.com/siderolabs/talos/pkg/machinery/constants" +) + +var ( + bin = constants.BoardTuringRK1 + "/u-boot-rockchip.bin" + off int64 = 512 * 64 + dtb = "rockchip/rk3588-turing-rk1.dtb" +) + +// TuringRK1 represents the Rockchip RK3588 based SoM from Turing Machines. +// +// Reference: https://rockpi.org/ +type TuringRK1 struct{} + +// Name implements the runtime.Board. +func (r *TuringRK1) Name() string { + return constants.BoardTuringRK1 +} + +// Install implements the runtime.Board. +func (r *TuringRK1) Install(options runtime.BoardInstallOptions) (err error) { + var f *os.File + + if f, err = os.OpenFile(options.InstallDisk, os.O_RDWR|unix.O_CLOEXEC, 0o666); err != nil { + return err + } + + defer f.Close() //nolint:errcheck + + uboot, err := os.ReadFile(filepath.Join(options.UBootPath, bin)) + if err != nil { + return err + } + + options.Printf("writing %s at offset %d", bin, off) + + var n int + + n, err = f.WriteAt(uboot, off) + if err != nil { + return err + } + + options.Printf("wrote %d bytes", n) + + // NB: In the case that the block device is a loopback device, we sync here + // to esure that the file is written before the loopback device is + // unmounted. + err = f.Sync() + if err != nil { + return err + } + + src := filepath.Join(options.DTBPath, dtb) + dst := filepath.Join(options.MountPrefix, "/boot/EFI/dtb", dtb) + + err = os.MkdirAll(filepath.Dir(dst), 0o600) + if err != nil { + return err + } + + return copy.File(src, dst) +} + +// KernelArgs implements the runtime.Board. +func (r *TuringRK1) KernelArgs() procfs.Parameters { + return []*procfs.Parameter{ + procfs.NewParameter("console").Append("tty0").Append("ttyS9,115200").Append("ttyS2,115200"), + procfs.NewParameter("sysctl.kernel.kexec_load_disabled").Append("1"), + procfs.NewParameter(constants.KernelParamDashboardDisabled).Append("1"), + procfs.NewParameter("cma").Append("128MB"), + } +} + +// PartitionOptions implements the runtime.Board. +func (r *TuringRK1) PartitionOptions() *runtime.PartitionOptions { + return &runtime.PartitionOptions{PartitionsOffset: 2048 * 10} +} diff --git a/pkg/imager/profile/default.go b/pkg/imager/profile/default.go index 45ab35873c..aee8ee7831 100644 --- a/pkg/imager/profile/default.go +++ b/pkg/imager/profile/default.go @@ -370,4 +370,18 @@ var Default = map[string]Profile{ }, }, }, + constants.BoardTuringRK1: { + Arch: "arm64", + Platform: constants.PlatformMetal, + Board: constants.BoardTuringRK1, + SecureBoot: pointer.To(false), + Output: Output{ + Kind: OutKindImage, + OutFormat: OutFormatXZ, + ImageOptions: &ImageOptions{ + DiskSize: MinRAWDiskSize, + DiskFormat: DiskFormatRaw, + }, + }, + }, } diff --git a/pkg/machinery/constants/constants.go b/pkg/machinery/constants/constants.go index 21614ea4d2..89997790c3 100644 --- a/pkg/machinery/constants/constants.go +++ b/pkg/machinery/constants/constants.go @@ -16,7 +16,7 @@ import ( const ( // DefaultKernelVersion is the default Linux kernel version. - DefaultKernelVersion = "6.1.78-talos" + DefaultKernelVersion = "6.6.17-talos" // KernelModulesPath is the default path to the kernel modules without the kernel version. KernelModulesPath = "/lib/modules" @@ -112,6 +112,9 @@ const ( // BoardNanoPiR4S is the name of the Friendlyelec Nano Pi R4S. BoardNanoPiR4S = "nanopi_r4s" + // BoardTuringRK1 is the name of the Turing Pi RK1 board. + BoardTuringRK1 = "turing_rk1" + // KernelParamHostname is the kernel parameter name for specifying the // hostname. KernelParamHostname = "talos.hostname" diff --git a/website/content/v1.6/talos-guides/install/single-board-computers/turing_rk1.md b/website/content/v1.6/talos-guides/install/single-board-computers/turing_rk1.md new file mode 100644 index 0000000000..b3a461b2eb --- /dev/null +++ b/website/content/v1.6/talos-guides/install/single-board-computers/turing_rk1.md @@ -0,0 +1,114 @@ +--- +title: "Turing RK1" +description: "Installing Talos on Turing RK1 SOM using raw disk image." +aliases: + - ../../../single-board-computers/turing_rk1 +--- + +[![asciicast](https://asciinema.org/a/635709.svg)](https://asciinema.org/a/635709) + +## Prerequisites + +You will need + +- `talosctl` +- `tpi` from [github](https://github.com/turing-machines/tpi/releases) + +Download the latest `talosctl`. + +```bash +curl -Lo /usr/local/bin/talosctl https://github.com/siderolabs/talos/releases/download/{{< release >}}/talosctl-$(uname -s | tr "[:upper:]" "[:lower:]")-amd64 +chmod +x /usr/local/bin/talosctl +``` + + +## Download the Image + +Download the image and decompress it: + +```bash +curl -LO https://github.com/nberlee/talos/releases/download/{{< release >}}/metal-turing_rk1-arm64.raw.xz +xz -d metal-turing_rk1-arm64.raw.xz +``` + +The user has two options to proceed: + +- booting from eMMC +- booting from a USB or NVMe (requires a spi image on the eMMC) + +### Booting from eMMC + +```bash +tpi flash -n -i metal-turing_rk1-arm64.raw +tpi power on -n +``` +Proceed to [bootstrapping the node](#bootstrapping-the-node). + +### Booting from USB or NVMe + +This requires the user to flash the Turing RK1 with a u-boot SPI image. + +If you have a USB to NVMe adapter, write Talos image to the USB drive: + +```bash +sudo dd if=metal-turing_rk1-arm64.raw of=/dev/sda +``` +install the NVMe drive in the Turing Pi board. + +Otherwise, if the NVMe drive is already installed in the Turing Pi board, you can: +- Flash the Turing RK1 variant of [Ubuntu](https://docs.turingpi.com/docs/turing-rk1-flashing-os) to the eMMC. +- Boot into the ubuntu image, write Talos image to the SSD drive right from your Turing PI board: + +```bash +sudo dd if=metal-turing_rk1-arm64.raw of=/dev/NVMe0n1 +``` +- Download u-boot image from talos u-boot: + +```bash +mkdir _out + +docker pull ghcr.io/nberlee/u-boot:v1.6.0-27-g2dcb3b4-dirty +docker save ghcr.io/nberlee/u-boot:v1.6.0-27-g2dcb3b4-dirty | tar x --strip-components=1 -C _out +tar xvf _out/layer.tar turing_rk1/u-boot-rockchip-spi.bin +``` + +As the spi-image may be too small for the BMC you may have to flash the raw image first to the eMMC: +``` +tpi flash -n -i metal-turing_rk1-arm64.raw +``` + +After this flash the spi image to get rid of all the extra partitions and changed the boot order on the spi +image will prefer the nvme drive: + +``` +tpi flash -n -i turing_rk1/u-boot-rockchip-spi.bin +tpi power on -n +``` + + +After these steps, Talos will boot from the NVMe/USB and enter maintenance mode. +Proceed to [bootstrapping the node](#bootstrapping-the-node). + +## Bootstrapping the Node + +To check bootmessages, repeat until you see instructions for bootstrapping the node: +```sh +tpi uart -n get +``` + +Wait for the uart to show you the instructions for bootstrapping the node. +Following the instructions in the uart output to connect to the interactive installer: + +```bash +talosctl apply-config --insecure --mode=interactive --nodes +``` + +Once the interactive installation is applied, the cluster will form and you can then use `kubectl`. + +## Retrieve the `kubeconfig` + +Retrieve the admin `kubeconfig` by running: + +```bash +talosctl kubeconfig +```