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 64-bit x86 stable/LTS version of:
- Ubuntu (14.04+)
- Debian (8+)
- CentOS / RHEL (7+)
then the VS Code Remote Development extensions should work without additional dependencies.
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 requirements listed here, so 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 - SSH:
sshneeds to be in the path. The shell binary is typically in the
- Remote - Docker:
docker-composeneed to be in the path. Follow the install instructions for your Linux distribution. (Note that the Ubuntu Snap package is not supported.)
Remote host / container / WSL Linux prerequisites
64-bit x86 glibc-based Linux distributions are supported and most prerequisites are driven by the Node.js runtime (and by extension V8) shipped in the server component automatically installed on each remote endpoint.
|Distribution||Base Requirements||SSH Requirements||Notes|
|General||kernel >= 3.10, glibc >=2.17, libstdc++ >= 3.4.18, Python 2.6 or 2.7, tar||OpenSSH server,
|Ubuntu 14.04+, Debian 8+, and downstream distributions||
||Requires kernel >= 3.10, glibc >= 2.17, libstdc++ >= 3.4.18. Debian < 8 and Ubuntu < 14.04 do not meet this requirement.|
|RHEL / CentOS 7+||
||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.|
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||Additional steps|
|❌ Alpine Linux (64-bit)||
||Not glibc based.|
|✅ CentOS 7 Server (64-bit)||
|⚠️ CentOS 6 Server (64-bit)||
||Requires a workaround.|
|✅ Debian 9 Server (64-bit)||
|✅ Debian 8 Server (64-bit)||
|✅ openSUSE Leap Server 15 (64-bit)||
||Docker image is missing
|✅ openSUSE Leap Server 42.3 (64-bit)||
||Docker image is missing
|✅ Oracle Linux 7 (64-bit)||
|⚠️ Oracle Linux 6 (64-bit)||
||Requires a workaround.|
|✅ RedHat Enterprise Linux 7 (64-bit)||<none>||<none>|
|⚠️ RedHat Enterprise Linux 6 (64-bit)||
||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)||
||Might work compiling glibc from source, but untested.|
|✅ Ubuntu Server 19.04 (64-bit)||
|✅ Ubuntu Server 18.04 (64-bit)||
|✅ Ubuntu Server 16.04 (64-bit)||
|✅ Ubuntu Server 14.04 (64-bit)||
Updating glibc and libstdc++ on RHEL / CentOS 6
RHEL / CentOS 6 ships with glibc 2.12 and libstdc++ 3.4.13 that does not meet the requirements for the server installed on the remote host. 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