Ubuntu18.04 实现rsync+inotify 实时同步文件

2024-05-04 07:58

本文主要是介绍Ubuntu18.04 实现rsync+inotify 实时同步文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一、前言
在分布式系统中通常要用到文件同步功能,一是为了备份,另一个原因则是用于代码的一致性。
(一)rsync
与传统的cp、tar备份方式相比,rsync具有安全性高、备份迅速、支持增量备份等优点,通过rsync可以解决对实时性要求不高的数据备份需求,例如定期的备份文件服务器数据到远端服务器,对本地磁盘定期做数据镜像等。
随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,虽然它可以通过linux守护进程的方式进行触发同步,但是两次触发动作一定会有时间差,这样就导致了服务端和客户端数据可能出现不一致,无法在应用故障时完全的恢复数据。基于以上原因,rsync+inotify组合出现了!

(二)inotify
Inotify 是一种强大的、细粒度的、异步的文件系统事件监控机制,linux内核从2.6.13起,加 入了Inotify支持,通过Inotify可以监控文件系统中添加、删除,修改、移动等各种细微事件,利 用这个内核接口,第三方软件就可以监控文件系统下文件的各种变化情况,而inotify-tools就是这 样的一个第三方软件。

二、rsync安装及配置
(一)备份服务器【192.168.2.20】
(需要备份的文件将同步到此服务器上,即从该主服务器上同步过来进行备份)
1.安装rsync
sudo apt-get install rsync

2.修改 /etc/default/rsync
sudo vim /etc/default/rsync

可以看到对于服务的默认配置,修改以下配置
RSYNC_ENABLE=true
RSYNC_CONFIG_FILE = ‘/etc/rsync/rsyncd.conf’

3.为了方便管理,添加rsync 文件同步的配置目录(目录可以自定义,没有规定)
sudo mkdir -p /etc/rsync/

4.建立同步时的密码文件rsyncd.secrets,并设置为600权限(必须),在里面放用户名和密 码
复制下面语句在shell命令行执行:
cat > /etc/rsync/rsyncd.secrets << EOF
#/etc/rsync/rsyncd.secrets
www-data:123456A
EOF

设置权限(必须的)
Chmod 600 /etc/rsync/rsyncd.secrets

5.修改配置文件/etc/rsync/rsyncd.conf

cp /usr/share/doc/rsync/examples/rsyncd.conf /etc/rsync/
*Vi /etc/rsync/rsyncd.conf
=====
*
# sample rsyncd.conf configuration file
# GLOBAL OPTIONS

#motd file=/etc/motd
log file=/var/log/rsyncd
# for pid file, do not use /var/run/rsync.pid if
# you are going to run rsync out of the init.d script.
# The init.d script does its own pid file handling,
# so omit the “pid file” line completely in that case.

pid file=/var/run/rsyncd.pid
#syslog facility=daemon
#socket options=
# MODULE OPTIONS

[www-data]
# 指定同步目录
comment = public archive
# 确定/var/www/pub目录存在,否则将会报错
path = /var/www/pub
use chroot = yes
# max connections=10
lock file = /var/lock/rsyncd
# the default for read only is yes…
# 不只是读,还要写权限
read only = no
list = yes
uid = www-data
gid = www-data
# exclude =
# exclude from =
# include =
# include from =
#指定同步校验用户(与主服务中用于同步时用户相同)
auth users = www-data
#指定同步校验用户时的密码文件
fake super = yes
secrets file = /etc/rsync/rsyncd.secrets
strict modes = yes
#指定host(主服务器IP)
hosts allow = 192.168.2.18
# hosts deny =
ignore errors = no
ignore nonreadable = yes
transfer logging = yes
log format = %t: host %h (%a) %o %f (%l bytes). Total %b bytes.
timeout = 600
refuse options = checksum dry-run
dont compress = *.gz *.tgz *.zip *.z *.rpm *.deb *.iso *.bz2 *.tbz

6.启动服务
/etc/init.d/rsync restart
/etc/init.d/rsync status

(二)主服务器【192.168.2.18】
(重要文件的原文件在此服务器上。将同步到192。168.2.20服务器上,进行备份)
1.安装rsync
sudo apt-get install rsync

2.修改 /etc/default/rsync
sudo vim /etc/default/rsync

可以看到对于服务的默认配置,修改以下配置
RSYNC_ENABLE=true

3.为了方便管理,添加rsync 文件同步的配置目录(目录可以自定义,没有规定)
sudo mkdir -p /etc/rsync/

4.建立密码文件rsyncd.secrets,并设置为600权限(必须),在里面只放密码
复制下面语句在shell命令行执行:
cat > /etc/rsync/rsyncd.secrets << EOF
123456A
EOF

设置权限(必须要这样设定)
Chmod 600 /etc/rsync/rsyncd.secrets

5.验证主从连接状态(在192.168.2.18上运行)
rsync -vzrtopg --progress www-data@192.168.2.20::www-data --password-file=/etc/rsync/rsyncd.secrets

rsync -vzrtopg --progress mysql@172.18.1.26::mysql --password-file=/etc/rsync/rsyncd.secrets

6.测试拉取的同步效果 (方向从备用192.168.2.20到主用192.168.2.18,以192.168.2.20为原版)
验证将192.168.2.20服务器上的/var/www/pub目录中的文件,同步到本地/etc/rsync/temp目录下

在192.168.2.18服务器上,执行同步语句
rsync -avz Pt --password-file=/etc/rsync/rsyncd.secrets www-data@192.168.2.20::www-data /etc/rsync/temp
注意:
–delete :以SRC为主,对DEST进行同步。多则删之,少则补之。
例如:
rsync -avzPt --delete --password-file=/etc/rsync/rsyncd.secrets www-data@192.168.2.20::www-data /etc/rsync/temp
该语句执行后,会以192.168.2.20服务器指定目录为标准,在192.168.2.18服务器上同步时进行比较。192.168.2.20上有的新文件,会同步到192.168.2.18服务器上;同时192.168.2.20已有的文件进行了删除,192.168.2.18服务器上该文件也会进行删除。

7.测试推送同步效果(方向从192.168.2.18到192.168.2.20,以192.168.2.18为原版)
rsync -avzP --progress /etc/rsync/temp/ www-data@192.168.2.20::www-data --password-file=/etc/rsync/rsyncd.secrets

8.其他

(三)使用计划任务定时执行(简单的方式)
Crontab -e
在其中加入如下语句并保存退出

每天凌晨5点进行同步

0 5 * * * rsync -a --password-file=/etc/rsync/rsyncd.secrets www-data@192.168.2.20::www-data /etc/rsync/temp

(四)其他
三、rsync+inotify实时同步配置
(一)安装inotify
inotify将安装在主服务器【192.168.2.18】上。之后与rsync配合一起使用
1.查看是否安装inotify
ls /proc/sys/fs/inotify
如果能看到max_queued_events max_user_instances max_user_watches,三个值的话说明已经安装了

2.安装inotify
apt-get update
apt-get install inotify-tools

安装完成后,inotifywait默认路径为
/usr/bin/inotifywait
3.其他

(二)创建rsync复制脚本
此项功能主要是将server端的指定目录/var/log/mysql里的内容,如果修改了(无论是添加、修改、删除文件)能够通过inotify监控到,并通过rsync实时的同步给client的/var/www/pub里(这个目录在备用服务器192.168.2.18的/etc/rsync/rsync.conf里的path = /var/www/pub),下面是通过shell脚本实现的。
在/etc/rsync目录下,新建一个rsync.init.sh脚本,内容如下:
#!/bin/bash

# 设定日期 (年月日时分秒)
DATE=date +"%Y-%m-%d %H:%M:%S"

# 设定日期 (年月日时)
DAY=date +"%Y%m%d"

# 判断/var/log/rsync文件夹是否存在,不存在则新建
log_path=/var/log/rsync

if [ ! -d “$log_path” ];then
mkdir -p $log_path
fi

## 设定从服务器的IP
host=192.168.2.20

## 指定本地重要文件的目录(需要备份的文件)
src=/var/log/mysql
# 指定模块
dst_module=www-data

# 指定用户名
user=www-dat
# 指定本地密码文件
rsync_passwd=/etc/rsync/rsyncd.secrets

/usr/bin/inotifywait -mrq --timefmt ‘%d/%m/%y %H:%M’ --format ‘%T %w%f%e’ -e modify,delete,create,attrib s r c ∣ w h i l e r e a d f i l e s d o / u s r / b i n / r s y n c − v z r t o p g − − d e l e t e − − p r o g r e s s − − p a s s w o r d − f i l e = src | while read files do /usr/bin/rsync -vzrtopg --delete --progress --password-file= srcwhilereadfilesdo/usr/bin/rsyncvzrtopgdeleteprogresspasswordfile=rsync_passwd s r c w w w − d a t a @ 192.168.2.20 : : w w w − d a t a e c h o " src www-data@192.168.2.20::www-data echo " srcwwwdata@192.168.2.20::wwwdataecho"{files} was rsynced" >> l o g p a t h / r s y n c . log_path/rsync. logpath/rsync.DAY.log 2>&1
done
修改脚本权限:
chmod 755 /etc/rsync/rsync.init.sh

(三)设置/etc/rsync/rsync.init.sh随服务器自动启动
编辑 /etc/rc.local文件,在 exit0 的前面一行,加入如下语句
/bin/bash /etc/rsync/rsync.init.sh > /dev/null 2>&1 &
特别申明:
/etc/rc.local 文件在ubuntu18系统里,默认是没有的。!!!
随机启动的功能是需要自己手动设置才会有的,方法如下:
复制如下五句,每一句单独在shell命令行执行:
1.创建软连接
ln -sf /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

  1. 添加一句命令行
    cat >>/etc/systemd/system/rc-local.service<<EOF
    [Install]
    WantedBy=multi-user.target
    Alias=rc-local.service
    EOF

3.创建rc.local文件并 赋权
touch /etc/rc.local && chmod 755 /etc/rc.local

4.导入必要的语句
cat >>/etc/rc.local<<EOF
#!/bin/bash
/bin/bash /etc/rsync/rsync.init.sh > /dev/null 2>&1 &
exit 0
EOF

5.重新加载服务
systemctl daemon-reload

(四)小结
1.由主向从推送同步文件,在主服务中不用配置同步配置文件,他只提供同步功能就可以。
2.在主服务器中要通过infotifywait 来实时监控要同步的文件。
3.在其他从服务器中要配置同步配置文件,并提供用户:密码格式的密码文件与配置文件中对应的用户。
4.inotify 服务会在多文件时报观察数太少问题,应该对/proc/sys/fs/inotify/max_user_watches下的值进行修改,以便填加观察数。
5.实时同步的同时为了提高同步文件的完整性,应在定时器中添加全量同步。
(五)其他

四、rsync命令说明
(一)rsync 选项说明和示例
-v:显示rsync过程中详细信息。可以使用"-vvvv"获取更详细信息。
-P:显示文件传输的进度信息。(实际上"-P"="–partial --progress",其中的"–progress"才 是显示进度信息的)。
-n --dry-run :仅测试传输,而不实际传输。常和"-vvvv"配合使用来查看rsync是如何工作的。
-a --archive :归档模式,表示递归传输并保持文件属性。等同于"-rtopgDl"。
-r --recursive:递归到目录中去。
-t --times:保持mtime属性。强烈建议任何时候都加上"-t",否则目标文件mtime会设置为系 统时间,导致下次更新
:检查出mtime不同从而导致增量传输无效。
-o --owner:保持owner属性(属主)。
-g --group:保持group属性(属组)。
-p --perms:保持perms属性(权限,不包括特殊权限)。
-D :是"–device --specials"选项的组合,即也拷贝设备文件和特殊文件。
-l --links:如果文件是软链接文件,则拷贝软链接本身而非软链接所指向的对象。
-z :传输时进行压缩提高效率。
-R --relative:使用相对路径。意味着将命令行中指定的全路径而非路径最尾部的文件名发送 给服务端,包括它们的属性。用法见下文示例。
–size-only :默认算法是检查文件大小和mtime不同的文件,使用此选项将只检查文件大小。
-u --update :仅在源mtime比目标已存在文件的mtime新时才拷贝。注意,该选项是接收端判 断的,不会影响删除行为。
-d --dirs :以不递归的方式拷贝目录本身。默认递归时,如果源为"dir1/file1",则不会拷贝 dir1目录,使用该选项将拷贝dir1但不拷贝file1。
–max-size :限制rsync传输的最大文件大小。可以使用单位后缀,还可以是一个小数值(例如: “–max-size=1.5m”)
–min-size :限制rsync传输的最小文件大小。这可以用于禁止传输小文件或那些垃圾文件。
–exclude :指定排除规则来排除不需要传输的文件。
–delete :以SRC为主,对DEST进行同步。多则删之,少则补之。注意"–delete"是在接收端 执行的,所以它是在
:exclude/include规则生效之后才执行的。
-b --backup :对目标上已存在的文件做一个备份,备份的文件名后默认使用"~“做后缀。
–backup-dir:指定备份文件的保存路径。不指定时默认和待备份文件保存在同一目录下。
-e :指定所要使用的远程shell程序,默认为ssh。
–port :连接daemon时使用的端口号,默认为873端口。
–password-file:daemon模式时的密码文件,可以从中读取密码实现非交互式。注意,这不是 远程shell认证的密码,而是rsync模块认证的密码。
-W --whole-file:rsync将不再使用增量传输,而是全量传输。在网络带宽高于磁盘带宽时,该 选项比增量传输更高效。
–existing :要求只更新目标端已存在的文件,目标端还不存在的文件不传输。注意,使用相 对路径时如果上层目录不存在也不会传输。
–ignore-existing:要求只更新目标端不存在的文件。和”–existing"结合使用有特殊功能, 见下文示例。
–remove-source-files:要求删除源端已经成功传输的文件。
rsync的选项非常多,能够实现非常具有弹性的功能,以上选项仅仅只是很小一部分常用的选项, 关于更完整更详细的选项说明,见我的rsync man手册翻译。

虽然选项非常多,但最常用的选项组合是"avz",即压缩和显示部分信息,并以归档模式传输。

(二)基础示例
以下是几个本地同步示例和通过远程shell实现的同步示例,示例中没有使用"-a"选项,目的是为了更清晰地说明各选项的作用。

1.将/etc/fstab拷贝到/tmp目录下。
[root@xuexi ~]# rsync /etc/fstab /tmp

2.将/etc/cron.d目录拷贝到/tmp下。
[root@xuexi ~]# rsync -r /etc/cron.d /tmp

该命令会在目标主机上创建/tmp/cron.d目录,并将/etc/cron.d/中的文件放入到/tmp/cron.d/目录中,也就是说默认情况下,是不会在目录路径下创建上层目录/etc的。

3.将/etc/cron.d目录拷贝到/tmp下,但要求在/tmp下也生成etc子目录。
[root@xuexi ~]# rsync -R -r /etc/cron.d /tmp
其中"-R"选项表示使用相对路径,此相对路径是以目标目录为根的。对于上面的示例,表示在目标上的/tmp下创建etc/cron.d目录,即/tmp/etc/cron.d,etc/cron.d的根"/"代表的就是目标/tmp。

如果要拷贝的源路径较长,但只想在目标主机上保留一部分目录结构,例如要拷贝/var/log/anaconda/*到/tmp下,但只想在/tmp下保留从log开始的目录,如何操作?使用一个点代表相对路径的起始位置即可,也就是将长目录进行划分。

[root@xuexi ~]# rsync -R -r /var/./log/anaconda /tmp
这样,从点开始的目录都是相对路径,其相对根目录为目标路径。所以对于上面的示例,将在目标上创建/tmp/log/anaconda/*。

4.对远程目录下已存在文件做一个备份。
[root@xuexi ~]# rsync -R -r --backup /var/./log/anaconda /tmp
这样在目标目录下,已存在的文件就被做一个备份,备份文件默认使用"~“做后缀,可以使用”–suffix"指定备份后缀

(三)日志格式解析
日志格式选项列表:
log format =
%h:远程主机名
%a:远程IP地址
%l:文件长度字符数
%p:该次rsync会话的进程id
%o:操作类型:“send"或"recv”、”del.”
%f:文件名
%P:模块路径
%m:模块名
%t:当前时间
%u:认证的用户名(匿名时是null)
%b:实际传输的字节数
%c:当发送文件时,该字段记录该文件的校验码

(四)当前
五、常见问题答疑
问题一:
@ERROR: chroot failed
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器端的目录不存在或无权限,创建目录并修正权限可解决问题。

问题二:
@ERROR: auth failed on module tee
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器端该模块(tee)需要验证用户名密码,但客户端没有提供正确的用户名密码,认证失败。
提供正确的用户名密码解决此问题。

问题三:
@ERROR: Unknown module ‘tee_nonexists’
rsync error: error starting client-server protocol (code 5) at main.c(1522) [receiver=3.0.3]

原因:
服务器不存在指定模块。提供正确的模块名或在服务器端修改成你要的模块以解决问题

问题四:(在client上遇到)
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.1.128::backup /home/
rsync: could not open password file “/etc/rsync.pas”: No such file or directory (2)
Password:
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端没有设置/etc/rsync.pas这个文件,而在使用rsync命令的时候,加了这个参数–
password-file=/etc/rsync.pas

问题五:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.1.128::backup /home/
@ERROR: auth failed on module backup
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题:client端已经设置/etc/rsync.pas这个文件,里面也设置了密码111111,和服务器一致,但是
服务器段设置有错误,服务器端应该设置/etc/rsync.pas ,里面内容root:111111 ,这里登陆名不可缺少

问题六:
rsync -auzv --progress --password-file=/etc/rsync.pas root@192.168.1.128::backup /home/
@ERROR: chdir failed
rsync error: error starting client-server protocol (code 5) at main.c(1506) [Receiver=3.0.7]
遇到这个问题,是因为服务器端的/home/backup 其中backup这个目录并没有设置,所以提示:chdir failed

问题七:
rsync: write failed on “/home/backup2010/wensong”: No space left on device (28)
rsync error: error in file IO (code 11) at receiver.c(302) [receiver=3.0.7]
rsync: connection unexpectedly closed (2721 bytes received so far) [generator]
rsync error: error in rsync protocol data stream (code 12) at io.c(601) [generator=3.0.7]
磁盘空间不够,所以无法操作。
可以通过df /home/backup2010 来查看可用空间和已用空间

问题八:网络收集问题
1、权限问题
类似如下的提示:rsync: opendir “/kexue” (in dtsChannel) failed: Permission denied (13)注意查看同步的目录权限是否为755
2、time out
rsync: failed to connect to 203.100.192.66: Connection timed out (110)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]

检查服务器的端口netstat –tunlp,远程telnet测试。
可能因为客户端或者服务端的防火墙开启 导致无法通信,可以设置规则放行 rsync(873端 口) 或者直接关闭防火墙。还有一种在同步过程中可能会提示没有权限 (将同步目录加上 SvcwRsync全部权限即可,更简单的方法就是将SvcwRsync设为管理员即可)

3、服务未启动
rsync: failed to connect to 10.10.10.170: Connection refused (111)
rsync error: error in socket IO (code 10) at clientserver.c(124) [receiver=3.0.5]

启动服务:rsync --daemon --config=/etc/rsyncd.conf
4、磁盘空间满
rsync: recv_generator: mkdir “/teacherclubBackup/rsync……” failed: No space left on device (28)
*** Skipping any contents from this failed directory ***

5、Ctrl+C或者大量文件
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [receiver=3.0.5]
rsync error: received SIGINT, SIGTERM, or SIGHUP (code 20) at rsync.c(544) [generator=3.0.5]

6、xnetid启动
rsync: read error: Connection reset by peer (104)
rsync error: error in rsync protocol data stream (code 12) at io.c(759) [receiver=3.0.5]
查看rsync日志
rsync: unable to open configuration file “/etc/rsyncd.conf”: No such file or directory
xnetid查找的配置文件位置默认是/etc下,根据具体情况创建软链接。例如:
ln -s /etc/rsyncd/rsyncd.conf /etc/rsyncd.conf
或者更改指定默认的配置文件路径,在/etc/xinetd.d/rsync配置文件中。

六、其他
七、参考资料
(一)Ubuntu14.04 实现rsync+inotify 实时同步文件
https://www.cnblogs.com/qinhir/p/6589403.html

(二)

这篇关于Ubuntu18.04 实现rsync+inotify 实时同步文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/958715

相关文章

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

服务器集群同步时间手记

1.时间服务器配置(必须root用户) (1)检查ntp是否安装 [root@node1 桌面]# rpm -qa|grep ntpntp-4.2.6p5-10.el6.centos.x86_64fontpackages-filesystem-1.41-1.1.el6.noarchntpdate-4.2.6p5-10.el6.centos.x86_64 (2)修改ntp配置文件 [r

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、