web-dev-qa-db-ja.com

特定のループマウントでオフセットする理由

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       

マウントでオフセットが特定されるのはなぜですか?

62914560はファイルに正確に60MiBをポイントしているので、ラスピアンディスクイメージが実際にパーティション分割されていると思います。オフセットは、mount(または実際にはlosetup)に、rootファイルシステムの実際のオフセットを通知します(これは2つのパーティションの2番目で、最初のパーティションが最も-おそらく/bootまたはブートローダー/ファームウェアファイル)。

ここでの問題は、loopドライバーが実際にパーティション化されたイメージをサポートしている場合でも、loopデバイスあたりの最大パーティション数を、モジュールのロード時に(またはカーネルコマンドラインで)モジュールパラメーターとして指定する必要があることです。デフォルトではこれを行わないディストリビューションがたくさんあるので、loopがデフォルトのパラメーター(0であるため、パーティションのサポートがない)を使用する場合、...,offset=XXXはパーティション化されたイメージに対処する最も信頼できる方法です。

/sys/module/loop/parameters/max_partを調べることにより、loopドライバーにパーティションサポートが読み込まれているかどうかをテストできます。現在のシステム(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/loop0p2などもあるはずです。画像。

編集:

これを退屈な方法で自分で行いたい場合(正しいmax_partオプションを指定してloopをリ​​ロードし、パーティションを使用するだけをお勧めします)、画像で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)

2番目のパーティションは、セクターサイズ512バイトのセクター172から始まります。両方の値を乗算すると、オフセットがバイト単位で得られます。したがって、パーティションをマウントするには、次を使用します。

# 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

出来上がり。

9
Andreas Wiese

「losetup」のmanページに従って。

-o、--offset offsetデータの開始は、指定されたファイルまたはデバイスにoffsetバイト移動されます。

例えばデバイスの "dd"がある場合は、offsetオプションを使用して、任意のデバイスのパーティションをマウントできます。

このオフセット値は、パーティションの開始値にセクターサイズを掛けて計算されます。

例えば.

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
1
SHW