2 min read

loop mount

USB 스틱이나 마이크로SD 카드에 구워서 사용하는 배포판은 미디어 전체를 이미지 파일(.img) 형식으로 만들어 배포하는 경우가 많다. 이런 이미지 파일 내부에 직접 접근하여 내용을 수정해야 할 때가 있다. 이럴 때 loop mount를 사용한다.

우선 마운트 하려는 파티션의 시작 위치를 찾아야 한다. fdisk를 이용하여 이미지 파일 내부의 파티션 구조를 출력한다. 예제로 사용한 파일은 라즈베리파이OS 라이트 버전(2020년 12월)이다. GPT 방식으로 배포되는 이미지는 gdisk 를 사용하면 된다.

$ fdisk -l path/to/image/2020-12-02-raspios-buster-armhf-lite.img
Disk 2020-12-02-raspios-buster-armhf-lite.img: 1.75 GiB, 1858076672 bytes, 3629056 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x067e19d7

Device                                    Boot  Start     End Sectors  Size Id Type
2020-12-02-raspios-buster-armhf-lite.img1        8192  532479  524288  256M  c W95 FAT32 (LBA)
2020-12-02-raspios-buster-armhf-lite.img2      532480 3629055 3096576  1.5G 83 Linux

여기에서 논리 섹터의 크기, 그리고 마운트 하려는 파티션의 시작 섹터(Start) 위치를 확인한다. 예를 들어, 위 이미지에서 논리 섹터 크기는 512 bytes이고, 첫 번째 파티션은 8192번 섹터에서 시작한다. 계산기를 두드려 보아도 좋고, 후술할 방법으로 쉘 문법으로 바로 계산해 넣을 수도 있다.

이제 마운트 명령어를 주면 된다. 이 때 옵션으로 loop mount를 주고, offset으로 파티션의 오프셋 값을 주면 된다. 8192는 위에서 확인한 시작 섹터 위치이며, 512는 논리 섹터의 크기이다.

$ sudo mount -o loop,offset=$((8192*512)) path/to/image_file.img /mnt/boot

두 번째 파티션을 마운트 하려면 다음처럼 주면 된다. 원리는 같다.

$ sudo mount -o loop,offset=$((532480*512)) path/to/image_file.img /mnt/sdroot