瀏覽代碼

devmapper: Use a "rootfs" subdirectory in the devmapper volume

We place the actual image/containers in the "rootfs" directory, which
allows us to have other data in the toplevel directory in the mount.

For starters, this means the "lost+found" directory from mkfs will
not always be in your container/image.

Secondly, we can create a file "id" in the toplevel dir which is not
visible from the container. This is useful because it allows us to map
back from the device fs to the container if something goes wrong with
the devicemapper metadata.
Alexander Larsson 11 年之前
父節點
當前提交
00401a30b7
共有 1 個文件被更改,包括 22 次插入2 次删除
  1. 22 2
      graphdriver/devmapper/driver.go

+ 22 - 2
graphdriver/devmapper/driver.go

@@ -3,6 +3,7 @@ package devmapper
 import (
 import (
 	"fmt"
 	"fmt"
 	"github.com/dotcloud/docker/graphdriver"
 	"github.com/dotcloud/docker/graphdriver"
+	"io/ioutil"
 	"os"
 	"os"
 	"path"
 	"path"
 )
 )
@@ -57,7 +58,26 @@ func (d *Driver) Cleanup() error {
 }
 }
 
 
 func (d *Driver) Create(id string, parent string) error {
 func (d *Driver) Create(id string, parent string) error {
-	return d.DeviceSet.AddDevice(id, parent)
+	if err := d.DeviceSet.AddDevice(id, parent); err != nil {
+		return err
+	}
+
+	mp := path.Join(d.home, "mnt", id)
+	if err := d.mount(id, mp); err != nil {
+		return err
+	}
+
+	if err := os.MkdirAll(path.Join(mp, "rootfs"), 0755); err != nil && !os.IsExist(err) {
+		return err
+	}
+
+	// Create an "id" file with the container/image id in it to help reconscruct this in case
+	// of later problems
+	if err := ioutil.WriteFile(path.Join(mp, "id"), []byte(id), 0600); err != nil {
+		return err
+	}
+
+	return nil
 }
 }
 
 
 func (d *Driver) Remove(id string) error {
 func (d *Driver) Remove(id string) error {
@@ -69,7 +89,7 @@ func (d *Driver) Get(id string) (string, error) {
 	if err := d.mount(id, mp); err != nil {
 	if err := d.mount(id, mp); err != nil {
 		return "", err
 		return "", err
 	}
 	}
-	return mp, nil
+	return path.Join(mp, "rootfs"), nil
 }
 }
 
 
 func (d *Driver) Size(id string) (int64, error) {
 func (d *Driver) Size(id string) (int64, error) {