LINUX.ORG.RU

Сообщения JaM

 

Ядро неправильно определяет объём памяти в системе

Столкнулся тут с забавной вещью. После обновления ядра до 6.3.4 на узлах кластера пропала память. free показывает

               total        used        free      shared  buff/cache   available
Mem:         3228592      120904     3052276         660       55412     2860604
Swap:              0           0           0

а должно быть

               total        used        free      shared  buff/cache   available
Mem:        16294464      120336    16118568         660       55560    15874324
Swap:              0           0           0

После разбирательства выяснил, что в 6.2 появилась опция CONFIG_EFI_HANDOVER_PROTOCOL, объявленная deprecated. Я её отключил и остался с тремя гигами памяти из 16-ти. Включив обратно, получил положенные 16 гигов. Хотелось бы понять, какого лешего так получается? На сервере эта опция отключена, никаких проблем нет. Ядра на узлы грузятся по сети, загрузчик - syslinux.efi, initrd нет.

 , ,

JaM
()

Куда исчезает второй пробел?

Вот баш скрипт

#!/bin/bash

declare -A test1=( a "b  b" )
echo "${test1["a"]}"

eval declare -A test2=( $(echo "a \"b  b\"") )
echo "${test2["a"]}"

который выдаёт в результате

b  b
b b

Не могу понять, почему исчезает пробел во втором случае, и как это предотвратить.

 ,

JaM
()

Почему компилируется такой код?

#include<iostream>
#include<stack>

struct Node
{
 double r=0;
 explicit Node(double rr): r(rr) {}
 explicit Node(bool bb): r(-1.0) {}
};

int main()
{
 std::stack<Node> st;
 double r=10.0;

 st.emplace(&r);
 std::cout<<st.top().r<<std::endl;
}

Код компилируется, печатает -1, но я не понимаю почему. Каким образом st.emplace(double*) вызывает конструктор Node(bool), даже если он explicit?

 ,

JaM
()

Variadic templates и list initialization

Собственно, код (https://gcc.godbolt.org/z/TWW7M9z48):

#include <vector>
#include <string>

struct Foo
{
 std::string s;
 size_t b,e;
};

template<class... T>
auto Baz(struct Foo&& foo, T&&... t)
{
 return std::vector<struct Foo>({std::move(foo),std::move(t)...});
}

int main()
{
 //Baz({"q",10,20},{"g",11,50});
 Baz({"q",10,20});
 return 0;
}

Закоментированная строка не работает, компилятор ругается на невозможность вывода T. Звучит логично, но хотелось бы иметь возможность передавать структуры в функцию именно в виде списка инициализации. Как вариант, сработало бы

auto Baz(std::vector<struct Foo>&& foo);
Baz({{"q",10,20},{"g",11,50}});

но неохота ещё пару скобок писать.

 

JaM
()

Куда пропали имена временных зон из вывода date?

Делаем TZ=Europe/Moscow date

Получаем что-то типа:

Чт 01 апр 2021 06:32:21 MSK

Зона MSK указана, всё нормально. Берём другую зону, например

TZ=Asia/Irkutsk date

Получаем

Чт 01 апр 2021 11:36:28 +08

Вместо сокращённого имени зоны IRKT пишется просто +08. Та же фигня для Красноярска (+07 вместо KRAT) и Владивостока (+10 вместо VLAT). Это на генте с последней timezone-data. Как вернуть имена зон?

 

JaM
()

Карта x8 в слоте x16 работает как x4

Есть материнка M4A89GTD-PRO/USB3, у неё два слота pci express x16. По документации они работают или как один слот x16, если второй пустой, или как два x8. Есть сетевая карта 82599ES 10-Gigabit, 8x. Втыкаю её в любой из слотов x16 (x8 на плате нет), второй при этом пустой. По идее, карта должна работать на x8, но в lspci -vvv вижу следующее:

LnkCap: Port #1, Speed 5GT/s, Width x8, ASPM L0s, Exit Latency L0s <1us
LnkSta: Speed 5GT/s (ok), Width x4 (downgraded)

Две таких же карты стоят в других машинах, там всё как положено, без downgrade. Отчего такое происходит и как это побороть?

 

JaM
()

Raspberry Pi 4 и WiFi

Имеется сабж, имеются две операционки, Raspbian и Gentoo. В Raspbian WiFi работает, в Gentoo не работает, wpa_supplicant сыпет сообщениями

wlan0: CTRL-EVENT-ASSOC-REJECT bssid=00:00:00:00:00:00 status_code=16

hostapd на сервере при этом молчит. Ядра одинаковы (выбор системы в initramfs делается), firmware идентичны (тупо скопировал с Raspbian в Gentoo). Пробовал в генте монтировать фс с Raspbian и запускать wpa_supplicant оттуда, поведение идентичное. В чём может быть проблема?

 , ,

JaM
()

Инициализация памяти оператором new в c++

Не могу разобраться, в каких случаях new НЕ инициализирует память. Для классов с конструкторами, понятно, вызывается конструктор, память инициализируется. Для простых типов, похоже, что нет. А для структур, например? Просто мне надо выделять память под прочитанные из файла данные и терять время на её инициализацию неохота. malloc - то, что нужно, но хотелось бы иметь возможность обмазываться синтаксическим сахаром, типа unique_ptr.

 , ,

JaM
()

Настройка количества потоков nfsd

Собственно, раньше процедура была достаточно проста, смотрим /proc/fs/nfsd/pool_stats и увеличиваем количество потоков, пока sockets-enqueued не перестанет расти. Сейчас, заглянув в pool_stats, увидел какую-то бредовую картину:

# pool packets-arrived sockets-enqueued threads-woken threads-timedout
0 37063 37063 37059 0
Количество packets-arrived совпадает с sockets-enqueued. Но, по документации sockets-enqueued + threads-woken должно быть меньше или равно packets-arrived. Ядро 4.18. Что-то поменяли в последних ядрах, а доки не обновили?

 

JaM
()

constexpr массивы в c++

Вот простой пример:

#include <iostream>

class A
{
 static constexpr int a[]={0,1,2,3,4};
 public:
 static int Get(size_t ind) { return a[ind]; }
};

int main(int argc, char** argv)
{
 std::cout<<A::Get(argc)<<std::endl;
 return 0;
}
Собираю с g++. Получаю ошибку компоновщика
function A::Get(unsigned long): error: undefined reference to 'A::a'
Понятно, что компилятор делает constexpr массив не constexpr, но какого хрена и почему компоновщик его не находит? Тем более, что, если массив не в составе класса, то всё работает:
#include <iostream>

constexpr int a[]={0,1,2,3,4};
int Get(size_t ind) { return a[ind]; }

int main(int argc, char** argv)
{
 std::cout<<Get(argc)<<std::endl;
 return 0;
}
Пробовал с clang++, результаты идентичные.

 

JaM
()

«Fatal or unknown error» в SMART Self-test log

В логе самотестирования смарта стали появляться Fatal or unknown error, при запуске short теста он зависает на 10% остатка.

SMART Self-test log structure revision number 1 Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error # 1 Short offline Fatal or unknown error 60% 21857 - # 2 Short offline Fatal or unknown error 10% 21837 - # 3 Short offline Fatal or unknown error 10% 21809 - # 4 Short offline Fatal or unknown error 90% 21785 - # 5 Short offline Fatal or unknown error 90% 21761 - # 6 Short offline Fatal or unknown error 90% 21737 - # 7 Short offline Completed without error 00% 21162 - # 8 Short offline Completed without error 00% 21138 - # 9 Short offline Completed without error 00% 21114 - #10 Short offline Completed without error 00% 21090 - #11 Short offline Completed without error 00% 21066 - #12 Extended offline Completed without error 00% 21058 - #13 Short offline Completed without error 00% 21042 - #14 Short offline Completed without error 00% 21019 - #15 Short offline Completed without error 00% 20995 - #16 Short offline Completed without error 00% 20971 - #17 Short offline Completed without error 00% 20947 - #18 Short offline Completed without error 00% 20923 - #19 Short offline Completed without error 00% 20899 - #20 Extended offline Completed without error 00% 20891 - #21 Short offline Completed without error 00% 20875 -

Вывод smartctl -a https://pastebin.com/EZw0K15a

Что это такое и как с ним бороться?

 ,

JaM
()

KDE Telepathy и jabber.ru

Поставил в генте telepathy на посмотреть. Добавляю свой аккаунт на jabber.ru, но соединяться не хочет, пишет «ошибка аутентификации (проверьте пароль)». Пароль я тупо вставляю ctrl+v, так что он верный, и, будучи вставлен в другой клиент, он работает. С аккаунтом на jabberid.org соединяется нормально. Может, надо какие-то специальные параметры соединения указывать, я их оставлял по умолчанию?

 ,

JaM
()

Работа с високосными секундами в glibc

Пытаюсь разобраться с високосными секундами. POSIX утверждает, что gmtime и mktime должны ложить на них болт. Тем не менее, в мануале glibc сказано, что tm_sec в struct tm может быть от 0 до 60, чтобы учитывать при наличии поддержки високосную секунду. Также сказано, что gmtime работает со временем UTC. Человек со здравым рассудком решил бы, что результат вызова gmtime не зависит от переменной TZ и /еtс/localtime. Но беда в том, что в линуксе существует два набора временных зон - right и posix, с учётом и без учёта високосных секунд. Соответственно, поведение gmtime, всё-таки, зависит от того, какая временная зона используется (проверено). Установить, учитываются високосные секунды или нет, несложно. Но как сделать, чтобы gmtime гарантированно не учитывал високосные секунды? TZ=UTC, очевидно, недостаточно, потому что /usr/share/zoneinfo может содержать не позиксовый набор временных зон, а «правильный».

 ,

JaM
()

Неизвестныe kernel threads

В списке процессов вижу два вот таких:

[172.16.1.1-mana]

[172.16.1.2-mana]

Это вообще кто?

JaM
()

Почему может не работать -j MARK?

Делаю

iptables -t mangle -A PREROUTING -d 192.168.0.0/24 -j MARK --set-mark 2
ping -c 4 192.168.0.4
iptables -t mangle -L -v

Получаю шиш

Chain PREROUTING (policy ACCEPT 122K packets, 123M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MARK       all  --  any    any     anywhere             192.168.0.0/24       MARK set 0x2

Почему не срабатывает правило?

 

JaM
()

Ищу культурное наследие VSL

Помнится, в сети был сайт некоего научного фрика, на котором он опубликовал свою переписку с VSL. История, насколько я помню, была такова: фрик тот послал какую-то свою мегатеорию в институт, в котором тогда VSL работал. Отвечать поручили VSL, что он с успехом и проделал в своей неподражаемой манере. Фрик, естественно, обиделся и написал письмо уже непосредственно директору, но ответ, чсх, получил опять от Луговского. В результате кисо обиделось окончательно и выложило оба весьма доставляющих письма у себя на сайте. И сейчас я пытаюсь его найти.

Может, кто из местных старожилов помнит, где это было?

JaM
()

Как смонтировать шары от Win98?

Есть несколько машин с 98-ой виндой. Нужно монтировать шары с них на линукс. Раньше юзал smbmount, но в последних ядрах выкинули smbfs. Поставил cifs-utils. Монтирую

mount.cifs //<ip>/<шара> <точка монтирования> -o sec=lanman,servern=<имя netbios>,password=<пароль>

получаю отлуп

mount error(13): Permission denied

Refer to the mount.cifs(8) manual page (e.g. man mount.cifs)

Пароль верный, разумеется. Безпарольные шары монтируются без проблем

mount.cifs //<ip>/<шара> <точка монтирования> -o servern=<имя netbios>

JaM
()

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