当前位置: 首页 > news >正文

SUSE linux的快照和恢复

snapper用于创建和管理文件系统快照,并在需要时实现回滚,它还可以用于创建用户数据的磁盘备份。snapper使用btrfs文件系统或者精简配置的被格式化成XFS或EXT4的LVM卷。snapper可以通过命令行或YaST来进行管理。
btrfs是一种copy-on-write文件系统,它原生支持subvolumes文件系统快照。subvolumes是物理分区内可单独安装的文件系统。你也可以直接从btrfs快照启动系统。

1 默认设置

在openSUSE Leap中,snapper通常用于系统修改的撤销和恢复的工具。默认情况下,系统的根分区被格式化成了btrfs文件系统。如果根分区足够大(大于16G),快照功能是默认开启的。其他分区默认关闭了快照功能。

SUSE15:~ # df -Th
Filesystem     Type      Size  Used Avail Use% Mounted on
devtmpfs       devtmpfs  4.0M     0  4.0M   0% /dev
tmpfs          tmpfs     974M     0  974M   0% /dev/shm
tmpfs          tmpfs     390M   12M  379M   3% /run
tmpfs          tmpfs     4.0M     0  4.0M   0% /sys/fs/cgroup
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /boot/grub2/i386-pc
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /.snapshots
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /home
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /opt
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /root
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /boot/grub2/x86_64-efi
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /srv
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /tmp
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /var
/dev/nvme0n1p2 btrfs      28G  6.7G   22G  24% /usr/local
tmpfs          tmpfs     195M   48K  195M   1% /run/user/1000
tmpfs          tmpfs     195M   36K  195M   1% /run/user/0

CentOS7的根分区默认采用了XFS,默认情况下没有开启快照功能。

如果在系统安装时关闭了快照功能,可以通过下面的命令开启:

SUSE15:~ # snapper -c root create-config /

创建快照时,快照和原始快照都指向文件系统中的相同块。因此,最初快照不会占用额外的磁盘空间。如果原始文件系统中的数据被修改,则更改的数据块被复制,而旧的数据块保留用于快照。因此,快照与修改的数据占用的空间量相同。因此,随着时间的推移,快照分配的空间量不断增长。因此,从包含快照的Btrfs文件系统中删除文件可能无法释放磁盘空间!

快照始终驻留在已拍摄快照的同一分区或子卷上。无法将快照存储在不同的分区或子卷上。因此根分区的磁盘大小决定了能够保存多少份快照,一旦空间不够,系统会自动删除一部分快照(从最旧的开始删除)。

1.1 默认设置

  • Disks larger than 16 GB
	Configuration file: /etc/snapper/configs/rootUSE_SNAPPER=yesTIMELINE_CREATE=no
  • Disks smaller than 16 GB
	Configuration file: not createdUSE_SNAPPER=noTIMELINE_CREATE=yes

1.2 快照类型

根据触发它们的事件,快照分为了三种类型:

  1. Timeline Snapshots

每小时创建一个快照,旧的快照将会自动被删除。默认情况下,过去10天,一个月和一年的第一份快照将会被保留。默认情况下该快照是关闭的。

  1. Installation Snapshots

安装软件后,会创建一对快照:安装前(pre)的和安装后的(post)。如果是安装比较重要的包比如内核,快照对还会被标记上important。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。

  1. Aministration Snapshots

当你使用YaST管理系统时,会创建一对快照:管理前(pre)的和管理后的(post)。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。

1.3 被排除的目录

/boot/grub2/i386-pc, /boot/grub2/x86_64-efi, /boot/grub2/powerpc-ieee1275, /boot/grub2/s390x-emu

boot loader配置是无法回滚的,这里列出的目录是针对不同硬件架构的boot loader目录

/home

如果/home不驻留在单独的分区上,排除掉它是为了避免回滚时数据丢失。

/opt

第三方应用通常安装在该目录下。排除掉它是为了避免回滚时应用被删除。

/srv

该目录包含了web和FTP服务器的数据。排除掉它是为了避免回滚时数据丢失。

/tmp

临时文件夹,没必要做快照。

/usr/local

手工安装软件的目录,排除掉它是为了避免回滚时应用被删除。

/var

该目录包含了很多变量文件,比如日志,缓存,/var/opt中的第三方软件,而且还是虚拟机映像和数据库的默认位置。因此,创建此子卷是为了从快照中排除所有这些可变数据,并禁用了写时复制。

1.4 自定义设置

openSUSE默认提供了通用场景下的快照设置,你也可以根据需要进行修改。

1.4.1 开启和关闭快照
timeline snapshots
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=yes"
SUSE15:~ # snapper -c root set-config "TIMELINE_CREATE=no"
installation snapshots

开启该快照功能需要安装软件,安装后自动开启,删除软件后关闭该快照功能

SUSE15:~ # zypper install snapper-zypp-plugin
SUSE15:~ # zypper remove snapper-zypp-plugin
administration snapshots
SUSE15:~ # vim /etc/sysconfig/yast2## Type: list(yes,no)
## Default: "no"
# Enable use of snapper for YaST.
USE_SNAPPER="yes"		#设置为yes就是开启,改为no即可关闭,默认是开启状态
1.4.2 控制installation snapshots

安装软件的快照对创建依赖于插件snapper-zypp-plugin。配置文件是/etc/snapper/zypp-plugin.conf。配置文件如下:

SUSE15:~ # cat /etc/snapper/zypp-plugin.conf
<?xml version="1.0" encoding="utf-8"?>
<snapper-zypp-plugin-conf><solvables>
#match属性代表使用UNIX shell风格的通配符(w)还是使用python正则表达式(re)
#important属性代表是否被标记为重要快照,这取决于软件包的标记
#括号中间的字符如下一行的kernel-*,用于匹配软件包名,根据match属性的设置,特殊字符会被解释为shell通配符或正则表达式。<solvable match="w" important="true">kernel-*</solvable><solvable match="w" important="true">dracut</solvable><solvable match="w" important="true">glibc</solvable><solvable match="w" important="true">systemd*</solvable><solvable match="w" important="true">udev</solvable><solvable match="w">*</solvable>			#无条件的匹配所有软件包,注释掉这一行代表非重要的软件安装将不会做快照</solvables>
</snapper-zypp-plugin-conf>
4.3 创建和挂载新的子卷

系统支持在根下创建一个新的子卷并永久挂载,但是这样的子卷将会被快照排除掉。你需要确保不在现有快照中创建它,因为回滚后将无法再删除快照。
openSUSELeap配置了/@/子卷,它作为/opt、/srv、/home等永久子卷的独立根。您创建和永久安装的任何新子卷都需要在此初始根文件系统中创建。
下面的列子是从/dev/sda2中新创建一个/usr/important子卷:

SUSE15:~ # mount /dev/sda2 -o subvol=@ /mnt
SUSE15:~ # btrfs subvolume create /mnt/usr/important
SUSE15:~ # umount /mnt

永久挂载配置

SUSE15:~ # vim /etc/fstab/dev/sda2 /usr/important btrfs subvol=@/usr/important 0 0

子卷可能包含不断变化的文件,例如虚拟化磁盘映像、数据库文件或日志文件。如果是这样,请考虑禁用此卷的写时复制功能,以避免磁盘块重复。使用/etc/fstab中的nodatacow挂载选项来执行此操作:

/dev/sda2 /usr/important btrfs nodatacow,subvol=@/usr/important 0 0

命令行下的操作:

SUSE15:~ # chatter +C /usr/important
1.4.4 控制快照归档

快照会占据大量的磁盘空间,因此为了避免快照占据整个磁盘空间,多余的快照将会自动被删除。默认情况下,系统会保存10个重要的安装和管理快照,以及10个常规的安装和管理快照,如果快照占据了超过50%的分区空间,那么数量会相应的减少,但**至少会保存10个重要快照加2个常规快照**。

1.4.5 在精简置备LVM卷中使用快照

快照还支持的文件系统包括XFS、EXT3和EXT4,需要专门为这些文件系统创建一个快照配置。在创建时需要在--fstype="lvm(xfs)"中指明文件系统名,例如:

SUSE15:~ #  snapper -c lvm create-config --fstype="lvm(xfs)" /thin_lvm

2 快照用于撤销修改

snapper还有一个作用是撤销zypper和YaST做的修改,因此在zypper和YaST做修改时,snapper会产生一对快照(修改前和修改后)。也可以用于恢复意外丢失的系统文件。要达到这个目的,需要开启Timeline snapshots


撤销修改和回滚的区别

  • 撤销修改:当使用撤销修改功能是,系统会比较两个快照的区别,然后取消掉修改的部分。撤销修改还可以只针对某个文件。
  • 回滚:整个系统将会恢复到原来快照的状态。

撤销修改也可以和当前系统状态进行对比,如果所有文件都做了快照,那么实际上撤销修改和回滚就没啥区别了。当然首选的还是回滚,因为回滚允许在操作之前查看系统,并且速度更快。


注意:创建快照时没有机制保证数据的一致性。如果在创建快照的同时写入文件(例如,数据库),就会导致文件损坏或部分写入。恢复这样的文件会导致问题。此外,不得恢复某些系统文件,例如/etc/mtab。因此,强烈建议始终仔细查看已更改文件的列表及其差异。仅还原真正需要还原的操作的文件。

2.1 撤销YaST和zypper的修改

一旦在安装时将根分区配置为btrfs文件系统,针对YaST和zypper的快照就会被自动配置,因此每次操作YaST和zypper时,就会创建一对快照。可以通过YaST中的snapper模块和snapper命令来操作修改的撤销。文件的对比也可以通过命令diff来进行查看。

2.1.1 YaST操作
1.通过root账户进入YaST,打开Miscellaneous(杂项)中的snapper(文件系统快照)模块
2.选择类型为Pre & Post的快照,描述中会显示通过什么工具来造成的修改。

在这里插入图片描述

在清单里面,还可以看到最后一个快照只有Pre,因为登陆了YaST做操作,而操作还没有完成,因此没有post快照。

3.选择一对快照,然后点击查看修改

在这里插入图片描述

这里可以看到所有的修改内容

4.选择所有,或者某一个文件夹进行恢复

在这里插入图片描述

2.1.2 CLI操作
1.首先列出所有的快照
SUSE15:~ # snapper list -t pre-post
Pre # | Post # | Pre Date                 | Post Date                | Description  | Userdata    
------+--------+--------------------------+--------------------------+--------------+-------------3  |     4  | Tue Aug 17 16:35:58 2021 | Tue Aug 17 16:36:06 2021 | zypp(zypper) | important=no5  |     6  | Tue Aug 17 16:51:45 2021 | Tue Aug 17 16:51:55 2021 | zypp(zypper) | important=no7  |     8  | Tue Aug 17 16:53:16 2021 | Tue Aug 17 16:53:53 2021 | zypp(zypper) | important=no9  |    10  | Tue Aug 17 17:38:10 2021 | Tue Aug 17 17:39:00 2021 | zypp(zypper) | important=no11  |    12  | Tue Aug 17 17:39:09 2021 | Tue Aug 17 17:39:10 2021 | zypp(zypper) | important=no
2.查看某一快照的具体修改内容
SUSE15:~ # snapper status 3..4	#需要使用两个ID才能具体匹配某一个快照
c..... /etc/products.d/Leap.prod
+..... /etc/zypp/repos.d/repo-backports-debug-update.repo
+..... /etc/zypp/repos.d/repo-backports-update.repo
+..... /etc/zypp/repos.d/repo-sle-debug-update.repo
+..... /etc/zypp/repos.d/repo-sle-update.repo
c..... /usr/lib/sysimage/rpm/Basenames
c..... /usr/lib/sysimage/rpm/Conflictname
c..... /usr/lib/sysimage/rpm/Dirnames
c..... /usr/lib/sysimage/rpm/Group
c..... /usr/lib/sysimage/rpm/Installtid
c..... /usr/lib/sysimage/rpm/Name
c..... /usr/lib/sysimage/rpm/Obsoletename
c..... /usr/lib/sysimage/rpm/Packages
c..... /usr/lib/sysimage/rpm/Providename
c..... /usr/lib/sysimage/rpm/Recommendname
c..... /usr/lib/sysimage/rpm/Requirename
c..... /usr/lib/sysimage/rpm/Sha1header
c..... /usr/lib/sysimage/rpm/Sigmd5
c..... /usr/lib/sysimage/rpm/Suggestname

快照中总共有三种标记:

  • c:有修改
  • +:增加的内容
  • -:删除的内容
3.查看具体的修改内容
SUSE15:~ # snapper diff 3..4 /etc/products.d/Leap.prod
--- /.snapshots/3/snapshot/etc/products.d/Leap.prod	2021-05-24 19:41:40.000000000 +0800
+++ /.snapshots/4/snapshot/etc/products.d/Leap.prod	2021-06-04 16:43:53.000000000 +0800
@@ -98,7 +98,7 @@</buildconfig><installconfig><defaultlang>en_US</defaultlang>
-    <releasepackage name="openSUSE-release" flag="EQ" version="15.3" release="lp153.138.1"/>
+    <releasepackage name="openSUSE-release" flag="EQ" version="15.3" release="lp153.146.1"/><distribution>openSUSE</distribution></installconfig><runtimeconfig/>

如果不指定文件,则会显示所有的修改内容。

4.撤销修改操作
SUSE15:~ # snapper -v undochange 3..4 /etc/products.d/Leap.prod
create:0 modify:1 delete:0
modifying /etc/products.d/Leap.prod

如果不指定文件,则会撤销所有的修改。


不建议通过使用Snapper撤消更改来恢复用户添加。由于某些目录被排除在快照之外,属于这些用户的文件将保留在文件系统中。如果创建了与已删除用户具有相同用户ID的用户,则该用户将继承这些文件。因此强烈建议使用YaST用户和组管理工具删除用户。

2.2 恢复文件

timeline snapshot可以帮助你恢复以外删除的文件或是回退文件版本。snapper的diff选项也可以帮你找出具体的修改内容。

2.2.1 YaST操作
  1. 从YaST中的“杂项”部分或输入“yast2 Snapper”启动“Snapper*”模块。
  2. 选择要从中选择快照的“当前配置”。
  3. 选择要从中恢复文件的时间轴快照,然后选择“显示更改”。时间轴快照的类型为Single,描述值为Timeline
  4. 单击文件名,从文本框中选择一个文件。显示了快照版本与当前系统之间的差异。激活复选框以选择要还原的文件。对所有要恢复的文件执行此操作。
2.2.2 CLI操作

  1. 通过以下命令获取特定配置的时间轴快照列表:
sudo snapper -c CONFIG list -t single | grep timeline

CONFIG需要替换为现有Snapper配置。使用snapper列表配置来显示列表。

  1. 通过以下命令获取给定快照的更改文件列表:
sudo snapper -c CONFIG status SNAPSHOT_ID..0

将SNAPSHOT_ID替换为要从中恢复文件的快照的ID。

  1. 可以选择通过运行以下命令列出当前文件版本与快照中的文件版本之间的差异
sudo snapper -c CONFIG diff SNAPSHOT_ID..0 FILE NAME

如果未指定,则会显示所有文件的差异。

4.恢复一个或多个文件

sudo snapper -c CONFIG -v undochange SNAPSHOT_ID..0 FILENAME1 FILENAME2

不指定名字则会保存所有的修改

----

3 从快照启动实现回滚

openSUSE Leap中的GRUB2可以直接从btrfs快照中引导。只有默认snapper配置(不能修改)创建的快照(root)才能实现引导。
启动快照时,快照中包含的文件系统部分以只读方式挂载; 从快照中排除的所有其他文件系统和部分都以读写方式挂载并且可以修改。
要从可引导快照回滚,必须满足以下要求。进行默认安装时,系统会进行相应设置。

  1. 根文件系统必须是btrfs,不支持LVM卷
  2. 根文件系统必须是一个单独的设备,分区或子卷。快照中排除的部分分区如/srv可能驻留在单独的分区上。
  3. 系统需要能够通过已安装的引导加载程序进行引导。
回滚操作步骤:
  1. 启动系统后,选择*Bootable snapshots *并选择需要启动的快照,快照会以时间为前缀命名。
  2. 登陆系统,检查系统工作是否正常。
  3. 决定是否回滚。
  • 如果不想要回滚到这个快照,重启并引导现有的系统,或者是选择其他快照。
  • 如果想回滚,执行命令snapper rollback,然后重启系统,选择默认启动项以重新启动到恢复的系统。

注意:如果在安装时没有禁用快照,安装完成后会有一个叫做after installztion的快照,你可以随时回滚到这个状态。启动系统升级到Service Pack或新的主要版本时,也会创建可引导快照。

3.1 回滚后的快照

在执行回滚之前,会创建正在运行的文件系统的快照。该描述引用了在回滚中恢复的快照的ID。
由回滚创建的快照接收Cleanup属性的值编号。因此,当达到设置的快照数量时,回滚快照会自动删除。如果快照包含重要数据,请在删除之前从快照中提取数据。

3.1.1 回滚快照举例

在新安装一个系统后,系统中会有如下快照

SUSE15:~ # snapper --iso list# | Type   | Pre # | Date                | User | Used Space | Cleanup | Description           | Userdata     
----+--------+-------+---------------------+------+------------+---------+-----------------------+--------------0  | single |       |                     | root |            |         | current               |              1* | single |       | 2021-08-17 15:04:56 | root | 129.47 MiB |         | first root filesystem |              2  | single |       | 2021-08-17 15:16:30 | root |  24.12 MiB | number  | after installation    | important=yes

在执行回滚后3号快照会被创建并且包含了回滚前的状态,快照4是新的默认Btrfs子卷,因此是重新启动后的系统。

SUSE15:~ # snapper --iso list
Type   | # |     | Cleanup | Description           | Userdata
-------+---+ ... +---------+-----------------------+--------------
single | 0 |     |         | current               |
single | 1 |     | number  | first root filesystem |
single | 2 |     | number  | after installation    | important=yes
single | 3 |     | number  | rollback backup of #1 | important=yes
single | 4 |     |         |                       |

3.2 访问和识别快照

启动时选择Start Bootloader from a read-only snapshot,就会看到快照列表,最新的在最前面,可以使用上下箭头进行选择。从引导菜单激活快照不会立即重新启动机器,而是打开所选快照的引导加载程序。

在这里插入图片描述

快照的命名格式如下:

[*]OS (KERNEL,DATETTIME,DESCRIPTION)
  1. 如果快照被标记为important,则会有*标记
  2. 操作系统名称和版本
  3. 内核版本
  4. 快照创建日期
  5. 快照创建时间
  6. 快照的描述。手工创建的描述可以通过--description选项来添加描述。

可以通过修改的方式对现有的自动创建的快照进行描述调整。例如要将快照5的描述修改为post-initial,可以使用命令snapper modify --userdata "bootloader=post-initial" 5。自定义的描述不能超过25个字符,否则会无法启动。

3.3 限制条件

由于系统随时在产生临时文件,因此是不可能完全回滚到某一个状态的。

3.3.1 快照排除的目录

由于根文件系统不可能包含所有的目录,因此这些目录是无法恢复的,因此快照会有如下限制:

  1. 附加的和第三方软件可能会在回滚后无法使用,解决的办法只有重新安装应用。

  2. 文件访问问题,如果做了快照后应用修改了文件的权限或属组(用户),那么回滚可能会导致应用无法访问这些文件。这样就只能在回滚后重置权限设置。

  3. 不兼容的数据格式。如果在做了快照后服务或应用建立了新的数据格式。在回滚后应用可能不能读取收到影响的数据。

  4. 混合代码和数据的子卷。一些子卷如/srv可能既包含代码也包含数据。回滚可能会导致出现无法执行的代码。例如,PHP版本的降级可能会导致Web服务器的PHP脚本损坏。

  5. 用户数据。如果回滚导致用户被删除,但相关的数据由于被排除在快照之外而没有被删除。如果系统又创建了相同user ID的用户,那么这个用户将会继承旧的数据,可通过find命令找到并删除这些文件。

3.3.2 引导加载数据无法回滚

系统无法实现引导加载程序的回滚。

4 开启用户家目录快照

家目录的快照是支持,它支持多种用例:

  1. 个人用户管理自己的快照和回滚
  2. 系统用户,如想要跟踪配置文件、文档等副本的数据库、系统和网络管理员。
  3. samba与家目录和btrfs后端共享

用户目录都是btrfs目录/home的子卷,可以手工设置快照。但是更方便的方式是使用pam_snapper,pam_snapper包安装了pam_snapper.so模块和帮助程序脚本,它们可以自动创建用户和配置Snapper。
pam_snapper集成了useradd命令,pam和snapper。它默认会在用户登录和注销时创建快照,并且还会在某些用户长时间保持登录状态时创建基于时间的快照。 通过Snapper命令或修改配置文件更改默认值。

4.1 安装pam_snapper并创建用户

  1. 安装软件
SUSE15:~ # zypper in pam_snapper
Loading repository data...
Reading installed packages...
Resolving package dependencies...The following NEW package is going to be installed:pam_snapper1 new package to install.
Overall download size: 27.9 KiB. Already cached: 0 B. After the operation, additional 29.1 KiB
will be used.
Continue? [y/n/v/...? shows all options] (y): y
Retrieving package pam_snapper-0.8.16-1.1.x86_64         (1/1),  27.9 KiB ( 29.1 KiB unpacked)
Retrieving: pam_snapper-0.8.16-1.1.x86_64.rpm ..........................................[done]Checking for file conflicts: ...........................................................[done]
(1/1) Installing: pam_snapper-0.8.16-1.1.x86_64 ........................................[done
  1. 添加配置文件
SUSE15:~ # vim /etc/pam.d/common-sessionsession optional        pam_snapper.so		#添加到最后一行
  1. 使用脚本文件创建新用户和家目录,脚本默认是试运行状态,因此需要先关闭。
SUSE15:~ # vim /usr/lib/pam_snapper/pam_snapper_useradd.sh DRYRUN=0		#默认是1,改为0

修改配置后再执行脚本:

SUSE15:~ # /usr/lib/pam_snapper/pam_snapper_useradd.sh wolf wolf passwd=123456
Create subvolume '/home/wolf'
useradd: warning: the home directory /home/wolf already exists.
useradd: Not copying any file from skel directory into it.
chown: invalid user: ‘wolf.wolf’
  1. 在用户第一次登陆时,/etc/skel文件夹中的文件将会被复制到用户的家目录中,
SUSE15:~ # snapper list --allConfig: home_wolf, subvolume: /home/wolf# | Type   | Pre # | Date                     | User | Used Space | Cleanup | Description | Userdata                                
---+--------+-------+--------------------------+------+------------+---------+-------------+-----------------------------------------
0  | single |       |                          | root |            |         | current     |                                         
1  | pre    |       | Sun Aug 22 20:36:03 2021 | wolf |  16.00 KiB |         | pam_snapper | ruser=root, service=su-l, tty=/dev/pts/2
2  | post   |     1 | Sun Aug 22 20:36:06 2021 | wolf |  16.00 KiB |         | pam_snapper | ruser=root, service=su-l, tty=/dev/pts/2

由于已经使用wolf登陆过一次系统,因此创建了两个快照。wolf用户可以通过snapper命令管理属于自己的快照。

4.2 删除用户

和添加用户一样,也需要先修改脚本,然后再执行删除操作。

SUSE15:~ # vim /usr/lib/pam_snapper/pam_snapper_userdel.sh DRYRUN=0		#默认是1,改为0

执行删除:

SUSE15:~ # /usr/lib/pam_snapper/pam_snapper_userdel.sh jack
Delete subvolume (no-commit): '/home/jack'
no crontab for jack
userdel: jack home directory (/home/jack) not found

4.3 手工开启家目录快照

SUSE15:~ # btrfs subvolume create /home/jack
Create subvolume '/home/jack'
SUSE15:~ # snapper -c home_jack create-config /home/jack
SUSE15:~ # sed -i -e "s/ALLOW_USERS=\"\"/ALLOW_USERS=\"jack\"/g"  /etc/snapper/configs/home_jack
SUSE15:~ # yast users add username=jack home=/home/jack password=123456
SUSE15:~ # chown jack.jack /home/jack
SUSE15:~ # chmod 755 /home/jack/.snapshots

5 创建和修改snapper配置

snapper的配置文件统一存放在/etc/snapper/configs/下,其中root为默认创建的,主要针对YaST和zypper的操作,当根分区磁盘空间足够大时就会自动创建。
你也可以为挂载到btrfs格式子卷下的任何目录创建自己定义的快照配置,

SUSE15: # snapper -c tmp-data create-config /tmp	#-c后面跟配置名称,最后跟目录
SUSE15: # ls /etc/snapper/configs/
home_jack  home_wolf  root  tmp-data

配置将会根据模板/etc/snapper/config-templates/default来进行创建。也可以使用-t来指定自己定义的模板。

5.1 管理已有的配置

snapper提供了很多子命令来管理配置。

列出配置
SUSE15:/opt # snapper list-configs
Config    | Subvolume 
----------+-----------
home_jack | /home/jack
home_wolf | /home/wolf
root      | /         
tmp-data  | /tmp  
查看配置
SUSE15:/opt # snapper -c home_wolf get-config
Key                    | Value     
-----------------------+-----------
ALLOW_GROUPS           |           
ALLOW_USERS            | wolf      
BACKGROUND_COMPARISON  | yes       
EMPTY_PRE_POST_CLEANUP | yes       
EMPTY_PRE_POST_MIN_AGE | 1800      
FREE_LIMIT             | 0.2       
FSTYPE                 | btrfs     
NUMBER_CLEANUP         | yes       
NUMBER_LIMIT           | 50        
NUMBER_LIMIT_IMPORTANT | 10        
NUMBER_MIN_AGE         | 1800      
QGROUP                 |           
SPACE_LIMIT            | 0.5       
SUBVOLUME              | /home/wolf
SYNC_ACL               | no        
TIMELINE_CLEANUP       | yes       
TIMELINE_CREATE        | yes       
TIMELINE_LIMIT_DAILY   | 10        
TIMELINE_LIMIT_HOURLY  | 10        
TIMELINE_LIMIT_MONTHLY | 10        
TIMELINE_LIMIT_WEEKLY  | 0         
TIMELINE_LIMIT_YEARLY  | 10        
TIMELINE_MIN_AGE       | 1800  
修改配置

根据列出来的配置中的选项,修改其参数:

SUSE15:/opt # snapper -c home_wolf set-config NUMBER_LIMIT=20
SUSE15:/opt # snapper -c home_wolf get-config
Key                    | Value     
-----------------------+-----------
ALLOW_GROUPS           |           
ALLOW_USERS            | wolf      
BACKGROUND_COMPARISON  | yes       
EMPTY_PRE_POST_CLEANUP | yes       
EMPTY_PRE_POST_MIN_AGE | 1800      
FREE_LIMIT             | 0.2       
FSTYPE                 | btrfs     
NUMBER_CLEANUP         | yes       
NUMBER_LIMIT           | 20     	#默认为50,已经修改成了20   
NUMBER_LIMIT_IMPORTANT | 10        
NUMBER_MIN_AGE         | 1800      
QGROUP                 |           
SPACE_LIMIT            | 0.5       
SUBVOLUME              | /home/wolf
SYNC_ACL               | no        
TIMELINE_CLEANUP       | yes       
TIMELINE_CREATE        | yes       
TIMELINE_LIMIT_DAILY   | 10        
TIMELINE_LIMIT_HOURLY  | 10        
TIMELINE_LIMIT_MONTHLY | 10        
TIMELINE_LIMIT_WEEKLY  | 0         
TIMELINE_LIMIT_YEARLY  | 10        
TIMELINE_MIN_AGE       | 1800   
删除配置
SUSE15:/opt # snapper -c home_jack delete-config
SUSE15:/opt # snapper list-configs
Config    | Subvolume 
----------+-----------
home_wolf | /home/wolf
root      | /         
tmp-data  | /tmp 
5.1.1 配置数据
1. ALLOW_GROUPS, ALLOW_USERS - 授予普通用户使用快照的权限。默认值为空。
2. BACKGROUND_COMPARISON - 定义在创建快照后,快照对是否在后台被比较。默认为`Yes`
3. EMPTY_* - 定义具有相同前后快照的快照对的清理算法
4. FSTYPE - 分区的文件系统类型,不要修改它。默认为`btrfs`
5. NUMBER_* - 定义安装和管理快照的清理算法
6. QGROUP/SPACE_LIMIT - 为清理算法添加配额支持
7. SUBVOLUME - 分区或子卷快照的挂载点,不要修改它。默认是`/`
8. SYNC_ACL - 如果快照用在常规用户上,该用户必须能够访问`.snapshot`目录和读取里面的文件。如果设置为`yes`,Snapper会自动使用来自ALLOW_USERS或ALLOW_GROUPS条目的用户和组的ACL来访问它们。默认值是`no`
9. TIMELINE_CREATE - 如果设置为`yes`,每小时会创建一个快照。默认值为`no`
10. TIMELINE_CLEANUP/TIMELINE_LIMIT_* - 为基于时间的快照定义清理算法
5.1.2 普通用户使用snapper

默认情况下,快照只能由root用户使用,但是总会有一些使用需求:

  • 网站的管理员想要为/srv/www创建快照
  • 用户想为自己的家目录创建快照

可以创建快照配置,为用户/组添加相关的权限,并保证用户/组能够访问快照数据。最好的办法就是将SYNC_ACL 选项设置为yes

操作步骤(注意需要使用root用户执行以下操作):

  1. 创建配置
SUSE15: # snapper -c tmp-data create-config /tmp
  1. 根据需要调整配置参数

  2. 通过设置ALLOW_USERS``ALLOW_GROUPS来给用户/组授权,多个条目使用空格隔开。

SUSE15:/opt # snapper -c tmp-data set-config ALLOW_USERS=wolf SYNC_ACL="yes"
  1. 查看配置
wolf@SUSE15:~> snapper -c tmp-data list# | 类型   | 前期 # | 日期 | 用户 | 已用空间 | 清空 | 描述    | 用户数据
---+--------+--------+------+------+----------+------+---------+---------
0  | single |        |      | root |          |      | current |      

6 手工创建和管理快照

snapper支持手工创建快照,由于快照都是针对已存在的配置,因此手工创建快照同样需要基于已有的配置。默认情况下,root配置已经被使用了,因此手工创建快照时,首先需要创建快照配置。

6.1快照元数据

每个快照都有自己的元数据,创建快照时需要指定快照的元数据,修改快照就是在修改快照的元数据。

snapper --config root list - 列出基于该配置创建的所有快照(由于root是默认配置,因此这里可以省去)。
snapper list -a - 列出基于所有存在的配置创建的所有快照。
snapper list -t pre-post - 列出所有的基于默认配置的pre and post快照
snapper list -t single - 列出所有的基于默认配置的single快照

以下元数据可用于每个快照:

  1. Type:快照类型,不可修改。
  2. Number:快照的唯一编号,不可修改
  3. Pre Number:指定对应的pre快照编号。 仅适用于post类型的快照。不可修改
  4. Description:快照描述
  5. Userdata:指定用户数据的扩展描述,使用逗号隔开。例如reason=testing, project=foo,也用来标示快照是否重要,以及列出快照的创建者。
  6. Cleanup-Algorithm:快照的清理算法。
6.1.1 快照类型

快照有三种类型,它们在物理上没有区别,但Snapper处理它们的方式不同。


- pre - 文件系统修改前的快照。每个快照都会对应一个post快照
- post - 文件系统修改后的快照。每个快照都会对应一个pre快照
- single - 单独的快照,这是快照创建的默认类型。

6.1.2 清理算法

snapper提供了三种清理算法,这些算法将会在日常的cron中执行。可以定义要保留在Snapper配置中的不同类型快照的数量


- number - 达到一定的数量后删除旧的快照
- timeline - 超出一定的时限后删除旧的快照,但保留几个每小时、每天、每月和每年的快照。
- empty-pre-post - 删除两者无差异的pre/post快照

6.2 创建快照

在命令行下使用snapper create或者在YaST的Snapper模块下点击Create创建快照。下面是命令行下的快照创建举例。


- snapper create --from 17 --description "with package2" 从现有的快照(指定了id为17)创建一个single类型的独立快照
- snapper create --description "Snapshot for week 2 2014" 根据默认配置创建一个带有描述的single类型的独立快照,由于没有指定清理算法,因此该快照永远不会被删除
- snapper --config home create --description "Cleanup in ~tux" 根据配置home创建一个带有描述的single类型的独立快照,由于没有指定清理算法,因此该快照永远不会被删除
- snapper --config home create --description "Daily data backup" --cleanup-algorithm timeline> 根据配置home创建一个带有描述的single类型的独立快照,当快照满足为配置中的时间线清理算法指定的条件时,将自动删除该快照。
- snapper create --type pre --print-number --description "Before the Apache config cleanup" --userdata "important=yes" 创建一个类型为pre的快照,并输出快照编号。这是创建用于保存“before”和“after”状态的一对快照所需的第一个命令。快照会被标记为重要
- snapper create --type post --pre-number 30 --description "After the Apache config cleanup" --userdata "important=yes" 创建一个和ID号为30的pre快照配对的post快照,这是创建用于保存“before”和“after”状态的一对快照所需的第二个命令。快照会被标记为重要
- snapper create --command *COMMAND* --description "Before and after COMMAND" 在运行*COMMAND*命令的前后自动创建一对快照。这种创建方式只能在命令行下使用。

6.3 修改快照元数据

Snapper只允许修改快照的描述、清理算法和用户数据。通过命令行和YaST都可以完成修改操作。下面是命令行下的举例:


- snapper modify --cleanup-algorithm "timeline" 10 修改快照的清理算法
- snapper --config home modify --description "daily backup" -cleanup-algorithm "timeline" 120 修改快照的清理算法和描述

6.4 删除快照

命令行和YaST都可以执行快照删除操作,但是不允许删除当前默认子卷的快照。
使用Snapper删除快照时,释放的空间将被后台运行的Btrfs进程占用。因此,空闲空间的可见性和可用性被延迟。如果想要立即可用,将选项--sync与删除命令一起使用。


- snapper delete 65 删除一个快照
- snapper -c home delete 89 90 删除指定配置下的两个快照
- snapper delete --sync 23 删除快照并立即释放空间

有时Btrfs快照存在,但包含Snapper元数据的XML文件丢失。在这种情况下,快照对Snapper不可见,需要手动删除:btrfs subvolume delete /.snapshots/SNAPSHOTNUMBER/snapshot rm -rf /.snapshots/SNAPSHOTNUMBER

如果想删除快照以释放硬盘空间,先删除旧快照。快照越旧,它占用的磁盘空间就越多。

7 快照自动清理

自动清理的目的在于防止快照占据过大的空间,可以结合磁盘配额来做清理,保证根分区有足够的可用空间。

7.1 清理编号的快照

清理编号快照(管理和安装快照对)由Snapper配置的以下参数控制。


- NUMBER_CLEANUP 开启或关闭安装和管理快照对的清理。如果开启,当快照的数量超出设置的值后就会自动清理。默认值是`yes`
- NUMBER_LIMIT/NUMBER_LIMIT_IMPORTANT 定义最多保留多少个快照,第一个参数的默认值是2-10,第二个参数的默认值是4-10。清理算法会删除超过指定最大值的快照,而不考虑快照和文件系统空间。算法还会删除高于最小值的快照,直到达到快照和文件系统的限制。如果禁用配额支持,则需要提供一个常量值,例如 10,否则清理将失败并显示错误。
- NUMBER_MIN_AGE 定义快照在自动删除之前必须具有的最短时间(以秒为单位)。 无论存在多少快照,都不会删除小于此处指定值的快照。默认值是1800

上面的三个参数都会被参考,只有当条件都满足,才会清除快照。如果不想考虑某个参数,可以将它设置为0,。

7.2 清理时间线快照

下面的参数可以控制时间线快照的清理:


- TIMELINE_CLEANUP 开启或关闭时间线快照对的清理。如果开启,当快照的数量超出设置的值后就会自动清理。默认值是`yes`
- TIMELINE_LIMIT_DAILY,TIMELINE_LIMIT_HOURLY,TIMELINE_LIMIT_MONTHLY,TIMELINE_LIMIT_WEEKLY,TIMELINE_LIMIT_YEARLY 定义小时、日、月和年快照保留的数量,默认值是10。基于周的快照默认值是0。
- TIMELINE_MIN_AGE 定义快照在自动删除之前必须具有的最短时间。默认值是1800

7.3 清理没有变化的快照对

当你运行了zypper命令或者进入了YaST界面又没有做任何修改时,系统仍然会创建一对快照,只是这对快照的变化为空。使用下面的参数来设置自动清除这些快照:


- EMPTY_PRE_POST_CLEANUP 如果设置为yes,那么无变化的快照对将会被删除,默认值为yes
- EMPTY_PRE_POST_MIN_AGE 定义快照在自动删除之前必须具有的最短时间。默认值是1800

7.4 清理手工创建的快照

snapper不会为手工创建的快照提供客户定义的清除算法,但是可以在创建的时候指定算法。如果添加了,快照将会加入你指定算法的清除队列,也可以在创建后修改算法。


- snapper create --description "Test" --cleanup-algorithm number 创建一个单独的快照并指定了number清除算法
- snapper modify --cleanup-algorithm "timeline" 25 修改ID为25的快照清除算法为timeline

7.5 磁盘配额

你还可以为快照指定配额,通过百分比来表示。btrfs配额应用到子卷而不是用户。除了使用Btrfs配额之外,还可以对用户和组应用磁盘空间配额。
配额是自动启用的,也可以使用命令snapper setup-quota来手工开启。
配额有由下面的参数来配置:


- QGROUP Snapper使用的Btrfs配额组,如果没有设置,运行`snapper setup-quota`。如果已经设置,只有在熟悉`man 8 btrfs-qgroup`的情况下才能更改。此值是使用`snapper setup-quota`设置的,不应更改。
- SPACE_LIMIT 限制的配置,以小数表示(如0.1表示10%)

配额仅在现有数量或时间线清理算法之外被激活。如果没有清理算法处于活动状态,则不会应用配额限制。
启用配额支持后,Snapper将根据需要执行两次清理运行。第一次运行将应用为数量和时间线快照指定的规则。只有在本次运行后超过配额时,才会在第二次运行中应用特定于配额的规则。
即使启用了配额支持,Snapper也将始终保留使用NUMBER_LIMIT*TIMELINE_LIMIT*值指定的快照数量,即使会超出配额。因此,建议为NUMBER_LIMIT*TIMELINE_LIMIT*指定范围值(MIN-MAX),以确保可以应用配额。
例如,如果设置了NUMBER_LIMIT=5-20,Snapper将执行第一次清理运行并将常规编号快照的数量减少到20。如果这20个快照超过配额,Snapper将删除一个中最旧的快照。第二次运行,直到达到配额。无论它们占用多少空间,都将始终保留至少五个快照。

8 显示快照占用的磁盘空间

由于快照会共享当前状态的数据,因此常规的dudf命令不能查看快照具体占用的空间大小。当需要释放Btrfs上的磁盘空间时,需要知道每个快照使用了多少独占磁盘空间,而不是共享空间。Snapper 0.6及更高版本在“已用空间”列中报告每个快照的已用磁盘空间:

SUSE15:~ # snapper --iso list# | Type   | Pre # | Date                | User | Used Space | Cleanup | Description           | Userdata     
----+--------+-------+---------------------+------+------------+---------+-----------------------+--------------0  | single |       |                     | root |            |         | current               |              1* | single |       | 2021-08-17 15:04:56 | root | 708.00 KiB |         | first root filesystem |              2  | single |       | 2021-08-17 15:16:30 | root |  97.22 MiB | number  | after installation    | important=yes5  | pre    |       | 2021-08-17 16:51:45 | root | 224.00 KiB | number  | zypp(zypper)          | important=no 6  | post   |     5 | 2021-08-17 16:51:55 | root | 512.00 KiB | number  |                       | important=no 7  | pre    |       | 2021-08-17 16:53:16 | root |  48.00 KiB | number  | zypp(zypper)          | important=no 8  | post   |     7 | 2021-08-17 16:53:53 | root |   2.48 MiB | number  |                       | important=no 9  | pre    |       | 2021-08-17 17:38:10 | root | 176.00 KiB | number  | zypp(zypper)          | important=no 
10  | post   |     9 | 2021-08-17 17:39:00 | root |   1.74 MiB | number  |                       | important=no 
11  | pre    |       | 2021-08-17 17:39:09 | root |  64.00 KiB | number  | zypp(zypper)          | important=no 
12  | post   |    11 | 2021-08-17 17:39:10 | root |   1.54 MiB | number  |                       | important=no 
13  | pre    |       | 2021-08-22 16:14:22 | root | 136.57 MiB | number  | yast snapper          |              
14  | pre    |       | 2021-08-22 20:28:38 | root | 112.00 KiB | number  | zypp(zypper)          | important=no 
15  | post   |    14 | 2021-08-22 20:28:41 | root | 316.00 KiB | number  |                       | important=no 
16  | pre    |       | 2021-08-22 20:45:24 | root | 336.00 KiB | number  | yast users            |              
17  | post   |    16 | 2021-08-22 20:45:35 | root | 304.00 KiB | number  |                       |  

btrfs命令也提供了类似的功能:

SUSE15:~ # btrfs qgroup show -p /
qgroupid         rfer         excl parent  
--------         ----         ---- ------  
0/5          16.00KiB     16.00KiB ---     
0/256        16.00KiB     16.00KiB ---     
0/257       180.59MiB    180.59MiB ---     
0/258        40.00KiB     40.00KiB ---     
0/259       192.00KiB    192.00KiB ---     
0/260        16.00KiB     16.00KiB ---     
0/261        10.48MiB     10.48MiB ---     
0/262        16.00KiB     16.00KiB ---     
0/263        34.95MiB     34.95MiB ---     
0/264        16.00KiB     16.00KiB ---     
0/265         2.51MiB      2.51MiB ---     
0/266       160.00KiB    160.00KiB ---     
0/267         5.69GiB    708.00KiB ---     
0/275         5.68GiB     97.22MiB 1/0     
0/278         5.69GiB    224.00KiB 1/0     
0/279         5.69GiB    512.00KiB 1/0     
0/280         5.69GiB     48.00KiB 1/0     
0/281         5.69GiB      2.48MiB 1/0     
0/283         5.69GiB    176.00KiB 1/0     
0/284         5.70GiB      1.74MiB 1/0     
0/285         5.69GiB     64.00KiB 1/0     
0/286         5.69GiB      1.54MiB 1/0     
0/288         5.70GiB    136.57MiB 1/0     
0/289         5.69GiB    112.00KiB 1/0     
0/290         5.69GiB    316.00KiB 1/0     
0/291        16.00KiB     16.00KiB ---     
0/292        16.00KiB     16.00KiB ---     
0/293           0.00B        0.00B ---     
0/294           0.00B        0.00B ---     
0/295        16.00KiB     16.00KiB ---     
0/296        16.00KiB     16.00KiB ---     
0/297        16.00KiB     16.00KiB ---     
0/298           0.00B        0.00B ---     
0/299         5.69GiB    336.00KiB 1/0     
0/300         5.69GiB    304.00KiB 1/0     
0/302        16.00KiB     16.00KiB ---     
0/303        16.00KiB     16.00KiB ---     
0/304        16.00KiB     16.00KiB ---     
0/305        16.00KiB     16.00KiB ---     
0/306        16.00KiB     16.00KiB ---     
0/307        48.00KiB     48.00KiB ---     
0/308        16.00KiB     16.00KiB ---     
0/309        48.00KiB     48.00KiB ---     
1/0           6.59GiB    924.74MiB ---  
  • qgroupid 显示子卷的识别号
  • rfer 显示子卷中引用的数据总量
  • excl 显示每个子卷中的独占数据。
  • parent 显示子卷的父 qgroup

最后一项1/0显示父qgroup的总数。在上面的示例中,如果删除所有子卷,将释放924.97MiB。运行以下命令以查看哪些快照与每个子卷相关联:

SUSE15:~ # btrfs subvolume list -st /
ID	gen	cgen	top level	otime	path	
--	---	----	---------	-----	----	
275	69	69	266		2021-08-17 15:16:30	@/.snapshots/2/snapshot
278	215	215	266		2021-08-17 16:51:45	@/.snapshots/5/snapshot
279	218	218	266		2021-08-17 16:51:55	@/.snapshots/6/snapshot
280	222	222	266		2021-08-17 16:53:16	@/.snapshots/7/snapshot
281	227	226	266		2021-08-17 16:53:53	@/.snapshots/8/snapshot
283	283	283	266		2021-08-17 17:38:10	@/.snapshots/9/snapshot
284	287	287	266		2021-08-17 17:39:00	@/.snapshots/10/snapshot
285	289	289	266		2021-08-17 17:39:09	@/.snapshots/11/snapshot
286	292	292	266		2021-08-17 17:39:10	@/.snapshots/12/snapshot
288	2248	2248	266		2021-08-22 16:14:22	@/.snapshots/13/snapshot
289	2435	2435	266		2021-08-22 20:28:38	@/.snapshots/14/snapshot
290	2438	2438	266		2021-08-22 20:28:41	@/.snapshots/15/snapshot
295	2460	2460	292		2021-08-22 20:36:03	@/home/wolf/.snapshots/1/snapshot
296	2462	2462	292		2021-08-22 20:36:06	@/home/wolf/.snapshots/2/snapshot
299	2493	2493	266		2021-08-22 20:45:24	@/.snapshots/16/snapshot
300	2495	2495	266		2021-08-22 20:45:35	@/.snapshots/17/snapshot
302	2517	2517	292		2021-08-22 21:00:20	@/home/wolf/.snapshots/3/snapshot
304	2583	2583	292		2021-08-22 21:52:30	@/home/wolf/.snapshots/4/snapshot
305	2588	2588	292		2021-08-22 21:53:01	@/home/wolf/.snapshots/5/snapshot
306	2599	2599	292		2021-08-22 22:00:25	@/home/wolf/.snapshots/6/snapshot
307	2602	2601	303		2021-08-22 22:00:25	@/tmp/.snapshots/1/snapshot
308	2679	2679	292		2021-08-22 23:00:25	@/home/wolf/.snapshots/7/snapshot
309	2682	2681	303		2021-08-22 23:00:25	@/tmp/.snapshots/2/snapshot

从一个服务包升级到另一个服务包会导致快照对占据磁盘的大量的磁盘空间,建议在不需要这个快照后立即删除它以释放磁盘空间。

相关文章:

SUSE linux的快照和恢复

snapper用于创建和管理文件系统快照&#xff0c;并在需要时实现回滚&#xff0c;它还可以用于创建用户数据的磁盘备份。snapper使用btrfs文件系统或者精简配置的被格式化成XFS或EXT4的LVM卷。snapper可以通过命令行或YaST来进行管理。 btrfs是一种copy-on-write文件系统&#x…...

【Qt快速入门(六)】- QLineEdit按钮的使用

目录 Qt快速入门&#xff08;六&#xff09;- QLineEdit按钮的使用QLineEdit按钮的使用QLineEdit的基本用法1. 创建和设置文本2. 获取输入文本3. 清空输入文本 文本处理1. 选择文本2. 设置光标位置3. 撤销和重做 输入验证1. 输入掩码2. 校验器3. 输入限制 样式设置1. 设置字体和…...

常用损失函数详解:广泛使用的优化约束方法

各类常用损失函数详解&#xff1a;广泛使用的优化约束方法 今天介绍下损失函数&#xff0c;先介绍下我常用的方法SmoothedL1&#xff0c;它是一个平滑的L1 penalty函数,用于处理约束violation。 标准的L1 penalty函数定义为: L 1 ( x ) { 0 , if x ≤ 0 x , if x > 0 …...

鸿蒙开发组件:【创建DataAbility】

创建DataAbility 实现DataAbility中Insert、Query、Update、Delete接口的业务内容。保证能够满足数据库存储业务的基本需求。BatchInsert与ExecuteBatch接口已经在系统中实现遍历逻辑&#xff0c;依赖Insert、Query、Update、Delete接口逻辑&#xff0c;来实现数据的批量处理。…...

配电室数据中心巡检3d可视化搭建的详细步骤

要搭建配电室巡检的3D可视化系统&#xff0c;可以按照以下步骤进行&#xff1a; 收集配电室数据&#xff1a; 首先&#xff0c;需要收集配电室的相关数据&#xff0c;包括配电室的布局、设备信息、传感器数据等。可以通过实地调查、测量和设备手册等方式获取数据。 创建3D模型…...

TIME_WAIT的危害

前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害&#xff0c;以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1&#xff1a;协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…...

搜维尔科技邀您共赴2024第四届轨道车辆工业设计国际研讨会

会议内容 聚焦“创新、设计、突破”&#xff0c;围绕“面向生命健康、可持续发展的轨道交通系统” 为主题&#xff0c;从数字化、智能化、人性化、绿色发展等方面&#xff0c;探索轨道交通行业的设计新趋势及发展新机遇。 举办时间 2024年7月10日-12日 举办地点 星光岛-青岛融…...

智能中人类造成的风险、机器造成的风险、环境造成的风险

在使用智能技术时&#xff0c;可能会面临各种类型的风险。以下是一些可能的风险情况&#xff1a; 1、人类造成的风险 错误判断和决策&#xff1a;人类在使用智能系统时可能会因为各种原因做出错误的判断和决策&#xff0c;导致不良后果。人为错误&#xff1a;技术操作人员、维护…...

MYSQL基础查询

示例&#xff1a;user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42315female23浙江大学Zhejiang55432male25山东大学Shandong 查询所有列 select * from user_profile&#xff1b;查询…...

【Golang】Go 中的生产者-消费者模式

Go 中的生产者-消费者模式 来源:https://medium.com/@mm.nikfarjam/the-producer-consumer-pattern-in-go-cf97299a0320 文章目录 Go 中的生产者-消费者模式介绍关键组件在 Go 中的实现结论Go 中的生产者-消费者模式 介绍 生产者-消费者模式是处理大数据的最常见设计模式之一…...

【通过新能源汽车的智慧数字底盘技术看计算机的相关技术堆栈?以后是软硬结合的全能程序员的天下,取代全栈(前后端都会的全栈程序员)】

汽车的“智慧数字底盘”是一个综合性的技术平台&#xff0c;旨在提升车辆的性能、安全性和驾驶体验。它集成了多种先进的技术和系统&#xff0c;是全能程序员的必杀技&#xff01; 1. 传感器技术 a. 激光雷达&#xff08;LiDAR&#xff09; 用于生成高分辨率的3D地图&#…...

Python网络爬虫4-实战爬取pdf

1.需求背景 爬取松产品中心网站下的家电说明书。这里以冰箱为例&#xff1a;松下电器-冰箱网址 网站分析&#xff1a; 第一步&#xff1a; 点击一个具体的冰箱型号&#xff0c;点击了解更多&#xff0c;会打开此型号电器的详情页面。 第二步&#xff1a;在新打开的详情页面中…...

超神级!Markdown最详细教程,程序员的福音

超神级&#xff01;Markdown最详细教程&#xff0c;程序员的福音Markdown最详细教程&#xff0c;关于Markdown的语法和使用就先讲到这里&#xff0c;如果喜欢&#xff0c;请关注“IT技术馆”。馆长会更新​最实用的技术&#xff01;https://mp.weixin.qq.com/s/fNzhLFyYRd3skG-…...

Android OTA 升级基础知识详解+源码分析

前言&#xff1a; 本文仅仅对OTA升级的几种方式的概念和运用进行总结&#xff0c;仅在使用层面对其解释。需要更详细的内容我推荐大神做的全网最详细的讲解&#xff1a; https://blog.csdn.net/guyongqiangx/article/details/129019303?spm1001.2014.3001.5502 三种升级方式…...

【吊打面试官系列-Mysql面试题】SQL 语言包括哪几部分?每部分都有哪些操作关键字?

大家好&#xff0c;我是锋哥。今天分享关于 【SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; SQL 语言包括哪几部分&#xff1f;每部分都有哪些操作关键字&#xff1f; SQL 语言包括数据定义(DDL)、…...

Redis的缓存击穿与解决

缓存击穿问题也叫热点Key问题&#xff0c;就是一个被高并发访问并且缓存重建业务较复杂的Key突然失效了&#xff0c;无数的请求访问会在瞬间给数据库带来巨大的冲击。 Redis实战篇 | Kyles Blog (cyborg2077.github.io) 目录 解决方案 互斥锁 实现 逻辑过期 实现 解决方案…...

网络层 IP协议【计算机网络】【协议格式 || 分片 || 网段划分 || 子网掩码】

博客主页&#xff1a;花果山~程序猿-CSDN博客 文章分栏&#xff1a;Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习&#xff0c;一起进步&#xff0c;一起探索编程的无限可能吧&#xff01;让我们一起努力&#xff0c;一起成长&#xff01; 目录 一&#xff0c;前提 二&…...

Python学习笔记14:进阶篇(三)。类的终结篇,类的导入和模块的导入。

前言 这篇文章属于类知识的最后一篇&#xff0c;带一点点其他知识&#xff0c;学习内容来自于Python crash course。 关注我私信发送Python crash course&#xff0c;分享一份中文版PDF。 类的导入 在学习的时候&#xff0c;包括之前&#xff0c;我都是在一个文件中把所有代…...

C++ lambda表达式举例

C lambda表达式 Lambda表达式是一种简洁的方式来创建匿名函数&#xff0c;可以直接在函数调用的地方定义&#xff0c;主要用于简化代码。 Lambda表达式的基本语法如下&#xff1a; [capture](parameters) -> return_type {// function body };示例1&#xff1a;基本用法 …...

持续总结中!2024年面试必问 20 道设计模式面试题(五)

上一篇地址&#xff1a;持续总结中&#xff01;2024年面试必问 20 道设计模式面试题&#xff08;四&#xff09;-CSDN博客 九、请解释代理模式&#xff08;Proxy Pattern&#xff09;及其类型。 代理模式&#xff08;Proxy Pattern&#xff09;是一种结构设计模式&#xff0c…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

均衡后的SNRSINR

本文主要摘自参考文献中的前两篇&#xff0c;相关文献中经常会出现MIMO检测后的SINR不过一直没有找到相关数学推到过程&#xff0c;其中文献[1]中给出了相关原理在此仅做记录。 1. 系统模型 复信道模型 n t n_t nt​ 根发送天线&#xff0c; n r n_r nr​ 根接收天线的 MIMO 系…...

在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?

uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件&#xff0c;用于在原生应用中加载 HTML 页面&#xff1a; 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...