주희아빠의 헝그리 라이딩

Termux - 안드로이드 스마트폰 & 태블릿에 리눅스 설치하기 본문

나름 IT 이야기

Termux - 안드로이드 스마트폰 & 태블릿에 리눅스 설치하기

도림천 버섯돌이 2023. 12. 10. 19:47

2023.12.10

1. 개요

termux는 안드로이드 스마트폰이나 태블릿에서 리눅스를 실행할 수 있게 해주는 에뮬레이터입니다.

proot-distro 는 컨테이너 기반의 환경 관리자입니다. termux 에뮬레이터 안에 별도로 ubuntu 환경을 구성할 수 있게 해주는 툴입니다. 

 

본 글을 다음 글을 참고로 하고 있습니다.  '흡혈귀왕' 님께 다시 한번 감사드립니다.
https://meeco.kr/Review/37391093

 

Termux  리눅스 강좌 1부 : 리눅스 컨테이너 설치 및 GUI 구동하기 - 미코

6월 중순부터 Termux에 리눅스를 설치 후 한달하고 반 정도 지났습니다. 리눅스에서 이것저것 테스트하고 최적의 환경을 구축하는데 여러 시행착오를 거친 끝에 드디어 미코 회원님들이 사용하실

meeco.kr

 
위 블로그에서 몇개의 글로 나누어서 잘 설명되고 있습니다.

특히나 최근 OS 의 경우 프로세스 제한에 걸려서 강제로 종료가 되는데 이 부분에 대해 해결을 해야 하고 그냥 경험이 아닌 실무에 사용하기 위해서는 그래픽 가속 기능까지 활성화를 시켜야 합니다.

또한 외부 apk 설치나 리눅스에 익숙하지 않은 초보자분들에게는 더욱 복잡할 수 있습니다.

제 블로그에서는 최대한 간결하게 진행하며 리눅스의 최소 기능으로 사용이 가능하도록 정리했습니다. 또한 설치시에는 한글이 아닌 영문으로 진행하며 나중에 한글폰트와 입력기를 추가하는 방식으로 설치 하였습니다.

이번 글에서 등장하는 설치 대상은 '삼성 갤럭시 노트 FE' 입니다. 그외에 '갤럭시 노트 20울트라' 기종과 중국산 태블릿 '레노버 P11' 에 설치하여 이것저것 시험해 보고 있습니다.

 

2. Termux 설치하기

termux는 안드로이드 스마트폰이나 태블릿에서 리눅스를 실행할 수 있게 해주는 에뮬레이터입니다. (지금은) 구글 플레이 스토어에서 검색이 안됩니다.

F-Droid 라는 유틸을 통하거나 github 의 저장소에서 다운 받을 수 있습니다. 

https://github.com/termux/termux-app/releases

설치하려면 위험하다는 메세지가 나옵니다. 진행에 동의하시는 분은 '무시' 하고 진행하십시오.

설치가 완료된후 아이콘을 눌러 실행하면 다음처럼 보입니다. 

자체적으로 소프트 키보드가 나오긴 하지만 외부 키보드와 마우스를 연결하는 것이 작업하기에 좋습니다.



이제부터 본격적으로 설치를 시작해 봅니다. 참고로 $ 로 시작하지만 root 퍼미션으로 동작하고 있습니다.

-- 기본 패키지의 업데이트를 해줍니다. 
$ pkg update && pkg upgrade -y

-- 로컬 스토리지에 접근이 가능하도록 허가를 해줍니다.
$ termux-setup-storage

proot-distro 는 컨테이너 기반의 환경 관리자입니다. termux 에뮬레이터 안에 별도로 ubuntu 환경을 구성할 수 있게 해주는 툴입니다. 

Pulseaudio 는 리눅스 오디오 서버입니다. Termux 에서 서버를 띄워주고 Ubuntu 내부에서 연결해 사용하는 구조입니다.

-- 일단 ubuntu 추가 설치를 위한 패키지를 준비해 줍니다.
$ pkg install proot-distro pulseaudio vim

-- termux 가 기동될 때 pulseaudio 서버를 띄워줍니다. 아래 내용을 작성후 저장해 줍니다.
$ vi ~/.profile
pulseaudio --start --load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1" --exit-idle-time=-1
pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1


-- 최근 버전의 ubuntu 를 설치해 줍니다. 현재시점 23.10 Mantic 버전이 설치됩니다.
$ proot-distro install ubuntu

-- ubuntu 에 root 로 접속합니다.
$ proot-distro login ubuntu --user root --shared-tmp

 

ubuntu 에서 화면 관리자로 gnome 이 아닌 xfce4 라는 것을 사용합니다. 이것이 가볍다는 이유도 있지만 termux 에서 gnome 은 설치가 안되는 문제가 있습니다.

-- 여기서부터는 ubuntu 환경에서 동작하는 것입니다. 역시 업데이트 부터 시작합니다.
# apt update && apt upgrade -y
# apt install -y sudo vim

-- 본격적인 GUI 인터페이스를 설치합니다. 시간이 상당히 걸립니다. 중간에 timezone 을 묻는 질문이 나오므로 가끔은 화면을 쳐다봐 주십시오.
# apt install -y xfce4

-- 일반 유저 등록을 위한 과정을 진행합니다.
# passwd
# groupadd storage
# groupadd wheel
# useradd -m -g users -G wheel,audio,video,storage -s /bin/bash multitab
# passwd multitab

# vi /etc/sudoers
%sudo 아래쪽에 생성한 계정과 정보를 넣어줍니다. :w! 로 강제 저장을 해주어야 합니다.
multitab        ALL=(ALL:ALL) ALL

-- 일반 유저로 변신~
# su - multitab

$ vi startx.sh
export DISPLAY=:0
# XFCE4-SESSION
dbus-launch --exit-with-session startxfce4 &

-- 파일을 저장하고 나와서 실행 퍼미션을 더해줍니다. 이후 exit 두번으로 ubuntu 에서 나와 termux 로 복귀합니다.
$ chmod +x startx.sh
$ exit
# exit

작업중간에 정보를 확인해 봅니다. aarch64 아키텍처에 ubuntu 23.10 이라는 것을 알 수 있습니다.


이번에는 GUI 실행을 위한 X-Server 관련 앱을 설치해야 합니다.

다음 사이트에서 'app-arm64-v8a-debug.apk' 를 다운로드하여 설치합니다. 혹시라도 Assets 부분이 안 보인다면 github.com 에 로그인을 해야 보일 수도 있습니다.

https://github.com/termux/termux-x11/releases

설치 이후 스마트폰에 'Termux:X11' 아이콘을 눌러 실행합니다.

다음처럼 다소 썰렁한 화면이 나오면 정상입니다. 띄워놓은 상태로 다시 Termux 앱으로 돌아갑니다.


아까 멈추었던 Termux 화면에서 계속 이어서 작업을 합니다.

$ pkg install x11-repo
$ pkg install termux-x11-nightly

$ vi ~/.termux/termux.properties
allow-external-apps = true의 앞에 있는 주석처리를 제거 후 저장해줍니다.

$ vi ~/x.sh
termux-x11 :0 &
proot-distro login ubuntu --user multitab --shared-tmp

$ chmod +x x.sh

 

이제 리눅스 GUI 구동을 위한 준비가 모두 끝났습니다.

시작전 저는 스마트폰의 해상도를 좀 작게 줄였습니다. 너무 높은 해상도로 놓으면 글씨가 작아서 안보이기 때문입니다.

-- termux 에서 다음 명령을 수행해 줍니다.
$ ./x.sh

-- 접속된 ubuntu 에서 실행해 줍니다.
$ ./startx.sh

 

스마트폰을 가로로 돌려주면 다음과 같은 화면을 볼 수 있습니다.

터미널창을 띄우고 정보를 확인해 봅니다. 



이제 브라우저 정도만 설치해 주면 기본적인 리눅스 환경 구성은 완료됩니다.

-- PPA를 추가해서 Firefox-esr을 별도 설치해줘야합니다.
$ sudo apt install software-properties-common
$ sudo add-apt-repository ppa:mozillateam/ppa
$ sudo apt update
$ sudo apt install firefox-esr
$ sudo apt install fonts-noto-cjk
-- 최소 이것만 설치해도 한글이 나오기는 함. 브라우저 상단 타이틀바는 깨짐.

-- 한글 표시를 위한 폰트와 입력기를 설치해줍니다.
$ sudo apt install locales language-pack-ko
$ sudo apt install fonts-nanum* fonts-roboto

$ sudo apt install fcitx fcitx-hangul 

-- 최근에는 이것대신 ubuntu 기본 한글 입력기인 ibus-hangul 을 설치해도 괜찮습니다.
$ sudo apt install ibus-hangul

설치 중간에 다음처럼 keyboard layout 을 선택하라는 메세지가 나오는데 그냥 English (US)를 선택해 줍니다.

이제 브라우저 아이콘을 실행하면 Firefox 가 실행됩니다.

한글이 들어간 페이지 역시 잘 나옵니다. 유튜브 등을 접속해 보면 사운드도 잘 나오는 것을 알 수 있습니다.

 

3. 안드로이드 12 버전 이후에서의 프로세스 강제 종료 해제하기

환경: 이 부분은 '갤럭시 노트20 울트라' 에서 진행하였습니다. 운영체제 안드로이드 버전 13.

'노트 FE' 와 '레노버 P11' 은 별도의 조치가 없어도 사용하는데 문제가 없었습니다.  그런데 '갤럭시 노트20울트라' 의 경우 처음 기동후 얼마 지나지 않아서 바로 다운되는 현상이 발생했습니다. 찾아보니 안드로이드 12버전 이후에서는 프로세스가 너무 많이 뜨면 강제로 죽이는 기능이 있다고 합니다.(phantom process killer)

PC 에 adb 라는 프로그램을 설치하고 유선으로 연결해 작업하거나 PC 없이 무선 디버깅 기능을 이용해 수정할 수 있다고 합니다. 

먼저 개발자 옵션이 없다면 '설정- 휴대전화 정보 - 소프트웨어 정보 - 빌드 정보' 를 5~7번 쯤 연타해 줍니다.  그러면 다음처럼 개발자 옵션이 나옵니다.

 

접속해 있는 wifi 망에서 접속을 허가하겠냐는 질문이 나오는데 '허용' 으로 해줍니다.

다음처럼 나오면 준비가 된 것인데 갤럭시에서는 멀티 윈도우 기능을 활용해 두 창을 모두 활성화켜주는 것이 중요합니다. 무선 디버깅시에 화면이 계속 열려 있어야 합니다. 해당 화면이 닫히거나 전환이 되면 연결이 무효가 되더버리더군요.

멀티 윈도우는 화면 하단의 '메뉴' 버튼을 길게 누른후 상단의 제목을 클릭해서 '분할화면' 또는 '팝업화면' 으로 열어주도록 합니다.

Termux 에서 다음 커멘드를 입력해 git 에서 소스를 다운 받습니다.

-- Termux 에서 입력. git 설치
$ apt install git

-- git 에서 해당 소스를 다운 받습니다.
$ git clone https://github.com/SaicharanKandukuri/termux-android12-phantom-fix
$ cd termux-android12-phantom-fix

$ bash runme.sh

runme.sh 를 실행하고 다음 그림에 표시된 순서대로 입력을 하면 됩니다.

다음처럼 success 내용이 나오고 '현재 연결된 기기' 에 정보가 표시되면 성공한 것입니다. 

무선 디버깅 옵션을 다시 눌러서 해제 후 정상적으로 구동하는 것을 확인해 봅니다.

 

Tip1. 화면 옵션 조정

다음처럼 x11 그래픽 화면에도 키보드가 나와서 화면을 가리는 경우가 있습니다. 마우스를 주로 사용하기 떄문에 아래 화면에서는 방해만 됩니다.

x11 앱을 실행후 Preferences 메뉴를 선택해줍니다. 이미 실행중이라면 스마트폰의 x11 아이콘을 길게 누르고 있으면 선택 메뉴가 나옵니다.

옵션중에서 'Show additional keyboard' 항목을 꺼줍니다.
'Intercept system shortcuts' 는 특수키 입력에 대한 반응인데 삼성기종에서만 표시가 됩니다.

리눅스 앱이 최대화 됐을때 제목 라인까지 사용하도록 해줍니다.

 

Tip 2. Ubuntu 22.04 LTS, 24.04 LTS 설치하기

proot-distro의 경우 설치하는 시점 기준으로 OS의 최신 이미지를 가져다 설치를 합니다. 시험적으로 사용할 때는 큰 문제는 없지만 어느 정도 장기간 사용을 목표로 하고 있다면 특정 버전을 골라서 설치하는 경우가 많습니다.

23.10 버전이 아닌 22.04 나 24.04 LTS 버전을 설치하려면 다음의 과정을 거쳐줍니다.

2024.1.31 수정. ubuntu 22.04 LTS 버전이 없다고 징징 거렸더니 제작자분이 다시 넣어 줬습니다.

2024.5.6 수정. ubuntu 24.04 LTS 버전이 새로 나왔습니다. 아직까지 proot-distro 에서 바로 다운은 안되는 듯 합니다. 다음에 스크립트를 구성해 놨습니다. 이것으로 설치하시면 됩니다.

*** 24.04 에서 일부 명령어들이 setpriv 관련 permission 에러가 나며  온전하게 동작하지는 않고 확인중에 있습니다.

https://github.com/multitab2022/termux_proot-distro/tree/main/distro-plugins

-- Termux 에서 진행합니다.
$ cd ~
$ pkg install wget 
$ wget https://raw.githubusercontent.com/multitab2022/termux_proot-distro/main/distro-plugins/ubuntu2404.sh
$ cp ubuntu2404.sh $PREFIX/etc/proot-distro/

-- 수정된 이미지 리스트 확인
$ proot-distro list

-- 이후 설치를 진행합니다.
$ proot-distro install ubuntu2404

-- 참고. 설치된 이미지를 지울 때
$ proot-distro remove ubuntu2404

 

이 아래 부분은  이제 필요 없긴한데 혹시라도 20.04 LTS 나 저장소에 없는 기타  버전을 설치할 경우 참고하시라고 지우지 않고 남겨둡니다.

2024.1.26 수정. termux git repo 에서 Old 저장소 호출에 대한 부분이 삭제되었습니다. 사이트 운영자분이 정책상 하나의 버전만 강제하게 한답니다. 아쉬운대로 22.04 버전의 root file system 를 직접 구성해 주면 됩니다.

$ cat ubuntu2204.sh 
DISTRO_NAME="Ubuntu (jammy)"

TARBALL_STRIP_OPT=0
TARBALL_URL['aarch64']="https://cdimage.ubuntu.com/ubuntu-base/releases/jammy/release/ubuntu-base-22.04.3-base-arm64.tar.gz"
TARBALL_SHA256['aarch64']="bdae94b05d0fca7decbe164010af2ac1b772a9dda21ed9fb5552b5674ad634a3"

TARBALL_URL 은 ubuntu 사이트의 22.04 버전의 커맨드 버전 rootfs 입니다. 설치 패키지의 최적화가 살짝 다를 수는 있겠으나 제가 땡겨서 설치해 본 결과 별 문제는 없어 보입니다.

TARBALL_STRIP_OPT 옵션의 경우 디폴트는 1인데 우분투 사이트에서 다운받는 경우 가장 상위 경로에 별도의 묶음이 없이 바로 usr, etc 등으로 풀리기 때문에 0 으로 넣어 주니 동작을 합니다.

다른 버전의 LTS 를 받으시려면 간단히 아래 사이트에서 다운 받으셔도 됩니다.

https://raw.githubusercontent.com/multitab2022/termux_proot-distro/main/distro-plugins/ubuntu2404.sh

https://raw.githubusercontent.com/multitab2022/termux_proot-distro/main/distro-plugins/ubuntu2204.sh

https://raw.githubusercontent.com/multitab2022/termux_proot-distro/main/distro-plugins/ubuntu2004.sh

 

3. 마무리

욕심 내서 docker 까지 한번 돌려봤는데 동작은 안되네요.

Systemd 프로세스가 뜨지 않기 때문에 systemctl 명령은 동작을 안하고 대신 serivce 명령으로 서비스를 기동할 수는 있습니다. 

지난 ubuntu 22.04 에서는 sshd 도 잘 떴는데 이번에 새로 설치된 23.10 에서는 sshd 가 실패하네요. 

집에 남는 폰들 놀리지 마시고 재미난 장난감으로 활용해 보십시오.

 

ps. 오래된 7인치 태블릿인 K88(일명 트레기, Android 7.1.1)에 설치하려고 하니 ubuntu 23.04 설치중 다음처럼 에러가 나며 중단되네요. openssl 명령을 날려도 같은 에러가 나는데 현재로서는 원인불명이군요. 

혹시나 해서 ubuntu 22.04 로 시도해 봐도 마찬가지군요. termux 자체에서는 openssl 은 문제가 없고 proot-distro 안에서만 생기는 문제 같습니다. 안드로이드 버전이 너무 낮아서 그런건지는 확실하지 않습니다.

좀 더 오래된 ubuntu 20.04 버전을 설치해 보니 ssl-cert 는 설치가 되는데 기타 다른 이슈로 최종 설치는 실패하였습니다.

--openssl/mantic-updates,mantic-security,now 3.0.10-1ubuntu2.1 arm64 [installed,automatic]

root@localhost:~# apt install ssl-cert
...
Setting up ssl-cert (1.1.2ubuntu1) ...
debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 78.)
debconf: falling back to frontend: Readline
Could not create certificate. Openssl output was:
Warning: generating random key material may take a long time
if the system has a poor entropy source
req: Error generating RSA key
2010D7987F000000:error:1C8000BD:Provider routines:ossl_prov_drbg_instantiate:error retrieving entropy:../providers/implementations/rands/drbg.c:456:
2010D7987F000000:error:1200006C:random number generator:rand_new_drbg:error instantiating drbg:../crypto/rand/rand_lib.c:607:
2010D7987F000000:error:1C8000BD:Provider routines:ossl_prov_drbg_instantiate:error retrieving entropy:../providers/implementations/rands/drbg.c:456:
2010D7987F000000:error:1200006C:random number generator:rand_new_drbg:error instantiating drbg:../crypto/rand/rand_lib.c:607:
dpkg: error processing package ssl-cert (--configure):
 installed ssl-cert package post-installation script subprocess returned error exit status 1
...


root@localhost:~# openssl rand -hex 10
20E0E17F7F000000:error:1C8000BD:Provider routines:ossl_prov_drbg_instantiate:error retrieving entropy:../providers/implementations/rands/drbg.c:456:
20E0E17F7F000000:error:1200006C:random number generator:rand_new_drbg:error instantiating drbg:../crypto/rand/rand_lib.c:601:

root@localhost:~# cat /proc/sys/kernel/random/entropy_avail
1320

root@localhost:~# ll /dev/urandom
crw-rw-rw- 1 root root 1, 9 Feb 27  1970 /dev/urandom
반응형