Skip to content

Commit

Permalink
feat: copy rootfs when creating new VM
Browse files Browse the repository at this point in the history
  • Loading branch information
angristan committed Jul 31, 2021
1 parent 9a493ee commit 56620d0
Show file tree
Hide file tree
Showing 8 changed files with 35 additions and 10 deletions.
4 changes: 4 additions & 0 deletions README.md
Expand Up @@ -161,3 +161,7 @@ Our C program has been successfully compiled and executed!
"stdout": "Hello, World!"
}
```

## Known issues

Cleanup when shutting down VMs does not work properly.
1 change: 1 addition & 0 deletions go.mod
Expand Up @@ -19,6 +19,7 @@ require (
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/imroc/req v0.3.0
github.com/mailru/easyjson v0.7.7 // indirect
github.com/rs/xid v1.3.0 // indirect
github.com/sirupsen/logrus v1.8.1
github.com/streadway/amqp v1.0.0
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Expand Up @@ -276,6 +276,8 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
github.com/rs/xid v1.3.0 h1:6NjYksEUlhurdVehpc7S7dk6DAmcKv8V9gG0FsVN2U4=
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4=
github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc=
Expand Down
2 changes: 0 additions & 2 deletions job.go
Expand Up @@ -53,7 +53,6 @@ func (job benchJob) run(ctx context.Context, WarmVMs <-chan runningFirecracker)
var httpRes *http.Response
var agentRes agentExecRes

// FIXME
httpRes, err = http.Post("http://"+vm.ip.String()+":8080/run", "application/json", bytes.NewBuffer(reqJSON))
if err != nil {
log.WithError(err).Error("Failed to request execution to agent")
Expand All @@ -76,5 +75,4 @@ func (job benchJob) run(ctx context.Context, WarmVMs <-chan runningFirecracker)
if err != nil {
q.setjobFailed(ctx, job, agentExecRes{Error: err.Error()})
}

}
1 change: 1 addition & 0 deletions main.go
Expand Up @@ -47,6 +47,7 @@ type agentExecRes struct {
type runningFirecracker struct {
vmmCtx context.Context
vmmCancel context.CancelFunc
vmmID string
machine *firecracker.Machine
ip net.IP
}
Expand Down
13 changes: 6 additions & 7 deletions options.go
Expand Up @@ -2,7 +2,6 @@ package main

import (
"fmt"
"math/rand"
"os"
"path/filepath"
"strconv"
Expand All @@ -12,17 +11,16 @@ import (
models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
)

// Converts options to a usable firecracker config
func getFirecrackerConfig() (firecracker.Config, error) {
socket := getSocketPath()
func getFirecrackerConfig(vmmID string) (firecracker.Config, error) {
socket := getSocketPath(vmmID)
return firecracker.Config{
SocketPath: socket,
KernelImagePath: "../../linux/vmlinux",
LogPath: fmt.Sprintf("%s.log", socket),
Drives: []models.Drive{{
DriveID: firecracker.String("1"),
// TODO: copy base rootfs and use a temp roots per VM
PathOnHost: firecracker.String("../agent/rootfs.ext4"),
PathOnHost: firecracker.String("/tmp/rootfs-" + vmmID + ".ext4"),
IsRootDevice: firecracker.Bool(true),
IsReadOnly: firecracker.Bool(false),
RateLimiter: firecracker.NewRateLimiter(
Expand Down Expand Up @@ -54,11 +52,12 @@ func getFirecrackerConfig() (firecracker.Config, error) {
}, nil
}

func getSocketPath() string {
func getSocketPath(vmmID string) string {
filename := strings.Join([]string{
".firecracker.sock",
strconv.Itoa(os.Getpid()),
strconv.Itoa(rand.Intn(10000))},
vmmID,
},
"-",
)
dir := os.TempDir()
Expand Down
4 changes: 4 additions & 0 deletions vm.go
Expand Up @@ -46,4 +46,8 @@ func (vm runningFirecracker) shutDown() {
if err != nil {
log.WithError(err).Error("Failed to delete firecracker socket")
}
err = os.Remove("/tmp/rootfs-" + vm.vmmID + ".ext4")
if err != nil {
log.WithError(err).Error("Failed to delete firecracker rootfs")
}
}
18 changes: 17 additions & 1 deletion vmm.go
Expand Up @@ -3,16 +3,31 @@ package main
import (
"context"
"fmt"
"io/ioutil"
"os"
"os/exec"

firecracker "github.com/firecracker-microvm/firecracker-go-sdk"
"github.com/rs/xid"
log "github.com/sirupsen/logrus"
)

func copy(src string, dst string) error {
data, err := ioutil.ReadFile(src)
if err != nil {
return err
}
err = ioutil.WriteFile(dst, data, 0644)
return err
}

// Create a VMM with a given set of options and start the VM
func createAndStartVM(ctx context.Context) (*runningFirecracker, error) {
fcCfg, err := getFirecrackerConfig()
vmmID := xid.New().String()

copy("../agent/rootfs.ext4", "/tmp/rootfs-"+vmmID+".ext4")

fcCfg, err := getFirecrackerConfig(vmmID)
if err != nil {
log.Errorf("Error: %s", err)
return nil, err
Expand Down Expand Up @@ -78,6 +93,7 @@ func createAndStartVM(ctx context.Context) (*runningFirecracker, error) {
return &runningFirecracker{
vmmCtx: vmmCtx,
vmmCancel: vmmCancel,
vmmID: vmmID,
machine: m,
ip: m.Cfg.NetworkInterfaces[0].StaticConfiguration.IPConfiguration.IPAddr.IP,
}, nil
Expand Down

0 comments on commit 56620d0

Please sign in to comment.