
컚í ìŽë (WSL, Docker, LXC ë±)ê° ìë VMìŽë ì€ì OSì ê²œì° ìŽ í¬ì€ížì ë°©ë²ìŒë¡ ì ì©íŽìŒ í©ëë€.
AMD64 (x86-64) ìŽìžì ìí€í ì²ì ê²œì° ê³µì 묞ì륌 íìžíìžì.
Could not establish connection to "(Server Name)":
The remote host does not meet the prerequisites for running VS Code Server.
ì격 ížì€ížê° VS Code Server륌 ì€ííêž° ìí íì êµ¬ì± ìì륌 충족íì§ ììµëë€.
ìžížë¡
ë¹ì£ŒìŒ ì€íëì€ ìœëë Remote - SSH, WSL, Docker 컚í
ìŽë ë±ìŒë¡ì ížëЬí ì°ë êž°ë¥ì ì ê³µíê³ ììµëë€. ê·žë¬ë 2025ë
3ì 늎늬ìŠë 1.99 ë²ì ë¶í°ë WSL Ubuntu 18.04 ë± êµ¬ë²ì 컚í
ìŽëë¡ì ì°ëìŽ ë¶ê°ë¥íŽì¡ìµëë€. ìŽë ì°ëì ìí VS Code Serverì ì구ì¬í ì€ glibc
ìµì ë²ì ìŽ êž°ì¡Ž 2.27ìì 2.28ë¡ ì¬ëŒê°ì, Ʞ졎 ë°©ìëë¡ë VS Code Serverì ì€ì¹ê° ìëêž° ë묞ì
ëë€. Ubuntu 18.04 LTSì ëŽì¥ glibc
ì ë²ì ì 2.27ì
ëë€.
ë€íì€ëœê²ë VS Code ê³µì 묞ìì workaroundê° ì ìëìŽ ììµëë€. ë°©ë²ì ìŠ VS Code ë²ì ì첎륌 ë®ì¶ê±°ë, Crosstool-ngì ìŽì©í 컀ì€í sysrootì ë¹ë, ê·žëŠ¬ê³ ìŽ ì»€ì€í sysroot륌 í겜 ë³ìë¡ ì§ì íì¬ VS Code Serverê° ìŽë¥Œ ìŽì©íê²ë ë§ëë ê²ìžë°ì, 묞ì ë íŽë¹ 묞ìì ìŒë¶ ëëœë ëŽì©ê³Œ íšê», í¹ìŽí ë²ê·ž(ë¡ ì¶ì ëë 묎ìžê°)ë¡ ìžíŽ ê·žëë¡ ë°ë¥Žë©Ž ì ì©ìŽ ì ëë¡ ìëë€ë ì ì ëë€.
íì¬, ìŽë² í¬ì€ížììë VS Codeì Remote - SSHë¡ Ubuntu 18.04 LTS ëšžì ì ì°ëíë ë°©ë²ì ë€ë£šìŽ ëëŠ¬ê² ìµëë€. ì°žê³ ë¡ ì VS Code ì€ì¹ í겜ì Windows 11 ProìŽë©°, VS Code Server ì°ë ëì ëšžì ì WSL 2ë¡ êµ¬ëëë Ubuntu 18.04 LTSì ëë€.
컚í ìŽëê° ìë VM ë° ì€ì OSì 겜ì°, 컀ë ë²ì ìŽ 4.18 ìŽì ìž ê²œì° ì ì©ìŽ ìŽë µìµëë€. ëì ìŽ í¬ì€ížë¥Œ íìžíŽì£Œìžì.
Bash ì€í¬ëŠœíž
ì¬ì 첎í¬ëЬì€íž
íšì¹ ì ì©ì ìì, VS Codeì ì°ëíêž° ìí Ʞ볞ì ìž ì²Ží¬ëЬì€ížë¥Œ íìžíŽì£Œìžì.
- ëì 컚í ìŽëë AMD64 (x86-64) ìí€í ì²ë¡ 구ëëëì?
- ëì 컚í ìŽëë¡ì SSH ì ììŽ ê°ë¥íëë¡ êµ¬ì±ë ìíìžê°ì? (SSH ìë¹ì€, êµ¬ì± íìŒ, AppArmor, ë°©í벜, í¬íž í¬ìë© ë±)
- ëì 컚í ìŽëë apt íší€ì§ êŽëЬìì ì¬ì©ìŽ ê°ë¥í ìíìžê°ì?
- ëì 컚í ìŽëì root ê¶í ëë sudoì ì¬ì©ìŽ ê°ë¥í ìíìžê°ì?
- VS Codeìì Remote - SSH íì¥ êž°ë¥ì ì€ì¹í ìíìžê°ì?
몚ë ë§ì¡±íë ê²œì° ì§íí ì ììµëë€.
ì€í¬ëŠœíž ì€ë¹
뚌ì , ì°ë ëì ëšžì ì SSHë¡ ì ìí©ëë€. ê·žëŠ¬ê³ /var/tmp
ë¡ ìŽëíì¬ ìë ì€í¬ëŠœíž 3ê°ë¥Œ ìì±í©ëë€. ìŽì ë¶í° ê° ì€í¬ëŠœížë¥Œ apply-part-1.sh
, apply-part-2.sh
, apply-part-3.sh
ë¡ ë¶ë¥Žê² ìµëë€.
ìŽë, part 1 ë° part 3ì rootë¡, ê·žëŠ¬ê³ part 2ë ìŒë° ì ì ë¡ ì€ííŽìŒ í©ëë€. ë§ìœ root
ìŽìžì ê³ì ìŽ ììŒì 겜ì°, adduser ìŒë°ê³ì ëª
륌 íµíŽ ìŒë° ì ì 륌 íë ë§ë€ìŽì£Œìžì.
ì€í¬ëŠœížë¥Œ 3ê°ë¡ ëëìŽëì ìŽì ê° ê¶êží©ëë€. ê·žëŠ¬ê³ ì part 2ë ìŒë° ì ì ë¡ ì€ííŽìŒ íëì?ìì ì 첎ì ìŒë¡ root ê¶íìŽ íìíë, ë€ë§ part 2ì `ct-ng build` ë¶ë¶ë§íŒì ìŒë° ì ì ë¡ ì€ííëë¡ ì볞 `.config` íìŒìŽ êµ¬ì±ëìŽ ìêž° ë묞ì ëë€.
#!/bin/bash
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# root ê¶í 첎í¬
if [ "$EUID" -ne 0 ]; then
echo "ì€ë¥: ìŽ ì€í¬ëŠœížë root ì ì ë¡ë§ ì€íí ì ììµëë€." >&2
echo "Error: This script could ONLY be run by the root user." >&2
exit 1
fi
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# ì
ë°ìŽíž ë° íší€ì§ ì€ë¹
apt-get update
apt-get install -y tree 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
# ìŽêž° ëë í°ëЬ ìì±
mkdir -p /vscode-sysroot
mkdir -p /toolchain-dir
cd /toolchain-dir
# Patchelf ë€ìŽë¡ë ë° ì ì©
wget https://github.com/NixOS/patchelf/releases/download/0.18.0/patchelf-0.18.0-x86_64.tar.gz \
&& mkdir -p patchelf-0.18.0-x86_64 \
&& tar -xzvf patchelf-0.18.0-x86_64.tar.gz -C patchelf-0.18.0-x86_64 \
&& mv patchelf-0.18.0-x86_64/bin/patchelf /usr/local/bin/
cd /toolchain-dir
# í¬ë¡ì€-ë¹ë íŽì²Žìž
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
chmod -R a+rX /crosstool-ng-1.26.0/out
# (1) ~/.profile ëì export êµ¬ë¬žìŽ ììŒë©Ž ì¶ê°
grep -qxF 'export PATH=$PATH:/crosstool-ng-1.26.0/out/bin' ~/.profile \
|| echo 'export PATH=$PATH:/crosstool-ng-1.26.0/out/bin' >> ~/.profile
source ~/.profile
# (2) /etc/profile ëì export êµ¬ë¬žìŽ ììŒë©Ž ì¶ê°
grep -qxF 'export PATH=$PATH:/crosstool-ng-1.26.0/out/bin' /etc/profile \
|| echo 'export PATH=$PATH:/crosstool-ng-1.26.0/out/bin' >> /etc/profile
# (3) /etc/environment ëì ì¶ê°
echo 'PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/crosstool-ng-1.26.0/out/bin"' >> /etc/environment
cd /toolchain-dir
# ê¶í êŽë š ì 늬 (rootìžì ì ì ë€ì ìíš)
# í¹ìí íìê° ìì ê²œì° ê¶íì ì§ì ì€ì íìžì.
chmod -R a+rX /vscode-sysroot
chmod a+x /usr/local/bin/patchelf
# ì¬êž°ì ì ì root륌 ëììŒ í©ëë€.
# ì€í¬ëŠœíž part 2(ct-ng build)ì ì€í ìë£ í, ë€ì rootë¡ ë€ìŽìì ê³ì.
echo "ì€í¬ëŠœíž part 1 ì€í ìë£." >&2
echo "ì¬êž°ì ì ì root륌 ëììŒ í©ëë€. ìŒë° ì ì ë¡ ì€í¬ëŠœíž part 2륌 ì€ííŽì£Œìžì." >&2
echo "Part 1 of the script completed." >&2
echo "You need to exit root for now. Run part 2 as an unprivileged user." >&2
#!/bin/bash
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# ìŒë° ì ì ê¶í 첎í¬
if [ "$EUID" -eq 0 ]; then
echo "ì€ë¥: ìŽ ì€í¬ëŠœížë ìŒë° ì ì ë¡ë§ ì€íí ì ììµëë€. rootë ìë©ëë€." >&2
echo "Error: This script could NOT be run by the root user." >&2
exit 1
fi
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# ct-ng ì¬ì© ê°ë¥ ì¬ë¶ 첎í¬
if ! which ct-ng > /dev/null; then
echo "ì€ë¥: ct-ngê° ì€ì¹ëìŽ ìì§ ììµëë€. ì€ì¹ í ë€ì ìëíŽ ì£Œìžì." >&2
echo "Error: ct-ng is not installed. Please install it and try again." >&2
exit 1
fi
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# ì€í ìê° êŽë š ê²œê³ ë° confirmation
echo "ê²œê³ : ìŽ ìì
ì íë¡ìžì ì±ë¥ì ë°ëŒ 20ë¶-50ë¶ ì ë ììë©ëë€. ê³ìí ê¹ì? (y/n)" >&2
echo "Warning: This task may take between 10 to 50 minutes, depending on your processor performance. Proceed? (y/n)" >&2
read -r user_input
if [[ "$user_input" != "y" && "$user_input" != "Y" ]]; then
echo "ì€ëší©ëë€. Aborting." >&2
exit 1
fi
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# .config ë€ìŽë¡ë ë° ct-ng build
# 죌ì: ìê°ìŽ ìë¹í 걞늬ë ìì
ì
ëë€ (ìœ 20ë¶-50ë¶).
mkdir -p /var/tmp/glibcbuild
cd /var/tmp/glibcbuild
wget https://raw.githubusercontent.com/microsoft/vscode-linux-build-agent/refs/heads/main/x86_64-gcc-8.5.0-glibc-2.28.config
cp x86_64-gcc-8.5.0-glibc-2.28.config .config
ct-ng build
# ì€í¬ëŠœíž part 2(ct-ng build)ì ì€í ìë£ í, ë€ì rootë¡ ë€ìŽìì ê³ì.
echo "ì€í¬ëŠœíž part 2 ì€í ìë£." >&2
echo "ë€ì rootë¡ ë€ìŽì ì€í¬ëŠœíž part 3ì ì€ííŽì£Œìžì." >&2
echo "Part 2 of the script completed." >&2
echo "Return to root and run part 3 to continue." >&2
#!/bin/bash
# ì€í¬ëŠœíž part 2(ct-ng build)ì ì€í ìë£ í, ë€ì rootë¡ ë€ìŽìì ê³ìí©ëë€.
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# root ê¶í 첎í¬
if [ "$EUID" -ne 0 ]; then
echo "ì€ë¥: ìŽ ì€í¬ëŠœížë root ì ì ë¡ë§ ì€íí ì ììµëë€." >&2
echo "Error: This script could ONLY be run by the root user." >&2
exit 1
fi
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# /var/tmp/glibcbuild ëë í°ëЬ ì 묎 íìž
if [ ! -d /var/tmp/glibcbuild/x86_64-linux-gnu/x86_64-linux-gnu/sysroot ] || [ -z "$(ls -A /var/tmp/glibcbuild/x86_64-linux-gnu/x86_64-linux-gnu/sysroot)" ]; then
echo "ì€ë¥: /var/tmp/glibcbuildëŽ ì»€ì€í
sysrootê° ììŽ ì§íìŽ ë¶ê°ë¥í©ëë€." >&2
echo "Error: No custom sysroot in the directory '/var/tmp/glibcbuild'." >&2
exit 1
fi
# âââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââââ
# ct-ng buildí ë¹ë 결곌묌 ìŽë
cp -r /var/tmp/glibcbuild/x86_64-linux-gnu/x86_64-linux-gnu/sysroot/* /vscode-sysroot
cd /toolchain-dir
# í겜ë³ì ì ì© /etc/profile.d/vscode-glibc.sh
echo 'export VSCODE_SERVER_CUSTOM_GLIBC_LINKER=/vscode-sysroot/lib/ld-linux-x86-64.so.2' > /etc/profile.d/vscode-glibc.sh
echo 'export VSCODE_SERVER_CUSTOM_GLIBC_PATH=/vscode-sysroot/lib:/vscode-sysroot/usr/lib' >> /etc/profile.d/vscode-glibc.sh
echo 'export VSCODE_SERVER_PATCHELF_PATH=/usr/local/bin/patchelf' >> /etc/profile.d/vscode-glibc.sh
# í겜ë³ì ì ì© /etc/environment
echo 'VSCODE_SERVER_CUSTOM_GLIBC_LINKER=/vscode-sysroot/lib/ld-linux-x86-64.so.2' >> /etc/environment
echo 'VSCODE_SERVER_CUSTOM_GLIBC_PATH=/vscode-sysroot/lib:/vscode-sysroot/usr/lib' >> /etc/environment
echo 'VSCODE_SERVER_PATCHELF_PATH=/usr/local/bin/patchelf' >> /etc/environment
# ê¶í êŽë š ì 늬 (rootìžì ì ì ë€ì ìíš)
# í¹ìí íìê° ìì ê²œì° ê¶íì ì§ì ì€ì íìžì.
chmod -R a+rX /vscode-sysroot
chmod a+x /usr/local/bin/patchelf
# ì€í¬ëŠœíž part 3 ì€í ìë£
echo "ì€í¬ëŠœíž part 3 ì€í ìë£." >&2
echo "ìŽì Visual Studio Codeìì Remote-SSH륌 íµíì¬ ì ìì ìëíŽì£Œìžì. ë§ìœ ìë 겜ì°, ìŽ ëšžì ì ì¬ë¶í
íì¬ ë€ì ìëíŽì£Œìžì." >&2
echo "Part 3 of the script completed." >&2
echo "Now you can try connecting from Visual Studio Code with Remote - SSH. Try again by rebooting this machine if it does not take any effect." >&2
ìì± í /var/tmp
겜ë¡ìì ls -al
ì ë 늬멎 ìëì ê°ìŽ 3ê°ì ì€í¬ëŠœížë¥Œ ë³Žì€ ì ììµëë€.
ì¬êž°ì ìë ëª ë ¹ìŽë¥Œ ì€ííì¬ ê¶íì ë¶ì¬í©ëë€. `ìŒë°ì ì ëª `ì ê°ì§ê³ ê³ì ìŒë° ì ì ê³ì ì ë£ìŽì£Œìžì.
chmod ug+x apply-part-*;chown ìŒë°ì ì ëª
:ìŒë°ì ì ëª
apply-part-2.sh
ìŽí ìëì ê°ìŽ ê¶íìŽ ì ì í ë€ìŽê° ê²ì íìží©ëë€.
ìŽë¡ìš ì€í¬ëŠœížë¥Œ ì€ííêž° ìí ì€ë¹ë¥Œ 몚ë ë§ì¹ì šìµëë€.
ì€í¬ëŠœíž ì€í
ì€í¬ëŠœíž part 1
ì€í¬ëŠœíž part 1ì root
ë¡ ì€ííŽìŒ íë¯ë¡, ìëì ê°ìŽ whoami
륌 íµíŽ root
ìì íìží ë€ ì€ííŽì£Œìžì.
ì€í¬ëŠœíž part 1ì ì€íì ë§ì¹ ë€ ëªšìµì ìì ê°ìµëë€.
ì€í¬ëŠœíž part 2
ì€í¬ëŠœíž part 2ë ìŒë° ì ì ë¡ ì€ííŽìŒ íë¯ë¡, ìëì ê°ìŽ whoami
륌 íµíŽ ìŒë° ì ì ìì íìží ë€ ì€ííŽì£Œìžì.
ì ë©ìì§ë¥Œ íìž í ì§ííŽì£Œìžì. ì€í¬ëŠœíž part 2ë ìê°ìŽ ë€ì 걞늜ëë€. ì죌 ê³ ì±ë¥ 칩ì ìŽë©Ž 10ë¶, ìµë 50ë¶ ì ëì ìì ìê°ì ììí ì ììµëë€.
ì 겜ì°ë 17ë¶ìŽìë€ì.
ì€í¬ëŠœíž part 3
ì€í¬ëŠœíž part 3ì ë€ì root
ë¡ ì€ííŽìŒ íë¯ë¡, ìëì ê°ìŽ whoami
륌 íµíŽ root
ìì íìží ë€ ì€ííŽì£Œìžì.
ì€í¬ëŠœíž part 3 ì€íì ë§ì¹ 몚ìµì ëë€.
íšì¹ íìž
ì€í¬ëŠœíž 3ê¹ì§ ì€íì ë§ì³€ë€ë©Ž, ìëì ê°ìŽ cat /etc/environment
ì íµíŽ ì ìì ìŒë¡ í겜 ë³ì ìží
ìŽ ëìëì§ íìžíŽì£Œìžì. ëí, /vscode-sysroot/lib/ld-linux-x86-64.so.2
륌 ì€ííì¬ ë§ì»€ê° ì ìì ìŒë¡ ìëíëì§ íìžíŽì£Œìžì.
VS Codeì Remote - SSH륌 ìŽì©í ì°ë
ê³µì 묞ìì ë°ë¥Žë©Ž, íšì¹ë¥Œ ë§ì¹ ë€ Remote - SSH륌 ìŽì©íì¬ ì°ëí ì ìë€ê³ í©ëë€. ê·žë¬ë¯ë¡ ìëì ê°ìŽ Remotes (Tunnels/SSH)륌 ì íí©ëë€. ìŽí íŽë¹ ëšžì ì IP 죌ì ë° í¬ížë¥Œ ìŽì©íì¬ ì°ëí©ëë€.
ë§ì§ë§ìŒë¡, "ë¹ì ì íì¬ ë¹ì£ŒìŒ ì€íëì€ ìœëê° ì§ìíì§ ìë OS ë²ì ì ì°ê²°íê³ ê³ìëë€."ëŒë ë©ìì§ê° ëšë©Ž ì±ê³µì ëë€. íì© (Allow)ì ë륎멎 ì°ëìŽ ëë©ëë€.
ëë²ê¹ ë ë ìŽì 컀맚ëëŒìžìŽ ìë VS Codeì ì°ëíì¬ ìíí ì ììµëë€.
ì¶ê° í
ë°ìŽë늬륌 ì€íí ë, ëê° ëŽë ëì ì»ê³ ëŽë íìŒìŽ ìê³ ì€íê¶í(x)ë ìëë° ì ë° ì늬륌 íë 겜ì°ê° ììµëë€. ìŽëŽ ë ìëì ê°ìŽ ëª ë ¹ìŽë¥Œ ì€ííì¬ 32ë¹íž ìí€í ì² ížíì±ì 구ì±íŽìŒ í©ëë€.
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386 gcc-multilib
'IT > DevOps' 칎í ê³ ëŠ¬ì ë€ë¥ž êž
ìë íìžì.
í¬ì€í ìŽ ì¢ìë€ë©Ž "ì¢ììâ€ïž" ëë "구ë ðð»" íŽì£Œìžì!