Windows 11에서 Ubuntu와 GCC 시작하기
WSL 2와 Ubuntu를 설치하고 GCC로 C 프로그램을 빌드합니다.
명령을 실행하기 전에 코드 위에 표시된 터미널을 확인하세요.
- Windows 11
- WSL 2
- Ubuntu
- GCC로 빌드
STEP 01시작 전 확인
WSL은 Windows에서 리눅스 환경을 실행하는 기능입니다. Ubuntu는 여기에 설치할 리눅스 배포판이며, GCC는 Ubuntu 안에서 사용할 컴파일러입니다.
- Windows 11 PC, 인터넷 연결, Windows 관리자 권한을 준비합니다.
- 진행 중인 작업을 저장합니다. 설치 중 재부팅이 필요할 수 있습니다.
- 작업 관리자 → 성능 → CPU에서 가상화: 사용 여부를 확인합니다. 꺼져 있다면 PC 제조사의 BIOS/UEFI 안내를 확인하세요.
WSL 설치·업데이트·상태 확인에 사용합니다. 시작 메뉴에서 PowerShell을 검색하세요.
패키지 설치·파일 작업·GCC 컴파일에 사용합니다. 시작 메뉴에서 Ubuntu를 실행하세요.
$, PS> 같은 프롬프트가 없으므로 그대로 복사할 수 있습니다.STEP 02WSL 2와 Ubuntu 설치
교수님이 추천한 설치 안내는 위키독스 「2.2. WSL 설치와 실행」입니다. 아래 설치 명령은 이 자료에서 사용하는 Ubuntu 22.04 기준입니다. 수업에서 지정한 버전이 있으면 그 버전을 사용하세요.
① 먼저 설치 상태 확인
wsl --version
wsl --status
wsl -l -vWSL 설치와 Ubuntu 설치는 별개입니다. WSL 버전이 출력되어도 wsl -l -v에서 “설치된 배포가 없습니다”가 나오면 현재 Windows 계정에 등록된 리눅스가 없는 상태입니다.
“기본 버전: 2”만으로 Ubuntu 설치가 확인되는 것은 아닙니다. 배포판이 없다면 다음 설치 단계로 진행하세요.
② 설치할 배포판 선택
시작 메뉴에서 PowerShell을 검색해 관리자 권한으로 실행합니다. 먼저 온라인 목록에 원하는 배포판 이름이 있는지 확인하세요.
wsl --list --onlineUbuntu가 없으면 아래 명령으로 설치합니다. 수업에 맞는 Ubuntu가 이미 등록되어 있으면 해당 배포판을 사용하세요.
wsl --install -d Ubuntu-22.04재부팅 안내가 나오면 작업을 저장하고 Windows를 재부팅합니다. 이후 시작 메뉴에서 Ubuntu 22.04를 열거나 아래 명령으로 실행하고, STEP 03의 사용자 계정을 만듭니다.
wsl -d Ubuntu-22.04WSL 버전이 정상 출력된다면 Ubuntu 배포판 설치부터 진행할 수 있습니다.
최신 WSL의 커널은 WSL 업데이트로 관리하므로 별도의 구형 커널 패키지 설치부터 시작할 필요는 없습니다.
WSL 2 사용 여부 확인
wsl -l -v목록에서 Ubuntu-22.04 행의 VERSION이 2인지 확인합니다. Stopped는 종료된 상태라는 뜻이며 오류가 아닙니다.
Ubuntu나 Ubuntu-24.04처럼 다른 이름이 표시되면 이후 명령의 Ubuntu-22.04 자리에 실제 등록된 이름을 사용하세요.
VERSION이 1인 경우에만 다음 명령을 실행합니다. 기존 배포판에 중요한 파일이 있다면 먼저 백업하세요.
wsl --set-version Ubuntu-22.04 2설치 및 WSL 버전 확인: Microsoft WSL 설치 문서
STEP 02-1WSL 1·2에서 Ubuntu 실행하기
Ubuntu를 처음 열거나 PC 재시작 후 다시 실습할 때는 아래 순서를 따릅니다. 명령을 입력할 Ubuntu 터미널(Bash)이 열리며, Ubuntu 바탕화면은 표시되지 않습니다.
WSL 1과 WSL 2의 Ubuntu 실행 명령은 같습니다. 1·2는 각 배포판이 사용하는 WSL 실행 방식을 나타냅니다.
별도의 wsl2 명령을 찾을 필요 없이 wsl을 사용합니다. 이 가이드의 실습 기준은 WSL 2입니다.
① PowerShell에서 설치된 Ubuntu 이름 확인
Windows 시작 메뉴에서 PowerShell을 열고 아래 명령을 한 줄씩 실행합니다. 일반적인 Ubuntu 실행에는 관리자 권한이 필요하지 않습니다.
wsl --version
wsl --status
wsl -l -vwsl --version은 WSL 구성 요소 버전, wsl --status는 기본 설정을 보여 줍니다. 설치된 Ubuntu의 이름과 WSL 1·2 여부는 마지막 목록의 NAME과 VERSION에서 확인합니다.
NAME STATE VERSION
* Ubuntu-22.04 Stopped 2이 예시의 배포판 이름은 Ubuntu-22.04, 실행 방식은 WSL 2입니다. *는 기본 배포판이고, Stopped는 현재 멈춘 상태이며, 실행 명령을 입력하면 시작됩니다. Running이면 이미 실행 중입니다. 실제 이름이 Ubuntu 또는 Ubuntu-24.04라면 아래 모든 PowerShell 예제의 Ubuntu-22.04를 그 이름으로 바꾸세요.
목록에 Ubuntu가 없다면 STEP 02의 배포판 설치를 먼저 진행하세요. VERSION이 1이어도 실행 방법은 같으며, WSL 2로 전환하려면 STEP 02의 버전 확인 안내를 따릅니다. 기본 버전이 2라는 설정만으로 기존 Ubuntu가 WSL 2로 바뀌지는 않습니다.
② 이름을 지정해 Ubuntu 열기
같은 PowerShell 창에서 실행합니다. -d는 실행할 배포판을 지정합니다. 기본 배포판이 다른 리눅스여도 지정한 Ubuntu가 열립니다.
wsl -d Ubuntu-22.04최초 실행에서 사용자 이름과 비밀번호를 요청하면 STEP 03의 계정 생성 안내를 따라 설정합니다. 이미 계정을 만들었다면 보통 그 사용자로 바로 들어갑니다.
성공하면 같은 창에 다음과 비슷한 프롬프트가 표시됩니다. 사용자 이름·PC 이름·현재 경로는 환경마다 다릅니다.
student@MY-PC:~$③ Ubuntu 안에 들어왔는지 확인
이제 아래 명령은 Ubuntu · Bash에서 실행합니다. PowerShell에서 열면 시작 위치가 Windows 폴더에 대응하는 /mnt/c/...일 수 있습니다. 먼저 cd ~로 Linux 홈 폴더로 이동합니다.
cd ~
whoami
pwd
cat /etc/os-release출력은 순서대로 Linux 사용자 이름, /home/사용자명 경로, NAME="Ubuntu" 등이 포함된 배포판 정보입니다. Ubuntu 버전과 WSL 실행 방식(VERSION 1·2)은 별개입니다.
처음 설정 중이라면 STEP 03으로, 설정을 마쳤다면 작업 폴더로 이어가세요.
④ 시작 메뉴나 Windows Terminal로 열기
- 시작 메뉴: 설치한 Ubuntu 앱(예: Ubuntu 22.04)을 검색해 엽니다.
- Windows Terminal: 새 탭 버튼 옆의 메뉴에서 Ubuntu 프로필을 선택합니다. 목록에 없으면 PowerShell 탭에서 ②의 명령을 실행하세요.
- 네트워크 실습용 터미널 두 개: PowerShell 탭 두 개에서 같은 배포판 이름으로 ②의 명령을 실행합니다. 한 창에서는 서버를, 다른 창에서는 클라이언트를 실행합니다.
⑤ 기본 Ubuntu를 짧은 명령으로 열기 · 선택
wsl만 입력하면 기본 배포판이 열립니다. 항상 이 Ubuntu가 열리게 하려면 새 PowerShell 탭에서 아래 설정을 한 번 실행하세요. 기본 배포판 선택을 변경하는 명령이며 WSL 1·2를 바꾸지는 않습니다.
wsl --set-default Ubuntu-22.04그다음부터 PowerShell에서 아래 명령으로 기본 Ubuntu의 홈 폴더를 바로 열 수 있습니다.
wsl ~⑥ 종료하고 다음에 다시 실행하기
Ubuntu에서 작업을 저장한 뒤 아래 명령으로 현재 셸을 닫습니다. PowerShell에서 들어왔다면 PowerShell로 돌아가며, Ubuntu 전용 탭은 닫힐 수 있습니다.
exit다음 실습 때는 PowerShell에서 wsl -d Ubuntu-22.04를 실행하고, Ubuntu 안에서 cd ~/projects/network-practice로 이동하세요. 이 폴더를 아직 만들지 않았다면 STEP 04를 먼저 진행합니다. 매번 설치하거나 계정을 다시 만들 필요는 없습니다.
exit는 현재 셸을 닫는 명령으로, 다른 터미널이나 백그라운드 프로세스까지 모두 종료하지는 않습니다. 해당 Ubuntu 전체를 중지해야 할 때만 작업을 저장하고 PowerShell에서 wsl --terminate Ubuntu-22.04를 실행하세요. 이 명령은 그 배포판 안의 실행 중인 프로세스도 종료합니다.실행 명령과 계정 설정: Microsoft WSL 기본 명령 · Microsoft 계정 및 터미널 설정
STEP 03Ubuntu 계정과 패키지 준비
Ubuntu 최초 실행 시 소문자 영문으로 사용자 이름을 정하고 비밀번호를 두 번 입력합니다. Windows 로그인 계정과 별개이며, 비밀번호를 입력해도 문자나 별표가 표시되지 않습니다.
① Ubuntu에서 sudo 확인
계정 생성이 끝나면 Ubuntu 터미널에서 아래 명령을 실행하고 방금 만든 Ubuntu 비밀번호를 입력합니다.
whoami
sudo whoami첫 번째 명령은 현재 사용자 이름을, 두 번째 명령은 아래의 관리자 계정 이름을 출력합니다.
root② 패키지 업데이트
sudo가 정상 동작하면 같은 Ubuntu 터미널에서 실행합니다. GCC와 GDB는 STEP 05에서 설치합니다.
sudo apt update
sudo apt upgrade
sudo apt install git curl nanosudo는 관리자 권한으로 명령을 실행합니다. apt update는 패키지 목록을 갱신하고, apt upgrade는 설치된 패키지를 업데이트합니다. 계속할지 묻는 메시지가 나오면 내용을 확인하고 Y를 입력합니다.
wsl --update, Ubuntu 패키지 업데이트는 Ubuntu의 apt로 관리합니다.계정과 초기 환경: Microsoft 개발 환경 설정
STEP 04리눅스 작업 폴더 만들기
리눅스 도구로 빌드할 코드는 파일 접근 성능을 위해 Ubuntu 홈 폴더 아래에 둡니다. ~는 현재 사용자의 홈 디렉터리입니다.
mkdir -p ~/projects/network-practice
cd ~/projects/network-practice
pwd출력은 /home/사용자명/projects/network-practice 형태입니다. Windows 폴더에는 다음처럼 접근합니다.
ls /mnt/c/Users/USER/Desktop/Network_ProgramingUbuntu의 현재 폴더를 Windows 탐색기로 열려면 explorer.exe .를 실행합니다. 이 가이드의 C 실습은 ~/projects/network-practice에서 진행합니다.
파일 위치와 Windows 연동: Microsoft 파일 시스템 안내
STEP 05GCC 설치와 첫 C 프로그램
① 컴파일러와 빌드 도구 설치
sudo apt update
sudo apt install build-essential gdb
gcc --version
g++ --version
make --version
gdb --version
command -v gccbuild-essential은 GCC, G++, Make와 기본 개발 헤더 등을 설치합니다. gdb는 디버거입니다.
버전 번호는 Ubuntu 버전에 따라 다르며, 기본 구성에서 GCC 경로는 보통 /usr/bin/gcc입니다.
② 소스 파일 작성
cd ~/projects/network-practice
nano hello.c아래 코드를 편집기에 붙여 넣습니다. Ctrl + O → Enter로 저장하고 Ctrl + X로 닫습니다.
#include <stdio.h>
int main(void)
{
int port = 9000;
printf("Hello, Ubuntu! Port: %d\n", port);
return 0;
}③ 컴파일하고 실행
gcc -std=c17 -Wall -Wextra -Wpedantic -g -O0 hello.c -o hello
./hello컴파일에 성공한 뒤 실행하면 아래 문장이 출력됩니다. 컴파일 오류가 있으면 먼저 해결하세요.
Hello, Ubuntu! Port: 9000| 옵션 | 역할 |
|---|---|
-std=c17 | C17 표준으로 컴파일 |
-Wall -Wextra | 자주 유용한 경고와 추가 경고 활성화. 모든 경고를 켜는 옵션은 아닙니다. |
-Wpedantic | 선택한 ISO 표준을 벗어나는 일부 확장 등에 진단 출력 |
-g -O0 | 디버깅 정보 포함, 최적화를 끄고 실습 |
-o hello | 실행 파일 이름을 hello로 지정 |
./hello | 현재 폴더의 실행 파일 실행 |
④ 여러 파일 / C++를 빌드할 때
해당 소스 파일이 있을 때는 아래 명령을 사용합니다. C++ 빌드에는 표준 라이브러리도 링크하는 g++를 사용합니다.
# C 소스 파일이 main.c, helper.c인 경우
gcc -std=c17 -Wall -Wextra -g main.c helper.c -o app
# C++ 소스 파일이 main.cpp인 경우
g++ -std=c++17 -Wall -Wextra -g main.cpp -o cpp-app일반적인 Linux 소켓 API는 추가 Winsock 라이브러리 없이 사용합니다. POSIX 스레드를 사용하는 코드에는 -pthread 옵션을 추가합니다.
설치: VS Code 공식 WSL GCC 가이드 · 경고 옵션: GCC 공식 문서
STEP 06GDB로 실행 흐름 살펴보기
앞에서 -g -O0로 빌드한 hello를 사용합니다.
cd ~/projects/network-practice
gdb ./hello(gdb) 프롬프트가 나오면 아래 명령을 한 줄씩 입력합니다.
break main
run
next
print port
continue
quitbreak main은 main 함수에 중단점을 설정합니다. run으로 시작하고, 변수 초기화 줄에서 next를 실행한 뒤 print port로 값 9000을 확인합니다.
continue는 계속 실행하고 quit는 GDB를 종료합니다.
STEP 07VS Code에서 편집하기 · 선택
- Windows에 VS Code를 설치합니다.
- VS Code 확장 화면에서 Microsoft의 WSL 확장을 설치합니다.
- Ubuntu에서 아래 명령으로 프로젝트를 엽니다.
cd ~/projects/network-practice
code .최초 연결에는 VS Code 서버 다운로드가 필요할 수 있습니다. 창 왼쪽 아래에 WSL: Ubuntu가 표시되는지 확인하고, 확장 화면에서 Microsoft의 C/C++ 확장을 WSL 환경에 설치합니다.
VS Code의 터미널 → 새 터미널에서 command -v gcc를 실행해 리눅스 컴파일러 경로를 확인하세요.
hello.c를 열고 터미널에서 STEP 05의 GCC 명령으로 빌드합니다. IntelliSense에서 컴파일러 경로를 요구하면 /usr/bin/gcc를 지정합니다.
편집기 연결과 C/C++ 설정: VS Code 공식 WSL 튜토리얼
STEP 08자주 쓰는 리눅스 명령
| Ubuntu 명령 | 설명 |
|---|---|
pwd / ls -al | 현재 위치 / 숨김 파일을 포함한 목록 |
cd ~ / cd .. | 홈으로 이동 / 상위 폴더로 이동 |
mkdir practice | 폴더 생성 |
cp hello.c backup.c | 파일 복사 |
mv backup.c old.c | 이동 또는 이름 변경 |
rm old.c | 파일 삭제. 일반적으로 휴지통을 거치지 않음 |
cat hello.c | 파일 내용 출력 |
less hello.c | 파일 읽기. q로 종료 |
man gcc | 설치된 설명서 열기. q로 종료 |
exit | 현재 셸 종료 |
Tab으로 자동완성, ↑로 이전 명령 불러오기, Ctrl + C로 실행 중단이 가능합니다. 리눅스는 파일명의 대소문자를 구분합니다.
개인 셸 설정
nano ~/.bashrc로 파일을 열고 아래 한 줄을 추가하면 ll을 목록 조회 명령으로 쓸 수 있습니다.
alias ll='ls -alF'저장 후 Ubuntu에서 source ~/.bashrc를 실행하면 현재 셸에 반영됩니다.
STEP 09로컬 TCP 연결 실습 · 선택
sudo apt install iproute2 iputils-ping dnsutils netcat-openbsd
ip addr
ip route
ss -lntUbuntu 터미널을 두 개 엽니다. 같은 Ubuntu 배포판 안에서 서버와 클라이언트를 실행합니다.
nc -l 127.0.0.1 9000nc 127.0.0.1 9000한쪽에서 문장을 입력하고 Enter를 누르면 반대쪽에 표시됩니다. 127.0.0.1은 자신의 루프백 주소, 9000은 포트입니다. 종료는 Ctrl + C입니다.
외부 PC와 연결하는 구성은 WSL 네트워크 모드와 방화벽에 따라 별도 설정이 필요합니다.
STEP 10막혔을 때 확인할 것
Ubuntu 실행 시 지정한 이름의 배포판이 없다고 나와요
PowerShell에서 wsl -l -v를 실행하고 NAME 열의 이름을 그대로 사용하세요. 예를 들어 이름이 Ubuntu이면 wsl -d Ubuntu로 엽니다.
설치 가능한 배포판을 보여 주는 wsl --list --online과 이미 설치된 배포판 목록은 다릅니다. Ubuntu 실행 가이드에서 확인 순서를 볼 수 있습니다.
wsl -l -v에 “설치된 배포가 없습니다”가 나와요
WSL 실행 파일은 있지만 현재 Windows 계정에 배포판이 등록되지 않은 상태입니다. STEP 02에서 온라인 목록을 확인한 후 Ubuntu를 설치하고 최초 계정 설정을 마치세요. 다른 Windows 계정에서 설치했다면 현재 계정의 목록에는 나타나지 않을 수 있습니다.
WSL1이 지원되지 않는다는 메시지가 나와요
WSL1 지원 안내가 나와도 WSL 2는 실행될 수 있습니다. wsl -l -v에 Ubuntu 행과 VERSION 2가 표시되는지, 해당 Ubuntu를 실제로 실행할 수 있는지 확인하세요.
sudo가 비활성화되어 있거나 비밀번호가 틀리다고 나와요
PowerShell의 Windows용 sudo가 아닌 Ubuntu 안의 sudo를 사용해야 합니다. PowerShell에서 wsl -d Ubuntu-22.04로 들어간 다음 sudo whoami를 실행하세요.
비밀번호는 Windows PIN이 아니라 Ubuntu 계정 생성 때 정한 비밀번호입니다. 입력 중 글자가 보이지 않는 것은 정상입니다.
WSL 설치가 0%에서 멈추거나 도움말만 나와요
PowerShell에서 배포판 목록을 확인하고 웹 다운로드 방식으로 다시 시도합니다.
wsl --list --online
wsl --install --web-download -d Ubuntu-22.04가상화 관련 오류로 Ubuntu가 시작되지 않아요
설치 후 재부팅했는지, 작업 관리자에서 CPU 가상화가 활성화되어 있는지 확인합니다. BIOS/UEFI에서 Intel VT-x 또는 AMD-V/SVM 설정은 제조사 안내를 따르세요. 오류가 계속되면 Microsoft 문제 해결 문서에서 오류 코드를 확인하세요.
gcc: command not found가 나와요
Ubuntu 터미널인지 먼저 확인하고 sudo apt update와 sudo apt install build-essential을 실행하세요. 설치가 성공했는지 확인한 뒤 command -v gcc로 경로를 조회합니다.
hello.c: No such file or directory가 나와요
pwd와 ls -al로 위치와 파일명을 확인하세요. cd ~/projects/network-practice로 이동하고, 파일이 hello.c.txt나 Hello.c로 저장되지 않았는지 확인합니다.
./hello 실행이 안 되거나 Permission denied가 나와요
먼저 GCC 컴파일이 오류 없이 끝났는지 확인합니다. 이 가이드처럼 Ubuntu 홈 폴더에서 다시 빌드하세요. 스크립트는 실행 권한이 필요할 수 있지만, 직접 GCC로 만든 실행 파일은 보통 권한이 자동 부여됩니다. 컴파일할 때 sudo를 붙일 필요는 없습니다.
code: command not found가 나와요
Windows에 VS Code가 설치되어 있고 설치 옵션의 PATH 추가가 적용됐는지 확인한 뒤 Ubuntu 터미널을 다시 여세요. Windows VS Code에서 F1 → WSL: Connect to WSL로 연결하는 방법도 있습니다.
WSL을 업데이트하거나 다시 시작하고 싶어요
작업을 저장한 뒤 아래 명령을 PowerShell에서 실행하세요. shutdown은 모든 WSL 배포판과 실행 중인 프로세스를 종료합니다.
wsl --update
wsl --shutdown
wsl -d Ubuntu-22.04STEP 11환경 설정 완료 체크
직접 확인한 항목에 체크하세요. 체크 상태는 현재 페이지를 열어 둔 동안 유지됩니다.
cd ~/projects/network-practice로 이동해 소스를 편집하고 GCC로 빌드하세요.