Xiaomi Note 7, PixelExperience ROM 설치와 루팅 과정

입질쾌감 물때표

내가 좋아하는 샤오미 홍미노트 루팅과정에 대해서 기술한다. PixelExperience를 즐겨 쓰기전에는 LineageOS를 줄곧 사용해 왔는데, 지금은 UI가 다소 끌리는 Pixel 디자인의 롬으로 갈아탔다.

https://get.pixelexperience.org/lavender

위의 링크로 들어가면 바로 Xiaomi Note 7 Pro의 롬파일을 구할수 있다. 폰 데이터와 기존 롬을 이제 날려버리자.
이 작업이 진행되기 전에 사전적으로 롬이 언락이 되어 있어야 한다. 샤오미 계열은 롬이 락이 걸려 있는데 이 락을 어떻게 해제하는지 검색을 통해 먼저 해결해놓고 진행해야 한다.

[참고] 샤오미 복구용 롬 주소 : https://xiaomifirmwareupdater.com/miui/

진행순서

  • Fastboot 모드로 진입해서 twrp 리커버리 이미지 Flash 하기
    URL : https://twrp.me/xiaomi/xiaomiredminote7.html
  • Recovery(리커버리) 모드로 들어가서 다운받은 PixelExperience_lavender-13.0-****-OFFICIAL.zip 롬이미지를 adb sideload로 설치하기
  • 루팅용 Magisk-vXX.x.apk 파일 설치하기 (리커버리 모드에서 PixelExperience 설치하고 재부팅 없이 바로 Magisk를 설치함)
  • Termux 설치 (루팅후 설치할수 있는 다양한 패키지를 사용하게 해줌, 기본적으로 앱으로 Terminal을 사용할수 있게 됨)
    URL : https://f-droid.org/en/packages/com.termux/
  • Termux를 통해 OpenSSH, Vi 등을 설치하고 환경 정리

Fastboot 모드로 진입해서 twrp 리커버리 설치

기본적인 Fastboot와 Recovery 모드의 진입방법은?

Fastboot Mode : 전원버튼 + 볼륨하단 버튼 동시에 누르고 부팅/재부팅이 되던 샤오미 로고가 나오면 전화기의 전원버튼만 떼고 기다리면 된다.

Recovery Mode : 전원버튼 + 볼륨상단, 로고보이면 전원버튼 손떼기

[리커버리 테스트 해보기]
$ fastboot boot ~/Downloads/twrp-3.7.0_9-0-lavender.img

위의 방법으로 flash 하기전에 제대로 부팅되는 놈인지 확인이 가능하다. 이 과정을 반드시 해보고 다음단계로 가길 추천함. 만약 recovery로 진입이 안되거나 twrp 초기화면에서 더이상 진입이 안되고 벽돌이 되어 있다면 Xiaomi Global 공식롬을 다시 받아서 깨끗한 상태로 만든후에 다시 진행해 보길 바란다.

[리커버리 부팅]
$ fastboot flash recovery ~/Downloads/twrp-3.7.0_9-0-lavender.img
$ fastboot reboot

리커버리 모드로 진입

이렇게 하면 fastboot를 통해 recovery 이미지를 기기에 플래싱을 하고 새로 설치된 recovery 이미지로 복구화면에 진입한다. 재부팅후 잘 안되면 직접 리커버리 모드에 진입해 보길

Recovery 모드에서 PixelExperience 설치하기

Recovery 모드로 진입하면 이제 PixelExperience와 Magisk를 설치해야 한다.

위의 화면에 진입하면 sideload 모드를 켜서 내 PC에 저장되어 있는 롬파일과 Magisk를 원격에서 설치를 진행한다.

위의 그림처럼 Sideload를 동작시키고 adb sideload “파일위치” 커맨드로 롬 또는 apk를 설치할수 있게 된다. 아래와 같이 실행하면 된다.

# adb sideload PixelExperience_lavender-13.0-20230713-0104-OFFICIAL.zip
# adb sideload Magisk-v26.1.apk

두가지를 한꺼번에 설치하고 이제 리부팅을 하면 이제 커스텀롬으로 root 권한을 사용할수 있는 안드로이드가 시작된다. Magisk를 설치했으므로 이제 Termux와 같은 루팅폰용 어플리케이션등을 사용할수 있게 되었다.

일단 Pixel이 기동되면, Magisk가 설치된 것을 확인할수 있는데, 해당 앱을 실행시켜서 추가적으로 앱이나 다른 뭔가를 설치하라고 하면 바로바로 설치해준다.

Termux 설치

안드로이드 디버깅 접속이 가능하도록 개발자 모드를 켠 후에, adb install로 termux를 설치하자. 아래의 링크에서 termux APK를 다운로드 받아서 내 컴퓨터에 저장해 두자

URL : https://f-droid.org/en/packages/com.termux/

# adb install com.termux_118.apk # 다운로드 받으면 이러한 파일명으로 되어 있을 것이다. 약 100M 정도

설치를 마치면 termux 쉘을 기동할수 있는 앱이 하나 설치된다.

termux 앱 화면

Termux를 통해 OpenSSH, Vi 설치, 환경설정

$ pkg update # 뭔가 물어보면 죄다 "Y"로 진행하면 됨
$ pkg upgrade
$ pkg install openssh vim wget vim-python
[ vim-python을 설치해야 junegunn/vim-plug 설치후에도 커맨드가 정상 동작함 ]
[이런것들도 설치가능]
$ pkg install mariadb php nodejs

만약 pkg update를 실행했을때 “Clearsigned file isn’t valid, got ‘NOSPLIT'” 이런 메세지가 나오게 되면 고민하지 말고 termux-change-repo를 실행한다. 그리고 두번째인 “Cloudflare version”를 선택하고 다시 pkg update를 실해하면 된다.

adb shell로 들어가서 바로 termux 환경으로 진입하고 싶으면 아래의 스크립트 내용을 로컬에 termux.sh 파일로 저장해 둔다음에 adb push로 PC에 있는 스크립트 파일을 기기의 /sdcard 디렉토리에 복사하자

$ adb push ~/Downloads/termux.sh /data
$ adb shell # shell로 진입해서!
# sh /data/termux.sh # 실행해보면 바로 termux 쉘로 진입되는 것을 확인할수 있다.

아래의 스크립트가 termux.sh로 저장되어야 할 내용임.

#!/system/xbin/bash
#Based on https://github.com/termux/termux-app/issues/77
export PREFIX='/data/data/com.termux/files/usr'
export HOME='/data/data/com.termux/files/home'
export LD_LIBRARY_PATH='/data/data/com.termux/files/usr/lib'
export PATH="/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets:$PATH"
export LANG='en_US.UTF-8'
export SHELL='/data/data/com.termux/files/usr/bin/bash'
export BIN='/data/data/com.termux/files/usr/bin'
export TERM=vt220
export AR="arm-linux-androideabi-ar"
export CPP="arm-linux-androideabi-cpp"
export GCC="arm-linux-androideabi-gcc"
export LD="arm-linux-androideabi-ld"
export NM="arm-linux-androideabi-nm"
export OBJDUMP="arm-linux-androideabi-objdump"
export RANLIB="arm-linux-androideabi-ranlib"
export READELF="arm-linux-androideabi-readelf"
export STRIP="arm-linux-androideabi-strip"
export TERMUX="/data/data/com.termux/"
cd "$HOME"
exec "$SHELL" -l

shell 진입시에 바로 termux 쉘로 들어가기

$ mount -o remount,rw / # 루트 디렉토리를 rw 퍼미션을 준다.
$ vi /etc/mkshrc

# Copyright (c) 2010, 2012, 2013, 2014
#	Thorsten Glaser <tg@mirbsd.org>
# This file is provided under the same terms as mksh.
#-
# Minimal /system/etc/mkshrc for Android
#
# Support: https://launchpad.net/mksh

set +o nohup

if (( USER_ID )); then PS1='$'; else PS1='#'; fi
PS4='[$EPOCHREALTIME] '; PS1='${|
	local e=$?

	(( e )) && REPLY+="$e|"

	return $e
}$HOSTNAME:${PWD:-?} '"$PS1 "

# 추가된 부분
sh /data/termux.sh

Vi 환경 설정

Vi 설치후에 vi 명령어로 vi 진입시에 아래와 같은 에러가 나게 되는데, $TERM 환경변수가 없어서 저런 메세지를 뿌리고 있는 것.

~ # vi 

E557: Cannot open termcap file
'vt220' not known. Available builtin terminals are:
    builtin_ansi
    builtin_vt320
    builtin_vt52
    builtin_xterm
    builtin_iris-ansi
    builtin_pcansi
    builtin_win32
    builtin_amiga
    builtin_dumb
    builtin_debug
defaulting to 'ansi'

$ vi ~/.bashrc

# 아래의 내용을 추가한다. 추가되면 문제없이 작동된다. 이제 Termux 내에서 vi 사용이 가능하므로 파일 편집하는데 불편함이 없을 것이다.
export TERM=xterm-256color

OpenSSH 설정

원격에서 접속을 하려면 8022 포트로 접속해야 한다. root가 기본적으로 접속 허가가 안되어 있기 때문에 sshd config 파일을 직접 수정해줘야 한다.

$ vi $PREFIX/etc/ssh/sshd_config
PrintMotd yes
PasswordAuthentication yes
Subsystem sftp /data/data/com.termux/files/usr/libexec/sftp-server
PermitRootLogin yes
$ sshd # 서버 시작

PermitRootLogin 키값에 yes를 추가해주면 root 로그인이 가능하게 되고, root의 비밀번호는 termux 쉘에서 passwd로 지정해주면 된다.

# 접속예시
# ssh -p 8022 root@192.168.0.73

추가 기능

아파치 등을 안드로이드에 설치가 가능하다. 기본 포트는 8080이다.

# pkg install apache2
# apachectl start

안드로이드 부팅시에 스크립트 실행하기

먼저 알아야 할 것이 있다. 안드로이드(13기준)는 부팅시 /data 디렉토리에 /dev/block/mmcblk0pXX 이미지를 마운트 시키는데, 안드로이드의 기기 보안설정으로 LockScreen(잠금화면)에 패턴 및 비밀번호, 지문등을 설정해 두면 마운트가 해제되기 이전에는 /data의 모든 파일, 디렉토리가 암호화 되어 보여지게 된다.

# ls -ail /data/data/                                                                                                                                           
+RvztT8ApD0dkg3u4soyDtZrMnOGCUHcjobpSPKpSFA/              XT+Xfr9XXXokMfNUPWBpx9umJt7AjODVyHDUwoYgHeO/              _mLFfYkI5pBIF3pD9wvwdRhDtRcggRWaT/
,HcXCblNR4C3v,KOxG1p5U4MG9VtvaaA/                         XWtRgsqvuKqsEVyK7JzbFC/                                   _o3JVYAOdWXQzbgqrnbX2vrGDbZZQL7Kj/
0PxXbac2kLdBiCfbGEejR5oOVEnAR1cV92tqke,n+ZP/              YeDCA1FzDBRUGL2DUui6vU4MG9VtvaaAH6giS7uKi9K/              _oEIRtaTEtcy6CPF4Qv8MgEXOI2OLyqYN/
2Bzw1A1y6lW1HyEYK66,F8yuX09nDCK1Wbe2+A/                   Ykg2CBQNlmzQyVhLCLoRDpjQG3E/                              _ohKrXxcekchGY25S+DH32BP9r7ZT5C+Y/
2YgOOfMq1nDtBOq7iKc8u7oOVEnAR1cV/                         YoZ0mRqWOxISCSGPOQeck7oOVEnAR1cV92tqke,n+ZP/              _onaKuKi,HL1WASrOTZnF,r4uJ4CaLPOe/
49U8wWct362OoM,HffmUrDfvImwBtZLy/                         ZjSf10kTfoLfOiJOWfUR1CAtKaqRiDDv8kqM4cBbGRK/              _q9RWLJZDZhloZok,rZ,khNtGbh+rr1uC/
4dquwtbi+isTfY4oos3ByqzFShLuNsYl7H,85C/                   Zoxx5MUJzJK6KCoCRuy2RC/                                   _qN2Y3,xdP96YWS6JvujfbXeZTYtqIsQG/
4kZvdy4dfz,,C5g4Ls+8964k4dN/                              _+AIW3mNQycFchriv5Jc66QYueZjG36Xx/                        _qkhv97ThQZAEeWdneIV2R,kuBQwvMay6/
61+jrv6SWGe4fO9AEl6DzB/                                   _+SQnM5xvfxb+TjXX58J2e7RAv2dgINqT/                        _qnxmESvhlmi+2wzKFWgP+fpE0DUxAS,9/
69gVlxhDW00QfMTy901lajRsWXSiPQqcEHq,wD/                   _+uzBygbKBoaX4p7ZbL6GX7cI4FOEIPsx/                        _qxv7l1FJz5Lp07NvCwh7QqIPcZxeossh/
6GviG86r9,knwJheqhtOS6oOVEnAR1cV92tqke,n+ZP/              _+xYp+8RT,57qXrf7s1jBXUO57Sukd0we/                        _sCXWn86DshO0qw1OuYSSfxGN+gJZKIHT/
6S86o3hfGiUMQmqvGeZFS5oOVEnAR1cV92tqke,n+ZP/              _+y6EFaWgJGosEzu53NCqm4GwO45vK+OX/                        _sILux2Fwr9qjhSczzb4sVsN8rdDCnppM/
7KyozrI5G10oUr9PX2ZQE6oOVEnAR1cV/                         _0ZyDgd8MUu920IgACpOTNbOZ5bBMYkJ8/                        _sWOgJ3xMKsN9lFXRl0hs29,uAcUPZZms/
7dVF9C1FVBHdm7eNXHVk8uZPDOhiKk0UYBTXwC/                   _2VXq0CtBuTzw5R+9LLdOsAA3bYecTWvT/                        _sbXc4tpKt83QO51JJq3ElYNex19mmX0p/
7tt,djrbSbhkl3VppAgsV6oOVEnAR1cV/                         _4A1ZYNtPfkX7INtiHPkhg4wl80QsbYRM/                        _ub+QmvJF7,qgbk,XIHkYbgEXdc9xztLv/
86fcXwb6bzTBmWv3k70P47oOVEnAR1cV92tqkC/                   _4DVShUzRytIHXJkTz6ui07ROpMBx7Bj6/                        _w,u0FglKVy10CN8FOSkyPxGxAOSElJRs/
8HNgaKTSSMmOg8jcnaOU3r,g0g8EI92WsdOM8B/                   _4JnBi3XBJ4,ejcBY0H5V5LlYkwiNpnfp/                        _wUT92vGllS+8JJRLyDpGUMod4o0VqvkS/
8cM2G8cXvuoWo9Yehn4Bj1bE79JVcdG+,YRS3cCUo1I/              _6BZ1BtjbGKmwNrlIBwmMdM52ABuJFp0,/                        _wieUIY8GWJJGUt7bzlEGgEx1eyJjee8Z/
9FIS3Wr,47Sj4+3Q2BSV00xWby+jhsz6dky8Zg6,ROA/              _8APSlUSlE5E6D0qwvHXV,wiOfk6,ip4p/                        _yE4joOperGRzNHnogbdiScHKA18KuKyK/

위의 결과처럼 모두 암호화되어 보여진다는 것! 즉, /data 이하의 파일을 부팅시에 자동으로 실행시키기 위한 준비는 안드로이드의 잠금화면의 잠금수단이 모두 해제되어야 한다는 점이다.

모든 잠금옵션을 해제하고 재부팅후에 락스크린을 해제하고 넘어가기 전에 adb shell로 들어가서 /data 디렉토리를 확인해 보면 파일명이 제대로 보이는것을 확인할 수 있다.

Magisk GIT에 boot script에 관한 내용을 아래의 링크에서 확인할수 있다.

https://github.com/topjohnwu/Magisk/blob/master/docs/guides.md#boot-scripts

General Scripts
Placed in /data/adb/post-fs-data.d or /data/adb/service.d
Only executed if the script is set as executable (chmod +x script.sh)
Scripts in post-fs-data.d runs in post-fs-data mode, and scripts in service.d runs in late_start service mode.
Modules should NOT add general scripts during installation
Module Scripts
Placed in the module’s own folder
Only executed if the module is enabled
post-fs-data.sh runs in post-fs-data mode, and service.sh runs in late_start service mode.

위의 내용중에 post-fs-data.sh가 있고 service.sh가 있는데, 결론적으로 순서를 이야기 하자면 위에서 안내된 디렉토리에서 두개의 스크립트를 만들어서 확인해 보았더니, post-fs-data.sh 스크립트가 먼저 실행되고 이후에 service.sh 스크립트가 실행되는 되고 있었다. 따라서 더 늦은 service.sh만 생성하기로 하고 아래 처럼 스크립트를 작성했다.

~ # vi /data/adb/service.d/service.sh 

[내용]
#!/system/bin/sh
mount -o remount,rw /
sysctl net.ipv4.ip_forward=1
echo "`echo ${0##*/}` - `date +"%T.%N"`" > /result.txt

sleep 20
echo "`echo ${0##*/}` - `date +"%T.%N"`" >> /result.txt

sh /startup.sh

[실행권한을 반드시 줘야한다]
~ # chmod +x /data/adb/service.d/service.sh]

위의 bold 처리된 부분이 핵심인데 부팅되고 나서 안드로이드 락스크린을 넘어가는 시점에 근접할수 있도록 sleep 20 (20초) 정도의 딜레이 처리가 필요하다. 이 시점이 중요한 게, 파일시스템의 파일명이 복화화 되어 마운트 되는 시점 이후에 실행시켜야만 하기 때문이다.

20초 후에 실행될 startup.sh 파일을 따로 생성해 보자

#!/system/xbin/bash

echo "(ls -ail) - `echo ${0##*/}` - `date +"%T.%N"`" >> /result.txt
echo "-------------------------------------------" >> /result.txt
ls -ail /data/data >> /result.txt
echo "-------------------------------------------" >> /result.txt

export PREFIX='/data/data/com.termux/files/usr'
export HOME='/data/data/com.termux/files/home'
export LD_LIBRARY_PATH='/data/data/com.termux/files/usr/lib'
export PATH="/data/data/com.termux/files/usr/bin:/data/data/com.termux/files/usr/bin/applets:$PATH"
export LANG='en_US.UTF-8'
export SHELL='/data/data/com.termux/files/usr/bin/bash'
export BIN='/data/data/com.termux/files/usr/bin'
export TERM=vt220
export AR="arm-linux-androideabi-ar"
export CPP="arm-linux-androideabi-cpp"
export GCC="arm-linux-androideabi-gcc"
export LD="arm-linux-androideabi-ld"
export NM="arm-linux-androideabi-nm"
export OBJDUMP="arm-linux-androideabi-objdump"
export RANLIB="arm-linux-androideabi-ranlib"
export READELF="arm-linux-androideabi-readelf"
export STRIP="arm-linux-androideabi-strip"
export TERMUX="/data/data/com.termux/"

$BIN/sshd
$BIN/apachectl start

위의 처럼 스크립트를 작성하면 sshd와 apache가 부팅후에 자동으로 실행되는 것을 확인할수 있게 된다.

~ # netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:8022            0.0.0.0:*               LISTEN      4650/sshd           
tcp6       0      0 :::8080                 :::*                    LISTEN      4663/httpd          
tcp6       0      0 :::8022                 :::*                    LISTEN      4650/sshd           
~ # 

이제 휴대폰이 서버가 되는 순간을 맞이했다. 와우~

일단 마지막으로 위에서 작성한 몇가지 파일들의 용도를 정리하자.

/etc/mkshrc

이 파일은 adb shell로 안드로이드 기기의 기본 shell 계정으로 진입할때 init 스크립트로 사용되는 놈이다. 따라서 adb root; adb shell로 기기 터미널로 진입할때 termux 환경의 root 계정으로 들어가기 위해 가장 마지막 라인에 “sh /data/termux.sh”를 추가한 것이다.

/data/data/com.termux/files/home/.bashrc

위의 mkshrc 스크립트가 실행되고 OS에서 $HOME 디렉토리로 안착시킬때 bash 초기 실행 스크립트이다. 여기에서 vi를 위한 환경변수를 작성해 주었다.

/data/adb/service.d/service.sh

Magisk 루팅 단말기에서 기기부팅시에 커스텀 스크립트를 작성해서 실행시켜줄수 있게 해주는 위치에 +x 속성의 스크립트 파일을 저장해 두었다.

/startup.sh

위의 service.sh 스크립트가 실행되고 이후 20초 딜레이를 거쳐 가장 마지막에 실행되는 스크립트를 넣어둔 곳이다. 여기에서 ssh 서버, apache 서버가 실행되도록 작성되었다.

One thought on “Xiaomi Note 7, PixelExperience ROM 설치와 루팅 과정

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다