何もないところから1つのパーティションのみを含むファイルシステムを作成する必要があります(/dev/zero
)。私はこの一連のコマンドを試しました:
dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
n
p
2048
131072
基本的に、ゼロで埋められた64MBの画像ファイルを作成する必要があります。次に、fdisk
を使用して、セクター2048
から開始し、残りのすべてのセクターを使用して、新しいファイルシステム(最終的にはFAT32)に新しいパーティションを追加します。
losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1
しかし、ここで問題が発生しています。 loop
デバイスをセットアップし、mkfs -t vfat
を使用してフォーマットすると、パーティションテーブルが上書きされ、ファイルシステム(FAT32)がディスクに配置されます。 FAT32でフォーマットされたディスク全体は必要ありません。プライマリパーティションが必要です。
イメージ全体ではなく、RAWディスクイメージの1つのパーティションのみをフォーマットする方法を知っている人はいますか?
Linuxの場合、loop
モジュールをロードするときに、ループデバイスがパーティション化できるように、モジュールにmax_part
オプションを渡してください。
現在の値を確認します。
cat /sys/module/loop/parameters/max_part
0の場合:
modprobe -r loop # unload the module
modprobe loop max_part=31
この設定を永続化するには、次の行を/etc/modprobe.conf
に追加するか、システムにそのディレクトリが存在する場合は/etc/modprobe.d
のファイルに追加します。
options loop max_part=31
「モジュールループが組み込まれている」ためにmodprobe -r loop
が失敗した場合は、loop.max_part=31
をカーネルコマンドラインに追加して再起動する必要があります。ブートローダーがGrub2の場合は、GRUB_CMDLINE_LINUX
のetc/default/grub
の値に追加します。
これで、パーティション化可能なループデバイスを作成できます。
truncate -s64M file # no need to fill it with zeros, just make it sparse
fdisk file # create partitions
losetup /dev/loop0 file
mkfs.vfat /dev/loop0p1 # for the first partition.
mount /dev/loop0p1 /mnt/
(比較的新しいバージョンのLinuxが必要であることに注意してください)。
次の手順では、イメージのパーティションをマウントして変更することができます。
losetup 2.21 -Pオプション
losetup -P -f --show my.img
を作成します/dev/loopXpY
パーティションごと。
利点:多くのディストリビューション(util-linuxパッケージ)にプレインストールされた実行可能ファイル。
短所:Ubuntu 14.04には存在しない、ごく最近のオプション。
losetup -P
自動化
使用法:
$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2
$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there
$ Sudo losetup -l
NAME SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE DIO
/dev/loop1 0 0 0 0 /full/path/to/my.img
$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0
ソース:
los() (
img="$1"
dev="$(Sudo losetup --show -f -P "$img")"
echo "$dev"
for part in "$dev"?*; do
if [ "$part" = "${dev}p*" ]; then
part="${dev}"
fi
dst="/mnt/$(basename "$part")"
echo "$dst"
Sudo mkdir -p "$dst"
Sudo mount "$part" "$dst"
done
)
losd() (
dev="/dev/loop$1"
for part in "$dev"?*; do
if [ "$part" = "${dev}p*" ]; then
part="${dev}"
fi
dst="/mnt/$(basename "$part")"
Sudo umount "$dst"
done
Sudo losetup -d "$dev"
)
kpartx
Sudo apt-get install kpartx
losetup -fs my.raw
Sudo kpartx -a my.img
ls /dev/mapper
出力:
/dev/mapper/loop0
/dev/mapper/loop0p1
どこ loop0p1
は最初のパーティションなので、次のようにできます。
mkdir -p d
Sudo mount /dev/mapper/loop0p1 d
この方法の利点:再起動せずにUbuntu 14.04で動作します。