Записки программиста Программирование и не только

25Дек/240

Поднимаем LXC (без LXD) на CentOS 9

Нужно было развернуть на сервере под CentOS 9 контейнеризацию LXC так, чтобы контейнеры получали свой собственный IP адрес из локальной сети и были доступны извне

Возникшие трудности: хост машина была развернута на VMWare с запрещенным "promiscuous mode" и контейнеры получали IP, но не имели доступа в локальную сеть и интернет. Пришлось выставить "Promiscuous Mode" = Accept и "Forged Transmits" = Accept

Ну, а дальше всё просто:

# install lxc

dnf update -y
dnf install -y epel-release
dnf install -y lxc lxc-templates container-selinux

# set up bridge network (dhcp container)

systemctl restart NetworkManager

nmcli connection add type bridge con-name br0 ifname br0
nmcli connection modify ens160 master br0
nmcli connection up ens160
nmcli connection up br0

# change default config

vi /etc/lxc/default.conf

lxc.net.0.link = lxcbr0
to
lxc.net.0.link = br0

# move lxc to another folder

mkdir /home/lxc/large_files/lxc-files
mkdir /home/lxc/large_files/lxc-files/{var_cache_lxc,var_lib_lxc}

mv /var/cache/lxc/* /home/lxc/large_files/lxc-files/var_cache_lxc/
rmdir /var/cache/lxc
ln -s /home/lxc/large_files/lxc-files/var_cache_lxc/ /var/cache/lxc

mv /var/lib/lxc/* /home/lxc/large_files/lxc-files/var_lib_lxc/
rmdir /var/lib/lxc
ln -s /home/lxc/large_files/lxc-files/var_lib_lxc/ /var/lib/lxc

# enable lxc service

systemctl start lxc
systemctl enable lxc

# use

DOWNLOAD_KEYSERVER="keyserver.ubuntu.com" lxc-create -n mycontainer -t download -- -d ubuntu -r jammy -a amd64
lxc-start -n mycontainer

# console dont worked - need attach

lxc-attach -n mycontainer

# change password and install openssh

passwd ubuntu
apt install openssh-server

# and exit
ctrl+d

Использованные источники

  • https://ahelpme.com/linux/centos-stream-9/run-lxc-centos-stream-9-container-with-bridged-network-under-centos-stream-9/
  • https://ahelpme.com/linux/centos-8/replace-current-interface-configuration-with-a-bridge-device-using-nmcli-networkmanager/
  • https://access.redhat.com/solutions/647383
  • 29Сен/220

    Virtualbox не видит сетевой адаптер хоста

    Под Windows 10 Virtual Box ведёт себя отвратительно.
    Мало того, что он конфликтует с виртуализацией в самой Windows, так еще и ломается периодически.

    Самая частая поломка у меня - это когда VB теряет для всех виртуалок сетевую карту

    Проблема заключается в том, что из свойств реального адаптера пропадает служба VirtualBox NDIS6 Bridged Networking Driver

    Соответственно, если у вас VB потерял сетевую карту - надо заглянуть в свойства рельного адаптера.
    Если таки служба пропала, то надо просто установить её
    Жмём

    Install... -> Service -> Add... -> Have Disk... -> Browse... -> 
    C:\PROGRAM FILES\ORACLE\VIRTUALBOX\DRIVERS\NETWORK\NETLWF -> Ok -> Ok

    Путь до драйвера может незначительно отличаться, если используется 32-битная версия VB или 32-битная Windows

    Метки записи: Нет комментариев
    5Янв/220

    flask приложение в 10 строк

    from flask import Flask
    
    app = Flask(__name__)
    
    
    @app.route("/")
    def hello_world():
        return "<p>Hello, World!</p>"
    
    
    if __name__ == '__main__':
        app.run(
            host='0.0.0.0',
            port=5070,
        )
    
    Метки записи: , Нет комментариев
    3Дек/180

    vboxwebsrv в Ubuntu 14.04

    После обновления Ubuntu с 10 до 14 через upgrade перестал запускаться vboxwebsrv.
    Причем в логах всё нормально.

    Конфиг vboxwebsrv (/etc/default/virtualbox):
    VBOXWEB_USER='box'
    VBOXWEB_HOST=127.0.0.1
    VBOXWEB_PORT=18083

    Конфиг phpvirtualbox (/var/www/html/vbox/config.php)
    /* Username / Password for system user that runs VirtualBox */
    var $username = 'box';
    var $password = '*';

    /* SOAP URL of vboxwebsrv (not phpVirtualBox's URL) */
    var $location = 'http://localhost:18083/';

    При попытке зайти на Веб после логина получаем стабильно:
    Could not connect to host (http://127.0.0.1:18083/)

    Все советы были испробованы и выяснилось, что vboxwebsrv, собсвенно и не запускается до конца. Т.е. его не видно при промотре открытых портов через
    # netstat -tln

    Далее пошел по подсказке - запустить vboxwebsrv вручную, а не как сервис.
    vboxwebsrv -v

    И, вот оно:
    00:00:00.150329 SQPmp #### SOAP FAULT: [SOAP-ENV:Server]

    И правда, сервер то не стартует.

    Причем ни:
    vboxwebsrv -H localhost -v
    vboxwebsrv -H 127.0.0.1 -v

    эффекта не дают...

    Была найдена чудесная статья:
    https://ubuntuforums.org/showthread.php?t=2196096
    Оказывается, глючная ubuntu 14.04 с, не менее глючным, virtualbox не умеют в ip4...

    Решение:
    Исправляем конфиги:
    * Конфиг phpvirtualbox (/var/www/html/vbox/config.php)
    /* SOAP URL of vboxwebsrv (not phpVirtualBox's URL) */
    var $location = 'http://ip6-localhost:18083';

    * Конфиг vboxwebsrv (/etc/default/virtualbox):
    VBOXWEB_HOST=::1

    И не забываем проверить /etc/hosts:
    # The following lines are desirable for IPv6 capable hosts
    ::1 ip6-localhost ip6-loopback

    Ключевые слова: phpvirtualbox, vboxwebsrv, ubuntu

    Метки записи: Нет комментариев
    17Авг/160

    QBitArray to QByteArray

    QByteArray bit2byte(const QBitArray &__bits)
    {
        // 
        QByteArray bytes;
        bytes.resize(__bits.count() / 8 + 1);    // Резервируем место
        bytes.fill(0);                           // Заполняем всё нулями
    
        // Конвертируем из QBitArray в QByteArray
        for(int b = 0; b < __bits.count(); ++b)
        {
            bytes[b/8] = (bytes.at(b/8) | ( (__bits.testBit(b) ? 1 : 0)<<(7-(b%8)) ) );
            // Конструкция (7-(b%8)) даёт прямой порядок. Для обратного (b%8)
        }
    
        return bytes;
    }

    Ключевые слова:
    qbitarray2qbytearray

    Метки записи: , , Нет комментариев
    7Май/130

    AndroidSDK, JDK 64-bit и Windows 7 64-bit

    Данная зверушка при попытке запуска SDK Manager или инсталятора ругается на отсутствие JDK, который на самом деле есть.

    Решение:
    Экспортируем и удаляем ветку реестра
    [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\]

    И импортируем её в ветку
    [HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\]
    (путем редактирования путей в файле)

    Вуаля, Ондроед находит Жабу.

    24Апр/130

    Запуск инсталятора Fedora 18 на 256Мб ОЗУ

    Для установки ОС на машины с ОЗУ менее 512 Мб необходимо добавить в опцию загрузчика:
    inst.memcheck=0

    В общем строка будет выглядеть так:
    vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=Fedora\x2018\x20i386 quiet inst.memcheck=0

    Ключевые слова:
    fedora 18 installer 256 boot

    Метки записи: Нет комментариев
    22Янв/130

    Для чего нужен union

    Продолжаю открывать для себя С++...

    Объединение служит для, как бы это ни казалось странным, объединения.
    Это позволяет, записывая данные в одно поле union'а, одновременно получать эти же данные в другом поле. Причем поля могут быть разные по содержимому.

    Пример:

    typedef struct
    {
      unsigned short fbNVRIncorrectCRC    :1;
      unsigned short fbConfigIncorrectCRC :1;
      unsigned short fbSPIInterfaceError  :1;
      unsigned short fbMFIncorrectCRC     :1;
      unsigned short fbMFWriteError       :1;
      unsigned short fbMFNotInstalled     :1;
      unsigned short fbEEJFatalError      :1;
      unsigned short fbUnused1            :1;
    
      unsigned short fbNotInitialized     :1;
      unsigned short fbNonFiscalMode      :1;
      unsigned short fbShiftOpened        :1;
      unsigned short fb24HourOverflow     :1;
      unsigned short fbEEJArchieveClosed  :1;
      unsigned short fbEEJNotActivated    :1;
      unsigned short fbMFNoMemoryForShift :1;
      unsigned short fbMFWrongPassword    :1;
    
      unsigned char dbDocumentType;
    } ST_FRSTATUS;
    
    typedef union
    {
      ST_FRSTATUS stStatus;
      unsigned char dbStatus[3];
    } UN_FRSTATUS;

    И теперь можно записать данные в массив unsigned char dbStatus[3]; и потом получить их из структуры уже разобранными.

    Т.е. можно обратиться к dbStatus[2] и к stStatus.dbDocumentType и получить один и тот же результат.
    Единственное - нельзя обращаться по разным именам в одном блоке программы..

    21Янв/130

    Вынести определение массива структур в другой файл

    В продолжении к красоте

    Объявляем (declaration)

    //st.h
    enum {
        /* I/O ERRORS */
        ERR_INVALID_STATUS = 0x01,
        ERR_INVALID_FUNCTION = 0x02
    };
    
    struct fr_errs_struct
    {
    	int err;
    	const char * const msg;
    };
    
    extern struct fr_errs_struct fr_errs [];

    Определяем (definition)

    //st.cpp
    #include <st.h>
    
    struct fr_errs_struct fr_errs [] = {
        {ERR_INVALID_STATUS,        "Функция невыполнима при данном статусе"},
        {ERR_INVALID_FUNCTION,      "В команде указан неверный номер функции"},
        {0,     ""}
    };

    Ну и функция для использования всего этого

    const char* getText(int aErr)
    {
        int i = 0;
        while(fr_errs[i].err && fr_errs[i].err != aErr)
        {
            i++;
        }
        return fr_errs[i].msg;
    }
    
    Метки записи: , Нет комментариев
    18Янв/130

    Красота:

     enum {
    	/* I/O ERRORS */
    	ERR_INVALID_STATUS = 0x01,
    	ERR_INVALID_FUNCTION = 0x02
    };
    
    struct
    {
    	int err;
    	const char * const msg;
    } fr_errs [] = {
    	{ERR_INVALID_STATUS,		"Функция невыполнима при данном статусе"},
    	{ERR_INVALID_FUNCTION,		"В команде указан неверный номер функции"}
    	{0,		""}
    }; 
    Метки записи: Нет комментариев