LINUX.ORG.RU

Сообщения cruz7

 

'install' возвращает input/output error

Форум — Admin

Приветствую,

Есть red hat enterprise Linux 6.3 ядро 2.6.32. Пытаюсь установить с помощью install из комплекта coreutils-8.4 бинарник, но получаю ошибку:

% install -m 4755 ./app /usr/local/bin/app
install: setting permissions for `/usr/local/bin/app': Input/output error

При этом файл копируется, но хотелось бы избавиться от этой ошибки. При этом ls выглядит вот так:

% ls -la /usr/local/bin/app
-rwxr-xr-x+ 1 adm sinadm 4225458 Nov 8  15:46  /usr/local/bin/app

Что означает плюсик после прав, acl или что-то еще? На другой системе (centos-5.6) плюсика нет и install ошибок не выдает. Может быть дело в конфигурации FS на RHEL-6.3 или это известный баг в coreutils?

Буду признателен за советы. Спасибо.

 , ,

cruz7
()

'struct super_operations' в ядре 2.6.32

Форум — Development

Приветствую,

Есть старый драйвер работавший долгое время на 2.6.9, а сейчас его нужно портировать на 2.6.32. Компиляция выявила немалое кол-во изменившихся структур и API, одна из них 'struct super_operations' сейчас там отсутствуют члены «put_inode» и «read_inode».

Как я понял функции put_inode и read_inode были объединены и вынесены в другой api? Но все-таки я не пришел к ясному пониманию как нужно переработать функциональность драйвера, чтобы он вписывался в новый api.

Буду признателен за советы, спасибо!

 , ,

cruz7
()

dualboot между Windows7 и CentOS6.4 (средствами grub)

Форум — Linux-install

Приветствую,

Есть один жесткий диск. Впервые устанавливаю две системы в dual-boot конфигурации. При установке CentOS6.4 разместил grub в загрузочной области linux партиции (не в MBR). Grub благополучно обнаружил Windows7 в другом разделе и добавил в grub.conf. Однако после ребута по-прежнему грузится Windows7. Погуглив, поставил на винду EasyBSD, теперь после рестарта управление получает EasyBCD, выбираю linux, управление переходит Грубу и оттуда уже грузится линукс, получается цепочка.

Но теперь я хотел бы избавиться от EasyBCD и все грузить с помощью груба. (Хотя сколько ни читал в сети, все рекомендуют ставить EasyBCD для связки Windows7-CentOS). Но я думаю, что сделав линукс партицию загрузочной (fdisk /dev/sda, и выбрать 'a' в меню), я смогу добиться своего — после рестарта, управление перейдет Грубу и далее выбираю нужную мне систему.

Я все правильно понимаю, или что-то упускаю и без easybcd никак? Буду признателен за советы!

 , ,

cruz7
()

обновить centos-5.9 до 6.x (желательно последней)

Форум — Linux-install

Здравствуйте, Безопасно ли обновить centos-5.9 до 6.x подправив /etc/yum.repos/*.repo на репозитории 6.x ? (Либо это некошерно и работать так не будет?)

Спасибо.

 ,

cruz7
()

rmmod возвращает EAGAIN (референсы на модуль)

Форум — Development

Приветствую,

достался в «наследство» сравнительно большое embedded проект (ARM процесор, linux 2.6.31, busybox), который нужно поддерживать. Столкнулся со следующей проблемой: ядерный модуль (часть этого проекта) всегда загружается первым, потом демон устанавливающий соединение по netlink сокету. Проблема в том, что после выгружения демона из памяти по SIGINT или SIGKILL, число референсов на этот модуль в ядре не 0 (cat /proc/net/modules | grep my_module, 3й параметр) и соответственно rmmod возвращает ошибку:

% rmmod my_module.ko
% rmmod: my_module.ko: Resource temporarily unavailable

Т.е. получаем -11 EAGAIN. Из кода демона известно, что открываются 3 netlink сокета в модуль и по таймеру один из сокетов регулярно читается, но после запуска демона число references в модуле (/proc/net/modules) поднимается с 0 до 6, после убийства демона опускается до 3, т.е. либо остаются открытые дескрипторы, либо что-то еще.

Подскажите, какие есть методы обнаружить и отловить такого рода баг?

Буду пременого благодарен! :)

 , ,

cruz7
()

настроить Catalyst C2900XL на определенную топологию

Форум — Admin

Приветствую,

раньше не доводилось настраивать циски, хотя игрался с другими коммутаторами с cisco-like коммандным интерфейсом и функционалом.

Исходные данные такие - три девайса подключены к трем портам свитча:

DEV1 на FastEthernet 0/1 DEV2 на FastEthernet 0/2 DEV2 на FastEthernet 0/3

нужно чтобы логически они выстроились в следующую топологию:

DEV1 --> DEV2 --> DEV3

т.е. DEV1 и DEV3 видят только DEV2, но не друг друга, DEV2 соотвественно видит обоих (ping dev1<->dev2 функционирует, dev1<->dev3 не должен). Трафик между девайсами должен быть нетегированным.

Мыслю, что порты FastEthernet 0/1 и FastEthernet 0/2 должны находиться в одной vlan, например vlan10, FastEthernet 0/2 и FastEthernet 0/3 в vlan20, но и FastEthernet 0/2 тогда нужно помесить в третью влан? Гм.. Или может быть проще фильтровать по MAC даресам? Как это делается на этом каталисте, каким командами?

Буду признателен за любые советы. Спасибо !

cruz7
()

место модуля в памяти системы

Форум — Development

Приветствую,

ядро 2.6.31.8 сконфигурировано с включенным CONFIG_VMSPLIT_3G, т.е. 1G под ядерную память и 3G под юзер спейс — соответственно ядро занимает пространство 0xc0000000 - 0xffffffff, а пользовательские процессы живут в диапазоне 0x00000000 - 0xbfffffff.

Тем не менее:

# cat /sys/module/mydrv/sections/.data
0xbf00b4f4
# cat /sys/module/mydrv/sections/.text
0xbf006000

Не понимаю как получается что ядерный модуль оказался загружен по user space адресам? Я предполагал, что модуль после insmod должен стать частью ядра и жить в ядерном пространстве.

Возможно я ошибаюсь — просьба просветить и поправить. Спасибо!

 ,

cruz7
()

портиться указатель в net_device

Форум — Development

Приветствую,

работаю над модулем реализующим виртуальный девайс для определенной задачи. Ядро 2.6.31.8, платформа MIPS.

Логика следующая:

static struct net_device_ops virt_net_ops = {
  .ndo_init = virt_net_init,
  .ndo_open = virt_net_open,
  .ndo_stop = virt_net_stop,
  .ndo_do_ioctl = virt_net_ioctl,
  .ndo_get_stats    = virt_net_get_stats,
  .ndo_start_xmit   = virt_net_start_xmit,
};

...

  struct net_device *dev;
  struct my_dev *virt;

  dev = alloc_netdev(..);
  /* check for NULL */

  virt = netdev_priv(dev);

  dev->netdev_ops = &virt_net_ops;
  SET_ETHTOOL_OPS(dev, &virt_ethtool_ops);
  dev_net_set(dev, net);
  virt->magic = MY_VIRT_DEV_MAGIC;
  ret = register_netdev(dev);
  if (ret) {
     printk("register_netdev failed\n");
     free_netdev(dev);
     return ret;
  }

Устройства создается по получении сообщения из user-space через netlink сокеты. Однако, я наблюдаю что указатель net_device_ops в 'net_dev' каким-то образом меняется, т.е.

1) создаем девайс (аллоцировали net_dev, проинициализировали поля включая net_device_ops, который указывает на static структуру в этом же модуле), регистрируем девайс register_netdev() - все OK.

2) пытаемся создать устройство с этим же именем вторично, повторяем все те же шаги, вызываем register_netdev() который возвращает ошибку, делаем free_netdev(dev) и возвращаем ошибку пользовательскому процессу.

Где-то между этим двумя событиями указатель net_device_ops в первой структуре 'net_dev' сменился, хотя все остальные поля остались нетронутыми. Нигде в моем коде я напрямую не манипулирую с net_device_ops, кроме этапа создания девайса.

Есть ли какие-то предположения, где возможна ошибка и как ее искать? Есть ли какие-то ядерные средства отслеживания подобных ситуаций? (например, отслеживать состояние и обращения к девайсам зарегистрированных в ядре?).

Буду признателен за советы. Спасибо.

 ,

cruz7
()

Stale NFS file handle

Форум — Admin

Приветствую,

имеется в наличии box с установленным Wind River Linux release 3.0.2, ядро 2.6.27.39. Видимо (пока не уверен на 100%) после некорректного выключения по причине пропадания питания, на файловой системе остались файлы которые теперь не могу удалить, файловая система ext2fs:

root@localhost:~# ls -la /var/run/
ls: cannot access /var/run/ntpd.pid: Stale NFS file handle
ls: cannot access /var/run/imi.pid: Stale NFS file handle
ls: cannot access /var/run/nsm.pid: Stale NFS file handle
ls: cannot access /var/run/mstp.pid: Stale NFS file handle
ls: cannot access /var/run/auth.pid: Stale NFS file handle
ls: cannot access /var/run/onm.pid: Stale NFS file handle
ls: cannot access /var/run/lacp.pid: Stale NFS file handle
total 80
...
-?????????  ? ?     ?        ?            ? auth.pid
-?????????  ? ?     ?        ?            ? imi.pid
...
root@localhost:~# rm -f /var/run/nsm.pid
rm: cannot remove `/var/run/nsm.pid': Stale NFS file handle
root@localhost:~#

Причем эта ФС не была расшарена по NFS. Что посоветуете сделать в такой ситуации? Спасибо.

cruz7
()

/etc/* и где размещать настройки.

Форум — Admin

Приветствую,

пользуюсь дистрибутивом debian. В каких конфигурационных файлах «кошерно» размещать глобальные для всех пользователнй настройки как например:

ulimit -c unlimited echo 1 >/proc/sys/kernel/core_uses_pid ??

Можно и в /etc/profile, но наверное есть более правильный способ. Спасибо.

cruz7
()

вопрос по AVL дереву

Форум — Development

Всем привет,

Собственно имеется большая написанная давно на С система IP маршрутизации. Один из ее элементов — быстрый поиск IP адресов, для этого активно пользуются AVL деревья.

struct avl_node
{
   struct avl_node *left;
   struct avl_node *right;
   ...
   void *info; /* содержит указатель на структуру описывающую IP адрес etc. */
}

Далее, в дереве хранятся структуры описывающие следующий в маршруте узел (nexthop) - адрес узла, выходной интерфейс и т.д. Вот так сделано сейчас :

struct nhlfe_entry
{
  u_int32_t nhlfe_ix;
  u_char opcode;
  ...
  struct nhlfe_key key;
}

struct nhlfe_key
{
  struct in_addr nh_addr;
  u_int32_t oif_ix;
  u_int32_t out_label;
}

Поиск по этому дереву делается по ключу типа 'struct nhlfe_key', т.е. в avl дереве ф-ция компаратор выглядит примерно так:

static int
mpls_cmp_nhlfe_ipv4_key (void *data1, void* data2)
{
   struct nhlfe_entry *nh1, *nh2;
   struct nhlfe_key *key1, *key2;
   int ret;

   nh1 = (struct nhlfe_entry *) data1;
   nh2 = (struct nhlfe_entry *) data2;

   key1 = (struct nhlfe_key *) nh1->nkey;
   key2 = (struct nhlfe_key *) nh2->nkey;

   ret = memcmp (&key1->nh_addr, &key2->nh_addr, sizeof (struct in_addr));
   if (ret != 0)
     return ret;

   if (key1->oif_ix > key2->oif_ix)
     return 1;
   else if (key1->oif_ix < key2->oif_ix)
     return -1;

   if (key1->out_label > key2->out_label)
     return 1;
   else if (key1->out_label < key2->out_label)
     return -1;

   return 0;
}

Т.е. ключ как бы составной и критерий сравнения лексикографический -- все элементы должны совпасть.

Теперь — в struct nhlfe_entry добавляется поддержка многих next-hop'ов, т.е. будет список из struct nhlfe_key:

struct nhlfe_entry
{
  u_int32_t nhlfe_ix;
  u_char opcode;
  ...
  struct list *nhkey_list;
}

Каждый элемент 'struct list' это struct listnode который имеет 'void *data' на собственно данные, и это будет struct nhlfe_key.

И вот теперь возникает вопрос — по какому ключу хранить/искать элементы в дерево? При добавлении нового элемента в список nexthop-ов, нужно ли перестраивать дерево, ведь вероятно ключ поменяется, что произойдет с деревом?

Спасибо !

cruz7
()

скорость на 1G NIC (Broadcom Tigon3 bcm57780)

Форум — Linux-hardware

Приветствую,

пытаюсь генерировать траффик средствами pktgen (ядерный трафикогенератор), но скорость судя по 'cat /proc/net/pktgen/eth1' мала для этой карточки - 521398pps. Генерирую флад из миллиона мелких пакетов по 64байта.

Система Ubuntu 10.04.2, ядро 2.6.32, драйвер из поставки ядраю Что еще покрутить, чтобы увеличить скорость?

Спасибо.

cruz7
()

[Expect] получить exit code команды

Форум — Development

Приветствую,

Есть expect-скрипт, вызываемый из баш-скрипта. Expect делает spawn удаленной ssh-сессии и выполняет удаленную команду. Мне необходимо получить результат выполнения той команды, т.е. то что возвращается по «exit $?».

Вот сами скриптики и некоторый костыль, который делает то что мне нужно, но IMHO должно быть более красивое решение и кроме того, я бы хотел обрабатывать exit code в шелл-скрипте:

# !/bin/sh
expect -f remote.exp 192.168.1.100 user pass 10.10.10.1
#!/usr/bin/expect

set timeout 20
set box [lindex $argv 0]
set user [lindex $argv 1]
set password [lindex $argv 2]
set target [lindex $argv 3]

spawn ssh -l $user $box

expect "*password:"
send "$password\r\n"

expect "*#"
send "ping -c1 $target\r\n"
expect "*#"

send "echo $?\r"
expect {
  "0\r" { puts "Test passed."; }
  timeout { puts "Test failed."; }
}

expect "*#"

Буду признатален за советы! Спасибо.

 

cruz7
()

помогите разобраться с макросом

Форум — Development
#define ALIGNTO 4
#define ALIGN(len) ( ((len)+ALIGNTO-1) & ~(ALIGNTO-1) )

Как я понимаю, результатом ALIGN является число кратное ALIGNTO. Непонятна только математика процесса, никак не могу въехать. Если с первой частью выражения более-менее ясно, то вот со второй не очень (вроде бы служит для отбрасывания младших битиков, но зачем?)

Буду признателен за снятие с ручника :)

PS. вообще данный метод является ли типичным при выравниваниях по нужной границе?

cruz7
()

kernel BUG at page_alloc.c

Форум — Development

Догадываюсь, что причин может быть много, но все же — есть какие-то общие предположения, почему сие может происходить:

<2>kernel BUG at page_alloc.c:116!

This architecture does not implement dump_stack()

Kernel panic: Kernel Bug

In interrupt handler - not syncing

<0>Rebooting in 5 seconds..

Очевидно, что-то плохое произошло при обработке прерывания, может ли это быть багнутое железо, или данные симптомы скорее указывают на больше софтверную проблему?

Изучение page_alloc.c на строке 116 показало следующее:

static void __free_pages_ok (struct page *page, unsigned int order)
{
    ...
    if (current->flags & PF_FREE_PAGES)
        goto local_freelist;
 back_local_freelist:

    zone = page_zone(page);
    /* строка 116 здесь */
    mask = (~0UL) << order;
    ...
}

arm9 MMU-less системе, uclinux 2.4.20

Буду премного благодарен за предположения.

cruz7
()

получить указатель на ARP из sk_buff

Форум — Development

Всем привет.

Ядро 2.4.20, встроенный линукс. В своем драйвере необходимо получить доступ к ARP заголовку, включая поля с MAC-адресами. Заглянул в include/linux/if_arp.h, но там в структуре arphdr как раз закоментарены эти поля (видимо потому, что размер аппаратных адресов может варьироваться в зависимости от технологии). Тогда попытался сделать так: определил в своем коде arp-вструктур:

struct arp_hdr
{
  // все поля из include/linux/if_arp.h
  // и добавляем нужное
  unsigned char       ar_sha[ETH_ALEN];
  unsigned char       ar_sip[4];
  unsigned char       ar_tha[ETH_ALEN];
  unsigned char       ar_tip[4];
}

int my_func(struct sk_buff *skb)
{
   struct aro_hdr *arph;

   arph = (struct arp_hdr *)skb->nh.raw;

   // здесь распечатываю содержимое arp пакета, но получаю мусор.
}

Почему я получаю мусор и как правильно сделать то, что мне нужно?

Заранее спасибо!

cruz7
()

[embedded] перехват и обработка пакета в ядре

Форум — Development

Приветствую,

есть код драйвера ethernet свитча, который необходимо сопровождать (комментариев и документации нет, ниже русские комментарии мои). Там есть следующий фрагмент в bottom-half обработчика прерываний, который мне не до конца понятен:

struct sk_buff *skb;

/* pktbuf это указатель на собственную структуру, описывающую
 хранимый в буферной памяти свитча пришедший фрейм */
struct pkt_buffer *pktbuf;

/* здесь берем пакет посредством DMA */
pktbuf = dmaGetPacket(...);

while (pktbuf) {
  pkt_type = classifyPacket(pktbuf);

  skb = dev_alloc_skb(pkt_len + 2);
  skb_reserve(skb, 2);  /* align IP in 16 byte */
  memcpy(skb_put(skb, pkt_len), pktbuf->eth[2], pkt_len);

  /* т.е. теперь skb содержит принятый фрейм:
     ethernet заголовок + поле тип пакета + payload */

  switch (pkt_type) {
    case (DHCP):  pktProcess_dhcp(skb, ...); break;
    case (IGMP):  pktProcess_igmp(skb, ...); break;
    /* pktProcess_*() определяют на какие порты форвардить фреймы и вообще что с ними делать */
    ...
    default:
         skb->protocol = eth_type_trans(skb, netdev);
         netif_rx(SKB);
         netdev->last_rx = jiffies;
  }
  ...

  pktbuf = dmaGetNext(...);
}

Все выглядит стройно, кроме того, что в ряде некоторых случаев, в зависимости от типа пакета, создается копия skb и уже эта копия передается в pktProcess_*(). Непонятно — с какой целью это делается, ведь выше по стеку, как я понимаю, отловленные пакеты не уходят (кроме тех, что попадают в ветку default).

 

cruz7
()

[CVS] unlock files

Форум — Development

Во время коммита файлов в репозиторий отвалилась сеть, при последующем логине выяснилось, что «cvs commit» по-прежнему в памяти. Я его прибил, но теперь все файлы (или ветки?) проекта в /cvs/my_project (это репозиторий) заблокированы и любая попытка заново сделать «cvs commit» обламывается:


cvs commit: [05:36:42] waiting for me's lock in /cvs/my_project


Локи вида #cvs.lock (это директория), и #cvs.wfl.rnd.123 (это файлы).

Как можно побороть разрешить данный неприятный инцидент с наименьшими потерями ?


Спасибо!

 

cruz7
()

Треды и segfault

Форум — Development

Есть код демона, который вынужден сопровождать. Внезапно, как и всегда бывает, демон стал падать по segfault. Выяснилось место появления segmentatin fault, структура кода такая:

int g_finished;

static void *thr1(void *data)
{
    while (!g_finished) {
     ...
    }

    return NULL;
}

static void *thr2(void *data)
{
    while (!g_finished) {
     ...
    }

    return NULL;
}

static void *thr3(void *data)
{
    while (!g_finished) {
    ...
    }

    return NULL;
}

static void *thr4(void *data)
{
    InitPollingJob();

    while (!g_finished) {
    ...
    }

    return NULL;
}

int main(void)
{
    pthread_create(&tid1, NULL, &thr1, NULL);
    pthread_create(&tid2, NULL, &thr2, NULL);
    pthread_create(&tid3, NULL, &thr3, NULL);
    ...

    pthread_create(&tid4, NULL, &thr4, NULL);
    ...

    while (! g_finished) {  /* точка segmentation fault */
      ....
    }

    return 0;
}

Переменная g_finished нигде не защищена мьютексами. Возможно ли что приложение падает именно по этой причине? Но тогда как оно работало продолжительное время без проблем?

cruz7
()

[embedded] поллинг файлового дескриптора

Форум — Development

Приветствую,

на mips платформе работает линукс 2.6. От производителя чипа имеется библиотека для работы с gpio (открыть /dev/gpio, читать/писать пины). Понадобилось написать небольшое приложение для поллинга gpio, а точнее кнопки повешенной на пин.

Выбрал следующий классическйи подход:

int gpio_fd;
fd_set rfds;

gpio_fd = gpio_open("/dev/gpio");

while (1) {
    FD_ZERO(&rfds);
    FD_SET(gpio_fd, &rfds);

    if (select(gpio_fd + 1, &rfds, NULL, NULL, NULL) > 0) {
        if (FD_ISSET(gpio_fd, &rfds)) {
            /* read pins and similar ... */
        }
    }
}

Но проблема в том, что запущенная в фоне программа потребляет 98% CPU. Посмотрел в сорцы драйвера gpio, обнаружил что там не реализован 'poll'. Собственно меня интересует - намеренно ли этот метод не написали (IMHO ведь в отличии, например, от сокета, gpio файловый дескриптор всегда готов) или забыли, и мне стоит его допилить и тогда настанет счастье?

Будет признателен за советы.

 

cruz7
()

RSS подписка на новые темы