본문 바로가기

Programming/Linux Tip

loop device and losetup

원문 : https://cafe.naver.com/taskers/10933


loop는 이미지파일을 블록 디바이스로 인식되게 해주는 디바이스 드라이버입니다.

즉, 이미지 파일을 마운트 시켜줍니다.


쉽게 말해서 윈도우즈의 데몬툴이나 시디스페이스 같은 것이라 보면 됩니다.

그러나 그 기능과 성능은 훨씬 강력합니다.


아래는 loop를 이용하여 100MB짜리 vfat 이미지를 마운트하는 예제입니다.


진행하려면 비지박스와 루팅은 필수입니다.

터미널이나 ADB Shell에서 진행하세요.


1. 일단 dd를 이용해서 100메가짜리 공파일을 뜹니다.


dd if=/dev/zero of=/mnt/sdcard/vdrive.img bs=1000000 count=100


dd : 덤프를 뜹니다. if=[덤프대상] of=[덤프결과]

/dev/zero : 특수파일입니다. "0000000…"이 무한대로 뻗어있는 그런 파일이죠. 

bs : 덤프 대상 파일을 한번에 몇단위 읽어올것인지 결정합니다. 1000000byte = 1MB 입니다.

count : 100번 뜹니다.


2. losetup으로 loop에 vdrive.img를 할당합니다.

losetup은 loop device를 관리하는 명령어입니다.


losetup -f     # f 옵션을 넣으면 현재 비어있는 첫번째 loop device를 알려줍니다.


비어있는 loop 디바이스는 보통 /dev/loop0 일 것입니다.

그럼 아래의 명령어를 입력해서 loop0에 vdrive.img를 할당해보면 됩니다.


losetup /dev/loop0 /mnt/sdcard/vdrive.img  


# 위의 명령어가 에러를 낸다면 아래 명령어를 입력하세요.

losetup /dev/block/loop0 /sdcard/vdrive.img 


# 옵티머스류에서는 /dev/loop0가 free device라고 출력되더라도, 실제로는 존재하지 않습니다. 실제 존재하는 loop device는 /dev/block/loop0이지요. 때문에 /dev/block/loop0에 vdrive.img를 할당해야합니다. 그런데 이렇게 /dev/block/loop0에 vdrive.img를 할당하면, 신기하게도 이때 /dev/loop0 파일이 생성됩니다.




이제 loop device에 이미지가 할당되었습니다.

이제부터는 vdrive.img를 블록디바이스라고 생각하고 작업을 진행하면 됩니다.


3. 디스크 이미지로 사용할 수 있도록 vfat으로 파일을 포맷합니다.

아래 명령으로 포맷합니다.


busybox mkfs.vfat -F 32 -S 4096 /dev/loop0


# 위의 명령어가 에러를 낸다면 아래 명령어를 입력하세요.

busybox mkfs.vfat -F 32 -S 4096 /dev/block/loop0


이제 포맷한 vdrive.img를 mount 합니다.


# 마운트 준비 작업

busybox mount -o remount,rw /

mkdir /mnt/sdcard3

chmod 775 /mnt/sdcard3


# 마운트 방법 1 (losetup으로 할당했던 loop0를 마운트합니다)

busybox mount -t vfat /dev/loop0 /mnt/sdcard3


#마운트 방법 2 (알아서 비어있는 loop device를 찾아서 마운트해줍니다. loop1에 할당되겠죠)

busybox mount -o loop /sdcard/vdrive.img /mnt/sdcard3


이제 모든 설정이 끝났습니다.

100메가짜리 SD카드가 잘 있나 확인해보세요.


4. 다음 부팅 시 이용하려면

당연하게도 재부팅 되면 마운트가 풀립니다.

다음 부팅부터는 다음의 명령어만 입력하면 됩니다.


# 마운트 준비 작업

busybox mount -o remount,rw /

mkdir /mnt/sdcard3

chmod 775 /mnt/sdcard3


# 마운트 방법 2 (알아서 비어있는 loop device를 찾아서 마운트해줍니다. loop1에 할당되겠죠)

busybox mount -o loop /sdcard/vdrive.img /mnt/sdcard3


# 아래와 같이 마운트 옵션을 상세하게 걸 수도 있습니다. (sdcard 기본 옵션을 그대로 퍼와서)

busybox mount -o loop,rw,dirsync,nosuid,nodev,noexec,noatime,uid=1000,gid=1015,fmask=0002,dmask=0002,

allow_utime=0020,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro /sdcard/vdrive.img /mnt/sdcard3


5. 이미지를 PC에 연결하기

이렇게 생성된 vdrive.img를 PC에 연결해서 대용량 저장소 장치(UMS)로 마운트할 수도 있습니다.

(ICS+에서는 일단 UMS 기능부터 활성화해야합니다.)

# 일단 lun0를 찾습니다. (UMS로 연결시켜줄 파일)


find | grep lun0


# 나온 경로중에 ~/lun0/file 이라고 써있는 것을 찾습니다. 그리고 아래와 같이 입력합니다.

echo "/dev/loop0" > /sys/devices/platform/msm_hsusb/gadget/lun0/file  # 옵이이의 lun0 경로


# PC와 연결을 해지하려면 다음을 입력하여 lun0 파일을 비웁니다.

echo "" > /sys/devices/platform/msm_hsusb/gadget/lun0/file


끝이네요. 이 loop device의 활용법은 각자 찾아보시길...

ICS에서 내장SD까지 UMS로 만드는 프로젝트를 구상중인데, 이걸 써먹을 수 있지 않을까하고 생각 중입니다.

그리고 <내장SD - 외장SD 경로 교환>에도 활용해 볼 계획이고요.


덧1) 첨부파일엔 위에서 나열한 명령어 목록이 들어있습니다.

덧2) 이 모든 작업들이 모두 파일 액세스로 이루어졌다는 것이 흥미로운 점입니다.

/dev/zero, loop device, block device, lun0... 모든것이 파일이었죠.


Loop Device

 http://icarus21.tistory.com/entry/Loop-Device


mount -o loop 옵션

 http://damduc.tistory.com/276


Android: Mount an image file

 http://www.techpository.com/?page_id=1201


리눅스 파일 시스템 분석 - 계층적인 구조체 기반 검토

 http://www.ibm.com/developerworks/kr/library/l-linux-filesystem/


mkfs.vfat 설명

 http://linux.about.com/od/embedded/l/blcmdl8_mkfsvfa.htm