[CRIU] [PATCH 2/5] This patch introduces base message prototypes Google's protobuf facility.

Cyrill Gorcunov gorcunov at openvz.org
Wed Jul 4 14:05:56 EDT 2012


A short story -- there were a long conversation on which format should
be used to keep checkpointed data on disk image. We ended up in using
Google's Protocol Buffers (see https://developers.google.com/protocol-buffers/
for detailed description). Thus every image snippet should be convered
to use this facility.

But before anything else we need a scaffold, ie .proto files which declare
entries on disk.

Instead of squashing everything in one commit we introduce only a few
types needed for further work. In particular

 - message fdinfo_entry

        This message maps old fdinfo_entry structure

 - message fown_t

        This message maps old fown_t, which is embedded
        in a number of another messages

 - message reg_file_entry

        This message maps old reg_file_entry structure

 - message img_hdr, message obj_hdr

        This is most important messages, the first one
        img_hdr should be used as a header for any image
        file. The obj_hdr in turn provides a way to describe
        objects being stored in image by flexible way.

        See more details in image.base.proto file itself.

Note that there is no real use of this facility in our code yet.

Build note: one should have protobuf and protobuf-c installed to be able
to build crtools.

 - http://code.google.com/p/protobuf/
 - http://code.google.com/p/protobuf-c/

Inspired-by: Kinsbursky Stanislav <skinsbursky at openvz.org>
Inspired-by: Pavel Emelianov <xemul at parallels.com>
Signed-off-by: Cyrill Gorcunov <gorcunov at openvz.org>
---
 Makefile                  |   14 +++++--
 protobuf/Makefile         |   54 +++++++++++++++++++++++++++++
 protobuf/fdinfo.proto     |    6 +++
 protobuf/fown.proto       |    7 ++++
 protobuf/image.base.proto |   82 +++++++++++++++++++++++++++++++++++++++++++++
 protobuf/regfile.proto    |   10 +++++
 6 files changed, 169 insertions(+), 4 deletions(-)
 create mode 100644 protobuf/Makefile
 create mode 100644 protobuf/fdinfo.proto
 create mode 100644 protobuf/fown.proto
 create mode 100644 protobuf/image.base.proto
 create mode 100644 protobuf/regfile.proto

diff --git a/Makefile b/Makefile
index 81c9ca8..db2e6f7 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,7 @@ include Makefile.inc
 CFLAGS		+= -I./include
 CFLAGS		+= -O0 -ggdb3
 
-LIBS		+= -lrt -lpthread
+LIBS		+= -lrt -lpthread -lprotobuf-c
 
 DEFINES		+= -D_FILE_OFFSET_BITS=64
 DEFINES		+= -D_GNU_SOURCE
@@ -60,6 +60,8 @@ OBJS		+= mount.o
 OBJS		+= inotify.o
 OBJS		+= pstree.o
 
+PROTOBUF-LIB	:= protobuf/protobuf-lib.o
+
 DEPS		:= $(patsubst %.o,%.d,$(OBJS))
 
 MAKEFLAGS	+= --no-print-directory
@@ -68,13 +70,16 @@ include Makefile.syscall
 include Makefile.pie
 
 .PHONY: all test-legacy zdtm test rebuild clean distclean tags cscope	\
-	docs help pie
+	docs help pie protobuf
 
-all: pie
+all: protobuf pie
 	$(Q) $(MAKE) $(PROGRAM)
 
 pie: $(PIE-GEN)
 
+protobuf:
+	$(Q) $(MAKE) -C protobuf/ all
+
 %.o: %.c
 	$(E) "  CC      " $@
 	$(Q) $(CC) -c $(CFLAGS) $< -o $@
@@ -91,7 +96,7 @@ pie: $(PIE-GEN)
 	$(E) "  DEP     " $@
 	$(Q) $(CC) -M -MT $@ -MT $(patsubst %.d,%.o,$@) $(CFLAGS) $< -o $@
 
-$(PROGRAM): $(OBJS) $(SYS-OBJ)
+$(PROGRAM): $(OBJS) $(SYS-OBJ) $(PROTOBUF-LIB)
 	$(E) "  LINK    " $@
 	$(Q) $(CC) $(CFLAGS) $^ $(LIBS) -o $@
 
@@ -120,6 +125,7 @@ clean: cleanpie cleansyscall
 	$(Q) $(RM) -f ./*.bin
 	$(Q) $(RM) -f ./$(PROGRAM)
 	$(Q) $(RM) -rf ./test/dump/
+	$(Q) $(MAKE) -C protobuf/ clean
 	$(Q) $(MAKE) -C test/legacy clean
 	$(Q) $(MAKE) -C test/zdtm cleandep
 	$(Q) $(MAKE) -C test/zdtm clean
diff --git a/protobuf/Makefile b/protobuf/Makefile
new file mode 100644
index 0000000..764374f
--- /dev/null
+++ b/protobuf/Makefile
@@ -0,0 +1,54 @@
+-include ../Makefile.inc
+
+CFLAGS		+= -I./include
+CFLAGS		+= -O0 -ggdb3
+
+DEFINES		+= -D_FILE_OFFSET_BITS=64
+DEFINES		+= -D_GNU_SOURCE
+
+ifneq ($(WERROR),0)
+	WARNINGS += -Werror
+endif
+
+ifeq ($(DEBUG),1)
+	DEFINES += -DCR_DEBUG
+endif
+
+WARNINGS	+= -Wall
+CFLAGS		+= $(WARNINGS) $(DEFINES)
+
+LIBRARY		:= protobuf-lib.o
+
+PROTO_FILES	+= image.base.proto
+PROTO_FILES	+= fown.proto
+PROTO_FILES	+= fdinfo.proto
+PROTO_FILES	+= regfile.proto
+
+HDRS	:= $(patsubst %.proto,%.pb-c.h,$(PROTO_FILES))
+SRCS	:= $(patsubst %.proto,%.pb-c.c,$(PROTO_FILES))
+OBJS	:= $(patsubst %.c,%.o,$(SRCS))
+
+.DEFAULT_GOAL	:= all
+
+%.pb-c.c: %.proto
+	$(E) "  PROTOBUF "$@
+	$(Q) protoc-c --c_out=./ $<
+
+%.o: %.c
+	$(E) "  CC       "$@
+	$(Q) $(CC) -c $(CFLAGS) $< -o $@
+
+.SECONDARY:
+
+$(LIBRARY): $(OBJS)
+	$(E) "  LINK     "$@
+	$(Q) ld -r -o $@ $(OBJS)
+
+.PHONY: all clean
+
+all: $(LIBRARY)
+
+clean:
+	$(E) "  CLEAN PROTOBUF"
+	$(Q) rm -f $(SRCS) $(HDRS) $(OBJS) $(LIBRARY)
+
diff --git a/protobuf/fdinfo.proto b/protobuf/fdinfo.proto
new file mode 100644
index 0000000..e0445c6
--- /dev/null
+++ b/protobuf/fdinfo.proto
@@ -0,0 +1,6 @@
+message fdinfo_entry {
+	required fixed32	fd	= 1;
+	required fixed32	type	= 2;
+	required fixed32	flags	= 3;
+	required fixed32	id	= 4;
+}
diff --git a/protobuf/fown.proto b/protobuf/fown.proto
new file mode 100644
index 0000000..15d49bf
--- /dev/null
+++ b/protobuf/fown.proto
@@ -0,0 +1,7 @@
+message fown_t {
+	required fixed32	uid		= 1;
+	required fixed32	euid		= 2;
+	required fixed32	signum		= 3;
+	required fixed32	pid_type	= 4;
+	required fixed32	pid		= 5;
+}
diff --git a/protobuf/image.base.proto b/protobuf/image.base.proto
new file mode 100644
index 0000000..5676c56
--- /dev/null
+++ b/protobuf/image.base.proto
@@ -0,0 +1,82 @@
+/*
+ * These are base types for crtools Protocol Buffers (PB) objects.
+ * They are immutable and should reman such forever.
+ *
+ * The only thing which is allowed to change -- add
+ * new OBJ_ types if needed.
+ *
+ * Basically every image consist of PB sequense
+ *
+ *    +---------------+
+ *    |    img_hdr    | general header
+ *    +---------------+
+ *    |    obj_hdr    | header for the next object
+ *    +---------------+
+ *    |    object     |
+ *    +---------------+
+ *          ...
+ *
+ * If some PB sequence is supposed to be sent by
+ * a stream then the sequence should be wrapped with
+ * start/stop markers.
+ *
+ *    +---------------+
+ *    |    img_hdr    | general header
+ *    +---------------+
+ *    |    OBJ_START  | header with type OBJ_START and packed_size 0
+ *    +---------------+
+ *    |    obj_hdr    | header for the next object
+ *    +---------------+
+ *    |    object     |
+ *    +---------------+
+ *          ...
+ *           ...
+ *    +---------------+
+ *    |    obj_hdr    | header for the next object
+ *    +---------------+
+ *    |    object     |
+ *    +---------------+
+ *    |    OBJ_STOP   | header with type OBJ_STOP and packed_size 0
+ *    +---------------+
+ *
+ * In case if there an array of PB objects then one should use
+ * array start/stop markers.
+ *
+ *    +---------------+
+ *    |    img_hdr    | general header
+ *    +---------------+
+ *    |   OBJ_STARTA  | header with type OBJ_STARTA and packed_size = sizeof one object
+ *    +---------------+
+ *    |    object     |
+ *    +---------------+
+ *          ...
+ *           ...
+ *    +---------------+
+ *    |    object     |
+ *    +---------------+
+ *    |    OBJ_ENDA   | header with type OBJ_ENDA and packed_size 0
+ *    +---------------+
+ */
+
+message img_hdr {
+	required fixed64			magic		= 1;
+	required fixed64			version		= 2;
+	required fixed64			flags		= 3;
+}
+
+message obj_hdr {
+	enum obj_type {
+		OBJ_UNKNOWN		=	0;
+		OBJ_START		=	1;
+		OBJ_STOP		=	2;
+
+		OBJ_STARTA		=	3;
+		OBJ_ENDA		=	4;
+
+		OBJ_FDINFO		=	5;
+		OBJ_REGFILE		=	6;
+	}
+
+	required fixed32			type		= 1;
+	required fixed64			pksize		= 2;
+}
diff --git a/protobuf/regfile.proto b/protobuf/regfile.proto
new file mode 100644
index 0000000..5dcb0d6
--- /dev/null
+++ b/protobuf/regfile.proto
@@ -0,0 +1,10 @@
+import "fown.proto";
+
+message reg_file_entry {
+	required fixed32	id	= 1;
+	required fixed32	flags	= 2;
+	required fixed64	pos	= 3;
+	required fixed32	len	= 4;
+	required fown_t		fown	= 5;
+	optional string		name	= 6;
+}
-- 
1.7.7.6



More information about the CRIU mailing list