AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 496017
Accepted
quanta
quanta
Asked: 2013-04-05 00:07:11 +0800 CST2013-04-05 00:07:11 +0800 CST 2013-04-05 00:07:11 +0800 CST

在 CentOS 5 上编译内核版本 >= 2.6.34:RAID 集“ddf1_foo”未激活?

  • 772

我想在某些 CentOS 5 服务器上安装 Ceph FS 。由于ceph-fuse失败并出现以下错误:

# ceph-fuse --no-fuse-big-writes -m 192.168.2.15:6789 /mnt/ceph/
ceph-fuse[7528]: starting ceph client
ceph-fuse[7528]: starting fuse
fuse: unknown option `atomic_o_trunc'
2013-04-04 13:51:21.128506 2b82d6e9e8f0 -1 fuse_lowlevel_new failed
ceph-fuse[7528]: fuse finished with error 33
ceph-fuse[7526]: mount failed: (33) Numerical argument out of domain

Google 指出了这一点,但 CentOS 5.x 随内核 2.6.18 一起提供,我将编译一个支持 Ceph 的更新内核。

  • 我的第一次尝试是使用来自 ELRepo 的kernel-lt 3.0.71
  • 第二个是来自 kernel.org的2.6.34.14

是从运行的.config内核中复制的,带有 2 个附加设置:

CONFIG_SYSFS_DEPRECATED_V2=y
CONFIG_CEPH_FS=m

但他们都给我以下错误:

在此处输入图像描述

在提取内核映像并删除 2 行后,可以通过编辑初始化脚本来消除第一个警告:

echo "Loading dm-region-hash.ko module"
insmod /lib/dm-region-hash.ko 

http://funky-dennis.livejournal.com/3290.html

第二个错误怎么样:

device-mapper: table: 253:0: mirror: Error creating mirror dirty log
RAID set "ddf1_bar" was not activated
  • 2.6.18 的初始化脚本: http: //fpaste.org/byZ3/
  • 2.6.34.14 的:http ://fpaste.org/8COr/

除了以下模块没有加载到较新的内核之外,它们大部分是相同的:

echo "Loading dm-mem-cache.ko module"
insmod /lib/dm-mem-cache.ko 
echo "Loading dm-message.ko module"
insmod /lib/dm-message.ko 
echo "Loading dm-raid45.ko module"
insmod /lib/dm-raid45.ko 

是这个原因RAID set "ddf1_foo" was not activated吗?


更新 4 月 4 日星期四 21:40:32 ICT 2013

http://alistairphipps.com/wiki/index.php?title=Notes#LVM

类似于“镜像日志:镜像日志无法识别的同步参数:2”,“表:镜像:创建镜像脏日志时出错”的奇怪错误消息意味着您的内核设备映射器和用户空间工具版本不匹配:可能您的内核太新了你的 lvm 工具版本。从源安装最新的设备映射器和 lvm2,它应该可以工作。

我试图编译最新版本的LVM2:

# /usr/sbin/lvm version
  LVM version:     2.02.98(2) (2012-10-15)
  Library version: 1.02.67-RHEL5 (2011-10-14)
  Driver version:  4.11.6

但没有任何改变。


更新 4 月 6 日星期六 18:51:31 ICT 2013

/lib/modules/2.6.18-274.el5/kernel/drivers/md/

|-- dm-crypt.ko
|-- dm-emc.ko
|-- dm-hp-sw.ko
|-- dm-log.ko
|-- dm-mem-cache.ko
|-- dm-message.ko
|-- dm-mirror.ko
|-- dm-mod.ko
|-- dm-multipath.ko
|-- dm-raid45.ko
|-- dm-rdac.ko
|-- dm-region_hash.ko
|-- dm-round-robin.ko
|-- dm-snapshot.ko
|-- dm-zero.ko
|-- faulty.ko
|-- linear.ko
|-- multipath.ko
|-- raid0.ko
|-- raid1.ko
|-- raid10.ko
|-- raid456.ko
`-- xor.ko

/lib/modules/2.6.34.14/kernel/drivers/md/

|-- dm-crypt.ko
|-- dm-log.ko
|-- dm-mirror.ko
|-- dm-mod.ko
|-- dm-multipath.ko
|-- dm-region-hash.ko
|-- dm-round-robin.ko
|-- dm-snapshot.ko
|-- dm-zero.ko
|-- faulty.ko
|-- linear.ko
|-- multipath.ko
|-- raid0.ko
|-- raid1.ko
|-- raid10.ko
|-- raid456.ko
`-- raid6_pq.ko

更新 4 月 10 日星期三 11:22:54 ICT 2013

在源文件夹中搜索,我找到了这个:

# grep -lr 'Error creating mirror dirty log' /usr/src/linux-2.6.34.14
/usr/src/linux-2.6.34.14/drivers/md/dm-raid1.c

dm-raid1.c:

static struct dm_dirty_log *create_dirty_log(struct dm_target *ti,
                         unsigned argc, char **argv,
                         unsigned *args_used)
{
    unsigned param_count;
    struct dm_dirty_log *dl;

    if (argc < 2) {
        ti->error = "Insufficient mirror log arguments";
        return NULL;
    }

    if (sscanf(argv[1], "%u", &param_count) != 1) {
        ti->error = "Invalid mirror log argument count";
        return NULL;
    }

    *args_used = 2 + param_count;

    if (argc < *args_used) {
        ti->error = "Insufficient mirror log arguments";
        return NULL;
    }

    dl = dm_dirty_log_create(argv[0], ti, mirror_flush, param_count,
                 argv + 2);
    if (!dl) {
        ti->error = "Error creating mirror dirty log";
        return NULL;
    }

    return dl;
}

dm-log.c:

struct dm_dirty_log *dm_dirty_log_create(const char *type_name,
            struct dm_target *ti,
            int (*flush_callback_fn)(struct dm_target *ti),
            unsigned int argc, char **argv)
{
    struct dm_dirty_log_type *type;
    struct dm_dirty_log *log;

    log = kmalloc(sizeof(*log), GFP_KERNEL);
    if (!log)
        return NULL;

    type = get_type(type_name);
    if (!type) {
        kfree(log);
        return NULL;
    }

    log->flush_callback_fn = flush_callback_fn;
    log->type = type;
    if (type->ctr(log, ti, argc, argv)) {
        kfree(log);
        put_type(type);
        return NULL;
    }

    return log;
}
centos
  • 3 3 个回答
  • 1241 Views

3 个回答

  • Voted
  1. psusi
    2013-04-09T07:30:59+08:002013-04-09T07:30:59+08:00

    你为什么首先使用 ddf 格式的 raid 阵列?您似乎正试图用 激活它dmraid,它已经好几年没有任何发展,而且或多或少已经贬值了。 mdadm得到更好的支持,最近的版本确实支持 ddf 格式,尽管它的本机格式是首选。

    确保你已经加载了 dm-log 模块。

    • 1
  2. Best Answer
    quanta
    2013-04-11T09:17:28+08:002013-04-11T09:17:28+08:00

    感谢所有朋友的帮助,问题解决了。

    在第一次尝试时,他注释掉了 中的行ti->error = "Error creating mirror dirty log";,dm-raid1.c并插入了一些调试行dm-log.c以确定导致上述错误的原因:

        log = kmalloc(sizeof(*log), GFP_KERNEL);
        if (!log)
            ti->error = "kmalloc error";
            return NULL;
    
        type = get_type(type_name);
        if (!type) {
            kfree(log);
            ti->error = "get_type error";
            return NULL;
        }
    
        log->flush_callback_fn = flush_callback_fn;
        log->type = type;
        if (type->ctr(log, ti, argc, argv)) {
            kfree(log);
            put_type(type);
            ti->error = "ctr error";
            return NULL;
        }
    

    然后重新编译内核,我们得到:

    在此处输入图像描述

    在第二次尝试中,他想获得 的值type_name:

    if (type->ctr(log, ti, argc, argv)) {
        kfree(log);
        put_type(type);
        char* typeN = kmalloc(1000, GFP_KERNEL);
        char* pTypeN = typeN;
        char* ptype_name = type_name;
        while (*ptype_name != '\0') {
            *pTypeN = *ptype_name;
            ++pTypeN;
            ++ptype_name;
        }
        ti->error = typeN;
        return NULL;
    }
    

    在此处输入图像描述

    使用上述方法继续跟踪到core_ctr和:create_log_context

    static int create_log_context(struct dm_dirty_log *log, struct dm_target *ti,
                      unsigned int argc, char **argv,
                      struct dm_dev *dev)
    {
        enum sync sync = DEFAULTSYNC;
    
        struct log_c *lc;
        uint32_t region_size;
        unsigned int region_count;
        size_t bitset_size, buf_size;
        int r;
    
        if (argc < 1 || argc > 2) {
            DMWARN("wrong number of arguments to dirty region log");
            ti->error = "argc < 1 or > 2";
            return -EINVAL;
        }
    
        if (argc > 1) {
            if (!strcmp(argv[1], "sync"))
                sync = FORCESYNC;
            else if (!strcmp(argv[1], "nosync"))
                sync = NOSYNC;
            else {
                DMWARN("unrecognised sync argument to "
                       "dirty region log: %s", argv[1]);
                ti->error = "unrecognised sync argument to";
                return -EINVAL;
            }
        }
    

    在此处输入图像描述

    if (argc < 1 || argc > 2) {
        DMWARN("wrong number of arguments to dirty region log");
        char* argcStr = kmalloc(1000, GFP_KERNEL);
        char* pArgc = argcStr;
        unsigned int temp = argc;
        do {
            *pArgc = temp % 10;
            ++pArgc;
            temp = temp / 10;
        } while (temp > 0);
        *pArgc = ' ';
        ++pArgc;
        //copy argv;
        int i = 0;
        for (i; i < argc; ++i) {
            char* pArgv = argv[i];
            while (*pArgv != '\0') {
                *pArgc = *pArgv;
                ++pArgc;
                ++pArgv;
            }
            *pArgc = ' ';
            ++pArgc;
        }
        *pArgc = '\0';
        ti->error = argcStr;
        return -EINVAL;
    }
    

    在此处输入图像描述

    请注意,黑心符号的 ASCII 码是... 3。

    不知道作者为什么把 和 混core_ctr在一起disk_ctr。但是参数的数量type_name是3,所以他通过将以下内容插入到结构中来core修剪最后一个参数 ( ):block_on_errordm_dirty_log_create

    struct dm_dirty_log *dm_dirty_log_create(const char *type_name,
                struct dm_target *ti,
                int (*flush_callback_fn)(struct dm_target *ti),
                unsigned int argc, char **argv)
    {
        struct dm_dirty_log_type *type;
        struct dm_dirty_log *log;
    
        log = kmalloc(sizeof(*log), GFP_KERNEL);
        if (!log) {
            ti->error = "kmalloc error";
            return NULL;
        }
    
        char* core = "core";
        char* pCore = core;
        int is_core = 1;
    
        char* ptype_name = type_name;
        while (*ptype_name != '\0') {
            if (*pCore != *ptype_name) {
                is_core = 0;
            }
            ++pCore;
            ++ptype_name;
        }
    
        if (is_core && *pCore == *ptype_name && argc == 3) {
            --argc;
        }
        type = get_type(type_name);
    

    让我们看看发生了什么:

    # uname -r
    2.6.34.14
    
    # dmraid -s
    *** Group superset .ddf1_disks
    --> Active Subset
    name   : ddf1_VCBOOT
    size   : 489971712
    stride : 128
    type   : mirror
    status : ok
    subsets: 0
    devs   : 2
    spares : 0
    
    # modprobe ceph
    
    # lsmod | grep ceph
    ceph                  176676  0 
    
    # df -h
    Filesystem            Size  Used Avail Use% Mounted on
    /dev/mapper/ddf1_VCBOOTp3
                          219G   17G  191G   8% /
    /dev/mapper/ddf1_VCBOOTp1
                           99M   64M   30M  69% /boot
    tmpfs                  48G   16M   48G   1% /dev/shm
    192.168.2.13:6789,192.168.2.14:6789,192.168.2.15:6789:/
                           72T   28T   45T  39% /mnt/ceph
    
    • 1
  3. Jeff Strunk
    2013-04-09T06:40:10+08:002013-04-09T06:40:10+08:00

    根据 Ceph 错误4286,FUSE 至少需要 2.6.24 内核才能使用 atomic_o_trunc。我找到了2.6.25 的 RPM。该内核似乎适用于 HPC 集群。

    我认为您的上述问题是由于 Red Hat 对其内核版本进行了大量修改。根据您的硬件配置和软件要求,它使尝试更新的内核变得更加困难。

    • 0

相关问题

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 使用 crontab 和 /etc/cron.hourly,daily,weekly 的区别

  • 持续监控许多服务器运行状况的简单方法?

  • Hudson 无法在 tomcat5 中启动

  • CentOS 的依赖挑战

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve