The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/distrobuilder/pull/125

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Signed-off-by: Thomas Hipp <[email protected]>
From d4a336be69f063df85a3e9469ad9e4365da015d3 Mon Sep 17 00:00:00 2001
From: Thomas Hipp <[email protected]>
Date: Mon, 21 Jan 2019 16:54:55 +0100
Subject: [PATCH] sources: Support raw images in CentOS

Signed-off-by: Thomas Hipp <[email protected]>
---
 sources/centos-http.go | 110 +++++++++++++++++++++++++++++++++++++----
 1 file changed, 100 insertions(+), 10 deletions(-)

diff --git a/sources/centos-http.go b/sources/centos-http.go
index 06e7288..7ad18eb 100644
--- a/sources/centos-http.go
+++ b/sources/centos-http.go
@@ -43,6 +43,17 @@ func (s *CentOSHTTP) Run(definition shared.Definition, 
rootfsDir string) error {
                return fmt.Errorf("Couldn't get name of iso")
        }
 
+       // Skip download if raw image exists and has already been decompressed.
+       if strings.HasSuffix(s.fname, ".raw.xz") {
+               imagePath := filepath.Join(os.TempDir(), 
filepath.Base(strings.TrimSuffix(s.fname, ".xz")))
+
+               stat, err := os.Stat(imagePath)
+               if err == nil && stat.Size() > 0 {
+                       return s.unpackRaw(filepath.Join(os.TempDir(), 
strings.TrimSuffix(s.fname, ".xz")),
+                               rootfsDir)
+               }
+       }
+
        url, err := url.Parse(baseURL)
        if err != nil {
                return err
@@ -56,7 +67,12 @@ func (s *CentOSHTTP) Run(definition shared.Definition, 
rootfsDir string) error {
                                return errors.New("GPG keys are required if 
downloading from HTTP")
                        }
 
-                       checksumFile = "sha256sum.txt.asc"
+                       if definition.Image.ArchitectureMapped == "armhfp" {
+                               checksumFile = "sha256sum.txt"
+                       } else {
+                               checksumFile = "sha256sum.txt.asc"
+                       }
+
                        shared.DownloadHash(baseURL+checksumFile, "", nil)
                        valid, err := 
shared.VerifyFile(filepath.Join(os.TempDir(), checksumFile), "",
                                definition.Source.Keys, 
definition.Source.Keyserver)
@@ -74,10 +90,76 @@ func (s *CentOSHTTP) Run(definition shared.Definition, 
rootfsDir string) error {
                return fmt.Errorf("Error downloading CentOS image: %s", err)
        }
 
-       return s.unpack(filepath.Join(os.TempDir(), s.fname), rootfsDir)
+       if strings.HasSuffix(s.fname, ".raw.xz") || strings.HasSuffix(s.fname, 
".raw") {
+               return s.unpackRaw(filepath.Join(os.TempDir(), s.fname), 
rootfsDir)
+       }
+
+       return s.unpackISO(filepath.Join(os.TempDir(), s.fname), rootfsDir)
 }
 
-func (s CentOSHTTP) unpack(filePath, rootfsDir string) error {
+func (s CentOSHTTP) unpackRaw(filePath, rootfsDir string) error {
+       roRootDir := filepath.Join(os.TempDir(), "distrobuilder", "rootfs.ro")
+       tempRootDir := filepath.Join(os.TempDir(), "distrobuilder", "rootfs")
+
+       os.MkdirAll(roRootDir, 0755)
+       defer os.RemoveAll(filepath.Join(os.TempDir(), "distrobuilder"))
+
+       if strings.HasSuffix(filePath, ".raw.xz") {
+               // Uncompress raw image
+               err := shared.RunCommand("unxz", filePath)
+               if err != nil {
+                       return err
+               }
+       }
+
+       rawFilePath := strings.TrimSuffix(filePath, ".xz")
+
+       // Mount the partition read-only since we don't want to accidently 
modify it.
+       err := shared.RunCommand("mount", "-o", "ro,loop,offset=1048576",
+               rawFilePath, roRootDir)
+       if err != nil {
+               return err
+       }
+
+       // Since roRootDir is read-only, we need to copy it to a temporary 
rootfs
+       // directory in order to create the minimal rootfs.
+       err = shared.RunCommand("rsync", "-qa", roRootDir+"/", tempRootDir)
+       if err != nil {
+               return err
+       }
+
+       // Setup the mounts and chroot into the rootfs
+       exitChroot, err := shared.SetupChroot(tempRootDir, 
shared.DefinitionEnv{})
+       if err != nil {
+               return fmt.Errorf("Failed to setup chroot: %s", err)
+       }
+
+       err = shared.RunScript(fmt.Sprintf(`
+#!/bin/sh
+set -eux
+
+# Create required files
+touch /etc/mtab /etc/fstab
+
+# Create a minimal rootfs
+mkdir /rootfs
+yum --installroot=/rootfs --disablerepo=* --enablerepo=base -y --releasever=%s 
install basesystem centos-release yum
+rm -rf /rootfs/var/cache/yum
+
+// Disable CentOS kernel repo
+sed -ri 's/^enabled=.*/enabled=0/g' 
/rootfs/etc/yum.repos.d/CentOS-armhfp-kernel.repo
+`, s.majorVersion))
+       if err != nil {
+               exitChroot()
+               return err
+       }
+
+       exitChroot()
+
+       return shared.RunCommand("rsync", "-qa", tempRootDir+"/rootfs/", 
rootfsDir)
+}
+
+func (s CentOSHTTP) unpackISO(filePath, rootfsDir string) error {
        isoDir := filepath.Join(os.TempDir(), "distrobuilder", "iso")
        squashfsDir := filepath.Join(os.TempDir(), "distrobuilder", "squashfs")
        roRootDir := filepath.Join(os.TempDir(), "distrobuilder", "rootfs.ro")
@@ -214,9 +296,7 @@ rm -rf /rootfs/var/cache/yum
 
        exitChroot()
 
-       err = shared.RunCommand("rsync", "-qa", tempRootDir+"/rootfs/", 
rootfsDir)
-
-       return nil
+       return shared.RunCommand("rsync", "-qa", tempRootDir+"/rootfs/", 
rootfsDir)
 }
 
 func (s CentOSHTTP) getRelease(URL, release, variant, arch string) string {
@@ -236,11 +316,21 @@ func (s CentOSHTTP) getRelease(URL, release, variant, 
arch string) string {
 
        var re string
        if len(releaseFields) > 1 {
-               re = fmt.Sprintf("CentOS-%s.%s-%s-(?i:%s)(-\\d+)?.iso",
-                       releaseFields[0], releaseFields[1], arch, variant)
+               if arch == "armhfp" {
+                       re = 
fmt.Sprintf("CentOS-Userland-%s.%s-armv7hl-RootFS-(?i:%s)(-\\d+)?-sda.raw.xz",
+                               releaseFields[0], releaseFields[1], variant)
+               } else {
+                       re = fmt.Sprintf("CentOS-%s.%s-%s-(?i:%s)(-\\d+)?.iso",
+                               releaseFields[0], releaseFields[1], arch, 
variant)
+               }
        } else {
-               re = fmt.Sprintf("CentOS-%s(.\\d+)?-%s-(?i:%s)(-\\d+)?.iso",
-                       releaseFields[0], arch, variant)
+               if arch == "armhfp" {
+                       re = 
fmt.Sprintf("CentOS-Userland-%s-armv7hl-RootFS-(?i:%s)(-\\d+)?-sda.raw.xz",
+                               releaseFields[0], variant)
+               } else {
+                       re = 
fmt.Sprintf("CentOS-%s(.\\d+)?-%s-(?i:%s)(-\\d+)?.iso",
+                               releaseFields[0], arch, variant)
+               }
        }
 
        return regexp.MustCompile(re).FindString(string(body))
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to