主机是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.target
。unmount.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。