aboutsummaryrefslogtreecommitdiffstats
path: root/pkg/build/linux_linux.go
diff options
context:
space:
mode:
authorAleksandr Nogikh <nogikh@google.com>2022-04-08 17:28:04 +0000
committerAleksandr Nogikh <wp32pw@gmail.com>2022-04-11 15:07:50 +0200
commitaf01ee7dda3c1b644f43230ae466b6dc7ceb97c3 (patch)
treec2d2fdd59fff9832e98ca741f9b202f229faac6d /pkg/build/linux_linux.go
parente22c3da3b05600c6c0f62142160839b4b7f82a62 (diff)
pkg/build: mount /etc before copying the sysctl file
Assume that /etc can be on a partition different from the one, where the kernel resides.
Diffstat (limited to 'pkg/build/linux_linux.go')
-rw-r--r--pkg/build/linux_linux.go18
1 files changed, 17 insertions, 1 deletions
diff --git a/pkg/build/linux_linux.go b/pkg/build/linux_linux.go
index e0a36f34d..4a8270353 100644
--- a/pkg/build/linux_linux.go
+++ b/pkg/build/linux_linux.go
@@ -55,7 +55,7 @@ func embedLinuxKernel(params Params, kernelPath string) error {
return err
}
if params.SysctlFile != "" {
- if err := osutil.CopyFile(params.SysctlFile, filepath.Join(mountDir, "etc", "sysctl.conf")); err != nil {
+ if err := copySysctlFile(params.SysctlFile, loopFile, mountDir); err != nil {
return err
}
}
@@ -65,6 +65,22 @@ func embedLinuxKernel(params Params, kernelPath string) error {
return osutil.CopyFile(imageFile, filepath.Join(params.OutputDir, "image"))
}
+func copySysctlFile(sysctlFile, loopFile, mountDir string) error {
+ etcFolder := filepath.Join(mountDir, "etc")
+ for idx := 2; ; idx++ {
+ if osutil.IsExist(etcFolder) {
+ break
+ }
+ err := tryMount(fmt.Sprintf("%sp%d", loopFile, idx), mountDir)
+ if err != nil {
+ // Most likely we've just run out of partitions.
+ return fmt.Errorf("didn't find a partition that has /etc")
+ }
+ defer unix.Unmount(mountDir, 0)
+ }
+ return osutil.CopyFile(sysctlFile, filepath.Join(etcFolder, "sysctl.conf"))
+}
+
func tryMount(device, mountDir string) error {
var err error
loop: