본문 바로가기
ОКБ (실험 설계국)/Trouble Shooting

3. Busybox에 Systemctl 명령어가 보이지 않는데...

by Rosmary 2019. 7. 28.
728x90
반응형

리눅스 설치를 위해 스마트폰을 루팅한 지 한참의 시간의 흘렀음에도, 지금까지 리눅스 설치를 위해 아무것도 한 것이 없었다. 아무래도 40만원짜리 시험인 CCNA 통과가 급했기 때문에, 스마트폰에 리눅스를 설치하는 것에 시간을 투자할 수 없었던 것이 사실이다. 그런데, 오늘 스마트 폰에 리눅스 설치를 진행해보니, 너무 빨리 마무리되서 당황스럽...

 

우선 설치는 다음과 같이 진행했다.

 

1. 핸드폰 루팅 진행(지난 트러블슈팅 포스팅에 관련 내용을 작성해 놓았다) -> https://whitewing4139.tistory.com/19

 

2. Linux Deploy 및 Busybox 어플리케이션 설치

 

   *  Linux Deploy를 먼저 설치해야한다. Linux Deploy가 지정한 경로로 다운받은 Busybox 어플리케이션만 인식하기 때문인데, 무슨 이유 때문에 특정 경로로 다운받은 어플리케이션만 작동하는지는 필자가 알 수 없다.

 

3. Busybox 어플리케이션 구동 후, Busybox 설치

4. Linux Deploy 어플리케이션 구동 후, 설치할 OS에 대한 설정 작업 진행

 

   *  필자는 Linux Deploy 설정 탭에서, PATH 경로를 Busybox 설치 위치로 지정해 준 것, 그리고 리눅스 설치 파일을 SD 카드에 저장되도록 만든 것 이외에는 설정을 크게 바꾼 것이 없다.

 

5. 설치 및 리눅스 서비스 시작 버튼 클릭

6. 노트북에서 Xshell을 이용해 핸드폰 리눅스 접속 확인.

 

 

다행히 문제 없이 로그인이 이뤄졌다.

 

로그인이 이루어지고, 필자가 향후 개인 서버 구축 과정에서 사용할 기본 명령어가 잘 작동하는지 확인하기 위해 이런 저런 명령어를 입력하며 결과를 확인하고 있는 와중에...  또 다시 트러블슈팅할 거리가 생겨버렸다. 바로 아래의 녀석이다...

 

일반적인 상태라면 systemctl(CentOS 6버전 이하에서는 service 라는 명령어로 사용된다)은 저 명령어를 입력했을 때, httpd 서비스의 구동 상태를 모니터로 출력시켜야 정상인데, 이 녀석은 chroot 내에서 systemctl이 동작하고 있다면서 필자의 명령을 깡그리 무시한다. 필자가 현 상태에서 확신할 수 있는 한 가지는, 명령어는 인식이 되지만 알 수 없는 이유로 인해 실행이 제한되고 있다는 것이다(인식되지 않는 명령어가 입력되면 컴퓨터는 존재하지 않는 명령어라는 경고 문구를 보내기 때문이다).

 

필자가 먼저 확인한 것은 systemctl 명령의 퍼미션 값과 소유 계정이었다. (가능성이 희박하지만) root의 상위에 동작하는 무언가가 systemctl 명령 실행을 방해하고 있지 않을까 라는 생각에서였다. 확인해 본 결과, 별 이상이 없다.

 

저 명령어의 소유계정은, 현재 필자가 사용하고 있는 root 계정이고, 실행 권한 역시 rwx 모두 잘 주어져 있다. 아마 다른 곳에 이유가 있을 것이다.

 

chroot에 대해 찾아보았다. 

 

< 출처: ArchWiki >

현재 필자가 사용하는 리눅스는 안드로이드 스마트폰에 설치된 리눅스다. 조금 더 정리하자면, 스마트폰은 필자가 리눅스를 설치하기 이전에 이미 리눅스(안드로이드의 근간이 리눅스다)로 구성된 하나의 시스템이 존재하고 있었고, 필자가 여기에 추가로 일반 리눅스를 설치한 것이다. 따라서, 필자가 현재 사용하는 root 계정의 상위에, 필자가 현재 사용하는 root 계정으로는 일반적인 접근이 불가능한 스마트폰 폴더가 존재하며, systemctl 명령어가 작동하지 않는 이유는, 이 공간과 관련이 있을 것이라는 생각이 들었다.

 

< 현재의 상황을 그림으로 표시하자면 이 정도로 표현할 수 있을 듯 하다 >

 

그럼, 현재 필자가 사용하는 리눅스 공간을 벗어나, 스마트폰 폴더로 이동하는 방법에는 무엇이 있을까?? 혹시 chroot라는 이름과 관련된 무언가가 설치된 리눅스 내에 존재하지 않을까?? 이런 결론에 도달하자, 아래와 같은 명령어로 필자의 생각을 확인해본다.

 

 

확인해보니, chroot라는 명령어와 더불어, unchroot라는 명령어도 보인다. chroot는 특정 프로세스가 특정 디렉토리를 루트로 인식하도록 만들어, 가짜 루트 상위 폴더로의 접근을 막도록 만드는 명령어니, unroot는 그 반대의 기능을 지니고 있을 것이다. 한번도 사용해 본 적 없는 unchroot 명령어를 입력해본다. 그러자 프롬프트 모양이 바뀐다. 혹시나 하는 마음에 ls -lh 명령어를 치니...

 

< 빨간 박스의 폴더는 현재 필자가 위치한 곳이 스마트폰의 루트 디렉토리임을 알려준다 >

unchroot 명령어는, 필자의 계정 - root - 이 루트 폴더라고 인식하는 스마트폰 내 폴더의 상위 디렉토리 내용을 출력해준다. 다행히 문제 해결을 위한 첫 단서는 빨리 찾았다. 

 

다음으로 생각해볼 문제는 스마트폰 루트 내에서 사용 가능한 명령어 리스트와 리눅스 내에서 사용 가능한 명령어 리스트를 확인하는 작업이었다. 일반적인 리눅스에서 시스템 명령어가 위치하는 sbin 폴더를 먼저 살펴보았다. 그러나 해당 폴더에서는 일반적인 리눅스의 명령어 대신, 알 수 없는 명령어 파일 2개만 덩그러니 놓여 있다.

 

필자의 예상과 달리, sbin에는 명령어가 하나도 존재하지 않지만, 명령어가 어딘가에는 위치하고 있을 것이다. 가장 많이 사용되는 명령어들이 어디에 위치하는지, which 명령어를 사용해 찾아보기로 했다. 

 

가장 기본적인 명령어 세 개가, 모두 동일한 폴더 내에 위치해 있다. 이동 후, ls -lh 명령어를 입력해 보았다.

 

특이하게도, 일반적인 리눅스 명령어 파일과 달리, 안드로이드 리눅스 명령어는 모두 busybox라고 불리는 녀석에게 심볼릭 링크가 걸려 있다... 그리고 이 폴더 내에는 systemctl이라는 명령어가 존재하지 않는다. CentOS 7 이전에 systemctl의 역할을 했던 service 명령어도 마찬가지로 보이지 않는다.

 

이를 통해 유추할 수 있는 것은, busybox가 핸드폰에 설치된 CentOS7의 명령어를 실행하는데, 큰 역할을 한다는 것이고, 이 busybox 내에는 systemctl이나 service 명령어는 컴파일되어 있지 않다는 것이다. 이를 확인하기 위해, busybox를 실행해 보았다.

 

위의 빨간 박스 안의 명령어는 busybox를 통해 사용할 수 있는 명령어 모음이다. 유추했던대로, systemctl과 service는 보이지 않는다... 즉, 핸드폰에 설치한 현재의 리눅스로는 service나 systemctl 명령어로 서비스 구동이 불가능하다.......

 

해외에서는 이 문제를 어떻게 해결했는지 열심히 구글링해 보았지만... 이들 역시, 속 시원한 대답을 주지는 못한다. 제조사인 meefik에서 busybox를 만들때, systemd와 관련된 것을 제외했다는 것을 구글링을 통해 알게 되었는데, 프로그램 자체를 다시 설정하고 컴파일하지 않는 이상 systemctl이나 service는 수행하기 어려울 듯 하다.

 

별 수 없이, 핸드폰에서 리눅스 서비스를 실행하기 위해서는 스크립트를 직접 백그라운드로 구동시키는 것 외에 방법이 없을 것 같다...

 

 

FIN.

반응형

댓글