diff options
| author | Bruce Ashfield <bruce.ashfield@gmail.com> | 2026-01-06 19:59:25 +0000 |
|---|---|---|
| committer | Bruce Ashfield <bruce.ashfield@gmail.com> | 2026-02-09 03:32:52 +0000 |
| commit | 70a9de6c79b916991fcbf6fcc714891592a41a8b (patch) | |
| tree | b159bb1758d634ac6058692818c1f910c41fef4c | |
| parent | 3a24b69b4edf4b04b2b2a13ee9575412b014068a (diff) | |
| download | meta-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.inc | 7 | ||||
| -rw-r--r-- | classes/image-oci-umoci.inc | 8 |
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 | } |
