用好了下一代文件系统 Btrfs 这些新特性,从此数据安全乐无忧!

2023-05-16

对于大部分文件系统来说,在磁盘上创建好文件系统,然后再挂载到系统中去就完事了。但对于 Btrfs 来说,除了在格式化和挂载的时候指定不同的参数外,还支持很多其他的功能。比如:管理多块硬盘、支持 LVM 和 RAID 等,具体的可以参考它的「官方文档」或者「Linux 下常见文件系统对比」。

Btrfs 是 Oracle 07 年基于 GPL 协议开源的 Linux 文件系统,其目的是替换传统的 Ext3、Ext4 系列文件系统。Ext 系列文件系统存在着诸多问题,比如反删除能力有限等;而 Btrfs 在解决问题同时提供了更加强大的高级特性。

Btrfs 特性

Btrfs 在文件系统级别支持写时复制 (COW) 机制,并且支持快照 (增量快照)、支持对单个文件快照;同时支持单个超大文件、文件检查、内建 RAID;支持 B 树子卷 (组合多个物理卷,多卷支持) 等。具体如下:

Btrfs 核心特性:

  • 多物理卷支持:Btrfs 可有多个物理卷组成 (类似 LVM);支持 RAID 以及联机 添加、删除、修改

  • 写时复制更新机制 (COW):复制、更新、替换指针,而非传统意义上的覆盖

  • 支持数据及元数据校验码:Checksum 机制

  • 支持创建子卷:Subvolume 机制,同时可多层创建

  • 支持快照:基于 COW 实现快照,并且相对于 LVM 可以实现快照的快照 (增量快照)

  • 支持透明压缩:后台自动压缩文件(消耗一定 CPU),对前端程序透明

Btrfs 是 Linux 下大家公认的将会替代 ext4 的下一代文件系统,功能非常强大。本篇不会介绍 Btrfs 的原理,也不会介绍 Btrfs 的所有功能,只是挑了其中的 Subvolume 和 Snapshot 这两个特性来进行介绍。

本篇所有例子都在 Ubuntu-Server-X86_64 16.04 下执行通过。

准备环境

先创建一个虚拟的硬盘,然后将它格式化成 Btrfs,最后将它挂载到目录 /mnt/btrfs 。

# 为了简单起见,这里只使用一块硬盘来做测试(Btrf s可以管理多块硬盘或分区)。	
# 新建一个文件,用来虚拟一块硬盘。	
dev@ubuntu:~$ fallocate -l 512M /tmp/btrfs.img	

	
# 在上面创建 Btrfs 文件系统	
dev@ubuntu:~$ mkfs.btrfs /tmp/btrfs.img	
btrfs-progs v4.4	
See http://btrfs.wiki.kernel.org for more information.	

	
Label:              (null)	
UUID:               fd5efcd3-adc2-406b-a684-e6c87dde99a1	
Node size:          16384	
Sector size:        4096	
Filesystem size:    512.00MiB	
Block group profiles:	
  Data:             single            8.00MiB	
  Metadata:         DUP              40.00MiB	
  System:           DUP              12.00MiB	
SSD detected:       no	
Incompat features:  extref, skinny-metadata	
Number of devices:  1	
Devices:	
   ID        SIZE  PATH	
    1   512.00MiB  /tmp/btrfs.img	

	
# 创建文件夹并挂载	
dev@ubuntu:~$ sudo mkdir /mnt/btrfs	
dev@ubuntu:~$ sudo mount /tmp/btrfs.img /mnt/btrfs	

	
# 修改权限,这样后面的部分操作就不再需要 sudo	
dev@ubuntu:~$ sudo chmod 777 /mnt/btrfs

Subvolume

可以把 Subvolume 理解为一个虚拟的设备,由 Btrfs 管理,创建好了之后就自动挂载到了 Btrfs 文件系统的一个目录上,所以我们在文件系统里面看到的 Subvolume 就是一个目录,但它是一个特殊的目录,具有挂载点的一些属性。

新创建的 Btrfs 文件系统会创建一个路径为 “/” 的默认 Subvolume,即 Root Subvolume。其 ID 为 5(别名为 0),这是一个 ID 和目录都预设好的 Subvolume。

# 这里从 mount 的参数 “subvolid=5,subvol=/” 就可以看出来默认的 Root Subvolume 的 id 为 5,路径为 “/” 。	
dev@debian:/mnt/btrfs$ mount|grep btrfs	
/dev/loop1 on /mnt/btrfs type btrfs (rw,relatime,space_cache,subvolid=5,subvol=/)

创建 Subvolume

这里我们将会利用 Btrfs 提供的工具创建两个新 Subvolume 和两个文件夹,来看看他们之间的差别

dev@ubuntu:~$ cd /mnt/btrfs	
# btrfs 命令是 Btrfs 提供的应用层工具,可以用来管理 Btrfs。	
# 这里依次创建两个 Subvolume,创建完成之后会自动在当前目录下生成两个目录。	
dev@ubuntu:/mnt/btrfs$ btrfs subvolume create sub1	
Create subvolume './sub1'	
dev@ubuntu:/mnt/btrfs$ btrfs subvolume create sub2	
Create subvolume './sub2'	

	
# 创建两个文件夹	
dev@ubuntu:/mnt/btrfs$ mkdir dir1 dir2	

	
# 在sub1、sub2 和 dir1 中分别创建一个文件	
dev@ubuntu:/mnt/btrfs$ touch dir1/dir1-01.txt	
dev@ubuntu:/mnt/btrfs$ touch sub1/sub1-01.txt	
dev@ubuntu:/mnt/btrfs$ touch sub2/sub2-01.txt	

	
# 最后看看目录结构,是不是看起来 sub1 和 dir1 没什么区别?	
dev@ubuntu:/mnt/btrfs$ tree	
.	
├── dir1	
│   └── dir1-01.txt	
├── dir2	
├── sub1	
│   └── sub1-01.txt	
└── sub2	
    └── sub2-01.txt

不过由于每个 Subvolume 都是一个单独的虚拟设备,所以无法跨 Subvolume 建立硬链接。

# 虽然 sub1 和 sub2 属于相同的 Btrfs 文件系统,并且在一块物理硬盘上。但由于他们属于不同的 Subvolume,所以在它们之间建立硬链接失败。	
dev@ubuntu:/mnt/btrfs$ ln ./sub1/sub1-01.txt ./sub2/	
ln: failed to create hard link './sub2/sub1-01.txt' => './sub1/sub1-01.txt': Invalid cross-device link

删除 Subvolume

Subvolume 不能用 rm 命令来删除的,只能通过 btrfs 命令来删除。

# 普通的目录通过 rm 命令就可以被删除	
dev@ubuntu:/mnt/btrfs$ rm -r dir2	

	
# 通过 rm 命令删除 Subvolume 就会失败	
dev@ubuntu:/mnt/btrfs$ sudo rm -r sub2	
rm: cannot remove 'sub2': Operation not permitted	

	
# 需要通过 btrfs 命令才能删除,删除 sub2 成功(就算 Subvolume 里面有文件也能被删除)	
dev@ubuntu:/mnt/btrfs$ sudo btrfs subvolume del sub2	
Delete subvolume (no-commit): '/mnt/btrfs/sub2'	
dev@ubuntu:/mnt/btrfs$ tree	
.	
├── dir1	
│   └── dir1-01.txt	
└── sub1	
    └── sub1-01.txt

上面删除的时候可以看到这样的提示:Delete subvolume (no-commit),表示 Subvolume 被删除了,但没有提交。意思是在内存里面生效了,但磁盘上的内容还没删,意味着如果这个时候系统 Crash 掉,这个 Subvolume 有可能还会回来。Btrfs 这样做的好处是删除速度很快,不会影响使用,缺点是有可能在后台 Commit 的过程中系统挂掉,导致 Commit 失败。

为了确保 Subvolume 里的数据被真正的从磁盘上移除掉,可以在删除 Subvolume 的时候指定 -c 参数,这样 btrfs命令会等提交完成之后再返回。

dev@ubuntu:/mnt/btrfs$ sudo btrfs subvolume del -c sub2	
Delete subvolume (commit): '/mnt/btrfs/sub2'

挂载 Subvolume

Subvolume 可以直接通过 mount 命令进行挂载,和挂载其它设备没什么区别,具体的挂载参数请查看参考官方文档。

# 创建一个用于挂载点的目录	
dev@ubuntu:/mnt/btrfs$ sudo mkdir /mnt/sub1	

	
# 先查看待挂载的 Subvolume 的 id	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume list /mnt/btrfs/	
ID 256 gen 9 top level 5 path sub1	

	
# 通过 -o 参数来指定要挂载的 Subvolume 的 ID	
# 通过路径来挂载也是一样的效果:sudo mount -o subvol=/sub1 /tmp/btrfs.img /mnt/sub1/	
dev@debian:/mnt/btrfs$ sudo mount -o subvolid=256 /tmp/btrfs.img /mnt/sub1/	
dev@debian:/mnt/btrfs$ tree /mnt/sub1/	
/mnt/sub1/	
└── sub1-01.txt

设置 Subvolume 只读

Subvolume 可以被设置成只读状态。

# 通过 btrfs property 可以查看和修改 Subvolume 的只读状态	
# 默认情况下,Subvolume 的只读属性为 false,即允许写	
dev@ubuntu:/mnt/btrfs$ btrfs property get -ts ./sub1/	
ro=false	

	
# 将 sub1 的只读属性设置成 true	
dev@ubuntu:/mnt/btrfs$ btrfs property set -ts ./sub1/ ro true	
dev@ubuntu:/mnt/btrfs$ btrfs property get -ts ./sub1	
ro=true	

	
# 写文件失败,提示文件系统只读	
dev@ubuntu:/mnt/btrfs$ touch ./sub1/sub1-02.txt	
touch: cannot touch './sub1/sub1-02.txt': Read-only file system	

	
# 将sub1的状态改回去,以免影响后续测试	
dev@ubuntu:/mnt/btrfs$ btrfs property set -ts ./sub1/ ro false

Snapshot

可以在 Subvolume 的基础上制作快照,几点需要注意:

  • 默认情况下 Subvolume 的快照是可写的

  • 快照是特殊的 Subvolume,具有 Subvolume 的属性。所以快照也可以通过 mount 挂载,也可以通过 btrfs property 命令设置只读属性

  • 由于快照的本质就是一个 Subvolume ,所以可以在快照上面再做快照

在 Subvolume 上做了快照后,Subvolume 和快照就会共享所有的文件。只有当文件更新的时候,才会触发 COW(copy on write),所以创建快照很快,基本不花时间。并且 Btrfs 的 COW 机制很高效,就算多个快照共享一个文件,更新这个文件也和更新一个普通文件差不多的速度。

如果用过 Git 的话,就能很容易理解 Btrfs 里的快照,可以把 Subvolume 理解为 Git 里面的 master 分支,而快照就是从 master checkout 出来的新分支,于是快照跟 Git 里的分支有类似的特点:

  • 创建快照几乎没有开销

  • 可以在快照的基础上再创建快照

  • 当前快照里面的修改不会影响其它快照

  • 快照可以被删除

当然 Subvolume 也可以像 Git 里的 master 一样被删除。

创建快照

# 在 Root Subvolume 的基础上创建一个快照	
# 默认情况下快照是可写的,如果要创建只读快照,需要加上 -r 参数	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume snapshot ./ ./snap-root	
Create a snapshot of './' in './snap-root'	

	
# 创建完成后,可以看到我们已经有了两个 Subvolume	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume list ./	
ID 256 gen 11 top level 5 path sub1	
ID 257 gen 13 top level 5 path snap-root	

	
# 我们可以通过指定 -s 参数来只列出快照	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume list -s ./	
ID 257 gen 10 cgen 10 top level 5 otime 2017-03-05 21:46:03 path snap-root	

	
# 再来看看快照 snap-root 中的文件,可以看到有 dir1 及下面的文件,但看不到 sub1 下的文件,那是因为 sub1 是一个subvolume。在做一个 Subvolume 的快照的时候,不会将它里面的 Subvolume 也做快照	
dev@debian:/mnt/btrfs$ tree ./snap-root	
./snap-root	
├── dir1	
│   └── dir1-01.txt	
└── sub1	

	
# 创建 sub1 的一个快照,可以看到 sub1 里面的文件出现在了快照里面	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume snapshot ./sub1/ ./snap-sub1	
Create a snapshot of './sub1/' in './snap-sub1'	

	
# 然后在 sub1 和它的快照 snap-sub1 下面各自创建一个文件,会发现它们之间不受影响	
dev@debian:/mnt/btrfs$ touch snap-sub1/snap-sub1-01.txt	
dev@debian:/mnt/btrfs$ touch sub1/sub1-02.txt	
dev@debian:/mnt/btrfs$ tree	
.	
├── dir1	
│   └── dir1-01.txt	
├── snap-root	
│   ├── dir1	
│   │   └── dir1-01.txt	
│   └── sub1	
├── snap-sub1	
│   ├── snap-sub1-01.txt	
│   └── sub1-01.txt	
└── sub1	
    ├── sub1-01.txt	
    └── sub1-02.txt

删除快照

删除快照和删除 Subvolume 是一样的,没有区别。

dev@debian:/mnt/btrfs$ sudo btrfs subvolume del snap-root	
Delete subvolume (no-commit): '/mnt/btrfs/snap-root'	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume del snap-sub1	
Delete subvolume (no-commit): '/mnt/btrfs/snap-sub1'	
dev@debian:/mnt/btrfs$ tree	
.	
├── dir1	
│   └── dir1-01.txt	
└── sub1	
    ├── sub1-01.txt	
    └── sub1-02.txt

Default Subvolume

可以设置 Btrfs 分区的默认 Subvolume,即在挂载磁盘的时候,可以只让分区中的指定 Subvolume 对用户可见。看下面的例子:

# 查看 sub1 的ID	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume list ./	
ID 256 gen 14 top level 5 path sub1	

	
# 将 sub1 设置为当前 Btrfs 文件系统的默认 Subvolume	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume set-default 256 /mnt/btrfs/	

	
# 重新将虚拟硬盘挂载到一个新目录	
dev@debian:/mnt/btrfs$ sudo mkdir /mnt/btrfs1	
dev@debian:/mnt/btrfs$ sudo mount /tmp/btrfs.img /mnt/btrfs1/	

	
# 这里将只能看到 sub1 下的文件	
dev@debian:/mnt/btrfs$ tree /mnt/btrfs1	
/mnt/btrfs1	
├── sub1-01.txt	
└── sub1-02.txt	

	
# 由于 Btrfs 原来的默认 Subvolume 是 Root Subvolume,其 ID 是5(也可以通过 0 来标识),所以我们可以通过同样的命令将默认 Subvolume 再改回去	
dev@debian:/mnt/btrfs$ sudo btrfs subvolume set-default 0 /mnt/btrfs/

Default Subvolume 有什么用呢?

利用 Snapshot 和 Default Subvolume,可以很方便的实现不同系统版本的切换。比如将系统安装在一个 Subvolume 下面,当要做什么危险操作的时候,先在 Subvolume 的基础上做一个快照 A。如果操作成功,那么什么都不用做(或者把 A 删掉),继续用原来的 Subvolume,A 不被删掉也没关系,多一个快照在那里也不占空间。如果操作失败,那么可以将 A 设置成 Default Subvolume,并将原来的 Subvolume 删除,这样就相当于系统回滚。

有了这样的功能后,Linux 的每次操作都能回滚,养成在修改操作前做 Snapshot 的习惯,就再也不用担心 rm 误删文件了。

现在有些发行版已经有了类似的功能,如 Ubuntu,将安装工具 Apt 和 Btrfs 结合,自动的在安装软件之前打一个 Snapshot。然后安装软件,如果成功,删除新的 Snapshot,如果失败,修改 Default Subvolume 为新的 Snapshot,删除掉原来的 Snapshot,这样对系统没有任何影响,并且所有操作对用户是透明的。

随着 Btrfs 的成熟和普及,相信会改变一些我们使用 Linux 的习惯。

延伸阅读

btrfs 相关命令

管理 btrfs 使用 btrfs 命令,该命令包含诸多子命令已完成不同的功能管理,常用命令如下:

  • btrfs 文件系统属性查看:btrfs filesystem show

  • 调整文件系统大小:btrfs filesystem resize +10g MOUNT_POINT

  • 添加硬件设备:btrfs filesystem add DEVICE MOUNT_POINT

  • 均衡文件负载:btrfs blance status|start|pause|resume|cancel MOUNT_POINT

  • 移除物理卷(联机、自动移动):btrfs device delete DEVICE MOUNT_POINT

  • 动态调整数据存放机制:btrfs balance start -dconvert=RAID MOUNT_POINT

  • 动态调整元数据存放机制:btrfs balance start -mconvert=RAID MOUNT_POINT

  • 动态调整文件系统数据数据存放机制:btrfs balance start -sconvert=RAID MOUNT_POINT

  • 创建子卷:btrfs subvolume create MOUNT_POINT/DIR

  • 列出所有子卷:btrfs subvolume list MOUNT_POINT

  • 显示子卷详细信息:btrfs subvolume show MOUNT_POINT

  • 删除子卷:btrfs subvolume delete MOUNT_POIN/DIR

  • 创建子卷快照(子卷快照必须存放与当前子卷的同一父卷中):btrfs subvolume snapshot SUBVOL PARVOL

  • 删除快照同删除子卷一样:btrfs subvolume delete MOUNT_POIN/DIR

相关阅读链接

  1. Btrfs 官方文档:https://btrfs.wiki.kernel.org/index.php/Main_Page

  2. Linux 下常见文件系统对比 :https://segmentfault.com/a/1190000008481493

  3. Btrfs 官方挂载硬盘文档:https://btrfs.wiki.kernel.org/index.php/Manpage/btrfs(5)#MOUNT_OPTIONS

参考文档

  1. https://segmentfault.com/a/1190000008605135

  2. https://mritd.me/2017/03/20/btrfs-note/

640?wx_fmt=gif

640?wx_fmt=png

你可能还喜欢

点击下方图片即可阅读

服务端高并发分布式架构演进之路

640?wx_fmt=png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用好了下一代文件系统 Btrfs 这些新特性,从此数据安全乐无忧! 的相关文章

  • Windows11+VS2019+CUDA11.8配置过程

    最近要处理大规模点云数据 xff0c 用CPU跑感觉有点慢 xff0c 想通过GPU加速点云处理过程 xff0c 于是想要学习CUDA编程 很多教程提到在安装CUDA之前 xff0c 需要打开cmd xff0c 输入nvidia smi x
  • k8s-集群搭建1.26.2【傻瓜式搭建】

    k8s 1 26 2 kubeadmin 傻瓜式集群搭建 1 环境准备 1 1硬件资源准备 1 每台机器 2 GB 或更多的 RAM xff08 如果少于这个数字将会影响你应用的运行内存 xff09 CPU 2 核心及以上 1 2软件环境准
  • 修改sqlserver的数据库名、物理名称和逻辑文件名

    最近在一个项目上遇到需要修改数据库名称 物理文件名和逻辑名称 如下图所示 xff0c 数据库ty cms lz的物理文件名是ty cms lz mdf和ty cms lz 0 ldf xff0c 逻辑文件名是lhc cms和lhc cms
  • 解决ubuntu 16.04显示wifi已禁用

    作者所使用的电脑型号为 xff1a acer aspirs 4750G 五一小长假 xff0c 闲来无事 xff0c 把表姐尘封已久的笔记本电脑装个ubuntu学习学习 xff0c 装机过程就不多说了 xff0c 百度一大堆的方法 在这里主
  • Kali Linux下搭服务器环境

    设置SSH开机启动 xff0c 前提是客户端和服务端均已安装 xff0c 查看是否启动 xff1a span class token function ps span e span class token operator span spa
  • 运行Djongo项目

    安装 python3 https www python org downloads 设置环境变量 PY HOME C Users Terwer AppData Local Programs Python Python37 Path PY H
  • 数据结构 —— 利用栈实现回文判断

    一 先理解什么是栈 什么是回文 栈的性质 xff1a 先进后出或后进先出的特性 xff0c 栈的实现也很简单 xff0c 只需要一个一维数组和一个指向栈顶的变量top就可以了 我们通过变量top来对栈进行插入和删除操作 回文 xff1a 回
  • 【CSS】flex布局实现一行展示三个子元素并两端对齐

    本代码在微信小程序里实现 xff0c 效果如下 xff1a WXML xff1a lt view class 61 34 goods box 34 gt lt view class 61 34 list 34 gt lt view clas
  • 阿里云域名动态解析

    由于国内个宽带商基本无法对个人用户免费提供固定的公网IP地址 xff0c 所以当我们需要通过公网IP映射域名的时候 xff0c 就会出现IP总是会变 xff0c 这个时候就需要用到域名动态解析 CodePlus AliyunDns Gith
  • Windows beego 安装

    前言 xff1a 是不是在执行go get命令很慢呀 xff0c 现在发大招了 打开window终端 xff0c 执行一下命令 go env w GO111MODULE 61 on go env w GOPROXY 61 https gop
  • left join结果条数会不会大于左表行数?

    会大于 今天电话面试一道题 xff0c 面试官问我 left join结果条数会不会大于左表行数 xff1f 你都这么问了 xff0c 我怎么能随便回答 xff1a 不会吧不会吧不会吧 那举个例子 两个表test和test2 一般情况下 x
  • updateClient

    updateClient lt 64 page contentType 61 34 text html 34 pageEncoding 61 34 gbk 34 gt lt DOCTYPE html gt lt html gt lt hea
  • 课后作业之几何图形

    题目 xff1a 通过程序设计几何图形 xff08 Shape xff09 矩形 xff08 Rectangle xff09 圆形 xff08 Circle xff09 正方形 xff08 Square xff09 几种类型 xff0c 能
  • 七牛云免费对象存储,并绑定到cloudreve中

    之前开通了腾讯云的对象存储COS并使用中 xff0c 不过之前主要将它当作云盘使用 xff0c 这两天再做博客系统时发现也可以将它作为网站的图库 xff0c 这样对网站的访问效率也会提高 今天了解到七牛云有免费的对象存储可以使用 xff0c
  • [蓝桥杯]七段码(Python 实现)

    题目 xff1a 问题描述 小蓝要用七段码数码管来表示一种特殊的文字 上图给出了七段码数码管的一个图示 xff0c 数码管中一共有 7 段可以发光的二极管 xff0c 分别标记为 a b c d e f g 小蓝要选择一部分二极管 xff0
  • Anaconda变量配置

    1 首先鼠标右击打开 此电脑 的属性 xff0c 选择高级系统设置 2 选择环境变量 xff0c 并找寻系统环境变量中的Path 3 单击选中Path xff0c 选择编辑 xff0c 然后选择新建 xff0c 将路径复制到新建的位置 xf
  • java使用MySQL和HQL数据去重

    思路 先查询出满足某种条件的数据的最小ID xff0c 然后删除最小ID以外的数据就实现了去重 实例 查询最小ID的重复数据 select from oms relation model orm where orm fd id 61 sel
  • 在VS2017上配置CMake并生成OpenCV源代码工程的解决方案

    这篇博客是对之前博客 在win10下配置VS2017搭载OpenCV4 0 的补充 xff0c 还没有配置好VS2017 43 OpenCV的小伙伴可以参考一下我之前的博客 一 为什么用CMake xff1f 想要在 Windows 平台下
  • 链表,结构体,文件混合操作

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • 设置CentOS不启用图形界面 CentOS只启动后端

    CentOS不要图形界面 xff0c CentOS只开启终端就行 我用的是CentOS8 方法 xff1a vi etc inittab 以前旧的这种直接改 etc inittab方式已经不支持了 vi etc inittab initta

随机推荐

  • yum安装mysql简单配置版

    yum安装mysql简单配置版 yum y install mysql server root 64 bogon vi etc my cnf 在 client 之后添加一行 xff1a default character set 61 ut
  • 第一次使用GitHub

    GitHub可能是当今开源社区最火爆的版本控制和源代码托管平台 xff0c 也不知道这句话是否正确 对GitHub还很陌生 xff0c 不过其确实很热 咱跟着潮流 xff0c 也注册了账号 一 注册 登录GitHub官方网站https gi
  • 彻底关闭Windows更新

    第一级 在控制面板中 xff0c 关闭Windows更新 xff0c 次方法在Windows7之前的系统是可用的 xff0c 从Windows10开始 xff0c Windows更新放在了设置里 第二级 在此电脑 管理 服务和应用程序 wi
  • 端口被占用,简单快捷的解决方法

    步骤 xff1a 1 键盘上按住Win 43 R xff0c 在弹框里输入cmd并点击Enter键 2 根据自己被占用的端口号输入以下命令 xff08 测试 xff1a 被占用的8080端口 xff09 netstat ano findst
  • MySQL的操作系统和硬件优化

    MySQL服务器性能受制于整个系统最薄弱的环节 xff0c 承载它的操作系统和硬件往往是限制因素 磁盘大小 可用内存和CPU资源 网络 xff0c 以及所有连接它们的组件 xff0c 都会限制系统的最终容量 因此 xff0c 需要小心地选择
  • java连接mysql数据库useSSL问题

    背景 Java spring程序 xff0c Java版本 java version 34 1 8 0 301 34 JDBC驱动版本5 1 40 mysql connector java 5 1 40 jar xff0c 连接 proxy
  • 机器阅读理解(MRC)和问答(QA)在信息抽取中的应用

    一 机器阅读理解 xff08 MRC xff09 问答系统 xff08 QA xff09 与信息抽取 最近实体关系抽取任务和命名实体识别任务的SOTA模型排行榜中 xff0c 有很多模型使用到了机器阅读理解 xff08 MRC xff09
  • 【前端面经】Vue-Vue中的 $nextTick 有什么作用?

    Vue js 是一个流行的 JavaScript 框架 xff0c 它提供了许多实用的功能 xff0c 其中之一就是 nextTick 方法 在 Vue js 中 xff0c nextTick 方法可以确保我们在更新 DOM 之后再去执行某
  • archlinux安装virtualbox+WindowsXP虚拟机

    文章目录 概述安装vituralbox安装windows xp虚拟机virtualbox虚拟机配置安装增强工具包 xff08 Guest Additions 设置虚拟机与宿主机共享文件夹 概述 Thinkpad T400笔记本 xff0c
  • WSL2的安装与使用-Windows与Linux双系统的新选择

    文章目录 WSL2的安装与使用 Windows与Linux双系统的新选择1 WSL是什么2 为什么会有WSL3 为要选择WSL2作为开发环境3 1 WSL与WSL2有什么区别3 2 Windows与Linux系统的抉择 4 WSL2的安装4
  • IOCP编程注意事项

    虽说我的昵称是EasyIOCP xff0c 但是用好IOCP还是不容易的 xff0c 有很多要注意的地方 xff0c 长话短说 xff08 不涉及细节 xff09 xff1a 1 每个连接同时最好只有一个待决的WSARecv IOCP不保证
  • cin的错误标记和缓冲区清空

    先看下面的代码 xff1a vector lt int gt intVtr intVtr insert intVtr end istream iterator lt int gt cin istream iterator lt int gt
  • 如何把string的元素逆序呢?

    论坛里见到这个问题 xff1a 如何把string的元素逆序 xff1f 我直接想到的是利用反向迭代器reverse iterator xff1a rbegin 和rend xff1a string str1 34 1234567890 3
  • 配接器ptr_fun的一点增补

    ptr fun的作用是什么 xff1f 就是把函数 xff08 函数的参数最多有两个 xff0c 返回值类型任意 xff0c 包括void xff09 转成函数对象 xff0c 并使该函数对象可配接 当和bind1st或者bind2nd结合
  • 调用closesocket()背后发生的事

    应用层代码想要关闭一个TCP连接可以直接调用closesocket xff0c 但是这个函数的行为并不 单纯 xff0c 只有了解closesocket 背后的故事 xff0c 才能对关闭TCP连接有正确的认识 首先明确一点 xff1a 任
  • 完成端口GetQueuedCompletionStatus()返回错误,怎样获得真正的错误代码

    GetQueuedCompletionStatus 返回错误 xff0c 说明I O失败 此时调用GetLastError 得到的往往是ERROR NETNAME DELETED xff08 64 xff09 xff0c WSAGetLas
  • 模拟C++11的新关键字decltype

    只上代码了 xff0c 尽在不言中吧 xff1a include lt iostream gt include lt vector gt include lt map gt include lt typeinfo gt using name
  • 类的直接构造和拷贝构造

    先看代码 xff1a include lt iostream gt using namespace std class A public A int k m k k A const A amp a m k a m k cout lt lt
  • Teleport 开源堡垒机安装使用

    文章目录 Teleport 开源堡垒机安装使用一 介绍二 特点三 安装1 安装跳板核心服务 xff08 1 xff09 下载安装 xff08 2 xff09 数据库配置 xff08 3 xff09 启动 xff08 4 xff09 初始化配
  • 用好了下一代文件系统 Btrfs 这些新特性,从此数据安全乐无忧!

    对于大部分文件系统来说 xff0c 在磁盘上创建好文件系统 xff0c 然后再挂载到系统中去就完事了 但对于 Btrfs 来说 xff0c 除了在格式化和挂载的时候指定不同的参数外 xff0c 还支持很多其他的功能 比如 xff1a 管理多