원문 : 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
'Programming > Linux Tip' 카테고리의 다른 글
patch 적용하기, diff, sdiff (0) | 2018.11.08 |
---|---|
MBR 혹은 partition table dump 명령어, device node 로 부터 ufs, emmc dump (0) | 2018.10.31 |
linux partitions (sda, sda1, sda2...) (0) | 2018.10.29 |
Calculation real size from results of 'df' and 'stat' (0) | 2017.03.13 |
Can't access samba directory by windows after installing wine (0) | 2017.03.04 |