Jak sformatować partycję w pliku IMG?


12

imgPlik utworzyłem za pomocą następującego polecenia:

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

To tylko plik z zerami, ale mogę go użyć fdiski utworzyć tablicę partycji:

# 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

i, powiedzmy, jedna partycja:

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.

Kiedy sprawdzam tablicę partycji, otrzymuję następujący wynik:

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

Więc partycja istnieje. Kiedy próbuję sformatować tę partycję za pomocą gparted, pojawia się następujący błąd:

wprowadź opis zdjęcia tutaj

Nie wiem, dlaczego tak się dzieje binary.img1, i nie mam pojęcia, jak sformatować partycję za pomocą komendy live.

Czy ktoś wie, jak go sformatować przy użyciu systemu plików ext4?


2
Jedną z opcji jest wykonanie sztuczki losetup z tej odpowiedzi, a następnie uruchomienie mkfs.ext4 na urządzeniu sprzężenia zwrotnego.
Miikka

Znalazłem ten link unix.stackexchange.com/a/87189/52763 . I tego właśnie chciałem. Problem polega na tym, że kiedy sprawdzam urządzenie w gparted, dostaję Couldn't find valid filesystem superblock.. Oto zdjęcie: i.imgur.com/dl7XAC4.png. Czy to jakiś błąd?
Michaił Morfikow

Odpowiedzi:


13

Możesz uzyskać dostęp do obrazu dysku i jego poszczególnych partycji za pomocą funkcji sprzężenia zwrotnego. Odkryłeś już, że niektóre narzędzia dyskowe będą działać (rozsądnie) na obrazach dysków. Jednak mkfsnie jest jednym z nich (ale dziwnie mountjest).

Oto dane wyjściowe z 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

Aby uzyskać dostęp do utworzonej partycji, masz kilka możliwości

  1. Wyraźna trasa

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

    Dane wyjściowe /dev/loop0to nazwa przydzielonego urządzenia pętli. Ten --offsetparametr to po prostu offset partycji ( Start) pomnożony przez rozmiar sektora ( 512). Natomiast --sizelimitrozmiar partycji można obliczyć w następujący sposób: End-Start + 1, czyli 819199-2048 + 1 = 817152, a liczbę tę należy również pomnożyć przez rozmiar sektora.

    Następnie możesz użyć /dev/loop0jako odniesienia do partycji:

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

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

    Dane wyjściowe /dev/loop0to nazwa pierwotnego urządzenia pętli, które zostało przydzielone. Ponadto --partscanopcja informuje jądro, aby skanowało urządzenie w poszukiwaniu tablicy partycji i automatycznie przypisywało urządzenia pomocnicze. W twoim przypadku z jedną partycją, którą również otrzymujesz /dev/loop0p1, której możesz następnie użyć jako odniesienia do partycji:

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

@Mikhail jest ciekawy, że obliczyłeś rozmiar partycji, gdy została już podana jako część fdiskwyniku.
roaima

2
Co jest nie tak z niektórymi matematykami? Poza tym dobrze wiedzieć, że w ten sposób można łatwo uzyskać odpowiedni numer sektora, na wszelki wypadek ...
Michaił Morfikow

Krótka obserwacja: „Frontend mkfs jest przestarzały na rzecz mkfs specyficznych dla systemu plików. <type> utils”, cytowany ze stron podręcznika mkfs.
gmagno

@gmagno jest teraz poprawne, z pewnością. Ale o ile mogę stwierdzić bez kopania zbyt długo lub zbyt mocno, to powiadomienie zostało wydane dopiero po raz pierwszy w wersji util-linux 2.25-rc1, i nie dostało się do stabilnej wersji Debiana dość długo po czerwcu 2015 roku. Nie krępuj się aby zaktualizować odpowiedź aktualnymi informacjami.
roaima

11

Jest inny sposób, aby to zrobić ogólnie: użyj kpartx( nie dotyczy KDE)

sudo kpartx -a binary.img

a teraz powinieneś mieć wszystkie urządzenia partycji zdefiniowane /dev/mapperjako loop0p1 , loop0p2 , ...

i wtedy

sudo mkfs.ext4 /dev/mapper/loop0p1

Opcjonalnie, kiedy skończysz, możesz także biegać

sudo kpartx -d binary.img

pozbyć się pętli? dzielić


2
Nie jestem pewien, dlaczego to nie ma więcej głosów. IMO to najlepsza odpowiedź ...!
Jeremy Davis,

Działa z partycjami GPT, np. Jeśli chcesz zmodyfikować partycję EFI na całym dysku dd.
Russ

3

Nie wiem, dlaczego to szuka binary.img1

(… A później za binary.img2pochowany w komentarzu.)

Jest tak, ponieważ narzędzia oczekują, że nazwy plików będą zgodne z określonym wzorcem. Ten wzorzec jest używany przez pliki urządzeń dla rzeczywistych płyt i woluminów płyt w twoim systemie, a mianowicie:

  • Plik urządzenia obejmujący całą płytę nosi nazwę sda(lub coś innego). Właśnie tego fdiskoczekuje.
  • Pliki urządzeń dla poszczególnych plasterków płyty, opisanego przez jego podziału, są nazwane sda1, sda2, sda3, i tak dalej. Tego właśnie gpartedużywają narzędzia, które oczekują, że będą mkfsrobić rzeczy na poszczególnych woluminach płyt .

Oczywiście zwykłe pliki nie nakładają się na siebie tak, jak robią to pliki urządzeń dyskowych. Rozmowy z udziałem plików loopback, że widzieliście to wszystko o zrobieniu pojedynczego pliku obrazu całego dysku i za pomocą sprzężenia zwrotnego do tworzenia 1, 2, 3, i tak dalej pliki, które odzwierciedlają poszczególne plastry wewnątrz niego, gdy pożądany układ partycji został napisany do tabeli partycji.


To ma sens!
Michaił Morfikow

0

Chociaż ten temat nie jest bezpośrednio powiązany, wymienia wiele takich samych i powiązanych informacji.

Debian wiki | Raspberry Pi i qemu-user-static

Jeśli nie możesz użyć aptdo zainstalowania niektórych poleceń wymienionych w tym poście, spróbuj użyć apt-cache search [package_name]. Może to nie przynieść żadnych wyników, jeśli polecenie pochodzi z pakietu o innej nazwie.

Na przykład losetupmoże być wcześniej zainstalowany jako losetupkorzystający apt install losetup, ale teraz jest częścią util-linuxrepozytorium Ubuntu. Aby dowiedzieć się, który pakiet działa jako kontener dla innego pakietu, musisz skorzystać z wyszukiwania repozytorium online dla swojej dystrybucji Linux. Lub, jeśli musisz zainstalować go z innego źródła, użyj wyszukiwarki internetowej.

Niektóre pakiety warte sprawdzenia ...

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

Każda dystrybucja Linuksa ma także własne strony internetowe. Czasami łatwiej jest korzystać ze stron podręcznika niż samouczka. Strony podręcznika zawierają również informacje o wszystkich opcjach i parametrach poleceń. Samouczek zwykle koncentruje się tylko na tych, które są używane.


0

Minimalne uruchamianie sfdisk+ mke2fsprzykład bezsudo

W tym przykładzie utworzymy plik obrazu bez sudolub setsuidz dwiema partycjami ext2, z których każda zawiera pliki z katalogu hosta.

Następnie użyjemy sudo losetuptylko do zamontowania partycji, aby przetestować, czy jądro Linux może je odczytać, jak wyjaśniono na stronie : /programming/1419489/how-to-mount-one-partition-from-an-image -plik-zawierający-wiele partycji / 39675265 # 39675265

Aby uzyskać więcej informacji, zobacz:

Przykład:

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

Testowane na Ubuntu 18.04. GitHub w górę .

Pomocnik w zawijaniu istniejącego surowego pliku systemu plików do obrazu

Wyodrębnione z powyższego, przydatne mogą być:

# 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 w górę .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.