Linux-1つのファイル内で複数のファイルシステムをフォーマットする方法


9

2つの空のファイルシステムでディスクイメージを作成する必要があります。私はそれを使ってそれを作成しました

dd if=/dev/zero of=./disk.img bs=1MiB count=1024

次に、を使用して2つのプライマリパーティションを作成しましたfdisk disk.img。1つはFAT32で、もう1つはEXT3です。ここで、マウントするファイルシステムを作成するために、両方のパーティションをフォーマットする必要があります-o loop devices。しかし、私はそれらをフォーマットする方法を理解できませんか?私が使用することはできませんmkfs.vfatdisk.img。だから私は完全に混乱しています。

解決策:@ pjc50からの回答のおかげで、非常に簡単な解決策が見つかりました:

sudo aptitude install multipath-tools
sudo kpartx -a disk.img   #it maps (mounts) found partitions to /dev/mapper/loop...
sudo mkfs.vfat -F 32 -n boot /dev/mapper/loop0p1
sudo mkfs.ext3 -L rootfs /dev/mapper/loop0p2

このソリューションの欠点は、スーパーユーザー権限が必要なことです。


これらすべてのプログラムがファイル内のパーティションを使用できるとは思えません。2つのファイルシステムを別々のファイルに作成してから、それらをddで大きなファイルにマージできますか?
golimar

@golimar:しかし、そのようなドライブにMBRが必要になります。別々に作成された異なるファイルシステムを個別のファイルとしてマージする方法がわかりません
psihodelia

元のファイルのMBRを使用できます。ddは、 'size'および 'skip'コマンドでオフセットを許可します。正確なオフセットを見つけて、大きなファイルの一部を2つの小さいファイルで上書きする必要があります
golimar

ここで世間知らずなら許してください、でも2つの別々のファイルを使用しないのはなぜですか?
Garrett

回答:


9

kpartxツールを使用できるようです:http ://robert.penz.name/73/kpartx-a-tool-for-mounting-partitions-within-an-image-file/

Kpartxを使用して、任意のパーティションブロックデバイスのパーティションのデバイスマッピングをセットアップできます。Linuxマルチパスツールの一部です。kpartx -l imagefileを使用すると、イメージファイル内のパーティションの概要が表示され、kpartx -a imagefileを使用すると、パーティションは/ dev / mapper / loop0pXを介してアクセスできます(Xはパーティションの番号です)。mount / dev / mapper / loop0pX / mnt / -o loop、roでマウントできます。アンマウント後、kpartx -d imagefileを使用してマッパーデバイスを切断できます。

ただし、このソリューションの欠点は、スーパーユーザー権限が必要なことです。
psihodelia

1
スーパーユーザー権限を必要としないソリューションが存在することは疑わしいです!つまり、これは私は、通常のユーザーが(例えばsudoを経由)事前にスーパーユーザーによって設定された特定のメカニズムなしで行うことができるように期待していない操作の一種である
pjc50

2
@ pjc50:スーパーユーザー権限なしでこれを行うことができます。最初に各パーティションを個別のファイルとして作成し、次にディスクイメージに手動でディスクイメージを作成し、パーティションをディスクイメージにコピーしてから、パーティションテーブルをディスクイメージに作成します。
ミッコランタライネン2013年

1
@MikkoRantalainen正確に。次に、最小限の実行可能な例を示します
。superuser.com/ a / 1367534/128124

7

これを行うには、まずパーティションをマウントして、パーティションに適切なオフセットを指定するオプションを/dev/loop?使用losetup-oます。fdisk -l disk.imgstart_sector * sector_size)の出力に基づいてオフセットを計算できます。

例えば:

losetup -o32256 /dev/loop1 ./disk.img   # mount first partition

マウントしたら、次を使用してパーティションのフォーマットに進むことができますmkfs.*

mkfs.vfat -F32 /dev/loop1

詳細と例については、次の記事を参照してください。


まあ、それは動作しません:(
psihodelia '12 / 12/12

@psihodeliaする必要があります。これを行うと結果はどうなりますか?
ダニエルベック

どのように機能しないのですか?エラーが発生しますか?どのステップが失敗しますか?
Shawn Chin

$ sudo mkfs.vfat -F32 / dev / loop1 mkfs.vfat 3.0.9(2010年1月31日)ループデバイスがフロッピーのサイズと一致しない、デフォルトのhd paramsを使用
psihodelia

1
を呼び出すときにブロックサイズを指定すると役立つ場合がありますmkfs.vfat。私が提供した最初のリンクを参照してください。記事にも記載されているように、フロッピーの警告は予期されており、無視できます
Shawn Chin

1

私が心に留めているツールを使います:

  • 1つのディスクでVirtualboxに新しいVMを作成します。通常は /dev/sda
  • GParted Live CDでVMを起動します
  • 必要に応じてVMのディスクをパーティション化してフォーマットします(2つのパーティション、異なるファイルシステムなど)。
  • 次に、ファイルddへのエクスポート/dev/sdaに使用します

経験豊富な推測では、約15分かかります。


スマートなトリッキーなソリューション:)しかし、15分もかからないと思います。ちなみに、グラフィックインターフェイスでユーザーを必要とするため、自動化するのは困難です(したがって、スクリプトを作成することはできません= Unixの方法ではありません)。
psihodelia

仮想ディスクが小さく、OSのインストールが行われないため、時間がかかりません:-)。最も長い部分は、GPartedの起動時間です。
karatedog

1

最小限の実行可能sfdisk+ mke2fsなしの例sudo

この例では、2つのext2パーティションを含むイメージファイルを作成するsudosetsuid、作成せずに作成します。それぞれにホストディレクトリからのファイルが読み込まれます。

次にsudo losetup、パーティションをマウントするためだけに使用して、Linuxカーネルが実際にそれらを読み取ることができるかどうかをテストしますhttps : //stackoverflow.com/questions/1419489/how-to-mount-one-partition-from-an-image -file-that-c​​ontains-multiple-partitions / 39675265#39675265

詳細については、以下を参照してください。

例:

#!/usr/bin/env bash

# Input params.
root_dir_1=root1
root_dir_2=root2
partition_file_1=part1.ext2
partition_file_2=part2.ext2
partition_size_1_megs=32
partition_size_2_megs=32
img_file=img.img
block_size=512

# Calculated params.
mega="$(echo '2^20' | bc)"
partition_size_1=$(($partition_size_1_megs * $mega))
partition_size_2=$(($partition_size_2_megs * $mega))

# Create a test directory to convert to ext2.
mkdir -p "$root_dir_1"
echo content-1 > "${root_dir_1}/file-1"
mkdir -p "$root_dir_2"
echo content-2 > "${root_dir_2}/file-2"

# Create the 2 raw ext2 images.
rm -f "$partition_file_1"
mke2fs \
  -d "$root_dir_1" \
  -r 1 \
  -N 0 \
  -m 5 \
  -L '' \
  -O ^64bit \
  "$partition_file_1" \
  "${partition_size_1_megs}M" \
;
rm -f "$partition_file_2"
mke2fs \
  -d "$root_dir_2" \
  -r 1 \
  -N 0 \
  -m 5 \
  -L '' \
  -O ^64bit \
  "$partition_file_2" \
  "${partition_size_2_megs}M" \
;

# Default offset according to
part_table_offset=$((2**20))
cur_offset=0
bs=1024
dd if=/dev/zero of="$img_file" bs="$bs" count=$((($part_table_offset + $partition_size_1 + $partition_size_2)/$bs)) skip="$(($cur_offset/$bs))"
printf "
type=83, size=$(($partition_size_1/$block_size))
type=83, size=$(($partition_size_2/$block_size))
" | sfdisk "$img_file"
cur_offset=$(($cur_offset + $part_table_offset))
# TODO: can we prevent this and use mke2fs directly on the image at an offset?
# Tried -E offset= but could not get it to work.
dd if="$partition_file_1" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
cur_offset=$(($cur_offset + $partition_size_1))
rm "$partition_file_1"
dd if="$partition_file_2" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
cur_offset=$(($cur_offset + $partition_size_2))
rm "$partition_file_2"

# Test the ext2 by mounting it with sudo.
# sudo is only used for testing, the image is completely ready at this point.

# losetup automation functions from:
# /programming/1419489/how-to-mount-one-partition-from-an-image-file-that-contains-multiple-partitions/39675265#39675265
loop-mount-partitions() (
  set -e
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev" | sed -E 's/.*[^[:digit:]]([[:digit:]]+$)/\1/g'
  for part in "${dev}p"*; do
    if [ "$part" = "${dev}p*" ]; then
      # Single partition image.
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst" 1>&2
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
loop-unmount-partitions() (
  set -e
  for loop_id in "$@"; do
    dev="/dev/loop${loop_id}"
    for part in "${dev}p"*; do
      if [ "$part" = "${dev}p*" ]; then
        part="${dev}"
      fi
      dst="/mnt/$(basename "$part")"
      sudo umount "$dst"
    done
    sudo losetup -d "$dev"
  done
)

loop_id="$(loop-mount-partitions "$img_file")"
sudo cmp /mnt/loop0p1/file-1 "${root_dir_1}/file-1"
sudo cmp /mnt/loop0p2/file-2 "${root_dir_2}/file-2"
loop-unmount-partitions "$loop_id"

Ubuntu 18.04でテスト済み。GitHubアップストリーム

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.