分类 软件 下的文章

好耶,是红帽系的openEuler

dnf groupinstall -y "Development Tools"

# 下载源代码
git clone https://github.com/ceph/ceph
cd ceph
git checkout quincy-release
git submodule update --init --recursive

# 编译前准备
# openEuler 22.03的源里没有这两个python包,需要改为手动下载
sed -i -E 's/(.*asyncssh$)/#\1/gm' ceph.spec.in
sed -i -E 's/(.*natsort$)/#\1/gm' ceph.spec.in

# 官方还没有加openEuler的选项,但大概率是兼容的
sed -i -e 's/centos|fedora/centos|openEuler|fedora/g' install-deps.sh

./install-deps.sh

# 装完依赖之后再装dnf里没有的两个包
pip3 install asyncssh natsort

dnf install -y xmlsec1 doxygen ninja-build python3-sphinx
dnf install -y libibverbs-devel openldap-devel lz4-devel expat-devel lttng-ust-devel libbabeltrace-devel libatomic librabbitmq-devel librdkafka-devel java-1.8.0-openjdk-devel

# cmake配置
./do_cmake.sh -DCMAKE_BUILD_TYPE=RelWithDebInfo

# 开始编译
ninja

打RPM包的过程有点曲折,openEuler的维护者不知道在干些什么,去维护ceph.spec而不是ceph.spec.in,搞得我不知道版本更新的时候到底该对着谁的spec改了。。

这里就不理openEuler自己公布的spec文件了,用点取巧的方法,伪装成CentOS试试。

# 制作RPM源码包
./make_srpm.sh

# 展开RPM源码包用于安装
# 注意默认是解压到家目录下的,所以在ceph目录下执行完可能发现没任何变化,回家目录检查下肯定有rpmbuild文件夹了
rpm -i ceph-17.2.5-0.g98318ae89f1.src.rpm

# 安装编译依赖
dnf builddep -y --define 'rhel 7' --spec ~/rpmbuild/SPECS/ceph.spec

# 华子的像素级抄袭功底还是在的,包管理器名字都给你改喽
# 说实话还整个大小写混用让人挺不舒服的。。
sed -i -e 's/^BuildRequires:  redhat-rpm-config$/BuildRequires:  (redhat-rpm-config or openEuler-rpm-config)/gm' ~/rpmbuild/SPECS/ceph.spec
sed -i -E 'N;s/(^%if 0%\{\?rhel} == 8$)(\n%py_byte_compile.*)/\1 || 0%{?openEuler}\2/gm' ~/rpmbuild/SPECS/ceph.spec

# RPM编译
# openEuler上的cmake可执行文件是python脚本,然而很怪,一用rpmbuild,python就会掉PYTHONPATH,找不到cmake
# 伪装成rhel7,走centos的编译流程,但是又绕过软件包版本限制
PYTHONPATH=/usr/local/lib64/python3.9/site-packages rpmbuild -ba ~/rpmbuild/SPECS/ceph.spec --define 'rhel 7'

将编译的ceph RPM包作为repo提供给其他机器使用,参考:https://blog.csdn.net/DeamonXiao/article/details/120879577

dnf install -y createrepo
cd ~/rpmbuild/RPMS
createrepo .

然后另外单独起个后台进程,直接用http提供服务;这里用7000端口,根据需要可以自己调。

python3 -m http.server 7000

至此,一个repo就建立好了。

然后配置服务器使用这个源:

cat << EOF > /etc/yum.repos.d/Ceph-dev.repo
[ceph-dev]
name=Ceph Dev
baseurl=http://<ip-address>:7000/
enabled=1
gpgcheck=0
EOF

# 更新缓存,测试源是否添加成功
dnf makecache

最近突然又想玩本地推流了,转来转去发现还是nginx做推流服务器比较舒服(开源且稍微熟悉一点),考虑到之前试过的别人编译的nginx 1.7.11.3 Gryphon过于老旧,而且卡顿严重,就打算自己编译一份。在这里简单记录一下编译流程。

仔细观察nginx官方提供的windows编译版,发现提供的还是32位程序,而在实际编译中也的确发现部分模块存在32位和64位混编导致失败的情况,因而最好用VS自带的x64_x86环境(Native Tools Command Prompt)启动cmd来尽可能避免编译出错。都什么年代了,还在用传统x86

set PATH=%PATH%;C:\msys64\usr\bin

pacman --noconfirm -S nasm

git clone https://github.com/nginx/nginx
git clone https://github.com/arut/nginx-rtmp-module

cd nginx
mkdir deps

cd deps
git clone https://github.com/PCRE2Project/pcre2
git clone https://github.com/madler/zlib
git clone https://github.com/openssl/openssl

cd ..

bash ./auto/configure --with-cc=cl --with-cpp=cl --with-cc-opt='/MP /wd4456' --with-pcre=deps/pcre2 --prefix= --sbin-path=nginx.exe --with-zlib=deps/zlib --with-openssl=deps/openssl --with-http_stub_status_module --add-module=../nginx-rtmp-module

nmake

编译完把nginx.exe复制到项目根目录下即可使用。

还是不要尝试nmake install了,不然会报出各种奇奇怪怪的错误= =

需求是在gem5里跑SPEC程序。作为一个指令级模拟器,允许在不单独运行操作系统的情况下运行指定架构的程序本身就已经是一个巨大的工程了,而它所付出的代价则是运行效率低下和不支持动态链接(作者似乎说了在x86模式下支持加载动态库,但我没测试)。

于是对应的解决方案是,静态链接。

然而,在如今这个内外存充足、处理器足够快的时代,静态链接的用途可以说是已经被大幅削减了,如果要依赖外部程序的话,没有什么是附加一个动态库解决不了的。一定要说离不开静态链接的,可能也就只有在仍处于系统底层的内核了。对于只能识别汇编指令的处理器来说,它不知道该去哪里找对应的依赖实现,因而程序必须一字一句指导处理器执行。

好在仍然有部分C语言程序离不开静态编译,因而现有的操作系统还是提供了gcc的静态包。而fortran就不一样了,天生作为计算工具的语言往往在操作系统中执行,没必要搞静态链接,但凡一个库函数被调用了两次都是一种空间的浪费——或许是基于这种思想,几乎所有的Linux发行版都从安装源里删去了gfortran的静态依赖库,仿佛多的这几百KB的空间对服务器也是种累赘。

然而还是有人关注这个问题:在CentOS论坛中,有人解决方案。作为开源操作系统,保留源码可以说是一个非常好的文明了,而红帽系的系统甚至还提供了rpmbuild工具用来实现快捷的,从源码包到二进制包的编译功能,大致分为两步:

首先找到源码rpm包(这里推荐pkgs.org和rpmfind.net,格式工整,资料齐全)并解压:

rpm -i gcc-8.3.1-5.1.el8.src.rpm

然后用rpmbuild按照配置文件编译即可:

rpmbuild -bb ./rpmbuild/SPECS/gcc.spec

然后编译过程中可能会提示缺包缺文件,通过yum/dnf安装即可,缺失的文件也都是可以通过包管理器补上的

以经典的/lib/libc.so.6/usr/lib/libc.so为例,这两个文件是x86架构下的glibc库文件,在amd64系统上是默认不装的,但是因为rpmbuild需要,可以通过分别glibc.i686glibc-devel.i686补上。

补完缺失的依赖之后就可以快乐泡茶等编译啦~

  1. 配置hosts

    vi /etc/hosts
  2. 关闭防火墙、SELinux

    systemctl stop firewalld    # ubuntu换成ufw
    setenforce 0
  3. 装docker

(暂略)

  1. 安装cephadm
    wget https://github.com/ceph/ceph/blob/v16.2.7/src/cephadm/cephadm
    chmod +x cephadm
    ./cephadm add-repo --version 15.2.7    # 指定ceph版本
    ./cephadm install ceph-common  ceph    # 客户端软件包
    ./cephadm install                      # 把cephadm装到系统环境中

其实cephadm也可以用包管理器装。似乎cephadm的版本和要部署的ceph集群版本可以不一致。

  1. 创建本机最小集群

    mkdir -p /etc/ceph
    cephadm bootstrap --mon-ip <ip>

    其中<ip>替换成本机在ceph集群中欲配置的ip地址,这里不能用主机名。

  2. 配置集群免密登录
    ssh-copy-id -f -i /etc/ceph/ceph.pub <user>@<host>

<user><host>替换成要加入集群的机器名称。

  1. 进入ceph容器命令行
    cephadm shell

这一步的目的可以理解为隔离环境,也就是说允许在本机不安装ceph包的情况下,运行ceph相关的管理命令,可以保证本地环境不被污染。注意退出本shell之后所有临时生成的文件会被删除,但是命令记录似乎会被保留。

  1. 将节点添加进集群(在其它节点上部署docker容器)
    # 在cephadm shell中执行
    ceph orch host add <hostname> <host-ip>    # --labels _admin 以作为管理员节点

<hostname><host-ip>替换成要添加的节点的hosts名称和ip。

  1. 部署ceph mon
    # 在cephadm shell中执行
    # ceph config set mon public_network XXX.XXX.XXX.XXX/XX    # 配置网段,不清楚是否为必须
    ceph orch apply mon <host1>,<host2>,...

使用服务器的hosts名称指定要部署mon的节点,用逗号(不加空格)分开。

  1. 部署ceph osd

osd要求使用裸盘,任何建立了文件系统的盘都不能用作osd。

将集群中所有节点的裸盘用作osd:

# 在cephadm shell中执行
ceph orch apply osd --all-available-devices

如果要详细指定仅使用满足某些特定条件的盘,可以参考https://docs.ceph.com/en/quincy/cephadm/services/osd/#drivegroups,用yml定制过滤器,并用--dry-run检查过滤器写的是否符合预期。

  1. 创建CephFS
    # 在cephadm shell中执行
    ceph fs volume create default

这样会创建一个名为default的CephFS,默认的副本数应该是3。

改成1的方法:

ceph config set mon mon_allow_pool_size_one true
ceph osd pool set cephfs.default.data size 1 --yes-i-really-mean-it

一些翻车后的小技巧:

删除集群后,释放osd占用的裸盘:

ceph-volume lvm zap /dev/sdX --destroy

CephFS创错了,删除提示配置不允许删除:

# 在cephadm shell中执行
ceph config set mon mon_allow_pool_delete true

从集群中删除节点:

ceph orch host rm <host> --force

若是离线了还要加上--offline参数。

查看集群中所有ceph服务的运行状态:

ceph orch ps

一台机器的所有服务都炸了,或者没删除服务就卸载ceph了:

# 在cephadm shell中执行
ceph orch daemon redeploy <service>.<host>

比如ceph orch daemon redeploy mon.ceph01将会重新配置ceph01节点上的mon服务容器。

清理集群删除失败时留下的残渣(相当于移除机器上与ceph相关的所有信息,包括配置文件、数据

# 删除服务
for i in `systemctl | grep ceph | awk '{print $1}' | grep -P 'service|target'`; do systemctl stop $i; done
rm -rf /etc/systemd/system/ceph*
systemctl daemon-reload

# 删除配置文件
rm -rf /var/lib/ceph
rm -f /etc/ceph/*

# 然后还可能需要zap掉创建的osd,参见上文

虽然没怎么用到,但是插眼:https://www.cnblogs.com/oloroso/p/14647299.html