computerの日記

Cisco,SHELL,C,Qt,C++,Linux,ネットワーク,Windows Scriptなどの発言です

raspberry pi で使用する sdcard.img を編集する方法

raspberry pi で使用する sdcard.img の中をいじりたいときがあります。その方法を紹介します。

1. 手動で頑張る方法

普通に、fdisk などで内容を確認します。以下は一例です。

$ fdisk -lu sdcard.img
ディスク sdcard.img: 532 MiB, 557842944 バイト, 1089537 セクタ
単位: セクタ (1 * 512 = 512 バイト)
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O サイズ (最小 / 推奨): 512 バイト / 512 バイト
ディスクラベルのタイプ: dos
ディスク識別子: 0x00000000

バイス 起動 開始位置 終了位置 セクタ サイズ Id タイプ
sdcard.img1 * 1 65536 65536 32M c W95 FAT32 (LBA)
sdcard.img2 65537 1089536 1024000 500M 83 Linux

cfdisk だと、一見してファイルタイプも表示されるので、一見してわかりやすいでしょう(略)。

スタートセクターを指定してマウントする必要があります。まず、file コマンドで sdcard.img を確認します。

$ file sdcard.img
sdcard.img: DOS/MBR boot sector; partition 1 : ID=0xc, active, start-CHS (0x0,0,2), end-CHS (0x4,20,17), startsector 1, 65536 sectors; partition 2 : ID=0x83, start-CHS (0x4,20,18), end-CHS (0x43,209,15), startsector 65537, 1024000 sectors

 二つのパーティションがありますので、これらをそれぞれ作成したマウントポイントにマウントすれば OK です。こつは、startsector に 512 をかけることです。

上記の表示結果を使用した一例です。

partition 1 を /mnt/sdcard1 にマウントする例です。

 # mount -t vfat -o loop,offset=512 sdcard.img /mnt/sdcard1

 編集後は、umount してください。

# umount /mnt/sdcard1

parttion 2 を /mnt/sdcard2 にマウントする例です。

# mount -t ext4 -o loop,offset=33554944 sdcard.img /mnt/sdcard2

2. kpartx を利用する方法

sdcard.img を /dev/mapper にマップさせます。

# kpartx -av sdcard.img
add map loop0p1 (253:3): 0 65536 linear 7:0 1
add map loop0p2 (253:4): 0 1024000 linear 7:0 65537

/dev/mapper を確認します。

# ll /dev/mapper
合計 0
crw-------. 1 root root 10, 236 10月 9 18:49 control
lrwxrwxrwx. 1 root root 7 10月 9 18:49 fedora-home -> ../dm-2
lrwxrwxrwx. 1 root root 7 10月 9 18:49 fedora-root -> ../dm-0
lrwxrwxrwx. 1 root root 7 10月 9 18:49 fedora-swap -> ../dm-1
lrwxrwxrwx. 1 root root 7 10月 10 07:43 loop0p1 -> ../dm-3
lrwxrwxrwx. 1 root root 7 10月 10 07:43 loop0p2 -> ../dm-4

細部を確認します。

# dmsetup info

Name: loop0p2
State: ACTIVE
Read Ahead: 256
Tables present: LIVE
Open count: 0
Event number: 0
Major, minor: 253, 4
Number of targets: 1
UUID: part2-devnode_7:0_Wh5pYvM

Name: loop0p1
State: ACTIVE
Read Ahead: 256
Tables present: LIVE
Open count: 0
Event number: 0
Major, minor: 253, 3
Number of targets: 1
UUID: part1-devnode_7:0_Wh5pYvM

/dev/mapper/loop0p1 をマウントしてみます。

# mount /dev/mapper/loop0p1 /mnt/sdcard1
# ls /mnt/sdcard1
bcm2709-rpi-2-b.dtb bootcode.bin cmdline.txt config.txt fixup.dat start.elf zImage

(参考)

https://www.raspberrypi.org/forums/viewtopic.php?t=28860

https://qiita.com/spicemanjp/items/1998a3f68cb369651584