When using the tar utility to store files in backups one loses the extended ACLs.
Is there some commonly used and not hackish solution (like: create a script that will recrate the ACLs from scratch) to preserve the ACLs?
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It only takes a minute to sign up.
Sign up to join this communityWhen using the tar utility to store files in backups one loses the extended ACLs.
Is there some commonly used and not hackish solution (like: create a script that will recrate the ACLs from scratch) to preserve the ACLs?
Actually, I believe the question was not about the (standard) file permission bits, but extended ACL information (see setfacl(1) or acl(5)).
To my knowledge, the unmodified GNU tar ignores ACL information. (The man page for GNU tar 1.15.1 as shipped with RHEL 5.2 mentions switches --acls and --no-acls, but I haven't gotten them to work.)
However, the star program is able to back up and restore ACLs, if you select the exustar format:
star -c -p -acl artype=exustar -f archive.tar files...
star -x -acl -f archive.tar
Star home page: http://cdrecord.berlios.de/new/private/star.html Star is available in ubuntu, at least.
star
is not available on Debian and does not seem to be maintained by a "team". The project is still alive and maintained after 30+ years though. Try bsdtar
if you want something else.
I'm looking for a solution as well so far I found this:
first do a getfactl from my folder
getfacl -R /a_folder > folder.acl
then do a regular tar
tar -czvf folder.tar.gz /a_folder
when I extract it
tar -xvf folder.tar.gz
do a setfacl for the permissions.
setfacl --restore=folder.acl
this works for me.
Using tar
To create:
tar --acls -cpf backup.tar some-dir-or-file
To untar:
tar --acls -xpf backup.tar
tar
doesn't support --acls
until jessie. (See bug #732071.) The feature is also available in the package from wheezy-backports
.
Jun 27, 2014 at 5:06
I suggest you to use bsdtar
.
bsdtar
backups extended ACL by default, it uses the same syntax as GNU tar
, and the archives it produces are readable by GNU tar
.
The package and command name (under Debian based distributions) is bsdtar
.
bsdtar cf archive.tar /my/folder/using/extd_acl
bsdtar xf archive.tar
The 2nd (extract) command restores ACLs.
If you're looking for a simple-to-use yet powerful solution, I'd recommend rdiff-backup
.
Basically, it makes a copy of a source directory to a destination directory but it also saves additional information so you can go back in time to whenever you want.
And, of course, it preserves symlinks, special files, hardlinks, permissions, uid/gid ownership and modification times.
From the tar Man Page.
-p, --same-permissions, --preserve-permissions
ignore umask when extracting files (the default for root)
It is not actually the act of archiving that alters the access permissions(ACLs), but the act of unpacking them. Tar is very often used to distribute files from one user to another, and so it is thought convenient to apply a users umask when they unpack.
To preserve the files previous permissions, simply ad a p for to your options. For example
Straight tar:
tar xvp some-file
bz.tar:
tar xvjp some-file
gz.tar:
tar xvzp some-file
@silk
When using the tar utility to store files in backups one loses the extended ACLs.
Is there some commonly used and not hackish solution (like: create a script that will recrate the ACLs from scratch) to preserve the ACLs?
When creating/extracting the archive you need to use both the --acls
and --xattrs
options and of-course have the proper permissions to read/write those acl and xattr.
ZSTD_CLEVEL=19 tar --acls --xattrs -caPf systemd-network-conf.tzst --directory=/etc systemd/network systemd/networkd.conf.d
The above will create a zstd
compressed tar
archive, using compression level 19
, while preserving the ACL's and extended attributes.
.tzst
extension means "a tar archive using zstd compression", just like tgz
is for a gzip'ed version etc.zstd
compressor is set by the provided ZSTD_CLEVEL
environment variable at start on same line.tar(1)
and zstd(1)
.sudo tar --acls --xattrs -xvf systemd-network-conf.tzst
The above will create, in your current directory, a sub-directory named systemd
because that's the common root-dir inside the archive.
{cd /etc; getfacl -R systemd/network systemd/networkd.conf.d} >original.acl; cd -
getfacl -R systemd/network systemd/networkd.conf.d >extracted.acl
diff -u original.acl extracted.acl
cd -
as separate command, which just restores your current directory.)