Як створити відформатований файл зображення розділу з нуля?


16

Мені потрібно створити файлову систему лише з одного розділу з нічого ( /dev/zero). Я спробував цю послідовність команд:

dd if=/dev/zero of=mountedImage.img bs=512 count=131072
fdisk mountedImage.img
    n
    p 
    2048
    131072

В основному, мені потрібно створити файл зображення 64 Мб, заповнений нулями. Потім я використовую fdiskдля додавання нового розділу для нової файлової системи (яка нарешті повинна бути FAT32), починаючи з сектору 2048та використовуючи всі решта секторів.

losetup /dev/loop1 mountedImage.img
mkfs -t vfat /dev/loop1

Але тут я зачіпаю проблеми. Якщо я налаштував loopпристрій і відформатував його за допомогою mkfs -t vfat, таблиця розділів буде перезаписана і файлова система (FAT32) поміщається на диск. Мені не потрібен цілий диск, відформатований за допомогою FAT32, мені просто потрібен мій основний розділ.

Хтось знає, як я можу відформатувати лише один розділ неочищеного образу диска, а не ціле зображення?


Поясніть, що ви маєте на увазі, налаштувавши циклічний пристрій та опублікуйте весь mkfsдзвінок. Мені довелося прочитати ваш пост 3 рази, щоб зрозуміти вашу проблему. Хоча я не можу вам допомогти, я зацікавлений у тому, чому ви створюєте файл зображення (!), Але все ще хочу залишити невикористаними перші n "секторів".
Bananguin

Гаразд, відредагував. Я хочу залишити перші п яти секторів (що не так з секторами) невикористаними, оскільки мені потрібно десь розмістити свої завантажувачі.
користувач35443


@MichaelMrozek Є міркування, які стосуються деяких дистрибутивів Linux, але не Ubuntu (важливо, loopє модуль чи вбудовано в ядро), тому я думаю, що для кожного сайту корисно мати свою версію питання, і я проголосував за повторне відкриття.
Жил "ТАК - перестань бути злим"

@MichaelMrozek Особисто я вважаю, що AskUbuntu є більш специфічним, ніж Unix та Linux, тому якщо питання перехресне для обох, якщо тільки немає конкретних причин, щоб закрити тут, це питання на AskUbuntu, яке слід закрити як перехресне повідомлення, якщо вони були розміщені близько в часі один до одного, незалежно від того, де він був розміщений "першим" (можливо, із згадкою про відповіді Ubuntu / не-Ubuntu тут). Тут є прийнята відповідь, якої немає в AskUbuntu, що не підтримує цей відкритий ІМО. У мене немає голосування, щоб закрити AskUbuntu, але я голосую за повторне відкриття питання тут.
CVn

Відповіді:


20

Якщо в Linux, завантажуючи loopмодуль, переконайтеся, що ви передаєте max_partпараметр модулю, щоб петлеві пристрої були частковими.

Перевірте поточне значення:

cat /sys/module/loop/parameters/max_part

Якщо це 0:

modprobe -r loop # unload the module
modprobe loop max_part=31

Щоб зробити це налаштування стійким, додайте наступний рядок до /etc/modprobe.confабо до файлу, /etc/modprobe.dякщо цей каталог існує у вашій системі:

options loop max_part=31

Якщо modprobe -r loopне вдається, оскільки вбудований цикл модуля, вам потрібно буде додати loop.max_part=31до командного рядка ядра та перезавантажити. Якщо вашим завантажувачем є Grub2, додайте до нього значення GRUB_CMDLINE_LINUXв etc/default/grub.

Тепер ви можете створити роздільний пристрій:

truncate -s64M file # no need to fill it with zeros, just make it sparse
fdisk file # create partitions
losetup /dev/loop0 file
mkfs.vfat /dev/loop0p1 # for the first partition.
mount /dev/loop0p1 /mnt/

(зауважте, що вам потрібна відносно недавня версія Linux).


FATAL: Цикл модуля вбудований, чи можна це вирішити, встановивши останню версію ubuntu (у мене 12.04)?
користувач35443

Якщо вбудований просто не потрібен модуль, перейдіть loop.max_part=31до командного рядка ядра
Алекс

1
Ну я бачу, якщо у вас недавнє ядро ​​і ви передаєте max_part, зміщення та sizelimit взагалі не потрібні
Алекс

Хм, командний рядок ядра, занадто важкий для мене. Ще дякую, приймай.
користувач35443

Це loop.maxpart=31чи loop.max_part=31в командному рядку ядра?
Крістіан Цюпіту

4

losetup /dev/loop0 file -o 1048576 --sizelimit limit

Зазначене зміщення має бути в байтах (1048576 = 2048 секторів * 512 байт на сектор).

mount -o loop,offset=1048576,sizelimit=limit

Для отримання додаткової інформації дивіться програму " втрата" та встановлення .


Хм, офсет, це має працювати. А що, якби в мене було більше розділів?
user35443

Я здогадуюсь, одна петля = одна секція = одне зміщення.
Олексій

хм, а чи є можливість вказати також розмір, щоб я міг обмежити його і розмістити там більше розділів?
користувач35443

Вибачте за мою провину створити нову відповідь з частковим рішенням, правильна відповідь - від @ "Stephane Chazelas", він може просто додати варіанти зміщення та розміщення (тоді я видалю мою)
Алекс

Нехай це не буде тут, інакше мій +1 нікуди не піде.
користувач35443

2

Наступні процедури дозволяють монтувати розділи зображення для їх зміни.

параметр losetup 2.21 -P

losetup -P -f --show my.img

Створює один /dev/loopXpYна розділ.

Перевага: виконуваний попередньо встановлений у багатьох дистрибутивах (пакет util-linux).

Недолік: досить недавній варіант, відсутній в Ubuntu 14.04.

losetup -P автоматизація

Використання:

$ los my.img
/dev/loop0
/mnt/loop0p1
/mnt/loop0p2

$ ls /mnt/loop0p1
/whatever
/files
/youhave
/there

$ sudo losetup -l
NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                                                      DIO
/dev/loop1         0      0         0  0 /full/path/to/my.img

$ # Cleanup.
$ losd 0
$ ls /mnt/loop0p1
$ ls /dev | grep loop0
loop0

Джерело:

los() (
  img="$1"
  dev="$(sudo losetup --show -f -P "$img")"
  echo "$dev"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    echo "$dst"
    sudo mkdir -p "$dst"
    sudo mount "$part" "$dst"
  done
)
losd() (
  dev="/dev/loop$1"
  for part in "$dev"?*; do
    if [ "$part" = "${dev}p*" ]; then
      part="${dev}"
    fi
    dst="/mnt/$(basename "$part")"
    sudo umount "$dst"
  done
  sudo losetup -d "$dev"
)

kpartx

sudo apt-get install kpartx
losetup -fs my.raw
sudo kpartx -a my.img
ls /dev/mapper

Вихід:

/dev/mapper/loop0
/dev/mapper/loop0p1

де loop0p1перший розділ, ми можемо зробити:

mkdir -p d
sudo mount /dev/mapper/loop0p1 d

Перевага цього методу: працює на Ubuntu 14.04 без перезавантаження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.