IT/DevOps

Ubuntu 18.04 ๋“ฑ ๊ตฌ๋ฒ„์ „์—์„œ Visual Studio Code ์—ฐ๋™ ๋ถˆ๊ฐ€ ํ˜„์ƒ ํ•ด๊ฒฐํ•˜๊ธฐ (์ปจํ…Œ์ด๋„ˆํŽธ: WSL, ๋„์ปค, LXC ๋“ฑ)

Unused 2025. 4. 28. 17:39
์ปจํ…Œ์ด๋„ˆ (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