Remote Development with Linux

Linux is a highly variable environment and the large number of server, container, and desktop distributions can make it difficult to know what is supported. Visual Studio Code Remote Development has prerequisites for the specific host / container / WSL distribution you will be connecting to.

If you are using a recent stable/LTS version of:

  • Ubuntu 64-bit x86 (16.04+)
  • Debian 64-bit x86 (8+)
  • CentOS / RHEL 64-bit x86 (7+)

then the VS Code Remote Development extensions should work without additional dependencies.

VS Code Insiders also has experimental support for:

  • Raspbian 32-bit ARMv7l (or ARMv8 in 32-bit mode) (Stretch/9+) SSH hosts (Remote - SSH). ARMv6 used in the Raspberry Pi 1/Zero is not supported.
  • Alpine Linux 64-bit x86 (3.7+) containers (Remote - Containers) and WSL hosts (Remote - WSL)

However, if you are using a non-standard configuration or downstream distribution, you may run into issues. This document provides information on requirements as well as tips to help you get up and running even if your configuration is only community-supported.

Note that other extensions may have dependencies beyond those listed here. Some extensions also contain compiled native code that may not work on Alpine Linux or ARMv7l. If you encounter an issue that only occurs with a particular extension, contact the extension authors for information on their native dependencies.

Local Linux prerequisites

If you are running Linux locally, the VS Code prerequisites drive most of the requirements.

In addition, specific Remote Development extensions have further requirements:

Remote host / container / WSL Linux prerequisites

Platform prerequisites are primarily driven by the version of the Node.js runtime (and by extension the V8 JavaScript engine) shipped in the server component automatically installed on each remote endpoint. This server also has a set of related native node modules that need to be compiled and tested for each target. 64-bit x86 glibc-based Linux distributions currently provide the best support given these requirements.

You may encounter issues with certain extensions with native dependencies when using VS Code Insiders with 32-bit ARMv7l glibc-based Linux SSH hosts and 64-bit x86 musl-based Alpine Linux containers. For ARMv7l in VS Code Insiders, extensions may only include x86_64 versions of native modules or runtimes in the extension. For Alpine Linux in VS Code Insiders, included native code or runtimes may not work due to fundamental differences between how libc is implemented in Alpine Linux (musl) and other distributions (glibc). In both these cases, extensions will need to opt-in to supporting these platforms by compiling / including binaries for these additional targets. Please raise an issue with the appropriate extension author requesting support if you encounter an extension that does note work as expected.

Distribution Base Requirements Remote - SSH Requirements Notes
General kernel >= 3.10, glibc >=2.17, libstdc++ >= 3.4.18, Python 2.6 or 2.7, tar OpenSSH server, bash, and curl or wget Run ldd --version to check the glibc version. Run strings /usr/lib64/libstdc++.so.6 | grep GLIBCXX to see if libstdc++ 3.4.18 is available.
Ubuntu 16.04+, Debian 8+, Raspbian Stretch/9+ and downstream distributions libc6 libstdc++6 python-minimal ca-certificates tar openssh-server bash and curl or wget Requires kernel >= 3.10, glibc >= 2.17, libstdc++ >= 3.4.18. Debian < 8 (Jessie) and Ubuntu < 14.04 do not meet this requirement.
RHEL / CentOS 7+ glibc libgcc libstdc++ python ca-certificates tar openssh-server bash and curl or wget Requires kernel >= 3.10, glibc >= 2.17, libstdc++ >= 3.4.18. RHEL / CentOS < 7 does not meet this requirement without using a workaround to upgrade.
πŸ”¬ Alpine Linux 3.7+ musl libgcc libstdc++. musl >= 1.1.18, glibc not required. Not yet supported. Supported in Remote - Containers and Remote - WSL. Extensions installed in the container may not work due to glibc dependencies in extension native code.

Tips by Linux distribution

The following is a list of distributions and any base requirements that may be missing. End-of-life versions of distributions are not included.

Server Distribution Docker Image Missing libraries Notes / additional steps
πŸ”¬ Alpine Linux 3.10 (64-bit) alpine:latest libgcc libstdc++ Supported in Remote - Containers and Remote - WSL only. Extensions installed in the container may not work due to glibc dependencies in extension native code.
βœ… CentOS 7 Server (64-bit) centos:7 <none> <none>
⚠️ CentOS 6 Server (64-bit) centos:6 glibc >= 2.17, libstdc++ >= 3.4.18 Requires a workaround.
βœ… Debian 9 Server (64-bit) debian:9 <none> <none>
βœ… Debian 8 Server (64-bit) debian:8 <none> <none>
βœ… openSUSE Leap Server 15 (64-bit) opensuse/leap:15 Docker image is missing tar. <none>
βœ… openSUSE Leap Server 42.3 (64-bit) opensuse/leap:42.3 Docker image is missing tar. <none>
βœ… Oracle Linux 7 (64-bit) oraclelinux:7 <none> <none>
⚠️ Oracle Linux 6 (64-bit) oraclelinux:6 glibc >= 2.17, libstdc++ >= 3.4.18. Docker image is missing tar. Requires a workaround.
πŸ”¬ Raspbian Stretch/9 (ARMv7l 32-bit) <none> Supported in Remote - SSH. Extensions may not work when installed on an ARMv7l host due to extension x86 native code.
βœ… RedHat Enterprise Linux 7 (64-bit) <none> <none>
⚠️ RedHat Enterprise Linux 6 (64-bit) glibc >= 2.17, libstdc++ >= 3.4.18 Requires a workaround.
βœ… SUSE Linux Enterprise Server 15 (64-bit) <none> <none>
βœ… SUSE Linux Enterprise Server 12 (64-bit) <none> <none>
❌ SUSE Linux Enterprise Server 11 (64-bit) glibc >= 2.17, libstdc++ >= 3.4.18 Might work compiling glibc from source, but untested.
βœ… Ubuntu Server 19.04 (64-bit) ubuntu:19.04 <none> <none>
βœ… Ubuntu Server 18.04 (64-bit) ubuntu:18.04 <none> <none>
βœ… Ubuntu Server 16.04 (64-bit) ubuntu:16.04 <none> <none>
βœ… Ubuntu Server 14.04 (64-bit) ubuntu:14.04 <none> <none>

Updating glibc and libstdc++ on RHEL / CentOS 6

RHEL / CentOS 6 ships with glibc 2.12 and libstdc++ 3.4.13. Unfortunately, this does not meet the requirements for Remote Development. RHEL / CentOS 6 goes out of support in 2020, so we strongly recommend upgrading to RHEL / CentOS 7 or higher.

However, as a workaround, you can either build glibc manually or use the following script to install updated binaries. The bash script below will upgrade these libraries without having to build them. It is adapted from information in this article, this gist, and this Fedora copr project. The article also includes instructions for manually building glibc if you would prefer not to use the binaries from the article.

Do not run this script on anything mission critical without a rollback strategy since it does update libraries that other applications depend on.

For servers, run the following script and restart the server so the updates take effect.

# Update glibc and static libs
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm
wget http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-static-2.17-55.el6.x86_64.rpm
sudo rpm -Uh --force --nodeps \
    glibc-2.17-55.el6.x86_64.rpm \
    glibc-common-2.17-55.el6.x86_64.rpm \
    glibc-devel-2.17-55.el6.x86_64.rpm \
    glibc-headers-2.17-55.el6.x86_64.rpm \
    glibc-static-2.17-55.el6.x86_64.rpm \
    glibc-utils-2.17-55.el6.x86_64.rpm

# Update libstdc++
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-4.8.2-16.3.el6.x86_64.rpm
wget  https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-devel-4.8.2-16.3.el6.x86_64.rpm
wget https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-static-4.8.2-16.3.el6.x86_64.rpm
sudo rpm -Uh \
    libstdc++-4.8.2-16.3.el6.x86_64.rpm \
    libstdc++-devel-4.8.2-16.3.el6.x86_64.rpm \
    libstdc++-static-4.8.2-16.3.el6.x86_64.rpm

In a container environment, you can add similar contents to a Dockerfile:

FROM centos:6

RUN yum -y install wget tar

# Update glibc
RUN wget -q http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-2.17-55.el6.x86_64.rpm \
    && wget -q http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-common-2.17-55.el6.x86_64.rpm \
    && wget -q http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-devel-2.17-55.el6.x86_64.rpm \
    && wget -q http://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-headers-2.17-55.el6.x86_64.rpm \
    && wget -q https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-utils-2.17-55.el6.x86_64.rpm \
    && wget -q https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/glibc-2.17-55.fc20/glibc-static-2.17-55.el6.x86_64.rpm \
    && rpm -Uh --force --nodeps \
        glibc-2.17-55.el6.x86_64.rpm \
        glibc-common-2.17-55.el6.x86_64.rpm \
        glibc-devel-2.17-55.el6.x86_64.rpm \
        glibc-headers-2.17-55.el6.x86_64.rpm \
        glibc-static-2.17-55.el6.x86_64.rpm \
        glibc-utils-2.17-55.el6.x86_64.rpm \
    && rm *.rpm

# Update libstdc++
RUN  wget -q https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-4.8.2-16.3.el6.x86_64.rpm \
    && wget -q https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-devel-4.8.2-16.3.el6.x86_64.rpm \
    && wget -q https://copr-be.cloud.fedoraproject.org/results/mosquito/myrepo-el6/epel-6-x86_64/gcc-4.8.2-16.3.fc20/libstdc++-static-4.8.2-16.3.el6.x86_64.rpm \
    && rpm -Uh \
        libstdc++-4.8.2-16.3.el6.x86_64.rpm \
        libstdc++-devel-4.8.2-16.3.el6.x86_64.rpm \
        libstdc++-static-4.8.2-16.3.el6.x86_64.rpm \
    && rm *.rpm

# Set the default shell to bash instead of sh
ENV SHELL /bin/bash

Questions or feedback