Bagaimana cara memformat partisi di dalam file img?

12

Saya membuat imgfile melalui perintah berikut:

dd if=/dev/zero bs=2M count=200 > binary.img

Ini hanya file dengan nol, tapi saya bisa menggunakannya fdiskdan membuat tabel partisi:

# 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

dan, katakanlah, satu partisi:

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.

Ketika saya memeriksa tabel partisi, saya mendapatkan hasil berikut:

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

Jadi, partisi itu ada. Ketika saya mencoba memformat partisi ini melalui gparted, saya mendapatkan kesalahan berikut:

masukkan deskripsi gambar di sini

Saya tidak tahu mengapa ini terlihat binary.img1, dan saya tidak tahu bagaimana memformat partisi dari command live.

Adakah yang tahu cara memformatnya menggunakan sistem file ext4?

Mikhail Morfikov
sumber
2
Salah satu opsi adalah melakukan trik losetup dari jawaban ini dan kemudian jalankan mkfs.ext4 terhadap perangkat loopback.
Miikka
Saya menemukan tautan ini unix.stackexchange.com/a/87189/52763 . Dan ini sebenarnya yang saya inginkan. Masalahnya adalah, ketika saya memeriksa perangkat dalam gparted, saya mengerti Couldn't find valid filesystem superblock.. Inilah gambarnya : i.imgur.com/dl7XAC4.png. Apakah ini semacam bug?
Mikhail Morfikov

Jawaban:

13

Anda dapat mengakses gambar disk dan partisi individualnya melalui fitur loopback. Anda telah menemukan bahwa beberapa utilitas disk akan beroperasi dengan wajar pada gambar disk. Namun, mkfsbukan salah satu dari mereka (tapi anehnya mount).

Ini adalah output dari 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

Untuk mengakses partisi yang Anda buat, Anda memiliki beberapa pilihan

  1. Rute eksplisit

    losetup --offset $((512*2048)) --sizelimit $((512*817152)) --show --find binary.img
    /dev/loop0
    

    Outputnya /dev/loop0adalah nama perangkat loop yang telah dialokasikan. The --offsetparameter hanya partisi offset ( Start) dikalikan dengan ukuran sektor ( 512). Sedangkan --sizelimitukuran partisi, dan Anda dapat menghitungnya dengan cara berikut: Akhir-Mulai + 1, yaitu 819199-2048 + 1 = 817152, dan angka itu juga harus dikalikan dengan ukuran sektor.

    Anda kemudian dapat menggunakan /dev/loop0sebagai referensi Anda ke partisi:

    mkfs -t ext4 -L img1 /dev/loop0
    mkdir -p /mnt/img1
    mount /dev/loop0 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    
  2. Rute tersirat

    losetup --partscan --show --find binary.img
    /dev/loop0
    

    Outputnya /dev/loop0adalah nama perangkat loop utama yang telah dialokasikan. Selain itu, --partscanopsi memberitahu kernel untuk memindai perangkat untuk tabel partisi dan menetapkan perangkat loop tambahan secara otomatis. Dalam kasus Anda dengan satu partisi Anda juga mendapatkan /dev/loop0p1, yang kemudian dapat Anda gunakan sebagai referensi Anda ke partisi:

    mkfs -t ext4 -L img1 /dev/loop0p1
    mkdir -p /mnt/img1
    mount /dev/loop0p1 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    
roaima
sumber
@Mikhail penasaran melihat Anda menghitung ukuran partisi ketika sudah diberikan sebagai bagian dari fdiskoutput.
roaima
2
Apa yang salah dengan beberapa matematika? Selain itu, baik untuk mengetahui bahwa Anda dapat dengan mudah mendapatkan nomor sektor yang tepat dengan cara itu, untuk berjaga-jaga ...
Mikhail Morfikov
Hanya pengamatan singkat: "frontend mkfs sudah tidak digunakan lagi karena mendukung sistem file mkfs spesifik. <type> utils", dikutip dari man-pages mkfs.
gmagno
@ Ghagno itu benar sekarang, tentu saja. Tetapi sejauh yang saya dapat menentukan tanpa menggali terlalu lama atau terlalu keras, pemberitahuan itu hanya pertama kali dirilis dengan util-linux 2.25-rc1, dan itu tidak masuk ke stabil Debian sampai beberapa waktu setelah Juni 2015. Jangan ragu untuk memperbarui jawaban dengan informasi terkini.
roaima
11

Ada cara lain untuk melakukan ini secara umum, gunakan kpartx( tidak terkait kde)

sudo kpartx -a binary.img

dan sekarang Anda harus memiliki semua perangkat partisi yang didefinisikan di bawah /dev/mappersebagai loop0p1 , loop0p2 , ...

lalu

sudo mkfs.ext4 /dev/mapper/loop0p1

Optionnaly, ketika Anda selesai, Anda dapat menjalankan juga

sudo kpartx -d binary.img

untuk menyingkirkan loop0p? deivce

titik balik matahari
sumber
2
Tidak yakin mengapa ini tidak memiliki lebih banyak suara. IMO itu jawaban terbaik ...!
Jeremy Davis
Bekerja dengan partisi GPT, misalnya, jika Anda ingin memodifikasi partisi EFI dari seluruh disk-dd.
Russ
3

Saya tidak tahu mengapa itu terlihat binary.img1

(... dan kemudian binary.img2dikubur dalam komentar.)

Itu karena alat mengharapkan nama file mengikuti pola tertentu. Pola itu adalah yang digunakan oleh file perangkat untuk disk aktual dan volume disk pada sistem Anda, yaitu:

  • File perangkat yang mencakup seluruh disk dinamai sda(atau yang lainnya). Inilah yang fdiskingin dimanfaatkan.
  • File perangkat untuk irisan individu dari disk, dijelaskan oleh partisi yang, diberi nama sda1, sda2, sda3, dan sebagainya. Inilah yang digunakan alat-alat seperti yang gparteddiharapkan untuk digunakan ketika mereka meminta mkfsuntuk melakukan hal-hal pada volume disk individu .

Tentu saja, file biasa tidak tumpang tindih dengan cara yang dilakukan file perangkat disk. Diskusi yang melibatkan filesystem loopback bahwa Anda telah melihat semua tentang mengambil file gambar seluruh disk tunggal dan menggunakan loopback untuk menciptakan 1, 2, 3, dan sebagainya file yang mencerminkan irisan individu di dalamnya, setelah tata letak partisi yang diinginkan telah ditulis ke tabel partisi.

JdeBP
sumber
Itu masuk akal!
Mikhail Morfikov
0

Meskipun topik ini tidak berhubungan langsung, ia menyebutkan banyak informasi yang sama dan terkait.

Wiki Debian | Raspberry Pi dan qemu-user-statis

Jika Anda tidak dapat menggunakan aptuntuk menginstal beberapa perintah yang disebutkan dalam posting ini, coba gunakan apt-cache search [package_name]. Ini mungkin tidak menampilkan hasil apa pun jika perintah tersebut berasal dari paket dengan nama yang berbeda.

Sebagai contoh, losetupsebelumnya bisa diinstal losetupmenggunakan apt install losetup, tetapi sekarang menjadi bagian dari util-linuxrepositori Ubuntu. Cara Anda mengetahui paket apa yang bertindak sebagai wadah untuk paket lain, Anda harus menggunakan pencarian repositori online untuk distribusi Linux Anda. Atau, jika Anda harus menginstalnya dari sumber lain, gunakan mesin pencari Web.

Beberapa paket layak dicoba ...

util-linux genisoimage dosfstools squashfs-tools fsarchiver xfsprogs reiserfsprogs reiser4progs jfsutils ntfsprogs btrfs-tools

Setiap distribusi Linux juga memiliki halaman manual online sendiri. Terkadang lebih mudah menggunakan manual daripada tutorial. Halaman manual juga akan memberi tahu Anda semua opsi dan parameter perintah. Tutorial biasanya hanya akan fokus pada yang digunakan.

w3techie
sumber
0

Minimal runnable sfdisk+ mke2fscontoh tanpasudo

Dalam contoh ini, kita akan membuat, tanpa sudoatau setsuid, file gambar yang berisi dua partisi ext2, masing-masing diisi dengan file dari direktori host.

Kami kemudian akan menggunakan sudo losetuphanya untuk me-mount partisi untuk menguji bahwa kernel Linux benar-benar dapat membacanya seperti yang dijelaskan di: /programming/1419489/how-to-mount-one-partition-from-an-image -file-that-berisi-multi-partisi / 39675265 # 39675265

Untuk detail lebih lanjut, lihat:

Contoh:

#!/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"

Diuji pada Ubuntu 18.04. GitHub hulu .

Membantu membungkus file sistem file mentah yang ada menjadi gambar

Diekstrak dari yang di atas, berikut ini dapat bermanfaat:

# Put a raw filesystem file into a disk image with a partition table.
#
# /unix/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))
)

GitHub hulu .

Ciro Santilli 冠状 病毒 审查 六四 事件 法轮功
sumber