İmg dosyasının içindeki bir bölümü nasıl biçimlendirebilirim?


12

imgAşağıdaki komutla bir dosya oluşturdum :

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

Bu sadece sıfırlı bir dosyadır, ancak içinde kullanabilir fdiskve bir bölüm tablosu oluşturabilirim:

# 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

ve diyelim ki, bir bölüm:

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.

Bölümleme tablosunu kontrol ettiğimde şu sonucu alıyorum:

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

Yani bölüm var. Bu bölümü gparted ile biçimlendirmeye çalıştığımda, aşağıdaki hatayı alıyorum:

resim açıklamasını buraya girin

Neden aradığını bilmiyorum binary.img1ve bölümün canlı komuttan nasıl biçimlendirileceği hakkında hiçbir fikrim yok.

Herkes ext4 dosya sistemi kullanarak biçimlendirmek biliyor mu?


2
Bir seçenek bu yanıttan losetup hile yapmak ve sonra geri döngü aygıtında mkfs.ext4 çalıştırmaktır.
Miikka

Bu bağlantıyı unix.stackexchange.com/a/87189/52763 buldum . Ve aslında istediğim buydu. Sorun şu ki, cihazı gparted olarak kontrol ettiğimde, alıyorum Couldn't find valid filesystem superblock.. İşte resim: i.imgur.com/dl7XAC4.png .Bu bir çeşit hata mı?
Mikhail Morfikov

Yanıtlar:


13

Disk görüntüsüne ve ayrı bölümlerine geri döngü özelliği aracılığıyla erişebilirsiniz. Bazı disk yardımcı programlarının disk görüntülerinde (makul olarak) mutlu bir şekilde çalışacağını zaten keşfettiniz. Ancak, mkfsbunlardan biri değil (ama gariptir mount).

İşte çıktı 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

Oluşturduğunuz bölüme erişmek için birkaç seçeneğiniz vardır

  1. Açık rota

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

    Çıktı /dev/loop0, ayrılan döngü aygıtının adıdır. --offsetParametre sadece bölme (ofset oluyor edilir Startsektör büyüklüğü ile çarpılarak) ( 512). Oysa --sizelimitbölümün boyutu ve şu şekilde hesaplayabilirsiniz: 819199-2048 + 1 = 817152 olan End-Start + 1 ve bu sayı da sektör boyutuyla çarpılmalıdır.

    Daha sonra /dev/loop0bölüme referans olarak kullanabilirsiniz :

    mkfs -t ext4 -L img1 /dev/loop0
    mkdir -p /mnt/img1
    mount /dev/loop0 /mnt/img1
    ...
    umount /mnt/img1
    losetup -d /dev/loop0
    
  2. Örtük rota

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

    Çıktı /dev/loop0, ayrılan birincil döngü aygıtının adıdır. Buna ek olarak, --partscanseçenek çekirdeğe aygıtı bir bölme tablosu için taramasını ve yardımcı döngü aygıtlarını otomatik olarak atamasını söyler. Bir bölümle ilgili durumunuzda /dev/loop0p1, daha sonra bölüme referans olarak da kullanabilirsiniz:

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

@Mikhail, fdiskçıktının bir parçası olarak zaten verildiğinde bölüm boyutunu hesapladığınızı görmek ister .
roaima

2
Bazı matematiklerde sorun nedir? Ayrıca, her durumda, doğru sektör numarasını kolayca bulabileceğinizi bilmek güzel ...
Mikhail Morfikov

Sadece hızlı bir gözlem: "mkfs kullanıcı arabirimi, mkfs man-sayfalarından alıntılanan dosya sistemine özgü mkfs. <type> utils" lehine kaldırılmıştır.
gmagno

@gmagno bu kesinlikle doğru. Ama çok uzun veya çok zor kazmadan belirleyebildiğim kadarıyla, bu bildirim sadece ilk olarak util-linux 2.25-rc1 ile piyasaya sürüldü ve Haziran 2015'ten oldukça uzun bir süre öncesine kadar Debian'a ulaşmadı. yanıtı güncel bilgilerle güncellemek için.
roaima

11

Bunu genel olarak yapmanın başka bir yolu var, kullanın kpartx( kde ile ilgili değil )

sudo kpartx -a binary.img

ve şimdi altında tanımlanmış tüm bölüm cihazlarını olmalıdır /dev/mapperolarak loop0p1 , loop0p2 , ...

ve sonra

sudo mkfs.ext4 /dev/mapper/loop0p1

Seçenek olarak, işiniz bittiğinde,

sudo kpartx -d binary.img

loop0p kurtulmak için? deivce


2
Bunun neden daha fazla oyu olmadığından emin değilim. IMO en iyi cevap ...!
Jeremy Davis

GPT bölümleriyle çalışır, örn. EFI bölümünü bir tam disk dd'sinden değiştirmek istiyorsanız.
Russ

3

Neden aradığını bilmiyorum binary.img1

(… Ve daha sonra binary.img2yorumda gömülü oldukları için .)

Bunun nedeni, araçların dosya adlarının belirli bir deseni izlemesini beklemesidir. Bu desen, cihaz dosyaları tarafından sisteminizdeki gerçek diskler ve disk birimleri için kullanılan desendir:

  • Diskin tamamını kapsayan bir aygıt dosyası adlandırılır sda(veya başka bir şey). fdiskYararlanmayı bekleyen budur .
  • Onun bölünmesi ile tanımlanan diskin, bireysel dilimler için cihaz dosyaları adlandırılır sda1, sda2, sda3ve benzeri. Bireysel disk hacimlerinde bir şeyler gpartedyapmayı söylediklerinde bu araçlardan yararlanmayı bekledikleri mkfsşey budur .

Tabii ki, sıradan dosyalar disk aygıtlarının dosyalarında olduğu gibi çakışmaz. Eğer gördük döngü dosya sistemi içeren tartışmalar tek bütün diskli görüntü dosyası alıp oluşturmak için geri döngü kullanma konusunda hepsi 1, 2, 3bunun içinde tek tek dilimleri yansıtacak ve benzeri dosyaları, istenen bölümü yerleşim yazıldıktan sonra bölümleme tablosuna.


Mantıklı!
Mikhail Morfikov

0

Bu konu doğrudan ilgili olmasa da, aynı ve ilgili birçok bilgiden bahsediyor.

Debian wiki | Raspberry Pi ve qemu-kullanıcı-statik

Bu aptyayında belirtilen komutlardan bazılarını yüklemek için kullanamıyorsanız , kullanmayı deneyin apt-cache search [package_name]. Komut farklı bir addaki bir paketten geliyorsa, bu herhangi bir sonuç vermeyebilir.

Örneğin, losetupeskiden kurulmuş olacak losetupkullanılarak apt install losetup, ama şimdi bir parçası olan util-linuxUbuntu'nun depoda. Hangi paketin başka bir paket için kapsayıcı olduğunu düşündüğünüzde, Linux dağıtımı için çevrimiçi depo aramasını kullanmalısınız. Veya başka bir kaynaktan yüklemeniz gerekiyorsa, bir Web arama motoru kullanın.

Kontrol edilmeye değer bazı paketler ...

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

Her Linux dağıtımının kendi çevrimiçi yönetimi de vardır. Bazen yönetimi kullanmak öğreticiden daha kolaydır. Manuel sayfalar ayrıca tüm komut seçeneklerini ve parametrelerini de söyleyecektir. Bir öğretici genellikle yalnızca kullanılanlara odaklanır.


0

Minimal çalıştırılabilir sfdisk+ mke2fsolmadan örneksudo

Bu örnekte, her biri bir ana bilgisayar dizininden dosyalarla doldurulmuş iki ext2 bölümü içeren bir görüntü dosyası oluştururuz, sudoya da setsuidiçermeyiz.

Daha sonra sudo losetupsadece Linux çekirdeğinin onları şu şekilde açıklayabildiğini test etmek için bölümleri monte etmek için kullanacağız : /programming/1419489/how-to-mount-one-partition-from-an-image -dosyadan yani-içeriyor-çoklu-bölümler / 39675265 # 39675265

Daha fazla ayrıntı için bkz:

Örnek:

#!/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'te test edildi. GitHub akış yukarı .

Varolan bir ham dosya sistemi dosyasını bir görüntüye sarmak için yardımcı

Yukarıdakilerden alıntı, aşağıdakiler yararlı olabilir:

# 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 akış yukarı .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.