@@ -21,11 +21,12 @@ import (
21
21
)
22
22
23
23
const (
24
- jailerFolder = "jail"
25
- firecrackerBinName = "firecracker"
26
- kernelImageFileName = "kernel-image"
27
- jailerHandlerName = "firecracker-containerd-jail-handler"
28
- runcConfigPath = "/etc/containerd/firecracker-runc-config.json"
24
+ jailerFolder = "jail"
25
+ firecrackerBinName = "firecracker"
26
+ kernelImageFileName = "kernel-image"
27
+ jailerHandlerName = "firecracker-containerd-jail-handler"
28
+ jailerFifoHandlerName = "firecracker-containerd-jail-fifo-handler"
29
+ runcConfigPath = "/etc/containerd/firecracker-runc-config.json"
29
30
30
31
// JailingOn is used to signify whether or not jailing has been turned on
31
32
JailingOn = "on"
@@ -91,6 +92,13 @@ func (j jailer) RootPath() string {
91
92
return filepath .Join (j .jailPath , "rootfs" )
92
93
}
93
94
95
+ func (j jailer ) ContentsPath () string {
96
+ return filepath .Join (j .RootPath (), "var" , "lib" , "firecracker-containerd" )
97
+ }
98
+
99
+ // BuildHandler will link the necessary files except for the fifos due to the
100
+ // fifos needing to be created. Also, this will create the proper device nodes
101
+ // needed by Firecracker
94
102
func (j * jailer ) BuildHandler (logger * logrus.Entry , cfg * Config , socketPath * string , vmID string ) firecracker.Handler {
95
103
jailPath := j .JailPath ()
96
104
rootPath := j .RootPath ()
@@ -117,7 +125,7 @@ func (j *jailer) BuildHandler(logger *logrus.Entry, cfg *Config, socketPath *str
117
125
return errors .Wrapf (err , "failed to create device path: %v" , devPath )
118
126
}
119
127
120
- contentsPath := filepath . Join ( rootPath , "var" , "lib" , "firecracker-containerd" )
128
+ contentsPath := j . ContentsPath ( )
121
129
logger .Debugf ("Creating firecracker contents path %v" , contentsPath )
122
130
if err := os .MkdirAll (contentsPath , 0777 ); err != nil {
123
131
return errors .Wrapf (err , "failed to create contents path: %v" , contentsPath )
@@ -181,6 +189,32 @@ func (j *jailer) BuildHandler(logger *logrus.Entry, cfg *Config, socketPath *str
181
189
}
182
190
}
183
191
192
+ // BuildLinkFifoHandler will return a new firecracker.Handler with the function
193
+ // that will allow linking of the fifos making them visible to Firecracker.
194
+ func (j jailer ) BuildLinkFifoHandler () firecracker.Handler {
195
+ return firecracker.Handler {
196
+ Name : jailerFifoHandlerName ,
197
+ Fn : func (ctx context.Context , m * firecracker.Machine ) error {
198
+ contentsPath := j .ContentsPath ()
199
+ fifoFileName := filepath .Base (m .Cfg .LogFifo )
200
+ newFifoPath := filepath .Join (contentsPath , fifoFileName )
201
+ if err := os .Link (m .Cfg .LogFifo , newFifoPath ); err != nil {
202
+ return err
203
+ }
204
+ m .Cfg .LogFifo = newFifoPath
205
+
206
+ metricFifoFileName := filepath .Base (m .Cfg .MetricsFifo )
207
+ newMetricFifoPath := filepath .Join (contentsPath , metricFifoFileName )
208
+ if err := os .Link (m .Cfg .MetricsFifo , newMetricFifoPath ); err != nil {
209
+ return err
210
+ }
211
+ m .Cfg .MetricsFifo = newMetricFifoPath
212
+
213
+ return nil
214
+ },
215
+ }
216
+ }
217
+
184
218
// createDevices will create a series of device nodes at the given path
185
219
func createDevices (path string ) error {
186
220
devices := []struct {
0 commit comments