루프 설치에서 특정 오프셋을 원하는 이유는 무엇입니까? [복사]

루프 설치에서 특정 오프셋을 원하는 이유는 무엇입니까? [복사]

명령을 수행 중입니다.여기에 관한 게시물에서Qt, qwt 및 오버클럭 RPI를 컴파일하고 설치하는 방법

sudo mount -o loop,offset=62914560
<date>-wheezy-raspbian.img /mnt/rasp-pi-rootfs

나는 fdisk 2016-02-26-raspbian-jessie.img하고 나는 얻는다

Disk: 2016-02-26-raspbian-jessie.img    geometry: 976/128/63 [7870464 sectors]  
Signature: 0xAA55  
     Starting       Ending  
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]  
------------------------------------------------------------------------  
 1: 0C    0 130   3 -    8  40  32 [      8192 -     122880] Win95 FAT32L  
 2: 83    8  40  33 -  489 232  63 [    131072 -    7739392] Linux files*  
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused        
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused       

마운트의 오프셋이 왜 특정합니까?

답변1

62914560은 파일에서 정확히 60MiB를 가리키므로 Raspian 디스크 이미지가 실제로 분할되어 있다고 추측할 수 있습니다. offset은 실제 오프셋을 알려줍니다 mount(또는 실제로 수행합니다 ).losetup뿌리파일 시스템(저는 이것이 두 파티션 중 두 번째라고 제안합니다. 첫 번째는 /boot부트로더/펌웨어 파일일 가능성이 높습니다).

여기서 문제는 loop드라이버가 실제로 파티션 이미지를 지원하더라도 모듈을 로드할 때(또는 커널 명령줄에서) 장치당 최대 파티션 수를 모듈 매개변수로 지정해야 한다는 것입니다 loop. 기본적으로 이를 수행하지 않는 배포판이 많기 때문에 이는 ...,offset=XXX기본 매개변수(0이므로 분할이 지원되지 않음)를 사용할 때 분할된 이미지를 처리하는 가장 안정적인 방법입니다.loop

loop드라이버를 살펴보면 드라이버에 파티션 지원이 로드되어 있는지 테스트 할 수 있습니다 /sys/module/loop/parameters/max_part. 현재 시스템(ArchLinux)에서 loop매개변수 없이 로드하는 방법은 다음과 같습니다.

$ cat /sys/module/loop/parameters/max_part
0

파티션 지원을 활성화하려면 마운트를 해제 loop하고 원하는 옵션 값으로 다시 로드 해야 합니다 max_part.

# modprobe -r loop
# modprobe loop max_part=8

그런 다음 다음을 수행하여 이미지의 루핑 장치를 수동으로 설정할 수 있습니다.

# losetup /dev/loop0 /path/to/<date>-wheezy-raspbian.img

/dev/loop0이제 전체 이미지뿐만 아니라 (내 이론이 올바른 한) 이미지의 모든 파티션 등에 대해서도 볼 수 있습니다 /dev/loop0p1. (스크립트 참조)/dev/loop0p2losetup).

편집하다:

이 작업을 지루한 방법으로 직접 수행하려면( loop올바른 max_part옵션을 사용하여 다시 로드하고 단순히 파티션을 사용하는 것이 좋습니다) fdisk이미지 파일(ArchLinux ISO가 표시됨)에서 직접 사용하여 필요한 오프셋을 찾을 수 있습니다. 나는 그것을 가지고 있었지만 아이디어는 동일합니다) :

$ fdisk -l archlinux-2016.03.01-dual.iso
Disk archlinux-2016.03.01-dual.iso: 268.3 MiB, 281339392 bytes, 549491 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: 0x2237702c

Device                         Boot Start     End Sectors  Size Id Type
archlinux-2016.03.01-dual.iso1 *        0 1452031 1452032  709M  0 Empty
archlinux-2016.03.01-dual.iso2        172   63659   63488   31M ef EFI (FAT-12/16/32)

두 번째 파티션은 섹터 172에서 시작하며 섹터 크기는 512바이트입니다. 두 값을 곱하면 바이트 단위의 오프셋이 제공되므로 파티션을 마운트하려면 다음을 사용합니다.

# mount -o loop,offset=$((172*512)) archlinux-2016.03.01-dual.iso /mnt
# ls -l /mnt
total 4
drwxr-xr-x 4 root root 2048 Mar  1 15:49 EFI
drwxr-xr-x 3 root root 2048 Mar  1 15:49 loader

바라보다.

답변2

"losetup" 매뉴얼 페이지에 따르면.

-o, --offset offset 지정된 파일이나 장치로 오프셋 바이트만큼 데이터 이동을 시작합니다.

예를 들어, 장치의 "dd"가 있는 경우 다음을 사용하여 해당 파티션을 마운트할 수 있습니다.오프셋옵션.

오프셋 값은 파티션의 시작 값에 섹터 크기를 곱하여 계산됩니다.

예를 들어

SHW@SHW:/tmp # fdisk -lu 040614.dd
Disk 040614.dd: 1.9 GiB, 2048385024 bytes, 4000752 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: 0x5324798e

Device                          Boot   Start     End Sectors  Size Id Type
040614.dd1 *       2048   30719   28672   14M 83 Linux
040614.dd2        30720 1054719 1024000  500M 83 Linux
040614.dd3      1054720 1095679   40960   20M 83 Linux

SHW@SHW:/tmp # mount -o loop,offset=`echo 1054720 \* 512|bc` 040614.dd1 /mnt/loop

고쳐 쓰다:

040614.dd다음 명령으로 생성되었습니다.

SHW@SHW:/tmp # fdisk -l /dev/sdb
Disk /dev/sdb: 1.9 GiB, 2048385024 bytes, 4000752 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: 0x5324798e

Device                          Boot   Start     End Sectors  Size Id Type
/dev/sdb1 *       2048   30719   28672   14M 83 Linux
/dev/sdb2        30720 1054719 1024000  500M 83 Linux
/dev/sdb3      1054720 1095679   40960   20M 83 Linux

SHW@SHW:/tmp # dd if=/dev/sdb of=040614.dd

관련 정보