Как создать отформатированный файл образа раздела с нуля?


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

Хорошо, отредактировал это. Я хочу оставить первые n секторов (что не так с секторами?) Неиспользованными, так как мне нужно где-то разместить свои загрузчики.
user35443


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

@MichaelMrozek Лично я чувствую, что AskUbuntu более специфичен, чем Unix и Linux, поэтому, если вопрос перекрестно опубликован на оба, если нет особых причин для закрытия, то этот вопрос на AskUbuntu следует закрыть как перекрестный пост, если они были размещены близко друг к другу, независимо от того, где они были размещены «первыми» (возможно, с упоминанием ответов Ubuntu / не-Ubuntu здесь). Здесь у него есть принятый ответ, которого нет у AskUbuntu, что настоятельно рекомендует оставить этот открытый IMO. У меня нет представителя, чтобы голосовать, чтобы закрыть 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_LINUXin 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).


ФАТАЛЬНО: встроен цикл модуля, можно ли это решить, установив последнюю версию ubuntu (у меня 12.04)?
user35443

Если для modprobe не требуется встроенный модуль, передайте loop.max_part=31его в командную строку ядра
Alex

1
Ах, я вижу, если у вас последнее ядро ​​и вы передаете max_part смещение и sizelimit вообще не нужны
Alex

Хм, командная строка ядра, слишком сложная для меня. Еще спасибо, принимаю.
user35443

Это 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

Для получения дополнительной информации см. Losttup и mount .


Хм, смещение, это должно работать. А что если бы у меня было больше разделов?
user35443

Я думаю, один цикл = один раздел = одно смещение.
Алекс

хм, а есть ли возможность указать также размер, чтобы я мог ограничить его и разместить там больше разделов?
user35443

Извините, я не смог создать новый ответ с частичным решением, правильный ответ от @ "Stephane Chazelas", он может просто добавить параметры смещения и sizelimit (тогда я удалю мой)
Alex

Нет, пусть это будет здесь, или мой +1 никуда не денется.
user35443

2

Следующие процедуры позволяют вам смонтировать разделы образа для их изменения.

потерять 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.