본문 바로가기

안드로이드/Nexus 5

안드로이드에서 CIFS이용하여 스트리밍 + 용량확장하기(바뀐 명령어 사용법)

긴급추가!


SELinux Mode Changer어플리케이션(클릭시 마켓이동)을 통해서 혹은 수동으로 SELinux상태를 Enforcing에서 Permissive로 바꾸어줘야 쓰기(Permission 2)가 가능합니다.



추가 1


접속하시는분들 보니 "용량 확장"으로 들어오시는 분들이 많습니다.

핸드폰의 물리적인 하드웨어 용량을 늘려주는건 아니고 samba(윈도우 파일/폴더 공유기능, 윈도우가 아니더라도..)를 통해 공유된 공간을 마치 핸드폰에 연결된것처럼 마운트시켜 공유된 공간의 용량만큼 논리적으로 추가된다고 생각하시면 됩니다.




추가 2




추가 3 - 외부에서 연결






안녕하세요~ k_mjg입니다!


오늘은 안드로이드OS에서 CIFS을 사용하는 방법을 알려드리겠습니다.



CIFS란?


원래 CIFS(Common Internet File System)는 2011년 갤럭시 S 1때부터 커스텀 커널에 추가되어 몇 유저들이 사용하던 기능이었었는데요,(이때당시엔 리눅스에 대한 개념이 하나도 없었기에 이런게 있었는지도 몰랐죠..) CIFS는 리눅스같은 Windows체계의 운영체제가 아니어도 파일을 samba로 공유하는 호스트에 "마운트"방식으로 연결하는 기능입니다.


여기서 주목할점은 바로 "마운트"방식 입니다.

대게 다른 파일매니져같은데 samba서버에 접속해서 파일전송을 할수 있는 기능들이 있긴합니다만, 이경우 파일주소를 통해 스트리밍 플레이어로 동영상이나 음악재생이 가능하지만 실제 디바이스에 파일이 있는것처럼 이용할수는 없습니다. 하지만 CIFS를 이용하면 지정경로에 마운트되어 디바이스에 물리적으로 연결된것같이(OTG처럼) 스트리밍 플레이어가 아니더라도 이용하실 수 있게 됩니다.(Android/obb폴더로 마운트시키면 용량확보에 좋겠죠. 하지만 네트워크 속도영향과 불안정한 점이 있으므로 가급적 피하는게...)


준비물


우선 CIFS모듈이 포함된 커널 혹은 자신의 기계에 맞게 컴파일된 모듈파일(cifs.ko), 연결할 대상(HOST;Windows탐색기에서 우클릭 - [속성] - [공유]탭 - [고급 공유] - [선택한 폴더를 공유], 공유이름설정, [권한]등등 - [확인] - [적용]), 안드로이드폰에서 터미널에뮬레이터ADB연결, SSH, Scripter등을 통한 명령어 입력환경, Busybox 최신버젼(busybox installer를 이용합니다. JRummy껀 업데이트가 안되는듯합니다..), SuperSU 1.93이상(핵심은 이겁니다. 1.93부터 SELinux적용되어있습니다.)


cifs모듈에 관한 고찰..


CIFS를 이용하려면 cifs모듈이 커널에 내장되어있거나 기종에 맞게 누군가가 이미 컴파일해놓은 cifs.ko모듈파일 혹은 직접 컴파일하는 방법을 거쳐야 이용할수있습니다.

저는 모듈이 내장되어있는지도 모르고 앱에서 없다고 오류인식하는걸 그대로 믿고서 ko파일을 찾아보았는데도 없어서 직접 컴파일까지 해보았습니다..

여튼 커널에 내장되어있는지 확인하는 방법은

터미널 에뮬레이터나 ADB에서
필요시 $ su
$ cat /proc/filesystems
을 하시면 ($는 계정상태입니다. 안적으셔도 됩니다.)
접어논것과 비슷한 결과를 보실수 있습니다.
여기서 nodev    cifs가 있다면 가능한겁니다. (있으면 바로 다음 섹션으로 넘어가세요.)

없으시다면 구글링이나 네이버링해서 cifs.ko 파일(정확하게 같은기종이어야되는지는 모르겠는데 사용하고있는 커널과 같은 버젼, 아키텍쳐로 만들어진 모듈파일만 사용가능합니다.)을 찾아서 # insmod /sdcard/[경로]/cifs.ko 명령어로 로드시켜야됩니다. 아무 cifs.ko파일 가져다가 쓰시면 불러올수없다고만 뜹니다..

직접 컴파일하는건 매우매우 귀찮고 처음하시는분들은 복잡하고 오래걸리는 일입니다. -> 커널만 하는거라서 컴파일시간은 5분정도면 되겠다만..
구글에서 samba.org를 찾아 들어가셔서 우측메뉴에 linux.samba.org인가 로 가셔서 cifs 소스를 다운받아서 커널폴더에 넣고 Android.mk파일을 구성하고 머리터지는 일을 해야됩니다.
하지만 이건 이미 존재하는 소스에서 긁어오는게 제일 편하죠!
추후 필요하신분이 계시다면 작업 파일에서 따로 긁어서 올려드리겠습니다. (계속 진행하시고싶으시면 댓글을, 아니라면 포기하시면 됩니다..)


명령어 입력



터미널 에뮬레이터나 ADB등으로 입력합니다.

연결시

$ su --mount-master

# busybox mount -t cifs none /storage/cifs -o unc=\\\\192,168.x.x\\sharename,ip=192.168.x.x,noserverino,iocharset=utf8,file_mode=0777,dir_mode=0777,username=AccountName,password=AccountPassword


연결 해제시

# umount /storage/cifs


$은 일반계정상태, #은 root계정상태입니다. 고로 따라적지 아니합니다..


설명들어갑니다.

1) su

1-1) --mount-master : 이건 안드로이드 4.2부터 멀티유저라는 개념과 SELinux라는 개념이 들어가면서부터 마운트시 마운트시킨 셸이나 앱에서만 마운트된것이 확인가능하고 그 외의 어플에서는 아무런 파일도 보이지 않게 되는데 이것을 해결하기위해 SuperSU제작자이신 Chainfire님이 따로 만드신 옵션입니다. G+에 가면 해당 내용에대한 언급이 있습니다.


2) busybox 샬랄랄라

2-1) -t cifs : 마운트하는 dev의 포맷형태(포맷한다는게 아닙니다 --..)를 지정합니다. 여기선 cifs로 지정합니다.

2-2) none : 원래 여기에 HOST의 주소와 경로를 적어줬었는데 어떤 이유에서인지 에러가 납니다. CIFS모듈이 업데이트되면서 버그가 생겼나봅니다..(직접 컴파일해봤는데.. 그런거같음..) unc에서 다시 다룹니다.

2-3) /storage/cifs : 마운트될 경로를 지정합니다. (AOSP는 엿같아서 커널도 수정해야됩니다. ㅋ..)

2-4) -o : 옵션을 줍니다.

2-5) unc=\\\\192.168.x.x\\sharename : 위에 none이라고 적은데서 언급했죠. 정확한 이유는 모르겠지만 로그들을 뒤져보았을때 none이라 쓴곳에 주소와 경로를 적어도 unc로 값을 받아오질 못하더군요. 그래서 unc라는 옵션에 직접 넣어줍니다. 192.168.x.x는 호스트의 주소고 sharename은 준비물에서 설정한대로 설정한 폴더이름입니다. 윈도우에서 공유한 폴더는 대게 소문자로 변환됩니다. 역슬래시(\)는 꼭 두번씩 씁니다. 이유는 모릅니다.. 윈도우에서도 네트워크 연결할때 \\쓰듯이 그런건가봅니다..

2-6) ip=192.168.x.x : 궂이 안적으셔도 됩니다. ip를 적습니다.

2-7) noserverinio : 이것도 궂이 안적으셔도 됩니다. 로그를 보면 뭐라뭐라하면서 이 옵션을 쓰는걸 추천한다고 합니다..

2-8) iocharset=utf8 : 이건 꼭 적어주셔야됩니다. 한글같은 UTF8문자를 디코딩해줍니다.(글자깨짐방지)

2-9) file_mode=0777,dir_mode=0777 : 읽고 쓰기권한을 주는겁니다. 꼭 해주셔야됩니다. 안하시면 스트리밍플레이정도밖에 못합니다.(읽기만 가능)

2-10) username=AccountName : 윈도우에서 설정했다면 윈도우에서 사용하는 계정을 입력합니다.(윈도우 8/8.1에서 Microsoft계정으로 로그인하시면 사용한 이메일을 적으시면됩니다. ex)cifs@google.com)

2-11) password=AccountPassword : 계정에 대한 비밀번호를 입력합니다. 비밀번호가 없는 경우가 있을지도 모르는데 테스트를 해보지 못해 잘 모르겠습니다. 아예적지말거나 none라고 적어보세요.


옵션줄에서 여러 옵션을 줄땐 ,(쉼표)를 쓰고 띄어쓰지 않습니다.

마운트 해제 또한 su --mount-master 바이너리(?)에서 작업합니다.

설명이 엄청 깁니다..


마무으리


오늘도 뻘짓을 했습니다.

CIFS에 대해서 알게된게 OTG로 사용하던 메모리 용량 꽉참 + 매번 연결하기 귀찮음 + 내장메모리는 폭발 직전 + NAS사면 어떻게 활용하지 + NAS사고싶어..

여튼 이로인해 내장메모리가 32G밖에 되지않는 망할 망치머리(Nexus5-Codename:Hammerhead)가 10TB가 넘어가는 아주 좋은 경험을 하고있고 TitaniumBackup, 음악은 끊김없이 들을수 있고(Flac 초당 131/kbps 전송량이 보이네요. 3메가짜리 음악은 가금씩 그래프 올라가고.. 하지만 로딩시간이 극혐.. 외부에서 사용시 데이터 사용량에 주의 바랍니다.) 용량먹는걸 서버에서 바로 연결할수 있어 편합니다.


실은 사용하는거 자체는 뻘짓이 아니지만

펼쳐보기 싫으면 이것만 좀 읽어줘

총 비용시간 2.7주


추후 vpn을 통해 외부에서도 연결가능하게하는방법, 커널제작 등 필요할듯한 정보에 대해 포스팅할 계획이 있습니다. -> 아마 요청이 있을시..? -> 군대에 가게되어 빨리 작성해주고 튑니다.. ㅌㅌ.. 게시글 맨 상단 추가 3에 작성했습니다.


유용한 정보가 되길 바랍니다. 하하..