web-dev-qa-db-ja.com

フォーマットされたパーティションイメージファイルを最初から作成する方法は?

何もないところから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つのパーティションのみをフォーマットする方法を知っている人はいますか?

16
user35443

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_LINUXetc/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が必要であることに注意してください)。

21

losetup /dev/loop0 file -o 1048576 --sizelimit limit

指定するオフセットはバイト単位にする必要があります(1048576 = 2048セクター*セクターあたり512バイト)。

mount -o loop,offset=1048576,sizelimit=limit

詳細については、 losetup および mount を参照してください。

4
Alex

次の手順では、イメージのパーティションをマウントして変更することができます。

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で動作します。