[대표사진] 생선 뼈

1. 개요

Alpine Linux는 필수 요소만 남겨놓고 뼈대만 남은 초경량 리눅스로, 메모리와 저장공간을 최소로 사용하도록 설계되어 있어 빠른 부팅과 자유도 높은 커스터마이징을 제공한다.
우분투, 데비안, 칼리처럼 기본 툴도 없는 상태지만 필요한 요소들을 직접 붙여나가는 과정에서 리눅스 환경에 대한 깊은 이해를 할 수 있다고 생각하며 진행하게 되었다.(말은 이래도 생선뼈만 남은 거나 다름없다)

2. 설치 환경 상세 (25년 4월 기준)

사용 가상머신 리눅스 버전
Vmware Workstation Pro 17 alpine-extended-3.18.0-X86_64

Vmware workstation Pro가 깔려져 있단 전제 하에 진행하려고 한다. 혹시라도 깔려져 있지 않다면 미리 설치해두고 다시 보는 걸 추천한다. 여기엔 링크만 남겨둔다.

2-1. Vmware workstation 다운로드 (가입 필수)

 

Fusion and Workstation | VMware

VMware Workstation and VMware Fusion desktop hypervisors are the industry leaders in local virtualization. Learn how VMware’s local virtualization solutions provide an easier way to build, test and deliver any app for any device or cloud.

www.vmware.com

 

2-2. Alpine Linux 이미지 다운로드

25년 4월 기준으로 최신 ISO(v3.21)에서는 미러 연결과 DNS 문제가 반복되는 바람에 v3.18 ISO로 다운그레이드하여  재설치한다. 설치하는 방법은 현재 3번 방법 그대로 해도 된다.
이 글에서 설치하는 버전은 alpine-extended-3.18.0-x86 64.iso 이다.
이 버전을 고른 기준은 다음의 세가지였다. 

1. 날짜도 적당히 최신 (2023-11-30)
2. 안정 버전이라 미러 오류도 적고, 설치 중 DNS도 잘 먹음
3. extended 버전은 설치 시 필요한 패키지들이 많이 포함되어 있음 → grub, dosfstools, syslinux 같은 거 잘 설치됨

** 혹시 몰라 디렉터리가 나와서 놀랄 분들을 위해 **
Alpine Linux 구버전(v3.18)의 공식 ISO 파일은 아래 링크에서 받을 수 있다. 공식 CDN에서 제공하는 경로이며, 실습 시 가볍고 빠르게 설치할 수 있는 버전이라 링크를 남겨두었다.

 

Index of /alpine/v3.18/releases/x86_64/

 

dl-cdn.alpinelinux.org

[사진 0] alpine 구버전 다운로드

3. alpine 리눅스 설치 방법

3-1. 워크스테이션에서  새 가상머신을 추가한다.

Typical 클릭 > I will install the operating system later 클릭 > Next

[사진 1,2,3] 워크스테이션 가상머신 추가 1단계


Linux 선택 > Other Linux 6.x kernel 64-bit 선택 > 가상 머신 이름 및 저장 경로 지정 > 디스크 사이즈 설정

[사진 4,5,6] 워크스테이션 가상머신 추가 2단계


Customize Hardware.. > Memory 설정 (여기선 1GB로 해둠) > New CD/DVD 클릭 > Browse > 다운 받은 이미지 선택

[사진 7,8,9] 워크스테이션 가상머신 추가 3단계


이미지 파일을 워크스테이션에 올리는 것까지 완료되면 사진 11처럼 터미널이 뜨게 된다.

[사진 10,11] 워크스테이션에 알파인 리눅스 추가된 상태

4. alpine setup 

[짤]

생각보다 설정하는 절차가 길다. 인내심을 가지고 하면 된다.

  1. 관리자 로그인 후, setup-alpine 진입
  2. 키보드 레이아웃 설정
  3. 호스트 이름 및 네트워크 인터페이스 설정
  4. 패스워드 및 타임존 설정
  5. Proxy 설정
  6. 시간 동기화(=NTP 클라이언트) 설정
  7. APK 패키지 설치용 미러 서버 설정
  8. 사용자 계정 설정 및 ssh 서버 설정
  9. 설치할 디스크 포맷 및 마운트 (최신 버전은 오류 주의)

4-1. 관리자 로그인 후, setup-alpine 진입

3단계에서 리눅스를 워크스테이션에 올리는 것까지 완성했다면, 이번엔 상세설정을 할 차례이다. 일단 root로 로그인한 후 셋업창으로 진입해야 한다.

# root로 로그인
>> localhost login: root
# setup창 진입
>> You can setup the system with the command : setup-alpine

[사진 12] root로 로그인한 상태

4-2. 키보드 레이아웃 설정

우선 필자는 영어가 더 익숙하니까 us를 입력해주고 엔터했다. 만약 kr로 진행할 거라면 다음처럼 입력하면 된다.

>> Select Keyboard layout [none]: kr
Available varients: kr-kr104 kr
>> Select varient []: kr-kr104

[사진 13] 키보드 레이아웃 설정

4-3. 호스트 이름 및 네트워크 인터페이스 설정

호스트 이름을 뭘로 할까 했는데 개요에서 생선뼈를 얘기했으니 fishbone으로 하겠다. 

[사진 14] 호스트 이름 설정
[사진 15] 네트워크 인터페이스 설정

엔터치면 네트워크 인터페이스 설정단계로, 인터넷을 쓸 거냐, 아님 어떤 네트워크 장치를 쓸 거냐 물어보는 단계다.
VM에서의 기본 값은 eth0이니 엔터치고 넘어간다.

입력 상세설명
(그냥 엔터) eth0 사용 (인터넷 자동 연결)
none 네트워크 비활성화
done 이 설정은 건너뜀
? 옵션 도움말 보기

다음으로 ip address for eth0? 이라고 DHCP로 자동 설정할지 수동으로 IP를 넣을지 물어보는 거다. 그냥 엔터치면 된다

입력 상세설명
(그냥 엔터) DHCP 자동 설정 (보통 VM 환경에선 이걸로 충분하다)
none IP 설정 안 함 (인터넷 끊긴 환경 만들 때 사용하면 됨)
manual 수동 설정 모드 진입 (IP, netmask 등 직접 입력해야 된다) 

그 다음으로 Do you want to do any manual network configuration? (y/n)이 나오는데, 네트워크 설정은 다 끝냈는데 추가로 뭔가 수동으로 설정할 거 있는지 물어보는 거다. 이것도 그냥 엔터치자

입력 상세설명
(그냥 엔터 또는 n) 네트워크 자동 설정 완료 > 다음 단계로 진행
y 수동으로 IP, DNS 등 설정할 수 있다 (지금은 필요없음)

4-4. 패스워드 및 타임존 설정

비밀번호 설정 단계다. 이전에 리눅스를 다뤄봤다면 하던대로 비밀번호 설정하면 된다.

[사진 16] 비밀번호 설정

그 다음으로 타임존 설정인데 안타깝게도 서울은 안보이니 OS에서 설정해준대로 UTC를 사용하겠다. 다른 걸로 쓰고 싶다면 목록에 나와있는 것 중 하나 골라서 입력해주면 된다.

[사진 17] Timezone 설정

4-5. Proxy 설정

다음으론 인터넷 연결할 때 프록시 서버를 거쳐서 할 건지 물어보는 단계다. 난 그냥 엔터치겠다.
만약 내부망이나 보안망 환경이라서 프록시가 필수일 경우엔 주소를 입력해주면 된다.

[사진 18] 프록시 설정

입력 상세설명
(그냥 엔터) 프록시 없이 직접 인터넷 연결
http://127.0.0.1:8080 로컬 프록시 사용 (예: burp suite 같은 툴 연동할 경우)
none 명시적으로 "프록시 없음" 입력 (사실상 엔터랑 같음)

4-6.시간 동기화(=NTP 클라이언트) 설정

간단히 얘기하자면, 시계 맞추는 프로그램 뭐 쓸 거냐고 물어보는 거다. 필자는 정확도와 안정성이 무난한 chrony를 선택했다(그냥 엔터쳤다는 말)

[사진 19] NTP 클라이언트 설정

옵션 상세설명
chrony 안정적이고 정확함. 서버/클라이언트 겸용
openntpd 가볍고 간단한 버전, 그러나 정확도는 chrony보다 낮다
busybox 가장 가볍다. 초경량 환경에서 단순히 시간만 맞추는 용도
none 아예 안 씀 (시간 동기화는 수동으로 해야 함)

4-7. APK 패키지 설치용 미러 서버 설정

다음은 APK 패키지 설치용 미러 서버 설정으로, 어디 서버에서 패키지 받을 건지 결정하는 거다. 알파인 리눅스의 apt-get update 설정인 셈. 여기선 f 눌렀다 (다운받느라 시간이 좀 걸렸다. 커피 한 잔 마시면 된다)

[사진 20,21] 구버전 기준 미러 서버 설정

옵션 상세설명
f 가장 빠른 미러 자동 선택 (권장)
s 미러리스트 출력 (직접 선택 가능)
r 무작위 미러 사용 (불안정할 수 있음)
e /etc/apk/repositories 직접 수정
c community repository 추가 (추가 패키지 가능, 나중에 해도 됨)
skip APK 설정 안 함 (패키지 설치 안함. 거의 안 씀)
  • 필요한 경우 community repo는 echo 명령으로 다음의 명령어를 입력하면 된다.
echo "https://d1-cdn.alpinelinux.org/aplpine/edge/community" >> /etc/apk/repositories

4-8. 사용자 계정 설정 및 ssh 서버 설정

다음으로. 사용자 계정을 만들지 말지 묻고 있는데, 현재는 만들어봤자 sudo도 직접 설치하고 설정해야하는 번거로움이 있으므로 그냥 엔터치고 끝냈다. 이후에 필요할 경우 adduser 명령어로 만들면 된다.

[사진 21] 계정 및 ssh 서버 설정

Which ssh server?는 어떤 원격 서버를 쓸 지 물어보는 단계로 그냥 엔터치면 된다.

옵션 상세설명
openssh (기본) 안정적, 기능 풍부, 보편적 ssh 서버
dropbear 초경량 SSH 서버 (용량 아끼고 싶으면 사용)
none SSH 안 씀 (로컬 접속만 할 거면 가능하지만 불편)

Allow root SSH login?은 원격 접속을 허용할 건지 물어보는 단계로, 보안적으로 민감한 부분이니 만약 일반 사용자 계정을 만들었다면 이 부분은 막을 필요가 있다.

상황 상세설명
보안 신경 쓰는 실 서버 no (루트 계정은 원격접속을 차단)
지금처럼 실험용 VM, root 계정만 있음 yes (루트 로그인 막으면 접속 자체가 불가능)

Enter ssh key or url for root는 SSH로 root 접속할 거면 공개키 등록할 건지 물어보는 단계로, 비밀번호 말고 키 인증을 쓰고 싶으면 공개키를 입력하면 된다. 그러나 여기도 엔터를 누르고 넘어가겠다.

상황 상세설명
실험용, root 로그인 허용 시 (그냥 엔터)
공개키 인증으로만 접속하고 싶을 경우 키 붙여넣기
공개키 파일이 깃허브에 있을 경우  URL 입력 (예: https://github.com/yourName.keys)

 

4-9. 설치할 디스크 포맷 및 마운트 (최신 버전은 오류 주의)

대망의 마지막이다. 개인적으론 여기서 오류가 났지만 일단 적어보겠다. 일단 가장 먼저 설치할 디스크를 고르라고 물어보니 sda를 입력해주겠다. 만약 중요한 자료가 있는 곳일 경우 포맷될 수도 있으니 주의.

[사진 22,23] 설치 디스크 설정

다음으로, 어떤 방식으로 디스크를 포맷하고 마운트할지 물어보고 있다. 여기선 sys를 입력하면 된다. 

옵션 상세설명
sys 디스크에 완전 설치 (일반적, OS 부팅 가능)
data 라이브 OS + 데이터 저장 (usb 용도)
crypt 암호화된 디스크로 설치 (보안 테스트 용도)
lvm LVM 볼륨 매니저 사용 (복잡한 디스크 나눔)
? 도움말 보기

24번 사진처럼 뜨면 y를 누른 후 reboot 입력하여 재부팅하면 25번 사진처럼 설치 완료된 리눅스로 진입할 수 있다.

[사진 24,25] alpine 리눅스가 성공적으로 설치된 결과

 

5. 최신 버전 오류 원인 분석

4-9. 설치할 디스크 포맷 및 마운트 부분에서 sys 모드로 설치하려다 오류가 발생하였다. 원인은 설치하려는 부트로더(syslinux) 패키지를 찾지 못해서 실패했다고 한다. 따라서 원인해결을 위해 해본 것을 정리해보면 다음과 같다.

[사진 26,27] sys 모드 설치 실패 / 최신버전

5-1. /etc/apk/repositories 수정 시도

기본으로 잡혀있는 레포지토리가 죽었거나 오래된 경우로 인해, DNS 불가 / "No such file", 403 Forbidden 문제가 나타난 것이라고 생각하여 다음과 같이 수정하게 되었다. 하지만 이것만 문제는 아니었는지 다른 문제들도 복합적으로 나타났다.

vi /etc/apk/repositories
# vi에서 이 주소를 추가한 후 저장
>> https://d1-cdn.alpinelinux.org/alpine/edge/main

5-2. DNS loockup error 출력

네트워크 연결은 됐지만, 도메인 이름을 IP로 못 바꾸고 있는 상황이 되었다. 즉, 인터넷이 있는 것처럼 보여도 DNS 설정이 되지 않아 다운로드가 제대로 안되는 상황이었다.

[사진 28] dns lookup error 출력

5-3. DNS 수동 설정 후 다시 apk update 시도

vi /etc/resolv.conf
#Google DNS 추가 후 저장
nameserver 8.8.8.8
nameserver 1.1.1.1

apk update
apk add syslinux

이 과정으로 다시 진행해봤지만 그래도 오류는 사라지지 않았다. ping은 문제없이 보내지는 걸 확인한 후, 네트워크는 문제가 없는 상황이지만 DNS에서 문제가 계속 유지되고 있다는 걸 알게 되었다.

[사진 29] 정상적으로 보내지는 패킷, ping 명령어 사용

5-4. 공식 CDN으로 미러 서버 수동 고정 시도

해당 주소들은 공식 CDN으로, 안전한 미러 서버를 수동으로 고정해두고 다시 시도해봤지만 되지 않았다. 따라서 구버전(v3.18)으로 다시 설치하게 되었고 현재 글이 최신 버전으로 작성되지 않은 이유이다.

vi /etc/apk/repositories 
# 다음의 링크들을 입력한 후 저장
https://dl-cdn.alpinelinux.org/alpine/latest-stable/main
https://dl-cdn.alpinelinux.org/alpine/latest-stable/community

apk update
apk add syslinux

5-5. 종합적인 실패 원인

gpt에서 다음 문제사항에 대해 알아본 결과, 단순한 미러서버 문제가 아니라 레포지터리 설정 + DNS + 패키지 의존성 3종이 꼬여버렸다고 한다. 
즉, 최신 Alpine은 외부 네트워크에 의존성이 강하기 때문에 DNS 하나만 막혀도 설치 과정이 줄줄이 실패하는 원인이 된다는 것이다.

상세하게 풀면 다음과 같다.

  • resolv.conf 초기화 문제
    • setup-alpine 도중 최신 ISO는 /etc/resolv.conf를 자동으로 덮어쓴다
    • 따라서 DNS를 수동을 설정해놔도 사라지는 현상이 나타난다
  • 미러 서버 구조 변경
    • 최신 Alpine의 미러 서버에서 버전별 디렉터리 구조가 바뀌었거나 일부 미러가 죽었을 수도 있다.
    • 이 때문에 lastest-stable 라우팅이 꼬여버려서 apk update가 실패하게 되는 원인 중 하나라고 생각하게 되었다.
  • 부트로더 설치 시 패키지 외부 의존도 증가
    • 최신 Alpine은 grub, syslinux, dosfstools 등을 설치할 경우, 즉시 외부 미러서버에서 받아와야 한다.
    • 여기서 DNS 혹은 미러에 연결을 실패하면 설치 자체가 끊겨버려 오류를 출력하게 된다.
    • 구버전은 최신 버전과 달리 ISO 내부에 필수 패키지들이 포함되어 있어 인터넷이 없는 상황에서도 설치가 진행되었다. 

이와 달리 구버전(v3.18)은 설치 시 필요한 패키지를 내장하고 있기 때문에 네트워크에 문제가 생겨도 설치에 문제가 생기지 않아 sys 모드 설치에 성공했고, 재부팅까지 완료되었다.

+ Recent posts