
강의 Termux 리눅스 강좌 2부 : GPU 가속 설정하기
- 흡혈귀왕
- 조회 수 6039
- 2023.07.22. 19:05
https://meeco.kr/Review/37391093
Termux 리눅스 강좌 1부 : 리눅스 컨테이너 설치 및 GUI 구동하기
를 먼저 완료 후 보시는것을 추천드립니다
이번 2부에서 GPU 가속을 설정하는 방법을 설명하기 전에 해야하는 것이 있습니다.
1부에서 리눅스 설치 후 자꾸 강제 종료되는 증상을 겪으신 분들이 있을겁니다.
그 이유는 안드로이드12 이후 부터 추가된 phantom process killer 때문입니다.
GPU 가속전 이 부분을 먼저 해결해보겠습니다.
안드로이드 디바이스의 개발자 모드를 활성 후 '무선 디버깅' 토글을 ON 해주세요.
개발자 모드 -> 무선 디버깅 항목에서
'페어링 코드로 기기 페어링'을 선택해주세요.
$ apt install git -y
Termux를 실행 후 git 설치 명령어를 입력해주세요.
$ git clone 소스주소
git clone을 받기 위해 위의 명령어를 입력해주세요.
URL을 입력하면 명령어가 꼬여서 아래의 이미지를 참조하여
소스주소에 URL을 입력해주세요
https://github.com/SaicharanKandukuri/termux-android12-phantom-fix
$ cd termux-android12-phantom-fix
경로 진입을 위해 위의 명령어를 입력해주세요.
$ bash runme.sh
위의 명령어를 입력해주세요.
기기어 페어링
IP 주소 및 포트의 5자리를 입력 후 Enter를 눌러주세요.
기기어 페어링
IP 주소 및 포트의 Wi-Fi 페어링 코드를 입력 후 Enter를 눌러주세요.
마지막으로 IP 주소 및 포트 뒷 자리를 입력 후 Enter를 눌러주세요.
위와 같은 화면이 나오면 성공입니다.
이제 Termux가 강제로 죽어버리는 일은 없을겁니다!
오래 기다리셨습니다!
이제 GPU 가속 설정을 해보겠습니다!
$ pkg install virglrenderer-android mesa*
virglrenderer와 mesa 설치를 위해 위의 명령어를 입력해주세요.
$ virgl_test_server_android &
설치가 완료되면 virgl 서버 실행을 위해 위의 명령어를 입력해주세요.
$ XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &
$ proot-distro login ubuntu --user 유저id --shared-tmp --no-sysvipc
$ nano startx.sh
위 명령어를 차례로 입력해주세요.
export DISPLAY=:0 GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.3COMPAT MESA_GLES_VERSION_OVERRIDE=3.2
# XFCE4-SESSION
dbus-launch --exit-with-session startxfce4 &
기존에 XFCE4 세션 구동을 위해 만들었던 스크립트를 위와 같이 수정합니다.
export DISPLAY=:0 뒤에
GALLIUM_DRIVER=virpipe MESA_GL_VERSION_OVERRIDE=4.3COMPAT MESA_GLES_VERSION_OVERRIDE=3.2
를 추가시켜주고 Ctrl+X키로 저장해주시면 됩니다.
GALLIUM_DRIVER 이란?
GALLIUM 드라이버는 장치에 구애받지 않은 방식으로 그래픽 드라이버를 작성하기 위한 API입니다.
간단한 방식으로 그래픽 하드웨어의 핵심 서비스를 캡슐화하는 여러 개체를 제공합니다.
virpip를 통해 안드로이드 호스트 GPU의 가상화를 불러와서 리눅스에서 GPU 가속을 구현합니다.
MESA_GL_VERSION_OVERRIDE=4.3COMPAT MESA_GLES_VERSION_OVERRIDE=3.2 옵션은?
GLES를 virgl로 가상화할 경우 OpenGL2.1이 한계입니다.
프로그램 호환성을 위해 GL 오버레이를 GL4.0 버전 이상으로 설정하는 옵션입니다.
해당 옵션은 말그대로 호환을 위한 옵션이기에 완벽하지 않습니다.
$ ./startx.sh
위 명령어를 입력 후 Termux-x11을 실행해주세요.
어랍쇼?!
XFCE4가 이상합니다 ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ
상단바랑 하단 패널도 안보이고 정상적인 상태가 아닙니다 ㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ
심지어 프로그램 실행 시 타이틀바도 안보입니다 ㄷㄷㄷㄷㄷㄷㄷㄷ
제가 처음에 우분투로 리눅스 사용했을 때 이런 증상이 계속 나와서
포기하고 데비안으로 넘어갔었는데........
이 문제의 이유를 나중에 알게되었습니다..
바로 호환성 이슈 때문이었습니다.
XFCE4 버전이 4.16인데 해당 버전에선 virgl로 GPU 가속 시 위와 같은
문제가 발생하더군요.
문제의 원인만 알면 해결은 아주 쉽습니다!!
마우스 우클릭 후 로그아웃을 해주세요.
exit
Termux 터미널에서 exit를 입력 후 xfce4를 종료해주세요.
$ sudo add-apt-repository ppa:xubuntu-dev/staging
XFCE4 PPA 추가를 위해 위의 명령어를 입력해주세요.
PPA repo 추가를 위해 Enter를 눌러주세요.
$ sudo apt update
apt repo 업데이트를 위해 위의 명령어를 입력해주세요.
$ sudo apt dist-upgrade
xfce4 업그레이드를 위해 위의 명령어를 입력해주세요.
$ ./startx.sh
업그레이드가 끝나면 위 명령어를 입력 후 Termux-x11을 실행해주세요.
4.18로 업그레이드하니 xfce4가 정상적으로 실행되었습니다!
프로그램 -> xfce4 정보로 진입하면
GPU가 llvmpipe에서 virgl로 바뀐것을 볼수있습니다!
아쿠리아리움 WebGL 데모를 돌려보면
llvmpipe가 2~4FPS 나왔는데
virgl은 18~22FPS 나오고 있습니다.
무려 프레임이 5배 이상 올랐습니다.
하지만 의아할 겁니다.
"안드로이드 브라우저에선 120fps 이상도 나오던데 왜 20fps밖에 안나오지?"
그 이유는 virgl의 태생적인 한계 때문입니다.
https://docs.mesa3d.org/drivers/virgl.html
위 링크 내용처럼 virgl은 호스트 GPU를 가상화해서 게스트 OS에서 GPU 가속을 구현하는 방식입니다.
그 과정에서 오버헤드가 발생하고 심지어 안드로이드 호스트 GPU는 OpenGL ES인지라
OpenGL로 번역되면서 추가 손실이 발생하는 겁니다.
그럼에도 최소한의 2D/3D 가속을 리눅스에서 구현 가능하고 llvmpipe는 GUI 환경에서도
CPU를 통해 가속하는거라 무리가 발생하지만 virgl은 그런게 없어서 CPU가 여유롭게 됩니다.
UTM이나 패러렐즈에서 구동되는 리눅스도 위와 같이 virgl로 가속합니다.
$ sudo apt install neofetch glmark2 mesa*
몇가지 테스트를 위해 위의 패키지들을 설치해보겠습니다.
$ glmark2
위 명령어를 입력해주면 glmark2 벤치마크가 시작됩니다.
GPU 정보가 virgl에 안드로이드 호스트 GPU 이름이 (예 Adreno 650)이 표시되면
GPU 가속이 제대로 작동되는겁니다.
$ glxgears
위 명령어를 입력해주면 glxgears 벤치마크가 시작됩니다.
참고로 제가 과거 갤럭시S10에서 우분투 구동 후 llvmpipe 상태에서
glxgears 구동 시 87fps 밖에 나오지 않았습니다.
스냅드래곤865 virgl에서 5~6배 오른셈이네요ㄷㄷㄷㄷㄷ
$ neofetch
위 명령어를 입력해주면 리눅스 정보와 호스트 디바이스 정보를 볼수있습니다.
커널이 6.2.1-PRoot-Distro 라고 뜨는건 페이크 커널로 실제는 안드로이드 호스트 커널을
공유해서 사용합니다.
여기까지 오신분들 중
엑시노스2100가 탑재된 갤럭시S21 시리즈 유저분들은 저에게 이런말을 하실거 같네요....
"얌마....갤럭시S21에선 virgl 가속 키고 XFCE4 업데이트해도 오류 나오잖아!"
virgl 자체가 호스트 GPU 드라이버빨을 좀 탄다고 하는데
S21의 GPU 드라이버에 좀 문제가 있는듯합니다 ㅠㅠ
하지만! 방법이 다 있습니다!!!
이건 비교적 최근에 나온 솔루션입니다 ㅎㅎㅎ
제가 Termux에서 지속적으로 건의하면서 개선된 이슈입니다!
바로 ANGLE 라이브러리를 사용하여 호스트 GPU에 대한 번역을 한번 더 거친 뒤
virgl로 가상화 하는 방법입니다.
한번 시도해볼까요?
https://drive.google.com/file/d/1bG-YvoQsDtwmlUhIrVm4rDfQ85A24YEa/view?usp=sharing
먼저 압축파일을 받아서 안드로이드 디바이스의 다운로드 폴더에 풀어주세요.
우분투와 Termux를 강제 종료 후 다시 실행해줍니다.
$ dpkg -i storage/shared/Download/angle-virgl/angle-android*.deb
$ dpkg -i storage/shared/Download/angle-virgl/virglrenderer-android*.deb
위 명령어를 차례대로 설치해주어서
angle 라이브러리와 angle 지원 virgl을 설치해주세요.
$ virgl_test_server_android --angle-gl &
virgl 서버 실행 명령에서 --angle-gl이 추가해서 실행해주세요.
윗 명령어는 OpenGL ES를 ANGLE로 번역한다는 명령어입니다.
만약 Vulkan을 ANGLE로 번역하실거면
$ virgl_test_server_android --angle-vulkan &
virgl 서버 실행 명령에서 --angle-vulkan 명령어를 추가해주시면 됩니다.
일장 일단이 있는데 일단 vulkans으로 번역 시 생각보다 성능 손실이 큽니다.
대신 추후 vulkan으로 하드웨어 가속 여지가 있긴한데
아직까지는 --angle-gl로 하시는것을 추천드립니다.
$ XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &
$ proot-distro login ubuntu --user 유저id --shared-tmp --no-sysvipc
$ ./startx.sh
위 명령어를 입력 후 Termux-x11을 실행해주세요.
위 사진은 갤럭시S21울트라에서 angle+virgl로 가속을 성공한 사진입니다.
xfce4가 오류없이 잘 표시되고 glmark2와 glxgears 데모도 잘 실행됩니다!!!
--angle-gl 옵션일 경우 위와 같이 표시되고
--angle-vulkan 옵션일 경우 위와 같이 표시됩니다.
일단 angle의 경우 스냅드래곤 디바이스 쓰시는분들은 딱히 하지 않으셔도 됩니다.
Mali-Gxx 시리즈 GPU 탑재한 일부 디바이스에서 xfce4가 표시되지 않거나
gl 벤치마크 시 오류를 뿜는 이슈가 있어서 angle을 거치는 것이라
현재로선 미디어텍 AP 탑재 디바이스나 엑시노스2100 탑재 디바이스 정도만 권장합니다.
여기서 부터는 선택사항 입니다.
엑시노스2100 유저분들은 절대 권장하지 않으며 (테스트 했을 때 오만가지 이슈 발생)
스냅드래곤 디바이스 사용중인 분들 한정에서 입니다.
바로 mesa 라이브러리 최신버전 컴파일 설치입니다.
mesa 라이브러리를 최신 버전 설치 시 퍼포먼스나 버그가 개선되는 경우가 있어서
필요할 경우 최신 버전을 유지해주는게 좋습니다.
mesa 스테이블 버전인 mesa 23.3.1 버전을 검색합니다.
mesa 23.3.1 소스를 다운로드 합니다.
다운로드 받은 mesa 소스 파일을 압축을 풀어줍니다.
저는 /home/user/ 경로에 풀어주었습니다.
$ echo "deb-src [signed-by="/usr/share/keyrings/ubuntu-archive-keyring.gpg"] 우분투소스주소 jammy main restricted universe multiverse" >> /etc/apt/sources.list
소스 repo 추가를 위해 위의 명령어를 입력해주세요.
URL 입력 시 명령어가 꼬여서 스크립샷으로 대체합니다. ㅠㅠ
우분투소스주소라고 되어있는 영역에 아래의 주소를 입력해주세요.
$ sudo apt update
소스 repo 추가 후 apt repo를 업데이트해주세요.
$ sudo apt build-dep mesa
mesa 관련 의존성 패키지를 설치해줍니다.
$ cd '/home/user/mesa-23.1.3'
mesa 소스 경로로 진입합니다.
위 명령어는 예시 명령어로 압축을 푼 경로를 입력해주세요.
$ sudo meson build -Dgbm=enabled -Dopengl=true -Degl=enabled -Degl-native-platform=x11 -Dgles1=disabled -Dgles2=enabled -Ddri3=enabled -Dglx=dri -Dllvm=enabled -Dshared-llvm=disabled -Dplatforms=x11,wayland -Dgallium-drivers=swrast,virgl,zink -Dvulkan-drivers=swrast -Dosmesa=true -Dglvnd=true -Dxmlconfig=disabled
빌드 진행을 위해 위의 meson 옵션 명령어를 입력해주세요.
$ sudo ninja -C build install
위의 명령어를 입력해서 빌드 및 설치를 진행합니다.
빌드를 진행합니다.
빌드 하는 동안을 CPU를 풀로 갈구기 때문에 다른것을 시도 시 엄청 버벅입니다.
완료가 될때 까정 기다려주시면 됩니다.
빌드 및 설치가 완료되었습니다.
우분투 로그아웃 후 xfce4를 다시 실행해주세요.
glmark2 벤치를 돌려보면 mesa 버전이 23.1.3으로 표시되는걸 알수있습니다.
프레임은 딱히 나아진건 없지만 초신 드라이버를 쓰는 기분이듭니다 ㅎㅎㅎ
$ sudo apt install supertuxkart
GPU 가속 테스트를 위해 윗 게임을 설치해줍니다.
해당 게임은 리눅스계의 마리오카트(....)라고 불리우는 3D 레이싱 게임입니다.
프로그램->게임에서 실행해주세요.
실행이 된 모습입니다.
일부 캐릭터들이 모델링이 깨져서보이거나 틀어져서 보이는데 virgl 호환성 이슈 때문입니다.
플레이 해보았습니다.
스냅드래곤865에선 최대 25FPS
스냅드래곤8 Gen1에선 최대 30FPS
스냅드래곤8 Gen2에선 최대 35FPS
정도의 퍼포먼스가 나오더군요.
소문으론 엑시노스2200에선 무려 35~40FPS가 나온다고 합니다.
RDNA2가 virgl이랑 호환성이 생각보다 좋은거같습니다.
이상 GPU 가속 설정하기 였습니다!
실행 과정은 다음과 같이
$ virgl_test_server_android &
$ XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &
$ proot-distro login ubuntu --user 유저id --shared-tmp --no-sysvipc
$ ./startx.sh
위 명령어를 입력 후 Termux-x11을 실행해주시면 됩니다.
ANGLE을 이용할 경우 virgl_test_server_android & 대신
virgl_test_server_android --angle-gl &이나
virgl_test_server_android --angle-vulkan &
을 입력해주시면 됩니다.
호스트 GPU의 OpenGL ES를 가상화해서 OpenGL로 가속하는 방식인 만큼
성능 손실이 큰편이고 OpenGL 버전도 2.1이 한계입니다.
게다가 하드웨어 비디오 디코딩은 불가능하구요.
그럼에도
- GPU를 통한 2D/3D 가속이 가능
- 리눅스 GUI 가속이 가능해서 CPU가 여유로워 짐 (llvmpipe에선 CPU가 GUI를 가속)
- 하드웨어 디코딩이 없지만 VLC에서 GL렌더러로 최대 4K@60fps H.264 디코딩 가능
- 리눅스용 게임과 Box64+Wine 게임을 구동 가능
장점이 훨씬 많습니다.
게다가 이미 UTM이나 패러렐즈에서 구동되는 리눅스도 위와 같은 virgl 방식이고
termux package github에서 GPU 성능 개선을 위해 지속적으로 연구 중입니다.
이제 끝이 보이네요.
다음은 원클릭 실행을 위한 termux 위젯 설정 편으로 돌아오겠습니다.
잘하면 4부까지 가지않고 3부에서 마무리될거같네요!!
곧 돌아오겠습니다!










$ nano /etc/apt/sources.list
명령어 입력해서 소스 repo 리스트가 아래와 같이 표시되는지 확인 부탁드립니다.
-----------------------------------------------------------------------------------------------------------------------
deb [signed-by="/usr/share/keyrings/ubuntu-archive-keyring.gpg"] http://ports.ubuntu.com/ubuntu-ports jammy main universe multiverse
deb [signed-by="/usr/share/keyrings/ubuntu-archive-keyring.gpg"] http://ports.ubuntu.com/ubuntu-ports jammy-updates main universe multiverse
deb [signed-by="/usr/share/keyrings/ubuntu-archive-keyring.gpg"] http://ports.ubuntu.com/ubuntu-ports jammy-security main universe multiverse
deb-src [signed-by=/usr/share/keyrings/ubuntu-archive-keyring.gpg] http://ports.ubuntu.com/ubuntu-ports jammy main restricted universe multiverse
-----------------------------------------------------------------------------------------------------------------------
만약 다르다면 위의 내용으로 복사붙여넣기 해주시고 저장 후
$ sudo apt update
명령어로 apt repo 업데이트 해주시면 됩니다.






마지막 방법입니당
https://drive.google.com/file/d/14Jzo1p-9RVJgvI81WnymZ_iZN09Aid5d/view?usp=sharing
제 리눅스 환경에서의 /etc/apt/ 경로의 내용물입니다
압축 푸셔서 해당 경로에 모두 저걸로 교체후
sudo apt update 해주세요
그래도 안되면 apt 소스 쪽 문제가 아닌거같네요 ㅠㅠ


고생하셨습니다. s20에서 동작 무리없네요. 구지구지 vscode를 동작시키고 싶으신 분은 다음과 같이 하시면 됩니다.
1. GUI환경에서 ctrl+shift+t 로 터미널 열기
2. "$ wget https://code.visualstudio.com/sha/download?build=stable&os=linux-deb-arm64" (ARM버전 vscode다운로드)
3. "$ sudo dpkg-i code_1.80.1-1689182504_arm64.deb" (시기에 따라서 다운로드되는 버전이 달라질 수 있음 code까지만 치고 tab하면 나머지는 자동 완성됨)
4. "$ code --no-sandbox" (sandbox모드 없이 vscode 실행)






$ pkg install xwayland xorg-server-xvfb
$ dpkg -i storage/shared/Download/termux-x11/termux-x11*.deb
해주셨나요~?
termux-x11*.deb 패키지나 xwayland가 설치되지 않았을 때 나오는 증상과 같네요.
아니면 이미 백단에서 xwayland 서버가 실행된 상태라서 그런걸수도 있습니다.
termux 애플리케이션 정보에서 강제 중지 후
$ XDG_RUNTIME_DIR=${TMPDIR} termux-x11 :0 -ac &
$ proot-distro login ubuntu --user 유저id --shared-tmp --no-sysvipc
$ ./startx.sh
차례로 다시 시도해보시는걸 추천드립니다.
선생님 그 중간쯤에 virgl 호환 문제로 x11에서 로그아웃하는게 안되는데 강제로 종료 하는방법은 없을까요?
어플 강제중지 하고 업데이트 후 들어가면 까만 화면만 뜨네요 ㅜㅜ