私が見つけたら、スクリプトを使って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
全ての電流ループ装置をエッチングする。(そうであれば) fallocate
sa 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