Skip to content

Commit c144bb4

Browse files
committed
feat: working configuration
1 parent dec6c06 commit c144bb4

File tree

8 files changed

+333
-50
lines changed

8 files changed

+333
-50
lines changed

Makefile

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
build:
2-
@go build -o bin/firetest
2+
go build -o bin/firetest
33
run: build
4-
@sudo -E ./bin/firetest
4+
sudo ./bin/firetest
55
test:
6-
@go test ./...
6+
go test ./...

bin/firetest

-14.9 KB
Binary file not shown.

go.mod

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ toolchain go1.22.3
77
require (
88
github.com/docker/docker v27.0.3+incompatible
99
github.com/firecracker-microvm/firecracker-go-sdk v1.0.0
10+
github.com/freddierice/go-losetup v0.0.0-20170407175016-fc9adea44124
1011
github.com/sirupsen/logrus v1.9.3
12+
github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5
13+
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f
1114
github.com/weaveworks/ignite v0.10.0
1215
)
1316

@@ -50,8 +53,6 @@ require (
5053
github.com/opencontainers/image-spec v1.0.2 // indirect
5154
github.com/opentracing/opentracing-go v1.2.0 // indirect
5255
github.com/pkg/errors v0.9.1 // indirect
53-
github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5 // indirect
54-
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f // indirect
5556
go.mongodb.org/mongo-driver v1.8.3 // indirect
5657
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.53.0 // indirect
5758
go.opentelemetry.io/otel v1.28.0 // indirect

go.sum

+1
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,7 @@ github.com/fluxcd/toolkit v0.0.1-beta.2/go.mod h1:NqDXj2aeVMbVkrCHeP/r0um+edXXye
331331
github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc=
332332
github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
333333
github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k=
334+
github.com/freddierice/go-losetup v0.0.0-20170407175016-fc9adea44124 h1:TVfi5xMshZAXzVXozESk8bi0JSTPwHkx7qtLOkkcu/c=
334335
github.com/freddierice/go-losetup v0.0.0-20170407175016-fc9adea44124/go.mod h1:zAk7fcFx45euzK9Az14j6Hd9n8Cwhnjp/NBfhSIAmFg=
335336
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
336337
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=

main.go

+39-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,45 @@
11
package main
22

3-
import "ranjankuldeep/test/methods"
3+
import (
4+
"fmt"
5+
"log"
6+
"os"
7+
"ranjankuldeep/test/snapshot"
8+
)
49

510
func main() {
6-
methods.ExampleJailerConfig_enablingJailer()
11+
baseFile := "../ubuntu-22.04.ext4"
12+
overlayDir := "../overlays"
13+
uid := 123
14+
gid := 100
15+
16+
device, err := snapshot.CreateDeviceMapper(baseFile, overlayDir)
17+
if err != nil {
18+
log.Fatalf("Failed to create device mapper: %v", err)
19+
}
20+
defer func() {
21+
if err := device.Cleanup(); err != nil {
22+
log.Fatalf("Failed to cleanup device mapper: %v", err)
23+
}
24+
}()
25+
26+
if err := os.Chown(device.OverlayFilename, uid, gid); err != nil {
27+
log.Fatalf("Failed to change ownership of overlay file: %v", err)
28+
}
29+
30+
fmt.Printf("Ownership of overlay file %s changed to UID: %d and GID: %d\n", device.OverlayFilename, uid, gid)
31+
32+
fmt.Printf("Device Mapper created:\n")
33+
fmt.Printf("Base Device: %s\n", device.BaseDev.Path())
34+
fmt.Printf("Overlay Device: %s\n", device.OverlayDev.Path())
35+
fmt.Printf("Base Name: %s\n", device.BaseName)
36+
fmt.Printf("Overlay Name: %s\n", device.OverlayName)
37+
fmt.Printf("Overlay Filename: %s\n", device.OverlayFilename)
38+
39+
// The overlay device you will pass to Firecracker
40+
overlayDevicePath := fmt.Sprintf("/dev/mapper/%s", device.OverlayName)
41+
fmt.Printf("Overlay Device Path: %s\n", overlayDevicePath)
42+
43+
// methods.ExampleJailerConfig_enablingJailer()
744
select {}
845
}

methods/container.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func CreateContainer(name string) (string, error) {
5050
hostConfig := &container.HostConfig{
5151
AutoRemove: true,
5252
NetworkMode: container.NetworkMode(networkResp.ID),
53-
}
53+
}
5454

5555
// Create the container
5656
containerResp, err := cli.ContainerCreate(

methods/jailer.go

+122-42
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,23 @@ package methods
22

33
import (
44
"context"
5-
"fmt"
65
"log"
76
"net"
87
"os"
8+
"os/exec"
9+
"path/filepath"
910

1011
"github.com/firecracker-microvm/firecracker-go-sdk"
1112
models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
12-
"github.com/weaveworks/ignite/pkg/logs"
1313
)
1414

15-
// JAILER CONFIGURATION
15+
const (
16+
CreateLogFilesHandlerName = "create-log-files"
17+
LinkFilesToRootFSHandlerName = "link-files-to-rootfs"
18+
rootfsFolderName = "root"
19+
ErrMissingJailerConfig = "missing jailer config"
20+
)
21+
1622
func ExampleJailerConfig_enablingJailer() {
1723
UID := 123
1824
GID := 100
@@ -28,12 +34,28 @@ func ExampleJailerConfig_enablingJailer() {
2834
vmmCtx, vmmCancel := context.WithCancel(ctx)
2935
defer vmmCancel()
3036

37+
// jailerRootDir := "/srv/jailer/firecracker/4569/root/"
38+
// mapperDir := filepath.Join(jailerRootDir, "dev/mapper")
39+
// bindMountPoint := filepath.Join(mapperDir, filepath.Base(overlayDevice))
40+
3141
const id = "4569"
32-
//
33-
const kernelImagePath = "../vmlinux-5.10.210"
42+
// err = os.MkdirAll(mapperDir, os.ModePerm)
43+
// if err != nil {
44+
// fmt.Printf("Error creating directory %s: %v\n", mapperDir, err)
45+
// return
46+
// }
47+
// fmt.Printf("Directory %s created successfully\n", mapperDir)
48+
49+
// err = bindMount(overlayDevice, bindMountPoint)
50+
// if err != nil {
51+
// log.Fatalf("Error bind mounting overlay device: %v", err)
52+
// }
53+
54+
// fmt.Println("Overlay device successfully bind mounted")
55+
56+
const kernelImagePath = "vmlinux-5.10.210"
3457
networkIfaces := []firecracker.NetworkInterface{{
3558
StaticConfiguration: &firecracker.StaticNetworkConfiguration{
36-
// MacAddress: "AA:FC:00:00:00:01", // potential bug here
3759
MacAddress: "52:54:00:ab:cd:ef",
3860
HostDevName: "tap0",
3961
IPConfiguration: &firecracker.IPConfiguration{
@@ -47,27 +69,27 @@ func ExampleJailerConfig_enablingJailer() {
4769
},
4870
},
4971
}}
50-
stdOutPath := "/dev/null"
51-
stdout, err := os.OpenFile(stdOutPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
52-
if err != nil {
53-
logs.Logger.Errorf("failed to create stdout file: %v", err)
54-
}
55-
stdErrPath := "/dev/null"
56-
stderr, err := os.OpenFile(stdErrPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
57-
if err != nil {
58-
logs.Logger.Errorf("failed to create stderr file: %v", err)
59-
}
60-
stdInPath := "/dev/null"
61-
stdin, err := os.OpenFile(stdInPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
62-
if err != nil {
63-
logs.Logger.Errorf("failed to create stderr file: %v", err)
64-
}
72+
// stdOutPath := "/dev/null"
73+
// stdout, err := os.OpenFile(stdOutPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
74+
// if err != nil {
75+
// logs.Logger.Errorf("failed to create stdout file: %v", err)
76+
// }
77+
// stdErrPath := "/dev/null"
78+
// stderr, err := os.OpenFile(stdErrPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
79+
// if err != nil {
80+
// logs.Logger.Errorf("failed to create stderr file: %v", err)
81+
// }
82+
// stdInPath := "/dev/null"
83+
// stdin, err := os.OpenFile(stdInPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
84+
// if err != nil {
85+
// logs.Logger.Errorf("failed to create stderr file: %v", err)
86+
// }
6587

6688
fcCfg := firecracker.Config{
6789
SocketPath: socketPath,
6890
KernelImagePath: kernelImagePath,
6991
KernelArgs: "console=ttyS0 reboot=k panic=1 pci=off",
70-
Drives: firecracker.NewDrivesBuilder("../ubuntu-22.04.ext4.3").Build(),
92+
Drives: firecracker.NewDrivesBuilder("drive_0").Build(),
7193
LogLevel: "Debug",
7294
MachineCfg: models.MachineConfiguration{
7395
VcpuCount: firecracker.Int64(2),
@@ -82,33 +104,33 @@ func ExampleJailerConfig_enablingJailer() {
82104
NumaNode: firecracker.Int(0),
83105
JailerBinary: "../jailer",
84106
ChrootBaseDir: "/srv/jailer",
85-
Stdin: stdin,
86-
Stdout: stdout,
87-
Stderr: stderr,
107+
Stdin: os.Stdin,
108+
Stdout: os.Stdout,
109+
Stderr: os.Stderr,
88110
CgroupVersion: "2",
89-
ChrootStrategy: firecracker.NewNaiveChrootStrategy(kernelImagePath),
111+
ChrootStrategy: NewPrePlacedFilesStrategy(kernelImagePath),
90112
ExecFile: "../firecracker",
91113
},
92114
NetNS: nsPath,
93115
NetworkInterfaces: networkIfaces,
94116
}
95117

96-
// Check if kernel image is readable
97-
f, err := os.Open(fcCfg.KernelImagePath)
98-
if err != nil {
99-
panic(fmt.Errorf("failed to open kernel image: %v", err))
100-
}
101-
f.Close()
102-
103-
// Check each drive is readable and writable
104-
for _, drive := range fcCfg.Drives {
105-
drivePath := firecracker.StringValue(drive.PathOnHost)
106-
f, err := os.OpenFile(drivePath, os.O_RDWR, 0666)
107-
if err != nil {
108-
panic(fmt.Errorf("failed to open drive with read/write permissions: %v", err))
109-
}
110-
f.Close()
111-
}
118+
// // Check if kernel image is readable
119+
// f, err := os.Open(fcCfg.KernelImagePath)
120+
// if err != nil {
121+
// panic(fmt.Errorf("failed to open kernel image: %v", err))
122+
// }
123+
// f.Close()
124+
125+
// // Check each drive is readable and writable
126+
// for _, drive := range fcCfg.Drives {
127+
// drivePath := firecracker.StringValue(drive.PathOnHost)
128+
// f, err := os.OpenFile(drivePath, os.O_RDWR, 0666)
129+
// if err != nil {
130+
// panic(fmt.Errorf("failed to open drive with read/write permissions: %v", err))
131+
// }
132+
// f.Close()
133+
// }
112134

113135
m, err := firecracker.NewMachine(vmmCtx, fcCfg)
114136
if err != nil {
@@ -128,3 +150,61 @@ func ExampleJailerConfig_enablingJailer() {
128150
panic(err)
129151
}
130152
}
153+
154+
func bindMount(source, target string) error {
155+
cmd := exec.Command("mount", "--bind", source, target)
156+
return cmd.Run()
157+
}
158+
159+
type PrePlacedFilesStrategy struct {
160+
KernelImagePath string
161+
}
162+
163+
func NewPrePlacedFilesStrategy(kernelImagePath string) PrePlacedFilesStrategy {
164+
return PrePlacedFilesStrategy{
165+
KernelImagePath: kernelImagePath,
166+
}
167+
}
168+
169+
func (s PrePlacedFilesStrategy) AdaptHandlers(handlers *firecracker.Handlers) error {
170+
// if !handlers.FcInit.Has(CreateLogFilesHandlerName) {
171+
// log.Println("ehllo")
172+
// return firecracker.ErrRequiredHandlerMissing
173+
// }
174+
175+
handlers.FcInit = handlers.FcInit.AppendAfter(
176+
CreateLogFilesHandlerName,
177+
LinkKernelImageHandler(filepath.Base(s.KernelImagePath)),
178+
)
179+
180+
return nil
181+
}
182+
183+
func LinkKernelImageHandler(kernelImageFileName string) firecracker.Handler {
184+
log.Println(kernelImageFileName)
185+
return firecracker.Handler{
186+
Name: LinkFilesToRootFSHandlerName,
187+
Fn: func(ctx context.Context, m *firecracker.Machine) error {
188+
if m.Cfg.JailerCfg == nil {
189+
return firecracker.ErrMissingJailerConfig
190+
}
191+
192+
rootfs := filepath.Join(
193+
m.Cfg.JailerCfg.ChrootBaseDir,
194+
filepath.Base(m.Cfg.JailerCfg.ExecFile),
195+
m.Cfg.JailerCfg.ID,
196+
rootfsFolderName,
197+
)
198+
199+
if err := os.Link(
200+
m.Cfg.KernelImagePath,
201+
filepath.Join(rootfs, kernelImageFileName),
202+
); err != nil {
203+
return err
204+
}
205+
log.Println(kernelImageFileName)
206+
m.Cfg.KernelImagePath = kernelImageFileName
207+
return nil
208+
},
209+
}
210+
}

0 commit comments

Comments
 (0)