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


16

何もないところからパーティションを1つだけ使用してファイルシステムを作成する必要があります(/dev/zero)。次の一連のコマンドを試しました。

dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
    n
    p 
    2048
    131072

基本的に、ゼロで満たされた64MBの画像ファイルを作成する必要があります。次にfdisk、新しいファイルシステム用の新しいパーティション(最終的にはFAT32になります)を追加するために使用し2048ます。セクターから開始し、残りのすべてのセクターを使用します。

losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1

しかし、ここで問題が発生しています。loopデバイスをセットアップし、を使用してフォーマットするとmkfs -t vfat、パーティションテーブルが上書きされ、ファイルシステム(FAT32)がディスクに配置されます。FAT32でフォーマットされたディスク全体は必要ありません。そのためにはプライマリパーティションが必要です。

全体のイメージではなく、未加工のディスクイメージの1つのパーティションのみをフォーマットする方法を知っている人はいますか?


ループデバイスを設定して意味を明確にし、mkfs通話全体を投稿してください。あなたの問題を理解するために、私はあなたの投稿を3回読む必要がありました。私はあなたを助けることはできませんが、なぜあなたが画像ファイルを作成するのか興味があります(!)、それでも最初のn個の「セクター」を未使用のままにしたいです。
バナンイン

OK、編集しました。ブートローダーをどこかに配置する必要があるため、最初のnセクター(セクターの何が問題になっていますか?)を未使用のままにしておきます。
user35443


@MichaelMrozek一部のLinuxディストリビューションに適用される考慮事項loopがありますが、Ubuntuには適用されません(モジュールであるかカーネルに組み込まれているかが重要です)。そのため、各サイトで質問のバージョンを確認しておくと役立つと思います。
ジル 'SO-悪であるのをやめる'

@MichaelMrozek個人的には、AskUbuntuはUnixとLinuxよりも具体的だと思うので、質問を両方にクロスポストする場合、ここで閉じる特定の理由がない限り、AskUbuntuはクロスポストとして閉じられるべきです。 「最初」に投稿された場​​所に関係なく、互いに近い時間で投稿されました(おそらくUbuntu / Ubuntu以外の回答がここに記載されています)。ここでは、AskUbuntuの回答では受け入れられていない受け入れられた回答があります。これは、この1つのIMOを開いたままにしておくことを強く推奨します。私はAskUbuntuで終了するために投票する担当者を持っていませんが、ここで質問を再開することに投票しています。
CVn

回答:


20

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_LINUXin の値に追加し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の比較的新しいバージョンが必要なことに注意してください)。


致命的:モジュールループが組み込まれていますが、ubuntuの最新バージョン(12.04がインストールされています)をインストールすることで解決できますか?
user35443

modprobeに不要な組み込みの場合loop.max_part=31、カーネルコマンドラインに渡す
アレックス

1
ああ、最近のカーネルを使用していて、max_partにオフセットとサイズ制限がまったく必要ない場合は
アレックス

うーん、カーネルコマンドライン、私には難しすぎる。それでも感謝、受け入れます。
user35443

それであるloop.maxpart=31か、loop.max_part=31カーネルのコマンドラインに?
クリスチャンシウピトゥ14年

4

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

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

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

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


うーん、オフセット、これは動作するはずです。そして、さらにパーティションがあったらどうなりますか?
-user35443

1つのループ= 1つのパーティション= 1つのオフセットだと思います。
アレックス

ええと、サイズも指定するオプションがあるので、それを制限してより多くのパーティションを配置できますか?
user35443

申し訳ありませんが部分的な解決策と新しい答えを作成するために、私のせいで、正しい答えはあり@「ステファンChazelas」は、彼がちょうどオフセットといるsizelimitオプションが(そして私は鉱山を削除します)を追加することができます
アレックス

それがここにあるようにしないでください、さもなければ私の+1はどこにも行きません。
user35443

2

次の手順により、イメージのパーティションをマウントして変更できます。

losetup 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"
)

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で再起動せずに動作します。

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