putty私钥连接不上fedora的问题

putty版本:0.70

首先排除了fedora38上rsa私钥以及配置的问题,就剩下2个可能:

1,历史私钥不兼容;

2,Putty的问题;

关于RHEL升级安装的一些问题

用 docker 在 Dockerfile 上每次升级都很顺利,但突然之间,升级RPM包,报以下错误:

... signature hdr data: bad, no. ... of bytes(64372) out of range

网上查了一下,主要是由于RPM的一些兼容性问题导致(RPM签名的头超过了64KB),详情见"signature hdr data BAD" on trying to parse RPM with more than 64KB signature header

如何解决的呢?

关于静态编译(二)

静态编译有其优势,但有些情况下,静态编译反而会造成一些不便。

工厂类注册问题

工厂类一般使用模板或宏的方式,如下列代码申明:

class ExpressionFactoryRegisterer
{
public:
   ExpressionFactoryRegisterer(const std::string &name, const ExpressionFactoryPtr &factory)
  {
       GetExpressionTable()->RegisterExpressionFactory(name, factory);
  }
};

#define REGISTER_EXPRESSION_CONCAT_IMPL(a, b) a##b
#define REGISTER_EXPRESSION_CONCAT(a, b) REGISTER_EXPRESSION_CONCAT_IMPL(a, b)

#define REGISTER_EXPRESSION_FACTORY(name, factory)                                                       \
   namespace                                                                                           \
   {                                                                                                   \
   BS_NAMESPACE(expression)::ExpressionFactoryRegisterer                                               \
   REGISTER_EXPRESSION_CONCAT(r, __COUNTER__)(name, factory);                                           \
   }

#define REGISTER_EXPRESSION_TYPE(name, type)                                                             \
   namespace                                                                                           \
   {                                                                                                   \
   BS_NAMESPACE(expression)::ExpressionFactoryRegisterer REGISTER_EXPRESSION_CONCAT(r, __COUNTER__)(   \
           name, std::make_shared<BS_NAMESPACE(expression)::TypedExpressionFactory<type>>());           \
   }

代码注册如下:

REGISTER_EXPRESSION_FACTORY("log", std::make_shared<UnaryMathExpressionFactory<Func__log>>());

这样注册之后,一个简单的"反射"机制建立起来。但一般情况下,为了避免多重定义,会降代码注册的部分写到 .cc 文件中,但静态编译的时候, .cc 生成的 .o 文件,会通过 ar 工具打包成 .a 文件,此时 .a 文件直接去链接,静态区过程会滞后,导致 RegisterExpressionFactory 动作变成运行态执行。当程序真正执行时,初始化从静态区获取不到注册的类,导致空结果或指针。

正确的方式有2种:

  • 动态编译:通过 -shared 生成 so 文件,然后链接;

  • .o 直接链接:将生成的 .o 文件直接链接,或通过 ar 工具解压 .a 文件,然后再链接 .o 文件;

这样程序会再链接的时候,将注册内容真正的放入静态区,程序启动时,直接加载到对应变量中,就不会为空啦。

关于静态编译(一)

一般C/C++语言的编译,我还是喜欢使用automake,虽然它缺少通配符的支持,但其支持Makefile的原生语法以及一旦生成了Makefile,在任意有Makefile的目录修改Makefile.am之后都可以直接make;且结合libtool之后,动态库和静态库可以随心编译;这个是cmake不能比的,但cmake也有其优点,比如通配等。

这里不是比较automake和cmake,但在工作当中,当一个三方库(sse_pb)既有动态库,又有静态库时,我们使用-lsse_pb连接时,系统会默认使用动态库,但我们需要优先使用静态库链接时, automake方式比较简单,但对于cmake,这里提供3种办法:

1.使用GCC编译参数

我们可以使用GCC的编译参数-Wl,-Bstatic-Wl,-Bdynamic来实现指定优先静态编译:

find_package(PkgConfig)
pkg_check_modules(brpc REQUIRED IMPORTED_TARGET brpc)
pkg_search_module(sse_pb REQUIRED sse_pb)
add_library(basic_search SHARED)
target_link_libraries(basic_search
  PRIVATE
  basic_search_common
  basic_search_util

...

  PUBLIC
  PkgConfig::brpc
  -Wl,-Bstatic
   ${sse_pb_LIBRARIES}
  -Wl,-Bdynamic
   )

值得注意的是 pkg_check_modules 会将 pc 文件内的链接 -lsse_pb 预先生成 /usr/lib64/libsse_pb.so 形式,导致即使添加GCC参数也不会生效。所以正确的方式是使用 pkg_search_module 来生成cmake的宏变量,一般存在两组值:

  • 用于普通情况, pkg-config 在使用--libs 选项调用时提供的信息,如<XXX> = <prefix>

  • 用于 pkg-config 在额外添加--static 选项调用时提供的信息 (<XXX> = <prefix>_STATIC)

对应的宏变量有下列这些:

<XXX>_FOUND:如果模块存在,则设置为 1
<XXX>_LIBRARIES:只有库 (没有 "-l")
<XXX>_LINK_LIBRARIES:库及其绝对路径
<XXX>_LIBRARY_DIRS:库的路径 (没有 "-L")
<XXX>_LDFLAGS:所有必需的链接器标志
<XXX>_LDFLAGS_OTHER:所有其他链接器标志
<XXX>_INCLUDE_DIRS:预处理器标记'-I'(没有'-I')
<XXX>_CFLAGS:所有必需的 cflags
<XXX>_CFLAGS_OTHER:其他编译器标志
<YYY>_VERSION:模块版本
<YYY>_PREFIX:模块的前缀目录
<YYY>_INCLUDEDIR:包含模块的目录
<YYY>_LIBDIR:模块的 Lib 目录

如上述 ${sse_pb_LIBRARIES} 的设置,就是将 sse_pb 库以静态优先的方式链接起来。

2.使用CMAKE_FIND_LIBRARY_SUFFIXES

我们还可以使用 find_library ,通过改变查找 .a 文件的顺序来获得静态文件优先规则,如下所示:

if (WIN32 OR MSVC)
   set(CMAKE_FIND_LIBRARY_SUFFIXES ".lib")
elseif (UNIX)
   # 仅查找静态库,强制后缀为 .a
   set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

   # 如果只是优先查找静态库,保证 .a 后缀在前面即可,把默认的后缀加上
   # set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})
endif()

find_library(sse_pb_lib sse_pb)
target_link_libraries(basic_search
   ${sse_pb_lib}
)

3.写死路径

在这种 set_property 方式下,主要依赖路径:

add_library(sse_pb STATIC IMPORTED)
set_property(TARGET sse_pb PROPERTY IMPORTED_LOCATION /path/to/libsse_pb.a)
target_link_libraries(basic_search sse_pb)

其中 /path/to/libsse_pb.a 就可以随意发挥了。

从上可以看出,最灵活也是最优雅的还是第一种方式,可以依赖pkg-config建立很好的环境变量,从而进行静态编译。

在rhel安装高版本nodejs

背景

RHEL8 尝试使用 slidev 的时候,安装提示node版本至少 >=14.0 ,而当前其nodejs版本是:

rpm -q nodejs nodejs-10.23.1-1.module_el8.4.0+645+9ce14ba2.x86_64

所以需要升级nodejs版本。

安装过程

在正常情况下,一般要么通过源代码编译解决,要么通过已打包好的安装包或对应软件仓库源来解决。这里介绍一种更加简单的方式。

首先,查看nodejs在当前仓库源下可用的版本:

```

sudo dnf module list nodejs Last metadata expiration check: 4:02:13 ago on Mon 27 Feb 2023 11:11:34 AM CST. CentOS Stream 8 - AppStream Name Stream Profiles Summary nodejs 10 [d] common [d], development, minimal, s2i Javascript runtime nodejs 12 common [d], development, minimal, s2i Javascript runtime nodejs 14 common [d], development, minimal, s2i Javascript runtime nodejs 16 common [d], development, minimal, s2i Javascript runtime nodejs 18 [e] common, development, minimal, s2i Javascript runtime

Extra Packages for Enterprise Linux Modular 8 - x86_64 Name Stream Profiles Summary nodejs 13 default, development, minimal Javascript runtime nodejs 16-epel default, development, minimal Javascript runtime

Hint: [d]efault, [e]nabled, [x]disabled, [i]nstalled ```

其最高版本是18,那么需要先reset,然后设置18,命令行如下:

```

sudo dnf module reset nodejs -y sudo dnf module enable nodejs:18 -y ```

设置好对应高版本源后,开始安装:

```

sudo dnf install nodejs -y ```

即可完成nodejs版本的升级。

在容器下编译的一些问题解决

在Ubuntu20.04下编译zookeeper时,发现如下错误:

... Duplicate cpuset controllers detected. ... Picking /sys/fs/cgroup/cpuset ...

此错误是一个警告,,正常来说不应该引起编译失败,但因为zookeeper将javacc的输出作为了META-INF/MANIFEST.MF里面的version_info,导致这堆警告也被打入到MANIFEST.MF里面,这样jar包的检测机制认为这个jar包是有问题的。

解决方案有几种:

1,放宽jar包的检测机制:看上去后面运行这个jar包都会带着这个信息;

2,解决这个警告信息:看上去靠谱一些。

发现从代码层解决,需要升级新的openjdk,当前这个版本openjdk对容器化的"支持"不是很好,于是只能改日志等级,但我不想改变现在的代码和配置,采用如下命令行设置即可:

export JAVA_HOME=/usr/lib/jvm/java
export ANT_HOME=/usr/share/ant
export PATH=${ANT_HOME}/bin:${JAVA_HOME}/bin:${PATH}
export JAVA_TOOL_OPTIONS="-Xlog:disable -Xlog:all=warning:stderr:uptime,level,tags"

整个过程虽然有一些曲折,但最终解决了问题。

使用debmake创建debian模板时,发现出现如下错误:

FileNotFoundError: [Errno 2] No such file or directory: '//share/debmake/extra0export/compiler'

SeaTalk_IMG_1674898499.png

跟随python堆栈,了解到:

    # get prefix for install --user/ ,, --prefix/ ,, --home
    fullparent = os.path.dirname(sys.argv[0])
    if fullparent == '.':
        para['base_path'] = '..'
    else:
        para['base_path'] = os.path.dirname(fullparent)
  para = debmake.para.para(para)

出现了问题,修复方式也简单,因为base_path判断出现了bug,故强制在文件/usr/lib/python3/dist-packages/debmake/__init__.py中指定

para['base_path'] = '/usr'

搞定。此debmake版本是4.3.1,等官方修复之后再更新上去。

有点郁闷,被同一个石头绊倒了二次,好记性还是不如乱笔头!事情是这样子的......

Fedora37 发布了

Linux内核6.0,GNOME 43桌面环境,并且支持树莓派 4(Raspberry Pi 4),还包括:

  • 支持openssl3.0;
  • 将继续支持传统 BIOS;
  • 将在 Raspberry Pi 4 设备上提供官方支持;
  • 获准使用 Web UI 安装程序;
  • 新提案:不受限制地访问 Flathub;
  • 为节省存储空间,Fedora 37 将按需安装固件;
  • 将使用最小 Curl 包,仅支持 HTTP (S) 和 FTP 协议;
  • 考虑删除旧版 X.Org 驱动程序;
  • 计划使用 RPM 4.18 ,以获得更好的安全性;

需要尝鲜的,可以体验啦!=>https://getfedora.org/

对官方tensorflow-1.15.5做了移除abseil-cpp之后,发现一些link问题,程序虽然编译和链接时,都没有问题,但是打的RPM包之后,程序运行时,会hang住。

本地正常运行也没有问题,主要体现在最后link的参数上:

 -Wl,-z -Wl,relro -Wl,-z -Wl,now -specs=/usr/lib/rpm/redhat/redhat-hardened-ld

如果一旦链接上-specs=/usr/lib/rpm/redhat/redhat-hardened-ld,就表现不正常,此问题已经在红帽子官网报告过。当前笔者使用的是CentOS8,和fedora23相当,所以此处bug仅记录。

解决办法也比较简单,spec文件中加入自定义ldflags即可:

%define build_ldflags  %{nil}

这里为不加。

本着寻根究底的精神,确认link过程中有问题,于是,查询去掉一部分link,发现并不会hang住,罪魁祸首是opennmt-tokenizer,其依赖了sentencepiece,而sentencepiece代码中依赖了protobuf和absl,在0.1.96版本中,由于SPM_USE_EXTERNAL_ABSL写反了(BUG),导致使用了thirdparty目录下的protobuf的源文件和abseil的源文件加入其中一起编译,从而导致了符号冲突。

BTW:二进制运行时提示:

[libprotobuf ERROR google/protobuf/descriptor_database.cc:641] File already exists in database: tensorflow/core/profiler/tfprof_log.proto

有几种情况:

(1)tensorflow的C库和C++库一起链接导致;

(2)其它protobuf的版本内置导致,如(abseil)

Monthly Archives

Pages

Powered by Movable Type 7.9.4