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

在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,故强制指定

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的源文件加入其中一起编译,从而导致了符号冲突。

对于特定的函数或者变量属性检测一个特定的参数类:

#include <iostream>
#include <boost/smart_ptr.hpp>

#include <type_traits>
using namespace boost;
using namespace std;

#define _CAT(A, B) A##B
#define STR(s) #s
#define CAT(A,B) _CAT(A,B)
#define CHECKER_PREFIX __has_member_function_
#define HAS_MEMBER_FUNC_CHECKER_NAME(FUNC) CAT(CHECKER_PREFIX, FUNC)

#define HAS_MEMBER_FUNC_CHECKER(FUNC) template <typename T> \
struct HAS_MEMBER_FUNC_CHECKER_NAME(FUNC){ \
template <typename C> static std::true_type test(decltype(&C::FUNC)); \
template <typename C> static std::false_type test(...); \
static constexpr bool value = std::is_same<decltype(test<T>(nullptr)),std::true_type>::value; \
};

#define HAS_MEMBER_FUNC(TYPE, FUNC) (HAS_MEMBER_FUNC_CHECKER_NAME(FUNC)<TYPE>::value)


class TestA{
public:
   int* foo(){

       int* a =new int(1);
       return a;

  }

   static int foo2(){
       return  1;
  }

   static const int foo3;
};

HAS_MEMBER_FUNC_CHECKER(foo);
HAS_MEMBER_FUNC_CHECKER(foo2);
HAS_MEMBER_FUNC_CHECKER(foo3);
int main() {

   static_assert(HAS_MEMBER_FUNC(TestA, foo));
   std::cout<<HAS_MEMBER_FUNC(TestA, foo) <<std::endl;

   return 0;
}

对于确定参数类型的泛型成员函数:

#include <iostream>
#include <boost/smart_ptr.hpp>

#include <type_traits>
using namespace boost;
using namespace std;

#define _CAT(A, B) A##B
#define STR(s) #s
#define CAT(A,B) _CAT(A,B)
// 对于固定个数的模版类,检测某一个属性或者函数是否存在
#define CHECKER_PREFIX2 _has_member_fcuntoin2_
#define HAS_MEMBER_FUNC_CHECK_NAME2_(FUNC) CAT(CHECKER_PREFIX2,FUNC)

#define HAS_MEMBER_FUNC_CEHCKER2(FUNC) template<typename T, typename R> \
   struct HAS_MEMBER_FUNC_CHECK_NAME2_(FUNC){ \
   template<typename C> static std::true_type test(decltype(&C::template FUNC<R>)); \
   template<typename C> static std::false_type test(...); \
   static constexpr bool value = std::is_same<decltype(test<T>(nullptr)),std::true_type>::value; \
}

// #define IF_HAS_MEMBER_FUNC2(FUNC,CLASS_,CLASS_F_T) (HAS_MEMBER_FUNC_CEHCK_NAME2_(FUNC)<CLASS_ ,CLASS_F_T>::value)


class TestA{
public:
   int* foo(){

       int* a =new int(1);
       return a;

  }

   static int foo2(){
       return  1;
  }

   template <typename T>
   static  int foo4(){
       return 1;
  }

   static const int foo3;
};


//含有固定类型的模版类
HAS_MEMBER_FUNC_CEHCKER2(foo4);

int main() {
   // 输出 1
   std::cout<< HAS_MEMBER_FUNC_CHECK_NAME2_(foo4)<TestA,char>::value << std::endl;
   // 输出 1
   std::cout<< HAS_MEMBER_FUNC_CHECK_NAME2_(foo4)<TestA,int>::value << std::endl;

   return 0;
}

See also:

https://blog.csdn.net/TH_NUM/article/details/90968219

https://harrychen.xyz/2019/06/04/cpp-17-mock-concept/

Linux磁盘分区问题

当前fdisk查看的磁盘分区比实际df出来的磁盘分区大,实际磁盘分区不可用。

[SME@search-10 ~]$ df -Th
Filesystem     Type     Size Used Avail Use% Mounted on
devtmpfs       devtmpfs   94G     0   94G   0% /dev
tmpfs         tmpfs     94G     0   94G   0% /dev/shm
tmpfs         tmpfs     94G   18M   94G   1% /run
tmpfs         tmpfs     94G     0   94G   0% /sys/fs/cgroup
/dev/sda3     ext4      7.6G  2.6G  4.6G  36% /
/dev/sda2     ext4      2.0G 389M  1.5G  22% /boot
/dev/sda4     ext4      1.7T   60K  1.6T   1% /home/search
tmpfs         tmpfs     19G     0   19G   0% /run/user/0
tmpfs         tmpfs     19G     0   19G   0% /run/user/1006

[SME@search-10 ~]$ sudo fdisk -l
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda3     4198400 2101350399 2097152000 1000G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

由于是根分区,无法重新格式化,且重新通过分配之后,重启也无法获得扩展,如下所示:

[SME@search-10 ~]$ sudo fdisk /dev/sda

Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.


Command (m for help): p
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda3     4198400 2101350399 2097152000 1000G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

Command (m for help): d
Partition number (1-5, default 5): 3

Partition 3 has been deleted.

Command (m for help): p
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

Command (m for help): n
Partition number (3,6-128, default 3):
First sector (4198400-2101350399, default 4198400):
Last sector, +sectors or +size{K,M,G,T,P} (4198400-2101350399, default 2101350399):

Created a new partition 3 of type 'Linux filesystem' and of size 1000 GiB.
Partition #3 contains a ext4 signature.

Do you want to remove the signature? [Y]es/[N]o: Y

The signature will be removed by a write command.

Command (m for help): p
Disk /dev/sda: 2.6 TiB, 2876997894144 bytes, 5619136512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 262144 bytes / 786432 bytes
Disklabel type: gpt
Disk identifier: 40992439-8FB1-4EF3-AF5D-0B180C07EA05

Device         Start       End   Sectors Size Type
/dev/sda1        2048       4095       2048   1M BIOS boot
/dev/sda2        4096    4198399    4194304   2G Linux filesystem
/dev/sda3     4198400 2101350399 2097152000 1000G Linux filesystem
/dev/sda4  2101350400 5619003391 3517652992  1.7T Microsoft basic data
/dev/sda5  5619003392 5619136478     133087   65M Linux filesystem

Filesystem/RAID signature on partition 3 will be wiped.

Command (m for help): w
The partition table has been altered.
Syncing disks.

[SME@search-10 ~]$ sudo partprobe /dev/sda
Warning: The disk CHS geometry (11017914,255,2) reported by the operating system does not match the geometry stored on the disk label (22095,255,63).
Error: Can't have overlapping partitions.

于是,尝试使用resize2fs,如下所示:

[SME@search-10 ~]$ sudo resize2fs /dev/sda3
resize2fs 1.45.6 (20-Mar-2020)
Filesystem at /dev/sda3 is mounted on /; on-line resizing required
old_desc_blocks = 1, new_desc_blocks = 125
The filesystem on /dev/sda3 is now 262144000 (4k) blocks long.

[SME@search-10 ~]$ df -Th
Filesystem     Type     Size Used Avail Use% Mounted on
devtmpfs       devtmpfs   94G     0   94G   0% /dev
tmpfs         tmpfs     94G     0   94G   0% /dev/shm
tmpfs         tmpfs     94G   18M   94G   1% /run
tmpfs         tmpfs     94G     0   94G   0% /sys/fs/cgroup
/dev/sda3     ext4     985G  2.6G 942G   1% /
/dev/sda2     ext4      2.0G 389M  1.5G  22% /boot
/dev/sda4     ext4      1.7T   60K  1.6T   1% /home/search
tmpfs         tmpfs     19G     0   19G   0% /run/user/0

结果成功扩展了分区。

虽然在杭,但还是关注上海疫情,希望每个小伙伴们能够吃上新鲜的食材,以健康的身体坚持下去。

希望上海快点好起来。

疫情中的2022春

今年的COVID-19比往年来得更猛烈一些,呆在上海,哪也去不了,储备了一周的各种方便食品,准备应对未来的日子。

fedora35 安装 docker

fedora35 安装docker 之后,直接不能使用,需要root身份使用,如果是其它用户,需要将用户加入docker组当中:

sudo gpasswd -a $USER docker

newgrp docker

sudo systemctl restart docker.socket

sudo systemctl restart docker.service

docker images

这样就可使用其它用户操作dokcer命令啦!

我们可以去docker官方hub站点下载想要的镜像包:

# 下载centos7.9镜像

docker pull centos7.9.2009

# 下载centos8.4镜像

docker pull centos:8.4.2105

即可完成对应下载。

如果不知道对应版本,搜索一下centos,到达centos官方镜像站点,即可查看到对应tag。

Monthly Archives

Pages

Powered by Movable Type 7.9.4