Поднимаем 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
Использованные источники
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
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, )
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
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
AndroidSDK, JDK 64-bit и Windows 7 64-bit
Данная зверушка при попытке запуска SDK Manager или инсталятора ругается на отсутствие JDK, который на самом деле есть.
Решение:
Экспортируем и удаляем ветку реестра
[HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\]
И импортируем её в ветку
[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\]
(путем редактирования путей в файле)
Вуаля, Ондроед находит Жабу.
Запуск инсталятора 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
Для чего нужен 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 и получить один и тот же результат.
Единственное - нельзя обращаться по разным именам в одном блоке программы..
Вынести определение массива структур в другой файл
В продолжении к красоте
Объявляем (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; }
…
Красота:
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, ""} };