2020.9.6: 现在VSCode没法直接下载Server了,应该是微软的服务端bug,更新解决方案
在本地的POSIX环境(例如ArchLinux,CentOS,Ubuntu等真正的Linux或者WSL,VBox等虚假的Linux或者MSYS2,Cygwin,git bash等POSIX on Windows方案)下直接使用如下脚本安装:
if [ $# -lt 1 -o x$1 == x"-h" ]; then
echo code-install-server.sh 用户名@主机 [-cpptools [cpptools文件名]]
echo 例如: code-install-server.sh 用户名@主机 -cpptools
echo 或: code-install-server.sh user@address -cpptools cpptools-linux.vsix
echo 如果指定了-cpptools,则尝试同时安装C/C++插件
echo 如果对-cpptools指定了文件名,则使用对应文件,否则尝试从GitHub获取最新的C/C++插件
exit 1
fi
#set -x
function die { echo $1;exit 1; }
TARGET=$1
if [ x$2 == x"-cpptools" ]; then
CPPTOOLS=yes
if [ -n "$3" ]; then
CPPTOOLSFILE=$3
fi
fi
PORT=22
ARCH=x64
VERSION=$(code --version | awk '{if (NR==2) print}' || die "无法获取本地vscode版本") #如果bash环境不能访问code,请获取code的版本后直接把这行改成类似VERSION=e7d7e9a9348e6a8cc8c03f877d39cb72e5dfb1ff(code的commit id,可以在“帮助-关于”或者“Help-About”中查看)
PATCHELF_REMOTE=/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf
RPATH_REMOTE=/usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/
INTERPRETER_REMOTE=/usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2
SSH_SUCCESS=$(ssh -oPasswordAuthentication=no $TARGET echo success)
if [ x$SSH_SUCCESS != x"success" ]; then
echo "无法完成对$TARGET的免密连接,向远程服务器安装公钥免密登录吗?(y/n)"
read yes
if [ x$yes != x"y" ]; then
die "此配置脚本要求免密登录"
fi
echo "安装公钥"
ssh-copy-id $TARGET
fi
echo "下载vscode-server..."
curl -L -C - "https://vscode.cdn.azure.cn/stable/$VERSION/vscode-server-linux-$ARCH.tar.gz" -o $VERSION-$ARCH.tar.gz || die "下载vscode-server失败"
echo "Querying lastest cpptools release.."
if [ x$CPPTOOLS == x"yes" -a -z $CPPTOOLSFILE ]; then
echo "查询C/C++插件版本"
CPPTOOLSVER=$(curl "https://github.com/microsoft/vscode-cpptools/releases/latest" | grep -o -E "tag/[^\"]+" | grep -o -E "[0-9.]+" || die "查询版本失败")
echo "C/C++插件版本为$CPPTOOLSVER"
echo "下载cpptools-$CPPTOOLSVER..."
curl -L https://github.com/microsoft/vscode-cpptools/releases/download/$CPPTOOLSVER/cpptools-linux.vsix -o cpptools-linux-$CPPTOOLSVER.zip || die "无法下载C/C++插件"
CPPTOOLSFILE=cpptools-linux-$CPPTOOLSVER.zip
fi
if [ -e $VERSION ]; then
rm -rf $VERSION
fi
mkdir $VERSION
echo "解压vscode-server..."
tar zxf $VERSION-$ARCH.tar.gz --strip-components=1 -C $VERSION
if [ x$CPPTOOLS == x"yes" ]; then
echo "组合$CPPTOOLSFILE和server..."
unzip -qo $CPPTOOLSFILE "extension/*" -d $VERSION/extensions/
mv $VERSION/extensions/extension $VERSION/extensions/ms-vscode.cpptools
fi
echo "检查远程服务器的目录"
ssh $TARGET sh <<EOF
if [ ! -e .vscode-server/bin ]; then
echo "创建.vscode-server/bin"
mkdir -p .vscode-server/bin
else
echo ".vscode-server/bin已存在"
if [ -e .vscode-server/bin/$VERSION ]; then
echo "移除莫名其妙存在的server"
rm -rf .vscode-server/bin/$VERSION
fi
fi
EOF
echo "向远程服务器传输vscode-server..."
tar czf - $VERSION --checkpoint=.100 | ssh $TARGET tar zxf - -C .vscode-server/bin/
ssh $TARGET sh <<EOF
echo "修复Glibc依赖..."
cd .vscode-server/bin/$VERSION
set -x
$PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./extensions/ms-vscode.cpptools/LLVM/bin/clang-format
$PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./extensions/ms-vscode.cpptools/bin/cpptools
$PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./extensions/ms-vscode.cpptools/bin/cpptools-srv
$PATCHELF_REMOTE --set-rpath $RPATH_REMOTE --set-interpreter $INTERPRETER_REMOTE ./node
echo "修复执行权限..."
chmod +x ./extensions/ms-vscode.cpptools/LLVM/bin/clang-format ./extensions/ms-vscode.cpptools/bin/cpptools ./extensions/ms-vscode.cpptools/bin/cpptools-srv
set +x
EOF
几个可能要避的雷包括:如果bash访问不到code(提示查询版本失败),处理方案见脚本注释。
如果出现连接不上的情况:
- 肉身登录PSN,执行
killall node
(跟你共用账号的人的server可能被误杀),关闭本地vscode
,执行安装脚本,重启 - 如果问题持续可以尝试直接删掉服务器的
.vscode-server
文件夹(你和跟你共用账号的人的插件和数据将丢失),重复步骤1。 - 如果问题持续,重复步骤1,2
- 如果问题持续,改用EMACS
2020.3.17: 昨天找到的的glibc还是有问题,修改了路径
2020.3.17: 今天上午找到的库还不全,又修改了路径
2020.9.05: 现在clang-format也需要patch了
路径改来改去的原因是不同的人手底下的库不太一样,有人的LD_LIBRARY_PATH
里面缺足够新的libstdc++
有的缺libutil
。。。
VSCode Remote是最近很火的一个跨平台远程编辑工具,特别适合不喜欢用vim之类的东西的人。
由于psn的glibc版本比较旧,所以直接使用vscode remote连接psn会失败,这里给出配置的步骤:
- 在插件栏装好Remote - SSH
- 在remote栏点+号新建一个链接,随便选一个ssh_config的位置,如果需要的话可以把私钥拷过去,不然就手动输密码。
- 尝试连接remote
因为glibc版本的原因,这个过程会失败。
4. 通过任意ssh客户端登陆psn,会发现已经有一个.vscode-server的目录:
5. .vscode-server下面会有一个bin,bin下面有个名字奇怪的文件夹,文件夹里有一个GLIBC版本不匹配的node:
[swmore@psn009 ~]$ ls .vscode-server/
bin
[swmore@psn009 ~]$ ls .vscode-server/bin/
78a4c91400152c0f27ba4d363eb56d2835f9903a
[swmore@psn009 ~]$ ls .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/
bin extensions LICENSE node node_modules out package.json product.json server.sh
[swmore@psn009 ~]$ ldd .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node
.vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node)
.vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.18' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node)
.vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `CXXABI_1.3.5' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node)
.vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node)
.vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /lib64/libc.so.6: version `GLIBC_2.17' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node)
.vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /lib64/libc.so.6: version `GLIBC_2.16' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node)
.vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node: /lib64/libc.so.6: version `GLIBC_2.14' not found (required by .vscode-server/bin/78a4c91400152c0f27ba4d363eb56d2835f9903a/node)
linux-vdso.so.1 => (0x00007fffc6fff000)
libdl.so.2 => /lib64/libdl.so.2 (0x000000366fe00000)
librt.so.1 => /lib64/librt.so.1 (0x0000003670600000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x0000003675e00000)
libm.so.6 => /lib64/libm.so.6 (0x0000003670200000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x0000003673e00000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x000000366fa00000)
libc.so.6 => /lib64/libc.so.6 (0x000000366f600000)
/lib64/ld-linux-x86-64.so.2 (0x000000366ee00000)
[swmore@psn009 ~]$
- 对node文件进行patch,这里用了我在psn上翻出来的新版本glibc和patchelf:
/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 node
- 重新连接remote:
就可以没羞没臊地用vscode remote了。
如果想要在psn上使用C/C++插件,会遇到的两个问题是:
- C/C++插件需要联网下载相关的工具。
- C/C++插件也依赖高版本的glibc。
第一个问题的解决方案是通过VSIX安装,去 https://github.com/Microsoft/vscode-cpptools/releases 下载cpptools-linux.vsix
在C/C++插件的VSIX版本,并上传到PSN上,然后连接VSCode Remote,在插件面板选择通过VSIX安装插件:
然后在弹出的路径选择中选择刚刚下载的vsix文件。
安装完成后会爆插件服务器启动失败的问题,这时候应该去找~/.vscode-server/extensions/ms-vscode.cpptools-<版本号>/bin
,然后使用patchelf来补一下cpptools
和cpptools-srv
。
/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 cpptools
/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 cpptools-srv
/usr/sw-cluster/apps/Anaconda/anaconda3/bin/patchelf --set-rpath /usr/sw-cluster/apps/lib/glibc-2.17/lib64/:/usr/sw-cluster/apps/Anaconda/anaconda3/lib/ --set-interpreter /usr/sw-cluster/apps/lib/glibc-2.17/lib64/ld-linux-x86-64.so.2 ../LLVM/bin/clang-format
然后重新启动vscode即可远程使用C/C++插件,这对老年人编程还是相当友好的。