在 CentOS 上编译 Ceph
本文编译环境为:
硬件架构:x86_64
Linux 版本:CentOS 7.3.1611
Ceph 版本: v14.2.21
-
由于:
Ceph 的依赖过于复杂(且似乎包含很多无效依赖);
官方提供的编译过程可能会遭遇大量问题;
在不同的硬件架构和系统版本上编译不同版本的 Ceph,编译过程中遭遇的错误可能会有很大不同。
所以 此文章仅对 x86_64 上的 CentOS 7.3.1611 与 Ceph 14.2.21 负责!
-
另外有几点需要注意:
Ceph 的编译全过程耗时可能很长,具体取决你的机器配置。
Ceph 的依赖安装和编译等操作需要大量的磁盘空间,建议给 / 目录预留 32G 以上空间。
Ceph 的编译过程会涉及到大量的网络下载,请自行解决相关的网络问题(例如 使用境外服务器编译、配置代理 等)。
Ceph 的整个编译过程中有多处需要 root 权限,但请使用 root 用户直接操作!请使用 root 用户直接操作!请使用 root 用户直接操作!不要在普通用户上通过 sudo 或 sudo su 来操作,否则可能会有各种奇奇怪怪的问题而且很难解决 ...
JuiceFS 的技术架构与存储文件的方式
1. JuiceFS 是什么1.1. 简介JuiceFS 是一款面向云原生设计的分布式文件系统。
JuiceFS 是开源的,开源协议为 Apache 2.0,开源在 GitHub 上。
JuiceFS 提供完备的 POSIX 兼容性,可以将几乎所有的对象存储接入本地作为几乎无限容量的本地磁盘使用。
JuiceFS 也可以同时挂载到不同平台、不同地区的不同主机上进行读写。
JuiceFS 采用「数据」与「元数据」分离存储的架构,从而实现文件系统的分布式设计。文件数据本身会被切分并保存在对象存储(例如 Amazon S3、阿里云 OSS 等),而元数据则可以保存在多种数据库中(例如 Redis、MySQL、TiKV、SQLite 等),用户可以根据场景与性能要求进行选择。
JuiceFS 提供了丰富的 API,适用于各种类型数据的管理、分析、归档、备份。
JuiceFS 可以在不修改代码的前提下无缝对接大数据、机器学习、人工智能等应用平台,提供海量、弹性、低价的高性能存储。
JuiceFS 的运维人员无需为可用性、灾难恢复、监控、扩容等工作烦恼,专注于业务开发,提升研发效率。JuiceFS ...
VMware 上 Linux 虚拟机的磁盘扩容
本文适用 VMware 虚拟机,系统为 CentOS/RHEL 系或与之兼容的发行版,我的操作系统为 AlmaLinux 8.7。
下面各项输出中所有包含 “almalinux” 字样的内容,均可替换为你的系统名字。比如你的系统是 CentOS,那么把我这里的输出信息中的 “almalinux” 都替换成 “centos” 就是你应该有的输出。
1. 扩容过程大纲为了说明的清晰一些,我这里将 VMware 内 Linux 虚拟机的扩容过程分为了以下几步:
先是在 VMware 上的操作:
关闭并备份虚拟机。
删除虚拟机的全部快照。
扩容虚拟机。
启动虚拟机。
然后是在 Linux 虚拟机内的操作:
查看当前的磁盘分区信息与挂载信息。
给磁盘 /dev/sda 增加一个分区。
设置新分区格式。
写入分区表。
格式化新分区。
进入 lvm 合并磁盘。
增加 xfs 磁盘空间。
2. VMware 上的操作VMware 上的操作很简单,我们按照前文说的步骤进行就可以:
关闭并备份虚拟机。备份主要是避免把虚拟机搞坏了,毕竟磁盘操作挺危险的,就把虚拟机文件夹拷贝一份就行。
删除虚拟机 ...
JuiceFS 编译与安装
本文不介绍 JuiceFS ,不了解的朋友可以看一下官网,或我写过的 JuiceFS 单机模式初体验。
1. 编译目标如果你有使用过 JuiceFS 或看过相关文档,就会知道 JuiceFS 实际上只有一个二进制文件,用起来相当简单。
所以我们的编译目标也很简单了,就是编译得到一个二进制可执行文件。
2. 下载 JuiceFS 源码我这里还是先创建一个空文件夹,并在这里面进行后续操作(个人习惯):
1mkdir juicefs-compile && cd juicefs-compile
然后克隆 JuiceFS 源码:
1git clone https://github.com/juicedata/juicefs.git
3. 安装依赖JuiceFS 的依赖主要有两个:Golang 1.18+ 和 GCC 5.4+,如果你的环境里已经有了这两个依赖,则可以跳过这小节。
可以使用 go version 和 gcc -v 两个命令检查以下。
3.1. 简单安装的方式最简单的安装方式就是 yum 直接安装,我这里 yum 内提供的版本是 Golang 1.18.10 和 G ...
(CentOS/RedHat 系)Linux 安装最新版 GCC
1. 准备因为编译 GCC 源码的时候是需要 GCC 的,并且支持 C++ 11,所以我们得确保系统里当前是存在 GCC 的,如果没有的话,先安装一个:
1sudo yum install gcc-c++
yum 中提供的 GCC 版本是 8.5.0,是满足我们编译最新版 GCC 源码的要求的。
也就是说,我们所谓的安装最新版 GCC,其实是升级现有的 GCC 到最新版。
另外 GCC 的编译耗时可能非常长(也取决你的配置),如果你是着急用的话,可能不太行。
2. 下载最新版 GCChttps://ftp.gnu.org/gnu/gcc/ 中可以看到全部的 GCC 版本,找到你需要的版本的文件夹,进入,里面名字形如 gcc-12.2.0.tar.gz 就是我们需要的(一般也是 Size 最大的那个)。
我这里是找到最新版 GCC,即 12.2.0。
3. 编译安装我一般喜欢在一个干净的文件夹内做一件事情(个人习惯):
1mkdir ~/gcc-install && cd ~/gcc-install
下面进入正题。
下载 tar 包并解压:
123wget https: ...
(CentOS/RedHat 系)Linux 安装最新版 Golang
在 https://go.dev/dl/ 页面可以看到 Golang 目前的最新版本,编辑此文章时是 1.20.3。
我们找到所需要的版本,我这里的环境是 x86_64 架构上的 AlmaLinux,所以需要的版本是:
go1.20.3.linux-amd64.tar.gz
如果你和我环境类似,也是 x86_64 架构上的红帽系 Linux,那么你应该选择和我一样的版本(最多版本号不一样。
我个人比较喜欢在一个干净的文件夹内做一件事,所以:
1mkdir ~/golang_install && cd ~/golang_install
下载我们需要的 Golang 版本 tar 包:
1wget https://go.dev/dl/go1.20.3.linux-amd64.tar.gz
删除机器上现有的 Golang,并将刚刚的 tar 包解压到 /usr/local/go/:
12rm -rf /usr/local/gotar -C /usr/local -xzf go1.20.3.linux-amd64.tar.gz
配置环境变量,打开 /etc/profile:
1 ...
JuiceFS 单机模式初体验
本文不涉及分布式系统,仅在单机模式下简单体验 JuiceFS。
1. 什么是 JuiceFS ?JuiceFS 是一款面向云原生设计的高性能分布式文件系统。
JuiceFS 是跨平台的,可以在几乎所有主流架构上的各种操作系统中运行,包括且不限于 Linux、macOS、Windows。
JuiceFS 采用「数据」与「元数据」分离存储的架构,从而实现文件系统的分布式设计。
JuiceFS 中文件数据本身会被切分保存在对象存储(例如 Amazon S3),而元数据则可以保存在 Redis、MySQL、TiKV、SQLite 等多种数据库中。
JuiceFS 在 GitHub 上开源,开源协议为 Apache 2.0。
此小节介绍内容节选自 JucieFS 官方文档。
2. 安装 JuiceFS 客户端JuiceFS 客户端只有一个二进制文件,我们可以下载官方预编译的版本直接使用,也可以用源代码手动编译。
我这里直接使用官方预编译的二进制文件。如果你想自己编译,可以看 JuiceFS 编译与安装,最终都是得到一个二进制文件。
本文在 x86_64 架构上的 AlmaLinux 8.7 中进 ...
配置 VMware 虚拟机为开发机
1. 我为什么选择虚拟机做开发机我的开发机最终选择是在 VMware 上的 Linux 虚拟机。
我个人采用这样的开发方式,很大原因是非常喜欢这种模式的便捷性。
VMware 是跨平台的,我们的虚拟机可以直接通过 U 盘拷走,随处安置。
虚拟机可以随时制作快照,备份、回滚非常简单,完全不用担心把环境搞坏了。
关于这个开发模式,我自己也是初次使用,后面如果遇到哪些问题,或者有哪些新的心得,我也会更新到这篇文章里 ~
2. 镜像安装我选择装在虚拟机中的 Linux 发行版及版本是 AlmaLinux-8.7-x86_64-minimal。
线上生产环境是 CentOS 7.3,但是公司电脑与我家里电脑的 CPU 比较新,无法通过 CentOS 7.x 的硬件检测。
所以在开发机上,与其装已经不再维护的 CentOS 8.x,不如用 AlmaLinux 了。
这里没有选择最新的 AlmaLinux 版本,而是选择了 8.7(截止写此文章时,最新版本为 9.1),主要是为了规避过新版本的潜在风险。
镜像下载地址:AlmaLinux-8.7-x86_64-minimal.iso
Vmwa ...
笔记 - 关于《Effective C++》 中的 55 个做法
最近闲来无事,想起了之前买的《Effective C++(第三版)》这本书,就打算看一下。
书中介绍了改善程序与设计的 55 个具体做法,但本文并不会像书中那样对相关问题进行分析,而是直接给出结论和重点(个别也会简单解释)。
如果你在阅读此文章,那么我认为,在大部分场景下,你可以直接采用这些结论,因为不满足这些结论的情况是比较少的。但如果你有时间,还是建议阅读原书,理解这些结论从何而来,以及在哪些情况下可能不适用。
另外,由于我读此书时已经是 2023 年,C++ 标准已经到了 23,而此书是依据 98/03 标准编写的,所以本文中我会将部分过时内容替换为新内容。我替换了的部分会在对应位置做出标注或解释。
下面的笔记顺序,与原书的结构顺序一致,每个做法称为一个“条款”。
1. 让自己习惯 C++条款 01:将 C++ 视为一个语言联邦
C++ 高效编程守则视状况而变化,取决于你使用 C++ 的哪一部分。
作者认为 C++ 可以视为一个由相关语言组成的联邦,而非单一语言。在其某个次语言(sublanguage)中,各种守则与通例都倾向简单、直观易懂、并且容易记住。当我们由一个次语言换 ...
C/C++ 程序编译过程简述
C/C++ 程序最简单的 “Hello World” 几乎是每个程序员闭着眼睛就能写出的,编译运行过程一气呵成,基本成了程序入门和开发环境测试的默认标准。
例如,一个最基本的 “Hello World” 的 C 语言程序像下面这样:
123456#include <stdio.h>int main() { printf("Hello World\n"); return 0;}
在 Linux 中,当我们使用 GCC 来编译此程序时,只需要使用最简单的命令(假设源文件名为 hello.c):
123$ gcc hello.c$ ./a.outHello World
事实上,上述过程可以分解为 4 个步骤,分别是预处理(Prepressing) 、编译(Compilation) 、汇编(Assembly) 和链接(Linking),如下图所示:
1. 预编译首先是源代码文件 hello.c 和相关的头文件,如 stdio.h 等被预编译器 cpp (这里预编译器的名字就叫 “cpp”,下面示例中也使用了这个命令)预编译成一个 ...