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 快照类型
根据触发它们的事件,快照分为了三种类型:
- Timeline Snapshots
每小时创建一个快照,旧的快照将会自动被删除。默认情况下,过去10天,一个月和一年的第一份快照将会被保留。默认情况下该快照是关闭的。
- Installation Snapshots
安装软件后,会创建一对快照:安装前(pre)的和安装后的(post)。如果是安装比较重要的包比如内核,快照对还会被标记上important
。旧的快照同样会被自动删除。默认情况下,过去的十个重要快照和十个常规快照将会被保留。默认情况下该快照是开启的。
- 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操作
- 从YaST中的“杂项”部分或输入“yast2 Snapper”启动“Snapper*”模块。
- 选择要从中选择快照的“当前配置”。
- 选择要从中恢复文件的时间轴快照,然后选择“显示更改”。时间轴快照的类型为Single,描述值为Timeline。
- 单击文件名,从文本框中选择一个文件。显示了快照版本与当前系统之间的差异。激活复选框以选择要还原的文件。对所有要恢复的文件执行此操作。
2.2.2 CLI操作
- 通过以下命令获取特定配置的时间轴快照列表:
sudo snapper -c CONFIG list -t single | grep timeline
CONFIG需要替换为现有Snapper配置。使用snapper列表配置来显示列表。
- 通过以下命令获取给定快照的更改文件列表:
sudo snapper -c CONFIG status SNAPSHOT_ID..0
将SNAPSHOT_ID替换为要从中恢复文件的快照的ID。
- 可以选择通过运行以下命令列出当前文件版本与快照中的文件版本之间的差异
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)才能实现引导。
启动快照时,快照中包含的文件系统部分以只读方式挂载; 从快照中排除的所有其他文件系统和部分都以读写方式挂载并且可以修改。
要从可引导快照回滚,必须满足以下要求。进行默认安装时,系统会进行相应设置。
- 根文件系统必须是btrfs,不支持LVM卷
- 根文件系统必须是一个单独的设备,分区或子卷。快照中排除的部分分区如
/srv
可能驻留在单独的分区上。 - 系统需要能够通过已安装的引导加载程序进行引导。
回滚操作步骤:
- 启动系统后,选择*Bootable snapshots *并选择需要启动的快照,快照会以时间为前缀命名。
- 登陆系统,检查系统工作是否正常。
- 决定是否回滚。
- 如果不想要回滚到这个快照,重启并引导现有的系统,或者是选择其他快照。
- 如果想回滚,执行命令
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)
- 如果快照被标记为important,则会有
*
标记 - 操作系统名称和版本
- 内核版本
- 快照创建日期
- 快照创建时间
- 快照的描述。手工创建的描述可以通过
--description
选项来添加描述。
可以通过修改的方式对现有的自动创建的快照进行描述调整。例如要将快照5的描述修改为post-initial,可以使用命令
snapper modify --userdata "bootloader=post-initial" 5
。自定义的描述不能超过25个字符,否则会无法启动。
3.3 限制条件
由于系统随时在产生临时文件,因此是不可能完全回滚到某一个状态的。
3.3.1 快照排除的目录
由于根文件系统不可能包含所有的目录,因此这些目录是无法恢复的,因此快照会有如下限制:
-
附加的和第三方软件可能会在回滚后无法使用,解决的办法只有重新安装应用。
-
文件访问问题,如果做了快照后应用修改了文件的权限或属组(用户),那么回滚可能会导致应用无法访问这些文件。这样就只能在回滚后重置权限设置。
-
不兼容的数据格式。如果在做了快照后服务或应用建立了新的数据格式。在回滚后应用可能不能读取收到影响的数据。
-
混合代码和数据的子卷。一些子卷如
/srv
可能既包含代码也包含数据。回滚可能会导致出现无法执行的代码。例如,PHP版本的降级可能会导致Web服务器的PHP脚本损坏。 -
用户数据。如果回滚导致用户被删除,但相关的数据由于被排除在快照之外而没有被删除。如果系统又创建了相同user ID的用户,那么这个用户将会继承旧的数据,可通过
find
命令找到并删除这些文件。
3.3.2 引导加载数据无法回滚
系统无法实现引导加载程序的回滚。
4 开启用户家目录快照
家目录的快照是支持,它支持多种用例:
- 个人用户管理自己的快照和回滚
- 系统用户,如想要跟踪配置文件、文档等副本的数据库、系统和网络管理员。
- samba与家目录和btrfs后端共享
用户目录都是btrfs目录/home
的子卷,可以手工设置快照。但是更方便的方式是使用pam_snapper
,pam_snapper包安装了pam_snapper.so模块和帮助程序脚本,它们可以自动创建用户和配置Snapper。
pam_snapper
集成了useradd
命令,pam和snapper。它默认会在用户登录和注销时创建快照,并且还会在某些用户长时间保持登录状态时创建基于时间的快照。 通过Snapper命令或修改配置文件更改默认值。
4.1 安装pam_snapper并创建用户
- 安装软件
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
- 添加配置文件
SUSE15:~ # vim /etc/pam.d/common-sessionsession optional pam_snapper.so #添加到最后一行
- 使用脚本文件创建新用户和家目录,脚本默认是试运行状态,因此需要先关闭。
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’
- 在用户第一次登陆时,
/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用户执行以下操作):
- 创建配置
SUSE15: # snapper -c tmp-data create-config /tmp
-
根据需要调整配置参数
-
通过设置
ALLOW_USERS``ALLOW_GROUPS
来给用户/组授权,多个条目使用空格隔开。
SUSE15:/opt # snapper -c tmp-data set-config ALLOW_USERS=wolf SYNC_ACL="yes"
- 查看配置
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快照
以下元数据可用于每个快照:
Type
:快照类型,不可修改。Number
:快照的唯一编号,不可修改Pre Number
:指定对应的pre快照编号。 仅适用于post类型的快照。不可修改Description
:快照描述Userdata
:指定用户数据的扩展描述,使用逗号隔开。例如reason=testing, project=foo
,也用来标示快照是否重要,以及列出快照的创建者。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 显示快照占用的磁盘空间
由于快照会共享当前状态的数据,因此常规的du
和df
命令不能查看快照具体占用的空间大小。当需要释放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
从一个服务包升级到另一个服务包会导致快照对占据磁盘的大量的磁盘空间,建议在不需要这个快照后立即删除它以释放磁盘空间。
相关文章:
![](https://img-blog.csdnimg.cn/direct/6676189285d14986a8180b851835c5c9.png#pic_center)
SUSE linux的快照和恢复
snapper用于创建和管理文件系统快照,并在需要时实现回滚,它还可以用于创建用户数据的磁盘备份。snapper使用btrfs文件系统或者精简配置的被格式化成XFS或EXT4的LVM卷。snapper可以通过命令行或YaST来进行管理。 btrfs是一种copy-on-write文件系统&#x…...
![](https://www.ngui.cc/images/no-images.jpg)
【Qt快速入门(六)】- QLineEdit按钮的使用
目录 Qt快速入门(六)- QLineEdit按钮的使用QLineEdit按钮的使用QLineEdit的基本用法1. 创建和设置文本2. 获取输入文本3. 清空输入文本 文本处理1. 选择文本2. 设置光标位置3. 撤销和重做 输入验证1. 输入掩码2. 校验器3. 输入限制 样式设置1. 设置字体和…...
![](https://www.ngui.cc/images/no-images.jpg)
常用损失函数详解:广泛使用的优化约束方法
各类常用损失函数详解:广泛使用的优化约束方法 今天介绍下损失函数,先介绍下我常用的方法SmoothedL1,它是一个平滑的L1 penalty函数,用于处理约束violation。 标准的L1 penalty函数定义为: L 1 ( x ) { 0 , if x ≤ 0 x , if x > 0 …...
![](https://www.ngui.cc/images/no-images.jpg)
鸿蒙开发组件:【创建DataAbility】
创建DataAbility 实现DataAbility中Insert、Query、Update、Delete接口的业务内容。保证能够满足数据库存储业务的基本需求。BatchInsert与ExecuteBatch接口已经在系统中实现遍历逻辑,依赖Insert、Query、Update、Delete接口逻辑,来实现数据的批量处理。…...
![](https://img-blog.csdnimg.cn/img_convert/28481725a5ab3bb3ed41c94cbc0deac4.png)
配电室数据中心巡检3d可视化搭建的详细步骤
要搭建配电室巡检的3D可视化系统,可以按照以下步骤进行: 收集配电室数据: 首先,需要收集配电室的相关数据,包括配电室的布局、设备信息、传感器数据等。可以通过实地调查、测量和设备手册等方式获取数据。 创建3D模型…...
![](https://img-blog.csdnimg.cn/direct/d25ec473b610460596a9e48b8914ada1.png)
TIME_WAIT的危害
前言 该文章主要讨论下TIME_WAIT的存在意义和潜在危害,以及解决措施。 具体内容 首先看一下下面这幅图 这幅图来自《TCP IP详解卷1:协议 原书第2版中文》TCP状态变迁图。 TIME_WAIT存在意义 可靠的终止TCP连接。 保证让迟来的TCP报文有足够的时间被…...
![](https://img-blog.csdnimg.cn/img_convert/d21d8225a4d01c256104118159d249a7.jpeg)
搜维尔科技邀您共赴2024第四届轨道车辆工业设计国际研讨会
会议内容 聚焦“创新、设计、突破”,围绕“面向生命健康、可持续发展的轨道交通系统” 为主题,从数字化、智能化、人性化、绿色发展等方面,探索轨道交通行业的设计新趋势及发展新机遇。 举办时间 2024年7月10日-12日 举办地点 星光岛-青岛融…...
![](https://www.ngui.cc/images/no-images.jpg)
智能中人类造成的风险、机器造成的风险、环境造成的风险
在使用智能技术时,可能会面临各种类型的风险。以下是一些可能的风险情况: 1、人类造成的风险 错误判断和决策:人类在使用智能系统时可能会因为各种原因做出错误的判断和决策,导致不良后果。人为错误:技术操作人员、维护…...
![](https://www.ngui.cc/images/no-images.jpg)
MYSQL基础查询
示例:user_profile iddevice_idgenderageuniversityprovince12138male21北京大学Beijing23214male复旦大学Shanghai36543female20北京大学Beijing42315female23浙江大学Zhejiang55432male25山东大学Shandong 查询所有列 select * from user_profile;查询…...
![](https://www.ngui.cc/images/no-images.jpg)
【Golang】Go 中的生产者-消费者模式
Go 中的生产者-消费者模式 来源:https://medium.com/@mm.nikfarjam/the-producer-consumer-pattern-in-go-cf97299a0320 文章目录 Go 中的生产者-消费者模式介绍关键组件在 Go 中的实现结论Go 中的生产者-消费者模式 介绍 生产者-消费者模式是处理大数据的最常见设计模式之一…...
![](https://img-blog.csdnimg.cn/direct/6ad91c8537e744e19c9951dced8a8e1e.png#pic_center)
【通过新能源汽车的智慧数字底盘技术看计算机的相关技术堆栈?以后是软硬结合的全能程序员的天下,取代全栈(前后端都会的全栈程序员)】
汽车的“智慧数字底盘”是一个综合性的技术平台,旨在提升车辆的性能、安全性和驾驶体验。它集成了多种先进的技术和系统,是全能程序员的必杀技! 1. 传感器技术 a. 激光雷达(LiDAR) 用于生成高分辨率的3D地图&#…...
![](https://img-blog.csdnimg.cn/direct/7f5751d1c569472ebe333d8ef52b438d.png)
Python网络爬虫4-实战爬取pdf
1.需求背景 爬取松产品中心网站下的家电说明书。这里以冰箱为例:松下电器-冰箱网址 网站分析: 第一步: 点击一个具体的冰箱型号,点击了解更多,会打开此型号电器的详情页面。 第二步:在新打开的详情页面中…...
![](https://csdnimg.cn/release/blog_editor_html/release2.3.6/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=N7T8)
超神级!Markdown最详细教程,程序员的福音
超神级!Markdown最详细教程,程序员的福音Markdown最详细教程,关于Markdown的语法和使用就先讲到这里,如果喜欢,请关注“IT技术馆”。馆长会更新最实用的技术!https://mp.weixin.qq.com/s/fNzhLFyYRd3skG-…...
![](https://img-blog.csdnimg.cn/direct/607bc7dfcb024cf48af91cbab3a66819.png)
Android OTA 升级基础知识详解+源码分析
前言: 本文仅仅对OTA升级的几种方式的概念和运用进行总结,仅在使用层面对其解释。需要更详细的内容我推荐大神做的全网最详细的讲解: https://blog.csdn.net/guyongqiangx/article/details/129019303?spm1001.2014.3001.5502 三种升级方式…...
![](https://img-blog.csdnimg.cn/direct/acdef14411714c9fa60d5c606f88f49b.png)
【吊打面试官系列-Mysql面试题】SQL 语言包括哪几部分?每部分都有哪些操作关键字?
大家好,我是锋哥。今天分享关于 【SQL 语言包括哪几部分?每部分都有哪些操作关键字?】面试题,希望对大家有帮助; SQL 语言包括哪几部分?每部分都有哪些操作关键字? SQL 语言包括数据定义(DDL)、…...
![](https://img-blog.csdnimg.cn/direct/b33b610247674d40919bc41340015dd0.png)
Redis的缓存击穿与解决
缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的Key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。 Redis实战篇 | Kyles Blog (cyborg2077.github.io) 目录 解决方案 互斥锁 实现 逻辑过期 实现 解决方案…...
![](https://img-blog.csdnimg.cn/direct/9e6f83e4b0b0406a8a7f2b03fb9bccf8.png)
网络层 IP协议【计算机网络】【协议格式 || 分片 || 网段划分 || 子网掩码】
博客主页:花果山~程序猿-CSDN博客 文章分栏:Linux_花果山~程序猿的博客-CSDN博客 关注我一起学习,一起进步,一起探索编程的无限可能吧!让我们一起努力,一起成长! 目录 一,前提 二&…...
![](https://img-blog.csdnimg.cn/direct/ee690ab510204494b3d171365cbb89ad.png)
Python学习笔记14:进阶篇(三)。类的终结篇,类的导入和模块的导入。
前言 这篇文章属于类知识的最后一篇,带一点点其他知识,学习内容来自于Python crash course。 关注我私信发送Python crash course,分享一份中文版PDF。 类的导入 在学习的时候,包括之前,我都是在一个文件中把所有代…...
![](https://www.ngui.cc/images/no-images.jpg)
C++ lambda表达式举例
C lambda表达式 Lambda表达式是一种简洁的方式来创建匿名函数,可以直接在函数调用的地方定义,主要用于简化代码。 Lambda表达式的基本语法如下: [capture](parameters) -> return_type {// function body };示例1:基本用法 …...
![](https://www.ngui.cc/images/no-images.jpg)
持续总结中!2024年面试必问 20 道设计模式面试题(五)
上一篇地址:持续总结中!2024年面试必问 20 道设计模式面试题(四)-CSDN博客 九、请解释代理模式(Proxy Pattern)及其类型。 代理模式(Proxy Pattern)是一种结构设计模式,…...
![](https://img-blog.csdnimg.cn/img_convert/076ecda07a4015305953549c8d73c388.png)
嵌入式面经111题答案汇总(含技术答疑)_嵌入式项目源码分享
111道嵌入式面试题答案汇总专栏链接(承诺免费技术答疑) --> 《嵌入式/C面试题解析大全》 1、简介 本人是2020年毕业于广东工业大学研究生:许乔丹,有国内大厂CVTE和世界500强企业工作经验,整理超全面111道嵌入式面试…...
![](https://img-blog.csdnimg.cn/img_convert/64b4acc5b9fd54de320522a486117847.gif)
鸿蒙开发通信与连接:【@ohos.connectedTag (有源标签)】
有源标签 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 导入模块 import connectedTag from ohos.connectedTag;connectedTag.init init(): boolean 初始化有源标签芯片。 需要权限&#…...
![](https://www.ngui.cc/images/no-images.jpg)
在线编程工具
1.C语言在线编程 https://www.jyshare.com/compile/11/ 2.java在线编程 https://www.w3cschool.cn/tryrun/runcode1?langjava 3.Python在线编程 https://www.python123.io/index/playground/python?ivk_sa1024320u...
![](https://img-blog.csdnimg.cn/direct/8380c8c294a04b508433106b944e5411.png)
NSSCTF中的[WUSTCTF 2020]朴实无华、[FSCTF 2023]源码!启动! 、[LitCTF 2023]Flag点击就送! 以及相关知识点
目录 [WUSTCTF 2020]朴实无华 [FSCTF 2023]源码!启动! [LitCTF 2023]Flag点击就送! 相关知识点 1.intval 绕过 绕过的方式: 2.session伪造攻击 [WUSTCTF 2020]朴实无华 1.进入页面几乎没什么可用的信息,所以想到使用dis…...
![](https://img-blog.csdnimg.cn/direct/4ec9b82204744a9bacfab400d95e5b15.png)
Vue49-props属性
一、当同一个组件标签被使用多次 因为data属性写的是函数形式! 二、需求:老王也想用<Student>组件,但是需要动态把老王想要的值传进来。 2-1、使用props属性接收参数 使用props属性,接收的这三个参数,是被保存在…...
![](https://img-blog.csdnimg.cn/direct/efc5862ce25848179ef251948960c5aa.png)
CVE-2020-1957 漏洞复现
先声明一下,免杀还是会更的,不过中间可能会穿插一下渗透的内容!!! 踩坑点: 在一开始翻阅了CSDN之后,发现不同文章之间存在出入,于是最后去了CVE的官方文档,和参考一些国…...
![](https://img-blog.csdnimg.cn/img_convert/c8aec51305027aa2ce362cec39ea7ef1.jpeg)
网工内推 | 中国电信、香港宽频系统工程师,CCIE认证优先,最高年薪25w
01 中国电信股份有限公司浙江分公司 🔷招聘岗位:系统架构师 🔷岗位职责: 1、做好客户网络和信息安全产品的解决方案支撑、交付及后续运营维护,做好相关产数项目的支撑。 2、根据信息安全管理要求,负责客户…...
![](https://img-blog.csdnimg.cn/direct/ad4d1236df0941f09853cd4523d19ae0.png)
LLVM后端 td文件 tablegen 模式匹配 寄存器 指令集 calling convention
目录 一、寄存器 1.1 寄存器定义 1.2 寄存器分类 二、指令集 2.1 指令集定义 2.2 模式匹配 2.2.1 PatFrags与PatFrag 2.2.2 OutPatFrag 2.2.3 PatLeaf 2.2.4 ImmLeaf 2.2.5 IntImmLeaf和FPImmLeaf 2.2.6 Pat 2.2.7 ComplexPattern 2.3 指令合法化 2.3.1 Promote…...
![](https://www.ngui.cc/images/no-images.jpg)
嵌入式交叉编译:frp
参考 LINUX FRP下载编译_linux编译frpc-CSDN博客 编译 make -f Makefile.cross-compiles 检查 $ make -f Makefile.cross-compiles Build darwin-amd64... Build darwin-amd64 done Build darwin-arm64... Build darwin-arm64 done Build freebsd-amd64... Build freebsd-…...
![](https://img-blog.csdnimg.cn/direct/dffb8e3f5d2842518e0fe54bc13c87cc.png)
SpringBoot实现的大文件上传
前言 大文件分片上传和断点续传是为了解决在网络传输过程中可能遇到的问题,以提高文件传输的效率和稳定性。 首先,大文件分片上传是将大文件分割成较小的片段进行上传。这样做的好处是可以减少单个文件的传输时间,因为较小的文件片段更容易快…...
![](/images/no-images.jpg)
建行官方网站登录/发广告平台有哪些
html标签 - 可以实现多种滚动效果,无需js控制。使用marquee标记不仅可以移动文字,也可以移动图片,表格等.只需要在内部输入要滚动的内容即可。一、标签属性1.滚动方向direction(包括4个值:up、 down、 left和 right)语法ÿ…...
wordpress 七牛云加速/优就业seo课程学多久
minimum spanning tree(MST) 最小生成树是连通无向带权图的一个子图,要求 能够连接图中的所有顶点、无环、路径的权重和为所有路径中最小的. graph-cut 对图的一个切割或者叫切断,会使图分离成为两个不相连的顶点集. 它基于树的两个基本属性:…...
![](https://img-blog.csdnimg.cn/img_convert/5c8a92ae923908a932913e5ecf391cdb.png)
微信小程序一站式开发/快速优化seo
早先关注我们的朋友可能对《国外开发者尝试在树莓派3上运行Windows 10桌面版》有印象。本文转自 amatfan.com,文末视频来自 daveb778(感谢柠栀和刺分享),给出了如何在树莓派3B上安装Windows10 ARM版,是的,这次并非IoT版࿰…...
![](http://www.gxlcms.com/Uploads-s/new/2019-11-04-201904-Python/5ce36078b6fb1219.jpg)
新网网站备案流程/打广告推广怎么做
在Python中::-1表示将字符或数字倒序输出。举个栗子,当line "abcde"时,使用语句line[::-1],最后的运行结果为:edcba。下面请看详细解释。一、反转 ::-1涉及到将数字或字符…...
![](https://img-blog.csdnimg.cn/img_convert/f09c30ecb5918316055c3bf695906c74.png)
手机免费网站建设/关键词优化搜索排名
志存高远展宏图,夯实根基助远航,1月23日至25日,柳林农商银行新一代柜面系统培训工作与市级同步开展,确保最快将新知识、新理念传达到每一名柜员,带着对新系统的憧憬、对高质量发展的渴求,培训工作缓缓拉开帷…...
![](/images/no-images.jpg)
上海网站建设哪里便宜/网站链接提交收录
教程: https://www.jianshu.com/p/55cfc9fcb69e https://wallimn.iteye.com/blog/2425666 关于websocket基础普及见:https://www.cnblogs.com/graybird/p/11248528.html 转载于:https://www.cnblogs.com/graybird/p/11248491.html...