【Linux】零基础学习动静态库打包

article/2025/10/31 2:55:24

文章目录

  • 一、软硬链接
  • 二、动静态库
    • 理解动静态库
    • 静态库的打包使用
    • 静态库打包Makefile编写
    • 动态库的打包使用
    • 动态库打包Makefile编写
    • 对于小版本的理解
  • 总结


一、软硬链接


站在先前的讲过的文件系统的角度来看,下图test这个文件有自己独立的inode,在他的inode对应的block数据块当中存放的是test这个可执行程序的路径(包括文件名)。

在这里插入图片描述

并且如果此时将bin1/bin2/bin3/test的这个程序移动到其他位置,软连接则会无效。
在这里插入图片描述

一个文件可以既被软链接,又被硬链接,对文件的修改都会同步到链接的文件当中。



二、动静态库


库的命名:
取消前缀lib,去掉.之后的内容,剩下就是库的名字。

动态链接 – >动态库 libc.so
静态链接 – >静态库 libc.a

感性认知:
动态链接类似于每次要钱就找父母要一次钱。
静态链接类似家里的小金库就是你的,需要自己就可以满足。

gcc编译默认是动态链接的,相同的代码动态链接的程序小于静态链接的程序

//分别生成动静态链接的程序
[ljh@VM-0-11-centos 2.27]$ gcc test.c -o test_dynamic
[ljh@VM-0-11-centos 2.27]$ gcc test.c  -static -o test_static
[ljh@VM-0-11-centos 2.27]$ ll
total 876
-rwxrwxr-x 1 ljh ljh   8360 Feb 27 11:28 a.out
-rw-rw-r-- 1 ljh ljh     27 Feb 27 11:12 log.txt
-rw-rw-r-- 1 ljh ljh     68 Feb 27 11:28 test.c
-rwxrwxr-x 1 ljh ljh   8360 Feb 27 11:29 test_dynamic
-rwxrwxr-x 1 ljh ljh 861288 Feb 27 11:29 test_static

我们通过上面代码可以发现test_static的程序远远大过test_dynamic的程序,他们两个程序用的库一个是libc.so,一个是libc.a

ldd命令可以查看文件依赖的动态库:

[ljh@VM-0-11-centos 2.27]$ ldd test_dynamic linux-vdso.so.1 =>  (0x00007fff813cd000)libc.so.6 => /lib64/libc.so.6 (0x00007fa5e59ce000)/lib64/ld-linux-x86-64.so.2 (0x00007fa5e5d9c000)

习惯: 一般,为了更好地支持开发,第三方库和语言库,都必须提供两个库,一个是静态库,一个是动态库,方便程序员进行二进制文件的生成。

动态链接vs静态链接
动态链接:体积小,节省资源(磁盘,内存),一旦库丢失,程序就不可以执行了。
静态链接:体积大,浪费资源(磁盘,内存),可能用C语言写10个可执行程序,会出现大量的重复的代码。但库丢失(不安装),不影响。



理解动静态库


专注于打包动静态库与使用动静态库

静态库:
目标:实现一个加减法的静态库。

分析:别人要知道我提供的库是要什么方法,我们当然可以把.c*,.h全部发给别人,但是如果今天我们不想给.c,我们可以将.c全部编译成.o,.o*打包成库,然后和.h放在一个文件夹里放给别人就可以了。

源代码需要私密性保护头文件可以告知有什么方法

步骤:
1. 编写.c和.h文件

[ljh@VM-0-11-centos bin11]$ ll
total 16
-rw-rw-r-- 1 ljh ljh 56 Feb 27 11:55 Add.c
-rw-rw-r-- 1 ljh ljh 53 Feb 27 11:55 Add.h
-rw-rw-r-- 1 ljh ljh 55 Feb 27 11:55 Sub.c
-rw-rw-r-- 1 ljh ljh 53 Feb 27 11:55 Sub.h

2. 采用ar -rc命令打包r:replace替换,create创建

我们下面创建一个库名为mymath的静态库,打包成lib发送给对端即可。注意是将.o文件打包。

[ljh@VM-0-11-centos bin11]$ gcc -c *.c[ljh@VM-0-11-centos bin11]$ ar -rc libmymath.a *.o[ljh@VM-0-11-centos bin11]$ ll
total 36
-rw-rw-r-- 1 ljh ljh   56 Feb 27 11:55 Add.c
-rw-rw-r-- 1 ljh ljh   53 Feb 27 11:55 Add.h
-rw-rw-r-- 1 ljh ljh 1240 Feb 27 12:31 Add.o
drwxrwxr-x 2 ljh ljh 4096 Feb 27 12:01 lib
-rw-rw-r-- 1 ljh ljh 2920 Feb 27 12:31 libmymath.a
-rw-rw-r-- 1 ljh ljh   55 Feb 27 11:55 Sub.c
-rw-rw-r-- 1 ljh ljh   53 Feb 27 11:55 Sub.h
-rw-rw-r-- 1 ljh ljh 1240 Feb 27 12:31 Sub.o
drwxrwxr-x 3 ljh ljh 4096 Feb 27 12:33 test[ljh@VM-0-11-centos bin11]$ mkdir lib[ljh@VM-0-11-centos bin11]$ cp *.h *.a lib[ljh@VM-0-11-centos bin11]$ tree lib
lib
|-- Add.h
|-- libmymath.a
`-- Sub.h0 directories, 3 files

有了lib,我们把lib发送给别人就可以,我们这里在本机创建多一个文件夹做测试。

3. 测试lib

[ljh@VM-0-11-centos bin11]$  mkdir test
[ljh@VM-0-11-centos bin11]$ cd test
[ljh@VM-0-11-centos test]$ cp ../lib . -rf



静态库的打包使用


李四今日拿到张三发的lib文件,看了看里面的.h文件,发现实现了Add,Sub,想拿来使用,于是他写了下面这段代码,但是却报错了。

[ljh@VM-0-11-centos test]$ vim main.c[ljh@VM-0-11-centos test]$ cat main.c
#include<stdio.h>
#include"Add.h"
#include"Sub.h"
int main()
{printf("%d\n",Add(10,20));printf("%d\n",Sub(10,20));
}[ljh@VM-0-11-centos test]$ gcc main.c -o main
main.c:2:16: fatal error: Add.h: No such file or directory#include"Add.h"^
compilation terminated.[ljh@VM-0-11-centos test]$ pwd
/home/ljh/2.27/bin11/test

No such file or directory,李四查阅了原因,头文件只会在默认路径或main.c的同路径下查找/home/ljh/2.27/bin11/test,也就是这个路径,而.h放在了/home/ljh/2.27/bin11/test/lib下,李四这个时候理解了,查阅了方法,发现gcc带选项 -I ./lib即可.
随即他写下这段代码:李四看到报出了链接错误,那么肯定是找到了文件,但是却没有链接上,李四冥思苦想,上网查找资料。

[ljh@VM-0-11-centos test]$ gcc main.c -o main -I ./lib/
/tmp/ccBm9pNY.o: In function `main':
main.c:(.text+0xf): undefined reference to `Add'
main.c:(.text+0x2f): undefined reference to `Sub'
collect2: error: ld returned 1 exit status

李四最终发现库文件的路径没有指定,也就是.h他能找到了,但是.c找不到就是库没有找到,而gcc下 -L ./lib就能指定这个库,李四随即把代码改成下面,但是还是报了错误。

[ljh@VM-0-11-centos test]$ gcc main.c -o main -I ./lib/ -L ./lib/
/tmp/ccHZnoAe.o: In function `main':
main.c:(.text+0xf): undefined reference to `Add'
main.c:(.text+0x2f): undefined reference to `Sub'
collect2: error: ld returned 1 exit status

李四想了想,引入的库文件路径已经有了,头文件也已经能找到了,是不是要给出具体的库文件名呢?gcc下 -l mymath 后加库名称,代码改了之后,李四发现就能够正常运行了。

[ljh@VM-0-11-centos test]$ gcc main.c -o main -I ./lib/ -L ./lib/  -lmymath
[ljh@VM-0-11-centos test]$ ./main 
30
-10

注意1:
若发生以下错误,则是打包的时候错误的将.c文件给打包了。
[ljh@VM-0-11-centos test]$ gcc main.c -o main -I ./lib/ -L ./lib/ -lmymath
./lib//libmymath.a: error adding symbols: Archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status

注意2:
上面我们提供的静态库但是编译的时候是默认动态 链接,链接会变成静态链接。虽然file显示静态链接,但是ldd没有显示我们的staticlib库,说明对这个库采用的是静态链接的方式。
file 命令文件是否是链接状态

[ljh@VM-0-11-centos zhangsan]$ ls
main  main.c  stlib
[ljh@VM-0-11-centos zhangsan]$ file main
main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=fc61dd09c0e83aa9d34292bb5dfcfd2322b5337f, not stripped 这里显示动态但是ldd当中没有,说明staticlib库没有被动态链接。
[ljh@VM-0-11-centos zhangsan]$ ldd mainlinux-vdso.so.1 =>  (0x00007ffec1fd9000)libc.so.6 => /lib64/libc.so.6 (0x00007ff39e814000)/lib64/ld-linux-x86-64.so.2 (0x00007ff39ebe2000)

总结:
gcc选项:
-I + path 给定路径或默认路径当中查找,默认路径一般是 /usr/include。
-L + path:告诉gcc除了默认路径和当前路径,也要到我们的指定路径下找库文件,系统默认的默认库在/lib或/lib64当中。
-l +库名称 例如ls/lib64,我们能看到很多库,但是具体是要哪一个库我们是要去指定的。

为什么在C语言编译的时候,从来没有明显的使用-L,-I,-i等选项呢?
因为库文件和头文件在默认路径下gcc能找到,并且gcc是编译C代码的,默认就链接了libc,所以我们一个选项都不用带就可以编译程序。

我们的程序如何不使用这些选项也能编译程序
头文件和库文件分别拷贝到默认路径下(库的安装)。但是通常第三方库要调用的时候还是要带-l表明要链接哪一个库。

静态库打包Makefile编写

进行ar打包并创建stlib文件夹,只需要把stlib发送给别人就可以了。
代码:

[ljh@VM-0-11-centos dystlib]$ cat Makefile 
lib:Add.o Sub.oar -rc libstaticlib.a *.o mkdir stlibcp *.h stlib cp libstaticlib.a stlib
Add.o:Add.cgcc -c $^
Sub.o:Sub.cgcc -c $^

结果:

[ljh@VM-0-11-centos dystlib]$ cd zhangsan
[ljh@VM-0-11-centos zhangsan]$ cp ../stlib/ .
[ljh@VM-0-11-centos zhangsan]$ tree stlib
stlib
|-- Add.h
|-- libstaticlib.a
`-- Sub.h0 directories, 3 files
[ljh@VM-0-11-centos zhangsan]$ gcc main.c -o main -I ./stlib/ -L ./stlib/  -lstaticlib
[ljh@VM-0-11-centos zhangsan]$ ./main 
30
-10

动态库的打包使用


动态库的打包:
生成一个加减法的动态库dy_lib

  • 生成动态库 shared: 表示生成共享库格式 fPIC:产生位置无关码(position independent code)
    库名规则:libxxx.so
    调用动态库本质上是进程跑起来后由进程在共享区当中执行库文件的代码。
    进程执行代码区的代码的时候需要动态库的内容就可以去共享区当中执行。
    在这里插入图片描述

动态链接时:
当我们有若干个进程都需要同一个同一个动态库的内容的时候,我们的内存当中只需要存一份实体。
静态链接时:
每个进程执行程序都会加载到代码区当中,内存当中对一份代码的实现可能存在多份实体。
在这里插入图片描述
位置无关码:每个进程都有一个共享区,共享区的不同位置可以映射到相同的动态库代码,动态库代码也可以加载到内存当中的任意位置(页表的转换),每个进程就可以在打开的动态库文件里面执行对应的函数。
保证库当中有多少行代码,怎么执行都不会出错,与位置无关,即使有函数调用也能正常运行。总之不影响库的执行。

动态库打包Makefile编写

[ljh@VM-0-11-centos dy_lib]$ cat Makefile 
lib:Add.o Sub.ogcc -shared *.o -o libmymath.so mkdir dylibcp ./*h dylib cp libmymath.so dylib
Add.o:Add.cgcc -fPIC -c $^
Sub.o:Sub.cgcc -fPIC -c $^
.PHONY:clean
clean:rm -rf dylib

使用上与静态相比略有一点差异,会报错
cannot open shared object file: No such file or directory。

错误示范
[ljh@VM-0-11-centos zhangsan]$ cp -rf ../dylib/ .
[ljh@VM-0-11-centos zhangsan]$ ls
dylib  main.c
[ljh@VM-0-11-centos zhangsan]$ tree dylib
dylib
|-- Add.h
|-- libmymath.so
`-- Sub.h0 directories, 3 files
[ljh@VM-0-11-centos zhangsan]$ gcc main.c -o main -I ./dylib/ -L ./dylib/  -lmymath
[ljh@VM-0-11-centos zhangsan]$ ./main
./main: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory

分析问题:
当我们运行的时候与编译器gcc已经没有关系了。运行的时候是系统要帮我们找到运行时要使用的动态库!!!
相当于我们给了编译器明确的路径,编译器知道了,并且编译器借助环境变量生成了一个正确的路径,但是系统不会找编译器要,我们还需要自己指明路径给编译器。
在这里插入图片描述

为什么之前动态连接的其他程序,可以直接运行呢?
因为库在默认路径下,系统可以找到。


解决方法:
第一种解决方案:
环境变量LD_LIBRARY_PATH,我们只需要把库的目录路径导入到环境变量后就可以了。

[ljh@VM-0-11-centos dy_lib]$ cd zhangsan[ljh@VM-0-11-centos zhangsan]$ ls dylib
Add.h  libmymath.so  Sub.h[ljh@VM-0-11-centos zhangsan]$ ./main
./main: error while loading shared libraries: libmymath.so: cannot open shared object file: No such file or directory[ljh@VM-0-11-centos zhangsan]$ pwd  查询当前目录
/home/ljh/2.27/dystlib/dy_lib/zhangsan[ljh@VM-0-11-centos zhangsan]$ export  LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/ljh/2.27/dystlib/dy_lib/zhangsan/dylib    追加导入环境变量
[ljh@VM-0-11-centos zhangsan]$ ./main
30
-10

在这里插入图片描述

然后我们可以把先前写的动静态库放到同一个文件夹(lib)当中,就可以供别人使用。

[ljh@VM-0-11-centos zhangsan]$ ls
lib  main.c打印文件内容
[ljh@VM-0-11-centos zhangsan]$ tree lib
lib
|-- Add.h
|-- libmymath.a
|-- libmymath.so
`-- Sub.h0 directories, 4 files[ljh@VM-0-11-centos zhangsan]$ gcc main.c -o main -I ./lib/ -L ./lib/  -lmymath -staticmain就可以是静态编译了
[ljh@VM-0-11-centos zhangsan]$ file main
main: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=02ddaebbe1c007e6bfcd54f5b91e3128a136ebac, not stripped

当然这里的库也可以放在二级目录,三级目录。
在这里插入图片描述
第二种找到动态库的方法:把自己写的.so文件拷贝到系统的共享库路径下,一般指/usr/lib64。
第三种找到动态库的方法:ldconfig 配置/etc/ld.so.conf.d/,在root用户ldconfig更新
在/etc/ld.so.con.d/路径下创建一个后缀.conf的文件,然后把lib的目录地址写入,有多个可以换行写入即可。
注意要再ldconfig刷新,就可以正常运行动态链接的文件。

编写lib文件的路径
[root@VM-0-11-centos ~]# echo "/home/ljh/2.27/dystlib/dy_lib/zhangsan/lib" > /etc/ld.so.conf.d/ljh_tmp.conf
[root@VM-0-11-centos ~]# logout
刷新
[root@VM-0-11-centos ~]# ldconfig
[root@VM-0-11-centos ~]# logout
[ljh@VM-0-11-centos zhangsan]$ ./main30
-10

在这里插入图片描述

第一种方法只在未关闭会话时有效,第二种只在设置user下有效,而第三种方法可以永久使用。



对于小版本的理解

在这里插入图片描述

  • 1.因为通常我们的库会有升级,所以我们的库名可能是 libhello.so.a.b.c 之类的,那么如何设置呢?
  • 首先ldd 当中找到名字是可执行文件的soname,而我们gcc的时候定义库名的时候可以添加字段soname

-Wl.option:
此选项传递 option 给连接程序; 如果 option 中间有逗号, 就将 option 分成多个选项, 然 后传递给会连接程序。

gcc hello.c -fPIC -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.1
这样子我们ldd main 的时候显示的就是libhello.so.0 了;
在这里插入图片描述

  • 2.但是此时我们并不能看到libhello.so.0 ,而只有libhello.so.0.0.1,实际上需要使用ldconfig -n . 进行刷新配置。因为配置实际上也有类似缓存的概念,默认我们读的都是缓存,而不是从文件当中进行读取,ldconfig -n .就是让:用此选项时,ldconfig仅扫描命令行指定的目录,不扫描默认目录(/lib、/usr/lib),也不扫描配置文件/etc/ld.so.conf所列的目录。
    在这里插入图片描述
    1. 但是此时我们的程序要连接的时候不能带上小版本号,gcc main.c -L . -lhello -o main 如这样,那么我们需要用ln -s 再弄一个软连接,ln libhello.so.0 -s libhello.so ,就会生成如下,但是此时我们需要添加环境变量。
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:`pwd`

在这里插入图片描述
这样带来的好处,就是若是小版本的更新,可以不用编译程序,而程序就能够用到最新的动态库。

  • 1.gcc hello.c -fPIC -shared -Wl,-soname,libhello.so.0 -o libhello.so.0.0.2

在这里插入图片描述
上述的图有误,实际上再次执行一次ldconfig -n .可以让指向最新的版本。后续运行不需要重新编译源文件。实际上的图类似下面,进行一个简单的更正~
在这里插入图片描述

  • 2.运行main 函数

在这里插入图片描述

  • 3.验证发送出去,此时由于 libhello.so的路径 实际上和前面是一样的,也能够从之前的路径,main通过找到找到自己的libhello.so.0 找到libhello.so.0.0.1,但实际上此时已经可以用到最新版本了。
    在这里插入图片描述

注意:通常环境变量的设置会在/etc/profile.d/ 的路径创建文件,这样能解耦,不需要直接修改 /etc/profile 文件,效果相同。 同理动态库的设置 /etc/ld.so.conf.d/ 底下创建新的文件即可。

库的理解:

当我们使用第三方库,下载别人的库,如果是源文件,我们可以自己编译生成库再使用,如果是别人帮我们编写好了,我们就可以安装实际就帮我们拷贝到了默认路径下。


总结

!_!


http://chatgpt.dhexx.cn/article/7DblwSTT.shtml

相关文章

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录 何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包 第三方库的使用静态库的使用动态库的使用 在系统层面上的动态链接理解 何为动静态库 静态库(.a)&#xff1a;在程序编译链接时将静态库二进制码拷贝到程序代码中&#xff0c;程序运行时不再需要外部的静…

覆盖libc.so.6的惨痛教训

覆盖libc.so.6的惨痛教训 背景问题原因解决1、当前session未断开2、OS崩溃重启&#xff0c;所有ssh session断开 惨痛教训1、对于上产环境的内核依赖库文件不能随意覆盖、删除。2、 scp 文件覆盖问题 总结参考 背景 发生时间: 2022年11月28日08:55:20 偷了个懒&#xff0c;在安…

【Linux】自动生成makefile(ubuntu)

文章目录 前言一、Automake工具二、具体步骤1.下载Automake2.autoscan3.重命名configure.scan为configure.ac4.修改重命名后的configure.ac5.执行aclocal命令6.autoheader7.autoconf8.创建Makefile.am9.automake10.执行configure11.执行make12.执行Makefile编译完生成的可执行文…

【Linux】基础IO —— 下(实现动静态库)

&#x1f387;Linux&#xff1a;基础IO 博客主页&#xff1a;一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a; 看似不起波澜的日复一日&#xff0c;一定会在某一天让你看…

【Linux】第九章 动态库和静态库(生成原理+生成和使用+动态链接)

&#x1f3c6;个人主页&#xff1a;企鹅不叫的博客 ​ &#x1f308;专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接&#xff1a;代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

Linux——自动化编译(make的使用)、库文件(静态库和共享库的使用)

一、make的使用&#xff08;自动化编译&#xff09; make是Linux上的工程管理工具&#xff0c;可以实现自动化编译&#xff1b;make可以提高我们的编译效率。 1.安装make 命令&#xff1a;sudo apt install make 2.make的用法 &#xff08;1&#xff09;创建makefile文件&am…

rpc系列-ZooKeeper

一.简介 Zookeeper是一个分布式协调服务&#xff0c;就是为用户的分布式应用程序提供协调服务。 Zookeeper本身就是一个分布式程序&#xff08;只要有半数以上节点存活&#xff0c;zk就能正常服务&#xff09;。 Zookeeper所提供的服务涵盖&#xff1a;主从协调、服务器节点…

HBase 一文读懂

本文基于《尚硅谷大数据技术之HBase》编写。 HBase 简介 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 HBase数据模型 HBase的数据模型同关系型数据库&#xff08;RDMS&#xff09;很类似&#xff0c;数据存储在一张表中&#xff0c;有行有列。但从H…

Zookeeper学习

文章目录 今日目标apache zookeeperzookeeper的概念分布式和集群的理解zookeeper的集群架构和角色zookeeper的5大特性部署zookeeper集群环境计算机集群的安装部署三台节点&#xff08;克隆两台&#xff09;配置节点内存和CPUzookeeper安装 zookeeper的数据模型zookeeper的节点类…

Redission和Zookeeper分别实现分布式锁

Redission和Zookeeper分别实现分布式锁&#xff08;windows&#xff09; 1、Redission实现分布式事务 1.1 前提准备 下载好nginx&#xff08;windows版本&#xff09;下载好Jmeter&#xff08;模仿高并发&#xff09;下载好redis&#xff08;windows版&#xff09; 1.2 代码…

Zookeeper 客户端之基本操作指令

ZooKeeper命令行工具类似于Linux的shell环境&#xff0c;不过功能肯定不及shell啦&#xff0c;但是使用它我们可以简单的对ZooKeeper进行访问&#xff0c;数据创建&#xff0c;数据修改等操作. 命令行工具的一些简单操作如下&#xff1a; zkCli.sh客户端连接命令 ls 与 ls2 命…

kafka内置zookeeper启动失败报错INFO ZooKeeper audit is disabled. (org.apache.zookeeper.audit.ZKAuditProvider)

kafka内置zookeeper启动失败报错INFO ZooKeeper audit is disabled.(org.apache.zookeeper.audit.ZKAuditProvider)2022年新版win10安装kafka 安装配置kafka&#xff0c;在启动zookeeper时报错ZooKeeper audit is disabled 原因分析&#xff1a; 寻找资料发现是zookeeper设置参…

zookeeper日志及快照清理操作

事务日志可视化转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/bin/sh # scriptname: zkLog2txt.sh # zookeeper事务日志为二进制格式&#xff0c;使用LogFormatter方法转换为可阅读的日志 if [ -z "$1" -o "$1" "-h&quo…

【RPC】注册中心实现方案之ZooKeeper

文章目录 ZooKeeper一致性协议&#xff1a;ZAB ZooKeeper ZooKeeper是一个开源的分布式协调服务&#xff0c;它可以用来协调和同步多服务器之间的状态。 ZooKeeper 可以作为微服务架构中注册中心的选型&#xff0c;它最需要被关心的也是数据模型和一致性协议。数据模型关乎服…

Linux 搭建zookpeer集群和配置

zookpeer和JDK1.8下载地址 下载地址&#xff1a;zookpeer和jdk1.8 提取码&#xff1a;w189 解压以及配置zookpeer tar -zxvf zookeeper-3.4.6.tar.gz tar -zxvf jdk-8u144-linux-x64.tar.gz 基本参数配置 参数描述clientPort主要定义客户端连接zookeeper server的端口&…

hadoop-zookeeper的详细介绍以及安装配置步骤

一、zookeeper的介绍 ZooKeeper是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、…

k8s-7: kafka+zookeeper的单节点与集群的持久化

之前在k8s环境中有这个需求&#xff0c;看了好多的文档&#xff0c;都有坑&#xff0c;踩了一边总结一下&#xff0c;需要的朋友可自取 一、单节点部署 建议开发环境使用&#xff0c;且此处采用动态挂载的&#xff0c;生产不建议 1、安装zk cat > zk.yaml <<EOF a…

Docker 安装Zookeeper

第一步&#xff1a;查看本地镜像和检索拉取Zookeeper 镜像 # 查看本地镜像 docker images # 检索ZooKeeper 镜像 docker search zookeeper # 拉取ZooKeeper镜像最新版本 docker pull zookeeper:latest [rootlocalhost ~]# docker images REPOSITORY TAG …

mac pro m1:搭建zookeeper集群并设置开机自启

0. 引言 之前我们讲解过搭建zookeeper单节点&#xff0c;但在实际生产中&#xff0c;为了保证服务高可用&#xff0c;通常我们是采用集群模式。所以本次我们来实操集群模式的搭建 1. zk集群模式 zk可以作为注册中心和配置中心&#xff0c;常用在微服务各类组件的多节点服务治…

一款实用的数据恢复软件—zook data recovery wizard

zook data recovery wizard是RecoveryTools下的一款子品牌&#xff0c;同时也是一款功能实用的数据恢复软件&#xff0c;该软件可以从Windows中恢复已删除&#xff0c;损坏&#xff0c;格式化和丢失的数据&#xff0c;能够支持从驱动器&#xff0c;SD卡&#xff0c;硬盘&#x…