@@ -2,17 +2,23 @@ package methods
2
2
3
3
import (
4
4
"context"
5
- "fmt"
6
5
"log"
7
6
"net"
8
7
"os"
8
+ "os/exec"
9
+ "path/filepath"
9
10
10
11
"github.com/firecracker-microvm/firecracker-go-sdk"
11
12
models "github.com/firecracker-microvm/firecracker-go-sdk/client/models"
12
- "github.com/weaveworks/ignite/pkg/logs"
13
13
)
14
14
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
+
16
22
func ExampleJailerConfig_enablingJailer () {
17
23
UID := 123
18
24
GID := 100
@@ -28,12 +34,28 @@ func ExampleJailerConfig_enablingJailer() {
28
34
vmmCtx , vmmCancel := context .WithCancel (ctx )
29
35
defer vmmCancel ()
30
36
37
+ // jailerRootDir := "/srv/jailer/firecracker/4569/root/"
38
+ // mapperDir := filepath.Join(jailerRootDir, "dev/mapper")
39
+ // bindMountPoint := filepath.Join(mapperDir, filepath.Base(overlayDevice))
40
+
31
41
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"
34
57
networkIfaces := []firecracker.NetworkInterface {{
35
58
StaticConfiguration : & firecracker.StaticNetworkConfiguration {
36
- // MacAddress: "AA:FC:00:00:00:01", // potential bug here
37
59
MacAddress : "52:54:00:ab:cd:ef" ,
38
60
HostDevName : "tap0" ,
39
61
IPConfiguration : & firecracker.IPConfiguration {
@@ -47,27 +69,27 @@ func ExampleJailerConfig_enablingJailer() {
47
69
},
48
70
},
49
71
}}
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
+ // }
65
87
66
88
fcCfg := firecracker.Config {
67
89
SocketPath : socketPath ,
68
90
KernelImagePath : kernelImagePath ,
69
91
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 (),
71
93
LogLevel : "Debug" ,
72
94
MachineCfg : models.MachineConfiguration {
73
95
VcpuCount : firecracker .Int64 (2 ),
@@ -82,33 +104,33 @@ func ExampleJailerConfig_enablingJailer() {
82
104
NumaNode : firecracker .Int (0 ),
83
105
JailerBinary : "../jailer" ,
84
106
ChrootBaseDir : "/srv/jailer" ,
85
- Stdin : stdin ,
86
- Stdout : stdout ,
87
- Stderr : stderr ,
107
+ Stdin : os . Stdin ,
108
+ Stdout : os . Stdout ,
109
+ Stderr : os . Stderr ,
88
110
CgroupVersion : "2" ,
89
- ChrootStrategy : firecracker . NewNaiveChrootStrategy (kernelImagePath ),
111
+ ChrootStrategy : NewPrePlacedFilesStrategy (kernelImagePath ),
90
112
ExecFile : "../firecracker" ,
91
113
},
92
114
NetNS : nsPath ,
93
115
NetworkInterfaces : networkIfaces ,
94
116
}
95
117
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
+ // }
112
134
113
135
m , err := firecracker .NewMachine (vmmCtx , fcCfg )
114
136
if err != nil {
@@ -128,3 +150,61 @@ func ExampleJailerConfig_enablingJailer() {
128
150
panic (err )
129
151
}
130
152
}
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