|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
From f641455c06f18da52bf7fd9c5228d6e3c5ce1453 Mon Sep 17 00:00:00 2001
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
From: "Owen W. Taylor" <otaylor@fishsoup.net>
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
Date: Fri, 20 Oct 2023 11:26:17 -0400
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
Subject: [PATCH] Docker.py: Pass the use_ino option to fix hardlnks
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
When use libguestfs to mount the intermediate image to create a tarball,
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
pass the "use_ino" option so that original inode numbers are preserved.
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
This fixes a problem where hardlinks were not properly preserved in the
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
output.
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
This is a minimal-code-change fix - an edge case bug and better approach are
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
described in comments.
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
Resolves #412
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
---
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
imagefactory_plugins/Docker/Docker.py | 22 +++++++++++++++++++++-
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
1 file changed, 21 insertions(+), 1 deletion(-)
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
diff --git a/imagefactory_plugins/Docker/Docker.py b/imagefactory_plugins/Docker/Docker.py
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
index 68e12c3926bb..960b0e43325c 100644
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
--- a/imagefactory_plugins/Docker/Docker.py
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+++ b/imagefactory_plugins/Docker/Docker.py
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
@@ -312,12 +312,32 @@ class Docker(object):
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
# we call a blocking function to activate the mount, which requires a thread
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
# We also need a temp dir to mount it to - do our best to clean up when things
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
# go wrong
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ #
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # A better approach here would be to use:
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # g.tar_out_opts("/", dest_filename, excludes=[excludes])
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # Though that would break compatibility with the tar_options parameter.
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ #
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
tempdir = None
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
fuse_thread = None
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
try:
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
tempdir = tempfile.mkdtemp(dir=storagedir)
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
self.log.debug("Mounting input image locally at (%s)" % (tempdir))
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
- guestfs_handle.mount_local(tempdir)
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # The "use_ino" option causes FUSE to pass through the original inode
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # numbers. Without it tar cannot properly detect hardlinks, possibly greatly
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # increasing the size of the image. This does create an edge case. If there
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # are:
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ #
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # - Two separate groups of > 1 files hardlinked together
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # - On different partitions
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # - With the same inode number
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ #
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # Then the groups will be incorrectly merged in the output image. This
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # is unlikely to be encountered with typical container images, where almost
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # all files are on a single partition. The correct fix is to use
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ # g.tar_out_opts() as described above.
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
+ guestfs_handle.mount_local(tempdir, options="use_ino")
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
def _run_guestmount(g):
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
g.mount_local_run()
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
self.log.debug("Launching mount_local_run thread")
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
--
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
2.41.0
|
|
![](https://seccdn.libravatar.org/avatar/b6b01b6450222d8f7e9dbf8bc4d745a377776dddc16b2a49ff749e7f784acda1?s=16&d=retro) |
28c6a56 |
|