[CRIU] [PATCH v4 3/3] mount: Restore binfmt_misc content in case of missing mount

Kirill Tkhai ktkhai at virtuozzo.com
Wed Aug 3 05:42:26 PDT 2016



On 03.08.2016 14:46, Pavel Emelyanov wrote:
> On 08/02/2016 11:06 PM, Andrew Vagin wrote:
>> On Tue, Aug 02, 2016 at 04:41:54PM +0300, Kirill Tkhai wrote:
>>>
>>>
>>> On 02.08.2016 16:39, Pavel Emelyanov wrote:
>>>> On 08/02/2016 04:29 PM, Kirill Tkhai wrote:
>>>>>
>>>>>
>>>>> On 02.08.2016 16:03, Pavel Emelyanov wrote:
>>>>>> On 07/20/2016 01:13 PM, Kirill Tkhai wrote:
>>>>>>> In case of mount image is not containing binfmt_misc mountpoint,
>>>>>>> scan image directory for binfmt_misc content file (binfmt-misc-xxx).
>>>>>>> If a file is found, add temporary mountpoint to mount tree and
>>>>>>> restore the content in ordinary way. Then, umount temporary mountpoint.
>>>>>>>
>>>>>>> v4: New
>>>>>>>
>>>>>>> Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
>>>>>>> ---
>>>>>>>  criu/mount.c |   61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
>>>>>>>  1 file changed, 59 insertions(+), 2 deletions(-)
>>>>>>>
>>>>>>> diff --git a/criu/mount.c b/criu/mount.c
>>>>>>> index d583429..8657c36 100644
>>>>>>> --- a/criu/mount.c
>>>>>>> +++ b/criu/mount.c
>>>>>>> @@ -1379,6 +1379,39 @@ static int try_mount_binfmt_misc(struct ns_id *ns, unsigned int *s_dev)
>>>>>>>  	return ret ? -1 : exit_code;
>>>>>>>  }
>>>>>>>  
>>>>>>> +static int find_binfmt_misc_img(unsigned int *s_dev)
>>>>>>> +{
>>>>>>> +	struct dirent *de;
>>>>>>> +	int dfd, ret;
>>>>>>> +	DIR *dir;
>>>>>>> +
>>>>>>> +	*s_dev = 0;
>>>>>>> +	dfd = dup(get_service_fd(IMG_FD_OFF));
>>>>>>> +	dir = fdopendir(dfd);
>>>>>>> +	if (!dir) {
>>>>>>> +		close(dfd);
>>>>>>> +		pr_perror("Can't open img dir\n");
>>>>>>> +		return -1;
>>>>>>> +	}
>>>>>>> +	rewinddir(dir);
>>>>>>> +
>>>>>>> +	errno = 0;
>>>>>>> +	while ((de = readdir(dir)) != NULL) {
>>>>>>
>>>>>> Scanning the images dir doesn't look valid. Instead, there should be a proper
>>>>>> collection of this image (like we do with fdinfo-s, sockets and others). Then,
>>>>>> when reading the mountpoint images, the binfmt_misc collected data should be
>>>>>> looked up and orphan data should add the cr-time mountpoints.
>>>>>
>>>>> So, for every type you want to make array of images, don't you?
>>>>
>>>> What do you mean?
>>>
>>> Introduce a new type of objects, "dump images". And collect names of images,
>>> like we do for other object types.
>>>
>>> As I understand right, you want so.
>>
>>         img = open_image(CR_FD_BINFMT_MISC, O_DUMP, pm->s_dev);
>>
>> I think we choose a wrong format for an image name here.
> 
> Agree. Since binfmt entries exist w/o any mountpoints, then ID of the
> image with entries should be some other, not the device.

But there is no principal difference between to use mnt_id or s_dev. They both
are options of mounted partition.

> Another option would be to put __all__ binfmt-s into single file w/o any
> IDs in name. Like binfmts.img. And on restore collect one and cache.

It's not a problem, but how do you see the future when some namespace
will support binfmt_misc isolation?

Tell your final vision of how we should name image file. Should we save
everything in "binfmts.img"?
 
>> binfmt_misc is a property of a container (the ve structure). If someone
>> will containerize it in the upstream kernel, it probably will be a
>> property of a mount namespace. I suggest to use mntns->id instead of
>> pm->s_dev for binfmt images.
> 


More information about the CRIU mailing list