次のコマンドでimg
ファイルを作成しました。
dd if=/dev/zero bs=2M count=200 > binary.img
これはゼロのファイルですが、fdisk
で使用してパーティションテーブルを作成できます。
# fdisk binary.img
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0x51707f21.
Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x51707f21
そして、たとえば、1つのパーティション:
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
First sector (2048-819199, default 2048):
Last sector, +sectors or +size{K,M,G,T,P} (2048-819199, default 819199):
Created a new partition 1 of type 'Linux' and of size 399 MiB.
Command (m for help): w
The partition table has been altered.
Syncing disks.
パーティションテーブルを確認すると、次の結果が得られます。
Command (m for help): p
Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7f3a8a6a
Device Boot Start End Sectors Size Id Type
binary.img1 2048 819199 817152 399M 83 Linux
したがって、パーティションが存在します。このパーティションをgpartedでフォーマットしようとすると、次のエラーが発生します。
なぜbinary.img1
を探すのかわかりません。また、コマンドライブからパーティションをフォーマットする方法がわかりません。
Ext4ファイルシステムを使用してフォーマットする方法を知っている人はいますか?
ループバック機能を介してディスクイメージとその個々のパーティションにアクセスできます。一部のディスクユーティリティがディスクイメージで(合理的に)正常に動作することをすでに発見しました。ただし、mkfs
はそれらの1つではありません(奇妙なことにmount
はそうです)。
以下はfdisk -lu binary.img
からの出力です。
Disk binary.img: 400 MiB, 419430400 bytes, 819200 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes ... Device Boot Start End Sectors Size Id Type binary.img1 2048 819199 817152 399M 83 Linux
作成したパーティションにアクセスするには、いくつかの選択肢があります
明示的なルート
losetup --offset $((512*2048)) --sizelimit $((512*817152)) --show --find binary.img
/dev/loop0
出力/dev/loop0
は、割り当てられたループデバイスの名前です。 --offset
パラメータは、パーティションのオフセット(Start
)にセクターサイズ(512
)を掛けたものです。 --sizelimit
はパーティションのサイズであり、次の方法で計算できます:End-Start + 1、つまり819199-2048 + 1 = 817152であり、その数にセクターを掛ける必要がありますサイズ。
次に、/dev/loop0
をパーティションへの参照として使用できます。
mkfs -t ext4 -L img1 /dev/loop0
mkdir -p /mnt/img1
mount /dev/loop0 /mnt/img1
...
umount /mnt/img1
losetup -d /dev/loop0
暗黙のルート
losetup --partscan --show --find binary.img
/dev/loop0
出力/dev/loop0
は、割り当てられたプライマリループデバイスの名前です。さらに、--partscan
オプションは、パーティションテーブルのデバイスをスキャンし、補助ループデバイスを自動的に割り当てるようにカーネルに指示します。パーティションが1つの場合、/dev/loop0p1
も取得されます。これは、パーティションへの参照として使用できます。
mkfs -t ext4 -L img1 /dev/loop0p1
mkdir -p /mnt/img1
mount /dev/loop0p1 /mnt/img1
...
umount /mnt/img1
losetup -d /dev/loop0
一般的にこれを行う別の方法があります。kpartx
を使用します(not kde関連)
Sudo kpartx -a binary.img
そして今、あなたはすべてのパーティションデバイスを/dev/mapper
as loop0p1、loop0p2、...
その後
Sudo mkfs.ext4 /dev/mapper/loop0p1
オプションで、完了したら、実行することもできます
Sudo kpartx -d binary.img
loop0pを取り除くには?デバイス
なぜ
binary.img1
を探すのかわかりません
(…後で[binary.img2
はコメントに埋め込まれます。)
これは、ツールがファイル名が特定のパターンに従うことを期待しているためです。そのパターンは、システム上の実際のディスクおよびディスクボリュームのデバイスファイルで使用されるパターンです。
sda
(またはその他)です。これはfdisk
が利用することを期待するものです。sda1
、sda2
、sda3
などの名前が付けられます。これは、gparted
などのツールがmkfs
に対して個々のディスクボリュームに対して処理を行うように指示するときに利用すると期待するものです。もちろん、通常のファイルは、ディスクデバイスファイルのように重複することはありません。あなたが見たループバックファイルシステムに関する議論はすべて、単一のディスク全体のイメージファイルを取得し、ループバックを使用して1
、2
、3
などのファイルを作成することです。目的のパーティションレイアウトがパーティションテーブルに書き込まれたら、その中の個々のスライスを反映します。
最小の実行可能なsfdisk
+ mke2fs
なしの例Sudo
この例では、Sudo
またはsetsuid
なしで、2つのext2パーティションを含むイメージファイルを作成し、それぞれにホストディレクトリからのファイルを追加します。
次に、Sudo losetup
を使用してパーティションをマウントし、Linuxカーネルが実際にそれらを読み取ることができるかどうかをテストします: https://stackoverflow.com/questions/1419489/how-to -mount-one-partition-from-an-image-file-that-contains-multiple-partitions/39675265#39675265
詳細については、以下を参照してください。
sfdisk
:パーティションテーブルを扱います: https://superuser.com/questions/332252/how-to-create-and-format-a-partition-using-a- bash-script/1132834#1132834mke2fs
:パーティションのEXTフォーマットを扱います: https://superuser.com/questions/605196/how-to-create-ext2-image-without-superuser-rights/1366762# 1366762例:
#!/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:
# https://stackoverflow.com/questions/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アップストリーム 。
既存のrawファイルシステムファイルを画像にラップするヘルパー
上記から抽出すると、以下が役立ちます。
# Put a raw filesystem file into a disk image with a partition table.
#
# https://unix.stackexchange.com/questions/209566/how-to-format-a-partition-inside-of-an-img-file/527132#527132
#
# Usage:
#
# sfdisk-fs-to-img root.ext2
#
# Creates a file:
#
# sfdisk-fs-to-img root.ext2.img
#
sfdisk-fs-to-img() (
partition_file_1="$1"
img_file="${partition_file_1}.img"
block_size=512
partition_size_1="$(wc -c "$partition_file_1" | awk '{print $1}')"
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)/$bs)) skip="$(($cur_offset/$bs))"
printf "
type=83, size=$(($partition_size_1/$block_size))
" | sfdisk "$img_file"
cur_offset=$(($cur_offset + $part_table_offset))
dd if="$partition_file_1" of="$img_file" bs="$bs" seek="$(($cur_offset/$bs))"
cur_offset=$(($cur_offset + $partition_size_1))
)
このトピックは直接の関連はありませんが、同じ関連情報の多くについて言及しています。
Debian wiki | Raspberry Piおよびqemu-user-static
apt
を使用してこの投稿に記載されているコマンドの一部をインストールできない場合は、apt-cache search [package_name]
を使用してみてください。コマンドが別の名前のパッケージからのものである場合、これは結果を表示しない場合があります。
たとえば、losetup
は以前はapt install losetup
を使用してlosetup
としてインストールできましたが、Ubuntuのリポジトリのutil-linux
の一部になりました。どのパッケージが別のパッケージのコンテナとして機能するかを見つける方法として、Linuxディストリビューションのオンラインリポジトリの検索を使用する必要があります。または、別のソースからインストールする必要がある場合は、Web検索エンジンを使用します。
チェックアウトする価値のあるいくつかのパッケージ...
util-linux genisoimage dosfstools squashfs-tools fsarchiver xfsprogs reiserfsprogs reiser4progs jfsutils ntfsprogs btrfs-tools
すべてのLinuxディストリビューションには、独自のオンラインマンページもあります。チュートリアルよりもマンページの方が簡単な場合があります。マニュアルページには、すべてのコマンドオプションとパラメーターも記載されています。チュートリアルは通常、使用されるものにのみ焦点を当てます。