[lxc-devel] [distrobuilder/master] Support Arch Linux ARM

monstermunchkin on Github lxc-bot at linuxcontainers.org
Wed Feb 13 13:31:43 UTC 2019


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 329 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20190213/1269f60d/attachment.bin>
-------------- next part --------------
From 071d0b92125f7f28e89e96699e3b1e4c1da41d64 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 13 Feb 2019 13:05:35 +0100
Subject: [PATCH 1/3] shared: Add Arch Linux mapping

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 shared/definition.go | 1 +
 shared/osarch.go     | 7 +++++++
 2 files changed, 8 insertions(+)

diff --git a/shared/definition.go b/shared/definition.go
index 16f020e..367f13b 100644
--- a/shared/definition.go
+++ b/shared/definition.go
@@ -273,6 +273,7 @@ func (d *Definition) Validate() error {
 
 	validMappings := []string{
 		"alpinelinux",
+		"archlinux",
 		"centos",
 		"debian",
 		"gentoo",
diff --git a/shared/osarch.go b/shared/osarch.go
index 505c6e2..a3830ff 100644
--- a/shared/osarch.go
+++ b/shared/osarch.go
@@ -11,6 +11,12 @@ var alpineLinuxArchitectureNames = map[int]string{
 	osarch.ARCH_32BIT_ARMV7_LITTLE_ENDIAN: "armhf",
 }
 
+var archLinuxArchitectureNames = map[int]string{
+	osarch.ARCH_64BIT_INTEL_X86:           "x86_64",
+	osarch.ARCH_32BIT_ARMV7_LITTLE_ENDIAN: "armv7",
+	osarch.ARCH_64BIT_ARMV8_LITTLE_ENDIAN: "aarch64",
+}
+
 var centosArchitectureNames = map[int]string{
 	osarch.ARCH_32BIT_INTEL_X86: "i386",
 }
@@ -37,6 +43,7 @@ var gentooArchitectureNames = map[int]string{
 
 var distroArchitecture = map[string]map[int]string{
 	"alpinelinux": alpineLinuxArchitectureNames,
+	"archlinux":   archLinuxArchitectureNames,
 	"centos":      centosArchitectureNames,
 	"debian":      debianArchitectureNames,
 	"gentoo":      gentooArchitectureNames,

From 1618bc5f62110b9ddd5a709c5181578d3438c4e4 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 13 Feb 2019 13:08:14 +0100
Subject: [PATCH 2/3] sources: Support Arch Linux ARM

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 sources/archlinux-http.go | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/sources/archlinux-http.go b/sources/archlinux-http.go
index f12ece2..86b38f2 100644
--- a/sources/archlinux-http.go
+++ b/sources/archlinux-http.go
@@ -27,7 +27,9 @@ func NewArchLinuxHTTP() *ArchLinuxHTTP {
 func (s *ArchLinuxHTTP) Run(definition shared.Definition, rootfsDir string) error {
 	release := definition.Image.Release
 
-	if release == "" {
+	// Releases are only available for the x86_64 architecture. ARM only has
+	// a "latest" tarball.
+	if definition.Image.ArchitectureMapped == "x86_64" && release == "" {
 		var err error
 
 		// Get latest release
@@ -37,10 +39,19 @@ func (s *ArchLinuxHTTP) Run(definition shared.Definition, rootfsDir string) erro
 		}
 	}
 
-	fname := fmt.Sprintf("archlinux-bootstrap-%s-%s.tar.gz",
-		release, definition.Image.ArchitectureMapped)
-	tarball := fmt.Sprintf("%s/%s/%s", definition.Source.URL,
-		release, fname)
+	var fname string
+	var tarball string
+
+	if definition.Image.ArchitectureMapped == "x86_64" {
+		fname = fmt.Sprintf("archlinux-bootstrap-%s-%s.tar.gz",
+			release, definition.Image.ArchitectureMapped)
+		tarball = fmt.Sprintf("%s/%s/%s", definition.Source.URL,
+			release, fname)
+	} else {
+		fname = fmt.Sprintf("ArchLinuxARM-%s-latest.tar.gz",
+			definition.Image.ArchitectureMapped)
+		tarball = fmt.Sprintf("%s/os/%s", definition.Source.URL, fname)
+	}
 
 	url, err := url.Parse(tarball)
 	if err != nil {
@@ -80,7 +91,7 @@ func (s *ArchLinuxHTTP) Run(definition shared.Definition, rootfsDir string) erro
 		return err
 	}
 
-	// Move everything inside 'root.x86_64' (which was is the tarball) to its
+	// Move everything inside 'root.<architecture>' (which was is the tarball) to its
 	// parent directory
 	files, err := filepath.Glob(fmt.Sprintf("%s/*", filepath.Join(rootfsDir,
 		"root."+definition.Image.ArchitectureMapped)))

From d9aa951b845231199feea48b61f1bc76c4ac0d9d Mon Sep 17 00:00:00 2001
From: Thomas Hipp <thomas.hipp at canonical.com>
Date: Wed, 13 Feb 2019 14:29:09 +0100
Subject: [PATCH 3/3] pacman: Support Arch Linux ARM

Signed-off-by: Thomas Hipp <thomas.hipp at canonical.com>
---
 managers/pacman.go | 23 +++++++++++++++++++++--
 1 file changed, 21 insertions(+), 2 deletions(-)

diff --git a/managers/pacman.go b/managers/pacman.go
index f7cb17a..2b67c7d 100644
--- a/managers/pacman.go
+++ b/managers/pacman.go
@@ -4,6 +4,9 @@ import (
 	"fmt"
 	"os"
 	"path/filepath"
+	"runtime"
+
+	lxd "github.com/lxc/lxd/shared"
 
 	"github.com/lxc/distrobuilder/shared"
 )
@@ -65,7 +68,15 @@ func pacmanSetupTrustedKeys() error {
 		return fmt.Errorf("Error initializing with pacman-key: %s", err)
 	}
 
-	err = shared.RunCommand("pacman-key", "--populate", "archlinux")
+	var keyring string
+
+	if lxd.StringInSlice(runtime.GOARCH, []string{"arm", "arm64"}) {
+		keyring = "archlinuxarm"
+	} else {
+		keyring = "archlinux"
+	}
+
+	err = shared.RunCommand("pacman-key", "--populate", keyring)
 	if err != nil {
 		return fmt.Errorf("Error populating with pacman-key: %s", err)
 	}
@@ -80,7 +91,15 @@ func pacmanSetMirrorlist() error {
 	}
 	defer f.Close()
 
-	_, err = f.WriteString("Server = http://mirrors.kernel.org/archlinux/$repo/os/$arch")
+	var mirror string
+
+	if lxd.StringInSlice(runtime.GOARCH, []string{"arm", "arm64"}) {
+		mirror = "Server = http://mirror.archlinuxarm.org/$arch/$repo"
+	} else {
+		mirror = "Server = http://mirrors.kernel.org/archlinux/$repo/os/$arch"
+	}
+
+	_, err = f.WriteString(mirror)
 	if err != nil {
 		return err
 	}


More information about the lxc-devel mailing list