Сборка V2RayN из исходников
Для тех, у кого готовые релизы не работают (слишком старая glibc, нестандартная архитектура) или кто хочет максимально свежую сборку.
← Назад к основной инструкции
📍 Это только установка. Шаги настройки и подключения (добавление подписки, выбор сервера, TUN-режим) находятся в основной инструкции.
🚨 Это не быстро и не просто. Сборка занимает от 10 минут, требует около 5 GB свободного места и установки .NET SDK 10. Если у вас работает простая установка (кроме портативного .ZIP) — лучше используйте её.
Что вам понадобится
- 64-битный x86_64 Linux (для ARM64 в командах ниже замените
linux-x64наlinux-arm64, аlinux-64наlinux-arm64) - Ядро 5.15 или новее
- Стабильный интернет
- Обычный пользователь с правами sudo
- 5 GB свободного места
Шаг 1. Устанавливаем зависимости для сборки
Выберите блок под ваш дистрибутив:
Arch / Manjaro / EndeavourOS
sudo pacman -S --needed \
dotnet-sdk dotnet-runtime aspnet-runtime \
git curl wget unzip tar jq rsync base-devel \
fontconfig freetype2 libx11 libice libsm \
desktop-file-utils xdg-utilsArch обновляет dotnet-sdk близко к релизам Microsoft, так что 10.x должен быть в официальных репозиториях.
Debian / Ubuntu / Mint / Pop!_OS
Собственный dotnet-sdk от Debian известен сборками с проблемами, поэтому ставим из фида Microsoft:
# Подключаем репозиторий Microsoft
. /etc/os-release
wget https://packages.microsoft.com/config/${ID}/${VERSION_ID}/packages-microsoft-prod.deb \
-O /tmp/packages-microsoft-prod.deb
sudo dpkg -i /tmp/packages-microsoft-prod.deb
rm /tmp/packages-microsoft-prod.deb
# Ставим .NET 10 и зависимости
sudo apt update
sudo apt install -y \
dotnet-sdk-10.0 \
git curl wget unzip tar jq rsync \
build-essential ca-certificates \
libfontconfig1 libfreetype6 libx11-6 libice6 libsm6 \
desktop-file-utils xdg-utils⚠️ Если apt install dotnet-sdk-10.0 говорит «пакет не найден» — ваш релиз Debian/Ubuntu старше того, что Microsoft публикует. Используйте универсальный установщик (см. блок «Fallback» ниже).
Fedora / RHEL / Rocky / Alma / CentOS Stream
Современные Fedora и RHEL содержат .NET в официальных репозиториях:
sudo dnf install -y \
dotnet-sdk-10.0 \
git curl wget unzip tar jq rsync \
@development-tools \
fontconfig freetype libX11 libICE libSM \
desktop-file-utils xdg-utilsЕсли dotnet-sdk-10.0 не найден — подключите фид Microsoft:
sudo rpm -Uvh https://packages.microsoft.com/config/rhel/$(rpm -E %rhel)/packages-microsoft-prod.rpm sudo dnf install -y dotnet-sdk-10.0
Fallback: установка .NET вручную (любой дистрибутив)
Если ни репозитории дистрибутива, ни фид Microsoft не дают .NET 10 — универсальный установщик работает везде:
wget -q https://dot.net/v1/dotnet-install.sh chmod +x dotnet-install.sh ./dotnet-install.sh --channel 10.0 --install-dir "$HOME/.dotnet" export DOTNET_ROOT="$HOME/.dotnet" export PATH="$HOME/.dotnet:$PATH" hash -r # Добавьте две строки export в ~/.bashrc, чтобы они работали постоянно
Остальные зависимости (git, curl, fontconfig, libx11 и так далее) всё равно нужно ставить через ваш пакетный менеджер из блоков выше.
Проверка
Независимо от способа установки:
dotnet --list-sdks # Ожидаемый вывод: 10.0.x dotnet --info | head -5
Если dotnet --list-sdks показывает старый SDK типа 8.х/9.х — $PATH указывает на не тот бинарник. Выполните which dotnet и либо поправьте $PATH, либо вызывайте новый dotnet по полному пути.
Шаг 2. Клонируем репозиторий на тег 7.22.0
git clone https://github.com/2dust/v2rayN.git cd v2rayN git fetch --tags git checkout tags/7.22.0 -b build-7.22.0 git submodule update --init --recursive
Флаг -b build-7.22.0 создаёт локальную ветку из тега, чтобы вы не оказались в detached-HEAD состоянии — удобно, если захочется поэкспериментировать.
В репозитории вложенная структура — реальный исходник лежит в v2rayN/v2rayN/:
cd v2rayN # теперь вы в <clone-root>/v2rayN/ ls # Должны увидеть: v2rayN.Desktop/ ServiceLib/ Directory.Build.props v2rayN.sln ...
💡 В версии 7.22.0 TargetFramework уже жёстко выставлен на net10.0 везде, так что вручную ничего править не нужно. Для более старых тегов (например, 7.21.3) пришлось бы делать sed -i 's/net8\.0/net10.0/g' на Directory.Build.props и v2rayN/v2rayN.csproj.
Шаг 3. Восстанавливаем workloads и пакеты
Этот шаг — разница между чистой сборкой и 400+ непонятными ошибками. Всегда выполняйте все три команды:
sudo dotnet workload update sudo dotnet workload restore v2rayN.Desktop/v2rayN.Desktop.csproj dotnet restore v2rayN.Desktop/v2rayN.Desktop.csproj
sudo нужен только если ваш dotnet установлен в системную папку (по умолчанию при установке через apt, dnf, pacman). Если ставили через dotnet-install.sh в $HOME/.dotnet — sudo не нужен.
Если вы уже собирали этот репозиторий и хотите начать с чистого листа:
find . -type d \( -name bin -o -name obj \) -exec rm -rf {} + 2>/dev/nullШаг 4. Публикуем GUI
dotnet publish v2rayN.Desktop/v2rayN.Desktop.csproj \
-c Release \
-r linux-x64 \ #Ставьте linux-arm64 для ARM64
-p:PublishSingleFile=false \
-p:SelfContained=truev2rayN.Desktop/bin/Release/net10.0/linux-x64/publish/
Внутри будет исполняемый файл v2rayN и куча .dll и .so. На этом этапе GUI готов, но прокси-ядер ещё нет — приложение запустится, но не сможет подключиться.
Шаг 5. Добавляем ядра и geo-данные
GUI запускает внешние бинарники (xray, sing-box и др.), которые должны лежать в publish/bin/ с определённой структурой. Самый простой путь — взять готовый бандл от автора проекта. Оставайтесь в директории <clone-root>/v2rayN/v2rayN/ и задайте переменную PUB:
PUB=v2rayN.Desktop/bin/Release/net10.0/linux-x64/publish
#Для ARM64 вам нужен https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-arm64.zip
curl -fL -o /tmp/v2rayn-bin.zip \
https://raw.githubusercontent.com/2dust/v2rayN-core-bin/refs/heads/master/v2rayN-linux-64.zip
unzip -q /tmp/v2rayn-bin.zip -d /tmp/v2rayn-bin
mkdir -p "$PUB/bin"
if [ -d /tmp/v2rayn-bin/bin ]; then
rsync -a /tmp/v2rayn-bin/bin/ "$PUB/bin/"
else
nested=$(find /tmp/v2rayn-bin -maxdepth 2 -type d -name 'bin' | head -n1)
rsync -a "$nested/" "$PUB/bin/"
fi
chmod +x "$PUB/bin/xray/xray" 2>/dev/null
chmod +x "$PUB/bin/sing_box/sing-box" 2>/dev/null
# Проверка
ls "$PUB/bin/"
# Ожидается: xray/ sing_box/ geosite.dat geoip.dat Country.mmdb geoip.metadb srss/ ...Шаг 6. Smoke-тест
Перед системной установкой убедимся, что бинарник вообще работает:
chmod +x "$PUB/v2rayN" "$PUB/v2rayN"
GUI должен запуститься. Если ругается на отсутствующие нативные библиотеки — перепроверьте, что зависимости из Шага 1 действительно установлены.
Шаг 7. Системная установка
Всё ещё в директории <clone-root>/v2rayN/v2rayN/ с переменной PUB из Шага 5:
sudo mkdir -p /opt/v2rayN
sudo cp -a "$PUB"/. /opt/v2rayN/
sudo chmod +x /opt/v2rayN/v2rayN
sudo chmod +x /opt/v2rayN/bin/xray/xray
sudo chmod +x /opt/v2rayN/bin/sing_box/sing-box
# Иконка — копируется из исходников, а не из publish
sudo install -Dm644 v2rayN.Desktop/v2rayN.png \
/usr/share/icons/hicolor/256x256/apps/v2rayn.png
# Скрипт-launcher в $PATH
sudo tee /usr/local/bin/v2rayn >/dev/null <<'EOF'
#!/usr/bin/env bash
cd /opt/v2rayN
exec ./v2rayN "$@"
EOF
sudo chmod +x /usr/local/bin/v2rayn
# .desktop файл для меню. Path= задаёт рабочую директорию,
# чтобы v2rayN мог найти свои ./bin/*
sudo tee /usr/share/applications/v2rayn.desktop >/dev/null <<'EOF'
[Desktop Entry]
Type=Application
Name=v2rayN
Comment=v2rayN GUI client
Exec=/opt/v2rayN/v2rayN
Path=/opt/v2rayN
Icon=v2rayn
Terminal=false
Categories=Network;
StartupWMClass=v2rayN
EOF
# Обновляем кэш меню и иконок
sudo update-desktop-database /usr/share/applications
command -v gtk-update-icon-cache >/dev/null && \
sudo gtk-update-icon-cache -f /usr/share/icons/hicolor💡 Про иконку: dotnet publish не копирует v2rayN.png в publish-директорию, поэтому она берётся напрямую из исходников. Путь выше предполагает, что вы находитесь во внутренней директории <clone-root>/v2rayN/v2rayN/, как и весь предыдущий гайд.
💡 Про gtk-update-icon-cache: утилита есть по умолчанию на Arch и Debian-семействе, но не всегда на минимальном Fedora/RHEL. command -v в команде выше тихо пропустит её, если не нашёл — это нормально, кэш всё равно перестроится при следующем входе в систему.
Теперь V2RayN запускается из терминала командой v2rayn или из меню вашего DE.
Удаление V2RayN
sudo rm -rf /opt/v2rayN sudo rm -f /usr/local/bin/v2rayn sudo rm -f /usr/share/applications/v2rayn.desktop sudo rm -f /usr/share/icons/hicolor/256x256/apps/v2rayn.png sudo update-desktop-database /usr/share/applications # Опционально: удалить пользовательские конфиги rm -rf ~/.local/share/v2rayN ~/.config/v2rayN
Частые проблемы при сборке
- Сотни ошибок после
dotnet publish— workloads не восстановлены. Шаг 3 — не опциональный. Запустите все три команды по порядку:sudo dotnet workload update, затемsudo dotnet workload restore, затемdotnet restore. apt install dotnet-sdk-10.0говорит «пакет не найден» — ваш Debian/Ubuntu слишком старый для фида Microsoft. Используйтеdotnet-install.shиз Шага 1.dnf install dotnet-sdk-10.0говорит «пакет не найден» — вы на более старом RHEL/CentOS Stream, где его ещё нет. Подключите RPM-фид Microsoft из секции Fedora/RHEL в Шаге 1../v2rayN: cannot execute binary file— неправильная архитектура. Согласуйте флаг-rв Шаге 4 с вашим процессором (linux-x64vslinux-arm64).- GUI запускается, но любой сервер падает — папка
bin/пустая или ядра не имеют исполняемых прав. Перепроверьте Шаг 5 и командыchmod +x. dotnet --list-sdksпоказывает только 8.0 даже после установки 10.0 —$PATHуказывает на не тот dotnet. Выполнитеwhich dotnetи поправьте.- Сборки старых тегов (≤7.21.3) падают с
NU1201: ... not compatible with net8.0— те теги пинят net8.0 вDirectory.Build.props, но тянут submodule, которому нужен net10.0. Исправление:sed -i 's/net8\.0/net10.0/g' Directory.Build.props v2rayN/v2rayN.csprojЭтот гайд написан под 7.22.0, где это уже исправлено. - (Fedora/RHEL) Странные ошибки про шрифты/X11 в рантайме — убедитесь, что
libX11,libICE,libSM(именно с такой капитализацией) установлены, а не их lowercase Debian-аналоги. dnf использует upstream X11 регистр.
Запускается из терминала, но не из меню?
Это почти всегда проблема рабочей директории. V2RayN запускает ядра по относительным путям типа ./bin/xray/xray, поэтому стартовать нужно с рабочей директорией /opt/v2rayN. Когда вы запускаете v2rayn из терминала, wrapper-скрипт делает cd /opt/v2rayN. Когда же меню запускает .desktop — по умолчанию рабочая директория = $HOME, и V2RayN падает на поиске ядер.
Решение — строчка Path=/opt/v2rayN в .desktop (в Шаге 7 она уже есть). Если проблема всё ещё есть — перезапустите блок tee из Шага 7.
Чтобы посмотреть, что реально происходит при запуске из меню, временно добавьте логирование:
sudo tee /usr/local/bin/v2rayn >/dev/null <<'EOF' #!/usr/bin/env bash cd /opt/v2rayN || exit 1 exec ./v2rayN "$@" 2>&1 | tee -a "$HOME/.local/share/v2rayN-launch.log" EOF sudo chmod +x /usr/local/bin/v2rayn
Поменяйте Exec=/opt/v2rayN/v2rayN обратно на Exec=v2rayn в .desktop, запустите из меню и смотрите:
tail -50 ~/.local/share/v2rayN-launch.log
Если Path= сам не помог, проверьте валидность .desktop файла:
desktop-file-validate /usr/share/applications/v2rayn.desktop
И — окружение меню иногда отличается от терминального. Чтобы это воспроизвести:
env -i HOME="$HOME" DISPLAY="$DISPLAY" XAUTHORITY="$XAUTHORITY" \
XDG_RUNTIME_DIR="$XDG_RUNTIME_DIR" /opt/v2rayN/v2rayNЧто увидите здесь — то же видит и меню.
Версии
Этот гайд написан и протестирован под:
- V2RayN тег
7.22.0 - .NET SDK 10.0.x
- Arch Linux на x64(ядро ≥ 6.11) и Debian 13 на ARM64. Ожидается, что шаги работают идентично на Debian 11+, Ubuntu 20.04+, Fedora 39+, RHEL 9+ и их производных
- Бандл ядер из
2dust/v2rayN-core-binветка master
Если будущий релиз V2RayN сломает этот гайд — наиболее вероятные причины: обновление TargetFramework (применяйте sed из блока «частые проблемы»), новый submodule (выполните git submodule update --init --recursive), или изменение структуры бандла ядер (загляните в /tmp/v2rayn-bin/ и подправьте rsync в Шаге 5).
✅ Готово! V2RayN собран и установлен. Теперь возвращайтесь в основную инструкцию и продолжайте с настройки.