mirror of
https://github.com/aljazceru/kata-containers.git
synced 2026-01-06 16:04:26 +01:00
device-manager: refactor device manger
Fixes #50 This commit imports a big logic change: * host device to be attached or appended now is sandbox level resources, one device should bind to sandbox/hypervisor first, then container could reference it via device's unique ID. * attach or detach device should go through the device manager interface instead of the device interface. * allocate device ID in global device mapper to guarantee every device has a uniq device ID and there won't be any ID collision. With this change, there will some changes on data format on disk for sandbox and container, these changes also make a breakage of backward compatibility. New persist data format: * every sandbox will get a new "devices.json" file under "/run/vc/sbs/<sid>/" which saves detailed device information, this also conforms to the concept that device should be sandbox level resource. * every container uses a "devices.json" file but with new data format: ``` [ { "ID": "b80d4736e70a471f", "ContainerPath": "/dev/zero" }, { "ID": "6765a06e0aa0897d", "ContainerPath": "/dev/null" } ] ``` `ID` should reference to a device in a sandbox, `ContainerPath` indicates device path inside a container. Signed-off-by: Zhang Wei <zhangwei555@huawei.com>
This commit is contained in:
@@ -19,7 +19,6 @@ import (
|
||||
|
||||
proxyClient "github.com/clearcontainers/proxy/client"
|
||||
"github.com/kata-containers/runtime/virtcontainers/device/config"
|
||||
"github.com/kata-containers/runtime/virtcontainers/device/drivers"
|
||||
"github.com/kata-containers/runtime/virtcontainers/pkg/hyperstart"
|
||||
ns "github.com/kata-containers/runtime/virtcontainers/pkg/nsenter"
|
||||
"github.com/kata-containers/runtime/virtcontainers/utils"
|
||||
@@ -235,20 +234,19 @@ func fsMapFromMounts(mounts []Mount) []*hyperstart.FsmapDescriptor {
|
||||
func fsMapFromDevices(c *Container) ([]*hyperstart.FsmapDescriptor, error) {
|
||||
var fsmap []*hyperstart.FsmapDescriptor
|
||||
for _, dev := range c.devices {
|
||||
device := c.sandbox.devManager.GetDeviceByID(dev.DeviceID())
|
||||
device := c.sandbox.devManager.GetDeviceByID(dev.ID)
|
||||
if device == nil {
|
||||
return nil, fmt.Errorf("can't find device: %#v", dev)
|
||||
}
|
||||
blockDev := device.(*drivers.BlockDevice)
|
||||
|
||||
d, ok := blockDev.GetDeviceDrive().(*config.BlockDrive)
|
||||
d, ok := device.GetDeviceDrive().(*config.BlockDrive)
|
||||
if !ok || d == nil {
|
||||
return nil, fmt.Errorf("can't retrieve block device information")
|
||||
}
|
||||
|
||||
fsmapDesc := &hyperstart.FsmapDescriptor{
|
||||
Source: d.VirtPath,
|
||||
Path: blockDev.DeviceInfo.ContainerPath,
|
||||
Path: dev.ContainerPath,
|
||||
AbsolutePath: true,
|
||||
DockerVolume: false,
|
||||
SCSIAddr: d.SCSIAddr,
|
||||
@@ -464,8 +462,8 @@ func (h *hyper) stopSandbox(sandbox *Sandbox) error {
|
||||
// container.
|
||||
func (h *hyper) handleBlockVolumes(c *Container) {
|
||||
for _, m := range c.mounts {
|
||||
if m.BlockDevice != nil {
|
||||
c.devices = append(c.devices, m.BlockDevice)
|
||||
if len(m.BlockDeviceID) > 0 {
|
||||
c.devices = append(c.devices, ContainerDevice{ID: m.BlockDeviceID})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user