LINUX.ORG.RU

Сообщения cruz7

 

Yocto: do_rootfs не находит пакет который я собираю

Форум — Development

Пытаюсь добавить новый пакет intel-cmt-cat (доступен на https://github.com/intel/intel-cmt-cat) посредством Yocto. Там «старый добрый» Makefile, не cmake. Посмотрел примеры и написал вот такой рецепт:

% cat intel-cmt-cat_4.1.0.bb
SUMMARY = "Short summary"
DESCRIPTION = "Short description."
LICENSE = "BSD"
LIC_FILES_CHKSUM = "file://LICENSE;md5=c63eb1250e8724441150d665efe12012"

SRC_URI = "git://github.com/intel/intel-cmt-cat.git;protocol=https"
SRCREV = "30fadea5cb82ff99f56e46172c7d20fdb24b2338"
S = "${WORKDIR}/git"

По идее должно сразу работать, однако ни фига:

NOTE: Executing SetScene Tasks
NOTE: Executing RunQueue Tasks
ERROR: myimage-1.0-r0 do_rootfs: Could not invoke dnf.

dnf -v --rpmverbosity=info -y -c dnf.conf package1 package2 ... intel-cmt-cat
...
repo: using cache for: oe-repo
not found other for:
not found modules for:
not found deltainfo for:
not found updateinfo for:
oe-repo: using metadata from Thu 04 Mar 2021 07:12:38 PM UTC.
No module defaults found
No match for argument: intel-cmt-cat
Error: Unable to find a match

...
ERROR: Function failed: do_rootfs

(Я сократил длинную dnf команду).

Похоже на то, что обламвается do_rootfs(). Проверил директорию в которой все собирается ($WORKDIR/git), видно что исходники быди стянуты с github'a и собраны. Однако на последнем этапе схлопывается: по какой-то причине не может найти мой пакет.

Что я делаю не так? Что еще нужно добавить в рецепт?

ОБНОВЛЕНИЕ

Немного доработал рецепт, сейчас все собирается и устанавливается в финальный имидж. Осталась только проблема с man-страницами. По умолчанию (make install) они также устанавливаются в $PREFIX/man/man8 (так определено в Makefile в исходниках). Можно ли как-то запретить устанавливать man файлы на этапе do_install или do_package?

% cat intel-cmt-cat_4.1.0.bb
SUMMARY = "Short summary"
DESCRIPTION = "Short description."
LICENSE = "BSD"
LIC_FILES_CHKSUM = "file://LICENSE;md5=c63eb1250e8724441150d665efe12012"

SRC_URI = "git://github.com/intel/intel-cmt-cat.git;protocol=https"
SRCREV = "30fadea5cb82ff99f56e46172c7d20fdb24b2338"

S = "${WORKDIR}/git"
TARGET_CC_ARCH += "${LDFLAGS}"

do_compile() {
   oe_runmake PREFIX=/usr
}

do_install() {
   oe_runmake PREFIX=${D}/usr NOLDCONFIG=y install
}

INSANE_SKIP_${PN} += "already-stripped installed-vs-shipped"
FILES_${PN} += "${libdir}/libpqos* ${bindir}/pqos* ${bindir}/rdtset"}
FILES_${PN}-doc = "/usr/man/man8"

 ,

cruz7
()

не получается выставить параметры частоты CPU на процессоре AMD Epyc

Форум — General

Имеетя машина с процессором AMD Epyc 7702P, ядро 4.19.71 (староватое, но менять не могу). Пытаюсь выставить настройки частоты с помощью cpupower:

# cpupower frequency-set -g performance
    Setting cpu: 0
    Error setting new values. Common errors:
    - Do you have proper administration rights? (super-user?)
    - Is the governor you requested available and modprobed?
    - Trying to set an invalid policy?
    - Trying to set a specific frequency, but userspace governor is not available,
       for example because of hardware which cannot be set to a specific frequency
       or because the userspace governor isn't loaded?
#

Начинаю разбираться:

# cpupower frequency-info
analyzing CPU 0:
  no or unknown cpufreq driver is active on this CPU
  CPUs which run at the same hardware frequency: Not Available
  CPUs which need to have their frequency coordinated by software: Not Available
  maximum transition latency:  Cannot determine or is not supported.
Not Available
  available cpufreq governors: Not Available
  Unable to determine current policy
  current CPU frequency: Unable to call hardware
  current CPU frequency:  Unable to call to kernel
  boost state support:
    Supported: yes
    Active: yes
    Boost States: 0
    Total States: 3
    Pstate-P0:  2000MHz
    Pstate-P1:  1800MHz
    Pstate-P2:  1500MHz
#

Кроме того:

# ls /sys/devices/system/cpu/cpufreq/
<пусто>

Непонятно, почему отсутствуют cpufreq драйвера

Конфиг ядра имеет:

CONFIG_CPU_FREQ=y
CONFIG_X86_ACPI_CPUFREQ=y
CONFIG_X86_ACPI_CPUFREQ_CPB=y
CONFIG_X86_INTEL_PSTATE=y
CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_PERFORMANCE=y
CONFIG_CPU_FREQ_GOV_ONDEMAND=y

Пробовал отключать CONFIG_X86_INTEL_PSTATE, добавлять CONFIG_X86_POWERNOW_K8 (единственный относящийся к AMD), но не помогло.

Временно обновил ядро до 5.4.0. Немного подебажил драйвера drivers/cpufreq/cpufreq.c and drivers/cpufreq/acpi-cpufreq.c и выяснилось, что драйвер acpi-cpufreq при попытке инициализации на процессоре возвращает ошибку -EIO и сообщение:

ACPI-based processor performance control unavailable

Конкретнее, цепочка функций следующая:

cpufreq_add_dev()
  -> cpufreq_online(cpu)
        -> cpufreq_driver->init()  [*]

[*]
acpi_cpufreq_cpu_init()
   -> acpi_processor_register_performance()
         -> acpi_processor_get_performance_info()
             <return -EIO>

Насколько я понимаю, acpi_processor_get_performance_info() пытается читать _PCT объект из ACPI таблицы и обламывается, ибо не может найти.

Означает ли это, что в БИОСе нет полной поддержки ACPI, или нужно обновить микрокод на процессоре, или таки что-то отсутствует в ядре?

 , ,

cruz7
()

gnus: davmail для приема почты с Outlook сервера по IMAP

Форум — Desktop

Пытаюсь настроить gnus для приема почты по IMAP с outlook сервера. Много читал в сети, что подружить gnus напрямую с Outlook по IMAP не получится, нужен davmail-шлюз. Так ли это на самом деле? У кого есть положительный опыт?

Установил davmail-5.5.1-trunk на CentOS, davmail поддерживает два режима работы – workstation и server. Несколько базовых вопросов:

  1. Мне нужно настрооить подключение только одного mail-клиента через DavMail к Outlook. Т.е. мне нужна workstation конфигурация davmail?

  2. Означает ли это, что в workstation-режиме DavMail может работать только как GUI приложение? Или же можно запускать как фоновый процесс через systemd?

  3. Почитал про настройку davmail на https://www.digitalocean.com/community/tutorials/how-to-setup-davmail-on-centos-6#basic-configuration там генерируют SSL сертификаты, но это как я понимаю нужно только для server-mode DavMail? (в workstation-режиме никаких серфтификатов не нужно, ведь все локально)

Спасибо.

 , ,

cruz7
()

имплементировать реодеринг пакетов на C (offline, то есть из pcap-ов)

Форум — Development

Есть код обрабатывающий кучу pcap-файлов c TCP/IP трафиком, извлекает из них пакеты, создает flow-таблицу и распределяет пакеты соответственно в нужные flows, в виде списка пакетов.

Так как пакеты могут прибывать неупорядоченными (out-of-order), мне нужно их разложить по порядку. Хочу использовать для этого поле SEQ(sequence number, 32-бита) в TCP заголовке, я уже читаю это поле из пакетов также как и подсчитываю ожидаемый sequnce number в следующем пакете:

pkt->seq + TCP_segment_size

1) Не уверен, что использовать только SEQ для моих целей это правильно, ведь sequence может переполняться, что будет в этом случае?

2) Можно тупо отсортировать список с пакетами (который я формирую, когда бегаю по pcap-ам) по sequence номерам — но это будет медленно.

Как обычно имплементируют реодеринг пакетов? Что посоветуете? Спасибо.

 , , ,

cruz7
()

как ловить пакеты tcpdump/wireshark после того, как их обработает tcp/ip стек

Форум — Admin

Насколько я понимаю, tcpdump (и наверное любое приложение пользующееся PF_PACKET сокетом) собирает пакеты до того как они попадуь в TCP/IP стек.

Есть ли возможность ловить пакеты после обработки стеком? На ум приходит только iptables/netfilter правило перенаправляющее пакеты после выхода из стека приложению, но не уверен что это будет работать.

Есть ли какие-то другие способы? Спасибо.

 , , ,

cruz7
()

python: как заставить pickle сохранять lambda функции

Форум — Development
import pickle

class A:
   def __init__(self):
      self.__counter = count()
      self.__ids = defaultdict(lambda: next(self.__counter))
      self.processed_data = []

   def method1(self):
      # здесь используется __ids

   def method2(self):
      # здесь используется __ids

   def pickle_data(self, obj, filename="data.sav"):
      with open(filename, 'wb') as f:
         pickle.dump(obj, f)
      
   def unpickle_data(self, filename="data.sav"):
      with open(filename, 'rb') as f:
         return pickle.load(f)

my_class = A()
A.method1()
A.pickle_data(A)

pickle.dump() ругается что не может сохранить объект с lambda функцией:

AttributeError: Can't pickle local object 'Markov.__init__.<locals>.<lambda>'

Есть ли способ это решить?

 , , ,

cruz7
()

python: как генерировать уникальные ID для элементов списка

Форум — Development

Есть ли в стандартной библиотеке питона механизм генерации уникальных ID для последовательностей такого вида:

A-B-C-D
A-C-C-E
B-B-B-D
A-A-E-D

Нужно присваивать IDs каждому элементу, например A=0, B=1 и т.д. В данный момент я это делаю следующими функциями:

id = -1
ids = dict()

def getid():
    global id
    id += 1
    return id

def genid(s):
    global id
    if not s in ids:
       ids[s] = getid()
    return ids[s]

Я новичок в питоне, но этот код работает. Но - я подозреваю, что python имеет эффективные механизмы достичь этого более компактным способом? Наверняка есть что-то в библиотеке collections?

 ,

cruz7
()

python: поясните применение метода setdefault() для словаря

Форум — Development

Видел вот такой код:

s = ['a','b','c','d','a','a','a','b','c','b','b','b']

X = {}

for i in range(len(s)-1):
    X.setdefault((s[i], s[i+1]), [0])[0] += 1

Т.е. идем по списку и считаем переходы, a->b, b->c, c->c и так далее. Какя понимаю, setdefault() добавит значение по умолчанию, если ключ отсутствует в словаре. Но я не понимаю, почему default value список, в данном случае из одного элемента [0].

В чем необходимость использовать список в качестве счетчика, почему нельзя напрямую использовать целое для хранения? Например, вот такое тоже работает:

for i in range(len(states)-1):
   M.setdefault((states[i], states[i+1]), 0)
   M[(states[i], states[i+1])] += 1

Спасибо.

 ,

cruz7
()

python: как передать флаги линкеру в distutils скрипте

Форум — Development
from distutils.core import setup, Extension

# Linux build path
mod = Extension(
    'cpkt',
    sources=['file1.c', 'file2.c', 'file3.c'],
    include_dirs=['include', '.'],
    library_dirs=['lib'],
    libraries=['m', 'pcap', 'mylib'],
    define_macros=[
        # ("BENCHMARK", None),
        # ("LOGINFO", None),
        ]
    )

setup(name='MyPackage', version='0.1', description='', ext_modules=[mod])

С помощью этого скрипта компилируется *.so библиотека. Но мне нужно передавать флаги линкеру с помощью этого скрипта. Попробовал использовать extra_link_args аргумент к Extension() но он добавляет флаги в самый конец строки компилятора, а мне нужно вот так:

% gcc -O0 -g ... file1.o file2.o file3.o -Wl,--whole-archive -Llib -lmylib -Wl,--no-whole-archive -Wl,--export-dynamic -lpcap -lm -ldl -o mysharelibrary.so

Можно ли достичь с помощью distutils того что я хочу? Если так, то как?

Спасибо!

 ,

cruz7
()

посчитать вероятности состояний

Форум — Science & Engineering

Пусть даны следующие последовательности состояний:

A-B-C-D
A-B-D-E
A-C-E
A-B-C-E
A-B
B-E
A-D-E
A-C

где входные состояния — A и B, выходные D,E,B и C, а также промежуточные A-B, B-C, C-D, B-D и т.д.

Я могу посчитать количество этих состояний и определить вероятность, например:

- входное состояние A случается 7 раз из 8, таким образом вероятность (7*100)/8=87.5% - переходное состояние A->B случается 4 раза, следовательно вероятность 50%

А вот как считать вероятность повторяющегося состояния, например:

A-B-C-C-C-C-C-D
A-B-D-E
A-C-E
A-B-C-C-C-C-E
A-B-C-C
B-E
A-D-E
A-C

В данном случае, состояние C->C сохраняется 8 раз, получается что с вероятностью 100% ?

IMHO, я что-то делаю/считаю не так.

Подскажите где я ошибаюсь. Спасибо!

 ,

cruz7
()

python скрипт: подсчитать частоту перехода состояний

Форум — Development

Disclaimer: я только начал изучать питон.

Имеется текстовый файл следующего содержания (в качестве примера):

A-B-C-D
A-B-D-E
A-C-E
A-B-C-E
A-B
B-E
A-D-E
B-C
...

В каждой строке A,B,C,D,E — это некие состояния, разделенные делимитером '-'. Я пишу скрипт на питоне который должен подсчитать частоту перехода состояний равно как и количество входных и выходных состояний, например:

A входное  6 раз
E выходное 5 раз
A->B  4 раза
B->C  3 раза
C->D  1 раз
и т.д.

Подсчитать частоту A,B,C,D несложно, но мне нужно именно переходы и одного состояния в другое.

Вот что я соорудил — входной файл читается в строку, далее эта строка режется splitlines() построчно и кладется в список. Данный список подается на вход вот этой функции которая все считает:

def count_states(lines):
    states = dict()
    for l in lines:
        words = l.split('-')
        if not words[0] in states:
            states[words[0]] = 1
        else:
            states[words[0]] += 1
        for w in zip(words, words[1:]):
            if not w in states:
                states[w] = 1
            else:
                states[w] += 1

        if not w[-1] in states:
            states[w[-1]] = 1
        else:
            states[w[-1]] += 1

    return states

Вроде бы все считается правильно. Но можно ли написать компактнее и более «в духе» питона?

Спасибо.

 

cruz7
()

заставить print() не печатать newline

Форум — Development
a = 1
b = 2
print("%d - %d" % (a, b))

Как объяснить print() не выводить новую строку? Гуглил, пробовал добавлять end=' ' но print() откзывается его принимать.

 

cruz7
()

python: собрать последовательность сообщений из pcap файлов

Форум — Development

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

Есть задача парсить pcap файлы (с помощью питон-библиотеки dpkt), извлечь TLS-сессии и собрать последовательноти типов сообщений. Поскольку имеются разные версии TLS, то последовательности сообщений могут варъироваться.

Очень упрощенный пример:

- TLS сессия как правило начинается с handshake-ов между клиентом и сервером, т.е. первое сообщение с ID=22 - далее сообщение ChangeCipher c ID=20 - клиент и сервер обо всем договорились, началась передача криптованных данных в TLS сообщениях с ID=23

То есть скрипт должен пропарсить весь pcap и построить как бы граф сообщений: 22->20->23

Но в реальности это может быть значительно более длинный граф, в зависимости от приложения, версий TLS и пр.

Изначально коды этих сообщений я предполагал складывать в список (list).

Но поскольку в одном pcap куча сессий _одного_ приложения, то необходимо как-то отличать «граф» сессий друг от друга.

Что можно использовать вместо списка для данной задачи?

Спасибо!

 , , ,

cruz7
()

python: проверить существует ли директория

Форум — Development

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

Я не профи в питоне, уверен ответ простой, но нет времени копать :) Есть следующий кусочек скрипта:

STATSDIR = "stats/{}".format(time.strftime("%Y%m%d-%H%M%S"))
...
with open(os.path.join(STATSDIR, "{}.json".format(server)), "w") as f:
   f.write(json.dumps(stats, indent=4))

Нужно проверить, существует ли директория прежде чем ее создавать. Что нужно изменить?

Спасибо.

 , ,

cruz7
()

подсчитать количество комбинаций IP соединений

Форум — General

Подскажите, как правильно рассчитать возможные комбинации:

10.0.A.B:C -> 20.0.0.1:80

т.е. соединения от клиентов 10.0.x.x с портов C к серверу 20.0.0.1:80, где A принимает значения от 0 до 255, B может принимать значения от 1 до 16, и С принимает значения в диапазоне [0 ... 2^16].

Правильно ли я понимаю, что комбинации нужно перемножать:

2^8 разных вариаций параметра 'A' 16 комбинаций параметра 'B' 2^16 комбинаций параметра 'С'

2^8 * 16 * 2^16

 , ,

cruz7
()

многопоточность в python скрипте: как устранить блокирование

Форум — Development

Имеется Ubuntu 16.04.6 LTS с python-2.7.12. В питоне не эксперт, но вынужден поддерживать переданный по наследству код. Вот фрагмент:

from threading import Thread
...

class Shell(cmd.Cmd):
    ...
    def do_start(self, line):
        threads = []

        t = Thread(target=traffic(line, arg1, arg2, arg3))
        threads.append(t)
        t.start()
        t.join()
...

if __name__ == '__main__':
    global config
    global args

    args = parse_args()
    config = configparser.ConfigParser()
    config.read(args.FILE)

    s = Shell()
    ...

То есть запускает небольшой command-line shell, где набираются определенные команды и они выполняются. Это работает, но питоновский CLI блокируется когда стартует «поток».

Погуглил и подумал, что добавление t.setDaemon(True) (до t.start() или после) должно помочь. Однако должного эффекта не возымело. Также пробовал убрать t.join() — аналогично.

Что я делаю не так?

 ,

cruz7
()

max open files для процесса из systemd

Форум — General

Есть программа запускаемая systemd с root привилегиями, есть подозрение что она пытается открывать слишком много файловых дескрипторов.

Я знаю про ulimit, но это bash-команда, и я не знаю как ее применить в контексте приложения запускаемого из systemd.

И еще - есть /etc/security/limits.conf, но параметры устанавливаемые этим файлом кажется применяются только per session, то есть должен быть открыт терминал?

 , ,

cruz7
()

держать git репозиторий с удаленной системы в локальном репозитории

Форум — General

Имеется задача — есть локальный git-репозиторий, нужно держать локально git-репозиторий некоего софта с github.com (это для примера), и при этом иметь локальные бранчи (например, какие-то фичи). Этот локальный репозиторий должен периодически обновляться от удаленного (git pull), и также локальные бранчи должны будут ребайзиться (обычно я делал git rebase origin/master).

Я не гуру git'a, как подобное можно провернуть?

 , ,

cruz7
()

Всегда выполнять setxkbmap при запуске X-ов

Форум — Desktop

Использую wmii в качестве оконного менеджера, запуская вручную startx. Попробовал добавить в $HOME/.xinitrc команду setxkbmap устанавливающую русскую раскладку, но почему это она игнорируется, когда выполняю в xterm'e в уже запущенном wmii, то все OK.

Что я делаю не так?

 , ,

cruz7
()

перехватывать mount событие

Форум — Development

Есть ли способ в программе перехватывать события монтирования ФС? Читал man 7 inotify но там таких возможностей не предусмотрено. ОС Ubuntu 16.04.6 и ядро 5.1.0-rc5

По возможности хотелось бы обойтись без сторонних пакетов.

 , ,

cruz7
()

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