1
0
mirror of https://github.com/lxc/distrobuilder.git synced 2026-02-05 06:45:19 +01:00
Files
distrobuilder/distrobuilder/chroot.go
Stéphane Graber 57091a0e63 Fix golang-ci reported issues
Signed-off-by: Stéphane Graber <stgraber@stgraber.org>
2025-04-02 14:37:13 -04:00

83 lines
2.1 KiB
Go

package main
import (
"errors"
"fmt"
"os"
"path/filepath"
"github.com/sirupsen/logrus"
"golang.org/x/sys/unix"
)
func getOverlay(logger *logrus.Logger, cacheDir, sourceDir string) (func(), string, error) {
var stat unix.Statfs_t
// Skip overlay on xfs and zfs
for _, dir := range []string{cacheDir, sourceDir} {
err := unix.Statfs(dir, &stat)
if err != nil {
return nil, "", err
}
switch stat.Type {
case unix.XFS_SUPER_MAGIC:
return nil, "", errors.New("overlay not supported on xfs")
case 0x2fc12fc1:
return nil, "", errors.New("overlay not supported on zfs")
}
}
upperDir := filepath.Join(cacheDir, "upper")
overlayDir := filepath.Join(cacheDir, "overlay")
workDir := filepath.Join(cacheDir, "work")
err := os.Mkdir(upperDir, 0o755)
if err != nil {
return nil, "", fmt.Errorf("Failed to create directory %q: %w", upperDir, err)
}
err = os.Mkdir(overlayDir, 0o755)
if err != nil {
return nil, "", fmt.Errorf("Failed to create directory %q: %w", overlayDir, err)
}
err = os.Mkdir(workDir, 0o755)
if err != nil {
return nil, "", fmt.Errorf("Failed to create directory %q: %w", workDir, err)
}
opts := fmt.Sprintf("lowerdir=%s,upperdir=%s,workdir=%s", sourceDir, upperDir, workDir)
err = unix.Mount("overlay", overlayDir, "overlay", 0, opts)
if err != nil {
return nil, "", fmt.Errorf("Failed to mount overlay: %w", err)
}
cleanup := func() {
unix.Sync()
err := unix.Unmount(overlayDir, 0)
if err != nil {
logger.WithFields(logrus.Fields{"err": err, "dir": overlayDir}).Warn("Failed to unmount overlay directory")
}
err = os.RemoveAll(upperDir)
if err != nil {
logger.WithFields(logrus.Fields{"err": err, "dir": upperDir}).Warn("Failed to remove upper directory")
}
err = os.RemoveAll(workDir)
if err != nil {
logger.WithFields(logrus.Fields{"err": err, "dir": workDir}).Warn("Failed to remove work directory")
}
err = os.Remove(overlayDir)
if err != nil {
logger.WithFields(logrus.Fields{"err": err, "dir": overlayDir}).Warn("Failed to remove overlay directory")
}
}
return cleanup, overlayDir, nil
}