rsync :将符号链接复制为常规文件

rsync :将符号链接复制为常规文件

我需要将包含各种文件的大目录复制到已经包含大量重要数据的驱动器上。

我希望能够复制 munged 符号链接,但驱动器是 exfat 并且不支持符号链接。因为该文件已经包含大量数据,所以我想避免必须传输该数据才能将其格式化为支持符号链接的内容。

rsync 有没有办法读取如下所示的符号链接:

/etc/apache2/sites-enabled/mysite.conf -> ../sites-available/mysite.conf

并生成一个常规文件,例如

<rsync-destination>/etc/apache2/sites-enabled/mysite.conf.rsync-munged

包含文本

../sites-available/mysite.conf

我更喜欢将解决方案内置到 rsync 中或在 bash 管道中完成,或者至少是任何 Linux 上找到的基本工具的一部分,但我愿意接受提供 rsync 功能 + 此功能的其他软件

编辑:

我发现 rsync 不能做这样的事情。我想我找到了一种手动执行此操作的方法:

rsync 除符号链接之外的所有内容,然后单独运行“查找”操作来识别源中的所有符号链接,并使用 bash 脚本手动创建它们。

我必须手动从 stdio 中提取符号链接数据,但我不知道该怎么做。 ls -l 有更多的数据会妨碍

答案1

你想要的不是直接可能的:

  • 您无法将符号链接转换为具有后缀名的文件,例如munged
  • 您可以将符号链接转换为常规文件 ( --fake-super),但与它们关联的元数据(使它们能够转换回符号链接)无法存储在 exFAT 文件系统上

其他可能性

  • --munge-links选项将符号链接保留为符号链接,但修复符号链接的值,使其在目标系统上无效。对于 exFAT 文件系统没有用
  • 您可以使用--copy-links将符号链接扩展为实际文件。这可能不是您想要的,因为符号链接信息丢失并且在数据返回到源系统时无法重建

我能看到的唯一其他解决方案是在目标系统上创建一个大文件,该文件可以作为本机 Linux 文件系统安装,例如ext4.然后,您可以将备份发送到该文件系统,并受益于 exFAT 中有限集之外的额外功能。

答案2

rsync 常规文件,然后分别查找所有链接,将它们列在一个文件中,然后逐个创建所有链接文件

#!/bin/bash
$SRCDIR="/backup/";
$SRCSERVER="[email protected]";
$DEST=".";
rsync -rtpEv "$SRCSERVER:$SRCDEST" $DEST;
ssh SRCSERVER "stat -c %N \`find $SRCDIR -type l\` 2> /dev/null" > links;
$MUNGED = ".munged";

while read p; do                                                                                                                                                                                                     
    file=$(echo $p | awk -F ' ' '{print $1}' | sed "s/^\`/;s/'$//");                                                                                                                                                  
    dest=$(echo $p | awk -F ' ' '{print $3}' | sed "s/^\`//;s/'$//");                                                                                                                                                  
    echo $dest > "$file$MUNGED";
done < links;                                                                                                                                                                                      

(不确定我的 bash 语法,我基本上手动运行了所有这些)

答案3

如果文件不需要直接读取或修改,只需整体恢复,一个简单的解决方案是将它们存档tar等。


如果不需要从备份中直接读取文件,但您希望能够更新备份,并且磁盘上有一些空闲空间,则可以使用git归档数据。作为奖励,您将能够恢复旧版本。

cd /path/to/back/up
git init .
git commit -a
git clone --bare .git /media/external-disk/my-site.git

Git 存储符号链接,但不存储权限。如果文件的权限很重要,您可以使用等等管理员。它围绕 Git(或其他版本控制系统)并将文件元数据存储在单独的文件中。


如果不需要从非 Linux 系统访问这些文件,并且您对它们的总大小有一个很好的估计,则可以创建一个 ext4 文件系统映像并环路安装它。初步准备工作是这样的:

truncate -s 42G /media/external-disk/linux.fs
mkfs.ext4 -F /media/external-disk/linux.fs

然后使用文件系统映像:

sudo mkdir /media/external-linux
sudo mount -o loop /media/external-disk/linux.fs /media/external-linux
sudo rsync -ax / /media/external-linux/my-site-backup
sudo umount /media/external-linux

一种潜在的方法是文件系统层使用单独的文件来存储底层文件系统不支持的元数据。 [Upfs](你可以尝试UPFS,确实如此,但不幸的是,它没有得到维护。

(很久以前,乌姆斯多斯很受欢迎;它允许在 FAT 文件系统上存储 Linux 文件,而该系统不支持符号链接、权限、超过 8 个字符的文件名加上 3 个字符的扩展名等。不幸的是,它与 FAT32 或 exFat 不兼容。)

相关内容