Compare commits
22 Commits
Author | SHA1 | Date | |
---|---|---|---|
bde115f5df
|
|||
d972bae547
|
|||
b3d4a0dbc2
|
|||
4a3d739b85
|
|||
bb319a9ff6
|
|||
21daac4fbc
|
|||
841fd7f585
|
|||
b812048408
|
|||
a5edc4837f
|
|||
9e55ebd44e
|
|||
e35e030c54
|
|||
a4f2a31819
|
|||
c3cf25e523
|
|||
056e38698e
|
|||
32b692f752
|
|||
3f8c7fd86b
|
|||
f9c2849658
|
|||
caba73cd7e
|
|||
5bb79302dd
|
|||
4570e9adbe
|
|||
8029ad2185
|
|||
2f8446864a
|
24
CHANGELOG.md
24
CHANGELOG.md
@ -4,6 +4,30 @@
|
|||||||
|
|
||||||
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
[Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||||
|
|
||||||
|
## [2.1.0]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Graceful shutdown on ^C while kernels generation.
|
||||||
|
|
||||||
|
- Flag to set the container runtime command.
|
||||||
|
|
||||||
|
- out-of-tree image --dry-run for printing full qemu command.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- No exit at the end of the retries, will continue with the other
|
||||||
|
kernels.
|
||||||
|
|
||||||
|
- All temporary files moved to ~/.out-of-tree/tmp/.
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Discrepancies between /lib/modules and /boot should no longer lead
|
||||||
|
to fatal errors.
|
||||||
|
|
||||||
|
- Podman support on macOS.
|
||||||
|
|
||||||
## [2.0.0]
|
## [2.0.0]
|
||||||
|
|
||||||
### Breaking
|
### Breaking
|
||||||
|
11
README.md
11
README.md
@ -17,14 +17,19 @@ out-of-tree is for automating some routine actions for creating development envi
|
|||||||
$ curl -fsSL https://get.docker.com | sh
|
$ curl -fsSL https://get.docker.com | sh
|
||||||
$ sudo usermod -aG docker user && newgrp docker
|
$ sudo usermod -aG docker user && newgrp docker
|
||||||
$ curl -L https://nixos.org/nix/install | sh
|
$ curl -L https://nixos.org/nix/install | sh
|
||||||
$ nix-env -iA nixpkgs.out-of-tree
|
$ nix-env -iA nixpkgs.out-of-tree # Note: may not be up to date immediately, in this case consider installing from source
|
||||||
|
|
||||||
Note that adding a user to group *docker* has serious security implications. Check Docker documentation for more information.
|
Note that adding a user to group *docker* has serious security implications. Check Docker documentation for more information.
|
||||||
|
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
$ brew cask install docker
|
Note: case-sensitive FS is required for the ~/.out-of-tree directory.
|
||||||
$ open --background -a Docker && sleep 1m
|
|
||||||
|
$ brew install podman
|
||||||
|
$ podman machine stop || true
|
||||||
|
$ podman machine rm || true
|
||||||
|
$ podman machine init --cpus=4 --memory=4096 -v $HOME:$HOME
|
||||||
|
$ podman machine start
|
||||||
$ brew tap out-of-tree/repo
|
$ brew tap out-of-tree/repo
|
||||||
$ brew install out-of-tree
|
$ brew install out-of-tree
|
||||||
|
|
||||||
|
42
container.go
42
container.go
@ -20,6 +20,8 @@ import (
|
|||||||
"code.dumpstack.io/tools/out-of-tree/config"
|
"code.dumpstack.io/tools/out-of-tree/config"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var containerRuntime = "docker"
|
||||||
|
|
||||||
type ContainerCmd struct {
|
type ContainerCmd struct {
|
||||||
Filter string `help:"filter by name"`
|
Filter string `help:"filter by name"`
|
||||||
|
|
||||||
@ -56,7 +58,8 @@ type ContainerCleanupCmd struct{}
|
|||||||
func (cmd ContainerCleanupCmd) Run(containerCmd *ContainerCmd) (err error) {
|
func (cmd ContainerCleanupCmd) Run(containerCmd *ContainerCmd) (err error) {
|
||||||
var output []byte
|
var output []byte
|
||||||
for _, name := range containerCmd.Containers() {
|
for _, name := range containerCmd.Containers() {
|
||||||
output, err = exec.Command("docker", "image", "rm", name).CombinedOutput()
|
output, err = exec.Command(containerRuntime, "image", "rm", name).
|
||||||
|
CombinedOutput()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error().Err(err).Str("output", string(output)).Msg("")
|
log.Error().Err(err).Str("output", string(output)).Msg("")
|
||||||
return
|
return
|
||||||
@ -72,7 +75,7 @@ type containerImageInfo struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func listContainerImages() (diis []containerImageInfo, err error) {
|
func listContainerImages() (diis []containerImageInfo, err error) {
|
||||||
cmd := exec.Command("docker", "images")
|
cmd := exec.Command(containerRuntime, "images")
|
||||||
log.Debug().Msgf("%v", cmd)
|
log.Debug().Msgf("%v", cmd)
|
||||||
|
|
||||||
rawOutput, err := cmd.CombinedOutput()
|
rawOutput, err := cmd.CombinedOutput()
|
||||||
@ -148,7 +151,7 @@ func (c container) Build(imagePath string) (output string, err error) {
|
|||||||
args := []string{"build"}
|
args := []string{"build"}
|
||||||
args = append(args, "-t", c.name, imagePath)
|
args = append(args, "-t", c.name, imagePath)
|
||||||
|
|
||||||
cmd := exec.Command("docker", args...)
|
cmd := exec.Command(containerRuntime, args...)
|
||||||
|
|
||||||
flog := log.With().
|
flog := log.With().
|
||||||
Str("command", fmt.Sprintf("%v", cmd)).
|
Str("command", fmt.Sprintf("%v", cmd)).
|
||||||
@ -188,14 +191,26 @@ func (c container) Run(workdir string, command string) (output string, err error
|
|||||||
var args []string
|
var args []string
|
||||||
args = append(args, "run", "--rm")
|
args = append(args, "run", "--rm")
|
||||||
args = append(args, c.Args...)
|
args = append(args, c.Args...)
|
||||||
args = append(args,
|
if workdir != "" {
|
||||||
"-v", workdir+":/work",
|
args = append(args, "-v", workdir+":/work")
|
||||||
"-v", c.Volumes.LibModules+":/lib/modules",
|
}
|
||||||
"-v", c.Volumes.UsrSrc+":/usr/src",
|
if c.Volumes.LibModules != "" {
|
||||||
"-v", c.Volumes.Boot+":/boot")
|
args = append(args, "-v", c.Volumes.LibModules+":/lib/modules")
|
||||||
args = append(args, c.name, "bash", "-c", "cd /work && "+command)
|
}
|
||||||
|
if c.Volumes.UsrSrc != "" {
|
||||||
|
args = append(args, "-v", c.Volumes.UsrSrc+":/usr/src")
|
||||||
|
}
|
||||||
|
if c.Volumes.Boot != "" {
|
||||||
|
args = append(args, "-v", c.Volumes.Boot+":/boot")
|
||||||
|
}
|
||||||
|
args = append(args, c.name, "bash", "-c")
|
||||||
|
if workdir != "" {
|
||||||
|
args = append(args, "cd /work && "+command)
|
||||||
|
} else {
|
||||||
|
args = append(args, command)
|
||||||
|
}
|
||||||
|
|
||||||
cmd := exec.Command("docker", args...)
|
cmd := exec.Command(containerRuntime, args...)
|
||||||
|
|
||||||
log.Debug().Msgf("%v", cmd)
|
log.Debug().Msgf("%v", cmd)
|
||||||
|
|
||||||
@ -207,6 +222,13 @@ func (c container) Run(workdir string, command string) (output string, err error
|
|||||||
|
|
||||||
timer := time.AfterFunc(c.timeout, func() {
|
timer := time.AfterFunc(c.timeout, func() {
|
||||||
flog.Info().Msg("killing container by timeout")
|
flog.Info().Msg("killing container by timeout")
|
||||||
|
|
||||||
|
flog.Debug().Msg("SIGINT")
|
||||||
|
cmd.Process.Signal(os.Interrupt)
|
||||||
|
|
||||||
|
time.Sleep(time.Minute)
|
||||||
|
|
||||||
|
flog.Debug().Msg("SIGKILL")
|
||||||
cmd.Process.Kill()
|
cmd.Process.Kill()
|
||||||
})
|
})
|
||||||
defer timer.Stop()
|
defer timer.Stop()
|
||||||
|
2
debug.go
2
debug.go
@ -144,7 +144,7 @@ func (cmd *DebugCmd) Run(g *Globals) (err error) {
|
|||||||
}
|
}
|
||||||
defer q.Stop()
|
defer q.Stop()
|
||||||
|
|
||||||
tmp, err := ioutil.TempDir("/tmp/", "out-of-tree_")
|
tmp, err := ioutil.TempDir(tempDirBase, "out-of-tree_")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
2
go.mod
2
go.mod
@ -14,7 +14,7 @@ require (
|
|||||||
github.com/naoina/toml v0.1.1
|
github.com/naoina/toml v0.1.1
|
||||||
github.com/natefinch/lumberjack v2.0.0+incompatible
|
github.com/natefinch/lumberjack v2.0.0+incompatible
|
||||||
github.com/olekukonko/tablewriter v0.0.5
|
github.com/olekukonko/tablewriter v0.0.5
|
||||||
github.com/otiai10/copy v1.9.0
|
github.com/otiai10/copy v1.10.0
|
||||||
github.com/remeh/sizedwaitgroup v1.0.0
|
github.com/remeh/sizedwaitgroup v1.0.0
|
||||||
github.com/rs/zerolog v1.29.0
|
github.com/rs/zerolog v1.29.0
|
||||||
github.com/zcalusic/sysinfo v0.9.5
|
github.com/zcalusic/sysinfo v0.9.5
|
||||||
|
11
go.sum
11
go.sum
@ -80,13 +80,10 @@ github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6Yf
|
|||||||
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
|
||||||
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
|
github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec=
|
||||||
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
|
github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY=
|
||||||
github.com/otiai10/copy v1.9.0 h1:7KFNiCgZ91Ru4qW4CWPf/7jqtxLagGRmIxWldPP9VY4=
|
github.com/otiai10/copy v1.10.0 h1:znyI7l134wNg/wDktoVQPxPkgvhDfGCYUasey+h0rDQ=
|
||||||
github.com/otiai10/copy v1.9.0/go.mod h1:hsfX19wcn0UWIHUQ3/4fHuehhk2UyArQ9dVFAn3FczI=
|
github.com/otiai10/copy v1.10.0/go.mod h1:rSaLseMUsZFFbsFGc7wCJnnkTAvdc5L6VWxPE4308Ww=
|
||||||
github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
|
github.com/otiai10/mint v1.5.1 h1:XaPLeE+9vGbuyEHem1JNk3bYc7KKqyI/na0/mLd/Kks=
|
||||||
github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
|
github.com/otiai10/mint v1.5.1/go.mod h1:MJm72SBthJjz8qhefc4z1PYEieWmy8Bku7CjcAqyUSM=
|
||||||
github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
|
|
||||||
github.com/otiai10/mint v1.4.0 h1:umwcf7gbpEwf7WFzqmWwSv0CzbeMsae2u9ZvpP8j2q4=
|
|
||||||
github.com/otiai10/mint v1.4.0/go.mod h1:gifjb2MYOoULtKLqUAEILUG/9KONW6f7YsJ6vQLTlFI=
|
|
||||||
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4=
|
||||||
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
|
github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI=
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
|
20
images.go
20
images.go
@ -13,6 +13,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"os/user"
|
"os/user"
|
||||||
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"code.dumpstack.io/tools/out-of-tree/config"
|
"code.dumpstack.io/tools/out-of-tree/config"
|
||||||
@ -47,6 +48,7 @@ func (cmd *ImageListCmd) Run(g *Globals) (err error) {
|
|||||||
|
|
||||||
type ImageEditCmd struct {
|
type ImageEditCmd struct {
|
||||||
Name string `help:"image name" required:""`
|
Name string `help:"image name" required:""`
|
||||||
|
DryRun bool `help:"do nothing, just print commands"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func (cmd *ImageEditCmd) Run(g *Globals) (err error) {
|
func (cmd *ImageEditCmd) Run(g *Globals) (err error) {
|
||||||
@ -86,6 +88,22 @@ func (cmd *ImageEditCmd) Run(g *Globals) (err error) {
|
|||||||
|
|
||||||
q.Mutable = true
|
q.Mutable = true
|
||||||
|
|
||||||
|
if cmd.DryRun {
|
||||||
|
s := q.Executable()
|
||||||
|
for _, arg := range q.Args() {
|
||||||
|
if strings.Contains(arg, " ") ||
|
||||||
|
strings.Contains(arg, ",") {
|
||||||
|
|
||||||
|
s += fmt.Sprintf(` "%s"`, arg)
|
||||||
|
} else {
|
||||||
|
s += fmt.Sprintf(" %s", arg)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(s)
|
||||||
|
fmt.Println(q.GetSSHCommand())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
err = q.Start()
|
err = q.Start()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
fmt.Println("Qemu start error:", err)
|
fmt.Println("Qemu start error:", err)
|
||||||
@ -159,7 +177,7 @@ func unpackTar(archive, destination string) (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func downloadImage(path, file string) (err error) {
|
func downloadImage(path, file string) (err error) {
|
||||||
tmp, err := ioutil.TempDir("/tmp/", "out-of-tree_")
|
tmp, err := ioutil.TempDir(tempDirBase, "out-of-tree_")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
179
kernel.go
179
kernel.go
@ -12,6 +12,7 @@ import (
|
|||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
|
"os/signal"
|
||||||
"os/user"
|
"os/user"
|
||||||
"regexp"
|
"regexp"
|
||||||
"runtime"
|
"runtime"
|
||||||
@ -68,6 +69,9 @@ func (cmd KernelAutogenCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shutdown := false
|
||||||
|
setSigintHandler(&shutdown)
|
||||||
|
|
||||||
for _, sk := range ka.SupportedKernels {
|
for _, sk := range ka.SupportedKernels {
|
||||||
if sk.DistroRelease == "" {
|
if sk.DistroRelease == "" {
|
||||||
err = errors.New("Please set distro_release")
|
err = errors.New("Please set distro_release")
|
||||||
@ -82,10 +86,14 @@ func (cmd KernelAutogenCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error) {
|
|||||||
kernelCmd.Force,
|
kernelCmd.Force,
|
||||||
!kernelCmd.NoHeaders,
|
!kernelCmd.NoHeaders,
|
||||||
kernelCmd.Shuffle,
|
kernelCmd.Shuffle,
|
||||||
|
&shutdown,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if shutdown {
|
||||||
|
break
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return updateKernelsCfg(kernelCmd.UseHost, !kernelCmd.NoDownload)
|
return updateKernelsCfg(kernelCmd.UseHost, !kernelCmd.NoDownload)
|
||||||
@ -102,6 +110,9 @@ func (cmd *KernelGenallCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shutdown := false
|
||||||
|
setSigintHandler(&shutdown)
|
||||||
|
|
||||||
km := config.KernelMask{
|
km := config.KernelMask{
|
||||||
DistroType: distroType,
|
DistroType: distroType,
|
||||||
DistroRelease: cmd.Ver,
|
DistroRelease: cmd.Ver,
|
||||||
@ -115,6 +126,7 @@ func (cmd *KernelGenallCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error) {
|
|||||||
kernelCmd.Force,
|
kernelCmd.Force,
|
||||||
!kernelCmd.NoHeaders,
|
!kernelCmd.NoHeaders,
|
||||||
kernelCmd.Shuffle,
|
kernelCmd.Shuffle,
|
||||||
|
&shutdown,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@ -135,6 +147,9 @@ func (cmd *KernelInstallCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
shutdown := false
|
||||||
|
setSigintHandler(&shutdown)
|
||||||
|
|
||||||
km := config.KernelMask{
|
km := config.KernelMask{
|
||||||
DistroType: distroType,
|
DistroType: distroType,
|
||||||
DistroRelease: cmd.Ver,
|
DistroRelease: cmd.Ver,
|
||||||
@ -148,6 +163,7 @@ func (cmd *KernelInstallCmd) Run(kernelCmd *KernelCmd, g *Globals) (err error) {
|
|||||||
kernelCmd.Force,
|
kernelCmd.Force,
|
||||||
!kernelCmd.NoHeaders,
|
!kernelCmd.NoHeaders,
|
||||||
kernelCmd.Shuffle,
|
kernelCmd.Shuffle,
|
||||||
|
&shutdown,
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
@ -172,7 +188,7 @@ func matchDebImagePkg(container, mask string) (pkgs []string, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
output, err := c.Run("/tmp", cmd)
|
output, err := c.Run(tempDirBase, cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -203,7 +219,7 @@ func matchCentOSDevelPkg(container, mask string, generic bool) (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
output, err := c.Run("/tmp", cmd)
|
output, err := c.Run(tempDirBase, cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -262,7 +278,8 @@ func generateBaseDockerImage(registry string, commands []config.DockerCommand,
|
|||||||
|
|
||||||
d := "# BASE\n"
|
d := "# BASE\n"
|
||||||
|
|
||||||
cmd := exec.Command("docker", "images", "-q", sk.DockerName())
|
// TODO move as function to container.go
|
||||||
|
cmd := exec.Command(containerRuntime, "images", "-q", sk.DockerName())
|
||||||
log.Debug().Msgf("run %v", cmd)
|
log.Debug().Msgf("run %v", cmd)
|
||||||
|
|
||||||
rawOutput, err := cmd.CombinedOutput()
|
rawOutput, err := cmd.CombinedOutput()
|
||||||
@ -307,7 +324,8 @@ func generateBaseDockerImage(registry string, commands []config.DockerCommand,
|
|||||||
d += "RUN apt-get install -y wget git\n"
|
d += "RUN apt-get install -y wget git\n"
|
||||||
// Install a single kernel and headers to ensure all dependencies are cached
|
// Install a single kernel and headers to ensure all dependencies are cached
|
||||||
d += "RUN export PKGNAME=$(apt-cache search --names-only '^linux-headers-[0-9\\.\\-]*-generic' | awk '{ print $1 }' | head -n 1); " +
|
d += "RUN export PKGNAME=$(apt-cache search --names-only '^linux-headers-[0-9\\.\\-]*-generic' | awk '{ print $1 }' | head -n 1); " +
|
||||||
"apt-get install -y $PKGNAME $(echo $PKGNAME | sed 's/headers/image/')\n"
|
"apt-get install -y $PKGNAME $(echo $PKGNAME | sed 's/headers/image/'); " +
|
||||||
|
"apt-get remove -y $PKGNAME $(echo $PKGNAME | sed 's/headers/image/')\n"
|
||||||
if sk.DistroRelease >= "14.04" {
|
if sk.DistroRelease >= "14.04" {
|
||||||
d += "RUN apt-get install -y libseccomp-dev\n"
|
d += "RUN apt-get install -y libseccomp-dev\n"
|
||||||
}
|
}
|
||||||
@ -388,17 +406,10 @@ func generateBaseDockerImage(registry string, commands []config.DockerCommand,
|
|||||||
}
|
}
|
||||||
|
|
||||||
func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (err error) {
|
func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (err error) {
|
||||||
tmpdir, err := os.MkdirTemp("", "out-of-tree-"+pkgname+"-")
|
|
||||||
if err != nil {
|
|
||||||
log.Fatal().Err(err).Msg("make tmp directory")
|
|
||||||
}
|
|
||||||
defer os.RemoveAll(tmpdir)
|
|
||||||
|
|
||||||
slog := log.With().
|
slog := log.With().
|
||||||
Str("distro_type", sk.DistroType.String()).
|
Str("distro_type", sk.DistroType.String()).
|
||||||
Str("distro_release", sk.DistroRelease).
|
Str("distro_release", sk.DistroRelease).
|
||||||
Str("pkg", pkgname).
|
Str("pkg", pkgname).
|
||||||
Str("tmpdir", tmpdir).
|
|
||||||
Logger()
|
Logger()
|
||||||
|
|
||||||
c, err := NewContainer(sk.DockerName(), time.Hour) // TODO conf
|
c, err := NewContainer(sk.DockerName(), time.Hour) // TODO conf
|
||||||
@ -424,17 +435,14 @@ func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (e
|
|||||||
|
|
||||||
volumes := c.Volumes
|
volumes := c.Volumes
|
||||||
|
|
||||||
c.Volumes.LibModules = fmt.Sprintf("%s/libmodules", tmpdir)
|
c.Volumes.LibModules = ""
|
||||||
os.MkdirAll(c.Volumes.LibModules, 0777)
|
c.Volumes.UsrSrc = ""
|
||||||
|
c.Volumes.Boot = ""
|
||||||
c.Volumes.UsrSrc = fmt.Sprintf("%s/usrsrc", tmpdir)
|
|
||||||
os.MkdirAll(c.Volumes.UsrSrc, 0777)
|
|
||||||
|
|
||||||
c.Volumes.Boot = fmt.Sprintf("%s/boot", tmpdir)
|
|
||||||
os.MkdirAll(c.Volumes.Boot, 0777)
|
|
||||||
|
|
||||||
slog.Debug().Msgf("Installing kernel")
|
slog.Debug().Msgf("Installing kernel")
|
||||||
|
|
||||||
|
cmd := "true"
|
||||||
|
|
||||||
switch sk.DistroType {
|
switch sk.DistroType {
|
||||||
case config.Ubuntu:
|
case config.Ubuntu:
|
||||||
var headerspkg string
|
var headerspkg string
|
||||||
@ -442,12 +450,7 @@ func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (e
|
|||||||
headerspkg = strings.Replace(pkgname, "image", "headers", -1)
|
headerspkg = strings.Replace(pkgname, "image", "headers", -1)
|
||||||
}
|
}
|
||||||
|
|
||||||
cmd := fmt.Sprintf("apt-get install -y %s %s", pkgname, headerspkg)
|
cmd += fmt.Sprintf(" && apt-get install -y %s %s", pkgname, headerspkg)
|
||||||
|
|
||||||
_, err = c.Run("/tmp", cmd)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
case config.CentOS:
|
case config.CentOS:
|
||||||
imagepkg := strings.Replace(pkgname, "-devel", "", -1)
|
imagepkg := strings.Replace(pkgname, "-devel", "", -1)
|
||||||
|
|
||||||
@ -456,19 +459,11 @@ func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (e
|
|||||||
if !headers {
|
if !headers {
|
||||||
pkgname = ""
|
pkgname = ""
|
||||||
}
|
}
|
||||||
cmd := fmt.Sprintf("yum -y install %s %s\n", imagepkg,
|
cmd += fmt.Sprintf(" && yum -y install %s %s", imagepkg,
|
||||||
pkgname)
|
pkgname)
|
||||||
_, err = c.Run("/tmp", cmd)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd = fmt.Sprintf("dracut --add-drivers 'e1000 ext4' -f "+
|
cmd += fmt.Sprintf(" && dracut --add-drivers 'e1000 ext4' -f "+
|
||||||
"/boot/initramfs-%s.img %s\n", version, version)
|
"/boot/initramfs-%s.img %s", version, version)
|
||||||
_, err = c.Run("/tmp", cmd)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
err = fmt.Errorf("%s not yet supported", sk.DistroType.String())
|
err = fmt.Errorf("%s not yet supported", sk.DistroType.String())
|
||||||
return
|
return
|
||||||
@ -478,33 +473,11 @@ func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (e
|
|||||||
c.Args = append(c.Args, "-v", volumes.UsrSrc+":/target/usr/src")
|
c.Args = append(c.Args, "-v", volumes.UsrSrc+":/target/usr/src")
|
||||||
c.Args = append(c.Args, "-v", volumes.Boot+":/target/boot")
|
c.Args = append(c.Args, "-v", volumes.Boot+":/target/boot")
|
||||||
|
|
||||||
cmd := "true"
|
cmd += " && cp -r /boot /target/"
|
||||||
|
cmd += " && cp -r /lib/modules /target/lib/"
|
||||||
|
cmd += " && cp -r /usr/src /target/usr/"
|
||||||
|
|
||||||
files, err := ioutil.ReadDir(c.Volumes.Boot)
|
_, err = c.Run("", cmd)
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(files) != 0 {
|
|
||||||
cmd += " && cp -r /boot/* /target/boot/"
|
|
||||||
}
|
|
||||||
|
|
||||||
files, err = ioutil.ReadDir(c.Volumes.LibModules)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(files) != 0 {
|
|
||||||
cmd += " && cp -r /lib/modules/* /target/lib/modules/"
|
|
||||||
}
|
|
||||||
|
|
||||||
files, err = ioutil.ReadDir(c.Volumes.UsrSrc)
|
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if len(files) != 0 {
|
|
||||||
cmd += " && cp -r /usr/src/* /target/usr/src/"
|
|
||||||
}
|
|
||||||
|
|
||||||
_, err = c.Run("/tmp", cmd)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -513,32 +486,34 @@ func installKernel(sk config.KernelMask, pkgname string, force, headers bool) (e
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func genKernelPath(files []os.FileInfo, kname string) string {
|
func findKernelFile(files []os.FileInfo, kname string) (name string, err error) {
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if strings.HasPrefix(file.Name(), "vmlinuz") {
|
if strings.HasPrefix(file.Name(), "vmlinuz") {
|
||||||
if strings.Contains(file.Name(), kname) {
|
if strings.Contains(file.Name(), kname) {
|
||||||
return file.Name()
|
name = file.Name()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Fatal().Msgf("cannot find kernel %s", kname)
|
err = errors.New("cannot find kernel")
|
||||||
return ""
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func genInitrdPath(files []os.FileInfo, kname string) string {
|
func findInitrdFile(files []os.FileInfo, kname string) (name string, err error) {
|
||||||
for _, file := range files {
|
for _, file := range files {
|
||||||
if strings.HasPrefix(file.Name(), "initrd") ||
|
if strings.HasPrefix(file.Name(), "initrd") ||
|
||||||
strings.HasPrefix(file.Name(), "initramfs") {
|
strings.HasPrefix(file.Name(), "initramfs") {
|
||||||
|
|
||||||
if strings.Contains(file.Name(), kname) {
|
if strings.Contains(file.Name(), kname) {
|
||||||
return file.Name()
|
name = file.Name()
|
||||||
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Fatal().Msgf("cannot find initrd %s", kname)
|
err = errors.New("cannot find kernel")
|
||||||
return ""
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func genRootfsImage(d containerImageInfo, download bool) (rootfs string, err error) {
|
func genRootfsImage(d containerImageInfo, download bool) (rootfs string, err error) {
|
||||||
@ -640,16 +615,29 @@ func listContainersKernels(dii containerImageInfo, newkcfg *config.KernelConfig,
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, krel := range moddirs {
|
for _, krel := range moddirs {
|
||||||
|
log.Debug().Msgf("generate config entry for %s", krel.Name())
|
||||||
|
|
||||||
|
var kernelFile, initrdFile string
|
||||||
|
kernelFile, err = findKernelFile(bootfiles, krel.Name())
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Msgf("cannot find kernel %s", krel.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
initrdFile, err = findInitrdFile(bootfiles, krel.Name())
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Msgf("cannot find initrd %s", krel.Name())
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
ki := config.KernelInfo{
|
ki := config.KernelInfo{
|
||||||
DistroType: dii.DistroType,
|
DistroType: dii.DistroType,
|
||||||
DistroRelease: dii.DistroRelease,
|
DistroRelease: dii.DistroRelease,
|
||||||
KernelRelease: krel.Name(),
|
KernelRelease: krel.Name(),
|
||||||
ContainerName: dii.Name,
|
ContainerName: dii.Name,
|
||||||
|
|
||||||
KernelPath: c.Volumes.Boot + "/" +
|
KernelPath: c.Volumes.Boot + "/" + kernelFile,
|
||||||
genKernelPath(bootfiles, krel.Name()),
|
InitrdPath: c.Volumes.Boot + "/" + initrdFile,
|
||||||
InitrdPath: c.Volumes.Boot + "/" +
|
|
||||||
genInitrdPath(bootfiles, krel.Name()),
|
|
||||||
ModulesPath: c.Volumes.LibModules + "/" + krel.Name(),
|
ModulesPath: c.Volumes.LibModules + "/" + krel.Name(),
|
||||||
|
|
||||||
RootFS: rootfs,
|
RootFS: rootfs,
|
||||||
@ -660,7 +648,7 @@ func listContainersKernels(dii containerImageInfo, newkcfg *config.KernelConfig,
|
|||||||
for _, cmd := range []string{
|
for _, cmd := range []string{
|
||||||
"find /boot -type f -exec chmod a+r {} \\;",
|
"find /boot -type f -exec chmod a+r {} \\;",
|
||||||
} {
|
} {
|
||||||
_, err = c.Run("/tmp", cmd)
|
_, err = c.Run(tempDirBase, cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -687,20 +675,40 @@ func shuffleStrings(a []string) []string {
|
|||||||
return a
|
return a
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setSigintHandler(variable *bool) {
|
||||||
|
c := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(c, os.Interrupt)
|
||||||
|
go func() {
|
||||||
|
counter := 0
|
||||||
|
for _ = range c {
|
||||||
|
if counter == 0 {
|
||||||
|
*variable = true
|
||||||
|
log.Warn().Msg("shutdown requested, finishing work")
|
||||||
|
log.Info().Msg("^C a couple of times more for an unsafe exit")
|
||||||
|
} else if counter >= 3 {
|
||||||
|
log.Fatal().Msg("unsafe exit")
|
||||||
|
}
|
||||||
|
|
||||||
|
counter += 1
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
func generateKernels(km config.KernelMask, registry string,
|
func generateKernels(km config.KernelMask, registry string,
|
||||||
commands []config.DockerCommand, max, retries int64,
|
commands []config.DockerCommand, max, retries int64,
|
||||||
download, force, headers, shuffle bool) (err error) {
|
download, force, headers, shuffle bool, shutdown *bool) (err error) {
|
||||||
|
|
||||||
log.Info().Msgf("Generating for kernel mask %v", km)
|
log.Info().Msgf("Generating for kernel mask %v", km)
|
||||||
|
|
||||||
_, err = genRootfsImage(containerImageInfo{Name: km.DockerName()},
|
_, err = genRootfsImage(containerImageInfo{Name: km.DockerName()},
|
||||||
download)
|
download)
|
||||||
if err != nil {
|
if err != nil || *shutdown {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
err = generateBaseDockerImage(registry, commands, km)
|
err = generateBaseDockerImage(registry, commands, km)
|
||||||
if err != nil {
|
if err != nil || *shutdown {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -714,7 +722,7 @@ func generateKernels(km config.KernelMask, registry string,
|
|||||||
default:
|
default:
|
||||||
err = fmt.Errorf("%s not yet supported", km.DistroType.String())
|
err = fmt.Errorf("%s not yet supported", km.DistroType.String())
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil || *shutdown {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -727,18 +735,29 @@ func generateKernels(km config.KernelMask, registry string,
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *shutdown {
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
log.Info().Msgf("%d/%d %s", i+1, len(pkgs), pkg)
|
log.Info().Msgf("%d/%d %s", i+1, len(pkgs), pkg)
|
||||||
|
|
||||||
var attempt int64
|
var attempt int64
|
||||||
for {
|
for {
|
||||||
attempt++
|
attempt++
|
||||||
|
|
||||||
|
if *shutdown {
|
||||||
|
err = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
err = installKernel(km, pkg, force, headers)
|
err = installKernel(km, pkg, force, headers)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
max--
|
max--
|
||||||
break
|
break
|
||||||
} else if attempt >= retries {
|
} else if attempt >= retries {
|
||||||
log.Fatal().Err(err).Msg("install kernel")
|
log.Error().Err(err).Msg("install kernel")
|
||||||
|
log.Debug().Msg("skip")
|
||||||
|
break
|
||||||
} else {
|
} else {
|
||||||
log.Warn().Err(err).Msg("install kernel")
|
log.Warn().Err(err).Msg("install kernel")
|
||||||
time.Sleep(time.Second)
|
time.Sleep(time.Second)
|
||||||
|
@ -37,7 +37,7 @@ func genHostKernels(download bool) (kcfg config.KernelConfig, err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
kernelsBase := "/boot/"
|
kernelsBase := "/boot/"
|
||||||
files, err := ioutil.ReadDir(kernelsBase)
|
bootfiles, err := ioutil.ReadDir(kernelsBase)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
@ -55,20 +55,35 @@ func genHostKernels(download bool) (kcfg config.KernelConfig, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, k := range strings.Fields(string(rawOutput)) {
|
for _, krel := range strings.Fields(string(rawOutput)) {
|
||||||
|
log.Debug().Msgf("generate config entry for %s", krel)
|
||||||
|
|
||||||
|
var kernelFile, initrdFile string
|
||||||
|
kernelFile, err = findKernelFile(bootfiles, krel)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Msgf("cannot find kernel %s", krel)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
initrdFile, err = findInitrdFile(bootfiles, krel)
|
||||||
|
if err != nil {
|
||||||
|
log.Warn().Msgf("cannot find initrd %s", krel)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
ki := config.KernelInfo{
|
ki := config.KernelInfo{
|
||||||
DistroType: distroType,
|
DistroType: distroType,
|
||||||
DistroRelease: si.OS.Version,
|
DistroRelease: si.OS.Version,
|
||||||
KernelRelease: k,
|
KernelRelease: krel,
|
||||||
|
|
||||||
KernelSource: "/lib/modules/" + k + "/build",
|
KernelSource: "/lib/modules/" + krel + "/build",
|
||||||
|
|
||||||
KernelPath: kernelsBase + genKernelPath(files, k),
|
KernelPath: kernelsBase + kernelFile,
|
||||||
InitrdPath: kernelsBase + genInitrdPath(files, k),
|
InitrdPath: kernelsBase + initrdFile,
|
||||||
RootFS: rootfs,
|
RootFS: rootfs,
|
||||||
}
|
}
|
||||||
|
|
||||||
vmlinux := "/usr/lib/debug/boot/vmlinux-" + k
|
vmlinux := "/usr/lib/debug/boot/vmlinux-" + krel
|
||||||
log.Print("vmlinux", vmlinux)
|
log.Print("vmlinux", vmlinux)
|
||||||
if exists(vmlinux) {
|
if exists(vmlinux) {
|
||||||
ki.VmlinuxPath = vmlinux
|
ki.VmlinuxPath = vmlinux
|
||||||
|
26
main.go
26
main.go
@ -9,6 +9,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
|
"os/exec"
|
||||||
"os/user"
|
"os/user"
|
||||||
"runtime/debug"
|
"runtime/debug"
|
||||||
"strconv"
|
"strconv"
|
||||||
@ -44,6 +45,8 @@ type CLI struct {
|
|||||||
Version VersionFlag `name:"version" help:"print version information and quit"`
|
Version VersionFlag `name:"version" help:"print version information and quit"`
|
||||||
|
|
||||||
LogLevel LogLevelFlag `enum:"trace,debug,info,warn,error" default:"info"`
|
LogLevel LogLevelFlag `enum:"trace,debug,info,warn,error" default:"info"`
|
||||||
|
|
||||||
|
ContainerRuntime string `enum:"podman,docker" default:"podman"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type LogLevelFlag string
|
type LogLevelFlag string
|
||||||
@ -89,6 +92,8 @@ func (lw *LevelWriter) WriteLevel(l zerolog.Level, p []byte) (n int, err error)
|
|||||||
return len(p), nil
|
return len(p), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var tempDirBase string
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
rand.Seed(time.Now().UnixNano())
|
rand.Seed(time.Now().UnixNano())
|
||||||
|
|
||||||
@ -101,7 +106,7 @@ func main() {
|
|||||||
Compact: true,
|
Compact: true,
|
||||||
}),
|
}),
|
||||||
kong.Vars{
|
kong.Vars{
|
||||||
"version": "2.0.0",
|
"version": "2.1.1",
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -124,6 +129,9 @@ func main() {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tempDirBase = usr.HomeDir + "/.out-of-tree/tmp/"
|
||||||
|
os.MkdirAll(tempDirBase, os.ModePerm)
|
||||||
|
|
||||||
log.Logger = log.Output(zerolog.MultiLevelWriter(
|
log.Logger = log.Output(zerolog.MultiLevelWriter(
|
||||||
&LevelWriter{Writer: zerolog.NewConsoleWriter(
|
&LevelWriter{Writer: zerolog.NewConsoleWriter(
|
||||||
func(w *zerolog.ConsoleWriter) {
|
func(w *zerolog.ConsoleWriter) {
|
||||||
@ -148,6 +156,22 @@ func main() {
|
|||||||
log.Debug().Msgf("%v", buildInfo.Settings)
|
log.Debug().Msgf("%v", buildInfo.Settings)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_, err = exec.LookPath(cli.ContainerRuntime)
|
||||||
|
if err != nil {
|
||||||
|
if cli.ContainerRuntime == "podman" { // default value
|
||||||
|
log.Debug().Msgf("podman is not found in $PATH, " +
|
||||||
|
"fall back to docker")
|
||||||
|
cli.ContainerRuntime = "docker"
|
||||||
|
}
|
||||||
|
|
||||||
|
_, err = exec.LookPath(cli.ContainerRuntime)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatal().Msgf("%v is not found in $PATH",
|
||||||
|
cli.ContainerRuntime)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
containerRuntime = cli.ContainerRuntime
|
||||||
|
|
||||||
err = ctx.Run(&cli.Globals)
|
err = ctx.Run(&cli.Globals)
|
||||||
ctx.FatalIfErrorf(err)
|
ctx.FatalIfErrorf(err)
|
||||||
}
|
}
|
||||||
|
10
pew.go
10
pew.go
@ -14,7 +14,6 @@ import (
|
|||||||
"math/rand"
|
"math/rand"
|
||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"os/user"
|
|
||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -599,14 +598,7 @@ func (cmd PewCmd) testArtifact(swg *sizedwaitgroup.SizedWaitGroup,
|
|||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
usr, err := user.Current()
|
tmp, err := ioutil.TempDir(tempDirBase, "out-of-tree_")
|
||||||
if err != nil {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
tmpdir := usr.HomeDir + "/.out-of-tree/tmp"
|
|
||||||
os.MkdirAll(tmpdir, os.ModePerm)
|
|
||||||
|
|
||||||
tmp, err := ioutil.TempDir(tmpdir, "out-of-tree_")
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
slog.Error().Err(err).Msg("making tmp directory")
|
slog.Error().Err(err).Msg("making tmp directory")
|
||||||
return
|
return
|
||||||
|
@ -61,7 +61,7 @@ func preload(q *qemu.System, ki config.KernelInfo, pm config.PreloadModule,
|
|||||||
func buildAndInsmod(workPath string, q *qemu.System, ki config.KernelInfo,
|
func buildAndInsmod(workPath string, q *qemu.System, ki config.KernelInfo,
|
||||||
dockerTimeout time.Duration, cache string) (err error) {
|
dockerTimeout time.Duration, cache string) (err error) {
|
||||||
|
|
||||||
tmp, err := ioutil.TempDir("", "out-of-tree_")
|
tmp, err := ioutil.TempDir(tempDirBase, "out-of-tree_")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -208,14 +208,16 @@ func (q System) cmdline() (s string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Start qemu process
|
func (q System) Executable() string {
|
||||||
func (q *System) Start() (err error) {
|
return "qemu-system-" + string(q.arch)
|
||||||
rand.Seed(time.Now().UnixNano()) // Are you sure?
|
}
|
||||||
|
|
||||||
|
func (q *System) Args() (qemuArgs []string) {
|
||||||
if q.sshAddrPort == "" {
|
if q.sshAddrPort == "" {
|
||||||
q.sshAddrPort = getFreeAddrPort()
|
q.sshAddrPort = getFreeAddrPort()
|
||||||
}
|
}
|
||||||
hostfwd := fmt.Sprintf("hostfwd=tcp:%s-:22", q.sshAddrPort)
|
hostfwd := fmt.Sprintf("hostfwd=tcp:%s-:22", q.sshAddrPort)
|
||||||
qemuArgs := []string{"-nographic",
|
qemuArgs = []string{"-nographic",
|
||||||
"-hda", q.drivePath,
|
"-hda", q.drivePath,
|
||||||
"-kernel", q.kernel.KernelPath,
|
"-kernel", q.kernel.KernelPath,
|
||||||
"-smp", fmt.Sprintf("%d", q.Cpus),
|
"-smp", fmt.Sprintf("%d", q.Cpus),
|
||||||
@ -245,8 +247,14 @@ func (q *System) Start() (err error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
qemuArgs = append(qemuArgs, "-append", q.cmdline())
|
qemuArgs = append(qemuArgs, "-append", q.cmdline())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
q.cmd = exec.Command("qemu-system-"+string(q.arch), qemuArgs...)
|
// Start qemu process
|
||||||
|
func (q *System) Start() (err error) {
|
||||||
|
rand.Seed(time.Now().UnixNano()) // Are you sure?
|
||||||
|
|
||||||
|
q.cmd = exec.Command(q.Executable(), q.Args()...)
|
||||||
q.log.Debug().Msgf("%v", q.cmd)
|
q.log.Debug().Msgf("%v", q.cmd)
|
||||||
|
|
||||||
if q.pipe.stdin, err = q.cmd.StdinPipe(); err != nil {
|
if q.pipe.stdin, err = q.cmd.StdinPipe(); err != nil {
|
||||||
|
Reference in New Issue
Block a user