
最初からパーティションが1つしかないファイルシステム()を作成する必要があります/dev/zero
。私は次の一連のコマンドを試しました。
dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
n
p
2048
131072
デフォルトでは、ゼロで埋められた64 MBのイメージファイルを作成する必要があります。次に、セクタから始めて、残りのすべてのセクタを使用してfdisk
新しいファイルシステム(最終的にFAT32にする必要があります)の新しいパーティションを追加します。2048
losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1
しかし、ここに問題があります。loop
デバイスを設定してフォーマットを使用すると、mkfs -t vfat
パーティションテーブルが上書きされ、ファイルシステム(FAT32)がディスクに配置されます。ディスク全体をFAT32としてフォーマットする必要はなく、プライマリパーティションのみをフォーマットするだけです。
フルイメージではなく、rawディスクイメージの1つのパーティションのみをフォーマットする方法を知っている人はいますか?
答え1
loop
Linuxでは、モジュールをロードするときにループデバイスが分割可能になるようにモジュールにオプションを渡す必要があります。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
ますupdate-grub
。
これで、分割可能なループデバイスを作成できます。
truncate -s 64M 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/
使用後の循環装置の取り外しと取り外し
umount /mnt
losetup -d /dev/loop0
(比較的新しいバージョンのLinuxが必要です。)
答え2
losetup /dev/loop0 file -o 1048576 --sizelimit limit
指定されたオフセットはバイト単位でなければなりません(1048576 = 2048セクタ*セクタあたり512バイト)。
mount -o loop,offset=1048576,sizelimit=limit
詳細については、次を参照してください。設定が失われました。そして山。
答え3
ext4ファイルシステムとGPTパーティションイメージを使用した簡単な例です。
truncate -s 100MiB mountedImage.img
GPTテーブルの作成
parted mountedImage.img mklabel gpt
パーティションP1の作成
parted mountedImage.img mkpart primary ext4 2MiB 30MiB
パーティションP2の作成
parted mountedImage.img mkpart primary ext4 30MiB 60MiB
パーティションP3の作成
parted mountedImage.img mkpart primary ext4 60MiB 99MiB
/dev/loop1
屋根ふき装置(できるだけsudo losetup -f
無料の屋根ふき装置)を使用しているとします。
losetup /dev/loop1 mountedImage.img
->デバイスが作成されたパーティションは、/dev/loop1px
各パーティションがx
パーティション番号を表すように列挙する必要があります。
[使用] mkfs.ext4 /dev/loop1px
->パーティション番号で操作x
[それ以外] mkfs.ext4 /dev/loop1
->パーティションテーブルのみを削除します。
注:イメージのパーティションは、モジュールが複数のパーティションで構成されている場合にのみループデバイスに表示されます。
私のブログリンクを参照してください、Linuxで最初からGPTパーティションイメージを作成する、GPTを使用して最初からパーティションイメージを作成します。
答え4
次の手順では、イメージのパーティションをマウントして変更できます。
Lostup 2.21 -P オプション
losetup -P -f --show my.img
/dev/loopXpY
パーティションごとに1つずつ作成します。
利点:実行可能ファイル(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"
)
パテックス
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で動作し、再起動は不要です。