Захотелось мне как-то поднять в LXC-контейнере Ollama, да не просто поднять, а ещё заставить её акселлерейтиться на GPU (RX 6900 XT). Мне казалось, что достаточно прокинуть просто карточку в контейнер, и всё, дело в шляпе. Но всё как всегда оказалось сложнее...
1. Коробочно при создании символьных устройств в LXC-контейнере, у них владелец
Подпёр через
Просто выставляю тех же владельцев, что и на хосте.
Это возможно сделать и через настройки устройства, она причём идёт самым первым пунктом в документации, но я этот вариант честно говоря даже не пытался рассматривать: нет возможности выставлять владельца для карты и для рендера отдельно, он просто проставит одну и ту же группу для обеих вариантов, а мне больше по душе, когда в контейнерах нет такого всратого отличия, чем на хосте. Ещё можно поменять права на 0666, но этот вариант мне тоже не понравился. Широко доступная GPU в системе - звучит не очень... Хотя может спустя какое-то время упрощения ради я приду к этому.
2. Для работы Ollama, похоже, в связке с ROCm, понадобилось ещё одно символьное устройство,
Сама Ollama об этом ничего в своих журналах не писала, это выглядело просто как отсутствие GPU-устройства.
После того, как я прокинул и его, всё поехало:
Зы: в Интернете можно наткнуться на советы "использовать
#linux #lxc #ai #gpu #amdgpu #ollama
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 клиент (
В клиентских конфигах прописываем три директивы:
Папка, указанная в
Что важно учитывать:
1. Мультиплексирование поддерживает прокидывание SSH-агента и X11, но это должно происходить на этапе самого первого подключения, когда мастер-процесс порождается. Если агент не был прокинут (его не было например), то для того, чтобы его прокинуть, надо закрыть все подключения, послать на мастер-процесс команду остановки, и только после этого повторно переподключаться.
2. Форвардить порты на горячую можно, но это надо так же отдельно тыкаться в мастер-процесс.
3. Если на какие-то сервера вход происходит по паролю, то он не будет повторно запрашиваться, пока жив мастер-процесс, ибо он уже держит авторизованное подключение на сервере.
4. Процесс не бессмертен, и живет только пока есть какая-то активность, связанная с подключением.
Подробнее: https://en.wikibooks.org/wiki/OpenSSH/Cookbook/Multiplexing
#unix #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 телефона (строка вида
3. В терминале:
После этого в macOS появляется интерфейс
Когда закончили "шалить" -
#apple #tcpdump #network #debug
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
