Як відформатувати розділ всередині файлу 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, і я поняття не маю, як відформатувати розділ з команди в прямому ефірі.

Хтось знає, як відформатувати його за допомогою файлової системи ext4?


2
Один із варіантів полягає в тому, щоб виконати хитрість з цієї відповіді, а потім запустити mkfs.ext4 проти пристрою зворотного циклу.
Miikka

Я знайшов це посилання 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результату.
roaima

2
Що поганого в математиці? Крім того, добре знати, що ви можете легко отримати потрібний номер сектору таким чином, на всякий випадок ...
Михайло Морфіков

Просто швидке зауваження: "fkrontend mkfs застарілий на користь конкретних файлових систем mkfs. <Type> utils", цитується з mank-сторінок mkfs.
gmagno

@gmagno, це правильно зараз, звичайно. Але наскільки я можу визначити, не копаючи занадто довго або занадто важко, це повідомлення було вперше випущено лише з util-linux 2.25-rc1, і воно не потрапило до Debian стабільно до кінця після червня 2015 року. однак оновити відповідь поточною інформацією.
roaima

11

Є ще один спосіб зробити це в цілому, використовувати kpartx( не пов'язано з kde)

sudo kpartx -a binary.img

і тепер у вас повинні бути всі пристрої розділів, визначені /dev/mapperяк loop0p1 , loop0p2 , ...

і потім

sudo mkfs.ext4 /dev/mapper/loop0p1

Як правило, коли ви закінчите, ви також можете запустити

sudo kpartx -d binary.img

позбутися loop0p? пожирати


2
Не впевнений, чому це не має більше голосів. ІМО, це найкраща відповідь ...!
Джеремі Девіс

Працює з розділами GPT, наприклад, якщо ви хочете змінити розділ EFI цілого диска dd.
Русс

3

Я не знаю, чому це шукає binary.img1

(… І пізніше для binary.img2поховання в коментарі.)

Це тому, що інструменти очікують, що імена файлів будуть дотримуватися певної моделі. Цей шаблон є тим, який використовується файлами пристрою для фактичних дисків і обсягів дисків у вашій системі, а саме:

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

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


Що має сенс!
Михайло Морфіков

0

Хоча ця тема безпосередньо не пов'язана, вона згадує багато тієї самої та пов’язаної інформації.

Вікі Debian | Raspberry Pi і qemu-користувач-статик

Якщо ви не 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 -файл-що-містить-кілька-розділів / 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.