【Linux】Rsnapshot快照备份

【Linux】Rsnapshot快照备份

category: 技术分享
date: 2023/05/05
slug: rsnapshot
status: Published
summary: 本文介绍了Rsnapshot快照备份的基础知识,包括备份目录的定义和执行备份的命令参数。其中包括一些选项,如link_dest和sync_first,以及命令参数,如configtest、du、diff和sync。此外,还介绍了备份的原理和如何查看备份数据的磁盘使用情况。
tags: Linux
type: Post

简介

CSDN中很多格式不支持,良好的观看体验请前往
我的博客:https://www.luoxue.site/article/rsnapshot

最近公司提了个要求,内容是要在部署了公司应用的一体机上实现一个快照备份功能。因为一体机这个东西,随搬随用则可能会因为环境不当,或不同人员的操作不当造成一些问题。出现了这种问题,总不能线下在跑一趟,只能远程恢复一下。

所以本文介绍了Linux备份工具Rsnapshot。Rsnapshot是一个基于rsync命令的文件系统快照实用程序,适用于 Linux 和类 Unix 操作系统。

可以在不同的时间点拍摄文件系统的快照。使用硬链接,rsnapshot 创造了多个完整备份的错觉,同时只占用一个完整备份加上差异的空间。 当与 ssh 结合使用时,也可以获取远程文件系统的快照。

rsnapshot 是用 Perl 编写的,并且依赖于 rsync。还推荐使用 OpenSSH、GNU cp、GNU du 和 BSD 记录器程序,但不是必需的。所有这些都应该存在于大多数 Linux 系统上。

rsync是什么?
rsync是一种强大的文件同步工具,它可以在本地或远程之间同步文件和目录,并且可以对同步行为进行监视和控制。它使用类似于rsync协议(通过SSH)的机制来最大化传输性能和减少带宽占用。rsync可以实现增量式备份,即只传输文件中已更改的部分,从而显著降低同步所需的时间和网络资源。

安装

rsnapshot/INSTALL.md at master · rsnapshot/rsnapshot

环境需求

它完全用perl编写,没有模块依赖关系,并且已经 使用版本 5.004 至 5.24.3 进行测试。它应该适用于任何合理的 现代 UNIX 兼容操作系统。

  • 它已在以下操作系统上成功测试 :
    • Debian: 3.0 (woody), 9.9 (stretch)
    • Redhat: 7.x, 8.0
    • RedHat Enterprise Linux: 3.0 ES, 5, 6, 7
    • Fedora Core: 1, 3
    • Fedora: 17, 18
    • CentOS: 3, 4, 5, 6, 7
    • WhiteBox Enterprise Linux 3.0
    • Slackware 9.0
    • SuSE: 9.0
    • Gentoo Linux
    • FreeBSD 4.9-STABLE
    • OpenBSD 3.x
    • Solaris 8 (SPARC and x86)
    • Mac OS X
    • IRIX 6.5

至少需要:perlrsync

可选:sshloggerGNU cpGNU du

扫描二维码关注公众号,回复: 15580727 查看本文章

源码安装

下载地址:https://github.com/rsnapshot/rsnapshot/releases

  1. 解压源码包并切换至源目录。

    tar -xzvf rsnapshot-1.4.5.tar.gz
    cd rsnapshot-1.4.5
    

    本文安装最新版本。

  2. 运行配置脚本。

    默认情况下,安装过程将安装/usr/local下的所有文件。我们可以指定将配置文件安装在/etc下。

    我们假设rsyncsshloggerdu 都在您的环境变量中,如果不是这种情况则可以添加以下配置脚本参数。

    ./configure --with-perl=/usr/bin/perl --with-rsync=/usr/bin/rsync
    

    使用经典的--with-program=/path/to/program语法指定任何这些程序的路径。

    当然如果您并没有上方的顾虑,则可以直接运行配置脚本。找出 rsnapshot 依赖的各种外部程序的位置。它还会生成我们将用于安装程序的 Makefile。配置脚本接受可用于告诉它在哪里安装程序以及在哪里可以找到支持程序的参数。对于此安装,我们唯一需要的非默认选项是将配置文件放在/etc 目录中。

    ./configure --sysconfdir=/etc
    
  3. 安装程序。

    如果您做了之前的操作,那么您即将安装rsnapshot到了/usr/local下,配置文件则位于/etc下。接下来我们将进行安装操作。

    此操作可能需要root权限。

    make install
    
    文件路径 描述
    /usr/local/bin/rsnapshot rsnapshot程序
    /usr/local/man/man1/rsnapshot.1 手册页
    /etc/rsnapshot.conf.default 示例配置文件

    *如果您稍后决定不再需要系统上的 rsnapshot,只需删除上面列出的文件,或者 在您安装的同一源目录中运行**make uninstall 。*当然,如果您使用不同的选项安装,这些文件的位置可能会有所不同。

rpm或deb安装

  • 在RHEL/CentOS 8/7/6/5/4 中安装

    rpm -ivh rsnapshot_1.4.5-1_all.rpm
    
  • 在 Debian/Ubuntu/Linux Mint 上

    dpkg -i rsnapshot_1.4.5-1_all.deb
    

包管理器安装

  • 在RHEL/CentOS 8/7/6/5/4 中安装

    yum install rsnapshot
    
  • 在 Debian/Ubuntu/Linux Mint 上

    apt update
    apt install rsnapshot
    

创建配置文件

安装 rsnapshot 后,您需要对其进行配置。 默认配置文件是 /etc/rsnapshot.conf,尽管确切的路径 可能因程序的安装方式而异。如果这个 文件不存在。可能在安装过程中,没有创建或安装配置文件。但是,提供了一个您可以复制的工作示例。要将示例配置文件复制到 rsnapshot 将查找真实配置文件的位置:

cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

此外,如果您执行升级,rsnapshot.conf.default文件将始终升级到最新版本,而您的真实配置文件将安全无虞。请注意,如果您在升级期间运行 make upgrade,您的 rsnapshot.conf 可能会被稍微修改,然后原始文件将保存在同一目录下的rsnapshot.conf.backup中。

实例

接下来我们将操作两台服务器,分别是:

  • 备份服务器:安装rsnapshot,保存备份的内容。
  • 客户端:被备份的服务器。

设置SSH无密码登录

要备份远程 Linux 服务器,备份服务器必须能够通过SSH免密连接。为此,你需要创建一个SSH公钥和私钥进行身份验证rsnapshot服务器。

使用ssh-keygen命令生成密钥对。

ssh-keygen
# output
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:RVjq/4AJclHttGjr3JvQtK8krOMST3uBE1EnoNRnnUM root@zhangyu
The key's randomart image is:
+---[RSA 3072]----+
|    ...o+*E.     |
|   . .o.+=*      |
|    . .+.+.o     |
|      .oo.o      |
|    . o+S..      |
|    .o+oo* .     |
|     + =*o*      |
|    . +.++.=     |
|     ooo  +oo    |
+----[SHA256]-----+

接下来将公钥复制到客户端系统内。

ssh-copy-id -i [email protected]
# output
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.168.54 (192.168.168.54)' can't be established.
ECDSA key fingerprint is SHA256:bi+xYDrDy/dFmry/UYbjt4u0C6xGx5nH5UZe20Kp4fU.
Are you sure you want to continue connecting (yes/no/[fingerprint])?' yes
# 上方输入yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

Authorized users only. All activities may be monitored and reported.

[email protected]'s password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '[email protected]'"
and check to make sure that only the key(s) you wanted were added.

⚠️ 错误:Permission denied, please try again.

发生此错误需要在客户端/etc/ssh/sshd_config文件中修改34行的 ”#PermitRootLogin prohibit-password”取消注释并修改为“PermitRootLogin yes” 之后重启 服务即可。
注:不同版本或不同系统之间的配置文件位置名称均有不同的可能性。

注意注意如果做了以上操作以后还是不成功,抛出以下错误。
Invalid user Administrator from 192.168.168.51 port 57883

May 05 06:55:33 zhangyu sshd[96375]: Invalid user Administrator from 192.168.168.51 port 57883
May 05 06:55:33 zhangyu sshd[96375]: Connection closed by invalid user Administrator 192.168.168.51 port 57883 [preauth]

不要犹豫,请升级openssh-server。

apt upgrade openssh-server

配置Rsnapshot备份服务器

在此示例中,我们将使用/rsnapshot/目录来保存文件系统快照。这称为 快照根。随意将它放在任何有大量可用磁盘空间的地方。

假设您要更改此参数,如果您要将它放在其他地方,则必须在配置文件中的snapshot_root参数后替换默认路径。

另请注意,字段由制表符分隔,而不是空格。这样做的原因是更容易指定其中包含空格的文件路径。

此外还需注意,您应该在文件 中的目录名称末尾指定一个斜杠。/etc/rsnapshot.conf例如,您必须将目录名称指定为/rsnapbackup/,而不是/rsnapbackup

定义快照根与命令位置

 23 snapshot_root   /rsnapshot/
 24
 25 # If no_create_root is enabled, rsnapshot will not automatically create the
 26 # snapshot_root directory. This is particularly useful if you are backing
 27 # up to removable media, such as a FireWire or USB drive.
 28 #
 29 #no_create_root 1
 30
 31 #################################
 32 # EXTERNAL PROGRAM DEPENDENCIES #
 33 #################################
 34
 35 # LINUX USERS:   Be sure to uncomment "cmd_cp". This gives you extra features.
 36 # EVERYONE ELSE: Leave "cmd_cp" commented out for compatibility.
 37 #
 38 # See the README file or the man page for more details.
 39 #
 40 cmd_cp          /usr/bin/cp
 41
 42 # uncomment this to use the rm program instead of the built-in perl routine.
 43 #
 44 cmd_rm          /usr/bin/rm
 45
 46 # rsync must be enabled for anything to work. This is the only command that
 47 # must be enabled.
 48 #
 49 cmd_rsync       /usr/bin/rsync
 50
 51 # Uncomment this to enable remote ssh backups over rsync.
 52 #
 53 cmd_ssh /usr/bin/ssh
 54
 55 # Comment this out to disable syslog support.
 56 #
 57 cmd_logger      /usr/bin/logger
 58
 59 # Uncomment this to specify the path to "du" for disk usage checks.
 60 # If you have an older version of "du", you may also want to check the
 61 # "du_args" parameter below.
 62 #
 63 cmd_du          /usr/bin/du
 64
 65 # Uncomment this to specify the path to rsnapshot-diff.
 66 #
 67 cmd_rsnapshot_diff      /usr/local/bin/rsnapshot-diff
  • cmd_cp

    cmd_cp 参数是 GNU cp 程序在文件系统上的路径。在 Linux 上,取消注释这个参数是通过删除它前面的井号 (#) 实现的。在 BSD、Solaris、IRIX 或大多数其他 UNIX 变体上,应该将其注释掉。

    GNU cp 与传统的 UNIX cp 不同,它能够将目录递归复制为硬链接。如果您没有 GNU cp,则 rsnapshot 中有一个子例在某种程度上近似于此功能。接下来是对 rsync 的另一个调用,它传输剩余的特殊文件(如果有的话)。这样,rsnapshot 就可以支持每个平台上的所有文件类型。

    经验法则是,在 Linux 系统上启用cmd_cp ,在非 Linux 系统上禁用cmd_cp

  • cmd_rsync

    cmd_rsync参数不能被注释掉,它必须指向rsync的工作版本。如果没有,该程序将根本无法运行。

    请注意,如果您使用的是 IRIX,则还有另一个名为rsync的程序与大多数人所知道的真正的 rsync 不同 。如果您使用的是 IRIX 机器,您应该仔细检查一下。

  • cmd_ssh

    如果您的系统上安装了ssh,您需要取消对cmd_ssh参数的注释。通过启用ssh,您可以获取任意数量的远程系统的快照。

    如果您没有ssh,或者只计划对本地文件系统的拍摄快照,您可以安全地将其注释掉。

  • cmd_logger

    cmd_logger参数指定记录器程序的路径。loggersyslog 的命令行界面。

    logger应该是大多数类 UNIX 系统的标准部分。它似乎自 1993 年以来一直保持不变,这有利于跨平台稳定性。

    如果您注释掉此参数,它将禁用 rsnapshot 中的 syslog 支持。建议您启用此功能。

  • cmd_du

    cmd_du参数指定du程序的路径。 du是一个报告磁盘使用情况的命令行工具。

    rsnapshot 使用du来生成有关实际占用的磁盘空间量的报告,否则由于所有硬链接而难以估计。

    如果您将其注释掉,rsnapshot 将尽可能使用它在您的路径中找到的du版本。推荐使用duGNU 版本,因为它有最好的功能选择,并且支持最多的选项。

    BSD 版本似乎也可以工作,尽管它不支持-h标志。Solaris du根本不起作用,因为它不支持 -c参数。

  • cmd_rm

    cmd_rm 是 rsnapshot 配置文件中的一个参数,用于指定在 删除备份文件 (如通过 rsnapshot delete 命令) 时使用的文件删除工具。这些工具通常包括 rmgtrshtrash-put(类似于回收站功能),等等。您可以在配置文件中指定要使用的删除工具。

  • cmd_rsnapshot-diff

    rsnapshot 是一个基于 rsync 和硬链接技术的增量备份工具,它可以帮助用户定期备份数据,并保留多个版本的备份文件。其中每个版本的备份文件都是通过在前一次备份的基础上生成的差异文件而得到的。

    cmd_rsnapshot_diff 参数就是用于指定在生成差异文件时使用的程序或命令。通常情况下,该参数的默认值为 diff 命令,该命令是一个 GNU 工具,用于比较两个文本文件的差异。当 rsnapshot 运行时,它会调用 cmd_rsnapshot_diff 参数指定的程序来计算每个版本之间的差异,并生成相应的差异文件。

定义备份周期与全局配置

87 #########################################
88 #     BACKUP LEVELS / INTERVALS         #
89 # Must be unique and in ascending order #
90 # e.g. alpha, beta, gamma, etc.         #
91 #########################################
92
93 retain  alpha   6
94 retain  beta    7
95 retain  gamma   4
96 #retain delta   3
97
98 ############################################
99 #              GLOBAL OPTIONS              #
100 # All are optional, with sensible defaults #
101 ############################################
102
103 # Verbose level, 1 through 5.
104 # 1     Quiet           Print fatal errors only
105 # 2     Default         Print errors and warnings only
106 # 3     Verbose         Show equivalent shell commands being executed
107 # 4     Extra Verbose   Show extra verbose information
108 # 5     Debug mode      Everything
109 #
110 verbose         2
111
112 # Same as "verbose" above, but controls the amount of data sent to the
113 # logfile, if one is being used. The default is 3.
114 #
115 loglevel        3
120 logfile /var/log/rsnapshot
127 lockfile        /var/run/rsnapshot.pid
133 #stop_on_stale_lockfile         0
137 #rsync_short_args       -a
138 #rsync_long_args        --delete --numeric-ids --relative --delete-excluded
142 ssh_args        -p 22
148 du_args -csh
177 link_dest      1
178
186 #sync_first     0
187
192 #use_lazy_deletes       0
193
194 # Number of rsync re-tries. If you experience any network problems or
195 # network card issues that tend to cause ssh to fail with errors like
196 # "Corrupted MAC on input", for example, set this to a non-zero value
197 # to have the rsync operation re-tried.
198 #
199 #rsync_numtries 0
  • retain alpha 6 意味着每次运行rsnapshot alpha时,都会创建一个新快照,新快照中记录第一完整备份当时的数据副本。并在 Rsnapshot 根目录中名为alpha.0, alpha.1,…的目录中保留最近的六个备份,alpha.5然后下次运行该命令时,该alpha.5目录将被删除重新创建。

    “interval” 是一个已弃用的同义词。

  • GLOBAL OPTIONS

    全局选项中,请注意观察行号与内容。此处以为长度原因并有没完全显示,只将配置项进行了展示。

    • verbose :设置输出时的内容详细的级别。

    • loglevel :设置日志的级别。

    • logfile :日志文件位置。

    • lockfile :锁文件位置。

    • stop_on_stale_lockfile:默认情况下,rsnapshot会检查锁文件,检查PID是否在运行,并且如果没有运行,则将锁文件视为陈旧文件,然后启动。如果启用此选项,则当锁文件中的PID未运行时,rsnapshot会停止运行。

    • rsync_short_args:向rsync发送的短参数。

    • rsync_long_args:向rsync发送的长参数。

    • ssh_args:向ssh发送的参数,这里是指定端口号。

    • du_args:向du发送的参数。

    • link_destlink_dest 参数指定了一个已存在的备份目录,在进行本次备份时,rsnapshot 会将需要新创建的备份文件与该目录下已经存在的备份文件做比较。如果某个备份文件已经存在并且完全相同,则使用硬链接的方式复制该备份文件,而不是生成一个新的副本。

      为什么我开启link_dest参数,还是使用了硬链接呢?
      rsnapshot 的配置文件中,默认情况下 link_dest 参数是被设置为空值的,但并不代表它完全没有启用,而是采用了一种称为"implicit defaulting"的隐式默认策略。
      当 rsnapshot 配置文件中未设置 link_dest 参数时,rsnapshot 会默认使用前一天的备份目录作为硬链接目录。如果前一天不存在备份目录,则使用最近一个存在的备份目录。

    • sync_first:启用了sync_first选项之后,rsnapshot会在同步文件之前先同步最新版本的文件,这样可以保证备份数据的准确性。也就是说,如果您的源目录中有多个版本的同名文件,那么rsnapshot只会备份其中的最新版本,而不会创建新的数据副本(如beta1、beta2)。这样做的好处是可以减少备份数据的大小,节省备份存储空间。同时也能提高备份效率,因为不需要备份过时的数据。

      以下是开启后备份的效果:

      rsnapshot alpha
      
      ll -a /rsnapshot_back/
      total 16
      drwxr-xr-x  3 zhangyu zhangyu 4096 May  5 08:46 ./
      drwxr-xr-x 21 root    root    4096 May  4 06:40 ../
      drwxr-xr-x  3 root    root    4096 May  5 08:27 alpha.1/
      -rw-rw-r--  1 zhangyu zhangyu  130 May  4 09:17 back.exclude
      
      rsnapshot alpha
      
      ll -a /rsnapshot_back/
      total 16
      drwxr-xr-x  3 zhangyu zhangyu 4096 May  5 08:46 ./
      drwxr-xr-x 21 root    root    4096 May  4 06:40 ../
      drwxr-xr-x  3 root    root    4096 May  5 08:27 alpha.2/
      -rw-rw-r--  1 zhangyu zhangyu  130 May  4 09:17 back.exclude
      

      也就是不会保留最多5个目录,而是在迭代进行备份。

    • use_lazy_deletesuse_lazy_deletes 是 rsnapshot 中的一个选项,它的作用是指定是否在做备份时启用 lazy delete 模式。在这种模式下,删除操作并不会立即从磁盘上删除文件,而是将其标记为待删除,在下一次备份时再进行实际删除。这样可以减少备份所需要的时间和磁盘占用。

    • rsync_numtries :rsync失败重试次数。

定义备份目录

我配置了备份本地目录/home/etc/usr/local下的内容到快照根下的localhost文件夹中(将自动创建),配置备份远程主机client(请指定hosts文件)的/home目录到快照根下的client(在备份服务器的快照根下)目录中。

注意

我没有/rsnapbackup/localclient/的上述配置中指定完整路径(即 ),因为,我们之前已经提到了 Root 备份目录,所以我们这里不需要指定Rsnapshot根目录。

221 ###############################
222 ### BACKUP POINTS / SCRIPTS ###
223 ###############################
224
225 # LOCALHOST
226 backup  /home/          localhost/
227 backup  /etc/           localhost/
228 backup  /usr/local/     localhost/
237 # EXAMPLE.COM
239 backup root@client:/home/     client/

请注意,此处指定的目标路径是基于假设通过rsync_long_args参数将--relative(表示创建相对路径的链接)标志传递给rsync

执行备份

下面将列出以下rsnapshot命令参数,用于备份。

  • rsnapshot configtest

    检测配置文件是否正确。

    rsnapshot configtest
    Syntax OK
    
  • rsnapshot -t alpha
    检测备份是否可以成功执行,也就是将要执行的命令打印到终端。

    rsnapshot -t alpha
    
    echo 1776175 > /var/run/rsnapshot.pid
    mkdir -m 0700 -p /rsnapshot/
    mkdir -m 0755 -p /rsnapshot/alpha.0/
    /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
        /home/ /rsnapshot/alpha.0/localhost/
    mkdir -m 0755 -p /rsnapshot/alpha.0/
    /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
        --rsh=/usr/bin/ssh -p 22 [email protected]:/home/ \
        /rsnapshot/alpha.0/client/
    touch /rsnapshot/alpha.0/
    

    ❓ 这里引出了备份的原理,我们可以找一个备份了多次的,来看看它要执行什么命令。

    echo 161392 > /var/run/rsnapshot.pid
    mv /rsnapshot_back/alpha.3/ /rsnapshot_back/alpha.4/
    mv /rsnapshot_back/alpha.2/ /rsnapshot_back/alpha.3/
    mv /rsnapshot_back/alpha.1/ /rsnapshot_back/alpha.2/
    mv /rsnapshot_back/alpha.0/ /rsnapshot_back/alpha.1/
    /usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
       --link-dest=/rsnapshot_back/alpha.1/localhost/ /home/ \
       /rsnapshot_back/alpha.0/localhost/
    

    这个过程是将每一个目录的名称向后重命名,也就是alpha.0永远是最新的备份,而数字越大则存在时间越长。并且在备份过程中,alpha.0alpha.1的相同文件使用硬链接进行同步。
    所以,如果你需要获取最新版本的数据,可以查看 alpha.0 的内容。但是,请注意,如果你需要比较或者恢复先前备份的数据,则应该使用 alpha.1 中的文件,因为 alpha.1 中保存了历史备份的所有版本。

  • rsnapshot du

    显示快照根目录中的磁盘使用情况。可以接受一个可选的目标路径用于在快照之间进行比较(例如,localhost/home/user/foo)。

    rsnapshot du
    7.0G    /rsnapshot/alpha.0/
    7.0G    total
    
    du -hc --max-depth=2 /rsnapshot/alpha.*
    6.9G    /rsnapshot/alpha.0/client/home
    6.9G    /rsnapshot/alpha.0/client
    67M     /rsnapshot/alpha.0/localhost/home
    67M     /rsnapshot/alpha.0/localhost
    7.0G    /rsnapshot/alpha.0
    
  • rsnapshot diff

    这是一个rsnapshot-diff程序的前端界面。它可以接受两个可选参数,这些参数可以是文件系统路径或快照根目录中的备份目录。默认情况下,比较最近的两个快照。

    rsnapshot diff alpha.0 alpha.3
    
    Comparing /rsnapshot/alpha.3 to /rsnapshot/alpha.0
    Between /rsnapshot/alpha.3 and /rsnapshot/alpha.0:
      112 were added, taking 7393165017 bytes
      0 were removed, saving 0 bytes
    
  • rsnapshot sync

    同步文件,不进行旋转。需要启用“sync_first”才能正常工作。如果可选参数中提供完整备份点目的地,则仅同步那些文件。

    在执行命令时必须指定一个目录,为同步目录。

总结

本文介绍了Rsnapshot快照备份的基础知识,包括备份目录的定义和执行备份的命令参数。其中包括一些选项,如link_destsync_first,以及命令参数,如configtestdudiffsync。此外,还介绍了备份的原理和如何查看备份数据的磁盘使用情况。

参考文档

Linux运维工程师必知的服务器备份工具:Rsnapshot_十一技术斩的博客-CSDN博客

linux的本地远程文件系统备份实用程序rsnapshot-腾讯云开发者社区-腾讯云

https://github.com/rsnapshot/rsnapshot

rsnapshot | rsnapshot

猜你喜欢

转载自blog.csdn.net/weixin_43645454/article/details/130522769