What exactly is the GNU tar ././@LongLink "trick"?
Categories:
Unmasking the GNU tar '././@LongLink' Trick: A Deep Dive into Interoperability

Explore the mysterious GNU tar '././@LongLink' entry, its purpose in handling long filenames, and the interoperability challenges it presents across different tar implementations.
When working with tar archives, especially those created by GNU tar, you might occasionally encounter a peculiar entry named ././@LongLink or ././@LongLink/ when listing the archive's contents. This isn't a regular file or directory you'd expect to find in your backup; rather, it's a special mechanism employed by GNU tar to handle filenames that exceed the standard length limits defined by various tar formats. Understanding this 'trick' is crucial for ensuring proper interoperability and avoiding unexpected issues when extracting archives on different systems or with different tar utilities.
The Problem: Tar Format Limitations
Historically, tar (tape archive) formats have had limitations on the length of filenames they can store. The original V7 tar format, for instance, allowed only 100 characters for a filename. Later standards like POSIX ustar extended this to 256 characters, often by splitting the path into a prefix and name. However, even 256 characters can be insufficient for deeply nested directory structures or very descriptive filenames common in modern file systems. When GNU tar encounters a filename longer than what the chosen tar format can natively support, it needs a way to store this information without corrupting the archive or truncating the filename.
flowchart TD
A[File with Long Name] --> B{Filename Length > Tar Limit?}
B -- Yes --> C[GNU tar creates '././@LongLink' entry]
C --> D[Stores full long filename in @LongLink's data block]
D --> E[Creates placeholder entry for actual file/symlink]
E --> F[Placeholder points to @LongLink for name]
B -- No --> G[Stores file normally]
F --> H[Archive Created]
G --> HHow GNU tar handles long filenames with @LongLink
The GNU tar '././@LongLink' Mechanism
To overcome filename length limitations, GNU tar introduced a proprietary extension. When it encounters a filename that exceeds the maximum length for the selected tar format, it performs the following steps:
- Creates a special entry: It writes a special entry into the
tararchive with the name././@LongLink(for regular files) or././@LongLink/(for directories, though less common for directories themselves to exceed limits, but their contents might). This entry is typically of type 'L' (for long link) or 'K' (for long name). - Stores the full filename: The data block associated with this
././@LongLinkentry contains the full, un-truncated long filename. - Creates a placeholder entry: Immediately following the
././@LongLinkentry, GNUtarwrites anothertarheader for the actual file or symbolic link. This placeholder entry will have a truncated or generic filename (e.g., a hash or a short name) and a special flag indicating that its true name is stored in the preceding././@LongLinkentry.
During extraction, a GNU tar utility recognizes the ././@LongLink entry, reads the full filename from its data block, and then applies that name to the subsequent placeholder entry, effectively reconstructing the original long filename.
# Create a very long filename
mkdir -p very/deeply/nested/directory/structure/with/an/extremely/long/path/that/exceeds/common/tar/limits
touch very/deeply/nested/directory/structure/with/an/extremely/long/path/that/exceeds/common/tar/limits/this_is_a_very_long_filename_indeed_and_it_will_trigger_the_longlink_mechanism.txt
# Create a tar archive using GNU tar
gnu_tar -cvf longlink_example.tar very
# List the contents of the archive, observing the @LongLink entry
gnu_tar -tvf longlink_example.tar
Demonstrating the creation and listing of an archive with a long filename using GNU tar.
Interoperability Challenges
While ingenious, the ././@LongLink mechanism is a GNU tar extension. This leads to significant interoperability issues:
- Non-GNU
tarutilities: Othertarimplementations (e.g., BSDtaron macOS, ortaron Solaris) do not understand the././@LongLinkspecial entry. When they encounter it, they will typically:- Extract
././@LongLinkas a literal file or directory named@LongLink(often containing the long filename as its content). - Extract the subsequent placeholder file with its truncated or generic name, completely ignoring the intended long name.
- In some cases, they might even abort with an error if they don't recognize the entry type.
- Extract
- Data Loss/Corruption (Perceived): Users extracting archives with non-GNU
tarmight find their long filenames truncated or replaced, leading to perceived data loss or a corrupted directory structure. - Portability: Archives created with GNU
tarand containing long filenames are not truly portable to systems that rely on othertarimplementations without specific handling or conversion.
tar utility used when creating and extracting archives, especially when dealing with potentially long filenames. If portability is a concern, consider using tar options that enforce standard formats or avoid excessively long paths.Mitigation and Best Practices
To avoid issues related to ././@LongLink, consider these strategies:
- Use
paxfor maximum portability: Thepaxutility (Portable Archive eXchange) is designed for maximum interoperability across different systems and can often handle varioustarandcpioformats gracefully. It's part of POSIX. - Specify
tarformat: When creating archives with GNUtar, you can explicitly specify a standard format that supports longer filenames, such asustarorposix(also known aspaxformat in GNUtar). Theposixformat (often referred to aspaxformat by GNUtar) uses extended headers to store metadata like long filenames, which is a more standardized approach than././@LongLink. - Avoid excessively long filenames: While not always feasible, keeping filenames and path lengths reasonable can prevent triggering the
././@LongLinkmechanism altogether. - Test extraction: If you're creating archives for distribution, test extraction on a system with a different
tarimplementation (e.g., macOS or a non-GNU/Linux system) to ensure compatibility. - Use
zipor other archive formats: For cross-platform distribution wheretarinteroperability is a major concern,ziparchives are often a more universally understood format, though they have their own set of limitations and features.
# Create an archive using GNU tar, forcing the POSIX (pax) format
gnu_tar -cvf longlink_posix_example.tar --format=posix very
# List the contents - you should NOT see '././@LongLink'
gnu_tar -tvf longlink_posix_example.tar
# Create an archive using GNU tar, forcing the ustar format
gnu_tar -cvf longlink_ustar_example.tar --format=ustar very
# List the contents - ustar has a 256 char limit, so it might still use @LongLink if path is too long
gnu_tar -tvf longlink_ustar_example.tar
Using GNU tar's --format option to specify archive format and improve portability.
--format=posix (or --format=pax) with GNU tar, long filenames are stored in a standardized way using PAX extended headers, which are understood by many modern tar implementations, making the archives much more portable than those relying on ././@LongLink.