Por que o deslocamento específico na montagem de loop? [duplicado]

1

Estou estudando o comando aqui no post sobre Como compilar e instalar o Qt, qwt e overclock do RPI

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

Eu faço fdisk 2016-02-26-raspbian-jessie.img e recebo

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       

Por que o deslocamento é específico na montagem?

    
por Léo Léopold Hertz 준영 16.03.2016 / 12:43

2 respostas

6

Como 62914560 aponta exatamente 60MiB para o arquivo, acho que o melhor palpite é que a imagem do disco Raspian seja particionada. O deslocamento informa mount (ou, na verdade, losetup ) o deslocamento real do sistema de arquivos root /boot resp os arquivos de bootloader / firmware).

O problema aqui é que, embora o driver loop realmente suporte imagens particionadas, o número de partições máximas por loop dispositivo deve ser especificado como um parâmetro do módulo ao carregar o módulo (ou na linha de comando do kernel) . Como há muitas distribuições por aí que não fazem isso por padrão, ...,offset=XXX é a maneira mais confiável de lidar com imagens particionadas quando loop usa o parâmetro padrão (que é 0, portanto, nenhum suporte a partições).

Você pode testar se o driver loop foi carregado com suporte a partições pesquisando /sys/module/loop/parameters/max_part . No meu sistema atual (ArchLinux), após carregar loop sem parâmetros, isto é:

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

Para ativar o suporte ao particionamento, você terá que descarregar loop e carregá-lo novamente com o valor desejado para as opções max_part , por exemplo,

# modprobe -r loop
# modprobe loop max_part=8

Depois disso, você pode tentar configurar manualmente o dispositivo de loop para sua imagem, fazendo

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

Agora, você não deve ver apenas /dev/loop0 representando a imagem inteira, mas (contanto que minha teoria esteja correta;) também tenha /dev/loop0p1 , /dev/loop0p2 , etc., para todas as partições na imagem. / p>

Editar:

Se você quiser fazer isso sozinho, da maneira tediosa (sugiro simplesmente recarregar loop com a opção max_part correta e simplesmente usar as partições), você pode descobrir qual compensação é necessária usando fdisk diretamente no arquivo de imagem (mostrado com um ISO do ArchLinux, como eu tinha na mão, mas a idéia é a mesma):

$ 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)

A segunda partição começa no setor 172 com um tamanho de setor de 512 bytes. Multiplicando ambos os valores, você recebe o offset em bytes, assim, para montar a partição, você usará:

# 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

Voila.

    
por 16.03.2016 / 13:09
1

De acordo com a página do manual "losetup".

-o, --offset offset the data start is moved offset bytes into the specified file or device

por exemplo. Se você tem "dd" de um dispositivo, então você pode montar qualquer uma de suas partições usando a opção offset .

Este valor de compensação é calculado multiplicando o valor inicial da partição por tamanho de setor

por exemplo,

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

ATUALIZAÇÃO:

040614.dd é criado pelo seguinte comando:

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
    
por 16.03.2016 / 13:02

Tags