阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

rsync实现数据备份详解

550次阅读
没有评论

共计 34085 个字符,预计需要花费 86 分钟才能阅读完成。

RSYNC 是 Remote Sync 远程同步的简称,与 SCP 的比较,SCP= 无法备份大量数据,类似 windows 的复制,而 rsync= 边复制,边统计,边比较,可以备份大量数据。可以镜像保存整个目录树和文件系统。可以很容易做到保持原来文件的权限、时间、软硬链接等等。无须特殊权限即可安装。快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。安全:可以使用 scp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接。支持匿名传输,以方便进行网站镜象。选择性保持:符号连接,硬链接,文件属性,权限,时间等。考虑到 scp 也是像类似的远程备份工具,为了便于比较,本文从以下几个方面来讲述如何用 rsync 进程远程备份。

  • 一、scp 远程拷贝文件

  • 二、acl 权限控制

  • 三、rsync 数据备份

  • 四、Rsync+Inotify 实时同步

 说明:客户端(或称本地服务器):xiaolyu77  192.168.31.77 

服务器(或称远程服务器):xiaolyu76 192.168.31.76

一、scp 远程拷贝文件

scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件的命令,和它类似的命令有 cp,不过 cp 只是在本机进行拷贝不能跨服务器,而且 scp 传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system 时,用 scp 可以帮你把文件移出来。另外,scp 还非常不占资源,不会提高多少系统负荷,在这一点上,rsync 就远远不及它了。虽然 rsync 比 scp 会快一点,但当小文件众多的情况下,rsync 会导致硬盘 I / O 非常高,而 scp 基本不影响系统正常使用。

1. scp 的用法:

可以 man scp 看一下:

 rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

 

scp 的参数还是蛮多的,这里之所以不厌其烦的截图列出来,是想表达一种观点,任何新东西的学习其实都是有章可循的,那就是借助所给出的已知信息,比如 man 一个命令,比如查看 readme 文件。这里简单翻译如下:

命令格式:scp [参数] [原路径] [目标路径]

命令参数:

-1  强制 scp 命令使用协议 ssh1  

-2  强制 scp 命令使用协议 ssh2

-4  强制 scp 命令只使用 IPv4 寻址

-6  强制 scp 命令只使用 IPv6 寻址

-B  使用批处理模式(传输过程中不询问传输口令或短语)

-C  允许压缩。(将 - C 标志传递给 ssh,从而打开压缩功能)

-p 保留原文件的修改时间,访问时间和访问权限。

-q  不显示传输进度条。

-r  递归复制整个目录。

-v 详细方式显示输出。scp 和 ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

-c cipher  以 cipher 将数据传输进行加密,这个选项将直接传递给 ssh。

-F ssh_config  指定一个替代的 ssh 配置文件,此参数直接传递给 ssh。

-i identity_file  从指定文件中读取传输时使用的密钥文件,此参数直接传递给 ssh。

-l limit  限定用户所能使用的带宽,以 Kbit/ s 为单位。

-o ssh_option  如果习惯于使用 ssh_config(5)中的参数传递方式,

-P port  注意是大写的 P, port 是指定数据传输用到的端口号  

-S program  指定加密传输时所使用的程序。此程序必须能够理解 ssh(1)的选项。

2. 用法及实例:

1. 从本地服务器复制到远程服务器:

(1)复制文件:

  scp local_file remote_username@remote_ip:remote_folder   # 指定了 ssh 远程服务的用户名,scp 复制时,需要输入密码。

  scp local_file remote_username@remote_ip:remote_file       # 指定了 ssh 远程服务的用户名,scp 复制时,需要输入密码。

     说明:我看有人提出了,在这个地方可以不用写 ssh 远程登录的用户名(即 scp local_file  remote_ip:remote_file),在命令执行时,会提示输入用户名和密码,本人亲身多次,不可以的,故该方法没有列出来。一般 ssh 登录默认是 root 用户,不写就代表是 root 用户。

(2)复制目录:

  scp -r local_folder remote_username@remote_ip:remote_folder  #指定了 ssh 远程服务的用户名,命令执行后需要输入用户密码;

 

2. 从远程服务器复制到本地服务器:

 

从远程复制到本地的 scp 命令与上面的命令雷同,只要将从本地复制到远程的命令后面 2 个参数互换顺序就行了。

 

说明一下:因为我前面已经对 root 用户做了免秘钥登录了,所以就不用 root 用户做实验了,用普通用户。

实战 1:上传本地文件到远程服务器指定目录下,如果用的是相对路径,默认在登录 ssh 服务器用户的根目录下。

rsync 实现数据备份详解

#ssh 本地客户端:

[root@xiaolyu77 ~]# cp /etc/passwd ./
[root@xiaolyu77 ~]# ls -ltr
total 48
-rw-r–r–. 1 root root 5890 Sep 16 08:58 install.log.syslog
-rw-r–r–. 1 root root 26271 Sep 16 09:00 install.log
-rw——-. 1 root root 1243 Sep 16 09:00 anaconda-ks.cfg
-rw-r–r– 1 root root 1058 Sep 20 02:42 passwd
[root@xiaolyu77 ~]# scp passwd xiao@xiaolyu76:pass
xiao@xiaolyu76’s password:
passwd 100% 1058 1.0KB/s 00:00

#ssh 远端服务器:

[root@xiaolyu76 ~]# cd /home/xiao   # 客户端登录 ssh 用的是该用户,相对目录,默认就是在此目录下。
[root@xiaolyu76 xiao]# mkdir pass
[root@xiaolyu76 xiao]# ls -l pass
total 0
[root@xiaolyu76 xiao]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Sep 20 02:54 pass
[root@xiaolyu76 xiao]# chmod 777 pass   # 这个地方一定要注意,因为用的不是 root 用户,所以要给 scp 命令中 ssh 服务器端文件夹以 777 的权限。
[root@xiaolyu76 xiao]# ls -l
total 4
drwxrwxrwx 2 root root 4096 Sep 20 02:55 pass
[root@xiaolyu76 xiao]# ls -l pass
total 4
-rw-r–r– 1 xiao xiao 1058 Sep 20 02:55 passwd
[root@xiaolyu76 xiao]#

rsync 实现数据备份详解

 rsync 实现数据备份详解

rsync 实现数据备份详解

注意:在客户端 执行 scp local_file remote_username@remote_ip:remote_folder 用的是普通用户登录 ssh 服务器,而不是 root 用户,

而我在服务器端创建的 remote_folder 文件夹(目录)用的是 root 用户,所以要给 scp 命令中 ssh 服务器端文件夹 remote_folder 以 777 权限。

否则在客户端执行 scp 命令时会报如下错误:

rsync 实现数据备份详解

这是因为:对于文件夹(目录)来说 777 权限代表了:

r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。

w(Write, 写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。

x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

实战 2:上传本地文件到远程服务器,不指定远程服务器的存放目录。默认在登录 ssh 服务器用户的根目录下。

rsync 实现数据备份详解

#ssh 本地客户机:

[root@xiaolyu77 ~]# scp passwd xiao@xiaolyu76:testscp
xiao@xiaolyu76’s password: 
passwd 100% 1058 1.0KB/s 00:00 
[root@xiaolyu77 ~]#

#ssh 远端服务器:

[root@xiaolyu76 xiao]# ls -l
total 8
drwxrwxrwx 2 root root 4096 Sep 20 02:55 pass
-rw-r–r– 1 xiao xiao 1058 Sep 20 03:19 testscp  # 注意和客户机比较文件大小。
[root@xiaolyu76 xiao]#

rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

实战 3. 从远程服务器下载文件夹到本地

[root@xiaolyu77 ~]# scp -r  xiao@xiaolyu76:/home/xiao/pass ./

rsync 实现数据备份详解

总结:scp 命令就是利用 ssh 登录,来远程复制文件。可以从本地到远程,也可以从远程到本地。当同一 ip 三次登录失败后,fail2ban 一样会禁止该 ip 登录。就是说每执行一次 scp 命令,实际上就发起了一次 ssh 登录。

 二、acl 权限控制

  这里为什么会谈到 acl 权限控制呢?因为后面我做那个 rsync 数据备份时,需要针对单个用户对单个目录设置权限,这就需要用到 acl 权限控制。

什么是 ACL 权限控制呢?ACL 是 Access Control List 的缩写,主要目的是针对在传统的三种身份和三种权限之外,提供更加细化的局部权限设定。官方手册来讲,它主要针对用户、用户组、以及掩码方面控制权限。
      简单去理解就是,ACL 可以针对单个用户、单个用户组来进行权限细化的控制。主要目的是提供传统的 owner,group,other 的 read,wirte,execute 权限之外的具体权限设置,可以针对单一用户或组来设置特定的权限。而在 windows 系统上,没有这个 ACL,ACL 是类 Unix(Unix-like)操作系统权限的额外支持项目,因此要使用 ACL 必须要有文件系统的支持才行。主要包括 ReiserFS, EXT2/EXT3/ext4, JFS, XFS 等文件系统。

 

1. 判断当前文件系统是否支持 acl。

当然了,我们可以先 man acl 看一下,是否有相关的信息:

man acl 

rsync 实现数据备份详解

也可以通过文件系统来判断:

 df -T -h

rsync 实现数据备份详解

最好用如下两个命令来判断当前文件系统是否支持

dumpe2fs -h /dev/sda1 |grep acl
或者
tune2fs -l /dev/sda1 | grep options

rsync 实现数据备份详解

 

2. ACL 相关命令详解:

ACL 操作的命令主要有三个:getfacl、setfacl 和 chacl,但是常用的就 getfacl 和 setfacl。

(1) 查看 ACL 权限

语法:getfacl filename

(2) 设置 ACL 权限

语法:setfacl [-bkRd] [-m|-x acl 参数]  目标文件名
选项介绍:
-m: 设置后续的 acl 参数,不可与 -x 一起使用
-x: 删除后续的 acl 参数,不可与 -m 一起使用
-b: 删除所有的 acl 参数
-k: 删除默认的 acl 参数
-R: 递归设置 acl 参数
-d: 设置默认 acl 参数,只对目录有效

先来看看在 ACL 里面每一个名词的定义,这些名词我大多从 man page 上摘下来虽然有些枯燥, 但是对于理解下面的内容还是很有帮助的。

rsync 实现数据备份详解

简单翻译如下:

ACL 是由一系列的 Access Entry 所组成的,每一条 Access Entry 定义了特定的类别可以对文件拥有的操作权限。Access Entry 有三个组成部分:Entry tag type, qualifier (optional), permission。我们先来看一下最重要的 Entry tag type,它有以下几个类型:

ACL_USER_OBJ:相当于 Linux 里 file_owner 的 permission

ACL_USER:定义了额外的用户可以对此文件拥有的 permission

ACL_GROUP_OBJ:相当于 Linux 里 group 的 permission

ACL_GROUP:定义了额外的组可以对此文件拥有的 permission

ACL_MASK:定义了 ACL_USER, ACL_GROUP_OBJ 和 ACL_GROUP 的最大权限 (这个我下面还会专门讨论)

ACL_OTHER:相当于 Linux 里 other 的 permission

我们来举例说明一下,我就用 getfacl 命令来查看一个已经定义好的 ACL 文件。

rsync 实现数据备份详解

前面三个以 #开头的定义了文件名,file owner 和 group。这些信息没有太大的作用,接下来我们可以用 –omit-header 来省略掉。

user::rw- 定义了 ACL_USER_OBJ, 说明 file owner 拥有 read and write permission

user:miao:rwx 定义了 ACL_USER, 这样用户 miao 就拥有了对文件的读写权限, 实现了我们一开始要达到的目的

group::--- 定义了 ACL_GROUP_OBJ, 说明文件的 group 对该文件没有权限。group:develop:r-- 定义了 ACL_GROUP, 使得 develop 组拥有了对文件的 read and write permission

mask::rw- 定义了 ACL_MASK 的权限为 read  write and execute permission

other::--- 定义了 ACL_OTHER,说明其它组的用户对该文件没有权限 

从这里我们就可以看出 ACL 提供了我们可以定义特定用户和用户组的功能,那么接下来我们就来看一下如何设置一个文件的 ACL:
如何设置 ACL 文件

首先我们还是要讲一下设置 ACL 文件的格式,从上面的例子中我们可以看到每一个 Access Entry 都是由三个被:号分隔开的字段所组成,第一个就是 Entry tag type。

user 对应了 ACL_USER_OBJ 和 ACL_USER

group 对应了 ACL_GROUP_OBJ 和 ACL_GROUP

mask 对应了 ACL_MASK

other 对应了 ACL_OTHER

 

第二个字段称之为 qualifier,也就是上面例子中的 miao 和 develop 组,它定义了特定用户和特定组对于文件的权限。这里我们也可以发现只有 user 和 group 才有 qualifier,其他的都为空。第三个字段就是我们熟悉的 permission 了。它和 Linux 的 permission 一样定义,这里就不多讲了。

通俗一点就是说:ACL 参数主要由三部分组成,结构如下:

四种身份: 对应身份的名称: 三种权限。

[u|g|o|m]:[用户名 | 组名]:[rwx] 

只有 user 和 group 才可以有对应的名称,其余的都为空。

好了,下面进入实战,在实战中,讲述如何设置文件和目录的 ACL 权限。只要一个文件或目录被设置了 ACL 权限,那么它就被称为 ACL 文件。

3. 实战:

实战 1:针对某一个特定用户,做一个 ACL 文件,并用 getfacl 命令来查看。

[root@xiaolyu77 tmp]# mkdir -m 700 ./acldir && ll -d ./acldir/
drwx------ 2 root root 4096 Sep 20 08:42 ./acldir/
[root@xiaolyu77 tmp]# su hello
[hello@xiaolyu77 tmp]$ cd ./acldir/
bash: cd: ./acldir/: Permission denied  # 权限不够,用户 hello 对该目录没有 x 权限。
[hello@xiaolyu77 tmp]$ exit
exit
[root@xiaolyu77 tmp]# setfacl -m u:hello:x ./acldir/ # 针对用户 hello 设置目录 acldir 权限为 x。
[root@xiaolyu77 tmp]# ll -d ./acldir/
drwx--x---+ 2 root root 4096 Sep 20 08:42 ./acldir/ 
# 通过 setacl 设置权限后,会在权限末尾添加一个 "+",同时文件原本权限也将发生变化。 [root@xiaolyu77 tmp]# getfacl ./acldir/ # 通过 getacl 查看原始目录的权限。 # file: acldir/ # owner: root # group: root user::rwx user:hello:--x #hello 用户对此目录有 x 权限。 group::--- mask::--x other::--- # 只有 hello 用户对此目录有 x 权限,其它用户还是没有权限。 [root@xiaolyu77 tmp]# su hello [hello@xiaolyu77 tmp]$ cd ./acldir/ #hello 用户对此目录有 x 权限,可以进入此目录。
[hello@xiaolyu77 acldir]$

在文件 permission 的最后多了一个 + 号,当任何一个文件拥有了 ACL_USER 或者 ACL_GROUP 的值以后我们就可以称它为 ACL 文件,这个 + 号就是用来提示我们的。我们还可以发现当一个文件拥有了 ACL_USER 或者 ACL_GROUP 的值时 ACL_MASK 同时也会被定义。

rsync 实现数据备份详解

实战 2:针对某一个特定组,做一个 ACL 文件,并用 getfacl 查看。

[root@xiaolyu77 tmp]# setfacl -m g:miao:rx ./acldir/ # 针对 miao 组用户,设置目录 acldir 的 rx 权限
[root@xiaolyu77 tmp]# ll -d ./acldir/
drwxr-x---+ 2 root root 4096 Sep 20 08:42 ./acldir/
[root@xiaolyu77 tmp]# getfacl ./acldir/
# file: acldir/
# owner: root
# group: root
user::rwx
user:hello:--x
group::---
group:miao:r-x   #miao 组中的用户对该目录具有 rx 权限。
mask::r-x
other::---

[root@xiaolyu77 tmp]# su miao  #miao 用户属于 miao 组。
[miao@xiaolyu77 tmp]$ cd ./acldir/  #miao 组用户对 acldir 目录具有 rx 权限
[miao@xiaolyu77 acldir]$ id miao
uid=501(miao) gid=501(miao) groups=501(miao)
[miao@xiaolyu77 acldir]$ 

 

rsync 实现数据备份详解

实战 3:为文件 aclfile 增加 acl 权限,使 miao 组的所有用户都能读写执行该文件

[root@xiaolyu77 tmp]# touch aclfile.sh
[root@xiaolyu77 tmp]# chmod 700 aclfile.sh
[root@xiaolyu77 tmp]# ll aclfile.sh
-rwx------ 1 root root 0 Sep 20 09:39 aclfile.sh
[root@xiaolyu77 tmp]# echo "date" >> ./aclfile.sh
[root@xiaolyu77 tmp]# cat ./aclfile.sh
date
[root@xiaolyu77 tmp]# ./aclfile.sh
Tue Sep 20 09:40:54 CST 2016
[root@xiaolyu77 tmp]# su miao
[miao@xiaolyu77 tmp]$ echo "echo $HOME" >> ./aclfile.sh
bash: ./aclfile.sh: Permission denied
[miao@xiaolyu77 tmp]$ cat ./aclfile.sh
cat: ./aclfile.sh: Permission denied
[miao@xiaolyu77 tmp]$ ./aclfile.sh
bash: ./aclfile.sh: Permission denied
[miao@xiaolyu77 tmp]$ exit
exit
[root@xiaolyu77 tmp]# setfacl -m g:miao:rwx ./aclfile.sh
[root@xiaolyu77 tmp]# ll ./aclfile.sh
-rwxrwx---+ 1 root root 5 Sep 20 09:40 ./aclfile.sh
[root@xiaolyu77 tmp]# getfacl ./aclfile.sh
# file: aclfile.sh
# owner: root
# group: root
user::rwx
group::---
group:miao:rwx
mask::rwx
other::---

[root@xiaolyu77 tmp]# su miao
[miao@xiaolyu77 tmp]$ cat ./aclfile.sh
date
[miao@xiaolyu77 tmp]$ echo "echo $PWD" >> ./aclfile.sh
[miao@xiaolyu77 tmp]$ ./aclfile.sh
Tue Sep 20 09:43:18 CST 2016
/tmp
[miao@xiaolyu77 tmp]$ 

rsync 实现数据备份详解

实战 4:删除文件 aclfile 上,关于 miao 组的 acl 权限

[root@xiaolyu77 tmp]# setfacl -x g:miao ./aclfile.sh
[root@xiaolyu77 tmp]# ll aclfile.sh
-rwx------+ 1 root root 15 Sep 20 09:43 aclfile.sh
[root@xiaolyu77 tmp]# getfacl ./aclfile.sh
# file: aclfile.sh
# owner: root
# group: root
user::rwx
group::---
mask::---
other::---

[root@xiaolyu77 tmp]#  

rsync 实现数据备份详解

实战 5:删除目录 acldir 的所有 ACL 权限

[root@xiaolyu77 tmp]# setfacl -b ./acldir
[root@xiaolyu77 tmp]# ll -d ./acldir
drwx------ 2 root root 4096 Sep 20 08:42 ./acldir
[root@xiaolyu77 tmp]# getfacl ./acldir
# file: acldir
# owner: root
# group: root
user::rwx
group::---
other::---

[root@xiaolyu77 tmp]# 

rsync 实现数据备份详解

4. 重点:ACL_MASK 和 Effective permission

这里需要重点讲一下 ACL_MASK,因为这是掌握 ACL 的另一个关键,在 Linux file permission 里面大家都知道比如对于 rw-rw-r– 来说, 当中的那个 rw- 是指文件组的 permission. 但是在 ACL 里面这种情况只是在 ACL_MASK 不存在的情况下成立。如果文件有 ACL_MASK 值,那么当中那个 rw- 代表的就是 mask 值而不再是 group permission 了。

让我们看一下下面的这个例子:

rsync 实现数据备份详解

这里说明 test.sh 文件只有 file owner: root 拥有 read, write, execute/search permission。admin 组只有 read and write permission,现在我们想让用户 john 也对 test.sh 具有和 root 一样的 permission。
rsync 实现数据备份详解

这里我们看到 john 已经拥有了 rwx 的 permission,mask 值也被设定为 rwx,那是因为它规定了 ACL_USER,ACL_GROUP 和 ACL_GROUP_OBJ 的最大值,现在我们再来看 test.sh 的 Linux permission,它已经变成了:

rsync 实现数据备份详解

那么如果现在 admin 组的用户想要执行 test.sh 的程序会发生什么情况呢?它会被 permission deny。原因在于实际上 admin 组的用户只有 read and write permission,这里当中显示的 rwx 是 ACL_MASK 的值而不是 group 的 permission。所以从这里我们就可以知道,如果一个文件后面有 + 标记,我们都需要用 getfacl 来确认它的 permission,以免发生混淆。下面我们再来继续看一个例子,假如现在我们设置 test.sh 的 mask 为 read only,那么 admin 组的用户还会有 write permission 吗?

rsync 实现数据备份详解

这时候我们可以看到 ACL_USER 和 ACL_GROUP_OBJ 旁边多了个 #effective:r–,这是什么意思呢?让我们再来回顾一下 ACL_MASK 的定义。它规定了 ACL_USER,ACL_GROUP_OBJ 和 ACL_GROUP 的最大权限。那么在我们这个例子中他们的最大权限也就是 read only。虽然我们这里给 ACL_USER 和 ACL_GROUP_OBJ 设置了其他权限,但是他们真正有效果的只有 read 权限。也就是说 ACL_USER 和 ACL_GROUP_OBJ 及 ACL_GROUP 它们的实际权限不能超过 mask 的权限(因为 mask 定义了它们三个当中最大权限)。这时我们再来查看 test.sh 的 Linux file permission 时它的 group permission 也会显示其 mask 的值(r–)
rsync 实现数据备份详解

Default ACL

上面我们所有讲的都是 Access ACL,也就是对新创建的文件,没有涉及到 ACL 权限继承的问题。下面我简单讲一下 Default ACL。Default ACL 是指对于一个目录进行 Default ACL 设置,并且在此目录下建立的文件都将继承此目录的 ACL。同样我们来做一个试验说明,比如现在 root 用户建立了一个 dir 目录:

rsync 实现数据备份详解

它希望所有在此目录下建立的文件都可以被 john 用户所访问,那么我们就应该对 dir 目录设置 Default ACL。

rsync 实现数据备份详解

 这里我们可以看到 ACL 定义了 default 选项,john 用户拥有了 default 的 read, write, excute/search permission。所有没有定义的 default 都将从 file permission 里 copy 过来,现在 root 用户在 dir 下建立一个 test.txt 文件。
rsync 实现数据备份详解

这里我们看到在 dir 下建立的文件 john 用户自动就有了 read,write,excute/search permissionpermission。
想一想:为什么这里./dir/test.txt 文件的 mask 的权限只有 rw 吗?这是因为对于从目录继承过来的文件的 ACL 权限,mask 最大只能是 rw。结果就是

CL_USER,ACL_GROUP_OBJ 和 ACL_GROUP 的最大实际权限只能是 rw。也就是说系统为了安全起见,不允许直接继承的权限带 x。如果想要改变,可以手工修改文件的 mask 的值。这样的话,CL_USER,ACL_GROUP_OBJ 和 ACL_GROUP 的最大实际权限可能也会跟着变化。

rsync 实现数据备份详解

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-06/144901.htm

三、rsync 数据备份

1. RSYNC 概述:

RSYNC 是 Remote Sync 远程同步的简称,与 SCP 的比较,SCP= 无法备份大量数据,类似 windows 的复制,而 rsync= 边复制,边统计,边比较,可以备份大量数据。

 Rysnc 特性和优点

可以镜像保存整个目录树和文件系统。

可以很容易做到保持原来文件的权限、时间、软硬链接等等。

无须特殊权限即可安装。

快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。

压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。

安全:可以使用 scp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接。

支持匿名传输,以方便进行网站镜象。

选择性保持:符号连接,硬链接,文件属性,权限,时间等。

官方网站:https://rsync.samba.org/

常见备份分类

完整备份,差异备份,增量备份

完整备份:每次备份都是从备份源将所有的文件或目录备份到目的地

差异备份:备份上次完全备份以后有变化的数据(他针对的上次的完全备份, 他备份过程中不清除存档属性)

增量备份:备份上次备份以后有变化的数据.(他才不管是那种类型的备份, 有变化的数据就备份, 他会清除存档属性)

运行模式和端口

采用 C / S 模式(客户端 / 服务器模式)

[就是一个点到点的传输,直接使用 rsync 命令]  端口 873

 

发起端和备份源

四个名词的解释:

发起端:负责发起 rsync 同步操作的客户机叫做发起端,通知服务器我要备份你的数据

备份源:负责相应来自客户机 rsync 同步操作的服务器在备份源,需要备份的服务器

服务端:运行 rsyncd 服务,一般来说,需要备份的服务器

客户端:存放备份数据

数据同步方式

推 push:一台主机负责把数据传送给其他主机,服务器开销很大,比较适合后端服务器少的情况

拉 pull:所有主机定时去找一主机拉数据,可能就会导致数据缓慢

推:目的主机配置为 rsync 服务器,源主机周期性的使用 rsync 命令把要同步的目录推过去(需要备份的机器是客户端,存储备份的机器是服务端)

拉:源主机配置为 rsync 服务器,目的主机周期性的使用 rsync 命令把要同步的目录拉过来(需要备份的机器是服务端,存储备份的机器是客户端)

两种方案,rsync 都有对应的命令来实现

 

Xinetd管理 Rsync 工作原理 

       使用 rsync 来同步是先通过 xinetd 监听 873 号端口,如果 rsync 进来的是 873 号端口,那么 xinetd 就会通知它所管辖的 rsync 服务来做回应,接下来就是 rsync 俩服务于之间的通讯。

Rsync服务安装

       实验拓扑:

xiaolyu76(Server 192.168.31.76)====xiaolyu77(Client 192.168.31.77)

Rsync 服务依赖 Xinetd,是使用超级服务来管理的

  yum 安装:

[root@xiaolyu76 ~]# yum install -y xinetd   

 rsync 实现数据备份详解

rsync 实现数据备份详解

 

[root@xiaolyu76 ~]# vim /etc/xinetd.d/rsync

rsync 实现数据备份详解

 

[root@xiaolyu76 ~]# /etc/init.d/xinetd restart      #重启 xinetd。

[root@xiaolyu76 ~]# netstat -antup | grep 873    #查看 873 号端口是否是 xinetd。

rsync 实现数据备份详解

Rsync命令

       rsync 命令和 scp 命令很相似,可以 man rsync 看一下。

rsync 实现数据备份详解

 

-a, –archive archive mode 权限保存模式, 相当于 -rlptgoD 参数,存档,递归,保持属性等

-r, –recursive 复制所有下面的资料,递归处理

-p, –perms 保留档案权限,文件原有属性

-t, –times 保留时间点,文件原有时间

-g, –group 保留原有属组

-o, –owner 保留档案所有者(root only)

-D, –devices 保留 device 资讯(root only)

-l, –links 复制所有的连接,拷贝连接文件

-z, –compress 压缩模式, 当资料在传送到目的端进行档案压缩.

-H, –hard-links 保留硬链接文件

-A, –acls 保留 ACL 属性文件,需要配合 –perms

-P,- P 参数和 –partial –progress 相同. 只是为了把参数简单化, 表示传进度

–version,输出 rsync 版本

-v , –verbose 复杂的输出信息

-u, –update 仅仅进行更新,也就是跳过已经存在的目标位置,并且文件时间要晚于要备份的文件,不覆盖新的文件

–port=PORT,定义 rsyncd(daemon)要运行的 port(预设为 tcp 873)

–delete,删除那些目标位置有的文件而备份源没有的文件

–password-file=FILE,从 FILE 中得到密码

–bwlimit=KBPS,限制 I/O 带宽

–filter“-filename”,需要过滤的文件

–exclude=filname,需要过滤的文件

–progress,显示备份过程

常用的 –avz

使用 rsync 备份数据

对 xiaolyu76 网站根目录的 /var/www/html 目录备份到 xialyu77 的 /web-back 

 

2.  用系统用户,实现 rsync 远程数据备份

 

1. 建立测试用户

[root@xiaolyu76 ~]# useradd rget1                            // 测试用户,rget1 用于下载
[root@xiaolyu76 ~]# echo rget1:123456 | chpasswd
[root@xiaolyu76 ~]# useradd rput1;echo rput1:123456 | chpasswd   // 测试用户,rput1 用户上传、

rsync 实现数据备份详解

对目录赋予 ACL 权限

[root@xiaolyu76 ~]# setfacl -R -m user:rput1:rwx /var/www/html/ //rput1 用户可以对目录拥有读写权限
[root@xiaolyu76 ~]# setfacl -R -m default:user:rput1:rwx /var/www/html/ // 设置默认情况下,rput1 对目录 /var/www/html 下的所有文件拥有读写权限

[root@xiaolyu76 ~]# setfacl -R -m user:rget1:rwx /var/www/html/
[root@xiaolyu76 ~]# setfacl -R -m default:rget1:rwx /var/www/html/
[root@xiaolyu76 ~]# getfacl –omit-header /var/www/html
getfacl: Removing leading ‘/’ from absolute path names
user::rwx
user:rget1:rwx
user:rput1:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:rget1:rwx
default:user:rput1:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

rsync 实现数据备份详解

2. 数据的准备工作;

[root@xiaolyu76 ~]# cp -r /boot/* /var/www/html/     #  /boot 目录下的所有数据作为测试数据。

rsync 实现数据备份详解

rsync 实现数据备份详解

注意:因为我们这里在创建测试用户的时候,针对某一个用户赋予某一个目录的 ACL 默认权限,这实际上是用到了 ACL 的权限继承。ACL 的权限继承只有在设置好目录的默认权限之后,在该目录下,新创建的文件才可以继承该目录的权限。所以一定要在创建用户和 ACL 权限设置完成后,再做测试数据的准备工作。

3. 开始测试:

       //boot 目录下的所有数据作为测试数据

 [root@xiaolyu77 ~]# rsync -avz –delete rget1@192.168.31.76:/var/www/html/ /web-back/

格式几乎同 scp 一模一样,所以在前面详细讲了 scp 的用法。

              ……

rsync: send_files failed to open “/var/www/html/initramfs-2.6.32-431.el6.x86_64.img”: Permission denied (13)

……

 

……

rsync: send_files failed to open “/var/www/html/grub/grub.conf”: Permission denied (13)

# 几行报错,排错

rsync 实现数据备份详解

同步数据出错排查:根据我们前面对 acl 文件的了解,显然 acl 文件出现权限问题,第一步就是 getfacl 查看实际权限。

[root@xiaolyu76 ~]# getfacl –omit-header /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

[root@xiaolyu76 ~]# getfacl –omit-header /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

[root@xiaolyu76 ~]# getfacl –omit-header /var/www/html/lost+found

rsync 实现数据备份详解

rsync 实现数据备份详解

显然,由于我们前面的分析,知道因为 mask 没有权限,所以 rget1 实际上没有任何权限。解决方法就是加上权限。

rsync 实现数据备份详解

解决方法:添加权限。

[root@xiaolyu76 ~]# chmod 744 /var/www/html/initramfs-2.6.32-431.el6.x86_64.img
[root@xiaolyu76 ~]# getfacl –omit-header /var/www/html/initramfs-2.6.32-431.el6.x86_64.img

rsync 实现数据备份详解

同理方法修改

/var/www/html/grub/grub.conf

/var/www/html/lost+found

 

[root@xiaolyu76 ~]# chmod 744 /var/www/html/grub/grub.conf
[root@xiaolyu76 ~]# chmod 744 /var/www/html/lost+found

再次客户端测试

[root@xiaolyu77 ~]# rm -rf /web-back/*
[root@xiaolyu77 ~]# rsync -avz –delete rget1@192.168.31.76:/var/www/html/ /web-back/

rsync 实现数据备份详解

RSYNC 是 Remote Sync 远程同步的简称,与 SCP 的比较,SCP= 无法备份大量数据,类似 windows 的复制,而 rsync= 边复制,边统计,边比较,可以备份大量数据。可以镜像保存整个目录树和文件系统。可以很容易做到保持原来文件的权限、时间、软硬链接等等。无须特殊权限即可安装。快速:第一次同步时 rsync 会复制全部内容,但在下一次只传输修改过的文件。压缩传输:rsync 在传输数据的过程中可以实行压缩及解压缩操作,因此可以使用更少的带宽。安全:可以使用 scp、ssh 等方式来传输文件,当然也可以通过直接的 socket 连接。支持匿名传输,以方便进行网站镜象。选择性保持:符号连接,硬链接,文件属性,权限,时间等。考虑到 scp 也是像类似的远程备份工具,为了便于比较,本文从以下几个方面来讲述如何用 rsync 进程远程备份。

  • 一、scp 远程拷贝文件

  • 二、acl 权限控制

  • 三、rsync 数据备份

  • 四、Rsync+Inotify 实时同步

 说明:客户端(或称本地服务器):xiaolyu77  192.168.31.77 

服务器(或称远程服务器):xiaolyu76 192.168.31.76

一、scp 远程拷贝文件

scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件的命令,和它类似的命令有 cp,不过 cp 只是在本机进行拷贝不能跨服务器,而且 scp 传输是加密的。可能会稍微影响一下速度。当你服务器硬盘变为只读 read only system 时,用 scp 可以帮你把文件移出来。另外,scp 还非常不占资源,不会提高多少系统负荷,在这一点上,rsync 就远远不及它了。虽然 rsync 比 scp 会快一点,但当小文件众多的情况下,rsync 会导致硬盘 I / O 非常高,而 scp 基本不影响系统正常使用。

1. scp 的用法:

可以 man scp 看一下:

 rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

 

scp 的参数还是蛮多的,这里之所以不厌其烦的截图列出来,是想表达一种观点,任何新东西的学习其实都是有章可循的,那就是借助所给出的已知信息,比如 man 一个命令,比如查看 readme 文件。这里简单翻译如下:

命令格式:scp [参数] [原路径] [目标路径]

命令参数:

-1  强制 scp 命令使用协议 ssh1  

-2  强制 scp 命令使用协议 ssh2

-4  强制 scp 命令只使用 IPv4 寻址

-6  强制 scp 命令只使用 IPv6 寻址

-B  使用批处理模式(传输过程中不询问传输口令或短语)

-C  允许压缩。(将 - C 标志传递给 ssh,从而打开压缩功能)

-p 保留原文件的修改时间,访问时间和访问权限。

-q  不显示传输进度条。

-r  递归复制整个目录。

-v 详细方式显示输出。scp 和 ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。

-c cipher  以 cipher 将数据传输进行加密,这个选项将直接传递给 ssh。

-F ssh_config  指定一个替代的 ssh 配置文件,此参数直接传递给 ssh。

-i identity_file  从指定文件中读取传输时使用的密钥文件,此参数直接传递给 ssh。

-l limit  限定用户所能使用的带宽,以 Kbit/ s 为单位。

-o ssh_option  如果习惯于使用 ssh_config(5)中的参数传递方式,

-P port  注意是大写的 P, port 是指定数据传输用到的端口号  

-S program  指定加密传输时所使用的程序。此程序必须能够理解 ssh(1)的选项。

2. 用法及实例:

1. 从本地服务器复制到远程服务器:

(1)复制文件:

  scp local_file remote_username@remote_ip:remote_folder   # 指定了 ssh 远程服务的用户名,scp 复制时,需要输入密码。

  scp local_file remote_username@remote_ip:remote_file       # 指定了 ssh 远程服务的用户名,scp 复制时,需要输入密码。

     说明:我看有人提出了,在这个地方可以不用写 ssh 远程登录的用户名(即 scp local_file  remote_ip:remote_file),在命令执行时,会提示输入用户名和密码,本人亲身多次,不可以的,故该方法没有列出来。一般 ssh 登录默认是 root 用户,不写就代表是 root 用户。

(2)复制目录:

  scp -r local_folder remote_username@remote_ip:remote_folder  #指定了 ssh 远程服务的用户名,命令执行后需要输入用户密码;

 

2. 从远程服务器复制到本地服务器:

 

从远程复制到本地的 scp 命令与上面的命令雷同,只要将从本地复制到远程的命令后面 2 个参数互换顺序就行了。

 

说明一下:因为我前面已经对 root 用户做了免秘钥登录了,所以就不用 root 用户做实验了,用普通用户。

实战 1:上传本地文件到远程服务器指定目录下,如果用的是相对路径,默认在登录 ssh 服务器用户的根目录下。

rsync 实现数据备份详解

#ssh 本地客户端:

[root@xiaolyu77 ~]# cp /etc/passwd ./
[root@xiaolyu77 ~]# ls -ltr
total 48
-rw-r–r–. 1 root root 5890 Sep 16 08:58 install.log.syslog
-rw-r–r–. 1 root root 26271 Sep 16 09:00 install.log
-rw——-. 1 root root 1243 Sep 16 09:00 anaconda-ks.cfg
-rw-r–r– 1 root root 1058 Sep 20 02:42 passwd
[root@xiaolyu77 ~]# scp passwd xiao@xiaolyu76:pass
xiao@xiaolyu76’s password:
passwd 100% 1058 1.0KB/s 00:00

#ssh 远端服务器:

[root@xiaolyu76 ~]# cd /home/xiao   # 客户端登录 ssh 用的是该用户,相对目录,默认就是在此目录下。
[root@xiaolyu76 xiao]# mkdir pass
[root@xiaolyu76 xiao]# ls -l pass
total 0
[root@xiaolyu76 xiao]# ls -l
total 4
drwxr-xr-x 2 root root 4096 Sep 20 02:54 pass
[root@xiaolyu76 xiao]# chmod 777 pass   # 这个地方一定要注意,因为用的不是 root 用户,所以要给 scp 命令中 ssh 服务器端文件夹以 777 的权限。
[root@xiaolyu76 xiao]# ls -l
total 4
drwxrwxrwx 2 root root 4096 Sep 20 02:55 pass
[root@xiaolyu76 xiao]# ls -l pass
total 4
-rw-r–r– 1 xiao xiao 1058 Sep 20 02:55 passwd
[root@xiaolyu76 xiao]#

rsync 实现数据备份详解

 rsync 实现数据备份详解

rsync 实现数据备份详解

注意:在客户端 执行 scp local_file remote_username@remote_ip:remote_folder 用的是普通用户登录 ssh 服务器,而不是 root 用户,

而我在服务器端创建的 remote_folder 文件夹(目录)用的是 root 用户,所以要给 scp 命令中 ssh 服务器端文件夹 remote_folder 以 777 权限。

否则在客户端执行 scp 命令时会报如下错误:

rsync 实现数据备份详解

这是因为:对于文件夹(目录)来说 777 权限代表了:

r(Read,读取):对文件而言,具有读取文件内容的权限;对目录来说,具有浏览目录的权限。

w(Write, 写入):对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。

x(eXecute,执行):对文件而言,具有执行文件的权限;对目录了来说该用户具有进入目录的权限。

实战 2:上传本地文件到远程服务器,不指定远程服务器的存放目录。默认在登录 ssh 服务器用户的根目录下。

rsync 实现数据备份详解

#ssh 本地客户机:

[root@xiaolyu77 ~]# scp passwd xiao@xiaolyu76:testscp
xiao@xiaolyu76’s password: 
passwd 100% 1058 1.0KB/s 00:00 
[root@xiaolyu77 ~]#

#ssh 远端服务器:

[root@xiaolyu76 xiao]# ls -l
total 8
drwxrwxrwx 2 root root 4096 Sep 20 02:55 pass
-rw-r–r– 1 xiao xiao 1058 Sep 20 03:19 testscp  # 注意和客户机比较文件大小。
[root@xiaolyu76 xiao]#

rsync 实现数据备份详解

rsync 实现数据备份详解

rsync 实现数据备份详解

实战 3. 从远程服务器下载文件夹到本地

[root@xiaolyu77 ~]# scp -r  xiao@xiaolyu76:/home/xiao/pass ./

rsync 实现数据备份详解

总结:scp 命令就是利用 ssh 登录,来远程复制文件。可以从本地到远程,也可以从远程到本地。当同一 ip 三次登录失败后,fail2ban 一样会禁止该 ip 登录。就是说每执行一次 scp 命令,实际上就发起了一次 ssh 登录。

 二、acl 权限控制

  这里为什么会谈到 acl 权限控制呢?因为后面我做那个 rsync 数据备份时,需要针对单个用户对单个目录设置权限,这就需要用到 acl 权限控制。

什么是 ACL 权限控制呢?ACL 是 Access Control List 的缩写,主要目的是针对在传统的三种身份和三种权限之外,提供更加细化的局部权限设定。官方手册来讲,它主要针对用户、用户组、以及掩码方面控制权限。
      简单去理解就是,ACL 可以针对单个用户、单个用户组来进行权限细化的控制。主要目的是提供传统的 owner,group,other 的 read,wirte,execute 权限之外的具体权限设置,可以针对单一用户或组来设置特定的权限。而在 windows 系统上,没有这个 ACL,ACL 是类 Unix(Unix-like)操作系统权限的额外支持项目,因此要使用 ACL 必须要有文件系统的支持才行。主要包括 ReiserFS, EXT2/EXT3/ext4, JFS, XFS 等文件系统。

 

1. 判断当前文件系统是否支持 acl。

当然了,我们可以先 man acl 看一下,是否有相关的信息:

man acl 

rsync 实现数据备份详解

也可以通过文件系统来判断:

 df -T -h

rsync 实现数据备份详解

最好用如下两个命令来判断当前文件系统是否支持

dumpe2fs -h /dev/sda1 |grep acl
或者
tune2fs -l /dev/sda1 | grep options

rsync 实现数据备份详解

 

2. ACL 相关命令详解:

ACL 操作的命令主要有三个:getfacl、setfacl 和 chacl,但是常用的就 getfacl 和 setfacl。

(1) 查看 ACL 权限

语法:getfacl filename

(2) 设置 ACL 权限

语法:setfacl [-bkRd] [-m|-x acl 参数]  目标文件名
选项介绍:
-m: 设置后续的 acl 参数,不可与 -x 一起使用
-x: 删除后续的 acl 参数,不可与 -m 一起使用
-b: 删除所有的 acl 参数
-k: 删除默认的 acl 参数
-R: 递归设置 acl 参数
-d: 设置默认 acl 参数,只对目录有效

先来看看在 ACL 里面每一个名词的定义,这些名词我大多从 man page 上摘下来虽然有些枯燥, 但是对于理解下面的内容还是很有帮助的。

rsync 实现数据备份详解

简单翻译如下:

ACL 是由一系列的 Access Entry 所组成的,每一条 Access Entry 定义了特定的类别可以对文件拥有的操作权限。Access Entry 有三个组成部分:Entry tag type, qualifier (optional), permission。我们先来看一下最重要的 Entry tag type,它有以下几个类型:

ACL_USER_OBJ:相当于 Linux 里 file_owner 的 permission

ACL_USER:定义了额外的用户可以对此文件拥有的 permission

ACL_GROUP_OBJ:相当于 Linux 里 group 的 permission

ACL_GROUP:定义了额外的组可以对此文件拥有的 permission

ACL_MASK:定义了 ACL_USER, ACL_GROUP_OBJ 和 ACL_GROUP 的最大权限 (这个我下面还会专门讨论)

ACL_OTHER:相当于 Linux 里 other 的 permission

我们来举例说明一下,我就用 getfacl 命令来查看一个已经定义好的 ACL 文件。

rsync 实现数据备份详解

前面三个以 #开头的定义了文件名,file owner 和 group。这些信息没有太大的作用,接下来我们可以用 –omit-header 来省略掉。

user::rw- 定义了 ACL_USER_OBJ, 说明 file owner 拥有 read and write permission

user:miao:rwx 定义了 ACL_USER, 这样用户 miao 就拥有了对文件的读写权限, 实现了我们一开始要达到的目的

group::--- 定义了 ACL_GROUP_OBJ, 说明文件的 group 对该文件没有权限。group:develop:r-- 定义了 ACL_GROUP, 使得 develop 组拥有了对文件的 read and write permission

mask::rw- 定义了 ACL_MASK 的权限为 read  write and execute permission

other::--- 定义了 ACL_OTHER,说明其它组的用户对该文件没有权限 

从这里我们就可以看出 ACL 提供了我们可以定义特定用户和用户组的功能,那么接下来我们就来看一下如何设置一个文件的 ACL:
如何设置 ACL 文件

首先我们还是要讲一下设置 ACL 文件的格式,从上面的例子中我们可以看到每一个 Access Entry 都是由三个被:号分隔开的字段所组成,第一个就是 Entry tag type。

user 对应了 ACL_USER_OBJ 和 ACL_USER

group 对应了 ACL_GROUP_OBJ 和 ACL_GROUP

mask 对应了 ACL_MASK

other 对应了 ACL_OTHER

 

第二个字段称之为 qualifier,也就是上面例子中的 miao 和 develop 组,它定义了特定用户和特定组对于文件的权限。这里我们也可以发现只有 user 和 group 才有 qualifier,其他的都为空。第三个字段就是我们熟悉的 permission 了。它和 Linux 的 permission 一样定义,这里就不多讲了。

通俗一点就是说:ACL 参数主要由三部分组成,结构如下:

四种身份: 对应身份的名称: 三种权限。

[u|g|o|m]:[用户名 | 组名]:[rwx] 

只有 user 和 group 才可以有对应的名称,其余的都为空。

好了,下面进入实战,在实战中,讲述如何设置文件和目录的 ACL 权限。只要一个文件或目录被设置了 ACL 权限,那么它就被称为 ACL 文件。

3. 实战:

实战 1:针对某一个特定用户,做一个 ACL 文件,并用 getfacl 命令来查看。

[root@xiaolyu77 tmp]# mkdir -m 700 ./acldir && ll -d ./acldir/
drwx------ 2 root root 4096 Sep 20 08:42 ./acldir/
[root@xiaolyu77 tmp]# su hello
[hello@xiaolyu77 tmp]$ cd ./acldir/
bash: cd: ./acldir/: Permission denied  # 权限不够,用户 hello 对该目录没有 x 权限。
[hello@xiaolyu77 tmp]$ exit
exit
[root@xiaolyu77 tmp]# setfacl -m u:hello:x ./acldir/ # 针对用户 hello 设置目录 acldir 权限为 x。
[root@xiaolyu77 tmp]# ll -d ./acldir/
drwx--x---+ 2 root root 4096 Sep 20 08:42 ./acldir/ 
# 通过 setacl 设置权限后,会在权限末尾添加一个 "+",同时文件原本权限也将发生变化。 [root@xiaolyu77 tmp]# getfacl ./acldir/ # 通过 getacl 查看原始目录的权限。 # file: acldir/ # owner: root # group: root user::rwx user:hello:--x #hello 用户对此目录有 x 权限。 group::--- mask::--x other::--- # 只有 hello 用户对此目录有 x 权限,其它用户还是没有权限。 [root@xiaolyu77 tmp]# su hello [hello@xiaolyu77 tmp]$ cd ./acldir/ #hello 用户对此目录有 x 权限,可以进入此目录。
[hello@xiaolyu77 acldir]$

在文件 permission 的最后多了一个 + 号,当任何一个文件拥有了 ACL_USER 或者 ACL_GROUP 的值以后我们就可以称它为 ACL 文件,这个 + 号就是用来提示我们的。我们还可以发现当一个文件拥有了 ACL_USER 或者 ACL_GROUP 的值时 ACL_MASK 同时也会被定义。

rsync 实现数据备份详解

实战 2:针对某一个特定组,做一个 ACL 文件,并用 getfacl 查看。

[root@xiaolyu77 tmp]# setfacl -m g:miao:rx ./acldir/ # 针对 miao 组用户,设置目录 acldir 的 rx 权限
[root@xiaolyu77 tmp]# ll -d ./acldir/
drwxr-x---+ 2 root root 4096 Sep 20 08:42 ./acldir/
[root@xiaolyu77 tmp]# getfacl ./acldir/
# file: acldir/
# owner: root
# group: root
user::rwx
user:hello:--x
group::---
group:miao:r-x   #miao 组中的用户对该目录具有 rx 权限。
mask::r-x
other::---

[root@xiaolyu77 tmp]# su miao  #miao 用户属于 miao 组。
[miao@xiaolyu77 tmp]$ cd ./acldir/  #miao 组用户对 acldir 目录具有 rx 权限
[miao@xiaolyu77 acldir]$ id miao
uid=501(miao) gid=501(miao) groups=501(miao)
[miao@xiaolyu77 acldir]$ 

 

rsync 实现数据备份详解

实战 3:为文件 aclfile 增加 acl 权限,使 miao 组的所有用户都能读写执行该文件

[root@xiaolyu77 tmp]# touch aclfile.sh
[root@xiaolyu77 tmp]# chmod 700 aclfile.sh
[root@xiaolyu77 tmp]# ll aclfile.sh
-rwx------ 1 root root 0 Sep 20 09:39 aclfile.sh
[root@xiaolyu77 tmp]# echo "date" >> ./aclfile.sh
[root@xiaolyu77 tmp]# cat ./aclfile.sh
date
[root@xiaolyu77 tmp]# ./aclfile.sh
Tue Sep 20 09:40:54 CST 2016
[root@xiaolyu77 tmp]# su miao
[miao@xiaolyu77 tmp]$ echo "echo $HOME" >> ./aclfile.sh
bash: ./aclfile.sh: Permission denied
[miao@xiaolyu77 tmp]$ cat ./aclfile.sh
cat: ./aclfile.sh: Permission denied
[miao@xiaolyu77 tmp]$ ./aclfile.sh
bash: ./aclfile.sh: Permission denied
[miao@xiaolyu77 tmp]$ exit
exit
[root@xiaolyu77 tmp]# setfacl -m g:miao:rwx ./aclfile.sh
[root@xiaolyu77 tmp]# ll ./aclfile.sh
-rwxrwx---+ 1 root root 5 Sep 20 09:40 ./aclfile.sh
[root@xiaolyu77 tmp]# getfacl ./aclfile.sh
# file: aclfile.sh
# owner: root
# group: root
user::rwx
group::---
group:miao:rwx
mask::rwx
other::---

[root@xiaolyu77 tmp]# su miao
[miao@xiaolyu77 tmp]$ cat ./aclfile.sh
date
[miao@xiaolyu77 tmp]$ echo "echo $PWD" >> ./aclfile.sh
[miao@xiaolyu77 tmp]$ ./aclfile.sh
Tue Sep 20 09:43:18 CST 2016
/tmp
[miao@xiaolyu77 tmp]$ 

rsync 实现数据备份详解

实战 4:删除文件 aclfile 上,关于 miao 组的 acl 权限

[root@xiaolyu77 tmp]# setfacl -x g:miao ./aclfile.sh
[root@xiaolyu77 tmp]# ll aclfile.sh
-rwx------+ 1 root root 15 Sep 20 09:43 aclfile.sh
[root@xiaolyu77 tmp]# getfacl ./aclfile.sh
# file: aclfile.sh
# owner: root
# group: root
user::rwx
group::---
mask::---
other::---

[root@xiaolyu77 tmp]#  

rsync 实现数据备份详解

实战 5:删除目录 acldir 的所有 ACL 权限

[root@xiaolyu77 tmp]# setfacl -b ./acldir
[root@xiaolyu77 tmp]# ll -d ./acldir
drwx------ 2 root root 4096 Sep 20 08:42 ./acldir
[root@xiaolyu77 tmp]# getfacl ./acldir
# file: acldir
# owner: root
# group: root
user::rwx
group::---
other::---

[root@xiaolyu77 tmp]# 

rsync 实现数据备份详解

4. 重点:ACL_MASK 和 Effective permission

这里需要重点讲一下 ACL_MASK,因为这是掌握 ACL 的另一个关键,在 Linux file permission 里面大家都知道比如对于 rw-rw-r– 来说, 当中的那个 rw- 是指文件组的 permission. 但是在 ACL 里面这种情况只是在 ACL_MASK 不存在的情况下成立。如果文件有 ACL_MASK 值,那么当中那个 rw- 代表的就是 mask 值而不再是 group permission 了。

让我们看一下下面的这个例子:

rsync 实现数据备份详解

这里说明 test.sh 文件只有 file owner: root 拥有 read, write, execute/search permission。admin 组只有 read and write permission,现在我们想让用户 john 也对 test.sh 具有和 root 一样的 permission。
rsync 实现数据备份详解

这里我们看到 john 已经拥有了 rwx 的 permission,mask 值也被设定为 rwx,那是因为它规定了 ACL_USER,ACL_GROUP 和 ACL_GROUP_OBJ 的最大值,现在我们再来看 test.sh 的 Linux permission,它已经变成了:

rsync 实现数据备份详解

那么如果现在 admin 组的用户想要执行 test.sh 的程序会发生什么情况呢?它会被 permission deny。原因在于实际上 admin 组的用户只有 read and write permission,这里当中显示的 rwx 是 ACL_MASK 的值而不是 group 的 permission。所以从这里我们就可以知道,如果一个文件后面有 + 标记,我们都需要用 getfacl 来确认它的 permission,以免发生混淆。下面我们再来继续看一个例子,假如现在我们设置 test.sh 的 mask 为 read only,那么 admin 组的用户还会有 write permission 吗?

rsync 实现数据备份详解

这时候我们可以看到 ACL_USER 和 ACL_GROUP_OBJ 旁边多了个 #effective:r–,这是什么意思呢?让我们再来回顾一下 ACL_MASK 的定义。它规定了 ACL_USER,ACL_GROUP_OBJ 和 ACL_GROUP 的最大权限。那么在我们这个例子中他们的最大权限也就是 read only。虽然我们这里给 ACL_USER 和 ACL_GROUP_OBJ 设置了其他权限,但是他们真正有效果的只有 read 权限。也就是说 ACL_USER 和 ACL_GROUP_OBJ 及 ACL_GROUP 它们的实际权限不能超过 mask 的权限(因为 mask 定义了它们三个当中最大权限)。这时我们再来查看 test.sh 的 Linux file permission 时它的 group permission 也会显示其 mask 的值(r–)
rsync 实现数据备份详解

Default ACL

上面我们所有讲的都是 Access ACL,也就是对新创建的文件,没有涉及到 ACL 权限继承的问题。下面我简单讲一下 Default ACL。Default ACL 是指对于一个目录进行 Default ACL 设置,并且在此目录下建立的文件都将继承此目录的 ACL。同样我们来做一个试验说明,比如现在 root 用户建立了一个 dir 目录:

rsync 实现数据备份详解

它希望所有在此目录下建立的文件都可以被 john 用户所访问,那么我们就应该对 dir 目录设置 Default ACL。

rsync 实现数据备份详解

 这里我们可以看到 ACL 定义了 default 选项,john 用户拥有了 default 的 read, write, excute/search permission。所有没有定义的 default 都将从 file permission 里 copy 过来,现在 root 用户在 dir 下建立一个 test.txt 文件。
rsync 实现数据备份详解

这里我们看到在 dir 下建立的文件 john 用户自动就有了 read,write,excute/search permissionpermission。
想一想:为什么这里./dir/test.txt 文件的 mask 的权限只有 rw 吗?这是因为对于从目录继承过来的文件的 ACL 权限,mask 最大只能是 rw。结果就是

CL_USER,ACL_GROUP_OBJ 和 ACL_GROUP 的最大实际权限只能是 rw。也就是说系统为了安全起见,不允许直接继承的权限带 x。如果想要改变,可以手工修改文件的 mask 的值。这样的话,CL_USER,ACL_GROUP_OBJ 和 ACL_GROUP 的最大实际权限可能也会跟着变化。

rsync 实现数据备份详解

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-06/144901.htm

3. 非系统用户备份数据

非系统用户备份数据,是使用系统配置文件 /etc/rsyncd.conf 来备份数据,创建备份账户,最后把 rsync 以 deamon 方式运行。

1.  rsyncd.conf 配置文件说明:

配置文件分为两部分:全局参数,模块参数

全局参数:对 rsync 服务器生效,如果模块参数和全局参数冲突,冲突的地方模块参数生效

模块参数:定义需要通过 rsync 输出的目录定义的参数

(1)  常见的全局参数:

port          #→指定后台程序使用的端口号,默认为 873。

uid            #→该选项指定当该模块传输文件时守护进程应该具有的 uid,配合 gid 选项使用可以确定哪些可以访问怎么样的文件权限,默认值是 ” nobody”。

gid            #→该选项指定当该模块传输文件时守护进程应该具有的 gid。默认值为 ” nobody”。

max connections        #→指定该模块的最大并发连接数量以保护服务器,超过限制的连接请求将被告知随后再试。默认值是 0,也就是没有限制。

lock file                  #→指定支持 max connections 参数的锁文件,默认值是 /var/run/rsyncd.lock。

motd file         #→” motd file” 参数用来指定一个消息文件,当客户连接服务器时该文件的内容显示给客户,默认 是没有 motd 文件的。

log file             #→” log file” 指定 rsync 的日志文件,而不将日志发送给 syslog。

pid file              #→指定 rsync 的 pid 文件,通常指定为“/var/run/rsyncd.pid”,存放进程 ID 的文件位置。

hosts allow =    #→单个 IP 地址或网络地址   // 允许访问的客户机地址

(2) 常见的模块参数:

主要是定义服务器哪个要被同步输出,其格式必须为“[共享模块名]”形式,这个名字就是在 rsync 客户端看到的名字,其实很像 Samba 服务器提供的共享名。而服务器真正同步的数据是通过 path 来指定的。

Comment         #→给模块指定一个描述,该描述连同模块名在客户连接得到模块列表时显示给客户。默认没有描述定义。

Path                  #→指定该模块的供备份的目录树路径,该参数是必须指定的。

read only         #→yes 为只允许下载,no 为可以下载和上传文件到服务器

exclude             #→用来指定多个由空格隔开的多个文件或目录(相对路径),将其添加到 exclude 列表中。这等同于在客户端命令中使用―exclude 或 —-filter 来指定某些文件或目录不下载或上传(既不可访问)

exclude from   #→指定一个包含 exclude 模式的定义的文件名,服务器从该文件中读取 exclude 列表定义,每个文件或目录需要占用一行

include             #→用来指定不排除符合要求的文件或目录。这等同于在客户端命令中使用 –include 来指定模式,结合 include 和 exclude 可以定义复杂的 exclude/include 规则。

include from   #→指定一个包含 include 模式的定义的文件名,服务器从该文件中读取 include 列表定义。

auth users       #→该选项指定由空格或逗号分隔的用户名列表,只有这些用户才允许连接该模块。这里的用户和系统用户没有任何关系。如果 ” auth users” 被设置,那么客户端发出对该模块的连接请求以后会被 rsync 请求 challenged 进行验证身份这里使用的 challenge/response 认证协议。用户的名和密码以明文方式存放在 ” secrets file” 选项指定的文件中。默认情况下无需密码就可以连接模块(也就是匿名方式)。

secrets file      #→该选项指定一个包含定义用户名: 密码对的文件。只有在 ” auth users” 被定义时,该文件才有作用。文件每行包含一个 username:passwd 对。一般来说密码最好不要超过 8 个字符。没有默认的 secures file 名,注意:该文件的权限一定要是 600,否则客户端将不能连接服务器。

hosts allow      #→指定哪些 IP 的客户允许连接该模块。定义可以是以下形式:

    单个 IP 地址,例如:192.167.0.1,多个 IP 或网段需要用空格隔开,

    整个网段,例如:192.168.0.0/24,也可以是 192.168.0.0/255.255.255.0

*”则表示所有,默认是允许所有主机连接。

hosts deny      #→指定不允许连接 rsync 服务器的机器,可以使用 hosts allow 的定义方式来进行定义。默认是没有 hosts deny 定义。

list              #→该选项设定当客户请求可以使用的模块列表时,该模块是否应该被列出。如果设置该选项为 false,

可以创建隐藏的模块。默认值是 true。

timeout   #→通过该选项可以覆盖客户指定的 IP 超时时间。通过该选项可以确保 rsync 服务器不会永远等待一个崩溃的客户端。超时单位为秒钟,0 表示没有超时定义,这也是默认值。对于匿名 rsync 服务器来说,一个理想的数字是 600。

2. 用配置文件定义目录输出。

     [root@xiaolyu76 ~]# vim /etc/rsyncd.conf   // 该配置文件不存在,需要手工编写。

rsync 实现数据备份详解
[root@xiaolyu76 ~]# vim /etc/rsyncd.conf

uid=nobody             #运行进程的身份
gid=nobody             #运行进程的组
address=192.168.31.76  #监听 iP
port=873               #监听端口
hosts allow=192.168.31.77  #允许同步客户端的 IP 地址,可以是网段,或者用 *表示所
use chroot=yes     #是否囚牢,锁定家目录,rsync 被黑之后,黑客无法在 rsync 运行的家目录之外创建文件,选项设置为 yes
max connections=5
pid file=/var/run/rsyncd.pid   #进程 PID,自动生成
lock file=/var/run/rsync.lock  #指 max connectios 参数的锁文件
log file=/var/log/rsyncd.log   #日志文件位置
motd file=/etc/rsyncd.motd     #客户端登陆之后弹出的消息,需要创建
[wwwroot]                 #共享模块名称   
path=/var/www/html  #路径
comment=used for wed-data root #描述
read only=yes  #只读方式(只可以下载)
list=yes   #是否允许查看模块信息
auth users=rsyncuser  #备份的用户,和系统用户无关
secrets file=/etc/rsync.passwd #存放用户的密码文件,格式是   用户名:密码。
rsync 实现数据备份详解

rsync 实现数据备份详解

创建提示文件和用户密码

[root@xiaolyu76 ~]# echo “Welcome to Backup Server” > /etc/rsyncd.motd
[root@xiaolyu76 ~]# echo “rsyncuser:password123” > /etc/rsync.passwd
[root@xiaolyu76 ~]# chmod 600 /etc/rsync.passwd     #目录权限必须是 70 0 或者 600,否则设置 rsync user 的时候,需要身份验证。

rsync 实现数据备份详解

启动服务测试

[root@xiaolyu76 ~]# vim /etc/xinetd.d/rsync

        disable = no        #将原来的 yes 改为 no(部分版本可能是 no,则不用改)

rsync 实现数据备份详解

我们新建了一个配置文件 /etc/rsyncd.conf, 目的是用该配置文件来实现非系统用户实现远程数据备份,就需要让该配置文件生效。

两种方法:

1. 重启 /etc/init.d/xinetd 服务。即:

[root@xiaolyu76 ~]# /etc/init.d/xinetd restart  
Stopping xinetd: [OK]
Starting xinetd: [OK]

 2.  直接把 rsync 以 deamon 方式运行:即:启用方式用 daemon。
[root@xiaolyu76 ~]# rsync –daemon –config=/etc/rsyncd.conf

————————————————————————————————————————————————————–

[root@xiaolyu76 ~]# netstat -antup | grep :873     #查看 873 端口是否启动。
tcp 0 0 192.168.31.76:873 0.0.0.0:* LISTEN 4019/rsync
[root@xiaolyu76 ~]# chkconfig xinetd on              #设置 xinetd 服务开机自启动。
[root@xiaolyu76 ~]# chkconfig xinetd –list          
xinetd 0:off 1:off 2:on 3:on 4:on 5:on 6:off  
[root@xiaolyu76 ~]# 

rsync 实现数据备份详解

开始测试:

rsync 语法:rsync 选项 用户名 @备份源服务器 IP:: 共享模块名 目标目录

 

[root@xiaolyu77 ~]# rsync -avz rsyncuser@192.168.31.76::wwwroot /web-back/

rsync 实现数据备份详解

或者:使用下面的命令,输出详细信息

[root@xiaolyu77 ~]# rsync -avz –progress –delete rsyncuser@192.168.31.76::wwwroot /web-back/

 rsync 实现数据备份详解 

密码处理

新建一个文件保存好密码,然后在 rsync 命令中使用 –password-file 指定此文件即可

 

[root@xiaolyu77 ~]# echo “password123” > ./passfile
[root@xiaolyu77 ~]# chmod 600 passfile
[root@xiaolyu77 ~]# rm -rf /web-back/*
[root@xiaolyu77 ~]# rsync -avz rsyncuser@xiaolyu76::wwwroot –password-file=passfile /web-back/

脚本实现定时自动备份 

[root@xiaolyu77 ~]# vim autobackup.sh 

#!/bin/bash
rsync -avz rsyncuser@xiaolyu76::wwwroot –password-file=passfile /web-back/

rsync 实现数据备份详解

定时自动备份:每天凌晨 3:01 自动进行备份。

[root@xiaolyu77 ~]# echo “01 3 * * * sh /root/autoback.sh &” >> /var/spool/cron/root

rsync 实现数据备份详解

四、Rsync+Inotify 实时同

Linux 内核从 2.6.13 版本开始提供了 inotify 通知接口,用来监控文件系统的各种变化情况,如文件存取、删除、移动等。利用这一机制,可以非常方便地实现文件异动告警、增量备份,并针对目录或文件的变化及时作出响应。可以监控某个用户,什么时间,做了什么动作!

使用 rsync 工具与 inotify 机制相结合,可以实现触发式备份(实时同步),只要原始位置的文档发生变化,则立即启动增量备份操作,否则处于静态等侍状态,这样一来,就避免了按固定周期备份进存在的延迟性、周期过密等问题。

下载地址:http://sourceforge.net/projects/inotify-tools/                 notify-tools-3.13

我们把 xiaolyu76 上 /var/www/html 目录实时同步到 xiaolyu77 的 /web-back 目录中

1. 查看内核支持 inotify 和调整

[root@xiaolyu76~]# uname -r                //inotify 从 kernel2.6.13 开始正式并入内核,开始支持

2.6.32431.el6.x86_64

[root@xiaolyu76 ~]# ls /proc/sys/fs/inotify/                 // 查看调控参数

max_queued_events         #表示监控时间队列           默认 16384 可以使用 cat 命令查看

max_user_instances          #表示最多监控实例数        默认 128

max_user_watches           #表示每个实例最多监控文件数    默认 8192

rsync 实现数据备份详解

# 在 Linux 内核中,默认的 Inotify 机制提供了三种调控参数,当要监控的目录,文件数比较多的时候或者变化比较频

繁的时候,要加大三个数值

可以直接修改 /etc/sysctl.conf 配置文件,将管理队列设置为 32786,实例数:1024,文件数:9000000(大于监控目标总数即可)

[root@xiaolyu76 ~]# vim /etc/sysctl.conf

# 在末尾添加下面三行

fs.inotify.max_queued_events =32768

fs.inotify.max_user_instances =1024

fs.inotify.max_user_watches =90000000

 rsync 实现数据备份详解

 

2. 安装 inotify-tools

安装 inotify-tools 后,将拥有 inotifywait、inotifywatch 辅助工具程序,从而来监控、汇总文件系统改动情况。

[root@xiaolyu76~]# tar xvf inotify-tools-3.13.tar.gz -C /usr/local/src/;echo $?

[root@xiaolyu76 ~]# cd /usr/local/src/inotify-tools-3.13/

[root@xiaolyu76 inotify-tools-3.13]# ./configure –prefix=/usr/local/inotify-tools ; make ; make install ;echo $?

 注意:每一步做完了,要 echo $? 看一下是否成功,尤其是在非常大的源码包安装时。

也可以通过 yum 方式来安装:yum install inotify*  -y  // 傻瓜式安装,哈哈。

3. 测试 inotifywait

       使用 inotifywait 命令监控网站目录 /var/www/html 发生的变化。然后在另一个终端向 /var/www/html 目录下添加文件、移动文件,查看屏幕输出结果。

[root@xiaolyu76 ~]# ln -s /usr/local/inotify-tools/bin/* /usr/bin/        // 方便直接调用命令, 当然了,也可以直接复制到 /usr/bin 下面的。随意啦。

inotifywait 常用参数:

-e  用来指定要监控哪些事件。这些事件包括:create 创建,move 移动,delete 删除,modify 修改文件内容,attrib 属性更改。

-m 表示持续监控

-r  表示递归整个目录

-q 表示简化输出信息。

在监控终端执行下面的命令:

[root@XueGod6 ~]# inotifywait -mrq -e create,move,delete,modify /var/www/html/

另外开一终端,做一些改动

[root@xiaolyu76 ~]# echo “watch rsync” > /var/www/html/watch.html
[root@xiaolyu76 ~]# mkdir /var/www/html/test
[root@xiaolyu76 ~]# cp /etc/passwd /var/www/html/test/
[root@xiaolyu76 ~]# rm -rf /var/www/html/test/passwd

查看监控终端

/var/www/html/ CREATE watch.html
/var/www/html/ MODIFY watch.html
/var/www/html/ CREATE,ISDIR test
/var/www/html/test/ CREATE passwd
/var/www/html/test/ MODIFY passwd
/var/www/html/test/ DELETE passwd

监控端执行命令后,进入监控等待:

rsync 实现数据备份详解

发起终端:

rsync 实现数据备份详解

监控终端变为:

rsync 实现数据备份详解

# 使用 inotifywait 输出的监控结果中,每行记录中依次包括目录、事件、文件。据此可以识别变动情况。

4. 触发式同步脚本

首先要做好免密码链接

 #说明:本质上,scp,rsync 都是 ssh 登录,前面博客已经详细说过 ssh 免密码登录,这里一笔带过。

[root@xiaolyu76 ~]# ssh-keygen

[root@xiaolyu76 ~]# ssh-copy-id root@xiaolyu76

编写脚本

[root@xiaolyu76 ~]#  vim inotify.sh

#!/bin/bash
src=/var/www/html
dest=root@xiaolyu77:/web-back
inotifywait -mrq -e modify,delete, create,attrib  ${src} | while read D E F 
do
    /usr/bin/rsync -avz --delete $src $dest
done

[root@xiaolyu76 ~]# chmod +x inotify.sh ; echo “sh /root/inotify.sh &” >> /etc/rc.local

 说明:上面脚本中的三个变量,就对应

inotifywait -mrq -e modify,delete, create,attrib  ${src} 执行后的结果中的三列,例如:
rsync 实现数据备份详解
只要检测到变动时间,执行 rsync 上行同步操作,拉数据。
脚本执行的检测终端:
rsync 实现数据备份详解

发起变化的终端:

rsync 实现数据备份详解

 

除了上面 rsync + inotify 的备份方法,还有 rsync + sersync。当有海量的小数据文件的时候,inotify 会有延迟!然而,rsync + sersync 也很危险。

当黑���将你的数据删除后,rsync + sersync 后将删除同步更新到你的备份数据。慎用!

本文永久更新链接地址:http://www.linuxidc.com/Linux/2017-06/144901.htm

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计34085字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19350
评论数
4
阅读量
7961004
文章搜索
热门文章
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见zabbix!轻量级自建服务器监控神器在Linux 的完整部署指南

再见 zabbix!轻量级自建服务器监控神器在 Linux 的完整部署指南 在日常运维中,服务器监控是绕不开的...
飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛NAS中安装Navidrome音乐文件中文标签乱码问题解决、安装FntermX终端

飞牛 NAS 中安装 Navidrome 音乐文件中文标签乱码问题解决、安装 FntermX 终端 问题背景 ...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛NAS-11:咪咕视频订阅部署全攻略

星哥带你玩飞牛 NAS-11:咪咕视频订阅部署全攻略 前言 在家庭影音系统里,NAS 不仅是存储中心,更是内容...
【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024程序员】我劝你赶紧去免费领一个AWS、华为云等的主机

【1024 程序员】我劝你赶紧去免费领一个 AWS、华为云等的主机 每年 10 月 24 日,程序员们都会迎来...
飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛NAS玩转Frpc并且配置,随时随地直连你的私有云

飞牛 NAS 玩转 Frpc 并且配置,随时随地直连你的私有云 大家好,我是星哥,最近在玩飞牛 NAS。 在数...
安装并使用谷歌AI编程工具Antigravity(亲测有效)

安装并使用谷歌AI编程工具Antigravity(亲测有效)

  安装并使用谷歌 AI 编程工具 Antigravity(亲测有效) 引言 Antigravity...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

仅2MB大小!开源硬件监控工具:Win11 无缝适配,CPU、GPU、网速全维度掌控

还在忍受动辄数百兆的“全家桶”监控软件?后台偷占资源、界面杂乱冗余,想查个 CPU 温度都要层层点选? 今天给...
150元打造低成本NAS小钢炮,捡一块3865U工控板

150元打造低成本NAS小钢炮,捡一块3865U工控板

150 元打造低成本 NAS 小钢炮,捡一块 3865U 工控板 一块二手的熊猫 B3 工控板 3865U,搭...
浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍

浏览器自动化工具!开源 AI 浏览器助手让你效率翻倍 前言 在 AI 自动化快速发展的当下,浏览器早已不再只是...
星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

星哥带你玩飞牛NAS-16:飞牛云NAS换桌面,fndesk图标管理神器上线!

  星哥带你玩飞牛 NAS-16:飞牛云 NAS 换桌面,fndesk 图标管理神器上线! 引言 哈...
免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

免费无广告!这款跨平台AI RSS阅读器,拯救你的信息焦虑

  免费无广告!这款跨平台 AI RSS 阅读器,拯救你的信息焦虑 在算法推荐主导信息流的时代,我们...