Микроблог Крузенции
23 subscribers
2 photos
1 video
2 links
Описание я пока не придумал нормальное, но по плану тут будут всякие лайфхаки и решения проблем, с которыми я столкнулся, и решения которых не гуглятся с первой попытки.
Часть контента отсюда впоследствии переедет на сайт, который я когда-нибудь дособеру.
Download Telegram
Захотелось мне как-то поднять в LXC-контейнере Ollama, да не просто поднять, а ещё заставить её акселлерейтиться на GPU (RX 6900 XT). Мне казалось, что достаточно прокинуть просто карточку в контейнер, и всё, дело в шляпе. Но всё как всегда оказалось сложнее...

1. Коробочно при создании символьных устройств в LXC-контейнере, у них владелец root:root, с правами доступа 0660, что закрывает всякий доступ для олламы к этим "файлам".
Подпёр через ExecStartPre в юните:
# cat /etc/systemd/system/ollama.service.d/10-fix-gpu-permissions.conf
[Service]
ExecStartPre=+/bin/bash -c "/usr/bin/chown :video /dev/dri/card*; /usr/bin/chown :render /dev/dri/render*"

Просто выставляю тех же владельцев, что и на хосте.
Это возможно сделать и через настройки устройства, она причём идёт самым первым пунктом в документации, но я этот вариант честно говоря даже не пытался рассматривать: нет возможности выставлять владельца для карты и для рендера отдельно, он просто проставит одну и ту же группу для обеих вариантов, а мне больше по душе, когда в контейнерах нет такого всратого отличия, чем на хосте. Ещё можно поменять права на 0666, но этот вариант мне тоже не понравился. Широко доступная GPU в системе - звучит не очень... Хотя может спустя какое-то время упрощения ради я приду к этому.

2. Для работы Ollama, похоже, в связке с ROCm, понадобилось ещё одно символьное устройство, /dev/kfd. Узнал я об этом, попытавшись установить rocminfo и запустив его:
# rocminfo
ROCk module is loaded
Unable to open /dev/kfd read-write: No such file or directory
Failed to get user name to check for video group membership

Сама Ollama об этом ничего в своих журналах не писала, это выглядело просто как отсутствие GPU-устройства.
После того, как я прокинул и его, всё поехало:
# journalctl -u ollama --since "-2 minutes" --grep "inference" --no-pager
Dec 28 05:16:37 ollama ollama[1976]: time=2025-12-28T05:16:37.663Z level=INFO source=types.go:42 msg="inference compute" id=GPU-b4f0e10175f8bb95 filter_id="" library=ROCm compute=gfx1030 name=ROCm0 description="AMD Radeon Graphics" libdirs=ollama,rocm driver=60342.13 pci_id=0000:67:00.0 type=discrete total="16.0 GiB" available="16.0 GiB"

  kfd:
gid: '991' # render (as on host, but gid taken from container)
mode: '0660'
path: /dev/kfd
source: /dev/kfd
type: unix-char
uid: '0'


Зы: в Интернете можно наткнуться на советы "использовать udev для смены овнера", что в целом логично, ибо такой функционал там буквально есть из коробки, но в LXC у меня не получилось сходу его завести. Вернусь потом к этой идее.

#linux #lxc #ai #gpu #amdgpu #ollama
Media is too big
VIEW IN TELEGRAM
Итоговым результатом очень доволен, конечно же.
В OpenSSH-клиенте есть возможность переиспользовать одно реальное подключение к серверу для нескольких SSH-сессий в сторону одного сервера, путем мультиплексирования. Это незначительно экономит ресурсы удаленного сервера, и местами многократно ускоряет открытие новых сессий в сторону серверов, где уже есть живое подключение. И этому подчиняется всякий разный клиентский тул, который переиспользует OpenSSH клиент (scp, rsync, virsh --connect=qemu+ssh://...).
В клиентских конфигах прописываем три директивы:

ControlMaster auto
ControlPath ~/.ssh/sockets/%r@%h:%p
ControlPersist 10m

Папка, указанная в ControlPath, должна существовать.

Что важно учитывать:
1. Мультиплексирование поддерживает прокидывание SSH-агента и X11, но это должно происходить на этапе самого первого подключения, когда мастер-процесс порождается. Если агент не был прокинут (его не было например), то для того, чтобы его прокинуть, надо закрыть все подключения, послать на мастер-процесс команду остановки, и только после этого повторно переподключаться.
2. Форвардить порты на горячую можно, но это надо так же отдельно тыкаться в мастер-процесс.
3. Если на какие-то сервера вход происходит по паролю, то он не будет повторно запрашиваться, пока жив мастер-процесс, ибо он уже держит авторизованное подключение на сервере.
4. Процесс не бессмертен, и живет только пока есть какая-то активность, связанная с подключением.

Подробнее: https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing
#unix #ssh #openssh
👍2🔥1
В попытках "пролечить" мессенджер на телефоне, в поисках незавёрнутых на роутере подсетей, обнаружил занятное: трафик iPhone можно "зеркалировать" прямо на яблочное устройство с macOS, не делая каких-то сверхъестественных телодвижений в настройках телефона.
0. Сам телефон подключается к компьютеру/ноутбуку по проводу, на телефоне прожимается "Доверять компьютеру".
1. На macOS устанавливается Xcode.
2. В Xcode, в разделе "Devices and Simulators" (Window) берется DUID телефона (строка вида 00008150-0016XXXX0228XXXX).
3. В терминале: rvictl -s $DUID

После этого в macOS появляется интерфейс rvi0, в который копируется весь трафик, который устройство пытается посылать/видит/принимает в сторону WiFi/мобильной сети. И его уже можно смотреть через tcpdump.
Когда закончили "шалить" - rvictl -x $DUID, и интерфейс пропадёт из ОС.

#apple #tcpdump #network #debug
👍2