<div dir="ltr">Yes to both questions. 1. The information retrieved from mountinfo during dump does not include docker daemon&#39;s root path (/var/lib/docker), so we have to prepend it during restore when we recreate the external bind mounts. 2. My version of CRIU includes: your original two mnt patches to mount.c, your --ext-mount patches, and my changes to try_ext_bind_mount() in mount.c.<div>
<br></div><div>--Saied<div><br></div></div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Jun 4, 2014 at 4:25 AM, Pavel Emelyanov <span dir="ltr">&lt;<a href="mailto:xemul@parallels.com" target="_blank">xemul@parallels.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">On 06/04/2014 05:07 AM, Saied Kazemi wrote:<br>
&gt; Pavel,<br>
&gt;<br>
&gt; Good news.  Making the following change to try_ext_bind_mount() after applying your --ext-mount patches and using<br>
&gt; -M on dump and -M/var/lib/docker on restore, it&#39;s possible to resume a Docker container process _without_ any plugins.<br>
<br>
</div>Wow! IOW you need an ability to prepend some string to the mount points root path, right?<br>
And, other than this, you must have applied other patches from me to mount.c, am I right<br>
with that too?<br>
<div class="HOEnZb"><div class="h5"><br>
&gt;  Please note that as mentioned before, the restore is successful as far as CRIU is concerned and is not visible to<br>
&gt; the Docker daemon.<br>
&gt;<br>
&gt; --Saied<br>
&gt;<br>
&gt; diff --git a/mount.c b/mount.c<br>
&gt; index eca3fa5..0f4a807 100644<br>
&gt; --- a/mount.c<br>
&gt; +++ b/mount.c<br>
&gt; @@ -1174,22 +1174,32 @@ static int do_new_mount(struct mount_info *mi)<br>
&gt;<br>
&gt;  static int try_ext_bind_mount(struct mount_info *mi)<br>
&gt;  {<br>
&gt; -       if (opts.ext_mount_mode == EXT_MOUNT_NONE) {<br>
&gt; -              pr_err(&quot;Restoring external bind mount %s is not enabled\n&quot;,<br>
&gt; -                              mi-&gt;mountpoint);<br>
&gt; -              return -1;<br>
&gt; -       }<br>
&gt; +       char buf[256];<br>
&gt; +       char *source;<br>
&gt;<br>
&gt; -       if (opts.ext_mount_mode != EXT_MOUNT_OK)<br>
&gt; -              return -1;<br>
&gt; +       if (opts.ext_mount_mode == EXT_MOUNT_NONE) {<br>
&gt; +               pr_err(&quot;Restoring external bind mount %s is not enabled\n&quot;,<br>
&gt; +                       mi-&gt;mountpoint);<br>
&gt; +               return -1;<br>
&gt; +       }<br>
&gt;<br>
&gt; -       pr_info(&quot;Bind-mounting %s to %s\n&quot;, mi-&gt;root, mi-&gt;mountpoint);<br>
&gt; -       if (mount(mi-&gt;root, mi-&gt;mountpoint, NULL, MS_BIND, NULL)) {<br>
&gt; -              pr_perror(&quot;Can&#39;t bind ext mount&quot;);<br>
&gt; -              return -1;<br>
&gt; -       }<br>
&gt; +       if (opts.ext_mount_mode == EXT_MOUNT_PREP) {<br>
&gt; +               snprintf(buf, 256, &quot;%s/%s&quot;, opts.em_arg_1, mi-&gt;root);<br>
&gt; +               source = buf;<br>
&gt; +       } else<br>
&gt; +               source = mi-&gt;root;<br>
&gt; +<br>
&gt; +       if (opts.ext_mount_mode != EXT_MOUNT_OK &amp;&amp;<br>
&gt; +           opts.ext_mount_mode != EXT_MOUNT_PREP)<br>
&gt; +               return -1;<br>
&gt;<br>
&gt; -       return 0;<br>
&gt; +       pr_info(&quot;Bind-mounting %s to %s\n&quot;, source, mi-&gt;mountpoint);<br>
&gt; +       if (mount(source, mi-&gt;mountpoint, NULL, MS_BIND, NULL)) {<br>
&gt; +               pr_perror(&quot;Can&#39;t bind ext mount&quot;);<br>
&gt; +               return -1;<br>
&gt; +       }<br>
&gt; +<br>
&gt; +       return 0;<br>
&gt;  }<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div></div><div class="im HOEnZb">&gt; On Tue, Jun 3, 2014 at 1:44 PM, Saied Kazemi &lt;<a href="mailto:saied@google.com">saied@google.com</a> &lt;mailto:<a href="mailto:saied@google.com">saied@google.com</a>&gt;&gt; wrote:<br>

&gt;<br>
&gt;     Hi Pavel,<br>
&gt;<br>
&gt;     It&#39;d make using CRIU much easier :)  For now, I&#39;ve been using a Docker plugin in my experiments to dump and restore a process inside a Docker container:<br>
&gt;<br>
&gt;     1. On the dump side, I am passing m-&gt;root to the Docker plugin (in addition to m-&gt;mountpoint and m-&gt;mnt_id) so that the path can be recorded in the img file.<br>
&gt;<br>
&gt;             ret = cr_plugin_dump_ext_mount(m-&gt;root, m-&gt;mountpoint + 1, m-&gt;mnt_id);<br>
&gt;<br>
&gt;     2. On the restore side, I pass opts.root from --root on the command line instead of always passing &quot;/&quot; (this was probably your original intention).  Then the Docker plugin prepends /var/lib/docker to the path that was recorded in the img file during dump.<br>

&gt;<br>
&gt;             ret = cr_plugin_restore_ext_mount(mi-&gt;mnt_id, mi-&gt;mountpoint, opts.root ? : &quot;/&quot;, NULL);<br>
&gt;<br>
&gt;     Like the plugin in the run.sh example, the Docker plugin is using an environment variable (CR_EXT_BIND_MOUNTS) to identify its files.  It&#39;d be great to get rid of this environment variable.<br>
&gt;<br>
&gt;     Finally, I have to manually set up the cgroups (e.g., /sys/fs/cgroup/cpu/docker/&lt;ID&gt;) before restoring:<br>
&gt;<br>
&gt;             criu restore -o restore.log --root /var/lib/docker/vfs/dir/&lt;ID&gt; -D img -v4 -j -n mnt -n pid --lib /path/to/plugin<br>
&gt;<br>
&gt;     The end result is that the process is successfully restored and resumes operation.  Currently, however, the Docker daemon is totally unaware of the process being resurrected and docker ps won&#39;t show it.  We need supporting code in Docker.<br>

&gt;<br>
&gt;     --Saied<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
&gt;<br>
</div><div class="HOEnZb"><div class="h5">&gt;     On Tue, Jun 3, 2014 at 9:26 AM, Pavel Emelyanov &lt;<a href="mailto:xemul@parallels.com">xemul@parallels.com</a> &lt;mailto:<a href="mailto:xemul@parallels.com">xemul@parallels.com</a>&gt;&gt; wrote:<br>

&gt;<br>
&gt;         Hi,<br>
&gt;<br>
&gt;         I&#39;d like to propose an API to support external mount points w/o plugins.<br>
&gt;         It&#39;s a typical scenario when people just do a bind mount before going<br>
&gt;         into chroot/pivot_root and starting a container. Such a construction is<br>
&gt;         not dumpable by CRIU, but I think it&#39;s possibly to handle the common and<br>
&gt;         typical scenario.<br>
&gt;<br>
&gt;         That said, the proposal is to introduce the --ext-mount option with the<br>
&gt;         syntax:<br>
&gt;<br>
&gt;         --ext-mount without arguments on dump says, that mount point with the<br>
&gt;         source sitting outside of the namespace root should be dumped &quot;as is&quot;.<br>
&gt;         On restore this will say to try create bind mount with unchanged source<br>
&gt;         path. It&#39;s useful for suspend/resume scenario and for live-migration<br>
&gt;         between hosts with identical FS paths.<br>
&gt;<br>
&gt;         --ext-mount p&lt;path&gt;, e.g. --ext-mount p/foo on restore will cause the<br>
&gt;         &lt;path&gt; be prepended to any bind mount source. IOW /bar bind mounted into<br>
&gt;         /root will result in /foo/bar get bind mounted into /root on restore<br>
&gt;<br>
&gt;         --ext-mount s&lt;delim&gt;&lt;path1&gt;&lt;delim&gt;&lt;path2&gt;, e.g. --ext-mount s:/foo:/bar<br>
&gt;         will case the &lt;path1&gt; prefix get substituted with &lt;path2&gt; prefix for<br>
&gt;         every external bind mount on restore. IOW /foo/foobar bind mounted into<br>
&gt;         /root will result in /bar/foobar bind mounted to /root on restore.<br>
&gt;<br>
&gt;         The patchset is not complete, it just demonstrates the intention. Saied,<br>
&gt;         it seems to handle your scripted case, the external file gets mounted into<br>
&gt;         proper place with plain --ext-mount option, but there&#39;s still unresolved<br>
&gt;         issue with proc :(<br>
&gt;<br>
&gt;         Comments are welcome.<br>
&gt;<br>
&gt;         TODO<br>
&gt;<br>
&gt;         1. check that flags (ro, shared) are dumped and restore correctly<br>
&gt;         2. implement p and s modes for --ext-mount option on restore<br>
&gt;         3. support ext-mount option in RPC API<br>
&gt;         4. add option help text and documentation<br>
&gt;<br>
&gt;<br>
&gt;<br>
<br>
<br>
</div></div></blockquote></div><br></div>