3.4.6 内核版本的 qnap 安装 vscode server

VS Code Remote SSH 远程连接旧机器
存在下面的日志
error This machine does not meet Visual Studio Code Server's prerequisites, expected either...

  • find GLIBC >= v2.28.0 (but found v2.21.0 instead) for GNU environments
  • find /lib/ld-musl-x86_64.so.1, which is required to run the Visual Studio Code Server in musl environments
    22790f67947e: start
    [LinuxPrereqs]: The remote host may not meet VS Code Server's prerequisites for glibc and libstdc++ (The remote host does not meet the prerequisites for running VS Code Server)
    同时也可以下面的替代解决方案
    https://aka.ms/vscode-remote/faq/old-linux
    QNAP 的旧型号(如 x69L 系列)QTS 系统基于较老的内核和库,无法直接升级 glibc 到 2.28+,所以官方预构建的 VS Code Server 不再支持。
    微软提供了一个非官方支持的技术绕过方案:在 NAS 上提供一个自定义的 sysroot(包含 glibc 2.28+ 的库),然后用 patchelf 工具 patching VS Code Server 二进制文件,让它使用这些新库。
    步骤大致如下(需要你在本地或其他机器构建 sysroot,然后上传到 NAS):

使用 crosstool-ng 工具链构建一个包含 glibc 2.28+ 的 sysroot(兼容旧内核)。
在 NAS 上安装 patchelf(>= v0.18)。
设置以下环境变量(可以在 ~/.bashrc 或 SSH 配置中添加):
VSCODE_SERVER_CUSTOM_GLIBC_LINKER=/path/to/sysroot/lib/ld-2.28.so(动态链接器路径)
VSCODE_SERVER_CUSTOM_GLIBC_PATH=/path/to/sysroot/lib(库路径)
VSCODE_SERVER_PATCHELF_PATH=/path/to/patchelf

重新尝试连接 VS Code Remote-SSH。

构建 Sysroot 的具体步骤
根据 VS Code 官方文档(截至 2025 年 12 月 14 日的最新内容),以下是使用 crosstool-ng 工具构建 sysroot 的详细步骤。这个 sysroot 是一个包含 glibc >= 2.28 等兼容库的目录,用于让 VS Code Server 在旧 Linux 系统(如 QNAP TS-669L)上运行。它是一个技术性绕过方案,不是官方支持的场景,成功后 VS Code 会显示“非官方支持”的警告。
注意:这个过程需要在你的本地机器(推荐 Linux 或 Docker 环境)上进行,因为 QNAP NAS 的资源有限。构建后,将 sysroot 上传到 NAS。整个过程需要一些 Linux 经验,如果卡住,可以参考 crosstool-ng 官方文档。

  1. 先决条件

目标要求:sysroot 必须包含:
glibc >= 2.28
libstdc++ >= 3.4.25 (似乎不是必须)
binutils >= 2.29
Linux 内核 >= 3.4(你的 NAS 内核可能较旧,但 sysroot 可以兼容)

环境:推荐使用 Ubuntu 或 Docker 容器。确保有足够的磁盘空间(至少 5GB)。
工具:crosstool-ng(版本 1.26.0 或更高)。

  1. 安装 crosstool-ng
    使用 Docker 容器来简化安装(官方推荐)。在你的本地机器上或者其他云端平台(如 github codespace, cnb.cool, cloudstudio.net 等)运行以下命令创建一个临时容器:

拉取并运行 Docker 容器

docker run -it --rm -v $(pwd):/workspace ubuntu:latest /bin/bash
在容器内执行安装:

更新包列表并安装依赖

apt-get update
apt-get install -y gcc g++ gperf bison flex texinfo help2man make libncurses5-dev
python3-dev autoconf automake libtool libtool-bin gawk wget bzip2 xz-utils unzip
patch rsync meson ninja-build

设置 tzdata时选择 Asia, Shanghai

下载并安装 crosstool-ng 1.26.0

wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-1.26.0.tar.bz2
tar -xjf crosstool-ng-1.26.0.tar.bz2
cd crosstool-ng-1.26.0
./configure --prefix=/crosstool-ng-1.26.0/out && make && make install

添加到 PATH

export PATH=$PATH:/crosstool-ng-1.26.0/out/bin

手动安装(非 Docker):在 Ubuntu 上直接运行以上 apt-get 和 wget 命令,然后重启终端。

  1. 配置 crosstool-ng

crosstool-ng 需要一个配置文件(.config)来指定目标架构(x86_64)和库版本。
官方文档中提到可以使用示例配置文件,但未提供具体内容。你可以从 crosstool-ng 的样例开始:
在工作目录创建文件夹:mkdir toolchain-dir
cd toolchain-dir
初始化一个默认配置(针对 x86_64):ct-ng menuconfig
在菜单中配置:
Target options:Architecture = x86_64
C-library:C library = glibc,版本 >= 2.28(也可选择可用,如 2.39)
Binutils:版本 >= 2.29
Kernel:版本 >= 3.4.113

C-library > Minimum supported kernel version:
选择 Specific version,然后设置为 3.4.6 或 3.4.0(比你的实际内核稍低,确保包含遗留兼容代码)。
这会让 glibc 编译时包含对老内核的支持(--enable-kernel=3.4.0)。

其他:启用 static linking 如果需要,但默认动态链接即可。

保存并退出(Save)。

这会生成 .config 文件。你也可以从 GitHub 示例下载预配置的 .config(搜索 "crosstool-ng config for glibc 2.28 x86_64")。

或者 wget https://raw.githubusercontent.com/microsoft/vscode-linux-build-agent/main/x86_64-gcc-8.5.0-glibc-2.28.config -O .config,然后再 ct-ng menuconfig 修改

  1. 构建工具链和 Sysroot
    需要普通用户构建使用 ct-ng
    adduser builder # 设置密码
    su - builder # 切换到 builder 用户
    chown -R builder:builder /toolchain-dir #或其他真正的 toochain dir 路径
    export PATH=$PATH:/crosstool-ng-1.26.0/out/bin #再次配置执行文件路径
    在 toolchain-dir 目录下运行:ct-ng build
    时间:构建可能需要 30-60 分钟,取决于机器性能。完成后,sysroot 将位于:
    buildroot/build/x86_64linux-gnu/sysroot/(或类似路径),这是一个完整的库目录,包含 /lib、/usr/lib 等。
export PATH=$PATH:/crosstool-ng-1.26.0/out/bin
builder@2f2516c22530:/toolchain-dir$ ct-ng build
[INFO ] Performing some trivial sanity checks
[WARN ] Number of open files 1024 may not be sufficient to build the toolchain; increasing to 2048
[INFO ] Build started 20251213.115759
[INFO ] Building environment variables
[WARN ] Directory '/toolchain-dir/downloads' does not exist.
[WARN ] Will not save downloaded tarballs to local storage.
[EXTRA] Preparing working directories
[EXTRA] Installing user-supplied crosstool-NG configuration
[EXTRA] =================================================================
[EXTRA] Dumping internal crosstool-NG configuration
[EXTRA] Building a toolchain for:
[EXTRA] build = x86_64-pc-linux-gnu
[EXTRA] host = x86_64-pc-linux-gnu
[EXTRA] target = x86_64-linux-gnu
[EXTRA] Dumping internal crosstool-NG configuration: done in 0.04s (at 00:01)
[INFO ] =================================================================
[INFO ] Retrieving needed toolchain components' tarballs
[EXTRA] Retrieving 'linux-3.4.113'
[EXTRA] Verifying SHA512 checksum for 'linux-3.4.113.tar.xz'
[EXTRA] Retrieving 'zlib-1.2.13'
[EXTRA] Verifying SHA512 checksum for 'zlib-1.2.13.tar.xz'
[EXTRA] Retrieving 'zstd-1.5.5'
[EXTRA] Verifying SHA512 checksum for 'zstd-1.5.5.tar.gz'
[EXTRA] Retrieving 'gmp-6.2.1'
[ERROR] OpenSSL: error:0A000126:SSL routines::unexpected eof while reading
[ERROR] OpenSSL: error:0A000126:SSL routines::unexpected eof while reading

验证:构建后,检查 sysroot 中的 glibc 版本:ls buildroot/build/x86_64-unknown-linux-gnu/sysroot/lib/libc.so.6 # 应显示 2.28+
strings buildroot/build/x86_64-unknown-linux-gnu/sysroot/lib/libc.so.6 | grep GLIBC

  1. 在远程主机(QNAP NAS)上安装和配置

上传 sysroot:将整个 sysroot 目录压缩(tar -czf sysroot.tar.gz)并通过 SCP 或 QNAP 的文件管理上传到 NAS,例如 /share/Public/sysroot/。
在 docker 服务器上
tar -czf sysroot.tar.gz x86_64-linux-gnu/x86_64-linux-gnu/sysroot
在宿主机上 docker cp my-ctng:/toolchain-dir/sysroot.tar.gz ./sysroot.tar.gz #如果容器的名字是my-ctng

scp sysroot.tar.gz admin@myqnapserverip:/share/public
解压:在 NAS 上 SSH 登录(作为 admin),运行:cd /share/Public/
tar -xzf sysroot.tar.gz
安装 patchelf(必须 >= v0.18.x,避免 segfault):
QNAP 默认没有 patchelf。你需要从源代码编译或用 Entware(QNAP 的第三方包管理器)安装。
通过 Entware(推荐,如果你的 QTS 支持):
在 QNAP App Center 安装 Entware。
SSH 登录,运行:opkg update && opkg install patchelf(确保版本 >= 0.18)。

手动编译(如果 Entware 不可用):
在本地下载 patchelf 源代码:git clone https://github.com/NixOS/patchelf.git
编译(需交叉工具链):./bootstrap && ./configure --host=x86_64-linux-gnu && make
上传 patchelf 二进制到 NAS,例如 /opt/bin/patchelf 并 chmod +x。

设置环境变量(在 NAS 的 ~/.bashrc 或 /etc/profile 中添加,重启 SSH):export VSCODE_SERVER_CUSTOM_GLIBC_LINKER=/share/Public/sysroot/lib/ld-2.28.so # 动态链接器路径
export VSCODE_SERVER_CUSTOM_GLIBC_PATH=/share/Public/sysroot/lib:/share/Public/sysroot/usr/lib # 库路径
export VSCODE_SERVER_PATCHELF_PATH=/opt/bin/patchelf # patchelf 路径
注意:路径根据你的 sysroot 调整。使用 --set-interpreter 和 --set-rpath 选项让 VS Code Server 绑定到这些路径。

  1. 连接 VS Code Remote-SSH

在本地 VS Code 中,使用 Remote-SSH 扩展重新连接到 myqnapserverip。
VS Code 会自动检测 sysroot 并 patching 二进制文件。如果成功,会下载并启动服务器。
测试:连接后,检查 VS Code 终端输出是否无 glibc 错误。

注意事项和潜在问题

兼容性:你的 QNAP TS-669L 内核较旧(可能 < 4.18),但 sysroot 设计为兼容。测试时如果崩溃,检查 patchelf 版本。
安全性:自定义 sysroot 可能引入不兼容风险,仅用于开发。
替代:如果构建太麻烦,考虑 code-server(Web 版 VS Code),在 QNAP Docker 中运行 linuxserver/code-server 镜像,无需 sysroot。

实际运行时, 出现未能获取环境变量,手动下载 vscode server 文件,然后patchelf。.
opkg install patchelf结果该0.18版出现段错误。
wget https://github.com/NixOS/patchelf/releases/download/0.17.2/patchelf-0.17.2-x86_64.tar.gz
tar -xzf patchelf-0.17.2-x86_64.tar.gz

得到 patchelf

注意在使用 entware 的情况下,安装一些依赖
opkg install procps-ng coreutils coreutils-printenv coreutils-nohup coreutils-
ln -s /opt/libexec/printenv-coreutils /opt/bin/printenv
确保/etc/profile或者 ~/.bashrc, ~/.profile 中

export PATH=/opt/bin:/opt/sbni:$PATH

依然 需要创建跳过检查的文件
touch /tmp/vscode-skip-server-requirements-check

使用专用脚本并在登录配置文件中 source

cat > ~/.vscode-server/sysroot.sh << 'EOF'
export VSCODE_SERVER_CUSTOM_GLIBC_LINKER="/root/.vscode-server/sysroot/lib/ld-linux-x86-64.so.2"  
export VSCODE_SERVER_CUSTOM_GLIBC_PATH="/root/.vscode-server/sysroot/lib:/root/.vscode-server/sysroot/usr/lib:/root/.vscode-server/sysroot/lib64:/root/.vscode-server/sysroot/usr/lib64"
export VSCODE_SERVER_PATCHELF_PATH="/root/.vscode-server/patchelf"  # 用 0.17.2 版本
EOF
chmod +x ~/.vscode-server/sysroot.sh

echo "source ~/.vscode-server/sysroot.sh" >> ~/.bash_profile #或者 ~/.profile
结果没有成功
以如下版本为例
https://update.code.visualstudio.com/commit:618725e67565b290ba4da6fe2d29f8fa1d4e3622/server-linux-x64/stable -O vscode-server.tar.gz
如果是 vscode server insiders,则 commit id 对应的下载地址类似下面的
https://update.code.visualstudio.com/commit:29ea21caf8e29d76a96bcb651a05feb07891cfa7/server-linux-x64/insider
https://vscode.download.prss.microsoft.com/dbazure/download/insider/29ea21caf8e29d76a96bcb651a05feb07891cfa7/vscode-server-linux-x64.tar.gz
Visual Studio Code Server Insiders 则需要解压到 ~/.vscode-server-insiders/cli/servers/

或者使用脚本

#!/bin/sh

# VS Code Server 一键安装脚本(适用于 QNAP 老型号,glibc 2.21)
# 对应 commit: 618725e67565b290ba4da6fe2d29f8fa1d4e3622 (VS Code 1.107.0 )

COMMIT="618725e67565b290ba4da6fe2d29f8fa1d4e3622"
SERVER_DIR="/root/.vscode-server/cli/servers/Stable-${COMMIT}/server"
TARGZ="/opt/tmp/vscode-server-linux-x64.tar.gz"

echo "=== 开始安装 VS Code Server (commit ${COMMIT}) ==="

# 1. 下载 server tarball
echo "正在下载 VS Code Server..."
curl -L "https://update.code.visualstudio.com/commit:${COMMIT}/server-linux-x64/stable" -o "$TARGZ"

if [ ! -f "$TARGZ" ]; then
    echo "下载失败!请检查网络或 URL 是否可用。"
    exit 1
fi

# 2. 创建目录并解压
echo "解压到 ${SERVER_DIR} ..."
mkdir -p "$SERVER_DIR"
tar -xzf "$TARGZ" -C "$SERVER_DIR" --strip-components=1

if [ ! -f "${SERVER_DIR}/bin/code-server" ]; then
    echo "解压失败!未找到 code-server 二进制。"
    rm -f "$TARGZ"
    exit 1
fi

# 3. 创建跳过 prerequisites 检查的文件(防止误报 glibc 错误)
touch /tmp/vscode-skip-server-requirements-check
echo "已创建 /tmp/vscode-skip-server-requirements-check(跳过 glibc 检查)"

# 4. 清理可能残留的旧 CLI(避免冲突)
rm -rf /root/.vscode-server/bin /root/.vscode-server/cli/servers/Stable-*/cache 2>/dev/null

# 5. 清理临时文件
rm -f "$TARGZ"

echo "=== 安装完成!==="
echo "现在在本地 VS Code(版本 ~1.92)中重新连接  server"
echo "首次连接会稍慢(启动 server),之后很快。"
echo "如果看到 “platform not officially supported” 警告,属于正常(功能完全可用)"
echo ""
echo "提示:"
echo "- 使用 VS Code 1.92.x 版本最佳(新版会强制 glibc 2.28)"
echo "- 连接成功后,可在远程终端运行 node -v 验证"

接着手动 patchelf

PATCHELF="/root/.vscode-server/patchelf"
NODE="/root/.vscode-server/cli/servers/Stable-618725e67565b290ba4da6fe2d29f8fa1d4e3622/server/node"
LINKER="/root/.vscode-server/sysroot/lib/ld-linux-x86-64.so.2"
RPATH="/root/.vscode-server/sysroot/lib:/root/.vscode-server/sysroot/usr/lib:/root/.vscode-server/sysroot/lib64:/root/.vscode-server/sysroot/usr/lib64"

# 第一步:只改 rpath
$PATCHELF --set-rpath $RPATH --force-rpath $NODE

# 第二步:只改 interpreter
$PATCHELF --set-interpreter $LINKER $NODE

如果需要 node 20 环境,可以通过 myqnap.org下载安装,原 qnapclub 仓库已失效。
bash NodeJS20_20.18.3.0_x86_64.qpkg

或许可以参考——
https://github.com/hsfzxjy/vscode-remote-glibc-patch
https://github.com/ursetto/vscode-sysroot
https://github.com/matrix1001/glibc-all-in-one
非root升级glibc——VSCode远程开发环境搭建踩坑

posted @ 2025-12-14 16:17  geyee  阅读(19)  评论(0)    收藏  举报