저는 이 게시물을 통해 전자 폐기물로 여겨지는 기기를 실제로 유용한 기술 장치로 바꿀 수 있도록 다른 사람에게 도움이 되기를 바랍니다. 저는 '튜토리얼 전문가'는 아니므로 언제든지 제가 틀린 부분을 지적해 주시면 감사하겠습니다. 염두에 두셔야 할 점은 이 튜토리얼이 정확히 '비기술 사용자 친화적'이지 않다는 것입니다. 따라서 무엇을 하는지, 그리고 그것이 올바른지 이해하기 위해 평소 사용하는 챗봇에게 몇 가지 질문을 하더라도 놀라지 마세요. 저는 GitHub에 너무 크거나(약 6GB와 400MB) 오래된 휴대폰 두 대가 있었습니다. 제가 Galaxy A14 4G (SM-A145R, MediaTek MT6769)를 git-over-SSH 서버로 변환한 방법입니다. 이 서버는 오직 제 Tailscale 네트워크를 통해서만 접근 가능하며, 제 PC에서는 접근할 수 없습니다. 두 가지 앱을 제외하고 모든 앱은 네트워크 접속이 불가능합니다. 충전기를 항상 연결해 두고도 배터리는 60–70% 수준에 머무릅니다. 아래에는 해야 할 일과 제가 저질렀던 실수를 담은 '하지 말아야 할 것(DON'T)' 상자가 있습니다. 저는 이 모든 과정을 Ubuntu에서 진행했습니다. 대부분의 과정은 최신 삼성 기기, 그리고 많은 부분은 루팅 가능한 Android 휴대폰에 적용됩니다.
필요한 것:
- 부트로더를 잠금 해제할 수 있는 삼성 휴대폰 (대부분의 국제/EU 모델이 가능합니다. 미국 모델은 보통 불가능합니다: 다운로드 모드에서 'OEM LOCK' 라인이 보이지 않으면 포기하세요).
- Linux PC (Windows도 가능하지만, 다른 도구가 필요함)
- USB 케이블
- 무료 Tailscale 계정
- 인내심: 휴대폰이 여러 번 초기화될 것입니다.
1. 부트로더 잠금 해제:
설정 → 개발자 옵션 → OEM 잠금 해제 활성화(on). 전원을 끕니다. USB 케이블을 연결하면서 볼륨 업(+) + 볼륨 다운(-) 버튼을 누른 채 유지합니다 (PC 쪽은 연결된 상태). 볼륨 업(+) 버튼을 길게 눌러 잠금을 해제한 다음, 확인합니다. 이 과정에서 휴대폰이 초기화됩니다. Wi-Fi에 연결하여 설정을 진행하세요. 이후 OEM 잠금 해제 스위치는 회색으로 비활성화되어 있어야 합니다. 다운로드 모드에서 KG STATUS는 CHECKING, COMPLETED 또는 BROKEN을 표시해야 합니다. PRENORMAL은 Knox Guard가 아직 비공식 이미지를 수용하지 않는다는 의미이므로: 약 168시간의 가동 시간이 될 때까지 기다리세요.
2. 정확한 펌웨어 다운로드:
topjohnwu(Magisk 개발자)가 만든 samloader-rs를 사용하세요: https://github.com/topjohnwu/samloader-rs. 이 도구는 삼성 서버에서 직접 다운로드하여 플래싱합니다.
삼성은 이제 최신 펌웨어만 제공하며, 요청 시 휴대폰의 일련번호(serial) 또는 IMEI를 포함해야 합니다. 그렇지 않으면 S01 오류가 발생합니다. 모든 .tar.md5 파일의 MD5 트레일러를 확인하세요. 3. 부트 이미지 패치: Magisk 앱을 사용하여 펌웨어의 AP 파일을 패치하거나("Select and Patch a File"), adb를 통해 init_boot.img만 Magisk의 boot_patch.sh로 패치할 수 있습니다. 결과는 동일합니다: 플래그가 = 3(검증 비활성화)인 패치된 init_boot, vbmeta와 userdata.img가 없습니다. 4. 플래시 및 초기화: samloader flash -b BL_.tar.md5 -a magisk_patched.tar -c CP_.tar.md5 -s CSC_*.tar.md5 HOME_CSC 대신 CSC를 사용하세요: 첫 Magisk 설치는 데이터 삭제가 필요합니다. 복구 모드에서 "Android 시스템을 로드할 수 없습니다(Can't load Android system)"라는 메시지가 표시되면 공장 초기화 데이터를 선택하세요. 이는 정상입니다. 최신 삼성 기기에는 Heimdall을 사용하지 마세요. 제 경우: 시간 초과가 너무 짧았고(userdata 실패); misc 플래싱은 부트로더를 전체 세션에서 실패하게 만들어 휴대폰이 "장치 소프트웨어 업데이트 중 오류가 발생했습니다(An error occurred while updating the device software)" 상태에 머물게 했습니다; 모든 절반만 완료된 세션은 제가 버튼을 이용해 다운로드 모드로 재시작할 때까지 이후의 모든 핸드셰이크를 차단했습니다. samloader-rs는 첫 시도에 작동했습니다. 첫 루트(root)를 위해 HOME_CSC 플래싱을 하지 마세요("데이터 유지"): 부트 루프가 발생했습니다. 부트 루프를 "해제"하기 위해 순정 init_boot / vbmeta를 다시 플래시하지 마세요. Magisk 문서에서 이 점을 경고하며, 그들이 맞습니다: 초기화할 때까지 계속 루프에 빠집니다. --erase에 의존하지 마세요: MediaTek에서는 "0 sectors"가 삭제되었습니다. MediaTek에서 samloader-rs를 사용할 때는 -p partition_name을 사용하지 마세요: 이름은 대문자로 변환되고 PIT는 소문자입니다. 대신 -f init_boot.img를 사용하세요. 또한, 세션 중간에 실패한 명령어는 버튼 재시작을 의미합니다. 5. 첫 부팅 최소 설정: Wi-Fi만 연결하고 계정은 없습니다. 그런 다음 개발자 옵션과 USB 디버깅을 활성화합니다.
adb를 통해 어떤 것을 설치하기 전에 Play Store와 Galaxy Store를 비활성화하세요: pm disable-user --user 0 com.android.vending pm disable-user --user 0 com.sec.android.app.samsungapps 설정 직후에 앱들을 복원하고 설치(제 경우 심지어 TikTok까지)하며 설치 대기열을 차지하기 때문에, adb install 명령은 그냥 멈춰버립니다(hangs). 전체 Magisk 앱을 설치하고 "추가 설정" 재부팅을 수락하세요. 그 이후부터는 adb shell su -c id를 실행하면 root 권한이 부여됩니다. 6. 디블로트(Debloat): 배치 단위로, 안전장치(failsafe)를 사용해 pm uninstall --user 0 <패키지>를 사용하면 시스템 파티션에 영향을 주지 않으며, cmd package install-existing <패키지> 명령으로 되돌릴 수 있습니다. 하지만: 한 번에 170개의 패키지를 제거하지 마세요. 제가 그렇게 했더니, USB 연결도 adb도 안 되는 상태로 휴대폰이 영원히 "Phone is starting..."에 멈춰버렸습니다. 공장 초기화(Factory reset)를 하셔야 합니다. Google Play Services (com.google.android.gms), GSF, 그리고 One UI 7의 Chrome은 사용하지 않더라도 제거해서는 안 됩니다. 삼성은 부팅 시 이들을 재설치합니다. 만약 다시 제거하면, 위와 똑같이 부팅이 멈춥니다. 일부 패키지(설정 마법사, Smart Switch, AdServices 및 원격 측정 모듈, 몇 가지 삼성 서비스)는 사용자가 제거하거나 비활성화하더라도 매번 부팅 시 삼성에 의해 재활성화됩니다. 이에 맞서 싸우지 마세요: 방화벽으로 막으세요(9단계). 저에게 효과가 있었던 방법은 다음과 같습니다: 배치 단위로 진행하고, 배치마다 한 번씩 재부팅 테스트를 하는 것입니다. Magisk service.d 안전장치 설정: 배치를 적용하기 전에 그 목록을 /data/adb/.../pending.txt에 작성하세요. 부팅 시, 스크립트가 실제 홈 화면(FallbackHome이 아닌, "Phone is starting..." 뒤의 액티비티)이 나타날 때까지 최대 7분 동안 기다립니다. 만약 나타나지 않으면, 해당 배치를 재설치하고 재부팅합니다. 가짜 실패를 유도하여 안전장치를 테스트해 보세요. 저의 경우 처음에는 작동하지 않았습니다: Magisk 스크립트 내에서 cmd package ... 출력을 /data/adb 아래 파일로 리디렉션하지 마세요. system_server는 해당 fd(SELinux)에 쓰기 권한이 없으므로, 호출이 "Failed transaction" 오류와 함께 실패합니다. 파이프를 통해 출력을 캡처하세요 (r=$(cmd package ... 2>&1 | cat)). 공장 초기화 없이 복구하는 방법입니다.
“Phone is starting...” 메시지가 뜬 상태가 와이프(wiping) 없이 수정될 수 있습니다: overlay.d/*.rc 파일과 스크립트를 Magisk-patched init_boot ramdisk에 추가하세요. Magisk APK의 magiskboot (lib/x86_64)는 Linux에서 실행됩니다. 이 스크립트는 패키지 서비스가 시작되기를 기다린 다음, 제거한 항목에 대해 cmd package install-existing을 실행하고, 마커 파일을 작성한 후, 한 번 재부팅합니다. 다운로드 모드에서 init_boot만 플래시하면 됩니다. 덕분에 두 번째 전체 재설치 과정을 아낄 수 있었습니다. 7. Termux + sshd Termux와 Termux:Boot를 GitHub 릴리스 또는 F-Droid에서 설치하세요. pkg install openssh git을 실행합니다. sshd_config에서는 포트(port)는 8022, PasswordAuthentication no, AuthenticationMethods publickey, 모든 포워딩(all forwarding)은 비활성화합니다. 휴대폰에서 리포지토리들을 베어 리포지토리로 만드세요: git init --bare ~/git/<name>.git. 루트 셸(root shell)에서 Termux 명령을 실행할 때: `su <termux-uid> -g <termux-uid> -G 3003 -G 9997 -c
‘자동(automatic)’을 사용하고 휴대폰에서 ‘Tailscale DNS 사용’은 비활성화하십시오. 9. 방화벽 (Magisk 스크립트의 iptables) 인바운드: tun+와 lo(adb forward)에서만 포트 8022 허용; Wi-Fi로부터 새로운 TCP 연결 없음. 아웃바운드: Tailscale 자체 UID(따라서 직접 LAN 경로를 사용할 수 있음), DHCP, 그리고 시스템 UID에 대한 DNS(53)를 제외하고는 사설 범위로의 새로운 연결 없음; 그런 다음 -m owner --uid-owner 10000-99999 -j REJECT를 Termux와 Tailscale을 제외한 모든 앱에 대해 적용합니다. 이 앱 규칙은 제거할 수 없었던 Google/Samsung 패키지도 처리합니다. 라우터로의 DNS 차단하지 마십시오: ‘자동’ 모드에서 Android의 리졸버는 이를 사용하며, LAN을 차단하는 순간 모든 것이 고장 납니다. 저는 힘든 경험 끝에 깨달았습니다. pkill -f 또는 자신의 명령어 줄에서도 나타날 수 있는 패턴으로 grep 하지 마십시오(예: 스크립트 경로): 자신만의 셸을 종료시킵니다. 저에게 세 번이나 일어났습니다. netd가 체인을 재구축할 수 있으므로 매 분마다 체인들을 다시 확인하십시오. 10. 항상 전원에 연결된 휴대폰의 배터리 값: 저렴한 삼성 모델은 ‘USB 전원 공급 일시 중지(Pause USB Power Delivery)’ 기능이 없지만, 배터리 드라이버가 다음을 노출합니다: /sys/class/power_supply/battery/store_mode : 1 = 리테일 데모 모드. 충전이 멈추고 휴대폰은 충전기로부터 전력을 공급받아 작동하지만, 배터리는 100%에 머무릅니다. /sys/class/power_supply/battery/input_suspend : 1은 충전기 입력을 차단하여 휴대폰이 방전됩니다(제 모델의 경우 약 160 mA). 5분 간격 루프를 통해 배터리를 60%와 70% 사이로 유지합니다: 70% 이상에서는 입력 일시 중지, 60%에서 복원, 항상 55% 이하에서 복원하십시오. 삼성의 게이지는 실제 방전이 시작된 후에도 한동안 100%를 표시한다는 점에 유의하십시오. 11. 레포지토리 푸시 첫 번째 푸시는 USB를 통해(adb forward tcp:18022 tcp:8022) 수행하는 것이 훨씬 빠릅니다. 그 이후에는 Tailscale을 통해 푸시합니다. 기본 레포지토리에 receive.denyNonFastForwards true를 설정하여 잘못된 force-push가 히스토리를 파괴하지 못하게 합니다. 결과 휴대폰은 자동으로 부팅되며(unlocked-bootloader 경고 시 전원 버튼 누름 불필요), 전원 켜진 후 약 80초 만에 Tailscale을 통한 SSH 연결이 활성화됩니다. 이 작업은 Claude Opus 5.5의 큰 도움으로 완료되었습니다.
제출자: /u/MadJackTheThird [link] [comments]