tar –one-file-system diving into a bind-mounted directory

This post was written by eli on November 25, 2018
Posted Under: Linux

Using tar -c –one-file-system a lot for backing up large parts of my disk, I was surprised to note that it went straight into a large part that was bind-mounted into a subdirectory of the part I was backing up.

To put it clear: tar –one-file-system doesn’t (always) detect bind mounts.

Why? Let’s look, for example at the source code (tar version 1.30), src/incremen.c, line 561:

if (one_file_system_option && st->parent
 && stat_data->st_dev != st->parent->stat.st_dev)
   [ ... ]

So tar detects mount points by comparing the ID of the device containing the directory which is a candidate for diving into with its parent’s. This st_dev entry in the stat structure is a 16-bit concatenation of the device’s major and minor numbers, so it’s the underlying physical device (or pseudo device with a zero major for /proc, /sys etc). On a plain “stat filename” at command prompt, this appears as “Device”. For example,

$ stat /
 File: `/'
 Size: 4096          Blocks: 8          IO Block: 4096   directory
Device: fd03h/64771d    Inode: 2           Links: 29
Access: (0555/dr-xr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-11-24 15:37:17.072075635 +0200
Modify: 2018-09-17 03:55:01.871469999 +0300
Change: 2018-09-17 03:55:01.871469999 +0300

With “real” mounts, the underlying device is different, so tar detects that correctly. But with a bind mount from the same physical device, tar considers it to be the same filesystem.

Which is, in a way, correct. The bind-mounted part does, after all, belong to the same filesystem, and this is exactly what the –one-file-system promises. It’s only us, lazy humans, who expect –one-file-system not to dive into a mounted directory.

Add a Comment

required, use real name
required, will not be published
optional, your blog address