summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBruce Ashfield <bruce.ashfield@gmail.com>2026-01-06 19:59:25 +0000
committerBruce Ashfield <bruce.ashfield@gmail.com>2026-02-09 03:32:52 +0000
commit70a9de6c79b916991fcbf6fcc714891592a41a8b (patch)
treeb159bb1758d634ac6058692818c1f910c41fef4c
parent3a24b69b4edf4b04b2b2a13ee9575412b014068a (diff)
downloadmeta-virtualization-70a9de6c79b916991fcbf6fcc714891592a41a8b.tar.gz
image-oci: fix symlink loop on image rebuild
Use ln -sfn instead of ln -sf to prevent creating symlinks inside existing symlink target directories. Without -n, if the convenience symlink (e.g., container-base-latest-oci) already exists and points to a directory, ln -sf creates the new symlink inside that directory rather than replacing it, resulting in a self-referencing symlink. This manifests as "Too many levels of symbolic links" errors when container-bundle tries to copy OCI images after a rebuild. Signed-off-by: Bruce Ashfield <bruce.ashfield@gmail.com>
-rw-r--r--classes/image-oci-sloci-image.inc7
-rw-r--r--classes/image-oci-umoci.inc8
2 files changed, 9 insertions, 6 deletions
diff --git a/classes/image-oci-sloci-image.inc b/classes/image-oci-sloci-image.inc
index 9248489f..db86ab15 100644
--- a/classes/image-oci-sloci-image.inc
+++ b/classes/image-oci-sloci-image.inc
@@ -72,18 +72,19 @@ IMAGE_CMD:oci() {
72 fi 72 fi
73 73
74 # create a convenience symlink 74 # create a convenience symlink
75 ln -sf ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci 75 # Use -n to avoid creating link inside existing symlink target directory
76 ln -sfn ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci
76 77
77 if [ -n "${OCI_IMAGE_TAR_OUTPUT}" ]; then 78 if [ -n "${OCI_IMAGE_TAR_OUTPUT}" ]; then
78 # move the sloci output to a naming convention that matches what we do with umoci, thie 79 # move the sloci output to a naming convention that matches what we do with umoci, thie
79 # default creates a subdirectory, so it get the "-dir" in the name 80 # default creates a subdirectory, so it get the "-dir" in the name
80 mv ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-dir.tar 81 mv ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-dir.tar
81 ln -sf ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-dir.tar ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci-dir.tar 82 ln -sfn ${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-dir.tar ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci-dir.tar
82 83
83 ( 84 (
84 cd "${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci" 85 cd "${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci"
85 tar -cf ../"${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar" "." 86 tar -cf ../"${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar" "."
86 ) 87 )
87 ln -sf "${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar" ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci.tar 88 ln -sfn "${IMAGE_NAME}${IMAGE_NAME_SUFFIX}-oci-${OCI_IMAGE_TAG}-${OCI_IMAGE_ARCH}-linux.oci-image.tar" ${IMAGE_BASENAME}-${OCI_IMAGE_TAG}-oci.tar
88 fi 89 fi
89} 90}
diff --git a/classes/image-oci-umoci.inc b/classes/image-oci-umoci.inc
index 9bd154fb..1d4863b3 100644
--- a/classes/image-oci-umoci.inc
+++ b/classes/image-oci-umoci.inc
@@ -123,13 +123,15 @@ IMAGE_CMD:oci() {
123 tar -cf "$image_name-dir.tar" "$image_name" 123 tar -cf "$image_name-dir.tar" "$image_name"
124 124
125 # create a convenience symlink 125 # create a convenience symlink
126 ln -sf "$image_name.tar" "${IMAGE_BASENAME}-$image_tag-oci.tar" 126 # Use -n to avoid creating link inside existing symlink target directory
127 ln -sf "$image_name-dir.tar" "${IMAGE_BASENAME}-$image_tag-oci-dir.tar" 127 ln -sfn "$image_name.tar" "${IMAGE_BASENAME}-$image_tag-oci.tar"
128 ln -sfn "$image_name-dir.tar" "${IMAGE_BASENAME}-$image_tag-oci-dir.tar"
128 fi 129 fi
129 130
130 # We could make this optional, since the bundle is directly runnable via runc 131 # We could make this optional, since the bundle is directly runnable via runc
131 rm -rf $image_bundle_name 132 rm -rf $image_bundle_name
132 133
133 # This is the OCI image directory, which is technically the "image" as specified 134 # This is the OCI image directory, which is technically the "image" as specified
134 ln -sf $image_name ${IMAGE_BASENAME}-$image_tag-oci 135 # Use -n to avoid creating link inside existing symlink target directory
136 ln -sfn $image_name ${IMAGE_BASENAME}-$image_tag-oci
135} 137}