LINUX.ORG.RU

Сообщения disarmer

 

Маршрутизация и wireguard

Привет!

Тестирую wireguard (аналог vpn в ядре), весь исходящий трафик работает отлично, но проблема с входящим. При получении пакета на реальный интерфейс(enp4s0, адрес 192.168.0.101), система пытается ответить с этого адреса через wireguard-интерфейс(mullvad).

Запускаю wireguard через дефолтный wg-quick up. После подключения, весь трафик начинает ходить через wireguard интерфейс, в таблице маршрутизации это:

% ip route show table all
default dev mullvad table 51820 scope link
default via 192.168.0.1 dev enp4s0 src 192.168.0.101 metric 202
192.168.0.0/24 dev enp4s0 proto kernel scope link src 192.168.0.101 metric 202
local 10.99.0.34 dev mullvad table local proto kernel scope host src 10.99.0.34
broadcast 127.0.0.0 dev lo table local proto kernel scope link src 127.0.0.1
local 127.0.0.0/8 dev lo table local proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo table local proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo table local proto kernel scope link src 127.0.0.1
broadcast 192.168.0.0 dev enp4s0 table local proto kernel scope link src 192.168.0.101
local 192.168.0.101 dev enp4s0 table local proto kernel scope host src 192.168.0.101
broadcast 192.168.0.255 dev enp4s0 table local proto kernel scope link src 192.168.0.101
default dev mullvad table 51820 metric 1024  pref medium
unreachable default dev lo proto kernel metric 4294967295  error -101 pref medium
fec0:bbbb:bbbb:bb01::34 dev mullvad proto kernel metric 256  pref medium
unreachable default dev lo proto kernel metric 4294967295  error -101 pref medium
local ::1 dev lo table local proto unspec metric 0  pref medium
local fec0:bbbb:bbbb:bb01::34 dev lo table local proto unspec metric 0  pref medium
ff00::/8 dev mullvad table local metric 256  pref medium
unreachable default dev lo proto kernel metric 4294967295  error -101 pref medium

Пробовал так, не помогло:

ip route add from 192.168.0.0 24 dev enp4s0

Подскажите, пожалуйста, как объяснить ему, что с локального адреса нужно отправлять трафик через физический интерфейс?

 , ,

disarmer
()

Утекает память в ядре

Привет!

На нескольких машинах с hadoop datanode под ubuntu 14.04 постепенно утекает память (со скоростью ~гигабайт в 3-5 дней, судя по графику равномерно, без скачков). Сумма rss всех процессов значительно, меньше чем поле used в выводе free с учётом буфферов и кеша. Вот содержимое /proc/meminfo после остановки всех лишних процессов и сброса кеша fs:

MemTotal:       12304532 kB
MemFree:         6095396 kB
Buffers:            3016 kB
Cached:            22232 kB
SwapCached:            0 kB
Active:            77920 kB
Inactive:         202592 kB
Active(anon):      61800 kB
Inactive(anon):   193896 kB
Active(file):      16120 kB
Inactive(file):     8696 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:      12580860 kB
SwapFree:       12580860 kB
Dirty:                24 kB
Writeback:             0 kB
AnonPages:        254908 kB
Mapped:            20664 kB
Shmem:               552 kB
Slab:              59080 kB
SReclaimable:      29820 kB
SUnreclaim:        29260 kB
KernelStack:        1656 kB
PageTables:         3736 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    18733124 kB
Committed_AS:     306980 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       41192 kB
VmallocChunk:   34359673284 kB
HardwareCorrupted:     0 kB
AnonHugePages:     24576 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       50560 kB
DirectMap2M:    12531712 kB

Здесь видно, что MemFree составляет всего лишь половину от MemTotal, хотя даже количество виртуальной памяти выданной процессам всего лишь 300MB. В slabtop ничего прожорливого тоже нет. Пробовал kmemleak, он ничего не поймал за трое суток, хотя память всё так же течёт.

Ядро стандартное, одинаковое поведение на 3.13.0-24-generic и 3.13.0-106-generic

Куда еще можно посмотреть, чтобы выявить чем это вызвано?

 , ,

disarmer
()

bash, запись в переменную без подпроцесса

Привет!

Как в bash или zsh записать выхлоп встроенной команды в переменную без форка оболочки?

A=$(builtin type ps)   #форкается
builtin type ps|read A #тоже
A=`builtin type ps`    #тоже
builtin type ps>/tmp/1;read A</tmp/1; #не форкается, но костыль

Проверить количество форков можно так:

pid(){ date>/dev/null& echo $!; };S=$(pid);for i in {1..100}; do КОД;done;E=$(pid);echo $((E-S))

 ,

disarmer
()

systemd-nspawn networking

Всем привет!

Внезапно после одного из обновлений systemd перестала работать macvlan сеть в nspawn контейнерах. netctl говорит что нет такого интерфейса, хотя ip говорит что он есть. Переименование в enp4s0 не помогает.

[disarmer@php❱~]% sudo systemctl status netctl@test
● netctl@test.service - Networking for netctl profile test 
   Loaded: loaded (/usr/lib/systemd/system/netctl@.service; static; vendor preset: disabled)
   Active: failed (Result: exit-code) since Пт 2015-10-09 01:00:07 MSK; 2s ago
     Docs: man:netctl.profile(5)
  Process: 104 ExecStart=/usr/lib/network/network start %I (code=exited, status=1/FAILURE)
 Main PID: 104 (code=exited, status=1/FAILURE)

окт 09 01:00:07 php systemd[1]: Starting Networking for netctl profile test...
окт 09 01:00:07 php network[104]: Starting network profile 'test'...
окт 09 01:00:07 php network[104]: Interface 'mv-enp4s0' does not exist
окт 09 01:00:07 php network[104]: Failed to bring the network up for profile 'test'
окт 09 01:00:07 php systemd[1]: netctl@test.service: Main process exited, code=exited, status=1/FAILURE
окт 09 01:00:07 php systemd[1]: Failed to start Networking for netctl profile test.
окт 09 01:00:07 php systemd[1]: netctl@test.service: Unit entered failed state.
окт 09 01:00:07 php systemd[1]: netctl@test.service: Failed with result 'exit-code'.

[disarmer@php❱~]% ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: mv-enp4s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default 
    link/ether ce:00:83:9e:ce:ea brd ff:ff:ff:ff:ff:ff link-netnsid 0

[disarmer@php❱~]% ls /sys/class/net/
enp4s0  lo

[disarmer@php❱~]% sudo dhcpcd -B -d
dhcpcd-6.9.3 starting
dev: loaded udev
no valid interfaces found
no interfaces have a carrier

Если поднимать вручную (ip link set up, address add, route add) то сеть работает. Arch, версия systemd 226, несколько версий назад всё работало с dhcpcd. Помогите разобраться, пожалуйста

 , , ,

disarmer
()

zsh bug?

Проверьте, пожалуйста, баг в zsh. Уходит в бесконечный цикл при выполнении этого кода(«Р» в русской раскладке):

[[ "Р#" =~ '#' ]] 

Если заменить «Р» на любую другую букву, всё работает. Проявляется на разных машинах в zsh 5.0.8. Локаль ru_RU.UTF-8. Установка переменных RE_MATCH_PCRE или BASH_REMATCH не помогает. В bash работает.

 , ,

disarmer
()

suspend debugging

Всем привет!

У меня проблема с засыпанием ПК (suspend to memory) - примерно в 50% случаев выключается только монитор, power led остаётся горящим, вентиляторы/usb работают. На кнопку питания/reset не реагирует, по сети не доступен. Остаётся только держать кнопку питания 4 секунды. В 50% случаев засыпает и просыпается нормально.

Смена всего железа, кроме видеокарты не помогла. Такая же система на ноуте, с теми же настройками засыпает нормально. Если загрузиться с live-флешки, то проблема не воспроизводится.

Arch, засыпание с помощью systemctl suspend (но то же самое с echo mem > /sys/power/state). Версии не важны, проявляется уже около полугода, несмотря на регулярные обновления.

Как искать источник проблемы?

 , ,

disarmer
()

volume control c обратной связью

Привет

Ищу максимально простую утилиту, которая сможет слушать микрофон и временно повышать громкость приложения или всей системы при повышении громкости фонового шума. Задача - обеспечить максимальную слышимость при внешних помехах, не увеличивая громкость когда нет помех

 ,

disarmer
()

Data mining

Всем привет!

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

% find /usr/bin |head -300 |~/classifier.pl|tail -30
75      /usr/bin/*g
2       /usr/bin/idevice*proxy
2       /usr/bin/tri-*edgeflag
113     /usr/bin/*r
11      /usr/bin/*-config
2       /usr/bin/transmission-*
3       /usr/bin/tri-unfilled-*
4       /usr/bin/Magick*-config
14      /usr/bin/tri-*
29      /usr/bin/*y
19      /usr/bin/l*
2       /usr/bin/mate-*-properties
107     /usr/bin/*s
98      /usr/bin/*d
21      /usr/bin/m*
20      /usr/bin/c*
2       /usr/bin/tri-unfilled-userclip*
3       /usr/bin/x86_64-unknown-linux-gnu-*
108     /usr/bin/*l
2       /usr/bin/x86_64-unknown-linux-gnu-gcc-*
24      /usr/bin/i*
23      /usr/bin/g*
142     /usr/bin/*e
300     /usr/bin*
123     /usr/bin/*p
141     /usr/bin/*t
37      /usr/bin/t*
36      /usr/bin/p*
299     /usr/bin/*

Утилита находит наиболее длинные и общие wildcards и выводит количество совпавших строк stdin. (Звёздочек может быть больше одной).

К сожалению, сложность текущего алгоритма растёт пропорционально квадрату строк. Как подобное написать без квадратичной зависимости? Может есть готовая утилита?

 , , ,

disarmer
()

systemd-escape && systemd-nspawn

Привет!

Перенёс железный сервер в виртуальную машину machinectl. Столкнулся с проблемой определения контрольной группы сервиса:

% systemctl --user show -p ControlGroup tmux.service
ControlGroup=/system.slice/system-systemd\x5cx2dnspawn.slice/systemd-nspawn@grey.service/user.slice/user-1000.slice/user@1000.service/tmux.service

% systemd-escape --unescape $(systemctl --user show -p ControlGroup tmux.service)
ControlGroup=/system.slice/system/systemd\x2dnspawn.slice/systemd/nspawn@grey.service/user.slice/user/1000.slice/user@1000.service/tmux.service
Как видно, во втором случае unescape разэскейпил "-" в «/», но напрасно, потому что на самом деле путь начинается с
/system.slice/system-systemd\x2dnspawn.slice/
Я не испытываю трудностей с преобразованием строк, но так и не смог привести первый вариант ко второму без костылей. ЧЯДНТ? Может есть еще способы узнать cgroup?

 ,

disarmer
()

systemd userspace cgroup

Привет!

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

  └─user-1000.slice
    ├─user@1000.service
    │ ├─305 /usr/lib/systemd/systemd --user
    │ ├─306 (sd-pam)  
    │ ├─kbdd.slice
    │ │ └─run-336.service
    │ │   └─351 /usr/bin/kbdd --nodaemon
    │ ├─autocutsel.slice
    │ │ └─run-340.service
    │ │   └─348 /usr/bin/autocutsel
    │ ├─tmux.service
    │ │ ├─452 /usr/sbin/tmux new-session -d
    │ │ ├─pane_%0
    │ │ │ └─453 -zsh
    │ │ ├─pane_%1
    │ │ │ ├─ 649 -zsh
    │ │ │ ├─1543 systemd-cgls
    │ │ │ └─1544 less
    │ │ ├─pane_%2
    │ │ │ ├─749 -zsh
    │ │ │ └─992 ssh desktop
    │ │ └─pane_%3
    │ │   └─1228 -zsh

Теперь хочу ограничить группу с tmux по памяти. Делаю так:

sudo systemctl set-property user@1000.service MemoryLimit=10000M

Теперь systemd создаёт директорию /sys/fs/cgroup/memory/user.slice/user-1000.slice/user@1000.service, но принадлежит она root. Если дать на неё права пользователю, то я смогу от имени пользователя ограничивать процессы, которые входят в одну из дочерних групп.

Было бы логичным, давать права на эту директорию соответствующему пользователю (как systemd это делает для /sys/fs/cgroup/systemd/user.slice/user-1000.slice/user@1000.service).

Есть какой то способ убедить его отдать права на директорию пользователю?

 , ,

disarmer
()

transmission.socket

Привет!

Не удаётся прикрутить systemd socket activation(по типу inetd) для transmission-daemon. Сервис стартует при обращении к сокету(web ui), но ответ не приходит

% cat transmission.socket
[Unit]
Description=transmission-daemon socket
After=network.target

[Socket]
ListenStream=0.0.0.0:9091

[Install]
WantedBy=sockets.target

% cat transmission.service
[Unit]
Description=Transmission BitTorrent Daemon
After=network.target

[Service]
User=transmission
Type=notify
ExecStart=/usr/bin/transmission-daemon -f --log-error
ExecReload=/bin/kill -s HUP $MAINPID

[Install]
WantedBy=multi-user.target

% sudo netstat -46nlpt|grep -P '(9091|transm)'
tcp        0      0 0.0.0.0:51413           0.0.0.0:*               LISTEN      30240/transmission- 
tcp        1      0 0.0.0.0:9091            0.0.0.0:*               LISTEN      1/init              
tcp6       0      0 :::51413                :::*                    LISTEN      30240/transmission-

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

Нашёл аналогичный случай. тоже не решён https://bbs.archlinux.org/viewtopic.php?id=189265

 , ,

disarmer
()

systemd user unit fencing

Привет!

Как можно научить systemd в пользовательском режиме использовать опции огораживания, вроде InaccessibleDirectories?

Есть такой юнит:

[Unit]
Description=Isolated service
After=graphical.target

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/bash -c 'env > /tmp/123'
InaccessibleDirectories = /boot

От root работает нормально, а если запускать от пользователя(systemctl --user start test), то падает с таким логом:

ноя 26 23:40:43 desktop systemd[19519]: Failed at step NAMESPACE spawning /usr/bin/bash: Operation not permitted
ноя 26 23:40:43 desktop systemd[430]: test.service: main process exited, code=exited, status=226/NAMESPACE
ноя 26 23:40:43 desktop systemd[430]: Unit test.service entered failed state.

Без InaccessibleDirectories всё работает от пользователя. /var/tmp не симлинк /tmp (читал, что у некоторых вызывает аналогичную ошибку)

 ,

disarmer
()

awesome window to bottom

Привет

Есть ли способ убедить awesome создавать плавающие окна в правом нижнем углу? Пытаюсь добиться чтобы окна проигрывателя mpv создавались определённого размера, пока вышло так:

awful.rules.rules = {
  { 
    rule = { class = "mpv" },
    properties = { floating = true },
    callback = function(c)
      local w_area = screen[ c.screen ].workarea
      c:geometry( { width = 640, height = 400, x = w_area.width - 640, y =w_area.height - 400 } )
    end
  },
}
Но с некоторым соотношением сторон у видео высота окна выходит меньше 400px, и между нижними границами окна и монитора появляется полоса.

Можно ли как то заставить окно создаваться вплотную к нижней границе? Или, если нет способа, как получить размеры окна в этом callback после ресайза?

 ,

disarmer
()

ruby tidy

Привет!

Есть ли какие-то реформатеры ruby кода, аналогичные perltidy? Выровнять запятые, расставить пробелы, etc. Ничего путного не гуглится

 , ,

disarmer
()

torrent rename

Привет!

Есть ли способ поменять имена файлов в .torrent файле? Хочется унифицировать имена файлов до передачи в transmission. Пробовал менять с помощью Net::BitTorrent::File, но полученный файл не качается.

 ,

disarmer
()

Ссылки к колонкам sql запроса

Как можно в SQL сослаться на вычисленные значения по номеру/алиасу? Хотел что то вроде такого, но не работает:

select 1 as A, 2 AS B, A+B
Интересует реализация в postgresql (то есть переменные не подходят)

 , ,

disarmer
()

tmux skip sudo

Привет!

Как научить tmux показывать window-status-format, пропуская sudo? Чтобы было видно что действительно запущено в окне, а не sudo.

Можно накостылить вариант в preexec, но это криво

 ,

disarmer
()

zsh current command

Есть ли способ получить текущую команду из zsh? В bash история возвращает список, включая текущую команду, а в zsh только предыдущие:

bash:

[disarmer@white ~]$ ps
  PID TTY          TIME CMD
 7607 pts/5    00:00:00 bash
 7616 pts/5    00:00:00 ps
[disarmer@white ~]$ history |tail -n1
  499  history |tail -n1
zsh:
white% ps
  PID TTY          TIME CMD
 7605 pts/4    00:00:00 zsh
 7619 pts/4    00:00:00 ps
white% history|tail -n1
    3  ps

Пытаюсь сделать функцию для вывода уведомлений в wm, после завершения команд, вроде:

sleep 30;notify 
Выводит «sleep done»

 , ,

disarmer
()

Excessive kworker count

Привет! После пробуждения из suspend в системе видна куча воркеров ядра:

✓[disarmer@white ~]$ ps ax|grep kworker|wc -l
68
✓[disarmer@white ~]$ ps ax|wc -l
168
CPU не потребляют. Через несколько минут количество резко снижается до 11-12.

Как то это многовато для минималистичной системы на нетбуке?

Если включить tracing то /sys/kernel/debug/tracing/trace_pipe говорит примерно вот что: http://disarmer.ru/ln/?lj . Видно что куча в состоянии idle, но зачем их так много плодится? Можно (и стоит ли) их как то ограничить?

arch, стандартное ядро 3.14.1-1

 , ,

disarmer
()

perl async postgresql module

Привет

Помогите, пожалуйста, придумать логику для модуля perl асинхронных запросов к БД. Почти всё получилось сделать как задумал, но внезапно выявилась архитектурная неопределённость.

Модуль будет работать только с postgres с помощью фичей DBD::Pg (http://search.cpan.org/~turnstep/DBD-Pg-2.19.3/Pg.pm#Asynchronous_Queries) и фреймворка AnyEvent.

Примерный сценарий использования:

use mk::adb;
my $adb=new mk::adb(recv=>["dbi:Pg:dbname=disarmer;host=/run/postgresql/;"]);
my $str1=$adb->q("select 1,pg_sleep(1);");#какой-то долгий запрос, $str1 - на самом деле не строка, а объект promise
my $str2=$adb->q("select 2,pg_sleep(2);");
... #выполняем какие то еще задачи
say "Result 1=$str1, result 2=$str2"; #Возвращаем результаты из БД, при преобразовании в promise в строку возвращаются нужные результаты запросов в виде строки

Суть такова: модуль при инициализации инстанса подключается к postgres с помощью обычного DBI несколькими подключениями (из аргументов). Затем при создании запрос попадает в очередь объекта (метод q), и если есть незанятый коннект к базе, запрос сразу отправляется в БД с флагом PG_ASYNC, на соответствующий сокет вешается AnyEvent watcher, управление возвращается программе, вместе с будущим результатом запроса (future/promise модель). То есть создание запроса происходит практически мгновенно, без блокирования.

После выполнения запроса (по срабатыванию watcher) вызывается callback, получающий строки результата и обрабатывающий их с помощью переданной в методе q функции. Если запрос еще не закончен, но больше делать нечего, то при вызове метода promise->finalize, выполнение блокируется, до получения результатов по нужному запросу($sth->pg_result).

Вот такой код получился на данный момент: http://disarmer.ru/ln/?li, вполне работает как задумано, если только число запросов не превышает числа коннектов к базе. Иначе возникает проблема: например ставим в очередь 10 долгих запросов и пытаемся получить результат последнего, а он еще не начал выполняться. По задумке тут нужно блокироваться пока БД не ответит на все предыдущие запросы, но как это красиво сделать не понимаю.

Да, про опасность слушания сокета к БД знаю (может прийти не только результат запроса а какие нибудь NOTIFY). В этом случае случится возможно долгая блокировка, но вроде без использования NOTIFY такого не должно происходить.

Самый похожий из имеющихся на cpan: AnyEvent::Pg::Pool, но он использует какой-то свой неповторимый XS драйвер к БД, и его использование вызывает много варнингов.

 , , , ,

disarmer
()

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