Как создать символические ссылки на основе серийных номеров для устройств PCIe UIO?

The host has 8gb of ram and the vm is left with standard 1gb, because somewhere on the Stack I've found a highly upvoted comment about not assigning vms more than standard amount of resources apart from vram "because it's enough"

Как показывает ваш опыт, что бы ни говорили другие, 1 Гб НЕ достаточно для запуска этой системы, и именно поэтому Chrome дестабилизируется и система зависает, это классическое поведение для системы с нехваткой памяти.

То, что нужно каждой системе, не является общим, это зависит от открытых программ, версии ядра, диспетчера рабочего стола/окон, количества открытых программ, количества вкладок в браузере и т. д.

Когда я выполняю vm-тестирование, которое я делаю довольно часто, когда это необходимо, я выделяю 1 ГБ только системам, на которых работает легкий оконный менеджер, когда это kde/gnome и т. д., я выделяю 2 ГБ, но это только для тестирования базовой системы, фактически не используя ее, запуская firefox/chrome/gimp или другие ресурсоемкие приложения.

Когда вы находитесь в виртуальной машине, вы можете легко увидеть, что ест баран с:

inxi -tm10

, который даст вам список 10 основных потребителей оперативной памяти, а также общее количество доступной/используемой памяти.

top или htop также отобразит эту информацию, если вы отсортируете вывод по использованию памяти. Они оба также показывают использованный/доступный ОЗУ вверху :

.

Пам[... (используется вправо)

если вы видите

Swap[.. используется, поэтому он медленный.

Если используемый процент даже отдаленно близок к 90% или около того перед открытием Chrome, система зависнет, как только вы откроете браузер или что-то еще, что требует оперативной памяти, которая не назначена, и, таким образом, заставит систему в какой-то тип поведение подкачки, которое я не уверен, как работает в vm.

Быстрая проверка показывает, что Kali по умолчанию использует Gnome, и вы не можете запустить Gnome с 1 ГБ оперативной памяти. Это могут быть оконные менеджеры типа Fluxbox или OpenBox, но не kde, gnome или, возможно, даже xfce, если только вы не используете какое-либо другое программное обеспечение, потребляющее оперативную память, такое как chrome/firefox/gimp и т. д.

Вместо того, чтобы слушать абстрактные правила для таких вещей, как объем оперативной памяти для назначения виртуальной машине, просто протестируйте ее самостоятельно и увеличивайте объем до тех пор, пока он не достигнет точки, при которой ваша рабочая нагрузка может выполняться эффективно. Нет никакой формулы, кроме, может быть, если gnome/kde, добавьте хотя бы 1 ГБ. Но это также не формула, поскольку потребляемая оперативная память может варьироваться от версии к версии, поэтому вы хотите знать это сами, а не полагаться на правила, которые невозможно создать, и которые должны основываться на ваших потребностях и настройках, а не на общем..

По моему мнению, любой, кто использует Kali, должен знать о таких проблемах с самого начала, так как это дистрибутив экспертного уровня, не предназначенный для обычных пользователей.

1
19.05.2021, 20:42
2 ответа

Я также нашел ответ на второй вопрос. Я создал простое приложение, которое отображает серийный номер устройства PCIe. Его можно использовать для замены вызова lspciво вспомогательном сценарии. Это также устраняет риск того, что изменение выходного формата lspciсделает предыдущее решение недействительным. Источник:

/*
  Simple application displaying the PCIe Device Serial Number
  Written by Wojciech M. Zabolotny (wzab01@gmail.com or wzab@ise.pw.edu.pl)
  2021.05.23
  This code is heavily based on the examples provided in the pciutils package
  https://github.com/pciutils/pciutils therefore I release it under the same
  license: GNU GENERAL PUBLIC LICENSE Version 2, June 1991
  
  You may compile it with:
    gcc -o pcidsn pcidsn.c -lpci
*/

#include <stdio.h>
#include <pci/pci.h>
#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include <unistd.h>

void __attribute__((noreturn))
die(char *msg,...)
{
    va_list args;

    va_start(args, msg);
    fprintf(stderr, "pcisdn: ");
    vfprintf(stderr, msg, args);
    fputc('\n', stderr);
    exit(1);
}

int main(int argc, char * argv[])
{
    struct pci_access *pacc;
    struct pci_filter filter;
    struct pci_dev *dev;
    struct pci_cap *pdsn;
    unsigned int c;
    char namebuf[1024], *name;
    char * msg = NULL;
    pacc = pci_alloc();     /* Get the pci_access structure */
    pacc->error = die;
    pci_filter_init(pacc,&filter);
    if (msg=pci_filter_parse_slot(&filter,argv[1])) {
        die("Wrong slot definition: %s",msg);
    };
    pci_init(pacc);     /* Initialize the PCI library */

    pci_scan_bus(pacc);     /* We want to get the list of devices */
    for (dev=pacc->devices; dev; dev=dev->next) /* Iterate over all devices */
    {
        if(pci_filter_match(&filter,dev)) { /* Select only our slot */
            pdsn = pci_find_cap(dev, PCI_EXT_CAP_ID_DSN, PCI_CAP_EXTENDED);
            if(pdsn) {
                uint32_t lw = pci_read_long(dev, pdsn->addr+4);
                uint32_t hw = pci_read_long(dev, pdsn->addr+8);
                printf("%8.8lx%8.8lx\n",hw,lw);
            }
        }
    }
    pci_cleanup(pacc);      /* Close everything */
    return 0;
}

может быть скомпилирован с

gcc -o pcidsn pcidsn.c -lpci

Результирующее приложение должно быть доступно через системный PATH. Затем вспомогательный скрипт /opt/bin/uio_namerследует изменить на :

.
#!/bin/sh
set -e
SLOTNAME=`basename \`readlink /sys/${DEVPATH}/device\``
DSNCAP=`pcidsn ${SLOTNAME}`
echo daq/${DSNCAP##*" "}

Правило udev /etc/udev/rules.d/30-daq.rulesможет быть прежним:

SUBSYSTEM=="uio"  ACTION=="add" ATTRS{vendor}=="0xabba" ATTRS{device}=="0x3342" PROGRAM="/opt/bin/uio_namer" SYMLINK="%c"
0
28.07.2021, 11:31

Я нашел ответ на первый вопрос. Вhttp://reactivated.net/writing_udev_rules.htmlесть утверждение:

ATTRS - match a sysfs attribute of the device, or a sysfs attribute of any of the parent devices

Таким образом, правило для атрибутов поставщика и устройства PCI также может соответствовать родительскому устройству.

Правило udev /etc/udev/rules.d/30-daq.rulesможет быть изменено на:

SUBSYSTEM=="uio"  ACTION=="add" ATTRS{vendor}=="0xabba" ATTRS{device}=="0x3342" PROGRAM="/opt/bin/uio_namer" SYMLINK="%c"

и вспомогательный скрипт /opt/bin/uio_namerможно упростить до:

#!/bin/sh
SLOTNAME=`basename \`readlink /sys/${DEVPATH}/device\``
DSNCAP=`lspci -vvv -s ${SLOTNAME} | grep "Device Serial Number" `
echo daq/${DSNCAP##*" "}
0
28.07.2021, 11:31

Теги

Похожие вопросы