GlusterFS

在这里插入图片描述

一. 概念

1. 介绍

gluster是一个横向扩展的分布式文件系统,可将来自多个服务器的磁盘存储资源整合到一个全局名称空间中,可以根据存储消耗需求快速调配额外的存储。它将自动故障转移作为主要功能.

  • 分布式存储系统.集群式NAS存储.
  • 无集中式元数据服务,采用Hash算法定位.
    • 一致性哈希DHT.
    • Hash值落在哪个范围内,数据就存储在哪里.
  • 弹性卷管理.
  • 自动做了raid.

2. 优点

  • 缩放到几PB.处理数千个客户.开源.
  • POSIX兼容
  • 可以使用任何支持扩展属性的ondisk文件系统.使用NFS和SMB等行业标准协议访问
  • 提供复制,配额,地理复制,快照和bitrot检测
  • 允许优化不同的工作量 开源

3. 缺点

  • 不适用于存储大量小文件的场景,因为GlusterFS的设计之初就是用于存储大数据的,对小文件的优化不是很好,推荐保存单个文件至少1MB以上的环境,如果是大量小文件的场景建议使用FastDFSMFS

4. 卷

  • 分布卷(默认模式):即DHT, 也叫 分布卷: 将文件以hash算法随机分布到 一台服务器节点中存储
  • 复制模式:即AFR, 创建volume 时带 replica x 数量: 将文件复制到 replica x 个节点中
  • 条带模式:即Striped, 创建volume 时带 stripe x 数量: 将文件切割成数据块,分别存储到 stripe x 个节点中 ( 类似raid 0 )
  • 分布式条带模式:最少需要4台服务器才能创建。 创建volume 时 stripe 2 server = 4 个节点: 是DHT 与 Striped 的组合型
  • 分布式复制模式:最少需要4台服务器才能创建。 创建volume 时 replica 2 server = 4 个节点:是DHT 与 AFR 的组合型
  • 条带复制卷模式:最少需要4台服务器才能创建。 创建volume 时 stripe 2 replica 2 server = 4 个节点: 是 Striped 与 AFR 的组合型
  • 三种模式混合: 至少需要8台 服务器才能创建。 stripe 2 replica 2 , 每4个节点 组成一个组

二. 部署

1. 配置

  • 若干brick组成1个复制卷,另外若干brick组成其他复制卷;单个文件在复制卷内数据保持副本,不同文件在不同复制卷之间进行哈希分布;即分布式卷跨复制卷集(replicated sets )
  • brick server数量是副本数量的倍数,且>=2倍,即最少需要4台brick server,同时组建复制卷集的brick容量相等
IPhostname配置说明
192.168.100.155g1CentOS 7 1C2G额外一块硬盘
192.168.100.156g2CentOS 7 1C2G额外一块硬盘
192.168.100.157g3CentOS 7 1C2G额外一块硬盘
192.168.100.154k8sCentOS 7 2C4G部署的heketi, 因资源问题,上面有个小型k8s
192.168.100.158/CentOS 7 2C4G资源充足可将k8s部署在这上面

2. 部署

  • 以下三个节点都需要操作
# 关闭防火墙和selinuxvim /etchosts
192.168.100.155 g1
192.168.100.156 g2
192.168.100.157 g3# repo
wget -O /etc/yum.repos.d/CentOS-Base.repo https://repo.huaweicloud.com/repository/conf/CentOS-7-reg.repo
yum -y install centos-release-gluster# 安装并启动
yum -y install glusterfs-server
systemctl enable glusterd.service --now# 磁盘格式化
[root@g1 ~]# lsblk 
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   10G  0 disk 
└─sda1   8:1    0   10G  0 part /
sdb      8:16   0   20G  0 disk 
sr0     11:0    1  4.3G  0 rom  # 三个节点创建目录
mkdir -p /data/brick1#
fdisk /dev/sdb# 格式化文件系统
mkfs.xfs -i size=512 /dev/sdb1# 开机挂载
echo '/dev/sdb1 /data/brick1 xfs defaults 0 0 ' >> /etc/fstabmount -a# 验证
df -h# 设置glusterfs卷创建的目录, 创建分布式卷
mkdir /data/brick1/gv0
  • 以下在g1节点上操作
ssh-keygen
ssh-copy-id g1
ssh-copy-id g2
ssh-copy-id g3# 配置受信任池
gluster peer probe g2
gluster peer probe g3# 可在任意节点上查看节点状态
gluster peer status# 设置glusterfs分布式卷, 必须指定类型, 默认是分布式卷, 必须指定副本数,不需要指出分布式卷类型,只要副本数量与 brick server 数量不等且符合倍数关系,即是分布式复制卷
gluster volume create gv0 replica 3 g1:/data/brick1/gv0 g2:/data/brick1/gv0  g3:/data/brick1/gv0# 启动创建的卷
gluster volume start gv0## 停止卷
gluster volume stop gv0
## 删除卷
gluster volume delete gv0# 查看信息
[root@g1 ~]# gluster volume infoVolume Name: gv0
Type: Replicate
Volume ID: c5f0bbe3-afae-4a4a-9ab6-4cfa284897ed
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: g1:/data/brick1/gv0
Brick2: g2:/data/brick1/gv0
Brick3: g3:/data/brick1/gv0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off# 查看卷状态
gluster volume status# 测试
mkdir /seek
mount -t glusterfs g1:/gv0  /seek
for i in `seq -w 1 10`; do cp -rp /var/log/messages /mnt/copy-test-$i; done# 因为是三副本存储,所以每个节点上的文件数量都是10, 都可以查看到该文件

三. k8s与GlusterFS

1. 概念

  • Kubernetes中使用GlusterFS作为持久化存储,要提供storageClass使用需要依赖Heketi工具
    • Heketi是一个具有resetful接口的glusterfs管理程序,作为kubernetes的Storage存储的external provisioner
    • 提供基于RESTful接口管理glusterfs的功能,可以方便的创建集群管理glusterfs的node,device,volume
    • 与k8s结合可以创建动态的PV,扩展glusterfs存储的动态管理功能。主要用来管理glusterFS volume的生命周期,初始化时候就要分配好裸磁盘(未格式化)设备
  • 每个kubernetes集群的节点需要安装gulsterfs的客户端,如glusterfs-cli, glusterfs-fuse, 主要用于在每个node节点挂载volume
  • 每个kubernetes集群的节点运行 modprobe dm_thin_pool,加载内核模块
  • kube-apiserver中添加 –allow-privileged=true 参数以开启此功能,默认此版本的kubeadm已开启

2. Heketi

  • 可单独部署在一台服务器上, 我这里是部署在k8s的master节点上的
  • heketi 仅支持使用裸分区或裸磁盘(未格式化)添加为device,不支持文件系统
# hosts
vim /etc/hosts
192.168.100.155 g1
192.168.100.156 g2
192.168.100.157 g3yum -y install centos-release-gluster
yum -y install heketi heketi-client# 配置heketi.json
cd /etc/heketi/
cp heketi.json heketi.json.bak# 修改后
[root@master01 heketi]# cat heketi.json
{"_port_comment": "Heketi Server Port Number","port": "18080",  	# 默认端口号8080, "_use_auth": "Enable JWT authorization. Please enable for deployment","use_auth": true,  	# 默认flase,可以改为true"_jwt": "Private keys for access","jwt": {"_admin": "Admin has access to all APIs","admin": {"key": "admin"  	# 修改},"_user": "User only has access to /volumes endpoint","user": {"key": "admin"  	# 修改}},"_glusterfs_comment": "GlusterFS Configuration","glusterfs": {"_executor_comment": ["Execute plugin. Possible choices: mock, ssh","mock: This setting is used for testing and development.","      It will not send commands to any node.","ssh:  This setting will notify Heketi to ssh to the nodes.","      It will need the values in sshexec to be configured.","kubernetes: Communicate with GlusterFS containers over","            Kubernetes exec api."],# 三种模式:# mock:测试环境下创建的volume无法挂载;# kubernetes:在GlusterFS由kubernetes创建时采用"executor": "ssh",    # 生产环境使用 ssh 或 Kubernetes,这里用 ssh,改为ssh"_sshexec_comment": "SSH username and private key file information","sshexec": {"keyfile": "/etc/heketi/heketi_key",  # 密钥路径"user": "root",     					# 用户为root"port": "22",      "fstab": "/etc/fstab"},"_kubeexec_comment": "Kubernetes configuration","kubeexec": {"host" :"https://kubernetes.host:8443","cert" : "/path/to/crt.file","insecure": false,"user": "kubernetes username","password": "password for kubernetes user","namespace": "OpenShift project or Kubernetes namespace","fstab": "Optional: Specify fstab file on node.  Default is /etc/fstab"},"_db_comment": "Database file name","db": "/var/lib/heketi/heketi.db","_loglevel_comment": ["Set log level. Choices are:","  none, critical, error, warning, info, debug","Default is warning"],# 默认设置为debug,不设置时的默认值即是warning;# 日志信息输出在/var/log/message"loglevel" : "warning"}
}
# 使用ssh的方式需要创建秘钥, 用于免密连接glusterfs的所有节点
ssh-keygen -f heketi_key  -t rsa -N ''ssh-copy-id  -i heketi_key.pub g1
ssh-copy-id  -i heketi_key.pub g2
ssh-copy-id  -i heketi_key.pub g3# 启动
systemctl enable heketi.service;systemctl start heketi.service# 验证
curl 192.168.100.154:18080/hello
Hello from Heketi# 添加cluster, 两个admin分别是上面的 heketi.json 文件中的认证信息,需要改为自己的, 会生成如下信息
heketi-cli --user admin --server http://192.168.100.154:18080 --secret admin --json cluster create{"id":"5ff98e26472e3e1db21742bf5cd3ce46","nodes":[],"volumes":[],"block":true,"file":true,"blockvolumes":[]}
# 创建 topology.json 文件,其中 /dev/sdb 为我们未格式化的分区
cd /etc/heketi
vim topology.json{"clusters": [{"nodes": [{"node": {"hostnames": {"manage": ["g1"],"storage": ["192.168.100.155"]},"zone": 1},"devices": ["/dev/sdb"]},{"node": {"hostnames": {"manage": ["g2"],"storage": ["192.168.100.156"]},"zone": 1},"devices": ["/dev/sdb"]},{"node": {"hostnames": {"manage": ["g3"],"storage": ["192.168.100.157"]},"zone": 1},"devices": ["/dev/sdb"]}        ]}]
}
# 因为 heketi 需要裸设备,我们部署glusterfs验证时候已经格式化了,现在需要还原
gluster volume delete gv0# 三个节点都要做 
umount /data/brick1# 还原裸设备三个节点都需要做 mklabel msdos
[root@g1 ~]# parted /dev/sdb
GNU Parted 3.1
Using /dev/sdb
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel msdos                                                    
Warning: The existing disk label on /dev/sdb will be destroyed and all data on this disk will be lost. Do you want to continue?
Yes/No? yes                                                               
(parted) quit                                                             
Information: You may need to update /etc/fstab.# 三个节点都需要执行
mkfs.xfs -f /dev/sdb
pvcreate -ff --metadatasize=128M --dataalignment=256K /dev/sdb# heketi初始化
[root@k8s /etc/heketi]# heketi-cli --server http://192.168.100.154:18080  --user admin --secret admin topology load --json=/etc/heketi/topology.jsonFound node g1 on cluster 2d8a5e1a487250410d393e8bbefd43a7Adding device /dev/sdb ... OKFound node g2 on cluster 2d8a5e1a487250410d393e8bbefd43a7Adding device /dev/sdb ... OKFound node g3 on cluster 2d8a5e1a487250410d393e8bbefd43a7Adding device /dev/sdb ... OK# 查看数据
heketi-cli --server http://192.168.100.154:18080 --user admin --secret admin cluster list
Clusters:
Id:2d8a5e1a487250410d393e8bbefd43a7 [file][block]
Id:5ff98e26472e3e1db21742bf5cd3ce46 [file][block]# 节点信息
heketi-cli --server http://192.168.100.154:18080 --user admin --secret admin  node list
Id:8d2f3e7fa8542db11f1e64f37fe94cac	Cluster:2d8a5e1a487250410d393e8bbefd43a7
Id:ac85f20ff1dfd9e1c9f436f820ac193f	Cluster:2d8a5e1a487250410d393e8bbefd43a7
Id:f7c789945e0afc0c51bff0b4944925c1	Cluster:2d8a5e1a487250410d393e8bbefd43a7# 可查看Cluster Id, 接下来就需要在k8s中调用它
heketi-cli --user admin --secret admin topology info --server http://192.168.100.154:18080Cluster Id: 2d8a5e1a487250410d393e8bbefd43a7File:  trueBlock: trueVolumes:

3. k8s中调用

  • 所有的k8s节点都需要部署glusterfs的客户端
yum -y install glusterfs-fuse
# 创建secret和storageclass,我的heketi和k8s在同一节点,最好是分开
[root@k8s /etc/heketi]# echo -n "admin"|base64
YWRtaW4=
  • heketi认证的secret
  • vim heketi-secret.yaml
apiVersion: v1
kind: Secret
metadata:name: heketi-secretnamespace: default
data:# base64 encoded password. E.g.: echo -n "mypassword" | base64key: YWRtaW4=
type: kubernetes.io/glusterfs
  • vim heketi-sc.yaml
apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:name: gluster-heketi-storageclass
provisioner: kubernetes.io/glusterfs
reclaimPolicy: Delete
parameters:resturl: "http://192.168.100.154:18080"restauthenabled: "true"restuser: "admin"secretNamespace: "default"secretName: "heketi-secret"volumetype: "replicate:3"apiVersion: storage.k8s.io/v1beta1
kind: StorageClass
metadata:name: gluster-heketi-storageclass
provisioner: kubernetes.io/glusterfs
reclaimPolicy: Delete
parameters:resturl: "http://192.168.100.154:18080"clusterid: "2d8a5e1a487250410d393e8bbefd43a7"restauthenabled: "true"restuser: "admin"secretNamespace: "default"secretName: "heketi-secret"volumetype: "replicate:3"
  • 验证
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: nginx
spec:selector:matchLabels:app: nginx # has to match .spec.template.metadata.labelsserviceName: "nginx"replicas: 3 # by default is 1template:metadata:labels:app: nginx # has to match .spec.selector.matchLabelsspec:terminationGracePeriodSeconds: 10containers:- name: nginximage: nginxports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: gluster-heketi-storageclassresources:requests:storage: 1G
  • zookeeper集群, 比较费资源
apiVersion: v1
kind: Service
metadata:name: zk-hslabels:app: zk
spec:ports:- port: 2888name: server- port: 3888name: leader-electionclusterIP: Noneselector:app: zk
---
apiVersion: v1
kind: Service
metadata:name: zk-cslabels:app: zk
spec:ports:- port: 2181name: clientselector:app: zk
---
apiVersion: policy/v1beta1
kind: PodDisruptionBudget
metadata:name: zk-pdb
spec:selector:matchLabels:app: zkmaxUnavailable: 1
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: zk
spec:selector:matchLabels:app: zkserviceName: zk-hsreplicas: 3updateStrategy:type: RollingUpdatepodManagementPolicy: Paralleltemplate:metadata:labels:app: zkspec:tolerations:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: "app"operator: Invalues:- zktopologyKey: "kubernetes.io/hostname"containers:- name: kubernetes-zookeeperimagePullPolicy: IfNotPresentimage: mirrorgooglecontainers/kubernetes-zookeeper:1.0-3.4.10resources:requests:memory: "1G"cpu: "0.5"ports:- containerPort: 2181name: client- containerPort: 2888name: server- containerPort: 3888name: leader-electioncommand:- sh- -c- "start-zookeeper \--servers=3 \--data_dir=/var/lib/zookeeper/data \--data_log_dir=/var/lib/zookeeper/data/log \--conf_dir=/opt/zookeeper/conf \--client_port=2181 \--election_port=3888 \--server_port=2888 \--tick_time=2000 \--init_limit=10 \--sync_limit=5 \--heap=512M \--max_client_cnxns=60 \--snap_retain_count=3 \--purge_interval=12 \--max_session_timeout=40000 \--min_session_timeout=4000 \--log_level=INFO"readinessProbe:exec:command:- sh- -c- "zookeeper-ready 2181"initialDelaySeconds: 10timeoutSeconds: 5livenessProbe:exec:command:- sh- -c- "zookeeper-ready 2181"initialDelaySeconds: 10timeoutSeconds: 5volumeMounts:- name: datadirmountPath: /var/lib/zookeepersecurityContext:runAsUser: 1000fsGroup: 1000volumeClaimTemplates:- metadata:name: datadirspec:accessModes: [ "ReadWriteOnce" ]storageClassName: gluster-heketi-storageclassresources:requests:storage: 5G
# 以上面的nginx为例
[root@k8s ~/glusterfs]# kubectl get pod
NAME      READY   STATUS    RESTARTS   AGE
nginx-0   1/1     Running   0          62s
nginx-1   1/1     Running   0          50s
nginx-2   1/1     Running   0          43s
[root@k8s ~/glusterfs]# kubectl exec -ti nginx-0 -- df -h
Filesystem                                            Size  Used Avail Use% Mounted on
overlay                                                20G  4.5G   16G  23% /
tmpfs                                                  64M     0   64M   0% /dev
tmpfs                                                 2.0G     0  2.0G   0% /sys/fs/cgroup
/dev/sda1                                              20G  4.5G   16G  23% /etc/hosts
shm                                                    64M     0   64M   0% /dev/shm
192.168.100.157:vol_0a072c68764078d2389be28ee4598bb9 1014M   43M  972M   5% /usr/share/nginx/html
tmpfs                                                 2.0G   12K  2.0G   1% /run/secrets/kubernetes.io/serviceaccount
tmpfs                                                 2.0G     0  2.0G   0% /proc/acpi
tmpfs                                                 2.0G     0  2.0G   0% /proc/scsi
tmpfs                                                 2.0G     0  2.0G   0% /sys/firmware# 随便在glusterfs节点上查看,根据提示可以可知道分别在各个节点的存储的路径位置
[root@g1 ~]#  gluster volume status vol_0a072c68764078d2389be28ee4598bb9
Status of volume: vol_0a072c68764078d2389be28ee4598bb9
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick 192.168.100.155:/var/lib/heketi/mount
s/vg_6571d6295a5dfedffe38e8277715a0f0/brick
_13692d64dc8f7debbaaf1ca4692fc81d/brick     49156     0          Y       38860
Brick 192.168.100.157:/var/lib/heketi/mount
s/vg_16efa0044cb89c7a94af43632e4ad883/brick
_7468d1b2b30f56026a9f8352903c6998/brick     49156     0          Y       37814
Brick 192.168.100.156:/var/lib/heketi/mount
s/vg_f2c7e0d58b71681158503e0266892ef7/brick
_d8d641412d91d7059fc6ac539ce47362/brick     49156     0          Y       38692
Self-heal Daemon on localhost               N/A       N/A        Y       38877
Self-heal Daemon on g2                      N/A       N/A        Y       38717
Self-heal Daemon on g3                      N/A       N/A        Y       37831Task Status of Volume vol_0a072c68764078d2389be28ee4598bb9
------------------------------------------------------------------------------
There are no active volume tasks

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGLM2-6B 大语言模型本地搭建

ChatGLM模型介绍: ChatGLM2-6B 是清华 NLP 团队于不久前发布的中英双语对话模型,它具备了强大的问答和对话功能。拥有最大32K上下文,并且在授权后可免费商用! ChatGLM2-6B的6B代表了训练参数量为60亿,同时运用了模型…

Python笔记08-面向对象

文章目录 类和对象构造方法内置方法封装继承类型注解多态 类只是一种程序内的“设计图纸”,需要基于图纸生产实体(对象),才能正常工作 这种套路,称之为:面向对象编程 类和对象 定义类的语法如下&#xff…

K8S集群重新初始化--详细过程

K8S集群重新初始化 0、当前环境1、master节点1.1、在master节点执行下面reset命令:1.2、手动清除配置信息,这一步很关键:1.3、重新引导集群1.4、创建配置目录,并复制权限配置文件到用户目录下:1.5 查看集群状态1.6 安装…

提升测试效率,轻松并行运行测试——探秘Pytest插件pytest-xdist

在软件开发中,测试是确保代码质量的重要一环。然而,随着项目规模的增大,测试用例的数量也随之增多,测试的执行时间可能成为一个瓶颈。为了解决这个问题,Pytest提供了丰富的插件生态系统,其中 pytest-xdist …

从vue小白到高手,从一个内容管理网站开始实战开发第八天,登录功能后台功能设计--业务逻辑层基础接口和基础服务实现

上一篇我们介绍了项目后续要使用到的工具类,关于工具类的创建可以查看 从vue小白到高手,从一个内容管理网站开始实战开发第七天,登录功能后台功能设计--通用分页、枚举以及相关工具类-CSDN博客文章浏览阅读2次。本次内容主要介绍了项目后续用到的部分工具类,这些工具类,在…

基于博弈树的开源五子棋AI教程[3 极大极小搜索]

基于博弈树的开源五子棋AI教程[3 极大极小搜索] 引子极大极小搜索原理alpha-beta剪枝负极大搜索尾记 引子 极大极小搜索是博弈树搜索中最常用的算法,广泛应用于各类零和游戏中,例如象棋,围棋等棋类游戏。算法思想也是合乎人类的思考逻辑的&a…

物理机搭建hive

一、修改Hadoop配置 修改core-site.xml 配置yarn-site.xml 分发文件,然后重启集群 二、 Hive解压安装 上传文件 添加hive环境便量,source生效 启动高可用集群,启动hive 三、配置mysql元数据库 检查当前系统是否安装过Mysql&#xf…

开启Android学习之旅-5-Activity全屏

Android 两种方式设置全屏: 1. 第一行代码中的方法 通过 getWindow().getDecorView()方法拿到当前Activity的DecorView,再调用 setSystemUiVisibility() 方法来改变系统UI的显示,这里传入了 View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN 和 View.SYSTEM_UI_…

服务器部署项目,访问验证码出现Handler dispatch failed....InvocationTargeException

场景: 部署ruoyi-vue的jar。访问验证码接口时,出现异常。本地测试没有问题,起初使用的jdk8,怀疑jdk版本问题,但是本地使用11.0.15版本也没问题,后面也就没管,初步排除jdk版本的问题。之前项目也…

软考高级选择考哪个好?

📒软考高级总共5个科目,同样是高级证书,认可度也有区别! 大家一般在「信息系统项目管理师」✔️和「系统架构设计师」✔️二选一 1️⃣信息系统项目管理师 ❤️信息系统项目管理师也叫「高项」,考试内容主要是「项目管理」相关&am…

el-tree多个树进行节点同步联动(完整版)

2024.1.11今天我学习了如何对多个el-tree树进行相同节点的联动效果,如图: 这边有两棵树,我们发现第一个树和第二个树之间会有重复的指标,当我们选中第一个树的指标,我们希望第二个树如果也有重复的指标也能进行勾选上&…

这6个免费素材网站,设计师们一定要知道!

设计师找素材就上这6个网站,免费下载,还可以商用,建议收藏好了~ 1、菜鸟图库 https://www.sucai999.com/?vNTYwNDUx 菜鸟图库是我推荐过很多次的网站,主要是站内素材多,像平面、UI、电商等超多设计素材都能找到&…

PLECS如何下载第三方库并导入MOSFET 的xml文件,xml库路径添加方法及相关问题

1. 首先xml库的下载,PLECS提供了一个跳转的链接。 https://www.plexim.com/download/thermal_models 2. 下载一个库(以最后一个Wolfspeed为例,属于CREE的SiC MOSFET) 下载这个就行,都包含了。不信自己可以试试再下载…

Win10子系统Ubuntu实战(一)

在 Windows 10 中安装 Ubuntu 子系统(Windows Subsystem for Linux,简称 WSL)有几个主要的用途和好处:Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言,WSL 提供了一种将 Windows 和 Linux…

【Linux】Linux系统编程——ls命令

【Linux】Linux 系统编程——ls 命令 1.命令概述 ls 命令是 Linux 和其他类 Unix 操作系统中最常用的命令之一。ls 命令是英文单词 list 的缩写,正如 list 的意思,ls 命令用于列出文件系统中的文件和目录。使用此命令,用户可以查看目录中的…

刚买的助听器就弄丢了,不想白配,快来看看这8大助听器防丢小技巧

我们知道助听器可以让听损人士重新听到美妙的声音和享受沟通的乐趣。但是,助听器也是一种很贵的物品,如果不小心弄丢了,就会让人心痛不已。 更有甚者,有些人因为害怕丢失助听器,而不敢佩戴助听器,错过了听力…

实现线程同步的几种方式

线程同步 1. 线程同步概念 线程同步是指多个线程协调它们的执行顺序,以确保它们正确、安全地访问共享资源。在并发编程中,当多个线程同时访问共享数据或资源时,可能会导致竞争条件(Race Condition)和其他并发问题 所…

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2)

Android基于Matrix绘制PaintDrawable设置BitmapShader,以手指触点为中心显示原图像圆图,Kotlin(2) 在 https://zhangphil.blog.csdn.net/article/details/135374279 基础上,增加一个功能,当手指在上面的图片…

内 存 取 证

1.用户密码 从内存中获取到用户admin的密码并且破解密码,以Flag{admin,password}形式提交(密码为6位); 1)查看帮助 -h ./volatility_2.6_lin64_standalone -h 2)获取内存镜像文件的信息 imageinfo ./volatility_2.6_lin64_stand…

SpringBoot pom.xml文件标签含义

Pom文件 基本构成 通过最简单的一个SpringBoot项目的 Pom文件来了解一下Pom文件的基本构成 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XML…