diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index 617834f983f..f3e07bc7043 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -65,6 +65,7 @@ jobs: USERNAME: ${{ github.actor }} PLATFORM: linux/arm64 PROGRESS: plain + IMAGER_ARGS: "--system-extension-image ghcr.io/nberlee/rk3588:v1.6.3" - uses: actions/upload-artifact@v3 with: diff --git a/Dockerfile b/Dockerfile index f4192828b26..90f18c197c6 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-17-gb944dc3-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 7f85d701c3a..7a2e9e02f11 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-15-gf51aedb -PKG_KERNEL ?= ghcr.io/siderolabs/kernel:$(PKGS) +PKG_KERNEL ?= ghcr.io/nberlee/kernel:v1.6.0-18-ga16380f 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 359dee9e0aa..e7786590e46 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,47 @@

--- - +# 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/D4DeLc8J0NFRY3iatLikyGYmA.svg)](https://asciinema.org/a/D4DeLc8J0NFRY3iatLikyGYmA) + +### 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 the [rk3588](https://github.com/nberlee/extensions/tree/release-1.6/sbcs/rk3588) extension. +```yaml +machine: + install: + extensions: + - image: ghcr.io/nberlee/rk3588:v1.6.x + kernel: + modules: + - name: rockchip-cpufreq +``` + +### Updating + +Updating can also be done faster using the `talosctl upgrade` command. + +Before updating, make sure to edit the machine config and change the extension tag above to the correct new version. +```sh +talosctl upgrade -i ghcr.io/nberlee/installer:v1.6.x +``` + +# 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 dd6eb43e8bf..57b375c5e0d 100644 --- a/hack/modules-amd64.txt +++ b/hack/modules-amd64.txt @@ -23,12 +23,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 @@ -38,19 +34,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 @@ -58,6 +44,8 @@ kernel/drivers/net/ethernet/realtek/8139too.ko kernel/drivers/net/ethernet/realtek/r8169.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/scsi/aacraid/aacraid.ko kernel/drivers/scsi/hpsa.ko @@ -68,9 +56,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 b7e595b04f5..fc50a6f50f7 100644 --- a/hack/modules-arm64.txt +++ b/hack/modules-arm64.txt @@ -1,6 +1,7 @@ modules.order modules.builtin modules.builtin.modinfo +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 @@ -8,6 +9,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 @@ -20,17 +22,8 @@ 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/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 0c6815fe4e6..70df2d5c82b 100644 --- a/hack/release.toml +++ b/hack/release.toml @@ -16,9 +16,12 @@ preface = """\ [notes] [notes.updates] title = "Component Updates" + + description = """\ -Linux: 6.1.74 +Linux: 6.6.13 Kubernetes: 1.29.1 +containerd: 1.7.11 Talos is built with Go 1.21.6. """ diff --git a/internal/app/machined/pkg/runtime/v1alpha1/board/board.go b/internal/app/machined/pkg/runtime/v1alpha1/board/board.go index 743655caa7d..3fd3fe07883 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 00000000000..4be4c0a659b --- /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 a08401291cc..1137064e2e6 100644 --- a/pkg/imager/profile/default.go +++ b/pkg/imager/profile/default.go @@ -367,4 +367,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 f2ab65ae585..c737bd56e8a 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.74-talos" + DefaultKernelVersion = "6.6.14-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 00000000000..894b3f3826f --- /dev/null +++ b/website/content/v1.6/talos-guides/install/single-board-computers/turing_rk1.md @@ -0,0 +1,103 @@ +--- +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/633378.svg)](https://asciinema.org/a/633378) + +## 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-16-g009ab8c-dirty +docker save ghcr.io/nberlee/u-boot:v1.6.0-16-g009ab8c-dirty | tar xf - --strip-components=1 -C _out +tar xvf _out/layer.tar turing_rk1/u-boot-rockchip-spi.bin + +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 +```