tarballで.imgを生成する:/dev/loopデバイス

tarballで.imgを生成する:/dev/loopデバイス

私が見つけたら、スクリプトを使ってtarballから.imgを作成しようとしています。

#!/bin/bash

# Packages required
# dosfstools parted 
# Can be run on any Linux system
# loop.max_part=15 must be in kernel cmdline (cmdline.txt for rpi)
# then reboot

echo "creating image to fit on 2Gb card"
dd if=/dev/zero of=arch-rpi.img bs=1M count=1850

echo "Partitioning"
fdisk arch-rpi.img <<EOF
o
n
p
1

+100M

t
c
n
p
2


w
EOF

sleep 5

losetup -f arch-rpi.img
sleep 5

echo "Formatting vfat"
mkfs.vfat /dev/loop0p1
sleep 5
mkdir boot
echo "Mounting boot"
mount /dev/loop0p1 boot
echo "Installing"

echo "Formatting ext4"
mkfs.ext4 /dev/loop0p2
sleep 5
mkdir root
echo "Mounting root"
mount /dev/loop0p2 root

wget http://archlinuxarm.org/os/ArchLinuxARM-rpi-latest.tar.gz
echo "Installing"
bsdtar -xpf ArchLinuxARM-rpi-latest.tar.gz -C root
sync
mv root/boot/* boot
sync
umount boot root
losetup -d /dev/loop0p1
losetup -d /dev/loop0p1
losetup -d /dev/loop0
echo "All complete, image arch-rpi.img created, compressing...."
zip -9 arch-rpi.img.zip arch-rpi.img

私はRaspberry Pi - Raspbian Wheezyでこれをやっています。その行に達すると、mkfs.vfat /dev/loop0p1そのファイル/ディレクトリがないと表示されます。私はLinuxで.imgをループデバイスとしてマウントし、mkfsを使ってタールボール用のイメージを準備しようとしていることを十分に読んでいましたが、なぜLoop0p#ファイルがそうでないのかわかりません。そこに としてリストされていますfdisk -l。私が見つけたこのスクリプトが機能するようにするにはどうすればよいですか?

ベストアンサー1

losetup -P割り当てを作成するために使用されるループデバイスが必要です-P。それ以外の場合は、元のループデバイスを分割してからpartx -uカーネルのパーティションテーブルを更新する必要があります。デバイス/dev/loop0pが表示されます後ろにカーネルは、パーティションが実際に分割されていることを認識します。部分的にはその背後に隠れた意図かもしれませんが、sleep 5ほぼ確実に1つsyncまたは両方でなければなりません。

とにかく証明するには:

sudo sh -s <<\IN
    losetup -D                          
    fallocate "-l$((1024*1024*1024))" loop        
    printf %s\\n n '' '' '' ''  w y | gdisk loop
    sync; losetup -f loop
    lsblk /dev/loop*
IN

したがって、上記のシーケンスは、まず-D全ての電流ループ装置をエッチングする。(そうであれば) fallocatesa 1GB tmpファイルにGPTパーティションテーブルを作成し、単一のパーティションを作成し、ファイルシステムを作成し、syncそれを-f使用可能な最初のループデバイスに割り当てて、使用可能なすべてのループデバイスを一覧表示しますlsblk。次のように印刷されます。

NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
loop0   7:0    0   1G  0 loop 

しかし、その行を次のように変更した場合losetup

losetup -fP loop

...代わりに印刷されます。

NAME      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0       7:0    0    1G  0 loop 
├─loop0p1 259:0    0 1023M  0 loop 
└─loop0p2 259:1    0 1007K  0 loop 

losetupバックアップファイルのパーティションテーブルが最初にスキャンされるからです。ご覧のとおり、追加の1Mに気づくよりもあまり良くありません。(実際、これは分割されたテーブルの最後の繰り返しであることがほぼ確実です)割り当てられていないスペースとして別々のパーティションとして解釈されますが、おそらくtmpfsに書き込んでいるからです。(連続2回)1GBのファイルホールに加えて、実際のデータで作業する方が正確です。(そしてスクリプトのようにサポートファイルを0に設定すると、ddとにかくこの問題は処理されます。)。とにかく - これmkfs.whateverにより、実際のパーティションから自由にすることができますmount。同じ結果がpartx -u得られます。/dev/loop0

おすすめ記事