为什么 Rsync 会覆盖我的操作系统?
Why did Rsync overwrite my operating system?
过去几年,我一直在 运行 Ubuntu 小型英特尔 NUC 服务器上工作。它有两个通过 USB 连接的外部硬盘驱动器:Media
和 MediaBackup
.
外部硬盘驱动器很久以前就被添加到 fstab
以在启动时自动挂载:
echo "/dev/sdb1 /media/Media ext4 user 0 0" | sudo tee -a /etc/fstab
echo "/dev/sdc1 /media/MediaBackup ext4 user 0 0" | sudo tee -a /etc/fstab
在某些时候,我想自动备份我的 Media
目录,所以我将命令传递给 cron
:
echo "00 1 * * * root rsync -av --delete /media/Media/ /media/MediaBackup/" | sudo tee -a /etc/cron.d/backup-media
这个 运行 可靠且一年多没有问题。
一天早上,我发现我无法通过 SSH 连接到 NUC,也无法对其进行 任何操作。使用 live USB 启动 NUC 后,我意识到 rsync
已经完全覆盖了我在 /dev/sda1
的 OS。
为什么 rsync
覆盖了我的 OS,我怎样才能防止它再次这样做?
编辑
正如@thatotherguy 在评论中指出的那样,我原来问题中的脚本在几个方面存在缺陷。它基于我在 GitHub 上保存了一年左右的 setup.sh
脚本。该脚本反映了我当时对如何在全新安装上重新创建服务器状态的最佳猜测,但我从未真正使用过它。
我已经更正了可能导致脚本失败的部分,但留下了两个看起来很严重的错误:
- 正如大家指出的那样,将
rsync
备份执行为 root
,并且
- 正如@Slawomir Dziuba 指出的那样,通过它们的 SCSI 磁盘分配(
/dev/sda
、/dev/sdb
)而不是它们的 UUID 在 fstab
中安装硬盘
仔细阅读 fstab
之后,@Slawomir Dziuba 关于使用 UUID 的回复,以及每个人关于不作为 root
执行的回复,可能是对“如何我可以阻止它再次这样做吗?
我会将这个问题保留几天,以防任何评论者想要回答。不确定是否适合留下来。
谢谢大家的帮助。
在cident.
中描述的内容中有几点值得关注
1.During 任何工作,避免使用 root 帐户,除非你绝对需要使用它。如果你犯了一个错误
你可以破坏系统中的任何东西。脚本 运行 root 权限也可以在出现错误时对系统进行任何破坏。
如果您不以 root 身份使用 cron,尽管出现磁盘错误,rsync 将没有覆盖权限,什么也不会发生。
您可以使用命令 crontab -e
,在您最喜欢的编辑器中,它允许您设置任何脚本及其 运行 时间。
您还可以更好地控制系统,因为您可以将 cron 脚本保存在一个目录中,例如~/crons
如果你始终如一
对于所有服务,备份系统设置然后仅备份您的主目录就足够了。
重要的区别在于您有不同的系统变量可用于 root 和不同的用户。 Explicit 归因是一种很好的做法
脚本开头需要的任何内容,不要依赖系统变量。在 运行 脚本之后,检查
它是否不仅在您的设置上而且在 cron 中 运行ning 都能正常工作。
同样的问题与使用重定向、回显等编辑系统文件有关。 Bash
充满了各种异常、不寻常的替换等。如果你不确定自己在做什么,你可能会伤害自己很多。
出于这个原因,在发出任何复杂的命令之前,有必要检查它到底做了什么(命令前回显)
以及执行后的结果是否如计划的那样实际。检查上一个命令的输出状态也很有意义 (echo $?
)
使用像sudo vi /etc/fstab
这样的编辑器会好很多
在您更改此文件中的一个字符之前,请像这样使用 RCS 系统 (apt install rcs
):
sudo ci -l /etc/fstab
这样你将备份文件:fstab,v
如果你在每次更改之前这样做,你将始终拥有所有
此文件的先前版本和您更改的所有系统版本,命令很简单,但请阅读 rcs、ci 和 co、especi 的手册,记住 -l 选项
2.You 不能依赖 /dev/sda
/dev/sdb
等安装磁盘,因为这些可能取决于
他们在系统中的注册顺序可能会有所不同,特别是ci通过 USB 连接,这可能会导致额外的延迟。
此问题的解决方案是使用 UUID 将磁盘安装在 /etc/fstab
中,例如 .:
UUID=41c22818-fb56-4da6-8196-c816df0b7aa8 /media/yourname/backup ext3 defaults 0 1
阅读fstab手册,注意尾随数字的含义,并检查您是否具有对挂载目录的写入权限。
3.there 是一个非常重要的警告。通过 USB 安装驱动器是有风险的
并且通过 USB 安装备份磁盘非常危险。设备不可靠,你应该
想知道的不是“如果”而是“何时”会失败。当我想插入 USB 驱动器时,我看
数据同步后留在全为零的磁盘上
磁盘控制器的驱动程序已损坏。原来的数据也不见了-与零同步,幸运的是我有这个数据的磁带备份。
为了防止类似类型的故障,花几美元启动一台带有内部磁盘的小型计算机
您将仅通过有线网络转储数据。如果您没有路由器,它甚至可以是普通的交叉电缆。
仅在备份期间打开此服务器,不要将其用于任何其他用途。
当然,这一切都可以自动化,甚至远程开启服务器,只要它有“wake on lan”即可。
只使用一个备份目录并同步它不是一个好主意。如果数据很重要,则需要备份计划及其轮换。
还值得检查备份是否确实正确并且可以恢复。备份成功才成功一半
过去几年,我一直在 运行 Ubuntu 小型英特尔 NUC 服务器上工作。它有两个通过 USB 连接的外部硬盘驱动器:Media
和 MediaBackup
.
外部硬盘驱动器很久以前就被添加到 fstab
以在启动时自动挂载:
echo "/dev/sdb1 /media/Media ext4 user 0 0" | sudo tee -a /etc/fstab
echo "/dev/sdc1 /media/MediaBackup ext4 user 0 0" | sudo tee -a /etc/fstab
在某些时候,我想自动备份我的 Media
目录,所以我将命令传递给 cron
:
echo "00 1 * * * root rsync -av --delete /media/Media/ /media/MediaBackup/" | sudo tee -a /etc/cron.d/backup-media
这个 运行 可靠且一年多没有问题。
一天早上,我发现我无法通过 SSH 连接到 NUC,也无法对其进行 任何操作。使用 live USB 启动 NUC 后,我意识到 rsync
已经完全覆盖了我在 /dev/sda1
的 OS。
为什么 rsync
覆盖了我的 OS,我怎样才能防止它再次这样做?
编辑
正如@thatotherguy 在评论中指出的那样,我原来问题中的脚本在几个方面存在缺陷。它基于我在 GitHub 上保存了一年左右的 setup.sh
脚本。该脚本反映了我当时对如何在全新安装上重新创建服务器状态的最佳猜测,但我从未真正使用过它。
我已经更正了可能导致脚本失败的部分,但留下了两个看起来很严重的错误:
- 正如大家指出的那样,将
rsync
备份执行为root
,并且 - 正如@Slawomir Dziuba 指出的那样,通过它们的 SCSI 磁盘分配(
/dev/sda
、/dev/sdb
)而不是它们的 UUID 在
fstab
中安装硬盘
仔细阅读 fstab
之后,@Slawomir Dziuba 关于使用 UUID 的回复,以及每个人关于不作为 root
执行的回复,可能是对“如何我可以阻止它再次这样做吗?
我会将这个问题保留几天,以防任何评论者想要回答。不确定是否适合留下来。
谢谢大家的帮助。
在cident.
中描述的内容中有几点值得关注1.During 任何工作,避免使用 root 帐户,除非你绝对需要使用它。如果你犯了一个错误 你可以破坏系统中的任何东西。脚本 运行 root 权限也可以在出现错误时对系统进行任何破坏。 如果您不以 root 身份使用 cron,尽管出现磁盘错误,rsync 将没有覆盖权限,什么也不会发生。
您可以使用命令 crontab -e
,在您最喜欢的编辑器中,它允许您设置任何脚本及其 运行 时间。
您还可以更好地控制系统,因为您可以将 cron 脚本保存在一个目录中,例如~/crons
如果你始终如一
对于所有服务,备份系统设置然后仅备份您的主目录就足够了。
重要的区别在于您有不同的系统变量可用于 root 和不同的用户。 Explicit 归因是一种很好的做法 脚本开头需要的任何内容,不要依赖系统变量。在 运行 脚本之后,检查 它是否不仅在您的设置上而且在 cron 中 运行ning 都能正常工作。
同样的问题与使用重定向、回显等编辑系统文件有关。 Bash
充满了各种异常、不寻常的替换等。如果你不确定自己在做什么,你可能会伤害自己很多。
出于这个原因,在发出任何复杂的命令之前,有必要检查它到底做了什么(命令前回显)
以及执行后的结果是否如计划的那样实际。检查上一个命令的输出状态也很有意义 (echo $?
)
使用像sudo vi /etc/fstab
这样的编辑器会好很多
在您更改此文件中的一个字符之前,请像这样使用 RCS 系统 (apt install rcs
):
sudo ci -l /etc/fstab
这样你将备份文件:fstab,v
如果你在每次更改之前这样做,你将始终拥有所有
此文件的先前版本和您更改的所有系统版本,命令很简单,但请阅读 rcs、ci 和 co、especi 的手册,记住 -l 选项
2.You 不能依赖 /dev/sda
/dev/sdb
等安装磁盘,因为这些可能取决于
他们在系统中的注册顺序可能会有所不同,特别是ci通过 USB 连接,这可能会导致额外的延迟。
此问题的解决方案是使用 UUID 将磁盘安装在 /etc/fstab
中,例如 .:
UUID=41c22818-fb56-4da6-8196-c816df0b7aa8 /media/yourname/backup ext3 defaults 0 1
阅读fstab手册,注意尾随数字的含义,并检查您是否具有对挂载目录的写入权限。
3.there 是一个非常重要的警告。通过 USB 安装驱动器是有风险的 并且通过 USB 安装备份磁盘非常危险。设备不可靠,你应该 想知道的不是“如果”而是“何时”会失败。当我想插入 USB 驱动器时,我看 数据同步后留在全为零的磁盘上 磁盘控制器的驱动程序已损坏。原来的数据也不见了-与零同步,幸运的是我有这个数据的磁带备份。
为了防止类似类型的故障,花几美元启动一台带有内部磁盘的小型计算机 您将仅通过有线网络转储数据。如果您没有路由器,它甚至可以是普通的交叉电缆。 仅在备份期间打开此服务器,不要将其用于任何其他用途。 当然,这一切都可以自动化,甚至远程开启服务器,只要它有“wake on lan”即可。
只使用一个备份目录并同步它不是一个好主意。如果数据很重要,则需要备份计划及其轮换。 还值得检查备份是否确实正确并且可以恢复。备份成功才成功一半