LINUX.ORG.RU

Избранные сообщения Vlad-76

Фрагментация памяти

Форум — Talks

Кто-нибудь проводил исследования, какие современные языки (компиляторы, рантаймы и пр.) в большей мере страдают от этого? Например, запустили программу, которая обрабатывает массив данных на диске мелкими порциями (0,1-10М для определённости), она приступила, через сутки отъела 2Г памяти и упала. Не потому что кривая, а потому что такой у рантайма такой менеджер памяти. Или не через сутки, а через неделю. Но упадёт гарантировано.

 ,

question4
()

Что нужно прикрутить к сайту, чтобы на нем осуществлялась авторизация (вход) по ЭЦП,которую выдает налоговая?

Форум — Development

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

Спасибо.

 

Vlad-76
()

Слетает выравнивание для строк с русскими символами. Unicode в Си.

Форум — Development

Всех приветствую!

Все таки решил создать новую тему.

Хотя обсуждение началось в этой теме, но там оно больше уклонилось в лингвистическую строну, да и у меня немного другой вопрос.

Проблема вот в чем: если в printf-е мы ставим «%30s», то у нас выводится сначало 30-length(str) пробелов, потом наша строка str длиной length(str).

Но это не работает, если в строке есть не англ. символы.

Чтобы проверить какое будет поведение под Windows и Linux, а также с char* и wchar_t*, набросал программку:



#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <locale.h>
#include <wchar.h>
#include <uchar.h> // for char16_t


char *str_dup(char const *in)
{
    size_t len = strlen(in);
    char *out = malloc(len+1);
    strncpy(out, in, len+1);
    return out;
}

wchar_t *wstr_dup(wchar_t const *in)
{
    size_t len = wcslen(in);
    wchar_t *out = malloc((len+1)* sizeof(wchar_t));
    wcsncpy(out, in, (len+1) );
    return out;
}

wchar_t* convert_to_wstr(const char* cstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + mbsrtowcs(NULL, &cstr, 0, &state);
    
    wchar_t* ws = malloc(out_sz*sizeof(wchar_t) );
    mbstowcs(ws, cstr, out_sz);
    return ws;
}

char* convert_to_cstr(const wchar_t* wstr)
{
    mbstate_t state;
    memset(&state, 0, sizeof(state) );
    size_t out_sz = 1 + wcsrtombs(NULL, &wstr, 0, &state);
    
    char* cs = malloc(out_sz*sizeof(char) );
    wcstombs(cs, wstr, out_sz);
    return cs;
}

/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
typedef struct CSTRUCT
{
	char* data_only_engl; // только англ. буквы
        char* data_from_file; // строка из файла
        char* data_from_prog; // строка в программе
} CSTRUCT;

CSTRUCT* cs_create(const char* cstr)
{
	CSTRUCT* cs = malloc(sizeof(CSTRUCT));

	cs->data_only_engl = str_dup("Hello Friend");
	cs->data_from_prog = str_dup(cstr);

	FILE *input = fopen("text.txt", "r");
    char buff[128];
    memset(buff, '\0', 128);
    fgets(buff, 128, input);
    	cs->data_from_file = str_dup(buff);
	return cs;
}

void cs_print(CSTRUCT* cs)
{
	fprintf(stdout,"------------------------------|\n");
	const char FMT[] = "%30s| %2ld\n";
	fprintf(stdout, FMT, cs->data_only_engl, strlen(cs->data_only_engl) );
	fprintf(stdout, FMT, cs->data_from_prog, strlen(cs->data_from_prog) );
	fprintf(stdout, FMT, cs->data_from_file, strlen(cs->data_from_file) );
	fprintf(stdout,"123456789012345678901234567890|\n"); // ровно 30 символов
}

void cs_free(CSTRUCT** cs)
{
	free( (*cs)->data_from_prog);
	free( (*cs)->data_from_file);
	free( (*cs)->data_only_engl);
	free(*cs);
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/



typedef struct WSTRUCT
{
	wchar_t* data_only_engl;
        wchar_t* data_from_file;
        wchar_t* data_from_prog;
} WSTRUCT;


WSTRUCT* ws_create(const char* str)
{
	WSTRUCT* ws = malloc(sizeof(WSTRUCT));
	ws->data_only_engl = wstr_dup(L"Hello Friend");
	ws->data_from_prog = convert_to_wstr(str);

	FILE *input = fopen("text.txt", "r");
    char buff[128];
    memset(buff, '\0', 128);
    fgets(buff, 128, input);
    
	ws->data_from_file = convert_to_wstr(buff);
	return ws;
}

void ws_print(WSTRUCT* ws)
{
	fprintf(stdout,"------------------------------|\n");
	const char FMT[] = "%30ls| %2ld\n";
	fprintf(stdout, FMT, ws->data_only_engl, wcslen(ws->data_only_engl) );
	fprintf(stdout, FMT, ws->data_from_prog, wcslen(ws->data_from_prog) );
	fprintf(stdout, FMT, ws->data_from_file, wcslen(ws->data_from_file) );
	fprintf(stdout,"123456789012345678901234567890|\n");
}

void ws_free(WSTRUCT** ws)
{
	free( (*ws)->data_from_prog);
	free( (*ws)->data_from_file);
	free( (*ws)->data_only_engl);
	free(*ws);
}



int main(int argc, char const *argv[])
{
	
#if defined (_WIN32)
	setlocale(LC_ALL, "ru_RU");
#else
	setlocale(LC_ALL, "ru_RU.utf8");
#endif

	printf("sizeof(char)    = %ld\n", sizeof(char) );
	printf("sizeof(char16_t)= %ld\n", sizeof(char16_t) );
	printf("sizeof(wchar_t) = %ld\n", sizeof(wchar_t) );
	printf("\n");


	CSTRUCT* cs = cs_create("Hello! Друг");
	cs_print(cs);
	cs_free(&cs);

	WSTRUCT* ws = ws_create("Hello! Друг");
	ws_print(ws);
	ws_free(&ws);


	return EXIT_SUCCESS;
}

Кратко: есть две структуры одна хранит строки в char*, другая - wchar_t*.

Обе хранят три строки: с чисто англ. символами, со строкой инициализируемой в программе и строкой считываемой из файла:

text.txt

Привет friend из файла!

В итоге под Linux получаю

sizeof(char)    = 1
sizeof(char16_t)= 2
sizeof(wchar_t) = 4

------------------------------|
                  Hello Friend| 12
               Hello! Друг| 15
Привет friend из файла!
| 37
123456789012345678901234567890|
------------------------------|
                  Hello Friend| 12
               Hello! Друг| 11
Привет friend из файла!
| 24
123456789012345678901234567890|

Видно, что выравнивание сработало для строки только с англ. символами.

А хотелось бы:

------------------------------|
                  Hello Friend| 12
                   Hello! Друг| 11
       Привет friend из файла!| 23
123456789012345678901234567890|

Соответственно под Windows имею:

sizeof(char)    = 1
sizeof(char16_t)= 2
sizeof(wchar_t) = 2

------------------------------|
                  Hello Friend| 12
               Hello! Друг| 15
Привет friend из файла!
| 37
123456789012345678901234567890|
------------------------------|
                  Hello Friend| 12
               Hello! Друг| 15
Привет friend из файла!
| 37
123456789012345678901234567890|

Как сделать кроссплатф. вывод на экран с правильным выравниваем?

 , , , ,

Gyros
()

Ищутся ГУРУ zfs. Поломал zfs, осваиваю насколько оно починябельное.

Форум — Admin

В общем поломал благодаря USB 3. Переставил местами 2 адаптера, у них были кабели разной длины, и вот один из них не смог нормально отработать с кабелем от другого. Делал банальный рсинк. В нгазначении получил что то типа:

  pool: T4T3S
 state: DEGRADED
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: https://openzfs.github.io/openzfs-docs/msg/ZFS-8000-8A
  scan: scrub repaired 464K in 06:48:46 with 8 errors on Sun Feb  9 07:12:55 202
5
config:

        NAME         STATE     READ WRITE CKSUM
        T4T3S        DEGRADED     0     0     0
          T4T3STORE  DEGRADED     0     0 41.7K  too many errors

errors: Permanent errors have been detected in the following files:

        T4T3S/:Backup:<0x50700>
        /zfs/=T4T3S/:Backup/Hosts/HGST-750/Backup-241127=330(172)Gb/p8-zz750/zz-s64root/usr/share/doc/gcc-6-base/libstdc++/user/a09413.html


Естественно битые файлы - пустые.
Подумал что для начала надо их удалить.
Сделал список из файлов и произвёл над ними gzip -m
Всё как бы замечательно, но вот конструкции типа:
T4T3S/:Backup:<0x50700> - остались как ошибочные, при этом другими средствами они не видны.
Как бы удалить эти конструкции?
И что надо сделать после их удаления?
scrub?
а потом убрать флаг ошибки? Или как это делается?
Теоретически конечно я уже сделал рсинк на другой винт и можно этот переразметить и рсинкнут назад, но хочется освоить другой метод, да и рсинк 1.94T упакованных до 1.84T взад - опять будет идти 40+ часов. Можно конечно отрубить упаковку (Выигрыш всего 100G). Но всё же...

(250225-2300)P.S. Последовательность действий:
1. zpool status -v|tee errors.log
2. С помощью гугла нашел команды для преобразования полученного списка в список файлов с ошибками (errors.lst). По ходу удалив строки вида: T4T3S/:Backup:<0x2e2802> - ибо они не являются файлами
3. Если не путаю (память шалит) #zip -m badfiles.zip -@ <errors.lst и все битые файлы были упакованы в архив и удалены на разделе.
4. zpool status <POOL> -v|tee errors.log - Дал только строки вида: T4T3S/:Backup:<0x50700>
5. zpool scrub <POOL> - через 6 часов - 0 ошибок.
6. zpool clear <POOL>
Всё:
# zpool status T4T3S
  pool: T4T3S
 state: ONLINE
  scan: scrub repaired 16K in 06:01:52 with 0 errors on Tue Feb 25 21:27:33 2025
config:

	NAME         STATE     READ WRITE CKSUM
	T4T3S        ONLINE       0     0     0
	  T4T3STORE  ONLINE       0     0     0

errors: No known data errors


В файле badfiles.zip - список файлов которые надо восстановить из других источников.

Спасибо unC0Rr и undef которые советовали по сути, а не «учили» меня «как надо».

Отмечаю тред решенным!

 ,

n0mad
()

Как восстановить удаленный диск виртуальной машины в proxmox?

Форум — Linux-hardware

Есть машина с debian, на ней строит Рroxmox + Proxmox Backup Server - используется 2 зеркала одно для PBS и еще такое же для работы виртуалок.

После применения команды apt upgrade, выяснилось после загрузки, что нет дисков только у 2х виртуальных машин из 3х с этого рейда. Третья виртуалка спокойно себе работает. По логам не сильно понял, что и как произошло.

Была когда схожая ситуация при потере дисков в ESXI, возможно ли тут как то найти расположение этих виртуалок на диске и восстановить?

 , ,

tr3ton
()

Рост количества потерь пакетов со временем.

Форум — Development

Я пишу udp с гарантией доставки, сейчас в программе нет нормального контроля перегрузки, но у меня есть буфер из 64 пакетов размером 1460 байт и переменная - число, которая отвечает за то, сколько пакетов можно положить в буфер, с начала она = 1. Я отправляю все пакеты из буфера, одновременно проверяя приходящие подтверждения. Если без потерь проходит весь текущий размер буфера, то я + 1. Если произходит потеря, то таймер заканчивается и все не подтверждённые пакеты отправляются заново. Ещё есть переменная которая увеличивается на 1 каждый раз когда заканчивается таймер и все пакеты приходится отправлять заново. 100 000 это количество пакетов которое надо передать через wifi.

ПРОБЛЕМА: я запускаю программу, скажем раз 10, потом открываю какие нибудь сайты и т.д. youtube например. И через некоторое время ~ 30 минут количество потерь в секунду резко увеличивается. Я делаю ifconfig wlp4s0 down && ifconfig wlp4s0 up и всё становиться сново нормально, причём с открытыми сайтами. Объясните мне почему так.

./cctest c 100000
client
Window  1 Speed    1 Error   1 ~ 1.4 KByte ~ 11.6 KBit
Window  4 Speed  279 Error  18 ~ 395.1 KByte ~ 3.2 MBit
Window  3 Speed  168 Error  18 ~ 237.9 KByte ~ 1.9 MBit
Window  1 Speed  936 Error  14 ~ 1.3 MByte ~ 10.9 MBit
Window  2 Speed  163 Error  18 ~ 230.8 KByte ~ 1.9 MBit
Window  1 Speed  453 Error  16 ~ 641.5 KByte ~ 5.3 MBit
Window  1 Speed  139 Error  18 ~ 196.8 KByte ~ 1.6 MBit
Window 14 Speed  536 Error  16 ~ 759.0 KByte ~ 6.2 MBit
ifconfig wlp4s0 down && ifconfig wlp4s0 up
./cctest c 100000
client
Window  1 Speed    1 Error   1 ~ 1.4 KByte ~ 11.6 KBit
Window 52 Speed 2666 Error   3 ~ 3.7 MByte ~ 30.9 MBit
Window 51 Speed 2532 Error   4 ~ 3.5 MByte ~ 29.4 MBit
Window 25 Speed 2517 Error   5 ~ 3.5 MByte ~ 29.2 MBit
Window 25 Speed 2525 Error   4 ~ 3.5 MByte ~ 29.3 MBit
Window 25 Speed 2528 Error   4 ~ 3.5 MByte ~ 29.3 MBit
Window 17 Speed 2680 Error   5 ~ 3.7 MByte ~ 31.1 MBit
Window 16 Speed 2454 Error   4 ~ 3.4 MByte ~ 28.5 MBit
Window 22 Speed 2702 Error   4 ~ 3.7 MByte ~ 31.3 MBit
Window 26 Speed 2722 Error   4 ~ 3.8 MByte ~ 31.6 MBit

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

 , ,

Ingvar2145
()

Дёргание SOшки из Love файла - обходной путь.

Форум — Development

Ну… не совсем из love файла, но около того.
В общем так, для начала сразу скажу что делать так не надо.
Но если очень хочется то можно.

В чём суть, вы например написали программу/игру на Love2D и вам вдруг ну очень хочется добавить к ней вашу библиотеку типа libcool.so в которой что-то делается и вы эту библиотеку вызываете из вашего lua кода, только вот беда. Если вы создали love файл mycoolgame.love и положили в него libcool.so ваш код не сможет загрузить библиотеку libcool.so ибо mycoolgame.love это zip архив. Ну, не получится и всё тут. Но если очень хочется то есть черезжопный метод, мы внутри нашего love файла создадим архив с нашей библиотекой и возможно дополнительными файлами, при запуске, мы монтируем этот архив и распаковываем в каталог игры и автоматически добавляем пути до распакованных файлов в cpath и path.

Например вот наша библиотека которую мы хотим распространять вместе с нашей игрой прямо в love файле.

#include <stdio.h>

#ifdef LUAJIT
#include <luajit-2.1/lua.h>
#include <luajit-2.1/lualib.h>
#include <luajit-2.1/lauxlib.h>
#else
#include <lua5.1/lua.h>
#include <lua5.1/lualib.h>
#include <lua5.1/lauxlib.h>
#endif

int example_c_function(lua_State* L)
{
    int a = lua_tointeger(L,1);
    a+=a;
    lua_pushnumber(L,a);
    lua_pushstring(L,"hello from c");
    return 2;
}

int luaopen_lib(lua_State* L)
{
    static const struct luaL_Reg nativeFuncLib [] =
    {
         {"example_c_function", example_c_function},
         {NULL, NULL}
    };
    luaL_register(L, "lib", nativeFuncLib);
    return 1;
}

Соберём её

gcc -DLUAJIT=1 main.c `pkg-config --libs --cflags luajit` --shared -o lib.so

Аахивируем её

mkdir libs
cp lib.so libs/lib.so
zip -r9 libs.zip libs

А вот собственно сама суть и сам механизм распаковки и импорта путей.

function autoreq(zip)
    if not zip then
       print("[autoreq] failed get zip archive for unpack, argument is 'nil'")
       return false;
    end
    local function unpack(dirname,mount_point,base)
        local items = love.filesystem.getDirectoryItems(mount_point)
        if items then
            for _,val in pairs(items) do
                local path = dirname..'/'..val;
                local path_mount = mount_point..'/'..val;
                if love.filesystem.getInfo(path_mount,'directory') then
                   package.path  = package.path  ..';'..base..'/'..path..'/?.lua;';
                   package.cpath = package.cpath ..';'..base..'/'..path..'/?.so;';
                   love.filesystem.createDirectory(path)
                   unpack(path,path_mount,base)
                 elseif love.filesystem.getInfo(path_mount,'file')then
                        print("[autoreq] unpack -> "..val)
                        love.filesystem.write(path,love.filesystem.read(path_mount));
                else
                   print("[autoreq] ok -> "..val)
                end
            end
        end
    end
    local base = love.filesystem.getSaveDirectory();
    print("[autoreq] check depends in '"..base.."'")
    local dirname = "libs"
    local mount_point = "_autoreq_libs_"
    local dir = love.filesystem.createDirectory(dirname)
    local dir = love.filesystem.createDirectory(mount_point)
    data, err = love.filesystem.newFileData(zip)
    if not data then
       print("[autoreq] failed get zip archive for unpack -> '"..zip.."'")
       return false;
    end
    local success,msg = love.filesystem.mount(data,mount_point)
    unpack(dirname,mount_point,base);
    love.filesystem.setRequirePath ( package.path  );
    love.filesystem.setCRequirePath( package.cpath );
    local success,msg = love.filesystem.unmount(data);
    love.filesystem.remove(mount_point);
    print("[autoreq] all done okey")
    return true;
end

autoreq("libs.zip"); -- вызываем распаковку архива с библиотекой и импорта путей
require('lib'); -- вызываем нашу библиотеку

function love.load()
print(lib.example_c_function()) -- вызываем функцию из неё
end

Создаём love файл с нашей программой и её зависимостями

zip -r9 coolgame.love  main.lua libs.zip

Запускаем

love coolgame.love 
[autoreq] check depends in '/home/dron/.local/share/love/coolgame'
[autoreq] unpack -> lib.so
[autoreq] all done okey
0	hello from c

Всё работает, наша soшка может распространяться в обычном love файле. Будет создана такая структура каталогов. В автоматическом каталоге игры.

dron@gnu:~/.local/share/love$ tree 
.
└── coolgame
    └── libs
        └── libs
            └── lib.so

4 directories, 1 file
dron@gnu:~/.local/share/love$ 

Ну вот собственно и всё. На деле можно в lib.zip насовать произвольные файлы, с произвольными каталогами, например выполнить сборку openssl/luasec/luasocket

luarocks --tree `pwd`/luasec install openssl
luarocks --tree `pwd`/luasec install luasec
zip -9 -r libs.zip luasec -x 'luasec/lib/luarocks*'

И получившийся libs.zip просто добавить в свой love файл тем самым получив всё что нужно для работы с https в вашей программе. Я так и сделал в своей проверялке новостей например. Работать будет всё абсолютно прозрачно, ничего в коде учитывать и менять не надо. В том и прелесть. Ну разве что один раз вызвать autoreq('libs.zip') и всё.

Да, теряется смысл в переносимости love файлов ведь теперь там платформоспецифичные библиотеки таскаются. Но это просто вариант таскания с собой soшки если уж надо, но без всяких appimage упаковок и прочего, по иному дёрнуть внешнюю библиотеку из своей поставки из архива, просто никак нельзя. Но порой вот надо бывает. Я голову ломал довольно долго если честно пока не допёрло. Может кому пригодится.

Вроде всё. Досвиданья.

 , , , ,

LINUX-ORG-RU
()

Проблема при сборке библиотеки: ключ -fPIC

Форум — Development

Всех приветствую!

Знает ли кто-нибудь решение такой проблемы:

собираю библиотеку (lib)xlsxio,но для нее нужна minizip-ng:

действую

cmake -S . -B build -D MZ_BUILD_TESTS=ON

~/minizip-ng$ cmake -S . -B build -D MZ_BUILD_TESTS=ON
-- Using CMake version 3.16.3
-- Using ZLIB 1.3.1
-- BZip2 library not found
-- Checking for module 'liblzma'
--   No package 'liblzma' found
-- Using LZMA 5.2.4
-- Checking for module 'libzstd'
--   No package 'libzstd' found
-- ZSTD library not found
-- Using OpenSSL 3.2.2
-- Using Iconv
-- The following features have been enabled:

 * MZ_COMPAT, Enables compatibility layer
 * MZ_ZLIB, Enables ZLIB compression
 * MZ_LZMA, Enables LZMA & XZ compression
 * MZ_PKCRYPT, Enables PKWARE traditional encryption
 * MZ_WZAES, Enables WinZIP AES encryption
 * MZ_OPENSSL, Enables OpenSSL for encryption
 * MZ_LIBBSD, Builds with libbsd crypto random
 * MZ_ICONV, Enables iconv string encoding conversion library
 * MZ_BUILD_TESTS, Builds minizip test executable

-- The following features have been disabled:

 * MZ_BZIP2, Enables BZIP2 compression
 * MZ_ZSTD, Enables ZSTD compression
 * MZ_LIBCOMP, Enables Apple compression
 * MZ_FETCH_LIBS, Enables fetching third-party libraries if not found
 * MZ_FORCE_FETCH_LIBS, Enables fetching third-party libraries always
 * MZ_COMPRESS_ONLY, Only support compression
 * MZ_DECOMPRESS_ONLY, Only support decompression
 * MZ_FILE32_API, Builds using posix 32-bit file api
 * MZ_BUILD_UNIT_TESTS, Builds minizip unit test project
 * MZ_BUILD_FUZZ_TESTS, Builds minizip fuzzer executables
 * MZ_CODE_COVERAGE, Builds with code coverage flags

-- Configuring done
-- Generating done
-- Build files have been written to: /home/bark/minizip-ng/build

Потом

cmake –build build

~/minizip-ng$ cmake --build build
make[1]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[  4%] Building C object CMakeFiles/minizip.dir/mz_crypt.c.o
[  8%] Building C object CMakeFiles/minizip.dir/mz_os.c.o
[ 13%] Building C object CMakeFiles/minizip.dir/mz_strm.c.o
[ 17%] Building C object CMakeFiles/minizip.dir/mz_strm_buf.c.o
[ 21%] Building C object CMakeFiles/minizip.dir/mz_strm_mem.c.o
[ 26%] Building C object CMakeFiles/minizip.dir/mz_strm_split.c.o
[ 30%] Building C object CMakeFiles/minizip.dir/mz_zip.c.o
[ 34%] Building C object CMakeFiles/minizip.dir/mz_zip_rw.c.o
[ 39%] Building C object CMakeFiles/minizip.dir/mz_strm_zlib.c.o
[ 43%] Building C object CMakeFiles/minizip.dir/mz_strm_lzma.c.o
[ 47%] Building C object CMakeFiles/minizip.dir/mz_crypt_openssl.c.o
[ 52%] Building C object CMakeFiles/minizip.dir/mz_os_posix.c.o
[ 56%] Building C object CMakeFiles/minizip.dir/mz_strm_os_posix.c.o
[ 60%] Building C object CMakeFiles/minizip.dir/mz_strm_pkcrypt.c.o
[ 65%] Building C object CMakeFiles/minizip.dir/mz_strm_wzaes.c.o
[ 69%] Building C object CMakeFiles/minizip.dir/compat/ioapi.c.o
[ 73%] Building C object CMakeFiles/minizip.dir/compat/unzip.c.o
[ 78%] Building C object CMakeFiles/minizip.dir/compat/zip.c.o
[ 82%] Linking C static library libminizip.a
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[ 82%] Built target minizip
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[ 86%] Building C object CMakeFiles/minizip_cli.dir/minizip.c.o
[ 91%] Linking C executable minizip
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[ 91%] Built target minizip_cli
make[2]: Entering directory '/home/bark/minizip-ng/build'
make[2]: Leaving directory '/home/bark/minizip-ng/build'
make[2]: Entering directory '/home/bark/minizip-ng/build'
[ 95%] Building C object CMakeFiles/minigzip_cli.dir/minigzip.c.o
[100%] Linking C executable minigzip
make[2]: Leaving directory '/home/bark/minizip-ng/build'
[100%] Built target minigzip_cli
make[1]: Leaving directory '/home/bark/minizip-ng/build'

Потом устанавливаю в usr/local sudo make install

Теперь собираю xlsxio:


~/xlsxio$ cmake -G"Unix Makefiles"
CMake Warning:
  No source or binary directory provided.  Both will be assumed to be the
  same as the current working directory, but note that this warning will
  become a fatal error in future CMake releases.


-- XLSX I/O library version: 0.2.35
-- Configuring done
-- Generating done
-- Build files have been written to: /home/bark/xlsxio
bark@zuzu:~/xlsxio$ make
make[1]: Entering directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
make[2]: Leaving directory '/home/bark/xlsxio'
make[2]: Entering directory '/home/bark/xlsxio'
[  4%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read.c.o
[  8%] Building C object CMakeFiles/xlsxio_read_SHARED.dir/lib/xlsxio_read_sharedstrings.c.o
[ 13%] Linking C shared library libxlsxio_read.so
/usr/bin/ld: /usr/local/lib/libminizip.a(mz_strm.c.o): relocation R_X86_64_PC32 against symbol `mz_stream_write' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/xlsxio_read_SHARED.dir/build.make:102: libxlsxio_read.so] Error 1
make[2]: Leaving directory '/home/bark/xlsxio'
make[1]: *** [CMakeFiles/Makefile2:150: CMakeFiles/xlsxio_read_SHARED.dir/all] Error 2
make[1]: Leaving directory '/home/bark/xlsxio'
make: *** [Makefile:130: all] Error 2

Проблема тут

relocation R_X86_64_PC32 against symbol `mz_stream_write’ can not be used when making a shared object; recompile with -fPIC

Тогда ставлю в minizip-ng/CMakeLists.txt

на СЛЕДУЮЩЕЙ строке после комментария

# Set compiler options

строчку SET(CMAKE_SHARED_LIBRARY_C_FLAGS «-fpic»)

Потом, пересобираю, устанавливаю minixip-ng

Возвращаюсь к xlsxio:

результат такой же, тот же выхлоп в консоль, опять не может прилинковать

[ 13%] Linking C shared library libxlsxio_read.so

Linking C shared library libxlsxio_read.so
/usr/bin/ld: /usr/local/lib/libminizip.a(mz_strm.c.o): relocation R_X86_64_PC32 against symbol `mz_stream_write' can not be used when making a shared object; recompile with -fPIC
/usr/bin/ld: final link failed: bad value

Пока не ясно в чем проблема.

Странно, что разработчики в соих инструкциях по сборке никак момент с -fPIC не упомянули.

Видимо это считается тривиальным моментом..

 , ,

Gyros
()

Не поднимается линк на SFP портах Intel X710

Форум — Linux-hardware

Всем привет!

Пытаюсь поднять SFP порты на плате расширения Intel X710.
В SFP порт воткнут " SFP патчкорд" с другой стороны которого свитч TP Link и его SFP порт. Кабель рабочий, между двумя свитчами SFP линк прекрасно поднимается.
А воть между Свитчем и компьютером c платой X710 под управлением Linux, лаже линк не загорается.

Т.е. как устройство оно есть. Модуль загружен. «Кабель» определён. Но вот состояние NO-CARRIER.
Надо как-то принудительно поднять линк? А как?

Вот так Linux всё это видит:

root@router:~# lspci

01:00.0 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)                                                                                                                  01:00.1 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)                                                                                                                  01:00.2 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)                                                                                                                  01:00.3 Ethernet controller: Intel Corporation Ethernet Controller X710 for 10GbE SFP+ (rev 02)

root@router:~# dmesg | grep i40                                                                                                                                                                                  [    3.492657] i40e: Intel(R) Ethernet Connection XL710 Network Driver                                                                                                                                           [    3.493108] i40e: Copyright (c) 2013 - 2019 Intel Corporation.                                                                                                                                                [    3.493551] i40e 0000:01:00.0: enabling device (0000 -> 0002)                                                                                                                                                 [    3.508011] i40e 0000:01:00.0: fw 9.140.76856 api 1.15 nvm 9.40 0x8000ecf8 0.0.0 [8086:1572] [8086:0000]                                                                                                      [    3.840666] i40e 0000:01:00.0: MAC address: 60:be:b4:1d:44:70                                                                                                                                                 [    3.845390] i40e 0000:01:00.0: PCI-Express: Speed 8.0GT/s Width x4                                                                                                                                            [    3.845831] i40e 0000:01:00.0: PCI-Express bandwidth available for this device may be insufficient for optimal performance.                                                                                   [    3.846601] i40e 0000:01:00.0: Please move the device to a different PCI-e link with more lanes and/or higher transfer rate.                                                                                  [    3.847866] i40e 0000:01:00.0: Features: PF-id[0] VFs: 32 VSIs: 34 QP: 16 RSS FD_ATR FD_SB NTUPLE VxLAN Geneve PTP VEPA                                                                                       [    3.848645] i40e 0000:01:00.1: enabling device (0000 -> 0002)                                                                                                                                                 [    3.861934] i40e 0000:01:00.1: fw 9.140.76856 api 1.15 nvm 9.40 0x8000ecf8 0.0.0 [8086:1572] [8086:0000]                                                                                                      [    4.194490] i40e 0000:01:00.1: MAC address: 60:be:b4:1d:44:71                                                                                                                                                 [    4.199108] i40e 0000:01:00.1: PCI-Express: Speed 8.0GT/s Width x4                                                                                                                                            [    4.199548] i40e 0000:01:00.1: PCI-Express bandwidth available for this device may be insufficient for optimal performance.                                                                                   [    4.200319] i40e 0000:01:00.1: Please move the device to a different PCI-e link with more lanes and/or higher transfer rate.                                                                                  [    4.201589] i40e 0000:01:00.1: Features: PF-id[1] VFs: 32 VSIs: 34 QP: 16 RSS FD_ATR FD_SB NTUPLE VxLAN Geneve PTP VEPA                                                                                       [    4.202360] i40e 0000:01:00.2: enabling device (0000 -> 0002)                                                                                                                                                 [    4.215468] i40e 0000:01:00.2: fw 9.140.76856 api 1.15 nvm 9.40 0x8000ecf8 0.0.0 [8086:1572] [8086:0000]                                                                                                      [    4.547957] i40e 0000:01:00.2: MAC address: 60:be:b4:1d:44:72                                                                                                                                                 [    4.552342] i40e 0000:01:00.2: PCI-Express: Speed 8.0GT/s Width x4                                                                                                                                            [    4.552782] i40e 0000:01:00.2: PCI-Express bandwidth available for this device may be insufficient for optimal performance.                                                                                   [    4.553552] i40e 0000:01:00.2: Please move the device to a different PCI-e link with more lanes and/or higher transfer rate.                                                                                  [    4.554751] i40e 0000:01:00.2: Features: PF-id[2] VFs: 32 VSIs: 34 QP: 16 RSS FD_ATR FD_SB NTUPLE VxLAN Geneve PTP VEPA                                                                                       [    4.555518] i40e 0000:01:00.3: enabling device (0000 -> 0002)                                                                                                                                                 [    4.567997] i40e 0000:01:00.3: fw 9.140.76856 api 1.15 nvm 9.40 0x8000ecf8 0.0.0 [8086:1572] [8086:0000]                                                                                                      [    4.900652] i40e 0000:01:00.3: MAC address: 60:be:b4:1d:44:73                                                                                                                                                 [    4.905036] i40e 0000:01:00.3: PCI-Express: Speed 8.0GT/s Width x4                                                                                                                                            [    4.905476] i40e 0000:01:00.3: PCI-Express bandwidth available for this device may be insufficient for optimal performance.                                                                                   [    4.906246] i40e 0000:01:00.3: Please move the device to a different PCI-e link with more lanes and/or higher transfer rate.                                                                                  [    4.907446] i40e 0000:01:00.3: Features: PF-id[3] VFs: 32 VSIs: 34 QP: 16 RSS FD_ATR FD_SB NTUPLE VxLAN Geneve PTP VEPA                                                                                       [    6.594679] i40e 0000:01:00.0 sfp1: renamed from eth0                                                                                                                                                         [    6.759375] i40e 0000:01:00.1 sfp2: renamed from eth1                                                                                                                                                         [    6.818991] i40e 0000:01:00.2 sfp3: renamed from eth2                                                                                                                                                         [    6.898869] i40e 0000:01:00.3 sfp4: renamed from eth3

root@router:~# ethtool -i sfp1
driver: i40e
version: 5.15.167
firmware-version: 9.40 0x8000ecf8 0.0.0
expansion-rom-version:
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes

root@router:~# ethtool -i sfp1
driver: i40e
version: 5.15.167
firmware-version: 9.40 0x8000ecf8 0.0.0
expansion-rom-version:
bus-info: 0000:01:00.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: yes
root@router:~# ethtool sfp1
Settings for sfp1:
        Supported ports: [  ]
        Supported link modes:   10000baseT/Full
                                1000baseX/Full
                                10000baseSR/Full
                                10000baseLR/Full
        Supported pause frame use: Symmetric Receive-only
        Supports auto-negotiation: Yes
        Supported FEC modes: Not reported
        Advertised link modes:  10000baseT/Full
                                1000baseX/Full
                                10000baseSR/Full
                                10000baseLR/Full
        Advertised pause frame use: No
        Advertised auto-negotiation: Yes
        Advertised FEC modes: Not reported
        Speed: Unknown!
        Duplex: Unknown! (255)
        Auto-negotiation: off
        Port: Other
        PHYAD: 0
        Transceiver: internal
        Supports Wake-on: g
        Wake-on: g
        Current message level: 0x00000007 (7)
                               drv probe link
        Link detected: no

root@router:~# ethtool --module-info sfp1
        Identifier                                : 0x03 (SFP)
        Extended identifier                       : 0x04 (GBIC/SFP defined by 2-wire interface ID)
        Connector                                 : 0x21 (Copper pigtail)
        Transceiver codes                         : 0x01 0x00 0x00 0x00 0x41 0x04 0x80 0xd5 0x00
        Transceiver type                          : Infiniband: 1X Copper Passive
        Transceiver type                          : FC: short distance (S)
        Transceiver type                          : FC: Electrical inter-enclosure (EL)
        Transceiver type                          : Passive Cable
        Transceiver type                          : FC: Twin Axial Pair (TW)
        Transceiver type                          : FC: 1200 MBytes/sec
        Transceiver type                          : FC: 800 MBytes/sec
        Transceiver type                          : FC: 400 MBytes/sec
        Transceiver type                          : FC: 200 MBytes/sec
        Transceiver type                          : FC: 100 MBytes/sec
        Encoding                                  : 0x00 (unspecified)
        BR, Nominal                               : 10300MBd
        Rate identifier                           : 0x00 (unspecified)
        Length (SMF,km)                           : 0km
        Length (SMF)                              : 0m
        Length (50um)                             : 0m
        Length (62.5um)                           : 0m
        Length (Copper)                           : 1m
        Length (OM3)                              : 0m
        Passive Cu cmplnce.                       : 0x01 (SFF-8431 appendix E) [SFF-8472 rev10.4 only]
        Vendor name                               : OEM
        Vendor OUI                                : 3c:18:a0
        Vendor PN                                 : SFP-10G-CU1M
        Vendor rev                                : A
        Option values                             : 0x00 0x00
        BR margin, max                            : 0%
        BR margin, min                            : 0%
        Vendor SN                                 : 2407160036
        Date code                                 : 240716

root@router:~# ip link show dev sfp1
8: sfp1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state DOWN mode DEFAULT group default qlen 1000
    link/ether 00:d0:b4:02:84:6e brd ff:ff:ff:ff:ff:ff permaddr 60:be:b4:1d:44:70

 ,

Spider55
()

Сетевое хранилище для виртуализации

Форум — Admin

Два сервера с AltLinux 10, в каждом сервере по 10 дисков.
Нужно создать общее сетевое хранилище подключения серверов виртуализации.

В инете предлагаются такие варианты:
DRBD Pacemaker Corosync NFS
DRBD OCFS2

На каждом сервере планирую создать RAID6 и 1 hotspare.

Можно ли использовать для ускорения SSD, если контроллер не поддерживает кэш из них?
Нужно ли отключать кэш RAID-контроллера?

 ,

WinLin2
()

В разработке игра, где программируешь в машинных кодах. DECU EMU

Форум — Development

Прочитав первые две главы Криса Касперского «Техника отладки программ без исходных кодов», я вдохновился на написание простого эмулятора, где мы как в старые времена пишем в hex редакторе опкоды инструкций.

Очень даже занимательный процесс, особенно учитывая, что инструкций всего 16 и их можно запомнить. Если проект не заглохнет и будет интересен мне и далее, то я сделаю сборку для android и аврора, где можно будет делать игры прямо вписывая машинные инструкции. Мне кажется, что такое уровень сложности должен кого-то привлечь.

Ну вот, с помощью мотивации я сделал себе два прекрасных дня, и теперь можно продолжить читать книгу.

https://habr.com/ru/articles/871634/

Перемещено hobbit из games

 

peeruoeso
()

Потянет ли Supermicro X8DTU Intel Xeon X5690

Форум — Linux-hardware

Столкнулся с вопросом. Есть сервак, на базе Supermicro X8DTU. На сайте производителя сказано, что он поддерживает процессоры: Xeon®Processor 5600 Series (Westmere). В данной линейки до процессоров Intel Xeon X5674 энергопотребление идет 90 ватт. Но вот есть в этой же линейки процессор Intel Xeon X5690, вот он уже потребляет до 120 ватт. На сайте производителя нет четкой информации по данному вопросу.
Есть у кого опыт использования данной метеринке в связке с данным процессором?

 

iliaxxx
()

Программирование древнего и экзотического big-endian ARM

Форум — Development

Нашёл в условном ящике стола мобильник Motorola SLVR L6, которому почти 20 лет. Протёр пыль, зарядил батарейку «лягушкой» – до сих пор рабочий чертяка. Оказалось, что под него можно кодить не только на унылом подмножестве Java – J2ME, но и на православной сишке и даже плюсцах. Скачал кросс-компилятор и SDK, доступные как под Linux, так и под Windows и решил написать пару GUI-программок и подёргать функции из прошивки телефона, но столкнулся с одной странной особенностью, про которую хочу уточнить у специалистов.

Есть у меня следующий минимально-неработающий пример и функция wtf_foo(), которую по хорошему нужно инлайнить, но похоже что в кросс-компиляторе вообще не работают инлайны:

#define SWAP_UINT32(x) (((x) >> 24) | (((x) & 0x00FF0000) >> 8) | (((x) & 0x0000FF00) << 8) | ((x) << 24))

static uint8_t bmp_header[70] = {
	0x42, 0x4D, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x46, 0x00, 0x00, 0x00, 0x38, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x01, 0x00, 0x10, 0x00, 0x03, 0x00,
	0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0xE0, 0x07, 0x00, 0x00, 0x1F, 0x00,
	0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

static void wtf_foo(uint8_t *start_address, uint32_t start_offset, uint32_t value) {
	*((uint32_t *) &start_address[start_offset]) = value;
	/* start_address[start_offset + 0x00] = (value >>  0) & 0x000000FF; */
	/* start_address[start_offset + 0x01] = (value >>  8) & 0x000000FF; */
	/* start_address[start_offset + 0x02] = (value >> 16) & 0x000000FF; */
	/* start_address[start_offset + 0x03] = (value >> 24) & 0x000000FF; */
}

void main(void) {
	print_hex();
	wtf_foo(bmp_header, 0x02, SWAP_UINT32(41030));
	wtf_foo(bmp_header, 0x12, SWAP_UINT32(128));
	wtf_foo(bmp_header, 0x16, SWAP_UINT32(160));
	wtf_foo(bmp_header, 0x22, SWAP_UINT32(40960));
	print_hex();
}

Результаты исполнения кода:

42 4D |FF FF FF FF| 00 00 00 00 46 00 00 00 38 00
00 00 |FF FF FF FF FF FF FF FF| 01 00 10 00 03 00
00 00 |FF FF FF FF| 00 00 00 00 00 00 00 00 00 00         (1)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
00 00 00 00 00 00

42 4D |46 A0 00 00| 00 00 00 00 46 00 00 00 38 00
00 00 |80 00 00 00 A0 00 00 00| 01 00 10 00 03 00
00 00 |00 A0 00 00| 00 00 00 00 00 00 00 00 00 00         (2)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00
00 00 00 00 00 00

|46 A0 00 00| FF FF 00 00 00 00 46 00 00 00 38 00 
|80 00 00 00 A0 00 00 00| FF FF 01 00 10 00 03 00 
|00 A0 00 00| FF FF 00 00 00 00 00 00 00 00 00 00         (3)
00 00 00 00 00 00 00 F8 00 00 E0 07 00 00 1F 00 
00 00 00 00 00 00
  1. Оригинальный массив без изменений.
  2. Результат работы кода на x86_64, little-endian, хост.
  3. Результат работы кода на ARMv4T, big-endian, целевая железка.

Примечание: Макрос SWAP_UINT32() используется только на целевом устройстве. Код функции wtf_foo() который закомментирован отрабатывает везде одинаково и нормально.

Не понимаю откуда тут берётся сдвиг влево, почему он именно на два байта? Хочется разобраться в чём именно причина этой ошибки? Где-то моя невнимательность при работе с ARM и big-endian или что-то другое, к примеру, баг в компиляторе?

Дополнительная информация, если кому интересно:

Компилятор:
     ARM C/C++ Compiler, ADS1.2 [Build 848]
     Thumb C/C++ Compiler, ADS1.2 [Build 848]
Железо:
     SOC: Freescale/Motorola Neptune LTE
     CPU: ARM7TDMI | ARMv4T | big-endian | 52 MHz
     RAM: (4) 8 MB, 1.5 MB free.
     DSP: 104 MHz StarCore DSP
Операционная система:
     P2K OS: Synergy Environment + VRTXmc RTOS Kernel.

P.S. Внутри девайса не Linux, но есть какой-то кастрированный libc и UNIX-подобная регистрозависимая файловая система.

 , , ,

EXL
()

Как в скрипте детектнуть - запустил его cron или запустили его с консоли?

Форум — Development

Можно аргумент скрипту передать при запуске cron ом. Может есть способ лучше?

 , ,

Vlad-76
()

journald. Запись на диск только критически важной информации

Форум — Admin

Т.е, чтобы текущий лог можно было прочитать(чтобы он в памяти находился) и только всякое критическое записывалось на диск. Зачем это? Потому что journald гигабайтами пишет информацию на диск, хотелось бы, чтобы он этого не делал

С 28 февраля

Data Units Read:                    4,093,715 [2.09 TB]
Data Units Written:                 1,066,151 [545 GB]

до 25 августа

Data Units Read:                    4,790,068 [2.45 TB]
Data Units Written:                 1,295,987 [663 GB]

118гб записано. Ясно, что тут не только лог писал, еще было 2 обновления. Но примерно 50% тут journald поработал. Идеологически считаю, что то, что пишет journald на диск - мусор. Хотелось бы какой-то level типа error выставить, чтобы он не спамил мусор на диск

 

serg002
()

Виртуалка с Debian 11. Как исправить ошибку с зависимостями в пакетах

Форум — Admin

Понадобился fail2ban на виртуалке, но тут вылезло ...
После чего случилось - уже и не вспомню. Как исправить чтобы не ставить кучу пакетов для исправления? Виртуалка мизерная, крутится несколько процессов, ничего лишнего на ней не нужно, даже просто файлы с пакетами. Они просто не нужны для выполняемых задач

root@acid:/usr/local/# apt install fail2ban
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
You might want to run 'apt --fix-broken install' to correct these.
The following packages have unmet dependencies:
 code : Depends: libasound2 (>= 1.0.17) but it is not going to be installed
        Depends: libatk-bridge2.0-0 (>= 2.5.3) but it is not going to be installed
        Depends: libatk1.0-0 (>= 2.2.0) but it is not going to be installed
        Depends: libatspi2.0-0 (>= 2.9.90) but it is not going to be installed
        Depends: libdrm2 (>= 2.4.75) but it is not going to be installed
        Depends: libgbm1 (>= 17.1.0~rc2) but it is not going to be installed
        Depends: libgtk-3-0 (>= 3.9.10) but it is not going to be installed
        Depends: libgtk-3-0 (>= 3.9.10) but it is not going to be installed or
                 libgtk-4-1 but it is not installable
        Depends: libnspr4 (>= 2:4.9-2~) but it is not going to be installed
        Depends: libnss3 (>= 2:3.30) but it is not going to be installed
        Depends: libnss3 (>= 3.26) but it is not going to be installed
        Depends: libxcomposite1 (>= 1:0.4.4-1) but it is not going to be installed
        Depends: libxdamage1 (>= 1:1.1) but it is not going to be installed
        Depends: libxfixes3 but it is not going to be installed
        Depends: libxkbcommon0 (>= 0.4.1) but it is not going to be installed
        Depends: libxkbfile1 but it is not going to be installed
        Depends: libxrandr2 but it is not going to be installed
        Depends: xdg-utils (>= 1.0.2) but it is not going to be installed
        Recommends: libvulkan1 but it is not going to be installed
E: Unmet dependencies. Try 'apt --fix-broken install' with no packages (or specify a solution).

root@acid:/usr/local/# apt --fix-broken install
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
Correcting dependencies... Done
The following packages were automatically installed and are no longer required:
  libblas3 liblinear4 nmap-common
Use 'apt autoremove' to remove them.
The following additional packages will be installed:
  adwaita-icon-theme alsa-topology-conf alsa-ucm-conf at-spi2-core dbus dbus-user-session dconf-gsettings-backend dconf-service
  glib-networking glib-networking-common glib-networking-services gsettings-desktop-schemas gtk-update-icon-cache hicolor-icon-theme
  libasound2 libasound2-data libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0 libauthen-sasl-perl libavahi-client3
  libavahi-common-data libavahi-common3 libcairo-gobject2 libclone-perl libcolord2 libcups2 libdata-dump-perl libdbus-1-3 libdconf1
  libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libencode-locale-perl libepoxy0
  libfile-basedir-perl libfile-desktopentry-perl libfile-listing-perl libfile-mimeinfo-perl libfont-afm-perl libfontenc1 libgbm1
  libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgl1 libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0
  libglx0 libgtk-3-0 libgtk-3-bin libgtk-3-common libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl
  libio-html-perl libio-socket-ssl-perl libio-stringy-perl libipc-system-simple-perl libjson-glib-1.0-0 libjson-glib-1.0-common
  liblcms2-2 libllvm11 liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libnet-dbus-perl libnet-http-perl
  libnet-smtp-ssl-perl libnet-ssleay-perl libnspr4 libnss3 libpciaccess0 libproxy1v5 librest-0.7-0 librsvg2-2 librsvg2-common
  libsoup-gnome2.4-1 libsoup2.4-1 libtie-ixhash-perl libtimedate-perl libtry-tiny-perl liburi-perl libvte-2.91-0 libvte-2.91-common
  libvulkan1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwayland-server0 libwww-perl libwww-robotrules-perl libx11-6
  libx11-protocol-perl libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shape0 libxcb-sync1
  libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2 libxi6 libxinerama1 libxkbcommon0 libxkbfile1
  libxml-parser-perl libxml-twig-perl libxml-xpathengine-perl libxrandr2 libxshmfence1 libxtst6 libxv1 libxxf86dga1 libxxf86vm1
  libz3-4 mesa-vulkan-drivers perl-openssl-defaults termit x11-utils x11-xserver-utils xdg-utils xkb-data
Suggested packages:
  libasound2-plugins alsa-utils libdigest-hmac-perl libgssapi-perl colord cups-common gvfs liblcms2-utils libcrypt-ssleay-perl
  pciutils librsvg2-bin libauthen-ntlm-perl libunicode-map8-perl libunicode-string-perl xml-twig-tools mesa-utils nickle cairo-5c
  xorg-docs-core
The following NEW packages will be installed:
  adwaita-icon-theme alsa-topology-conf alsa-ucm-conf at-spi2-core dbus-user-session dconf-gsettings-backend dconf-service
  glib-networking glib-networking-common glib-networking-services gsettings-desktop-schemas gtk-update-icon-cache hicolor-icon-theme
  libasound2 libasound2-data libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0 libauthen-sasl-perl libavahi-client3
  libavahi-common-data libavahi-common3 libcairo-gobject2 libclone-perl libcolord2 libcups2 libdata-dump-perl libdconf1
  libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libdrm2 libencode-locale-perl libepoxy0
  libfile-basedir-perl libfile-desktopentry-perl libfile-listing-perl libfile-mimeinfo-perl libfont-afm-perl libfontenc1 libgbm1
  libgdk-pixbuf-2.0-0 libgdk-pixbuf2.0-bin libgdk-pixbuf2.0-common libgl1 libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0
  libglx0 libgtk-3-0 libgtk-3-bin libgtk-3-common libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl
  libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl libhttp-message-perl libhttp-negotiate-perl
  libio-html-perl libio-socket-ssl-perl libio-stringy-perl libipc-system-simple-perl libjson-glib-1.0-0 libjson-glib-1.0-common
  liblcms2-2 libllvm11 liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl libnet-dbus-perl libnet-http-perl
  libnet-smtp-ssl-perl libnet-ssleay-perl libnspr4 libnss3 libpciaccess0 libproxy1v5 librest-0.7-0 librsvg2-2 librsvg2-common
  libsoup-gnome2.4-1 libsoup2.4-1 libtie-ixhash-perl libtimedate-perl libtry-tiny-perl liburi-perl libvte-2.91-0 libvte-2.91-common
  libvulkan1 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwayland-server0 libwww-perl libwww-robotrules-perl
  libx11-protocol-perl libx11-xcb1 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0 libxcb-shape0 libxcb-sync1
  libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2 libxi6 libxinerama1 libxkbcommon0 libxkbfile1
  libxml-parser-perl libxml-twig-perl libxml-xpathengine-perl libxrandr2 libxshmfence1 libxtst6 libxv1 libxxf86dga1 libxxf86vm1
  libz3-4 mesa-vulkan-drivers perl-openssl-defaults termit x11-utils x11-xserver-utils xdg-utils xkb-data
The following packages will be upgraded:
  dbus libdbus-1-3 libx11-6
3 upgraded, 139 newly installed, 0 to remove and 102 not upgraded.
1 not fully installed or removed.
Need to get 72.0 MB of archives.
After this operation, 285 MB of additional disk space will be used.
Do you want to continue? [Y/n]

 ,

Vlad-76
()

с++ привести тип std::string к указателю на другой тип

Форум — Development

server.cpp:81:66: error: invalid initialization of reference of type ‘const OctetStringPtr&’ {aka ‘const std::shared_ptr<std::vector<unsigned char> >&’} from expression of type ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’}

Или что почитать грамотное про это?

 

Vlad-76
()

UPS на 12 В из контроллера для солнечных батарей

Форум — Linux-hardware

Мое почтение, господа.

Поскольку подкроватный сервер и все окружающее его сетевое оборудование работает у меня от 12 или 9 В. Я подумал, а не сделать ли беcперебойник из автомобильного аккумулятора и контроллера, который используют вместе с солнечными панелями. Ну а сам контроллер уже запитать от какого-то 12-вольтового источника.
В идеале, хотелось бы иметь еще какой-то интерфейс (UART, I2C, etc), чтобы можно было получить состояние сети и/или заряд/напряжение аккумулятора.

Думал, у китайцев должна какая-то плата быть, у них же все есть на любой случай жизни — но не нашел. Может я плохо искал? Нормальный ли вариант с солнечным контроллером?

 

urxvt
()

Создание устойчивого серверного ПО

Форум — Development

Добрый день, ЛОР! Давно не постил, потому что нечего было сказать. А сейчас, кажется, есть.

Имеем проблему создания типичного транзакционного сервиса - банковское приложение, интернет-магазин, аренда чего-либо, т.д. Как сделать его устойчивым как с точки зрения корректности - запросы не теряются, дважды не повторяются, если не могут примениться - откатываются с отображением ошибки пользователю - так и с точки зрения UX - сервис сохраняет доступность?

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

Итак, начнём с идемпотентности - свойства запроса обладать возможностью быть исполненным несколько раз, и иметь эффект как от одного исполнения. Ценность в следующем - допустим, клиент производил запрос, и соединение оборвалось. Был запрос принят или нет - не понятно. Если клиент переводил на другой счёт деньги - может ли он обновить страницу и не бояться, что деньги спишутся дважды? Проще всего достижимо добавлением id запроса в его тело - если запрос уже был исполнен, операция не производится, и возвращается сохранённый результат.

Далее распределённые транзакции, самый оптимальный вариант - сага. Сценарий - при заказе еды с доставкой, необходимо списать деньги со счёта, подать заявку на кухню, вызвать курьера. Все три действия должны произойти атомарно - если одно из них исполнить невозможно, два других нужно отменить, и передать пользователю ошибку. Откатываемая цепочка транзакций называется сагой.

Как достигнуть устойчивости? Имеем парк серверов, каждый из них выполняет свою операцию, с возможностью её отменить - их необходимо координировать в условиях риска выхода из строя серверов, ПО и сети. При выходе из строя сервера необходимо, чтобы он возобновил исполнение присвоенных ему операций - нужно сохранять их в реплицированную БД. Кажется, любая простая БД типа Ключ-Значение подойдёт. Когда исполнение возобновится - оно должно продолжить с момента последней транзакции в цепочке - то есть после каждой транзакции в цепочке, промежуточное состояние должно сохраняться в БД - с возможностью возобновления операции другим исполнителем.

Теперь координация задач - её можно производить либо централизованно, с механизмами RPC, либо распределённо, через брокер сообщений, с реакцией на их получение. В первом случае получаем лучшую отслеживаемость, во втором - большую устойчивость к отказу исполнителей - сообщения могут хранится в брокере.

Уточним, какой конкретно мерой будет достигаться устойчивость. Наш сервис будет устойчивым, поскольку в момент принятия запроса, достоверно известно, сколько на его исполнение необходимо памяти и процессорного времени - и мы можем надёжно их зарезервировать. Если их нет - мы сразу отвечаем ошибкой. Сюда можно отнести время исполнения - но это можно контролировать на стороне клиента. Верхнеуровнево - сервер разделён по памяти и процессору на обработчики, и мы можем достоверно сказать, сколько обработчиков могут исполняться одновременно. Предсказуемость - ключевая составляющая устойчивости.

Но какой должен быть лимит по ресурсам для абстрактного запроса? Поскольку если запрос - «Исполнить SQL выражение» (в случае, если наш сервис - база данных) - у него может быть самое разное потребление памяти и процессорного времени. Решением, на мой взгляд, будет разделение непредсказуемого запроса на предсказуемые - и заранее зная их количество и стоимость, можно оценить затраты на изначальный запрос. Для SQL запроса это будет сначала запрос типа PLAN - сам по себе достаточно предсказуемый - а затем проверка наличия ресурсов и исполнение для каждого шага плана. Но если верхнеуровневый запрос, не имеющий достаточно ресурсов, имеет смысл отбросить сразу - то порождённые запросы стоит выстраивать в очередь.

Зная ограничения по ресурсам, необходимо реализовать их соблюдение. В этом нам поможет ядро ОС - оно отслеживает объём памяти, закреплённый за процессом, и процессорное время, им затраченное. В Linux порог можно выставить командой ulimit и системным вызовом setrlimit. Вводить ограничения необходимо именно на уровне процесса, поскольку память по факту принадлежит не потоку и не корутине, а именно процессу (стек у каждого свой, но куча - общая для процесса), и если память кончается - OOM Killer убивает процесс. Ситуация сложнее для cgroup, в которых выставлено убийство всей cgroup сразу (как для подов в k8s), но это отдельная история, и ulimit можно ставить чуть ниже суммарного ограничения для cgroup. Теперь касательно процессорного времени - оно также действует на процесс целиком (может есть лимит на конкретный поток?). Конечно, запуск процесса под каждый запрос - схема плохо масштабируемая (хотя с идеологической точки зрения, кажется, наиболее правильная), поэтому можно использовать пул процессов, поднимающих свои лимиты для каждого запроса. Также можно запускать N корутин в каждом процессе - суммируя их лимиты. Если одна корутина перейдёт порог, убиты будут все N - но это лучше, чем если бы все запросы жили корутинами в одном процессе, и умерли бы все.

Я вполне представляю, как это можно реализовать для Reverse-proxy (nginx, apache), Python и gRPC. Для разных методов gRPC, каждый из которых предсказуем, указываем в Reverse Proxy свой обработчик - пул процессов. Python достаточно низкоуровневый для общения с ядром, чтобы каждый процесс мог менять свои лимиты. И реализация gRPC имеет параметр max_concurrent_rpcs - чтобы предотвратить DDOS (только на L7, или ещё на L3+4 - не знаю. Но кажется в любом случае, AntiDDOS на L3+4 умеет Reverse Proxy). Если вам подход показался разумным - как бы вы реализовывали на своём ЯП?

 , ,

lostghost1
()

Анализ процесса

Форум — Admin

Привет всем! Подскажите утилиту которой можно подключиться к процессу и увидеть, какая функция активно используется. Я ее использовал раньше, но сейчас не могу вспомнить название.

 

anonymus123
()