Как отформатировать раздел внутри файла img?


12

Я создал 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

и, скажем, один раздел:

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, и я понятия не имею, как отформатировать раздел из команды live.

Кто-нибудь знает, как отформатировать его с помощью файловой системы ext4?


2
Один из вариантов - выполнить трюк при сбое из этого ответа, а затем запустить mkfs.ext4 для устройства с обратной связью.
Миикка

Я нашел эту ссылку unix.stackexchange.com/a/87189/52763 . И это на самом деле то, что я хотел. Проблема в том, что когда я проверяю устройство в gparted, я получаю Couldn't find valid filesystem superblock.. Вот картинка: i.imgur.com/dl7XAC4.png. Это какая-то ошибка?
Михаил Морфиков

Ответы:


13

Вы можете получить доступ к образу диска и его отдельным разделам с помощью функции обратной связи. Вы уже обнаружили, что некоторые дисковые утилиты будут работать (разумно) с образами дисков. Тем mkfsне менее, не является одним из них (но как ни странно 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

Для доступа к созданному вами разделу у вас есть несколько вариантов

  1. Явный маршрут

    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
    
  2. Неявный маршрут

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

    Выход /dev/loop0- это имя устройства первичного контура, которое было выделено. Кроме того, --partscanопция указывает ядру сканировать устройство на наличие таблицы разделов и автоматически назначать устройства вспомогательных циклов. В вашем случае с одним разделом вы также получите /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
    

@Mikhail любопытно, что вы рассчитали размер раздела, когда он уже был указан как часть fdiskвывода.
Ройма

2
Что не так с некоторыми математиками? Кроме того, приятно знать, что таким образом вы можете легко получить правильный номер сектора, на всякий случай ...
Михаил Морфиков

Просто быстрое наблюдение: «Интерфейс mkfs устарел в пользу специфичных для файловой системы mkfs. <Type> utils», цитируется из man-страниц mkfs.
Гманьо

@gmagno, это правильно сейчас, конечно. Но, насколько я могу судить, не копая слишком долго или слишком усердно, это уведомление было впервые выпущено с помощью util-linux 2.25-rc1, и оно не попало в стабильную версию Debian довольно долго после июня 2015 года. Не стесняйтесь обновить ответ с текущей информацией, хотя.
Ройма

11

Есть другой способ сделать это в общем случае, использовать kpartx( не связанный с kde)

sudo kpartx -a binary.img

и теперь у вас должны быть все устройства разделов, определенные /dev/mapperкак loop0p1 , loop0p2 , ...

а потом

sudo mkfs.ext4 /dev/mapper/loop0p1

Необязательно, когда вы закончите, вы можете запустить также

sudo kpartx -d binary.img

избавиться от loop0p? deivce


2
Не уверен, почему это не имеет больше голосов. ИМО, это лучший ответ ...!
Джереми Дэвис

Работает с разделами GPT, например, если вы хотите изменить раздел EFI с диска на весь диск.
Расс

3

Я не знаю, почему это выглядит binary.img1

(… И позже для binary.img2похороненных в комментарии.)

Это потому, что инструменты ожидают, что имена файлов будут следовать определенному шаблону. Этот шаблон используется файлами файлов для реальных дисков и объемов дисков в вашей системе, а именно:

  • Файл устройства, охватывающий весь диск, называется sda(или что-то еще). Это то, что fdiskожидает использовать.
  • Файлы устройств для отдельных ломтиков диска, описываемого его разбиения, называются sda1, sda2, sda3, и так далее. Это то, что инструменты, такие как gpartedожидают использовать, когда они говорят, mkfsчтобы делать вещи на отдельных дисковых томах .

Конечно, обычные файлы не перекрываются так, как это делают файлы на дисковых устройствах. В ходе дискуссий с участием закольцованных файловой системы , что вы видели все о взятии одного файла изображения целого диска и с помощью обратной петли для создания 1, 2, 3и так далее файлы, отражающие отдельные дольки внутри него, как только нужный макет раздел был написан к таблице разделов.


Это имеет смысл!
Михаил Морфиков

0

Хотя эта тема не имеет прямого отношения, в ней упоминается много той же и связанной информации.

Debian Wiki | Raspberry Pi и qemu-user-static

Если вы не можете использовать aptдля установки некоторых команд, упомянутых в этом посте, попробуйте использовать apt-cache search [package_name]. Это может не привести к каким-либо результатам, если команда поступает из пакета с другим именем.

Например, losetupраньше он мог быть установлен как losetupиспользующийся apt install losetup, но теперь он является частью util-linuxрепозитория Ubuntu. Чтобы узнать, какой пакет действует как контейнер для другого пакета, вы должны воспользоваться поиском онлайн-репозитория для своего дистрибутива Linux. Или, если вам необходимо установить его из другого источника, используйте поисковую систему в Интернете.

Некоторые пакеты стоит проверить ...

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

Каждый дистрибутив Linux также имеет свои собственные онлайн-страницы. Иногда справочные страницы легче использовать, чем учебное пособие. На страницах руководства также будут описаны все параметры и параметры команд. Учебник обычно фокусируется только на тех, которые используются.


0

Минимальный пробег sfdisk+ mke2fsпример безsudo

В этом примере мы создадим, без sudoили setsuid, файл образа, который содержит два раздела ext2, каждый из которых заполнен файлами из каталога хоста.

Затем мы будем использовать sudo losetupтолько для монтирования разделов, чтобы проверить, действительно ли ядро ​​Linux может их прочитать, как описано по адресу: /programming/1419489/how-to-mount-one-partition-from-an-image -file-содержащий многодисковые разделы / 39675265 # 39675265

Для более подробной информации смотрите:

Пример:

#!/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. GitHub вверх по течению .

Помощник, чтобы обернуть существующий необработанный файл файловой системы в изображение

Извлеченное из вышесказанного, может быть полезным следующее:

# 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 вверх по течению .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.