이제 QEMU를 설치하고 OS를 띄워보자.
여기선 Alpine을 설치할 거다.
QEMU 관련 패키지 설치
pkg install -y qemu-utils qemu-common qemu-system-x86_64-headless
termux-QEMU VM image 생성
qemu-img create -f qcow2 alpine.img 20g
디스크 이미지를 qcow2 방식으로 구축하고 용량은 20GB로 설정한다.
용량은 휴대폰이 감당할 수 있는 범위 내 자유롭게 설정하면 된다.
Alpine 가상머신 파일 가져오기
wget https://dl-cdn.alpinelinux.org/alpine/v3.15/releases/x86_64/alpine-virt-3.15.3-x86_64.iso
2024년 12월 기준 3.20.3 버전이 있을텐데,
최신 버전으로 진행해도 상관없다.
단, 이 글에 나오는 alpine 버전은 3.15.3이다.
때문에, 다른 버전을 쓴다면
명령어를 그대로 복사한 뒤, 버전만 변경하면 된다.
가상머신 구동하기
qemu-system-x86_64 -machine q35 -m 2048 -smp cpus=4 -cpu qemu64 \
-drive if=pflash,format=raw,read-only=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
-netdev user,id=n1,hostfwd=tcp::2222-:22 \
-device virtio-net,netdev=n1 \
-cdrom alpine-virt-3.15.3-x86_64.iso \
-nographic alpine.img
cdrom에 가상머신 파일을 넣어 해당 이미지로 구동한다.
여기서 ssh는 2222번으로 접속할 수 있게 설정해놓았다.
필요 시, 3022번이나 3122 등 다른 포트로 연결해도 된다.
cpus는 코어 갯수다.
휴대폰 코어 갯수는 Termux에서 echo $(nproc)로 사용가능한 코어 수를 확인한 다음 맞춰 세팅하면 된다.
memory도 감당 가능한 범위 내에서 설정한다. (권장은 2GB)
구동하는데 시간이 꽤 걸린다.
커피 한 잔 타고 와도 되고
샤워 빨리 하는 사람은 샤워하고 와도 된다.
구축이 끝나면 로그인하라고 하는데
root 로 로그인하면 된다.
setup-alpine
위 명령어로 몇 가지 설정을 해야 한다.
keyboard layout 설정
localhost:~# setup-alpine
Available keyboard layouts:
af be cn fi hu it lk mm pl sy uz
al bg cz fo id jp lt mt pt th vn
am br de fr ie ke lv my ro tj
ara brai dk gb il kg ma ng rs tm
at by dz ge in kr md nl ru tr
az ca ee gh iq kz me no se tw
ba ch epo gr ir la mk ph si ua
bd cm es hr is latam ml pk sk us
Select keyboard layout: [none] us
Available variants: us-alt-intl us-altgr-intl us-chr us-colemak us-colemak_dh us-colemak_dh_iso us-dvorak-alt-intl us-dvorak-classic us-dvorak-intl us-dvorak-l us-dvorak-mac us-dvorak-r us-dvorak us-dvp us-euro us-haw us-hbs us-intl us-mac us-norman us-olpc2 us-rus us-symbolic us-workman-intl us-workman us
Select variant (or 'abort'): us
keyboard layout고 variant는 모두 us로 설정한다.
이후 몇 가지 설정을 물어볼텐데 모두 엔터하면 된다.
Enter system hostname (fully qualified form, e.g. 'foo.example.org') [localhost]
Available interfaces are: eth0.
Enter '?' for help on bridges, bonding and vlans.
Which one do you want to initialize? (or '?' or 'done') [eth0]
Ip address for eth0? (or 'dhcp', 'none', '?') [dhcp]
Do you want to do any manual network configuration? (y/n) [n]
비밀번호 설정하기
udhcpc: started, v1.34.1
udhcpc: broadcasting discover
udhcpc: broadcasting select for 10.0.2.15, server 10.0.2.2
udhcpc: lease of 10.0.2.15 obtained from 10.0.2.2, lease time 86400
Changing password for root
New password:
root 계정의 비밀번호를 설정하라고 한다.
알아서 설정하자.
Timezone 설정하기
Which timezone are you in? ('?' for list) [UTC] ?
Africa/ Chile/ GB-Eire Israel Navajo US/
America/ Cuba GMT Jamaica PRC UTC
Antarctica/ EET GMT+0 Japan PST8PDT Universal
Arctic/ EST GMT-0 Kwajalein Pacific/ W-SU
Asia/ EST5EDT GMT0 Libya Poland WET
Atlantic/ Egypt Greenwich MET Portugal Zulu
Australia/ Eire HST MST ROC posixrules
Brazil/ Etc/ Hongkong MST7MDT ROK right/
CET Europe/ Iceland Mexico/ Singapore
CST6CDT Factory Indian/ NZ Turkey
Canada/ GB Iran NZ-CHAT UCT
Which timezone are you in? ('?' for list) [UTC]
이제 timezone 설정할 차례다.
눈 씻고 찾아봐도 한국은 안보인다 한국은 Asia/에 있다.
What sub-timezone of 'Asia' are you in? ('?' for list) ?
ls: Asia/: No such file or directory
Aden Chongqing Jerusalem Novokuznetsk Tashkent
Almaty Chungking Kabul Novosibirsk Tbilisi
Amman Colombo Kamchatka Omsk Tehran
Anadyr Dacca Karachi Oral Tel_Aviv
Aqtau Damascus Kashgar Phnom_Penh Thimbu
Aqtobe Dhaka Kathmandu Pontianak Thimphu
Ashgabat Dili Katmandu Pyongyang Tokyo
Ashkhabad Dubai Khandyga Qatar Tomsk
Atyrau Dushanbe Kolkata Qostanay Ujung_Pandang
Baghdad Famagusta Krasnoyarsk Qyzylorda Ulaanbaatar
Bahrain Gaza Kuala_Lumpur Rangoon Ulan_Bator
Baku Harbin Kuching Riyadh Urumqi
Bangkok Hebron Kuwait Saigon Ust-Nera
Barnaul Ho_Chi_Minh Macao Sakhalin Vientiane
Beirut Hong_Kong Macau Samarkand Vladivostok
Bishkek Hovd Magadan Seoul Yakutsk
Brunei Irkutsk Makassar Shanghai Yangon
Calcutta Istanbul Manila Singapore Yekaterinburg
Chita Jakarta Muscat Srednekolymsk Yerevan
Choibalsan Jayapura Nicosia Taipei
What sub-timezone of 'Asia' are you in? ('?' for list)
아래에 보면 Seoul이 보인다. Seoul 입력
이후 URL 및 도메인 관련 설정과 ssh 설정을 모두 Enter하면 된다.
disk 설정하기
Enter mirror number (1-90) or URL to add (or r/f/e/done) [1]
Added mirror dl-cdn.alpinelinux.org
Updating repository indexes... done.
Which SSH server? ('openssh', 'dropbear' or 'none') [openssh]
* service sshd added to runlevel default
* Caching service dependencies ...
[ ok ]
ssh-keygen: generating new host keys: RSA DSA ECDSA ED25519
* Starting sshd ...
[ ok ]
Available disks are:
sda (21.5 GB ATA QEMU HARDDISK )
Which disk(s) would you like to use? (or '?' for help or 'none') [none] sda
The following disk is selected:
sda (21.5 GB ATA QEMU HARDDISK )
How would you like to use it? ('sys', 'data', 'crypt', 'lvm' or '?' for help) [?] sys
WARNING: The following disk(s) will be erased:
sda (21.5 GB ATA QEMU HARDDISK )
WARNING: Erase the above disk(s) and continue? (y/n) [n] y
순서대로
- sda를 입력한다 (어떤 디스크를 쓸 건가요?)
- sys를 입력한다 (해당 디스크는 어떤 용도로 쓸 건가요?)
- y를 입력한다. (데이터 모두 지울 건가요?)
여기까지 하면 설정이 모두 끝나기 때문에 Reboot 하라고 뜬다.
poweroff
위 명령어를 입력해 빠져나온다.
가상머신 파일로 사전설정이 모두 끝났으니 더 이상 cdrom은 필요없다.
이제 cdrom 없이 가상머신을 부팅한다.
qemu-system-x86_64 -machine q35 -m 2048 -smp cpus=4 -cpu qemu64 \
-drive if=pflash,format=raw,read-only=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
-netdev user,id=n1,hostfwd=tcp::2222-:22 \
-device virtio-net,netdev=n1 \
-nographic alpine.img
꽤 기다리면 로그인하라고 나온다.
로그인하여 접속되면 제대로 설치된 거다.
QEMU 외부 접속 허용하기
이제 QEMU에서 외부 접속을 허용해야 한다.
아래 경로로 들어가 파일 내용을 좀 수정해야 한다.
vi /etc/ssh/sshd_config
순서대로
PasswordAuthentication yes로 설정
PermitRootlogin yes로 설정
# sshd_config
# 여기서 뒷 부분을 모두 지우고 yes로 변경
PermitRootLogin prohibit-password
KbdInteractiveAuthentication yes로 설정 후, 주석 해제하기
iptables 2222번 포트 열기
iptables이 없으니 설치한다.
apk add iptables
가상머신에서 2222번 포트를 열어줬으니 iptables에서도 열어야 한다.
어디서 열었냐고?
qemu-system-x86_64 -machine q35 -m 2048 -smp cpus=4 -cpu qemu64 \
-drive if=pflash,format=raw,read-only=on,file=$PREFIX/share/qemu/edk2-x86_64-code.fd \
-netdev user,id=n1,hostfwd=tcp::2222-:22 \ # <<<< 바로 이 부분이다.
-device virtio-net,netdev=n1 \
-nographic alpine.img
아래 명령어를 입력해 iptables를 열어주면 된다.
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
현재 접속된 cmd 창을 끄지 말고 새로 열어 다시 ssh로 접근 시도하면 접속될 것이다.
ssh root@your_password -p 2222
만약 Permission deny가 뜨면서 뭔가 엄청난 문구가 뜬다면?
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the ED25519 key sent by the remote host is
SHA256:s+ydvnJEGOi4IKvX25EaLhlk3OOk2co6z6zqz+3yUDw.
Please contact your system administrator.
Add correct host key in C:\\Users\\pen40/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in C:\\Users\\pen40/.ssh/known_hosts:7
Host key for [172.30.1.38]:2222 has changed and you have requested strict checking.
Host key verification failed.
윈도우 기준 ssh 접속 내역을 확인할 수 있다.
C:\users\username\.ssh
여기서 이전에 설정해놓은 게 있다면 그 파일들을 모두 지워야 한다.
만약 Time out이 뜬다면?
가상머신이 꺼진 거다.
Termux에서 가상머신을 접속한 커널은 계속 켜놔야 한다.
그래서 QEMU 가상머신 실행은 휴대폰에서 하고 로그인 후,
그대로 냅두는 것을 권장한다.
'개인서버만들기' 카테고리의 다른 글
Termux 기본 설정 (0) | 2024.12.22 |
---|---|
Termux에 대해 (0) | 2024.12.22 |