17_Linux根文件简介与Busybox构建文件系统

news2024/11/26 16:36:38

目录

根文件系统简介

文件目录简介

BusyBox简介

编译BusyBox构建根文件系统

修改Makefile添加编译器

busybox中文字符支持

配置 busybox

编译busybox

向根文件系统添加lib库

向rootfs的“usr/lib”目录添加库文件

创建其他文件夹

根文件系统初步测试


根文件系统简介

根文件系统一般也叫做rootfs,那么什么叫根文件系统?看到“文件系统”这四个字,很多人,包括我第一反应就是FATFS、FAT、EXT4、YAFFS和NTFS等这样的文件系统。在这里,根文件系统并不是FATFS这样的文件系统代码, EXT4这样的文件系统代码属于Linux内核的一部分。Linux中的根文件系统更像是一个文件夹或者叫做目录(在我看来就是一个文件夹,只不过是特殊的文件夹),在这个目录里面会有很多的子目录。根目录下和子目录中会有很多的文件,这些文件是Linux运行所必须的,比如库、常用的软件和命令、设备文件、配置文件等等。以后我们说到文件系统,如果不特别指明,统一表示根文件系统。对于根文件系统专业的解释,百度百科上是这么说的:

根文件系统首先是内核启动时所mount(挂载)的第一个文件系统,内核代码映像文件保存在根文件系统中,而系统引导启动程序会在根文件系统挂载之后从中把一些基本的初始化脚本和服务等加载到内存中去运行。

百度百科上说内核代码镜像文件保存在根文件系统中,但是我们嵌入式Linux并没有将内核代码镜像保存在根文件系统中,而是保存到了其他地方。比如NAND Flash的指定存储地址、EMMC专用分区中。根文件系统是Linux内核启动以后挂载(mount)的第一个文件系统,然后从根文件系统中读取初始化脚本,比如reS, inittab等。根文件系统和Linux内核是分开的,单独的Linux内核是没法正常工作的,必须要搭配根文件系统。如果不提供根文件系统,Linux内核在启动的时候就会提示内核崩溃(Kemel panic)的提示。

根文件系统的这个“根”字就说明了这个文件系统的重要性,它是其他文件系统的根,没有这个“根”,其他的文件系统或者软件就别想工作。比如我们常用的Is、mv、ifconfig等命令其实就是一个个小软件,只是这些软件没有图形界面,而且需要输入命令来运行。这些小软件就保存在根文件系统中,这些小软件是怎么来的呢?这个根文件系统是满足Linux运行的最小根文件系统,后续我们可以根据自己的实际工作需求不断的去填充这个最小根文件系统,最终使其成为一个相对完善的根文件系统。

在构建根文件系统之前,我们先来看一下根文件系统里面大概都有些什么内容,以Ubuntu为例,根文件系统的目录名字为"/',没看错就是一个斜杠,所以输入如下命令就可以进入根目录中

进入根目录以后输入"Is”命令查看根目录下的内容都有哪些,结果如图所示:

 图中根目录下子目录和文件不少,但是这些都是Ubuntu所需要的,其中有很多子目录和文件我们嵌入式Linux是用不到的,所以这里就讲解一些常用的子目录:

文件目录简介

1.bin目录

看到“bin”大家应该能想到bin文件,bin文件就是可执行文件。所以此目录下存放着系统需要的可执行文件,一般都是一些命令,比如Is、mv等命令。此目录下的命令所有的客户都可以使用。

2.dev目录

dev是device的缩写,所以此目录下的文件都是和设备有关的,此目录下的文件都是设备文件。在Linux下一切皆文件,即使是硬件设备,也是以文件的形式存在的,比如/dev/ttymxc0(I.MX6ULL根目录会有此文件)就表示I.MX6ULL的串口0,我们要想通过串口0发送或者接收数据就要操作文件/dev/ttymxc0,通过对文件/dev/ttymxc0的读写操作来实现串口0的数据收发。

3.etc目录

此目录下存放着各种配置文件,大家可以进入Ubuntu的etc目录看一下,里面的配置文件非常多!但是在嵌入式Linux下此目录会很简洁。

4.lib目录

lib是library的简称,也就是库的意思,因此此目录下存放着Linux所必须的库文件。这些库文件是共享库,命令和用户编写的应用程序要使用这些库文件。

5.mnt目录

临时挂载目录,一般是空目录,可以在此目录下创建空的子目录,比如/mnt/sd、/mnt/usb,这样就可以将SD卡或者U盘挂载到/mnt/sd或者/mnt/usb目录中。

6.proc目录

此目录一般是空的,当Linux系统启动以后会将此目录作为proc文件系统的挂载点, proc是个虚拟文件系统,没有实际的存储设备。proc里面的文件都是临时存在的,一般用来存储系统运行信息文件。

7.usr目录

要注意,usr不是user的缩写而是Unix Software Resource的缩写,也就是Unix操作系统软件资源目录。这里有个小知识点,那就是Linux一般被称为类Unix操作系统,苹果的MacOS也是类Unix操作系统。关于Linux和Unix操作系统的渊源大家可以直接在网上找Linux的发展历史来看。既然是软件资源目录,因此/usr目录下也存放着很多软件,一般系统安装完成以后此目录占用的空间最多。

8.var目录

此目录存放一些可以改变的数据。

9.sbin目录

此目录页用户存放一些可执行文件,但是此目录下的文件或者说命令只有管理员才能使用,主要用户系统管理。

10.sys目录

系统启动以后此目录作为sysfs文件系统的挂载点, sysfs是一个类似于proc文件系统的特殊文件系统, sysfs也是基于ram的文件系统,也就是说它也没有实际的存储设备。此目录是系统设备管理的重要目录,此目录通过一定的组织结构向用户提供详细的内核数据结构信息。系统启动以后此目录作为sysfs文件系统的挂载点, sysfs是一个类似于proc文件系统的特殊文件系统, sysfs也是基于ram的文件系统,也就是说它也没有实际的存储设备。此目录是系统设备管理的重要目录,此目录通过一定的组织结构向用户提供详细的内核数据结构信息。

11.opt目录

可选的文件、软件存放区,由用户选择将哪些文件或软件放到此目录中。关于Linux的根目录就介绍到这里,接下来的构建根文件系统就是研究如何创建上面这些子目录以及子目录中的文件。

BusyBox简介

根文件系统里面就是一堆的可执行文件和其他文件组成的?难道我们得一他们负责“收集”这些文件,然后将其打包,像我们这样的开发者可以直接拿来用。答案是有个一个的从网上去下载这些文件?显然这是不现实的!那么有没有人或者组织专门干这个事呢?,它就叫做BusyBox!其名字分为"Busy”和"Box”,也就是忙碌的盒子。盒子是用来放东西的,忙碌的是因为它要提供根文件系统所需的文件,所以忙碌。BusyBox是一个集成了大量的Linux命令和工具的软件,像ls、mv、ifconfig等命令BusyBox都会提供。BusyBox就是一个大的工具箱,这个工具箱里面集成了Linux的许多工具和命令。一般下载BusyBox的源码,然后配置BusyBox,选择自己想要的功能,最后编译即可。

BusyBox可以在其官网下载到,官网地址为: https://busybox.net/,官网比较简陋,如图所示:

在官网左侧的"Get BusyBox”栏有一行"Download Source",点击"Download Source"即可打开BusyBox的下载页如图所示:

 

编译BusyBox构建根文件系统

一般我们在Linux驱动开发的时候都是通过nfs挂载根文件系统的,当产品最终上市开卖的时候才会将根文件系统烧写到EMMC或者NAND中。所以要设置的nfs服务器目录中创建一个名为rootfs的子目录(名字大家可以随意起,为了方便就用了rootfs),比如我的电脑中"/home/zuozhongkai/linux/nfs"就是我设置的NFS服务器目录,使用如下命令创建名为 rootfs的子目录:

 创建好的rootfs子目录就用来存放我们的根文件系统了。

将busybox-1.29.0.tar.bz2发送到Ubuntu中,存放位置大家随便选择。然后使用如下命令将其解压:

 解压完成以后进入到busybox-1.29.0目录中,此目录中的文件和文件夹如图所示:

 

修改Makefile添加编译器

同UbootLinux移植一样,打开busybox的顶层Makefile,添加ARCH和CROSS_COMPILE的值,如下所示:

 在示例代码中CORSS_COMPILE使用了绝对路径!主要是为了防止编译出错。

busybox中文字符支持

如果默认直接编译busybox的话,在使用SecureCRT的时候中文字符是显示不正常的,中文字符会显示为“?”,比如你的中文目录,中文文件都显示为“?”。不知道从哪个版本开始busybox中的shell命令对中文输入即显示做了限制,即使内核支持中文但在shell下也依然无法正确显示。

所以我们需要修改busybox源码,取消busybox对中文显示的限制,打开文件busybox1.29.0/libbb/printable string.c,找到函数printable string,缩减后的函数内容如下:

 第31和32行,当字符大于0X7F以后就跳出去了。

第45和46行,如果支持UNICODE码的话,当字符大于0X7F就直接输出‘?'。

所以我们需要对这4行代码进行修改,修改以后如下所示:

 示例代码38.2.2.3中红色部分的代码就是被修改以后的,主要就是禁止字符大于0X7F以后break和输出‘?’。

接着打开文件busybox-1.29.0/libbb/unicode.c,找到如下内容:

 第1022行,当字符大于0X7F以后, *d++就为‘?’。

第1030和1031行,当字符大于0X7F 以后,*d也为‘?’。

修改示例代码38.2.2.4,修改后内容如下所示:

 示例代码38.2.2.5中红色部分的代码就是被修改以后的,同样主要是禁止字符大于0X7F 的时候设置为"?'。busybox中文字符支持跟代码修改有关的就改好了,最后还需要配置busybox来使能unicode码,这个稍后我们配置busybox的时候在设置。

配置 busybox

根我们编译Uboot、Linux kernel一样,我们要先对busybox进行默认的配置,有以下几种配置选项:

1.defconfig,缺省配置,也就是默认配置选项。

2.allyesconfig,全选配置,也就是选中busybox的所有功能。

3.allnoconfig,最小配置。

我们一般使用默认配置即可,因此使用如下命令先使用默认配置来配置一下busybox:

busybox也支持图形化配置,通过图形化配置我们可以进一步选择自己想要的功能,输入如下命令打开图形化配置界面: 

 打开以后如图所示:

 配置路径如下:

 选项"Build static binary (no shared libs)”用来决定是静态编译busybox还是动态编译,静态编译的话就不需要库文件,但是编译出来的库会很大。动态编译的话要求根文件系统中有库文件,但是编译出来的 busybox 会小很多。这里我们不能采用静态编译!因为采用静态编译的话DNS会出问题!无法进行域名解析,配置如图所示:

 继续配置如下路径配置项:

 结果如图所示:

 继续配置如下路径配置项:

 默认会选中“Simplified modutils”,这里我们要取消勾选!!结果如图所示:

 继续配置如下路径配置项:

 最后就是使能busybox的unicode编码以支持中文,配置路径如下:

 busybox的配置就到此结束了,大家也可以根据自己的实际需求选择配置其他的选项,不过对于初学者笔者不建议再做其他的修改,可能会出现编译出错的情况发生。

编译busybox

配置好busybox以后就可以编译了,我们可以指定编译结果的存放目录,我们肯定要将编译结果存放到前面创建的rootfs目录中,输入如下命令:

 COFIG_PREFIX指定编译结果的存放目录,比如我存放到

"/home/zuozhongkai/linux/nfs/rootfs”目录中,等待编译完成。编译完成以后如图所示:

 编译完成以后会在busybox的所有工具和文件就会被安装到rootfs目录中, rootfs目录内容如图所示:

 从图可以看出,rootfs目录下有bin、sbin和usr这三个目录,以及linuxrc这个文件。前面说过Linux内核init进程最后会查找用户空间的init程序,找到以后就会运行这个用户空间的init程序,从而切换到用户态。如果bootargs设置init=/linuxrc,那么linuxrc就是可以作为用户空间的init程序,所以用户态空间的init程序是busybox来生成的。

busybox的工作就完成了,但是此时的根文件系统还不能使用,还需要一些其他的文件,我们继续来完善rootfs。

向根文件系统添加lib库

向rootfs的“/lib”目录添加库文件

Linux中的应用程序一般都是需要动态库的,当然你也可以编译成静态的,但是静态的可执行文件会很大。如果编译为动态的话就需要动态库,所以我们需要向根文件系统中添加动态库。在rootfs中创建一个名为“lib”的文件夹.命令如下:

 

lib文件夹创建好了,库文件从哪里来呢? lib 库文件从交叉编译器中获取,前面我们搭建交叉编译环境的时候将交叉编译器存放到了"/usr/local/arm/”目录中。交叉编译器里面有很多的库文件,这些库文件具体是做什么的我们作为初学者肯定不知道,既然我不知道那就简单粗暴的把所有的库文件都放到我们的根文件系统中。这样做出来的根文件系统肯定很大,但是我们现在是学习阶段,还做不了裁剪。

进入如下路径对应的目录:

 此目录下有很多的*so*(*是通配符)和.a文件,这些就是库文件,将此目录下所有的*so*和.a文件都拷贝到 rootfs/lib 目录中,拷贝命令如下:

 后面的“-d”表示拷贝符号链接,这里有个比较特殊的库文件: ld-linux-armhf.so.3,此

库文件也是个符号链接,相当于Windows下的快捷方式。会链接到库 ld-2.19-2014.08-1-git.so上,输入命令"Is ld-linux-armhf.so.3-1”查看此文件详细信息,如图所示:

 从图可以看出,Id-linux-armhf.so.3后面有个“->”,表示其是个软连接文件,链接到文件 ld-2.19-2014.08-1-git.so,因为其是一个“快捷方式”,因此大小只有24B。但是, Id-linuxarmhf.so.3不能作为符号链接,否则的话在根文件系统中执行程序无法执行!所以我们需要ld-linux-armhf.so.3完成逆袭,由“快捷方式”变为“本尊”,方法很简单,那就是重新复制ld-linuxarmhf.so.3,只是不复制软链接即可,先将rootfs/lib中的Id-linux-armhfso.3文件删除掉,命令如下:

 

然后重新进入到

/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/armlinux-gnueabihf/libc/lib目录中,重新拷贝ld-linux-armhf.so.3,命令如下:

 拷贝完成以后再到rootfs/lib目录下查看ld-linux-armhf.so.3文件详细信息,如图所示:

 从图可以看出,此时Id-linux-armhf.so.3已经不是软连接了,而是实实在在的一个继续进入如下目录中:库文件,而且文件大小为724392B。

继续进入如下目录中:

 此目录下也有很多的的*so*和.a 库文件,我们将其也拷贝到rootfs/lib目录中,命令如下:

 rootfs/lib目录的库文件就这些了,完成以后的rootfs/lib目录如图所示:

 

向rootfs的“usr/lib”目录添加库文件

目录下:在rootfs的usr目录下创建一个名为lib的目录,将如下目录中的库文件拷贝到rootfs/usr/lib目录下:

 将此目录下的so和.a库文件都拷贝到rootfs/usr/lib目录中,命令如下:

 完成以后的rootfs/usr/lib目录如图所示:

 至此,根文件系统的库文件就全部添加好了,可以使用"du”命令来查看一下rootfs/lib和rootfs/usr/lib这两个目录的大小,命令如下:

 可以看出lib和usr/lib这两个文件的大小分别为57MB和67MB,加起来就是57+67=124MB

创建其他文件夹

在根文件系统中创建其他文件夹,如dev、proc、mnt、sys、tmp和root等,创建完成以后如图所示:

 目前来看,这个根文件系统好像已经准备好了,究竟有没有准备好,直接测一下就知道了!

根文件系统初步测试

接下来我们使用测试一下前面创建好的根文件系统 rootfs,测试方法就是使用NFS挂载,uboot里面的bootargs环境变量会设置“root”的值,所以我们将root的值改为NFS挂载即可。Linux内核源码里面有相应的文档讲解如何设置,文档为

Documentation/filesystems/nfsnfsroot.txt,格式如下:

 <server-ip>:服务器IP地址,也就是存放根文件系统主机的IP地址,那就是Ubuntu的IP地址,比如我的Ubuntu主机IP地址为192.168.1.250。

<root-dir>:根文件系统的存放路径,比如我的就是/home/zuozhongkai/linux/nfs/rootfs.

<nfs-options>:NFS的其他可选选项,一般不设置。

<client-ip>:客户端IP地址,也就是我们开发板的IP地址,Linux内核启动以后就会使用此IP地址来配置开发板。此地址一定要和Ubuntu主机在同一个网段内,并且没有被其他的设备使用,在Ubuntu中使用ping命令ping一下就知道要设置的IP地址有没有被使用,如果不能ping通就说明没有被使用,那么就可以设置为开发板的IP地址,比如我就可以设置为192.168.1.251。

<server-ip>:服务器IP地址,前面已经说了。

<gw-ip>:网关地址,我的就是 192.168.1.1。

<netmask>:子网掩码,我的就是255.255.255.0。

<hostname>:客户机的名字,一般不设置,此值可以空着。

<device>:设备名,也就是网卡名,一般是eth0, eth1....,正点原子的I.MX6U-ALPHA开发板的 ENET2为eth0,ENET1为 eth1。如果你的电脑只有一个网卡,那么基本只能是eth0。这里我们使用ENET2,所以网卡名就是eth0。

<autocont>:自动配置,一般不使用,所以设置为off。

<dns0-ip>: DNS0服务器IP地址,不使用。

<dns1-ip>: DNS1服务器IP地址,不使用。

根据上面的格式bootargs环境变量的root值如下:

 "proto=tcp”表示使用TCP协议,"rw”表示nfs挂载的根文件系统为可读可写。启动开发板,进入uboot命令行模式,然后重新设置bootargs环境变量,命令如下:

 设置好以后使用"boot”命令启动Linux内核,结果如图所示:

 从图可以看出,我们进入了根文件系统,说明我们的根文件系统工作了!如果没有启动进入根文件系统的话可以重启一次开发板试试。可以输入“ls”命令测试一下,结果如图所示:

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity制作二次元卡通渲染角色材质——3、高光反射与ILM贴图

Unity制作二次元材质角色 回到目录 大家好&#xff0c;我是阿赵。 这里继续来讲二次元角色的材质。上次讲了光影的色阶化问题&#xff0c;这次继续讲光照模型效果的问题。 之前我们说过&#xff0c;光照模型的最后效果是&#xff1a; 环境色漫反射高光反射。 这里我们可以先忽略…

【嵌入式系统】思考题复习

嵌入式系统思考题 0. 名词解释1. 嵌入式系统概述2. ARM处理器体系结构3. ARM指令集4. S5PV210微处理器与接口5. ARM-Linux内核6. 嵌入式Linux文件系统7. 嵌入式Linux系统移植及调试8. 设备驱动程序设计9. QT图形界面应用程序开发基础10. SQLite数据库11. 嵌入式系统的开发设计案…

Qt6.5.1LTS搭建Android开发环境填坑

Qt6第二个LTS出来了&#xff0c;周日找时间安装并测试了Qt6.5LTS&#xff0c;安装我是按我之前的一个博客记录来做的&#xff0c;用的是国内境像&#xff0c;顺利快速安装完成&#xff0c;下面是设置的过程关键总结。 一、Devices Android设备(Device)选择 二、Kits &#xf…

网络安全-XSS的原理、攻击及防御

简介 跨站脚本攻击(全称Cross Site Scripting,为和CSS&#xff08;层叠样式表&#xff09;区分&#xff0c;简称为XSS)是指恶意攻击者在Web页面中插入恶意javascript代码&#xff08;也可能包含html代码&#xff09;&#xff0c;当用户浏览网页之时&#xff0c;嵌入其中Web里面…

【C++开发】Qt+Tesseract实现文字识别的各种坑(已解决)

文章目录 Tesseract库下载Qt版本选择安装步骤 VS2017安装MSVC调试器安装构建套件的导入文字识别功能的检测 最近在给之前Qt医疗管理系统项目添加一个文字识别功能&#xff0c;但是在其中遇到非常多坑&#xff0c;花费了我比较多的时间&#xff08;查阅了很多文章&#xff09;&a…

基础学习——关于list、numpy、torch在float和int等数据类型转换方面的总结

系列文章目录 Numpy学习——创建数组及常规操作&#xff08;数组创建、切片、维度变换、索引、筛选、判断、广播&#xff09; Tensor学习——创建张量及常规操作&#xff08;创建、切片、索引、转换、维度变换、拼接&#xff09; 基础学习——numpy与tensor张量的转换 基础学习…

【软件测试】一个完整的项目流程是什么样的?

软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前&#xff0c;要经过一系列的严格测试&#xff0c;才能保证交付质量。 一、引言 1.编写目的 本文档…

2023年度第四届全国大学生算法设计与编程挑战赛(春季赛)

目录 2023年度第四届全国大学生算法设计与编程挑战赛&#xff08;春季赛&#xff09;1、A2、Bx3、Cut4、Diff5、EchoN6、Farmer7、GcdGame8、HouseSub9、IMissYou!10、Jargonless 2023年度第四届全国大学生算法设计与编程挑战赛&#xff08;春季赛&#xff09; 1、A 题目描述…

【C++初阶】C/C++内存管理(没有对象的都进来看看吧~)

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…

2023 华为 Datacom-HCIE 真题题库 08/12--含解析

单项选择 1.[试题编号&#xff1a;190385] &#xff08;单选题&#xff09;以下关于BGP/MPLSIPVPN路由交互的描述&#xff0c;错误的是哪一项? A、PE与CE之间交互的是IPv4路由信息 B、出口PE可以通过BGP、IGP或静态路由的方式向远端CE发送IPv4路由 C、入口PE将从CE接收到的I…

ODOO随笔(二)—— Odoo16的主题样式变更

1 登陆界面的修改 系统默认的登陆界面&#xff0c;有更改odoo logo和去除“管理数据库”、“由Odoo提供支持”两个需求。 &#xff08;1&#xff09;更改odoo logo 系统管理员登陆后&#xff0c;选择菜单栏&#xff1a;设置——公司——管理公司 点击相机图标&#xff0c;上传…

Round#13 web专项部分wp

flask?jwt? 忘记密码处有secretkey 然后就是伪造session了,这里猜一下要什么 最后应该是_is_admin有用,我没细看,当时平台卡麻了 指正:改_user_id为1 ez_factors 注意到可以拼接命令,但是执行的回显只有数字 那么可以考虑读取后用od命令来转8进制读取 flask?jwt?(hard) …

2023.5.30 深信服 c++ 一面

深信服&#xff0c;c一面小记 导语面试内容重点问题解析弱引用弱在哪里&#xff1f;手撕memcpy水壶倒水问题 导语 最近开始面试&#xff0c;记录一下面试经历。   应该是会给我发感谢信的吧~我也是真的菜。工作的原因其实也没时间准备&#xff0c;最近工作还是挺忙的。另外一…

【云原生docker】

容器化越来越受欢迎&#xff0c;因为容器是&#xff1a; ●灵活&#xff1a;即使是最复杂的应用也可以集装箱化。 ●轻量级&#xff1a;容器利用并共享主机内核。 ●可互换&#xff1a;可以即时部署更新和升级。 ●便携式&#xff1a;可以在本地构建&#xff0c;部署到云&#…

LVGL学习(2):图片的转换和显示

我们在设计UI的过程中可能需要显示一些图片&#xff0c;本篇文章将介绍如何转换并显示一个固定的图片到lv_img中。 文章目录 1 图片转换1.1 GUI Guider1.2 在线转换 2 图片的显示 1 图片转换 和之前我写的一篇字体转换的文章一样&#xff1a;LVGL学习(1)&#xff1a;中文字体…

基于牛顿拉夫逊的配电网潮流计算研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

C++语法(23)-- 模拟实现unordered_set和unordered_map

C语法&#xff08;22&#xff09;---- 哈希表的闭散列和开散列_哈里沃克的博客-CSDN博客https://blog.csdn.net/m0_63488627/article/details/130436178?spm1001.2014.3001.5501 1.重写HashTable 由于此时我们的实现与map跟set差不多&#xff0c;所以需要进行调整 1.重写节点…

html5前端学习

HTML5基本骨架 html标签 定义HTML文档&#xff0c;浏览器看到后就明白这个是HTML文档&#xff0c;所以其他元素要包裹在它里面&#xff0c;标签限定了文档的开始点和结束点。 <!DOCTYPE html> <html> </html> head标签 head标签用于定义文档的头部&…

实验篇(7.2) 05. 通过浏览器访问远端内网服务器 (SSL) ❀ 远程访问

【简介】直接将内网服务器映射成公网IP&#xff0c;可以方便的从任何地方访问服务器的指定端口&#xff0c;但是这种方式下&#xff0c;服务器是公开且暴露的。那有没有即方便、又比较安全的远程访问服务器的方法呢&#xff1f;我们来看看SSL VPN的Web模式。 SSL VPN介绍 从概念…

波司登云原生微服务治理探索

作者&#xff1a;曾孟琪&#xff08;山猎&#xff09; 背景 波司登创始于1976年&#xff0c;专注于羽绒服的研发、设计、制作&#xff0c;是全球知名的羽绒服生产商。波司登用一系列世人瞩目的辉煌成绩证明了自己的实力&#xff1a;连续26年全国销量领先&#xff0c;连续22年…