フォーマットされたパーティションイメージファイルを最初から作成するにはどうすればよいですか?

フォーマットされたパーティションイメージファイルを最初から作成するにはどうすればよいですか?

最初からパーティションが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

loopLinuxでは、モジュールをロードするときにループデバイスが分割可能になるようにモジュールにオプションを渡す必要があります。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で動作し、再起動は不要です。

関連情報