안드로이드 init.rc와 ifconfig를 통한 부팅시 고정 아이피 설정

1. 개요

안드로이드 개발보드에 AOPS를 이용하여 커스텀 컴파일하여 안드로이드 운영체제를 설치하는 과정에서

개발보드에 USB to Ethernet 랜카드의 아이피 주소를 고정 아이피로 설정해야 하는 문제가 생겼습니다.

 

adb shell에서 ifconfig 커맨드로 확인되는 USB to Ethernet 랜카드는 이름은 다행히 eth0로 고정된 상황이고,

부팅 후에 ifconfig를 이용하여 고정아이피 설정이 가능한 상태입니다.

 

adb를 이용하지 않고 안드로이드에 기본 설치된 Setting apk는

wifi 이외의 연결된 Ethernet에 대하여 설정이 불가능 하였고, 

adb shell 접속시에도 su 권한을 얻어야 ifconfig를 통하여 고정 아이피 설정이 가능한 상황이었습니다.

 

이 포스팅에서는 아래의 환경에서의 문제를 해결하였습니다. 

 

- 안드로이드 9.0

- 개발보드 제조 회사에서 제공한 android bsp build가 가능한 상황

- 개발보드의 USB 3.0에 NEXT USB 2.0 Ethernet 랜카드

 

 

2. 루팅을 이용한 해결방법 시도

고정 아이피가 필요한 app을 안드로이드 개발보드를 이용하여 제작 중이었기 때문에

먼저 해결 방법으로 생각했던 것은 루팅을 이용한 해결 방법이었습니다.

 

https://www.tenorshare.com/kr/android-data-recovery/6-best-booting-apps-for-android.html

 

PC 없이 안드로이드 6 개 최고의 루팅 앱 2018

많은 사용자가 제한 없이 Android 기기에서 모든 것을 수정하거나 맞춤 설정하기 위해 슈퍼 유저 권한 또는 전체 루트 액세스 권한을 얻기 위해 Android 스마트폰 또는 태블릿을 루팅 해야 합니다. Android는 Google이 제공하는 오픈 소스 모바일 OS이므로 시장에 다양한 루트 앱이 있습니다.  이 글에서는 올해의  PC / 컴퓨터 없이  상위 6 개 루팅 앱을 열거합니다. 삼성, 화웨이, LG, HTC, 소니, 블랙베리, 노키아, 모토로라,

www.tenorshare.com

저 위의 루팅 방법을 전부 사용해 보았고, 기타 루팅 프로그램을 이용해 보았지만

개발보드 환경에 맞게 커스텀 빌드된 안드로이드 9 에서

루팅 하는 방법은 직접 BSP에 SuperSU binary를 설치하는 방법뿐이라는 결론에 도달했습니다.

 

물론 빌드된 boot.img를 이용한 다른 루팅 방법이 있겠지만

시도하고 시행착오를 겪기 전에 포기를 했습니다. 

 

그 이유는 init.rc를 이용하여 고정아이피를 잡거나 shell script를 이용하여

안드로이드 부팅 시 자동으로 원하는 디바이스 세팅하는 예제를 발견해서입니다.

https://github.com/idor/Android/blob/master/WCS_Tools/init.rc/init.rc

 

idor/Android

MCS integartion with OMAP Android. Contribute to idor/Android development by creating an account on GitHub.

github.com

 

3. init.rc 수정& 컴파일

안드로이드에 adb shell 접속 시 / 디렉터리에 존재하는 init.rc를 변경하기 위해서

BSP의 system/core/rootdir/init.rc 파일을 수정후 make 하여 img파일들을 새로 올려 주어야 합니다.

on property:dev.bootcomplete=1								
    start eth0_test_shell

service eth0_test_shell /system/bin/ifconfig eth0 192.168.100.55 up
    user root
    oneshot

위의 코드를 init.rc 마지막 줄에 넣어줍니다.

 

on property:dev.bootcomplete=1 부분을 넣어 주어야

부팅이 완료된 이후에 eth0_test_shell 서비스가 작동합니다.

 

많은 예제에서 shell scripts를 이용하여 부팅 시 시작되는 서비스 루틴을 변경 가능한 파일로 만들어 주는데 

저는 그럴 필요가 없어서 바로 명령어가 실행되도록 하였습니다. 

 

추가로 init.rc에 등록한 서비스의 경우 adb shell 에 접속하여 

start servicename 커맨드를 입력하면 수동으로 실행이 가능합니다.

위의 예제를 적용할 경우

start eth_test_shell 을 입력하면 수동으로 한번 더 서비스가 실행됩니다.

수차례 디버깅하는 과정에 사용되었기에 참고하시면 됩니다.

 

4. SELinux 

안드로이드 4.3 이후로 SELinux가 sanbox를 대신하여 보안 커널로 채택이 되었습니다. 

어플리케이션을 이용하여 취약점을 노린 보안 공격 및 해킹을 방지해 주는 고마운 녀석입니다.

adb shell에서 getenforce 명령어로 현재 상태가 확인 가능합니다.

상태로는 Enforcing 상태와 Permissive 상태 두 종류가 존재합니다.

 

여기서 문제가 발생하는데, 안드로이드에서 SELinux가 기본적으로 Enforcing 상태입니다.

SELinux 때문에 사용자가 만든 service가 Enforcing 상태에서 실행이 되지 않습니다.

adb shell에서 부팅 이후에

setenforce 0 명령어를 이용하면 Permissive 상태로 전환이 가능합니다.

그러나 재부팅을 하게 되면 다시 Enforcing 상태로 되돌아옵니다.

 

그래서 SDLinux 보안 정책에 맞게 우리가 만든 스크립트를 등록해 주는 방법이 밑의

https://source.android.com/security/selinux/device-policy

사이트의 Label new services and address denials 파트에 나와있습니다.

 

저는 이 방법 대신에 SELinux가 기본적으로 Permissive 상태로 동작을 하도록

안드로이드 BSP를 수정 후에 build 하는 방법을 사용하였습니다.

 

방법은 

 BSP의 device/제조사/보드/BoardConfig.mk 파일에

BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive

이 명령어를 추가시키고 make를 진행하면 

SELinux의 기본 모드가 Permissive인 상태가 됩니다.

 

5. 기타

윈도우 환경이나 리눅스 환경이 아닌 안드로이드 환경에서,

특히 커스텀 빌드된 BSP를 사용하였기 때문에 범용적으로 무조건 동작을 한다는 보장은 없습니다.

하지만 하루 넘게 고생해서 해결했던 문제이고,

많은 사람들이 앞으로 저와 같은 문제를 겪을 것으로 예상되기에

저의 포스팅을 참고하여서 원하는 목적 꼭 이루시긴 바랍니다.

 

이번 포스팅에서 올린 참고 사이트의 경우 

제가 이 문제를 해결하는 과정에서 큰 도움을 준 사이트입니다.

꼭 참고하시길 바랍니다.

 

문의 사항이나 오류&기타 질문은 댓글로 남겨 주시면 바로 반영하겠습니다.

 

 

 

X. 참고 사이트

https://discuss.96boards.org/t/not-able-to-run-the-script-from-init-rc/2732/4

http://vlee.kr/1466

https://bradkim06.tistory.com/entry/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Root-%EA%B6%8C%ED%95%9C-%EB%B6%80%ED%8C%85-%EC%84%A4%EC%A0%95

http://www.dreamy.pe.kr/zbxe/CodeClip/164851

https://discuss.96boards.org/t/not-able-to-run-the-script-from-init-rc/2732/10

 

- selinux

https://rookiecj.tistory.com/283

http://shincdevnote.blogspot.com/2017/04/se-for-android.html

댓글

Designed by JB FACTORY