Compilando a versão do kernel = 2.6.34 no CentOS 5: o conjunto de RAID “ddf1_foo” não foi ativado?

4

Eu quero montar um Ceph FS em alguns servidores CentOS 5. Como o ceph-fuse falhou com os erros abaixo:

# 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

O Google apontou isso , mas o CentOS 5.x fornecido com o kernel 2.6.18, eu vou compilar um kernel mais novo que suporta o Ceph.

O .config foi copiado do kernel em execução com 2 configurações adicionais:

CONFIG_SYSFS_DEPRECATED_V2=y
CONFIG_CEPH_FS=m

Mas os dois me deram o seguinte erro:

Oprimeiroavisopodeserremovidoeditandooscriptdeinicializaçãodepoisdeextrairaimagemdokerneleremover2linhas:

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

link

Como sobre o segundo erro:

device-mapper: table: 253:0: mirror: Error creating mirror dirty log
RAID set "ddf1_bar" was not activated

Eles são basicamente os mesmos, exceto que os seguintes módulos não são carregados no kernel mais novo:

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 

Este é o motivo para RAID set "ddf1_foo" was not activated ?

ATUALIZAÇÃO Qui Abr 4 21:40:32 ICT 2013

link

A strange error message similar to "mirror log: unrecognised sync argument to mirror log: 2", "table: mirror: Error creating mirror dirty log" means you have mismatched kernel device mapper and userspace tools versions: probably your kernel is too recent for your version of the lvm tools. Install the latest device mapper and lvm2 from sources, and it should work.

Eu tentei compilar a versão mais recente do 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

mas nada muda.

ATUALIZAÇÃO Sáb 6 de abril 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

ATUALIZAÇÃO Qua Abr 10 11:22:54 ICT 2013

Faça uma pesquisa na pasta de origem, eu encontrei isto:

# 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;
}
    
por quanta 04.04.2013 / 10:07

3 respostas

1

Graças a toda a ajuda do meu amigo, o problema está resolvido.

Na primeira tentativa, ele comentou a linha ti->error = "Error creating mirror dirty log"; no dm-raid1.c e inseriu algumas linhas de depuração em dm-log.c para determinar o que causou o erro acima:

    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;
    }

então recompilamos o kernel e conseguimos:

Nasegundatentativa,eledesejaobterovalordetype_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 != '
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;
        }
    }
') { *pTypeN = *ptype_name; ++pTypeN; ++ptype_name; } ti->error = typeN; return NULL; }

Continueorastreamentoparaocore_ctreocreate_log_contextusandoométodoacima:

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 != '
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 != '
# 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
') { if (*pCore != *ptype_name) { is_core = 0; } ++pCore; ++ptype_name; } if (is_core && *pCore == *ptype_name && argc == 3) { --argc; } type = get_type(type_name);
') { *pArgc = *pArgv; ++pArgc; ++pArgv; } *pArgc = ' '; ++pArgc; } *pArgc = '
    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;
    }
'; ti->error = argcStr; return -EINVAL; }

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 != '
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;
        }
    }
') { *pTypeN = *ptype_name; ++pTypeN; ++ptype_name; } ti->error = typeN; return NULL; }

ObservequeocódigoASCIIdosímbolodocoraçãopretoé...3.

Nãoseiporqueoautorestámisturandoocore_ctrcomodisk_ctr.Otype_nameécore,masonúmerodeargumentosé3,entãoeleaparaoúltimoargumento(block_on_error)inserindooseguintenodm_dirty_log_createstruct:

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 != '
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 != '
# 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
') { if (*pCore != *ptype_name) { is_core = 0; } ++pCore; ++ptype_name; } if (is_core && *pCore == *ptype_name && argc == 3) { --argc; } type = get_type(type_name);
') { *pArgc = *pArgv; ++pArgc; ++pArgv; } *pArgc = ' '; ++pArgc; } *pArgc = '%pre%'; ti->error = argcStr; return -EINVAL; }

Vamos ver o que acontece:

%pre%     
por 10.04.2013 / 19:17
1

Por que você está usando um array de RAID no formato ddf? Você parece estar tentando ativá-lo com dmraid , que não tem nenhum desenvolvimento há vários anos e é mais ou menos depreciado. mdadm é muito melhor suportado, e versões recentes suportam o formato ddf, embora seja preferível o formato nativo.

Certifique-se de ter carregado o módulo dm-log.

    
por 08.04.2013 / 17:30
0

De acordo com o bug do Ceph 4286 , o FUSE precisa pelo menos do kernel 2.6.24 para atomic_o_trunc. Eu encontrei um RPM para 2.6.25 . Este kernel parece ser para um cluster HPC.

Eu acho que o seu problema acima é devido à pesada modificação que a Red Hat faz com seus lançamentos de kernel. Isso faz com que a tentativa de novos kernels seja muito mais difícil, dependendo da sua configuração de hardware e requisitos de software.

    
por 08.04.2013 / 16:40