万字干货,eBPF中文入门指南长治网络安全等级保护,长治等保,长治网安备案,网站制作,网站建站,网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储

eBPF源于BPF[1],本质上是处于内核中的一个高效与灵活的虚类虚拟机组件,以一种安全的方式在许多内核hook点执行字节码。BPF最初的目的是用于高效网络报文过滤,经过重新设计,eBPF不再局限于网络协议栈,已经成为内核顶级的子系统,演进为一个通用执行引擎。

开发者可基于eBPF开发性能分析工具、软件定义网络、安全等诸多场景。本文将介绍eBPF的前世今生,并构建一个eBPF环境进行开发实践,文中所有的代码可以在我的Github[2]中找到。

BPF,是类Unix系统上数据链路层的一种原始接口,提供原始链路层封包的收发。1992年,StevenMcCanne和VanJacobson写了一篇名为TheBSDPacketFilter:ANewArchitectureforUser-levelPacketCapture[3]的论文。在文中,作者描述了他们如何在Unix内核实现网络数据包过滤,这种新的技术比当时最先进的数据包过滤技术快20倍。

BPF在数据包过滤上引入了两大革新:

由于这些巨大的改进,所有的Unix系统都选择采用BPF作为网络数据包过滤技术,直到今天,许多Unix内核的派生系统中(包括Linux内核)仍使用该实现。tcpdump的底层采用BPF作为底层包过滤技术,我们可以在命令后面增加-d来查看tcpdump过滤条件的底层汇编指令。

eBPF新的设计针对现代硬件进行了优化,所以eBPF生成的指令集比旧的BPF解释器生成的机器码执行得更快。扩展版本也增加了虚拟机中的寄存器数量,将原有的2个32位寄存器增加到10个64位寄存器。由于寄存器数量和宽度的增加,开发人员可以使用函数参数自由交换更多的信息,编写更复杂的程序。总之,这些改进使eBPF版本的速度比原来的BPF提高了4倍。

2014年6月,eBPF扩展到用户空间,这也成为了BPF技术的转折点。正如Alexei在提交补丁的注释中写到:「这个补丁展示了eBPF的潜力」。当前,eBPF不再局限于网络栈,已经成为内核顶级的子系统。

对比Web的发展,eBPF与内核的关系有点类似于JavaScript与浏览器内核的关系,eBPF相比于直接修改内核和编写内核模块提供了一种新的内核可编程的选项。eBPF程序架构强调安全性和稳定性,看上去更像内核模块,但与内核模块不同,eBPF程序不需要重新编译内核,并且可以确保eBPF程序运行完成,而不会造成系统的崩溃。

eBPF分为用户空间程序和内核程序两部分:

eBPF整体结构图如下:

用户空间程序与内核中的BPF字节码交互的流程主要如下:

eBPF技术虽然强大,但是为了保证内核的处理安全和及时响应,内核中的eBPF技术也给予了诸多限制,当然随着技术的发展和演进,限制也在逐步放宽或者提供了对应的解决方案。

在深入介绍eBPF特性之前,让我们GetHandsDirty,切切实实的感受eBPF程序到底是什么,我们该如何开发eBPF程序。随着eBPF生态的演进,现在已经有越来越多的工具链用于开发eBPF程序,在后文也会详细介绍:

系统环境如下,采用腾讯云CVM,Ubuntu20.04,内核版本5.4.0

前面说到eBPF通常由内核空间程序和用户空间程序两部分组成,现在samples/bpf目录下有很多这种程序,内核空间程序以_kern.c结尾,用户空间程序以_user.c结尾。先不看这些复杂的程序,我们手动写一个eBPF程序的HelloWorld。

内核中的程序hello_kern.c:

它提供了bpf编程需要的很多symbol。例如

等等

来自libbpf,需要自行安装。我们引用这个头文件是因为调用了bpf_printk()。这是一个kernelhelperfunction。

这里我们简单解读下内核态的ebpf程序,非常简单:

用户态程序hello_user.c

修改samples/bpf目录下的Makefile文件,在对应的位置添加以下三行:

如果针对某个特定需求的Hook点不存在,可以通过kprobe或者uprobe来在内核或者用户程序的几乎所有地方挂载eBPF程序。

Withgreatpowertheremustalsocomegreatresponsibility.

每一个eBPF程序加载到内核都要经过Verification,用来保证eBPF程序的安全性,主要包括:

64位的x86_64、arm64、ppc64、s390x、mips64、sparc64和32位的arm、x86_32架构都内置了in-kerneleBPFJIT编译器,它们的功能都是一样的,可以用如下方式打开:

要判断哪些平台支持eBPFJIT,可以在内核源文件中grepHAVE_EBPF_JIT:

BPFMap的交互场景有以下几种:

共享map的BPF程序不要求是相同的程序类型,例如tracing程序可以和网络程序共享map,单个BPF程序目前最多可直接访问64个不同map。

当前可用的通用map有:

当前内核中的非通用map有:

eBPF程序不能够随意调用内核函数,如果这么做的话会导致eBPF程序与特定的内核版本绑定,相反它内核定义的一系列Helperfunctions。Helperfunctions使得BPF能够通过一组内核定义的稳定的函数调用来从内核中查询数据,或者将数据推送到内核。所有的BPF辅助函数都是核心内核的一部分,无法通过内核模块来扩展或添加。当前可用的BPF辅助函数已经有几十个,并且数量还在不断增加,你可以在LinuxManualPage:bpf-helpers[11]看到当前Linux支持的Helperfunctions。

不同类型的BPF程序能够使用的辅助函数可能是不同的,例如:

所有的辅助函数都共享同一个通用的、和系统调用类似的函数方法,其定义如下:

虽然cBPF允许其加载指令(loadinstructions)进行超出范围的访问(overload),以便从一个看似不可能的包偏移量(packetoffset)获取数据以唤醒多功能辅助函数,但每个cBPFJIT仍然需要为这个cBPF扩展实现对应的支持。而在eBPF中,JIT编译器会以一种透明和高效的方式编译新加入的辅助函数,这意味着JIT编译器只需要发射(emit)一条调用指令(callinstruction),因为寄存器映射的方式使得BPF排列参数的方式(assignments)已经和底层架构的调用约定相匹配了。这使得基于辅助函数扩展核心内核(corekernel)非常方便。所有的BPF辅助函数都是核心内核的一部分,无法通过内核模块(kernelmodule)来扩展或添加。

前面提到的函数签名还允许校验器执行类型检测(typecheck)。上面的structbpf_func_proto用于存放校验器必需知道的所有关于该辅助函数的信息,这样校验器可以确保辅助函数期望的类型和BPF程序寄存器中的当前内容是匹配的。

参数类型范围很广,从任意类型的值,到限制只能为特定类型,例如BPF栈缓冲区(stackbuffer)的pointer/size参数对,辅助函数可以从这个位置读取数据或向其写入数据。对于这种情况,校验器还可以执行额外的检查,例如,缓冲区是否已经初始化过了。

尾调用的机制是指:一个BPF程序可以调用另一个BPF程序,并且调用完成后不用返回到原来的程序。

BPF辅助函数的调用约定也适用于BPF函数间调用:

当前,BPF函数间调用和BPF尾调用是不兼容的,因为后者需要复用当前的栈设置(stacksetup),而前者会增加一个额外的栈帧,因此不符合尾调用期望的布局。

BPFJIT编译器为每个函数体发射独立的镜像(emitseparateimagesforeachfunctionbody),稍后在最后一通JIT处理(finalJITpass)中再修改镜像中函数调用的地址。已经证明,这种方式需要对各种JIT做最少的修改,因为在实现中它们可以将BPF函数间调用当做常规的BPF辅助函数调用。

BPFmap和程序作为内核资源只能通过文件描述符访问,其背后是内核中的匿名inode。这带来了很多优点:

但同时,文件描述符受限于进程的生命周期,使得map共享之类的操作非常笨重,这给某些特定的场景带来了很多复杂性。

例如iproute2,其中的tc或XDP在准备环境、加载程序到内核之后最终会退出。在这种情况下,从用户空间也无法访问这些map了,而本来这些map其实是很有用的。例如,在datapath的ingress和egress位置共享的map(可以统计包数、字节数、PPS等信息)。另外,第三方应用可能希望在BPF程序运行时监控或更新map。

相应的,BPF系统调用扩展了两个新命令,如下图所示:

为了避免代码被损坏,BPF会在程序的生命周期内,在内核中将BPF解释器解释后的整个镜像(structbpf_prog)和JIT编译之后的镜像(structbpf_binary_header)锁定为只读的。在这些位置发生的任何数据损坏(例如由于某些内核bug导致的)会触发通用的保护机制,因此会造成内核崩溃而不是允许损坏静默地发生。

查看哪些平台支持将镜像内存(imagememory)设置为只读的,可以通过下面的搜索:

为了防御Spectrev2攻击,Linux内核提供了CONFIG_BPF_JIT_ALWAYS_ON选项,打开这个开关后BPF解释器将会从内核中完全移除,永远启用JIT编译器:

将/proc/sys/net/core/bpf_jit_harden设置为1会为非特权用户的JIT编译做一些额外的加固工作。这些额外加固会稍微降低程序的性能,但在有非受信用户在系统上进行操作的情况下,能够有效地减小潜在的受攻击面。但与完全切换到解释器相比,这些性能损失还是比较小的。对于x86_64JIT编译器,如果设置了CONFIG_RETPOLINE,尾调用的间接跳转(indirectjump)就会用retpoline实现。写作本文时,在大部分现代Linux发行版上这个配置都是打开的。

当前,启用加固会在JIT编译时盲化(blind)BPF程序中用户提供的所有32位和64位常量,以防御JITspraying攻击,这些攻击会将原生操作码作为立即数注入到内核。这种攻击有效是因为:立即数驻留在可执行内核内存(executablekernelmemory)中,因此某些内核bug可能会触发一个跳转动作,如果跳转到立即数的开始位置,就会把它们当做原生指令开始执行。

盲化JIT常量通过对真实指令进行随机化(randomizingtheactualinstruction)实现。在这种方式中,通过对指令进行重写,将原来基于立即数的操作转换成基于寄存器的操作。指令重写将加载值的过程分解为两部分:

这样原始的imm立即数就驻留在寄存器中,可以用于真实的操作了。这里介绍的只是加载操作的盲化过程,实际上所有的通用操作都被盲化了。下面是加固关闭的情况下,某个程序的JIT编译结果:

BPF网络程序,尤其是tc和XDPBPF程序在内核中都有一个offload到硬件的接口,这样就可以直接在网卡上执行BPF程序。

当前,Netronome公司的nfp驱动支持通过JIT编译器offloadBPF,它会将BPF指令翻译成网卡实现的指令集。另外,它还支持将BPFmapsoffload到网卡,因此offloadedBPF程序可以执行map查找、更新和删除操作。

eBPF提供了`bpf()`[14]系统调用来对BPFMap或程序进行操作,其函数原型如下:

cmd可以为一下几种类型,基本上可以分为操作eBPFMap和操作eBPF程序两种类型:

bpf_attrunion的结构如下所示,根据不同的cmd可以填充不同的信息。

对于用户态程序,则其函数原型如下,其中通过fd来访问eBPFmap。

实际上,程序类型本质上定义了一个API。甚至还创建了新的程序类型,以区分允许调用的不同的函数列表(比如BPF_PROG_TYPE_CGROUP_SKB对比BPF_PROG_TYPE_SOCKET_FILTER)。

bpf程序会被hook到内核不同的hook点上。不同的hook点的入口参数,能力有所不同。因而定义了不同的progtype。不同的progtype的bpf程序能够调用的kernelfunction集合也不一样。当bpf程序加载到内核时,内核的verifier程序会根据bpfprogtype,检查程序的入口参数,调用了哪些helperfunction。

目前内核支持的eBPF程序类型列表如下所示:

随着新程序类型的添加,内核开发人员同时发现也需要添加新的数据结构。

举个例子BPF_PROG_TYPE_SCHED_CLSbpfprog,能够访问哪些bpfhelperfunction呢?让我们来看看源代码是如何实现的。

每一种progtype会定义一个structbpf_verifier_ops结构体。当progload到内核时,内核会根据它的type,调用相应结构体的get_func_proto函数。

每一种progtype的调用时机都不同。

BPF_PROG_TYPE_SCHED_CLS的调用过程如下。

egress方向上,tcp/ip协议栈运行之后,有一个hook点。这个hook点可以attachBPF_PROG_TYPE_SCHED_CLStype的egress方向的bpfprog。在这段bpf代码执行之后,才会运行qos,tcpdump,xmit到网卡driver的代码。在这段bpf代码中你可以修改报文里面的内容,地址等。修改之后,通过tcpdump可以看到,因为tcpdump代码在此之后才执行。

BPF_PROG_RUN传给bpfprog的入口参数是skb,其类型是structsk_buff,定义在文件include/linux/skbuff.h中。

但是在bpf代码中,为了安全,不能直接访问sk_buff。bpf中是通过访问struct__sk_buff来访问structsk_buff的。__sk_buff是sk_buff的一个子集,是sk_buff面向bpf程序的接口。bpf代码中对__sk_buff的访问会在verifier程序中翻译成对sk_buff相应fileds的访问。

在加载bpfprog的时候,verifier会调用上面tc_cls_act_verifier_ops结构体里面的tc_cls_act_convert_ctx_access的钩子。它最终会调用下面的函数修改ebpf的指令,使得对__sk_buff的访问变成对structsk_buff的访问。

一种type的bpfprog可以挂到内核中不同的hook点,这些不同的hook点就是不同的attachtype。

其对应关系在下面函数[22]中定义了。

有趣的是,BPF_PROG_TYPE_SCHED_CLS类型的bpfprog不能通过bpf系统调用来attach,因为它没有定义对应的attachtype。故它的attach需要通过netlinkinterface额外的实现,还是非常复杂的。

内核中的progtype目前有30种。每一种type能做的事情有所差异,这里只讲讲我平时工作用过的几种。

理解一种progtype的最好的方法是

在tcp协议event发生时调用的bpf钩子,定义了15种event。这些event的attachtype都是BPF_CGROUP_SOCK_OPS。不同的调用点会传入不同的enum,比如:

主要作用:tcp调优,event统计等。

它对应很多attachtype,一般在bind,connect时调用,传入sock的地址。

主要作用:例如cilium中clusterip的实现,在主动connect时,修改了目的ip地址,就是利用这个。

BPF_PROG_TYPE_CGROUP_SOCK_ADDR,这种类型的程序使您可以在由特定cgroup控制的用户空间程序中操纵IP地址和端口号。在某些情况下,当您要确保一组特定的用户空间程序使用相同的IP地址和端口时,系统将使用多个IP地址.当您将这些用户空间程序放在同一cgroup中时,这些BPF程序使您可以灵活地操作这些绑定。这样可以确保这些应用程序的所有传入和传出连接均使用BPF程序提供的IP和端口。

BPF_PROG_TYPE_SK_MSG,Thesetypesofprogramsletyoucontrolwhetheramessagesenttoasocketshouldbedelivered.当内核创建了一个socket,它会被存储在前面提到的map中。当你attach一个程序到这个socketmap的时候,所有的被发送到那些socket的message都会被filter。在filtermessage之前,内核拷贝了这些data,因此你可以读取这些message,而且可以给出你的决定:例如,SK_PASS和SK_DROP。

调用点:tcpsendmsg时会调用。

主要作用:做sockredir用的。

调用点:getsockopt,setsockopt

类似ftrace的kprobe,在函数出入口的hook点,debug用的。

类似ftrace的tracepoint。

如上面的例子

网卡驱动收到packet时,尚未生成sk_buff数据结构之前的一个hook点。

XDP定义了很多的处理方式,例如

BPF_PROG_TYPE_CGROUP_SKB允许你过滤整个cgroup的网络流量。在这种程序类型中,你可以在网络流量到达这个cgoup中的程序前做一些控制。内核试图传递给同一cgroup中任何进程的任何数据包都将通过这些过滤器之一。同时,您可以决定cgroup中的进程通过该接口发送网络数据包时该怎么做。其实,你可以发现它和BPF_PROG_TYPE_SOCKET_FILTER的类型很类似。最大的不同是cgroup_skb是attach到这个cgroup中的所有进程,而不是特殊的进程。在container的环境中,bpf是非常有用的。

在sockcreate,release,post_bind时调用的。主要用来做一些权限检查的。

BPF_PROG_TYPE_CGROUP_SOCK,这种类型的bpf程序允许你,在一个cgroup中的任何进程打开一个socket的时候,去执行你的Bpf程序。这个行为和CGROUP_SKB的行为类似,但是它是提供给你cgoup中的进程打开一个新的socket的时候的情况,而不是给你网络数据包通过的权限控制。这对于为可以打开套接字的程序组提供安全性和访问控制很有用,而不必分别限制每个进程的功能。

BCC是BPF的编译工具集合,前端提供Python/LuaAPI,本身通过C/C++语言实现,集成LLVM/Clang对BPF程序进行重写、编译和加载等功能,提供一些更人性化的函数给用户使用。

虽然BCC竭尽全力地简化BPF程序开发人员的工作,但其“黑魔法”(使用Clang前端修改了用户编写的BPF程序)使得出现问题时,很难找到问题的所在以及解决方法。必须记住命名约定和自动生成的跟踪点结构。且由于libbcc库内部集成了庞大的LLVM/Clang库,使其在使用过程中会遇到一些问题:

性能优化大师BrendanGregg在用libbpf+BPFCO-RE转换一个BCC工具后给出了性能对比数据:

AsmycolleagueJasonpointedout,thememoryfootprintofopensnoopasCO-REismuchlowerthanopensnoop.py.9MbytesforCO-REvs80MbytesforPython.

我们可以看到在运行时相比BCC版本,libbpf+BPFCO-RE版本节约了近9倍的内存开销,这对于物理内存资源已经紧张的服务器来说会更友好。

bpftraceisahigh-leveltracinglanguageforLinuxeBPFandavailableinrecentLinuxkernels(4.x).bpftraceusesLLVMasabackendtocompilescriptstoeBPFbytecodeandmakesuseofBCCforinteractingwiththeLinuxeBPFsubsystemaswellasexistingLinuxtracingcapabilities:kerneldynamictracing(kprobes),user-leveldynamictracing(uprobes),andtracepoints.Thebpftracelanguageisinspiredbyawk,CandpredecessortracerssuchasDTraceandSystemTap.

长治等保,等保,网络安全,网络等保,等级保护,网络安全等保,网络安全等级保护,长治网络安全等级保护,等保公司,等保测评,等级保护2.0,定级,定级备案,等保备案,长治等保备案,山西等保备案,系统测评,系统备案,网安备案,等保备案服务,等保咨询,公安局备案,二级等保,三级等保,三级测评,系统整改,做等保的公司,网站建设,企业网站建设,企业网站开发,企业网站运维,Linux系统运维,Windows系统运维,服务器运维,环境部署,环境搭建,私有云存储

THE END
1.重庆大学开源软件镜像站重庆大学开源软件镜像站,致力于为国内和校内用户提供高质量的开源软件镜像、Linux 镜像源服务,帮助用户更方便地获取开源软件。本镜像站由重庆大学蓝盟负责维护。http://mirrors.cqu.edu.cn/
2.ChatGPTClaude国内中文版镜像网站整理合集(2025年版)Claude镜像站 :clade.top 提供了与官网相同或几乎相同的内容,包括Claude 3、Claude 2以及chatgpt3.5等大模型,支持文本和语言处理、图片和文档上传、多文档对话、逻辑推理等功能。 镜像站的优势在于可直接访问,提供与官网一致的对话服务。 国内的ChatGPT和Claude中文版镜像网站为用户提供了便捷的访问途径,尤其适合那些无https://www.bilibili.com/opus/1012097936524312585
3.zlibrary网址入口,最新镜像地址及国内可用官网网站(持续更新)zlibrary电脑客户端/安卓App zlibrary(windows/mac/安卓/ipad)安装包下载:https://pan.quark.cn/s/45d1c03ef62b(随时失效,先保存) 客户端每天可以下载20本电子书,比网页版多10本,防止丢失或失效,先转存。无需魔法就能正常使用,比镜像站稳定。 https://www.cnblogs.com/zlibrary-zlib/articles/18588675
4.Z本站实时自动检测并更新Z-Library镜像的可用网址链接,由于网络及国家(学校)的限制,不一定所有网址都能在您所在的位置访问。通常情况下,一半以上是有效的 本页面收集Z-Library镜像的新替代域…https://www.appmiu.com/15438.html
5.ZLibraryPro助手可以检测Zlibrary 最新可用地址镜像的在线工具https://openi.cn/sites/3147.html
6.PirateLibraryMirror盗版图书馆镜像项目放出31TB数据–书伴一个名为 Pirate Library Mirror 的盗版图书馆镜像项目最近释出了更多电子书资源,加上之前(2022 年 7 月 1 日)放出的 7T 资源,电子书总数量达 22,433,982 本,文件总大小达 31TB。 Pirate Library Mirror 是一个匿名的盗版图书馆镜像项目,声称项目的目标是致力于保存和解放人类知识。其团队博客 Anna’s https://bookfere.com/post/1018.html
7.Docker最新超详细版教程通俗易懂(基础版)docker镜像就好比是一个目标,可以通过这个目标来创建容器服务,tomcat镜像==>run==>容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行就是在容器中的)。 容器(container): Docker利用容器技术,独立运行一个或者一组应用,通过镜像来创建的. https://blog.csdn.net/qq_38140292/article/details/123256877
8.LibraryGenesis图书馆创世纪中文(中国)Library Genesis 的“替代”下载屏幕 在这里,您可以单击镜像 1-5(请注意,尽管名称不同,但 URL 与镜像指南中的相同)。还有一些 torrent 链接,但它们似乎效果不太好。 该过程与下面相同 – 只是要经过另一个屏幕。 步骤5从镜像下载(2024年4月更新) https://www.librarygenesis.net/
9.记住这58条Allegro使用技巧,秒变大神!29. Z_COPY命令在shape symbol和flash symbol格式中不能使用: 在setup>drawing size>type去变换工作平臺2)如何镜像摆放到底层? 方法一:先在option选mirror,在选器件; 方法二:先选器件,然后右键 –> mirror4)添加信号仿真模型库:Analyze –> SI/EMI Sim –> Library 添加模型库 –> Add existing librarhttps://www.eet-china.com/mp/a12446.html
10.OpenHarmony3.2Beta5更新一览ScenSmart一站式智能制造平台从镜像站点获取 表2 获取源码路径 版本源码版本信息下载站点SHA256校验码软件包容量 全量代码(标准、轻I683Z1 【新增功能】ArkUI适配根据资源名称获取资源 I68DBH 【基础能力】提供多级菜单和分组菜单能力 文件管理 文件管理 本示例主要展示了文件管理相关的功能,使用mediaLibrary、userFileManager、fileio等接口https://www.scensmart.com/?p=10176
11.7Packing / unpacking: 7z, XZ, BZIP2, GZIP, TAR, ZIP and WIM Unpacking only: APFS, AR, ARJ, CAB, CHM, CPIO, CramFS, DMG, EXT, FAT, GPT, HFS, IHEX, ISO, LZH, LZMA, MBR, MSI, NSIS, NTFS, QCOW2, RAR, RPM, SquashFS, UDF, UEFI, VDI, VHD, VHDX, VMDK, XAR and Z. http://www.7-zip.org/
12.Allegro操作说明中文文档.docx3、定义routekeepin区域(可使用Z-copy操作)4、定义packagekeepin区域5、添加定位孔28、Allegro定义层叠4、添加信号仿真模型库:Analyze–>SI/EMISim–>Library添加模型库–>Addexistinglibrary–>locallibraryhttps://m.renrendoc.com/paper/268347658.html
13.civitai镜像站镜像站原理mob64ca13fae001的技术博客拉取镜像(保证本地没有该镜像): [root@server1 docker]# docker pull nginx Using default tag: latest latest: Pulling from library/nginx fc7181108d40: Pull complete d2e987ca2267: Pull complete 0b760b431b11: Pull complete Digest: sha256:48cbeee0cb0a3b5e885e36222f969e0a2f41819a68e07aeb6631cahttps://blog.51cto.com/u_16213594/10973810
14.跟曉龍學Linux–LearningLinux大部分的 Mac apps 都是镜像文件(后缀为.dmg ),这些软件大部分都需要安装过才能使用,以前使用过 Linux 的用户对此不会感到陌生。从网上下载一个软件镜像,然后双击,安装界面就会弹出来了。 还有部分的 Mac Apps,只需要把软件的图标拖到 Applications 目录下就算完成安装了。删除也很简单,把图标拖到垃圾桶里就好了https://xlongh.wordpress.com/
15.教程教你用服务器一键搭建谷歌镜像站–爱玩吧cuber在github分享了他的谷歌镜像73站搭建代码,使镜像73站点搭建非常简单。如果你部署了镜像站,可以提交这里70来分享给更多人。 代码:https://github.com/cuber/ngx_http_google_filter_module258 Nginx Google 扩展 扯两句 很多朋友通过各种方式问过我: “你丫怎么不开源啊…” https://www.aiwanba.net/post/3151.html
16.Docker超详细讲解镜像操作dockerdocker.io/library/ubuntu:16.04 如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址,例如: 1 $ docker pull hub.c.163.com/public/ubuntu:16.04 另外,有时需要使用镜像代理服务来加速Docker 镜像获取 过程 ,在前面《Docker安装及加速》一文中已经讲述。 3. 查看镜像信息 使用docker images或docker imaghttps://www.jb51.net/article/258984.htm
17.ebscoazEBSCO is the leading provider of research databases, e-journals, magazine subscriptions, ebooks and discovery service for academic libraries, public libraries, corporations, schools, government and medical institutionshttps://www.ebsco.com/
18.“照片”的搜索结果–Mac玩儿法然后我每周都会定时在周末找个时间把 Photo Library 里的重复图片找出来,因为我的 iPhone 和 iCloud 看到了腾讯云的技术文档提到了对站内图片的 WebP 转化,毕竟全部 CDN 化已经是一个基础工作,剩下的优化并且在下方提供了截屏保存到本地/系统剪贴板、屏幕镜像的功能。右侧就是待管理项目列表,可以对 iPhonehttps://www.waerfa.com/search/%E7%85%A7%E7%89%87/feed/rss2/
19.Docker入门Hub官方仓库使用及搭建本地私有仓库(CentOS7)登录容器镜像服务控制台(需要注册账号):https://cr.console.aliyun.com/?spm=a2c4g.11186623.2.15.19e611beo3Fhq5,在左侧的镜像中心->镜像加速器页面会显示为您独立分配的加速地址: https://z6pn1lmd.mirror.aliyuncs.com CentOS 7系统配置方式: 1)将默认的配置文件(/lib/systemd/system/docker.service)复制到http://cdn.modb.pro/db/443202
20.Docker入门Hub官方仓库使用及搭建本地私有仓库(CentOS7)登录容器镜像服务控制台(需要注册账号):https://cr.console.aliyun.com/?spm=a2c4g.11186623.2.15.19e611beo3Fhq5,在左侧的镜像中心->镜像加速器页面会显示为您独立分配的加速地址: https://z6pn1lmd.mirror.aliyuncs.com CentOS 7系统配置方式: 1)将默认的配置文件(/lib/systemd/system/docker.service)复制到https://www.ucloud.cn/yun/129382.html
21.欢迎访问网易开源镜像站镜像名上次更新时间使用帮助 archlinux/2024-12-22 01:45archlinux使用帮助 archlinux-cn/2024-12-21 11:51archlinux-cn使用帮助 archlinuxarm/2024-12-22 02:03- centos/2024-12-22 00:14centos使用帮助 centos-vault/2024-12-17 19:52- ceph/2024-12-21 18:18ceph使用帮助 http://mirrors.163.com/
22.设计之镜–消隐的实验,上海/上海交通大学设计学院奥默默工作先锋事务所◎Nilcraftz塑形乌托邦:◎QZY:Model Masters◎RAC·深耕建筑+交互留学◎一卜川施工图深化镜面上三角形的“裂口”是大会时尚馆的入口, 三角的内部利用不同角度的小三角镜面塑造空间的镜像折叠,充满了力量感,白色的材质纯净整洁,悬挑12米的楼梯直插云霄,人登顶的那一刻仿佛能够感受到站在云端之https://www.gooood.cn/the-mirror-of-design-an-experiment-about-disappearance-by-oumoumou-studio.htm
23.GitHub上超赞的Linux软件合集SD分享导航站SD分享导航站它在一个包里集成了 Percona Server 和 Percona XtraBackup,带 Codership Galera library of MySQL Clonezilla –Clonezilla 是一款分区以及磁盘镜像/克隆程序,类似 True Image? 或 Norton Ghost?。 本站所有素材均来自网络或用户分享,版权归属原作者,如果侵犯了您的版权,就随时联系我们的客服(邮箱:https://home.designshidai.com/8454.html
24.LibraryGenesisGuide我经常更新这个指南,并定期测试所有链接和镜像,以确保您总是可以访问这个资源。当然,如果您有任何问题或问题-与我联系在这里。 How to download books from Library Genesis and libgen: 如何从图书馆创世纪和 libgen 下载图书: Step 1 第一步 Goto the Library Genesis website 去图书馆创世纪网站 https://www.douban.com/note/797027905/
25.>第4章管理OracleSolarisZFS存储池有关创建镜像存储池的信息,请参见创建镜像存储池。 RAID-Z 存储池配置 除镜像存储池配置外,ZFS 还提供具有单/双/三奇偶校验容错性的 RAID-Z 配置。单奇偶校验 RAID-Z (raidz或raidz1) 与 RAID-5 类似。双奇偶校验 RAID-Z (raidz2) 与 RAID-6 类似。 https://docs.oracle.com/cd/E19253-01/819-7065/6n91mt18p/index.html
26.MavenCentralOfficial search by the maintainers of Maven Central Repository.https://search.maven.org/
27.theinternetarchive七色猫视频Please add this domain to one of your websites. Whoops, looks like this domain isn't yet set up correctly. If you're the site owner, please check your site management tools to verify your domain settings.http://archive.org/
28.[译]如何成为“海盗”存档者?–同和故事匯提示:本文“收藏collect(~ion)”“存档archive”“镜像mirror”含义相似,且均可作动词和名词。 注:「Pirate Library Mirror」 是一个匿名盗版图书馆镜像项目,声称致力于人类知识的保存和解放,即长期保存。该项目镜像的第一个图书馆是 Z-library,2022年7月1日首次发布 7T 的电子书资源,9月25日再次发布 24TB 数https://hocassian.cn/archives/reprint/10895/
29.best它为每台安卓手机都配备了线路规划和驾驶导航,完全的交通网络覆盖,查看驾驶时间,搜寻附近加油站,它甚至Foobar2000 is minimal and customizable, MediaMonkey is an library-organizing monster, and Winamp 感谢 seyaki, 黄飘逸@Zhxstud, mikelong, zhexen, 天毅, myparamita, baggio1987 翻译为中文。感谢https://xbeta.info/tag/best-list/feed
30.centso7简单方便安装安装ansible–蓝队云(采用国内镜像) Windows远程桌面(mstsc)不能复制粘贴的解决办法 Memcached介绍和详解 linux重启mysql失败ctrl+z挂起的进程恢复与杀死 如何查看云服务器的mac地址 Linux使用tcpdump命令抓包并使用wireshark分析 控制权限 单网卡多 IP 怎么指定出站 IP [Docker] 错误之“docker build“ requires exactly 1 https://www.landui.com/docs-7929
31.Ubuntu桌面操作系统综合贴镜像站一般同时提供了各个版本的BT下载种子,大家自由选择下载方式。下载完成后最好校验一下哈希值,镜像站的目录里都有相应的文本文件标明了各文件的校验值。 小知识: 1)32位windows操作系统只能支持最多3G的内存,但是Linux32位系统对内存的支持无此限制,完美支持大内存。这是Linux内核的一点小优势(为什么说是小优势http://it.en369.cn/jiaocheng/1729037710a928503.html