Day39-2-Rsync企业级备份工具讲解

Day39-2-Rsync企业级备份工具讲解

  • 1. 什么是rsync?
  • 2. 什么是全量和增量?
  • 3. 为什么要用rsync?
  • 4. rsync功能特性
  • 5. 增量复制原理
  • 6. rsync三种工作模式介绍
    • 6.1 本地(local)
    • 6.2 远程Shell模式
      • 6.2.1 远程Shell模式企业场景和实践:
      • 6.2.2 企业工作中正常SSH优化
    • 6.3 rsync守护进程模式*****
      • 6.3.1 rsync守护进程模式应用实践
      • 6.3.2 rysnc 服务配置文件参数说明
      • 6.3.3 业务需求:搭建一个备份服务器
      • 6.3.4 在客户端服务器操作(任何一台机器),nfs01

rsync复制软件的应用与实践

1. 什么是rsync?

Rsync英文全称为Remote sync hronization,缩写rsync
是开源、高速的、可实现本地以及远程,全量以及增量的数据复制(拷贝)工具。
官方链接: http://www.samba.org/ftp/rsync/rsync.html(教学翻译功能)

2. 什么是全量和增量?

全量复制:傻傻的每次完整拷贝

[root@backup ~]# cp -a /etc/ /tmp/
[root@backup ~]# touch /etc/oldboy.txt
[root@backup ~]# \cp -a /etc/ /tmp/

增量复制:只拷贝变化的部分

[root@backup ~]# rsync -avz /etc /tmp/
sending incremental file list
etc/
etc/olgirl.txt  #只复制olgirl.txt

rsync首次全量,第二次就增量了。

3. 为什么要用rsync?

1)工作中需要定时/实时数据备份。
2)本地服务器目录、不同机器、
不同机房之间的数据备份。都可以用rsync完成。

生产案例:企业yum源和官方源之间数据传输就使用rsync

# 使用rsync同步Centos yum源
# rsync -av rsync://mirrors.ustc.edu.cn/centos/7/os/x86_64/ /var/ftp/centos7/x86_64/repodata/os
# rsync -av rsync://mirrors.ustc.edu.cn/centos/7/extras/x86_64/ /var/ftp/centos7/x86_64/repodata/extras/
# rsync -av rsync://mirrors.ustc.edu.cn/centos/7/updates/x86_64/ /var/ftp/centos7/x86_64/repodata/updates/

#同步epel源
rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /var/ftp/centos7/x86_64/repodata/epel/

#远程复制测试:
rsync -avz rsync://rsync.mirrors.ustc.edu.cn/repo/centos/ /var/ftp/centos7/x86_64/repodata/epel/
[root@oldboy yum.repos.d]# ls /var/ftp/centos7/x86_64/repodata/epel/ -a
.    4.1   5.3   6.6       8                           RPM-GPG-KEY-CentOS-Official
..   4.2   5.4   6.7       8-stream                    RPM-GPG-KEY-CentOS-Security-6
2    4.3   5.5   6.8       8.0.1905                    RPM-GPG-KEY-CentOS-Testing-6

4. rsync功能特性

  • 支持拷贝普通文件与特殊文件,如链接文件,设备文件等。
  • 支持排除指定文件或目录同步的功能,相当于打包命令tar的排除功能。
  • 可以做到保持原文件或目录的权限、时间、软硬链接、属主、组等所有属性均不改变。
  • 可实现增量复制,既只复制发生变化的数据,因此数据传输效率很高。
  • 可以使用rcp,rsh,ssh等方式来配合进行隧道加密传输文件(rsync本身不对数据加密)。
  • 可以通过socket(进程方式)传输文件和数据(服务端和客户端)*。
  • 支持匿名或认证(无需系统用户)进程模式传输,安全的进行数据备份及镜像

5. 增量复制原理

使用quick check算法,只对增量的部分复制,根据大小属性的变化进行复制。
Rsync使用“快速检查”算法(默认情况下)查找需要传输的文件,该算法查找大小或上次修改时间已更改的文件。当快速检查表明不需要更新文件的数据时,其他保留属性的任何更改(根据选项的要求)都会直接在目标文件上进行。

#该算法查找大小或上次修改时间已更改的文件 *

2.x比对差异后复制,3.x一边比对一边复制。

其他:
链接: https://coolshell.cn/articles/7425.html

6. rsync三种工作模式介绍

Local:
    rsync [OPTION...] SRC... [DEST]
	
Access via remote shell:
    Pull:
        rsync [OPTION...] [USER@]HOST:SRC... [DEST]
    Push:
        rsync [OPTION...] SRC... [USER@]HOST:DEST


Access via rsync daemon:
    Pull:
        rsync [OPTION...] [USER@]HOST::SRC... [DEST]
        rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
    Push:
        rsync [OPTION...] SRC... [USER@]HOST::DEST
        rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST)

6.1 本地(local)

rsync就是一个命令

rsync	   [OPTION...]	      SRC...	    [DEST]
rsync命令	参数选项	      [源目录或文件]	   目的目录或文件

命令操作:
rsync命令
a.把数据从一个地方复制到另一个地方(仅在一台机器增量),相当于cp。
b.通过加参数实现删除文件和清空文件内容的功能,相当于rm命令。
c.查看属性信息功能,相当于ls。

a.拷贝实践

#该算法查找大小或上次修改时间已更改的文件 *****
rsync -avz /etc /opt/
touch /etc/test.txt
rsync -avz /etc /opt/
echo 111 >/etc/test.txt 
rsync -avz /etc /opt/
chmod 777 /etc/test.txt 
rsync -avz /etc /opt/
chown -R oldboy.oldboy /etc/test.txt
rsync -avz /etc /opt/
vim /etc/test.txt 
rsync -avz /etc /opt/
vim /etc/test.txt 
rsync -avz /etc /opt/

[root@backup ~]# ls /opt
[root@backup ~]# rsync /etc/hosts /opt
[root@backup ~]# ls /opt
hosts
[root@backup ~]# \cp /etc/hosts /opt

保持属性:

[root@backup ~]# rsync -vzrtopg /etc/hosts /opt/ #rtopg==a
[root@backup ~]# ls -lhi /etc/hosts /opt/hosts
16829878 -rw-r--r--. 1 root root 332 412 11:24 /etc/hosts
   71373 -rw-r--r--  1 root root 332 412 11:24 /opt/hosts

b.删除实践

删除文件内容:

[root@backup ~]# cp /etc/hosts /tmp/
[root@backup ~]# rsync -avz /null.txt /etc/host
host.conf    hostname     hosts        hosts.allow  hosts.deny   
[root@backup ~]# rsync -avz /null.txt /etc/host
host.conf    hostname     hosts        hosts.allow  hosts.deny   
[root@backup ~]# rsync -avz /null.txt /etc/hosts
sending incremental file list
null.txt
[root@backup ~]# cat /etc/hosts

恢复:

[root@backup ~]# \cp /tmp/hosts /etc/
[root@backup ~]# cat /etc/hosts

删除目录下所有文件:

[root@backup ~]# mkdir /null
[root@backup ~]# rsync -r --delete /null/ /opt/       #让后面opt和前面null目录内容保持一致
[root@backup ~]# ls /opt/

c.查看属性

[root@backup ~]# rsync /etc/hosts
-rw-r--r--            332 2019/04/12 11:24:41 hosts

注意事项:
拷贝的时候,永远要注意目标目录和文件,防止被清空。

6.2 远程Shell模式

借助类似ssh隧道传输数据,适合不同的机器之间复制。
异地拷贝,相当于scp,区别scp是远程全量拷贝)

企业场景:
1.重要的数据,需要加密;
2.没有搭建服务端

拉门、推门 思考:
pull,拉:从远端拉取到本地。

语法:

rsync	    [OPTION...]	[USER@]HOST:SRC...	             [DEST]
rsync命令	参数选项	[认证用户]@[主机地址]:[源路径]	 本地路径

语法:

push,推:从本地推到远端。
rsync	    [OPTION...]   SRC... 	 [USER@]HOST:[DEST]        
rsync命令	参数选项	本地路径 [认证用户]@[主机地址]:[目标路径]

push实践:
没用隧道:

rsync -avz /etc/hosts root@172.16.1.31:/opt/ #加密传输,限制root。
rsync -avz /etc/hosts oldboy@172.16.1.31:/tmp/ #加密传输,限制root。

使用隧道;

rsync -avz /etc/hosts -e "ssh -p 22" root@172.16.1.31:/opt/
rsync -avz /etc -e "ssh -p 22" oldboy@172.16.1.31:/tmp/
#上述命令是等价的。-e 指定通道  ssh ssh服务连接客户端  -p 22指定22端口。

拉的命令:

rsync -avz root@172.16.1.41:/opt/hosts /opt
rsync -avz -e "ssh -p 22" root@172.16.1.41:/opt/hosts /opt

拉的实践:
没用隧道:

rsync -avz  root@172.16.1.31:/opt/ /tmp #加密传输,限制root。
rsync -avz  oldboy@172.16.1.31:/tmp/  /tmp #加密传输,限制root。

使用隧道:

rsync -avz -e "ssh -p 22" root@172.16.1.31:/opt/ /tmp
rsync -avz -e "ssh -p 22" oldboy@172.16.1.31:/tmp/ /tmp
#上述命令是等价的。-e 指定通道  ssh ssh服务连接客户端  -p 22指定22端口。

推拉:
a.参照物,你执行命令的机器
b.root@172.16.1.31 连接的用户和主机,使用连接的主机和用户的密码。

6.2.1 远程Shell模式企业场景和实践:

1)配合SSH+免秘钥连接登录(单向从私钥到公钥),进行备份文件传输工作。
两台机器连接不需要密码了,rsync拷贝的时候自然随意拷贝了。

实践:nfs01作为主机操作
1.生成秘钥对

ssh-keygen  #一路回车

2.把公钥拷贝到41服务器

ssh-copy-id -i ~/.ssh/id_rsa.pub 10.0.0.41
1)放到41的~/.ssh/下。
2)公钥被改名为authorized_keys 
3)authorized_keys 权限为600,~/.ssh/权限700

为什么改名为authorized_keys?

[root@backup ~]# grep authorized_keys /etc/ssh/sshd_config
AuthorizedKeysFile	.ssh/authorized_keys

4.从31连接41,无需密码即可登录

[root@nfs01 ~]# ssh 10.0.0.41 #ssh类似xshell。
Last login: Mon Jun 28 11:47:41 2021
[root@backup ~]# 

5.测试

# 不加密拉取
rsync -avz root@172.16.1.41:/opt/ /tmp #加密传输,限制root。
# 加密推送
rsync -avz /etc -e "ssh -p 22" root@172.16.1.41:/opt/

实现了免密码数据传输。企业中利用定时任务等实现定时推送,或者
使用实时复制工具sersync实现,数据的实时复制。

强调一个重点:适合rsync
null和null/区别,null是目录和目录下的内容,
null/只是目录下的内容,不含本身。

下面方法不可用,所以,此命令只能手工输入密码了(expect工具帮你交互输入密码)

[root@backup ~]# echo 123456 >/etc/rsync_shell.password
[root@backup ~]# chmod 600 /etc/rsync_shell.password
rsync -avz /etc -e "ssh -p 22" oldboy@172.16.1.31:/tmp/ --password-file=/etc/rsync_shell.password

特殊提醒:

6.2.2 企业工作中正常SSH优化

####by oldboy#2011-11-24##
Port 52113
ListenAddress 172.16.1.7:52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
####by oldboy#2011-11-24##
0.0.0.0:22 表示sshd服务监听任意网卡,监听所有IP请求。

#期中架构中修改:
vim /etc/ssh/sshd_config
####by oldboy#2011-11-24##
PermitRootLogin yes
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
####by oldboy#2011-11-24##
[root@backup ~]# sed -i.bak 's#PermitRootLogin no#\# PermitRootLogin yes#g' /etc/ssh/sshd_config
[root@backup ~]# grep RootLo /etc/ssh/sshd_config
# PermitRootLogin yes

企业常用参数组合:-avz或者-vzrtopg

6.3 rsync守护进程模式*****

首先要搭建rsync服务端(要有守护进程),然后才能在客户端实现推拉数据。
企业运维的重要模式,重点讲。
客户端语法暂时不讲。
rsync服务模式:*****开启后台进程,接受别人访问。

6.3.1 rsync守护进程模式应用实践

1)安装(不需要安装)

[root@backup ~]# rsync --version
rsync  version 3.1.2  protocol version 31
[root@backup ~]# yum install rsync(不需要)

2)配置配置文件【/etc/rsyncd.conf】
备份

cp /etc/rsyncd.conf{,.ori}
cat>/etc/rsyncd.conf<<EOF
#rsync_config_______________start      注释
#created by oldboy                     注释
#site: http://www.oldboyedu.com        注释
uid = rsync                 #用户,rsync访问本地数据目录的一个用户
gid = rsync                 #用户组
use chroot = no             #安全选项,防止出现漏洞
max connections = 200       #并发最大连接数
timeout = 600               #进程超时时间
pid file = /var/run/rsyncd.pid     #进程ID号
lock file = /var/run/rsync.lock    #锁文件
log file = /var/log/rsyncd.log     #
ignore errors
read only = false
list = false
hosts allow = 172.16.1.0/24
hosts deny = 0.0.0.0/32
auth users = rsync_backup
secrets file = /etc/rsync.password
[backup]
comment = welcome to oldboyedu backup!
path = /backup/
EOF

6.3.2 rysnc 服务配置文件参数说明

rsyncd.conf 参数参数说明
uid = rsyncrsync 服务用户。默认为 nobody,这里用 rsync 虚拟用户,管理备份目录
gid = rsyncrsync 服务用户组。默认为 nobody,这里用管理备份目录
fake super= yes允许进程不以 root 身份运行,就可以改变文件属性(C7 环境加此参数)。
use chroot = no如果为 true, daemon 会在给客户端传输文件前"chroot to the path"。这是 rsync 安全的一个配置,因为我们大多数都是在内网使用 rsync,所以不配也可以
max connections =200设置最大连接数.默认为 0,意为无限制.负值为关闭这个模块
timeout = 400默认为 0,意 no timeout,建议为 300-600(5-10 分钟)
pid file = /var/run/rsyncd.pidrsync daemon 启动后将其进程 PID 写入此文件。如果这个文件已经存在,rsync进程不会覆盖该文件,而是会终止
lock file =/var/run/rsyncd.lock指定 lock 文件用来支持"max connections"参数,使得总连接数不会超过限制,默认为/var/run/rsyncd.lock
log file = /var/log/rsyncd.log不设或者设置错误,rsync 会使用 syslog 输出相关日志信息
ignore errors忽略 I/0 错误
read only = false指定客户端是否可以上传文件,默认对所有模块都为 true 即表示可写
list = false是否允许客户端可以查看可用模块列表.默认为可以如果配置为 yes 或 true执行 rsync 172.16.1.41::命令都会显示配置的模块信息
hosts allow = 172.16.1.0/24指定可以联系的客户端主机名或和ip地址或地址段,默认情况没有此参数即都可以连接。表示配置白名单参数。
hosts deny =0.0.0.0/32指定不可以联系的客户端主机名或和ip地址或地址段,默认情况没有此参数,即都可以连接。表示配置黑名单参数
auth users = rsync backup指定以空格或逗号分隔的用户可以使用哪些模块.用户不需要在本地系统中存在.默认所有用户无密码的访问(anonymous rsync)
secrets file = /etc/rsync.password指定用户名和密码存放的文件,格式为,用户名:密码
[backup]这里就是模块名称,需用中括号扩起来,起名称没有特殊要求,但最好是有意义的名称,便于以后维护
path = /backup在这个模块中,daemon 使用的文件系统或目录,目录的权限要注意和配置文件中的权限一致,否则会遇到读写的问题
#exclude = a c b/2排除的文件或目录,相对路径
[oldboy]除了 backup 模块外,还可以添加模块,例如 oldboy
path = /oldboyoldboy 模块对应的备份路径

#配置文件查帮助
man rsyncd.conf 查配置参数
https://www.samba.org/ftp/rsync/rsync.html

6.3.3 业务需求:搭建一个备份服务器

3)备份的地点 /backup

mkdir /backup -p

4)创建一个用户

[root@backup ~]# useradd -s /sbin/nologin -M rsync
[root@backup ~]# id rsync
uid=1003(rsync) gid=1003(rsync)=1003(rsync)

5)授权rsync管理backup目录

chown -R rsync.rsync /backup
[root@backup ~]# 
[root@backup ~]# ls -ld /backup/
drwxr-xr-x 2 rsync rsync 6 628 16:58 /backup/

6)创建密码文件并设置权限

# 格式:用户:密码
rsync_backup:oldboy123
echo "rsync_backup:oldboy123" >/etc/rsync.password 
#文件名随意起,但是要和rsyncd.conf secrets file = /etc/rsync.password一致。

[root@backup ~]# echo "rsync_backup:oldboy123" >/etc/rsync.password #文件名随意起
[root@backup ~]# cat /etc/rsync.password
rsync_backup:oldboy123

# 设定权限:
chmod 600 /etc/rsync.password 
ls -l /etc/rsync.password

7)启动rsync服务和检查

rsync --daemon(c6及以前)#本次不执行,用下面的C7的命令
systemctl start rsyncd
systemctl enable rsyncd
systemctl status rsyncd

[root@backup ~]# ps -ef|grep sync|grep -v grep  #检查进程
root       7521      1  0 11:39 ?        00:00:00 /usr/bin/rsync --daemon --no-detach

[root@backup ~]# netstat -lntup|grep rsync #检查端口
tcp        0      0 0.0.0.0:873             0.0.0.0:*               LISTEN      7521/rsync          
tcp6       0      0 :::873                  :::*                    LISTEN      7521/rsync 
         
[root@backup ~]# lsof -i :873 #检查端口
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
rsync   7521 root    3u  IPv4  41439      0t0  TCP *:rsync (LISTEN)
rsync   7521 root    5u  IPv6  41440      0t0  TCP *:rsync (LISTEN)
# 面试题:如何查看某端口对应什么服务?答案就是上面两个。

rsync服务端配置完成。

6.3.4 在客户端服务器操作(任何一台机器),nfs01

1.配置认证密码文件并授权
以下方法2选1
方法1:认证密码文件

[root@nfs01 ~]# echo "oldboy123" >/etc/rsync.password #只有密码,没有用户,密码和服务的配置相同。
[root@nfs01 ~]# chmod 600 /etc/rsync.password
[root@nfs01 ~]# cat /etc/rsync.password
oldboy123
[root@nfs01 ~]# ls -l /etc/rsync.password
-rw------- 1 root root 7 415 11:55 /etc/rsync.password

方法2:

[root@nfs01 ~]# echo ' export RSYNC_PASSWORD=oldboy123' >>/etc/bashrc 
[root@nfs01 ~]# tail -1 /etc/bashrc 
 export RSYNC_PASSWORD=oldboy
[root@nfs01 ~]# . /etc/bashrc 
[root@nfs01 ~]# echo $RSYNC_PASSWORD
oldboy123

2.测试完成结果
1)守护进程模式,客户端rsync的命令语法:
配置服务器端守护进程,实现数据传输:

1、服务器端守护进程。2、客户端执行命令。
拉门、推门 思考:

pull,拉:从远端拉取到本地。
语法1(常用):
rsync	    [OPTION...]	[USER@]HOST::SRC...	                 [DEST]
rsync命令	参数选项	[虚拟用户]@[主机地址]::[模块名]	     本地路径

语法2:
rsync	    [OPTION...]	rsync://[USER@]HOST::SRC...	              [DEST]
rsync命令	参数选项	rsync://[虚拟用户]@[主机地址]/[模块名]	 本地路径


push,推:从本地推到远端。
语法1(常用):                 
rsync	    [OPTION...]	  [DEST]        [USER@]HOST::SRC...	                 
rsync命令	参数选项	  本地路径      [虚拟用户]@[主机地址]::[模块名]	     

语法2:                    
rsync	    [OPTION...]	   [DEST]		rsync://[USER@]HOST::SRC...	             
rsync命令	参数选项	  本地路径		rsync://[虚拟用户]@[主机地址]/[模块名]	 

2)拉取实践
方法1:

mkdir /data
rsync -avz rsync_backup@172.16.1.41::backup /data --password-file=/etc/rsync.password

[root@nfs01 ~]# rsync -avz rsync_backup@172.16.1.41::backup /data --password-file=/etc/rsync.password
receiving incremental file list
./
oldboy1/
oldboy2/
oldboy3/

sent 39 bytes  received 140 bytes  358.00 bytes/sec
total size is 0  speedup is 0.00
[root@nfs01 ~]# ls /data
oldboy1  oldboy2  oldboy3

成功拉回。

方法2:不常用

[root@nfs01 ~]# rsync -avz rsync://rsync_backup@172.16.1.41/backup /data --password-file=/etc/rsync.password

3)推送实践
方法1:

rsync -avz  /data  rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password

方法2:

rsync -avz  /data  rsync://rsync_backup@172.16.1.41/backup --password-file=/etc/rsync.password

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452975.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue.js 页面中设置多个swiper

效果&#xff1a; 设置主要设置了 动态的 包含类、 左右按钮的类 <template><div class"swiper-container_other"><!-- 右侧按钮 --><div :class"[(id)?swiper-button-nextid:swiper-button-next, swiper-button-next]"></div…

每日一题 第一期 洛谷 铺地毯

[NOIP2011 提高组] 铺地毯 https://www.luogu.com.cn/problem/P1003 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n n n 张地毯&#xff0c;编号从 1 …

探秘C语言扫雷游戏实现技巧

本篇博客会讲解&#xff0c;如何使用C语言实现扫雷小游戏。 0.思路及准备工作 使用2个二维数组mine和show&#xff0c;分别来存储雷的位置信息和排查出来的雷的信息&#xff0c;前者隐藏&#xff0c;后者展示给玩家。假设盘面大小是99&#xff0c;这2个二维数组都要开大一圈…

北京公司注册地址想要迁到新疆该如何操作

尊敬的客户&#xff0c;您好&#xff01;我是经典世纪胡云帅&#xff08;游览器搜经典世纪胡云帅&#xff09;&#xff0c;您选择了北京经典世纪集团有限公司-资 质代办&#xff0c;我们将竭诚为您服务&#xff01;如果您的公司注册地址想要迁到新疆&#xff0c;这里有一些重要…

SSM整合和实战练习笔记1

SSM整合和实战练习1 SSM整合和实战练习springmvc配置业务层 service aop tx的配置mybatis整合配置&#xff08;方式2容器初始化配置类访问测试mapper层service层controller层前端程序搭建 SSM整合和实战练习 springmvc配置 业务层 service aop tx的配置 mybatis整合配置&#…

亲测抖音小程序备案流程,抖音小程序如何备案,抖音小程序备案所需准备资料

抖音小程序为什么要备案&#xff0c;抖音官方给出如下说明&#xff1a; 1、2024年3月15日后提交备案的小程序将不保证2024年3月31日前平台可初审通过&#xff1b; 2、2024年3月31日后未完成备案小程序将被下架处理。 一&#xff0c;备案前需准备资料 &#xff08;一&#xff0…

bpmn-js系列之Palette

前边写了四篇文章介绍了bpmn.js的基本使用&#xff0c;最近陆续有小伙伴加我催更&#xff0c;感谢对我这个半吊子前端的信任&#xff0c;接着更新bpmn.js的一些高级用法&#xff0c;本篇介绍对左侧工具栏Palette的隐藏和自定义修改 隐藏shape 左侧工具栏Palette有些图标我用不…

【数据挖掘】实验2:R入门2

实验2&#xff1a;R入门2 一&#xff1a;实验目的与要求 1&#xff1a;熟悉和掌握R数据类型。 2&#xff1a;熟悉和掌握R语言的数据读写。 二&#xff1a;实验内容 1&#xff1a;R数据类型 【基本赋值】 Eg.1代码&#xff1a; x <- 8 x Eg.2代码&#xff1a; a city …

碳实践 | 基于“界、源、算、质、查”五步法,实现企业组织碳核算

碳排放核算是夯实碳排放统计的基础&#xff0c;提高碳排放数据质量的关键&#xff0c;同时&#xff0c;将推动能耗“双控”向碳排放“双控”转变。总体来看&#xff0c;碳核算分为区域层面、组织层面和产品层面的碳核算&#xff0c;这三个层面的意义和计算方法完全不同。本文将…

【高通camera hal bug分析】高通自带相机镜像问题

首先打了两个log&#xff0c;一个是开启镜像的log&#xff0c;还有一个是没有开启镜像的log&#xff0c;如果我们开启镜像以后&#xff0c;观察开启镜像log发现 , 这段代码走的没有任何问题&#xff0c;因为Flip的值等于1了。 关闭镜像log如下&#xff1a; 如果我们不开启镜像…

<机器学习初识>——《机器学习》

目录 一、人工智能概述 1 人工智能应用场景 2 人工智能发展必备三要素 3 人工智能、机器学习和深度学习 二、人工智能发展历程 1 人工智能的起源 1.1 图灵测试 1.2 达特茅斯会议 2 发展历程 三、 人工智能主要分支 1 主要分支介绍 1.1 分支一&#xff1a;计算机视觉…

STM32点亮LED灯与蜂鸣器发声

STM32之GPIO GPIO在输出模式时可以控制端口输出高低电平&#xff0c;用以驱动Led蜂鸣器等外设&#xff0c;以及模拟通信协议输出时序等。 输入模式时可以读取端口的高低电平或电压&#xff0c;用于读取按键输入&#xff0c;外接模块电平信号输入&#xff0c;ADC电压采集灯 GP…

基于Springboot的驾校预约学习系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的驾校预约学习系统&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构…

ubuntu2004桌面系统英伟达显卡驱动安装方法

#如何查看显卡型号 lspci | grep -i vga#----output------ 01:00.0 VGA compatible controller: NVIDIA Corporation Device 1f06 (rev a1)根据 Device 后的 值 进入网站查询 pci-ids.ucw.cz/mods/PC/10de?actionhelp?helppci #根据显卡型号&#xff0c;下载对应系统的驱动…

C++ 作业 24/3/12

1、自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height),定义公有成员函数: 初始化函数:void init(int w, int h)更改宽度的函数:set_w(int w)更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <iostream>using …

一劳永逸的方法解决:LNK1168无法打开 xxx.exe 进行写入 报错问题

这种错误的产生原因&#xff1a; 运行程序退出不是按正常流退出&#xff0c;是按窗口右上角的 “X” 来关闭程序&#xff0c;但是后台的xxx.exe控制台程序还在运行&#xff1b;修改程序的代码后再运行&#xff0c;就会报LNK1168的错误&#xff1b; 报错示例&#xff1a; 解决方…

【嵌入式学习】C++day03.12

一、思维导图 二、练习 #include <iostream>using namespace std;class Rect {int width;int height; public:void init(int w,int h){widthw;heighth;}void set_w(int w){widthw;}void set_h(int h){heighth;}void show(){int per2*(widthheight);int areawidth*height;…

通过el-select选择器和el-tree树形结构二次封装(vue2+elementUI),开发element-plus的TreeSelect树形选择器

需求&#xff1a; 领导看我在另一个vue3项目的el-tree-select挺好的&#xff0c;叫我移入vue2的项目中。 但是vue2版本的elementUI&#xff0c;并没有这个组件&#xff0c;所以只能自己找&#xff0c;找半天找不到和它差不多的&#xff0c;通过网友写的组件改写的 参考链接&…

手势学习

1. 点击手势 Composable fun ClickableSample() {val number remember {mutableStateOf(0)}Text(text number.value.toString(),textAlign TextAlign.Center,modifier Modifier.wrapContentSize().clickable {number.value}.background(Color.LightGray).padding(horizonta…

软件I2C读写MPU6050

文章目录 前言本次线路图封装I2C时序封装MPU6050,配置寄存器最后在主函数进行显示 前言 本片文章开始进行I2C在STM32的直接操作&#xff0c;理解时序的代码实现&#xff0c;理解对寄存器的配置&#xff0c;使用I2C读写MPU6050&#xff0c;读取MPU6050的各轴数据。 MPU6050详解…