IT/DevOps

Ubuntu 18.04 ๋“ฑ ๊ตฌ๋ฒ„์ „์—์„œ Visual Studio Code ์—ฐ๋™ ๋ถˆ๊ฐ€ ํ˜„์ƒ ํ•ด๊ฒฐํ•˜๊ธฐ (VM, ์‹ค์ œ OSํŽธ)

Unused 2025. 4. 29. 23:30
์ปจํ…Œ์ด๋„ˆ (WSL, Docker, LXC ๋“ฑ)์˜ ๊ฒฝ์šฐ ๊ฐ€๊ธ‰์  ์ด ํฌ์ŠคํŠธ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ์šฉํ•˜์„ธ์š”.
AMD64 (x86-64) ์ด์™ธ์˜ ์•„ํ‚คํ…์ฒ˜์˜ ๊ฒฝ์šฐ ๊ณต์‹ ๋ฌธ์„œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.
VS Code Server๊ฐ€ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋Š” ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

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 ๋ฒ„์ „๋ถ€ํ„ฐ๋Š” 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 ์—ฐ๋™ ๋Œ€์ƒ ๋จธ์‹ ์€ Ubuntu 18.04 LTS๊ฐ€ ๊ตฌ๋™๋˜๋Š” VM์ž…๋‹ˆ๋‹ค.

์•„๋ž˜ ์†Œ๊ฐœํ•ด๋“œ๋ฆด ๋ฐฉ๋ฒ•์€ ์ˆœ์ • ์ปค๋„๋กœ ๊ตฌ๋™๋˜๋Š” VM ๋ฐ ์‹ค์ œ OS๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ (WSL, LXC, Docker ๋“ฑ)์˜ ๊ฒฝ์šฐ ์ด ํฌ์ŠคํŠธ์˜ ๋ฐฉ๋ฒ•๋Œ€๋กœ ์ ์šฉํ•˜์‹œ๊ธฐ๋ฅผ ๊ถŒํ•ฉ๋‹ˆ๋‹ค.

Bash ์Šคํฌ๋ฆฝํŠธ

์‚ฌ์ „ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

ํŒจ์น˜ ์ ์šฉ์— ์•ž์„œ, VS Code์™€ ์—ฐ๋™ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ์ ์ธ ์ฒดํฌ๋ฆฌ์ŠคํŠธ๋ฅผ ํ™•์ธํ•ด์ฃผ์„ธ์š”. 

  • ๋Œ€์ƒ ๋จธ์‹ ์€ AMD64 (x86-64) ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌ๋™๋˜๋‚˜์š”?
  • ๋Œ€์ƒ ๋จธ์‹ ์œผ๋กœ์˜ SSH ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ์ƒํƒœ์ธ๊ฐ€์š”? (SSH ์„œ๋น„์Šค, ๊ตฌ์„ฑ ํŒŒ์ผ, AppArmor, ๋ฐฉํ™”๋ฒฝ, ํฌํŠธ ํฌ์›Œ๋”ฉ ๋“ฑ)
  • ๋Œ€์ƒ ๋จธ์‹ ์€ apt ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ๊ฐ€์š”?
  • ๋Œ€์ƒ ๋จธ์‹ ์˜ root ๊ถŒํ•œ ๋˜๋Š” sudo์˜ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•œ ์ƒํƒœ์ธ๊ฐ€์š”?
  • VS Code์—์„œ Remote - SSH ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์„ค์น˜ํ•œ ์ƒํƒœ์ธ๊ฐ€์š”?

๋ชจ๋‘ ๋งŒ์กฑํ•˜๋Š” ๊ฒฝ์šฐ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑ ๋ฐ ์‹คํ–‰

๋จผ์ €, ์—ฐ๋™ ๋Œ€์ƒ ๋จธ์‹ ์— SSH๋กœ ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ apply_vsc_server_vm.sh๋กœ ๋ถ€๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์Šคํฌ๋ฆฝํŠธ๋Š” root๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ฐธ๊ณ ํ•˜์—ฌ ์ง„ํ–‰ํ•ด์ฃผ์„ธ์š”.

#!/bin/bash

set -e

# 1) root ๊ถŒํ•œ ์ฒดํฌ
if [ "$(id -u)" -ne 0 ]; then
  echo "์ด ์Šคํฌ๋ฆฝํŠธ๋Š” root๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. sudo ๋˜๋Š” su๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”."
  echo "Error: This script could ONLY be run by the root user. Try sudo or su."
  exit 1
fi
# 1a) ์‹คํ–‰ ์‹œ๊ฐ„ ๊ด€๋ จ ์•ˆ๋‚ด ๋ฐ confirmation
echo "์•ˆ๋‚ด: ์ด ์ž‘์—…์€ ํ”„๋กœ์„ธ์„œ ์„ฑ๋Šฅ์— ๋”ฐ๋ผ 5-10๋ถ„ ์ •๋„ ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ๊ณ„์†ํ• ๊นŒ์š”? (y/n)" >&2
echo "Info: This task may take between 5 to 10 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

# 2) ํ•„์ˆ˜ ํŒจํ‚ค์ง€ ์„ค์น˜ (bison ๋“ฑ ์ถ”๊ฐ€)
apt update
apt install -y build-essential wget patchelf bison gawk m4 texinfo \
gcc g++ gdb gperf bison flex texinfo help2man make libncurses5-dev \
python3-dev autoconf automake libtool libtool-bin bzip2 xz-utils unzip \
tree gawk wget patch rsync meson ninja-build

# 3) glibc 2.28 ๋‹ค์šด๋กœ๋“œ ๋ฐ ๋นŒ๋“œ ์ค€๋น„
GLIBC_VERSION="2.28"
GLIBC_SRC="glibc-$GLIBC_VERSION"
INSTALL_PREFIX="/opt/$GLIBC_SRC"

cd /tmp
wget http://ftp.gnu.org/gnu/libc/$GLIBC_SRC.tar.gz
tar -xzf $GLIBC_SRC.tar.gz
mkdir -p $GLIBC_SRC/build
cd $GLIBC_SRC/build

# 4) configure & make
../configure --prefix=$INSTALL_PREFIX --disable-werror
make -j"$(nproc)"
make install

# 5) ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋“ฑ๋ก - /etc/profile.d/vscode-glibc.sh
LINKER="$INSTALL_PREFIX/lib/ld-$GLIBC_VERSION.so"
LIBPATH="$INSTALL_PREFIX/lib"
PATCHELF="$(which patchelf)"

cat > /etc/profile.d/vscode-glibc.sh << EOF
# VSCode Server custom glibc ์„ค์ • - profile.d
export VSCODE_SERVER_CUSTOM_GLIBC_LINKER=$LINKER
export VSCODE_SERVER_CUSTOM_GLIBC_PATH=$LIBPATH:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu
export VSCODE_SERVER_PATCHELF_PATH=$PATCHELF
EOF

chmod +x /etc/profile.d/vscode-glibc.sh

# ๋™์ผ ์ž‘์—… - /etc/environment
echo "VSCODE_SERVER_CUSTOM_GLIBC_LINKER=$LINKER" >> /etc/environment
echo "VSCODE_SERVER_CUSTOM_GLIBC_PATH=$LIBPATH:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu" >> /etc/environment
echo "VSCODE_SERVER_PATCHELF_PATH=$PATCHELF" >> /etc/environment

# 6) ์™„๋ฃŒ ๋ฉ”์‹œ์ง€
echo "glibc $GLIBC_VERSION ์„ค์น˜ ์™„๋ฃŒ: $INSTALL_PREFIX"
echo "VS Code Server์šฉ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ • ํŒŒ์ผ: /etc/profile.d/vscode-glibc.sh ๋ฐ /etc/environment"
echo "   - VSCODE_SERVER_CUSTOM_GLIBC_LINKER=$LINKER"
echo "   - VSCODE_SERVER_CUSTOM_GLIBC_PATH=$LIBPATH:/usr/lib/x86_64-linux-gnu:/lib/x86_64-linux-gnu"
echo "   - VSCODE_SERVER_PATCHELF_PATH=$PATCHELF"
echo "์ƒˆ๋กœ์šด SSH ์„ธ์…˜์—์„œ ์ด ์„ค์ •์ด ์ž๋™์œผ๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค."

์ž‘์„ฑ ํ›„ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•ฉ๋‹ˆ๋‹ค. 

chmod ug+x apply_vsc_server_vm.sh

์ดํ›„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ถŒํ•œ์ด ์ ์ ˆํžˆ ๋“ค์–ด๊ฐ„ ๊ฒƒ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์ด๋กœ์จ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ์ค€๋น„๋ฅผ ๋ชจ๋‘ ๋งˆ์น˜์…จ์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰

์Šคํฌ๋ฆฝํŠธ๋Š” root๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ์•„๋ž˜์™€ ๊ฐ™์ด whoami๋ฅผ ํ†ตํ•ด root์ž„์„ ํ™•์ธํ•œ ๋’ค ์‹คํ–‰ํ•ด์ฃผ์„ธ์š”.

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋งˆ์นœ ๋ชจ์Šต์ž…๋‹ˆ๋‹ค.

ํŒจ์น˜ ํ™•์ธ

์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ๋งˆ์ณค๋‹ค๋ฉด, ์•„๋ž˜์™€ ๊ฐ™์ด cat /etc/environment์„ ํ†ตํ•ด ์ •์ƒ์ ์œผ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์„ธํŒ…์ด ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์ฃผ์„ธ์š”. ๋˜ํ•œ, /opt/glibc-2.28/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