May 14

Сборка 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-utils

Arch обновляет 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/.dotnetsudo не нужен.

Если вы уже собирали этот репозиторий и хотите начать с чистого листа:

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=true

Результат окажется в:

v2rayN.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-x64 vs linux-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 собран и установлен. Теперь возвращайтесь в основную инструкцию и продолжайте с настройки.

← Назад к основной инструкции