服务器持续集成部署中遇到的各种问题
静态编译解决Ubuntu18.04下node20.17.0的Glibc版本问题起因是我想要为俱乐部的官网项目仓库构建CI/CD工作流,以便于在每次有新的提交时自动执行构建检查并部署到服务器上,但是在实际操作中遇到了各种各样的问题,这里记录一下。
首先是,GitHub Actions 现在要求工作流的node环境版本会强制跑在 node20 版本之上,本来这样没有什么问题,用nvm一套安装就行了,但是问题就在于我们服务器的 Ubuntu 系统版本是18.04,如果直接 use 20.17.0的话,动态库Glibc版本不匹配,因为18.04的Glibc版本是2.27,而20.17.0的Glibc版本要求是2.28,所以这个问题就很尴尬了。众所周知,Glibc是一个系统级别的库,大部分的Linux发行版直接升级 Glibc 都会导致系统不稳定,而另一方面,服务器刚刚重装过系统,如果硬要升级系统到20.04,又要考虑机器的性能,时间成本等问题,所以只能从 node 入手。
而一般来说,安装node有四种方式:
最简单粗暴的就是通过包管理器直接安装:1sudo apt install node ...
【DragonOS】chown系统调用
需要注意的地方UserBufferReader需要使用UserbufferReader对来自用户态的指针进行校验,然后通过UserBufferReader进行读操作,否则不安全。
在验证地址安全性之前,不允许访问用户内存。应该是userbuffer的功能你还没理解。如果不校验的话,要是用户传一个内核地址进来,那就会造成系统崩溃之类的问题了。
userbuffer的操作应该在filesystem/vfs下进行。
chown、lchown 和 fchown 是 Linux 系统中用于更改文件或目录所有权的命令。
chown (change owner): 这个命令用于更改指定文件或目录的用户所有权(所有者)和/或组所有权(组)。用户可以是用户名或者用户 ID,组可以是组名或者组 ID。如果不指定组,则只更改所有者。命令的基本语法如下:
1chown [OPTION]... [OWNER][:[GROUP]] FILE...
其中,OWNER 是新的文件所有者,GROUP 是新的文件组,而 FILE... 是一个或多个文件或目录的列表。chown 命令可以递归地更改目录及其内容的所有者(使 ...
C++八股文
C++八股文C++智能指针C++标准库中的几种常见智能指针类型包括:
std::unique_ptr: 独占所有权,一个对象只能被一个unique_ptr所管理,不能被拷贝,只能通过移动语义转移所有权。
std::shared_ptr: 共享所有权,多个shared_ptr可以同时管理同一个对象,当最后一个引用销毁时,内存才被释放。
std::weak_ptr: 辅助shared_ptr,不会增加引用计数,避免循环引用(内存泄漏问题),通常用于打破shared_ptr之间的环状依赖。
这些智能指针的核心作用是自动管理动态分配的内存,使得程序员不必手动释放内存,避免内存泄漏等问题。
Rust中的引用类型简介Rust中没有智能指针的概念,但它有一套独特的所有权机制和引用类型来管理内存。常见的引用类型包括:
引用(& 和 &mut): 借用机制,用于临时访问数据而不转移所有权。&代表不可变引用,&mut代表可变引用。
Box: 类似于C++的unique_ptr,表示堆上分配的单一所有权。只有拥有Box的地方能销毁这个堆内存。
Rc: 类似于C++的sha ...
【DragonOS】PCI总线子系统
PCI总线,全称为Peripheral Component Interconnect,即外围组件互连,是一种计算机总线的标准接口,用于连接计算机主板和外围设备,如显卡、网卡、声卡等。PCI总线由Intel公司提出,并由PCI Special Interest Group (PCISIG) 负责制定相关规范。
PCI总线的主要特点包括:
高带宽:PCI总线支持32位或64位的数据传输,工作频率为33MHz,最大数据传输率可达132MB/s(32位)或264MB/s(64位)。
独立于CPU:PCI总线不依赖于特定的处理器,支持多种处理器架构。
并行操作能力:PCI总线允许多个设备并行操作,提高了数据传输效率。
即插即用:PCI设备支持即插即用,方便用户使用。
中断共享:PCI总线支持中断共享,允许多个设备共享同一中断资源。
PCI总线的架构包括HOST主桥、PCI插槽、PCI设备和PCI桥接器。HOST主桥负责连接CPU和内存总线与PCI总线,PCI插槽用于插入外部设备,PCI设备通过插槽与系统通信,PCI桥接器用于连接不同的PCI总线或其他总线。
PCI总线的工作原理涉及初始化、数 ...
引导加载程序
什么是引导加载程序?引导加载程序(Boot Loader)是计算机系统中的一个软件,它负责在计算机启动时加载操作系统内核,并将控制权交给内核。引导加载程序通常存储在启动设备的引导扇区(Boot Sector)中,如硬盘、固态硬盘、光盘等。它的主要功能包括初始化硬件、加载内核映像、设置内核运行环境等。
GRUB的一个重要特性就是灵活性;GRUB能够识别文件系统和内核可执行文件格式,因此你可以按照自己的喜好加载任意一个操作系统,而不必记录内核在磁盘上的物理位置。因此,你可以通过指定内核文件的名称以及内核所在的驱动器和分区来加载内核。
GRUD2GRUB得到了扩展以满足许多需求,但很快它就变得明显,其设计无法跟上对其所做的扩展,我们达到了这样的地步:如果不破坏现有功能,就很难进行任何进一步的更改。大约在2002年,Yoshinori K. Okuji开始开发PUPA(GNU GRUB的初步通用编程架构),旨在重新编写GRUB的核心,使其更干净、更安全、更健壮、更强大。PUPA最终被重新命名为GRUB 2,而原始版本的GRUB被重新命名为GRUB Legacy。
multiboot2Multi ...
Rust语言进阶
闭包在编程语言中,闭包(Closure)是一个重要的概念,它指的是一个函数或方法,它记住了创建时的环境,即使在其定义的作用域之外也能访问这些环境的变量。简单来说,闭包就是能够读取或修改另一个函数内的变量的函数。
在 Rust 语言中,闭包是一种可以捕获其环境中变量的匿名函数。Rust 中的闭包有三种类型,分别是:
FnOnce:这种类型的闭包可以被调用一次,并且可以获取(即获取所有权)其环境中的变量。
FnMut:这种类型的闭包可以被多次调用,并且可以可变地借用(即修改)其环境中的变量。
Fn:这种类型的闭包也可以被多次调用,但是它只能不可变地借用其环境中的变量。
闭包在 Rust 中非常有用,因为它们可以作为参数传递给其他函数,或者作为函数的返回值。这使得闭包在实现回调函数、事件处理器、迭代器和闭包表达式等方面非常有用。
闭包的语法结构通常如下:
1|参数列表| 表达式
例如,一个简单的闭包可以这样定义:
1let add_one = |x: i32| x + 1;
这个闭包接受一个 i32 类型的参数 x,并返回 x + 1 的结果。你可以像调用普通函数一样调用这个闭包:
12 ...
IBM俱乐部组织架构调整以及活动设想方案
俱乐部简介todo!()
俱乐部组织架构123456789101112131415graph TD;Z[指导老师] subgraph 主席团 A[总负责人] B[技术部部长] C[组织部部长] D[宣传部部长] end Z-->A A-->B A-->C A-->D B-->|带领和管理|F[技术部成员] C-->|带领和管理|G[组织部成员] D-->|带领和管理|H[宣传部成员]
职能介绍
职能只是锻炼和发挥你长处的机会,无论是否有职务,大家都有同等机会享受俱乐部的资源,但相对来说对于俱乐部的发展更重要。
下分三个部门,技术部、宣传部和组织部。每个部门有1到2位部长,5到6个成员。招新总人数15人左右,可以小范围增加。
技术部技术部致力于提升俱乐部内部的整体技术水平。负责组织开展俱乐部内部的技术交流活动。包括但不限于开展内部的技术交流活动,组织项目组队,举办内部比赛,打卡沙龙等内容的组织和策划。
宣传部宣传部致力于让俱乐部在软件 ...
区块链技术与应用
课程报告;
区块链技术与应用区块链关键技术区块链架构数据层、网络层、共识层、激励层、合约层、应用层
区块结构
Merkle树通过Merkle树如何对区块中的交易进行验证?做哈希的次数是log2(n),n是交易数量,次数多了,速度慢了,但是校验的速度更快。
非对称加密分组对称加密算法
DES
AES
IDEA非对称加解密算法对比:对称加密算法只有一个密钥,非对称加密算法有两个密钥,公钥和私钥。
RSA,基于大数质因子分解很困难的特性
ECC(椭圆曲线加密算法)
SM2(国密算法),基于椭圆曲线离散对数问题,加密强度高于RSA系列优缺点:非对称加密算法加密速度慢,但是安全性高,对称加密算法加密速度快,但是安全性低。混合加密对称加密算法加密数据,非对称加密算法加密对称加密算法的密钥。先用非对称加密算法协商出一个临时的对称加密密钥(也称会话密钥),然后用对称加密算法加密数据。典型的应用场景是HTTPS。数字签名
数字证书鲍勃和爱丽丝的故事鲍勃有两把钥匙,一把是公钥,另一把是私钥。
鲍勃把公钥送给他的朋友们——帕蒂、道格、苏珊——每人一把。
苏珊要给鲍勃写一封保密的信。她写完后用鲍勃的公钥加密 ...
【DragonOS】redis服务测试
redis-benchmark 是一个非常有用的工具,可以帮助你测试 Redis 服务器的性能。然而,它并不是专门设计用于长时间稳定性测试的工具。redis-benchmark 更适合用于短时间内的高负载测试。如果你想测试 Redis 服务在 1000 QPS 下稳定运行 24 小时,建议使用更适合长时间测试的工具,如 redis-benchmark 配合脚本,或者使用其他负载测试工具如 Apache JMeter 或 wrk。
使用 redis-benchmark 和脚本进行长时间测试你可以编写一个简单的脚本,循环调用 redis-benchmark,并记录每次测试的结果。以下是一个示例脚本:
1234567891011121314151617181920212223#!/bin/bash# 目标 QPSTARGET_QPS=1000# 测试持续时间(秒)DURATION=$((24 * 60 * 60))# redis-benchmark 参数REDIS_BENCHMARK_CMD="redis-benchmark -t set,get -n $((TARGET_QPS ...