Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 为什么Rsync覆盖了我的操作系统?_Linux_Backup_Rsync - Fatal编程技术网

Linux 为什么Rsync覆盖了我的操作系统?

Linux 为什么Rsync覆盖了我的操作系统?,linux,backup,rsync,Linux,Backup,Rsync,过去几年,我一直在一个小小的英特尔NUC上运行Ubuntu服务器。它有两个通过USB连接的外部硬盘驱动器:媒体和媒体备份 外部硬盘驱动器很久以前就被添加到fstab以在引导时自动装载: echo”/dev/sdb1/media/media ext4用户0 0“| sudo tee-a/etc/fstab echo“/dev/sdc1/media/MediaBackup ext4 user 0 0”| sudo tee-a/etc/fstab 在某个时候,我想自动化我的媒体目录的夜间备份,因此我

过去几年,我一直在一个小小的英特尔NUC上运行Ubuntu服务器。它有两个通过USB连接的外部硬盘驱动器:
媒体
媒体备份

外部硬盘驱动器很久以前就被添加到
fstab
以在引导时自动装载:

echo”/dev/sdb1/media/media ext4用户0 0“| sudo tee-a/etc/fstab
echo“/dev/sdc1/media/MediaBackup ext4 user 0 0”| sudo tee-a/etc/fstab
在某个时候,我想自动化我的
媒体
目录的夜间备份,因此我将一个命令传递给
cron

echo“00 1***根rsync-av--delete/media/media//media/MediaBackup/”| sudo tee-a/etc/cron.d/backup-media
该系统运行可靠,一年多没有问题

一天早上,我发现我无法SSH进入NUC,或者用它做任何事情。使用实时USB启动NUC后,我意识到
rsync
已经完全覆盖了我位于
/dev/sda1
的操作系统

为什么
rsync
会覆盖我的操作系统,如何防止它再次覆盖

编辑

正如@thatotherguy在评论中指出的,我最初的问题中的脚本在几个方面都有错误。它基于我在GitHub上保存了一年左右的
setup.sh
脚本。该脚本反映了我当时对如何在新安装上重新创建服务器状态的最佳猜测,但我从未实际使用过它

我已经纠正了可能导致脚本失败的部分,但留下了两个关键错误:

  • 正如大家所指出的,以
    root
    身份执行
    rsync
    备份,以及
  • 正如@Slawomir Dziuba所指出的,通过SCSI磁盘分配(
    /dev/sda
    /dev/sdb
    )而不是UUID,在
    fstab
    中安装硬盘驱动器
  • 在仔细阅读了
    fstab
    之后,似乎@Slawomir Dziuba关于使用uuid的回应,以及每个人关于不以
    root执行的回应,都是对“如何防止它再次这样做”的很好回答

    我将把这个问题保留几天,以防任何评论者想回答它。不确定这是否是一个留下来的好人选


    谢谢大家的帮助。

    在所描述的事件中,有几件事值得注意

    1.在任何工作中,避免使用root帐户,除非您确实需要使用它。如果你犯了错误 你可以摧毁系统中的任何东西。以root权限运行的脚本也可以在发生错误时对系统进行任何破坏。 如果您不使用cron作为根用户,尽管存在磁盘错误,rsync将没有覆盖权限,不会发生任何事情

    您可以使用命令
    crontab-e
    ,在您喜爱的编辑器中,该命令将允许您设置任何脚本及其运行时间。 您还可以更好地控制系统,因为您可以将cron脚本保存在一个目录中,例如,
    ~/crons
    ,如果您保持一致的话 对于所有服务,备份系统设置,然后只备份您的主目录就足够了

    重要的区别在于,root用户可以使用不同的系统变量,而user用户可以使用不同的系统变量。明确归因是一种良好的做法 在脚本开始时需要的任何东西,都不要依赖于系统变量。运行脚本后,检查 它是否不仅在您的设置上,而且在从cron运行时都能完美地工作

    同样的问题与使用重定向、回显等编辑系统文件有关。猛击 充满了各种各样的例外,不寻常的替代,等等。如果你不能完全确定你在做什么,你会伤害自己很多。 因此,在发出任何复杂命令之前,有必要检查它的实际功能(在发出命令之前进行回显) 执行后,结果是否符合计划。检查上一个命令的输出状态也是有意义的(
    echo$?

    最好使用像
    sudo vi/etc/fstab这样的编辑器
    在更改此文件中的一个字符之前,请使用RCS系统(
    apt install RCS
    ),如下所示:

    sudo ci -l /etc/fstab
    
    这样,您将备份文件:
    fstab,v
    如果在每次更改之前执行此操作,您将始终拥有所有 此文件的早期版本以及您更改的所有系统版本,命令都很简单,但请阅读rcs、ci和co的手册,尤其要记住-l选项

    2.您不能依赖于使用
    /dev/sda
    /dev/sdb
    等安装磁盘,因为这些可能取决于 它们在系统中的注册顺序可能会有所不同,尤其是对于通过USB的连接,这可能会引入额外的延迟。 此问题的解决方案是使用UUID在
    /etc/fstab
    中装入磁盘,例如:

    UUID=41c22818-fb56-4da6-8196-c816df0b7aa8 /media/yourname/backup ext3 defaults 0 1
    
    阅读fstab手册,注意尾随数字的含义,并检查您是否具有对装载目录的写访问权限

    3.还有一个非常重要的注意事项。通过USB安装驱动器是有风险的 通过USB安装备份磁盘是非常危险的。设备不可靠,你应该 不要怀疑“是否”会失败,而是“何时”会失败。当我想插入USB驱动器时,我会看 在数据同步后保留在充满全零的磁盘上 磁盘控制器的驱动程序已损坏。原始数据也消失了-与零同步,幸运的是我有一个磁带备份了这些数据

    为了防止类似类型的故障,启动一台小型计算机,只需花费几美元,并配备一个内部磁盘 您只能通过有线网络转储数据。如果你没有路由器,它甚至可以是一条普通的交叉电缆。 仅在备份期间打开此服务器,不要将其用于任何其他用途。 当然,所有这些都可以自动化,甚至可以远程打开服务器,只要它有“唤醒o”