rsync 的“只读文件系统 (30)”错误

kjo*_*kjo 5 permissions rsync symlink

注意:这是一个由两部分组成的问题:为什么会发生错误,以及如何解决错误。(这两部分是相关的,因为“为什么”问题的答案可能会阐明“如何”问题。)


rsync -avuz /some/source/directory .我正在尝试的命令给出了表单的几个错误(大致)

rsync: symlink "/target/directory/foo/bar/baz" -> "../../bar/baz" failed: Read only file system (30)
Run Code Online (Sandbox Code Playgroud)

.../target/directory当前目录在哪里。

我对这个错误感到困惑。该rsync进程确实没有写入权限../..,但我不明白为什么它首先需要:它肯定有写入权限/target/directory/foo/bar/baz

尽管如此,在手头的情况下,有这个问题的文件数量只占被复制文件总数的很小一部分,因此如果这些有问题的符号链接被“复制到”常规文件就好了其名称已以某种方式更改以表明其特殊性质,并且其内容仅由原始符号链接的目标组成。例如,符号链接

/some/source/directory/foo/bar/baz -> ../../bar/baz
Run Code Online (Sandbox Code Playgroud)

之前显示的将“复制到”常规文件

/target/directory/foo/bar/baz-PSEUDOSYMLINK
Run Code Online (Sandbox Code Playgroud)

...完全由下面显示的一行组成

../../bar/baz
Run Code Online (Sandbox Code Playgroud)

在将 Unix 目录树复制到 Windows 系统时,我看到过类似的操作。

有没有一种简单的方法可以做到这一点?

Vic*_*art 5

问题

\n

我用来通过rsync备份我的音乐收藏 ( /mnt/Music/)crontab到较旧的(因此有时容易出错)硬盘 ( /mnt/Music_Backups)。

\n

在手动检查该备份分区后,我注意到这些备份有时(如果通过运行则静默crontab)失败,手动备份尝试也是如此:

\n
sudo rsync -aq --delete /mnt/Music/ /mnt/Music_Backups\n\n    rsync: [generator] failed to set times on \\\n    "/mnt/Music_Backups/ROCK & POP": Read-only file system (30)\n
Run Code Online (Sandbox Code Playgroud)\n
\n

评估

\n

这是我的系统详细信息。

\n
    \n
  • 操作系统:Arch Linux x_86。
  • \n
  • rsync 版本v3.2.3
  • \n
  • /etc/crontab入口:
  • \n
\n
# /etc/crontab entry\n0 5 * * * root nice -n 19 rsync -aq --delete /mnt/Music/ /mnt/Music_Backups\n
Run Code Online (Sandbox Code Playgroud)\n

验证设备、分区、挂载点:

\n
lsblk | grep -B1 -i music_back\n\n    sdd      8:48   1   1.8T  0 disk \n    \xe2\x94\x94\xe2\x94\x80sdd1   8:49   1   1.8T  0 part /mnt/Music_Backups\n\nblkid | grep sdd1\n\n    /dev/sdd1: LABEL="Music_Backups" \\\n    UUID="b90047d3-147c-491c-a17d-17763f79a12a" \\\n    BLOCK_SIZE="4096" TYPE="ext4" \\\n    PARTLABEL="Music_Backups" \\\n    PARTUUID="98425256-c626-41f1-a85e-6f5feaf412d6"\n
Run Code Online (Sandbox Code Playgroud)\n
\n

原因

\n

虽然目标驱动器权限正常:rsync执行以下操作后我遇到了相同的错误:

\n
sudo chown -R root:victoria /mnt/Music_Backups/\n
Run Code Online (Sandbox Code Playgroud)\n

...并且分区在磁盘分区实用程序 ( Gparted) 中看起来很好,命令行实用fsck程序表明实际上存在错误:

\n
sudo umount /mnt/Music_Backups/\n\n## Note: if any programs, e.g. a file manager, are using / viewing\n## that partition you won\'t be able to `umount` it until you navigate\n## away from anything accessing `/mnt/Music_Backups/`\n\n## Update/CAUTION: do not run fsck on a Network Attached Storage (NAS) \n## hard drive (commonly sold on AMZN ...); these require special \n## software; fsck will kill your HDD.\n\nsudo fsck /dev/sdd1\n\n    fsck from util-linux 2.36\n    e2fsck 1.45.6 (20-Mar-2020)\n    Music_Backups: recovering journal\n    Music_Backups contains a file system with errors, check forced.\n    Pass 1: Checking inodes, blocks, and sizes\n    Inode 85460709 extent tree (at level 1) could be shorter.  Optimize<y>? yes\n    Pass 1E: Optimizing extent trees\n    Pass 2: Checking directory structure\n    Pass 3: Checking directory connectivity\n    Pass 4: Checking reference counts\n    Pass 5: Checking group summary information\n\n    Music_Backups: ***** FILE SYSTEM WAS MODIFIED *****\n    Music_Backups: 164762/122101760 files (19.8% non-contiguous), 423271337/488378368 blocks\n\n## Recheck:\n\nsudo fsck /dev/sdd1\n\n    fsck from util-linux 2.36\n    e2fsck 1.45.6 (20-Mar-2020)\n    Music_Backups: clean, 164762/122101760 files, 423271337/488378368 blocks\n\nsudo mount /dev/sdd1 /mnt/Music_Backups/\n\nsudo rsync -aq --delete /mnt/Music/ /mnt/Music_Backups\n\n$ ## completed normally\n
Run Code Online (Sandbox Code Playgroud)\n
\n

结论

\n

基于此,我相信当我的操作系统检测到分区上的错误时,它会阻止该分区上的读写,直到这些错误得到解决,从而阻止rsync完成其任务。

\n
\n

笔记

\n

rsync:

\n
    \n
  • -a[存档] :相当于-rlptgoD. 这是表达您想要递归并想要保留几乎所有内容的快捷方式... [请参阅 https://linux.die.net/man/1/rsync]

    \n
  • \n
  • -q[quiet] :抑制非错误消息

    \n
  • \n
\n
\n

附录 1:失败通知

\n

如前所述,etc/crontab计划的备份默默地 失败了。这是该问题的解决方案(添加到/etc/crontab)。

\n
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"\n\n# add this as one line (broken here, for readability;\n# substitute your user name for "victoria"):\n\n0  5  *  *  *  victoria  nice -n 19\n  rsync -aq --delete /mnt/Music/ /mnt/Music_Backups ; EXIT_STATUS=$?;\n  if [ $EXIT_STATUS -ne 0 ]; then\n  notify-send -i warning -t 0 "/etc/crontab for rsync\'d Music Backups failed"\n  --icon=dialog-information ;\n  mutt -s "/etc/crontab for rsync\'d Music Backups failed" <your_email_address>; fi\n
Run Code Online (Sandbox Code Playgroud)\n

这样,如果备份失败,我将来应该通过屏幕通知和电子邮件收到通知。

\n\n
\n

notify-send请注意,使用andmutt时存在一些问题/etc/crontab

\n
    \n
  • 当以普通用户身份运行时root(例如我:“victoria”),您将看不到通知;并且,您需要muttroot(用户)配置电子邮件帐户。

    \n
  • \n
  • crontab因此,作为普通用户运行该条目要容易得多。我递归地chown将我的备份位置设置为root:victoria,因此将该crontab条目运行为“victoria”不是问题。

    \n
  • \n
  • 如上所述,执行notify-sendvia/etc/crontab需要靠近 顶部的这一行/etc/crontab

    \n
  • \n
\n
DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"\n
Run Code Online (Sandbox Code Playgroud)\n

echo $UID在终端中以普通用户 [例如“victora”(我)] 的身份执行以获得该数字(“1000”,上面)。

\n

详细信息请参见:

\n\n

有了这一切,我的crontab条目(上面)每天早上 5 点运行,如果备份因任何原因失败,它会(在屏幕上;电子邮件)通知我。

\n

您可以使用此条目测试这些命令crontab(每分钟运行一次;“apples”不是程序,因此肯定会失败):

\n
*  *  *  *  *  <your_user_name>  nice -n 19\n  apples -aq --delete /mnt/Music/ /mnt/Music_Backups ; EXIT_STATUS=$?;\n  if [ $EXIT_STATUS -ne 0 ]; then\n  notify-send -i warning -t 0 "/etc/crontab for rsync\'d Music Backups failed"\n  --icon=dialog-information ;\n  mutt -s "/etc/crontab for rsync\'d Music Backups failed" <your_email_address>; fi\n
Run Code Online (Sandbox Code Playgroud)\n
\n

附录 2:失败通知

\n

rsync 备份失败的 mutt 电子邮件通知(在 Claws Mail 中查看)

\n
[victoria@victoria ~]$ date\n  Wed Jan  6 08:48:38 AM PST 2021\n\n[victoria@victoria ~]$ lsblk\n\n  NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT\n  ...\n  sdd      8:48   1   1.8T  0 disk \n  \xe2\x94\x94\xe2\x94\x80sdd1   8:49   1   1.8T  0 part /mnt/Music_Backups\n  ...\n\n[victoria@victoria ~]$ sudo umount /mnt/Music_Backups/\n\n## Update/CAUTION: do not run fsck on a Network Attached Storage (NAS) \n## hard drive (commonly sold on AMZN ...); these require special \n## software; fsck will kill your HDD.\n\n## Repair disk partition [accept default Y/n suggestions, if present]:\n\n[victoria@victoria ~]$ sudo fsck /dev/sdd1\n  fsck from util-linux 2.36.1\n  e2fsck 1.45.6 (20-Mar-2020)\n  Music_Backups: recovering journal\n  Music_Backups contains a file system with errors, check forced.\n  Pass 1: Checking inodes, blocks, and sizes\n  Pass 2: Checking directory structure\n  Pass 3: Checking directory connectivity\n  Pass 4: Checking reference counts\n  Pass 5: Checking group summary information\n  Music_Backups: 165909/122101760 files (20.0% non-contiguous), 425759721/488378368 blocks\n\n## Repeat until no errors:\n\n[victoria@victoria ~]$ sudo fsck /dev/sdd1\n  fsck from util-linux 2.36.1\n  e2fsck 1.45.6 (20-Mar-2020)\n  Music_Backups: clean, 165909/122101760 files, 425759721/488378368 blocks\n\n[victoria@victoria ~]$ sudo mount /dev/sdd1 /mnt/Music_Backups/\n\n## /etc/crontab entry (broken over lines here for readability):\n\n  0    5    *    *    *    victoria    nice -n 19\n  rsync -aq --delete /mnt/Music/ /mnt/Music_Backups ; STATUS=$? ;\n  if [ $STATUS -ne 0 ]; then notify-send -i warning -t 0 "/etc/crontab\n  for rsync\'d Music Backups failed" --icon=dialog-information ;\n  mutt -s "/etc/crontab for rsync\'d Music Backups failed" mail@VictoriasJourney.com ;\n  fi\n\n## Check: manually run Music_Backup command\n\n[victoria@victoria ~]$ time rsync -aq --delete /mnt/Music/ /mnt/Music_Backups\n  0:39.91\n\n[victoria@victoria ~]$ \n
Run Code Online (Sandbox Code Playgroud)\n