使用共享文件夹在 Ubuntu 虚拟机和 Windows 主机之间进行(r)同步(启动后和重启/关机之前)

使用共享文件夹在 Ubuntu 虚拟机和 Windows 主机之间进行(r)同步(启动后和重启/关机之前)

主机是windows,我有一个Ubuntu虚拟机(vmware),Ubuntu和Windows之间有一个共享文件夹,共享文件夹挂载在/etc/fstab

vmhgfs-fuse                  /shared    fuse    defaults,allow_other,nofail

当 Ubuntu 虚拟机启动(之后)/重启(之前)/关闭(之前)时,如果shared已挂载,我想从共享文件夹中的 Ubuntu 同步(rsync)某些目录。

例子:

/work/alpha to be rsync in /shared/alpha

我尝试了下面的代码和变体,但没有工作:

文件:rsync_before_shutdown.sh

#!/bin/bash
rsync -r /workspace/projects/ /shared
[Unit]
Description=Run before shutdown
DefaultDependencies=no
Before=shutdown.target reboot.target halt.target

[Service]
Type=oneshot
RemainAfterExit=true 
ExecStart=/bin/true
ExecStop=/bin/bash /workspace/projects/rsync_before_shutdown.sh/rsync_before_shutdown.sh
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target 

如果我在重启后检查 journalctl:

run_before_shutdown.service: Failed with result 'exit-code'.
Failed to start Run before shutdown.

我推测原因可能是当脚本尝试运行时目录已被卸载。

因此,我将目标从 改为shutdown.targetunmount.target只有通过 root 重新启动,它才能正常工作。服务的权限为 644,脚本的权限为rwxr-xr-x

答案1

我在运行 Ubuntu 22.04 的 VBox 中尝试了以下操作。

在 /etc/systemd/system/actionPreShutDown.service 中创建一个 systemd 服务:

[Unit]
Description=Run before shutdown
#DefaultDependencies=no
After=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=true 
ExecStart=/bin/true
ExecStop=/bin/bash /usr/local/bin/sync_before_shutdown.sh
TimeoutStartSec=0

[Install]
WantedBy=multi-user.target

创建测试文件/usr/local/bin/sync_before_shutdown.sh

我的样子是这样的:

#!/bin/bash
timestamp=$(date '+%n---%a %b %e %H:%M:%S %Z %Y---%n')
SOURCE=`dirname -- "$0"`;
echo $SOURCE
echo "Shutting down now: '$timestamp'" >>$SOURCE/log.txt

因此它基本上在“poweroff”时写入了日志(到仍然挂载的文件系统中)。

“关机”是通过 gnome 菜单和命令行触发的。

为什么/usr/local/bin

要执行的代码必须属于系统,不是用户。由于我认为“备份”是一项管理任务,而Linux 文件系统层次标准写道:

/usr/local 层次结构供系统管理员在本地安装软件时使用。它需要确保在系统软件更新时不会被覆盖。

bash 将位于您的路径中(即您可以从控制台调用它),但只能以 root 身份执行。

但我的最终答案是,它可能无法稳定运行。他自己无法回答这个问题...

主要问题似乎是无法在 umount 之前执行代码,因为 systemd 并行运行,并且关机和 umount 是彼此独立触发的。所以我专注于可用的挂载和目标。

该线路After=local-fs.target可实现该目标已被绑定,因此将结束它该目标将被删除/停止。

另外,您也可以设置要备份的挂载点,然后继续。由于我在这个问题上花了很多时间,如果您找到了其他解决方案,我将非常感激您的更新。

答案2

我最近刚刚使用 Rsync 将文件从我的旧 16.04 PC 备份到另一台使用 22.04 的 PC 上,rsync -av -e ssh old_user@old_laptop:/home/old_user/ /home/new_user但您需要openssh-server在您原来的 PC 上安装它。

要在 Windows 上使用 Rsync,您可能需要Windows Subsystem for Linux安装或简称 WSL,或者Git for Windows它将允许您使用 git bash 调用 Rsync。

坦率地说,我认为这一切都是不必要的,因为已经有一些程序允许您设置实时同步,实时将文件从源目录更改为目标目录。

也许可以看看 Syncthing 和 SyncTrayzor。

相关内容