¿Cómo crear un archivo de imagen de partición formateado desde cero?


16

Necesito crear un sistema de archivos con solo una partición de la nada ( /dev/zero). Intenté esta secuencia de comandos:

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

Básicamente, necesito crear un archivo de imagen de 64 MB lleno de ceros. Luego uso fdiskpara agregar una nueva partición para el nuevo sistema de archivos (que finalmente debería ser FAT32), comenzando en el sector 2048y usando todos los sectores restantes.

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

Pero aquí estoy golpeando problemas. Si configuro un loopdispositivo y lo formateo usando mkfs -t vfat, la tabla de particiones se sobrescribe y el sistema de archivos (FAT32) se coloca en el disco. No necesito un disco completo formateado con FAT32, solo necesito que mi partición primaria sea así.

¿Alguien sabe cómo puedo formatear solo una partición de la imagen de disco sin formato, no la imagen completa?


Aclara lo que quieres decir configurando un dispositivo de bucle y publica toda tu mkfsllamada. Tuve que leer tu publicación 3 veces para entender tu problema. Si bien no puedo ayudarte, estoy interesado en por qué creas un archivo de imagen (!) Pero aún así quiero dejar los primeros n "sectores" sin usar.
Bananguin

Ok, lo edité. Quiero dejar los primeros n sectores (¿qué hay de malo en los sectores?) Sin usar, ya que necesito colocar mis cargadores de arranque en algún lugar.
user35443


@MichaelMrozek Hay consideraciones que se aplican a algunas distribuciones de Linux pero no a Ubuntu (importa si loopes un módulo o está integrado en el núcleo), por lo que creo que es útil que cada sitio tenga su versión de la pregunta y voté para volver a abrirla.
Gilles 'SO- deja de ser malvado'

@MichaelMrozek Personalmente, creo que AskUbuntu es más específico que Unix y Linux, por lo que si una pregunta se publica en ambos, a menos que haya razones específicas para cerrar aquí, es la de AskUbuntu que debería cerrarse como publicación cruzada si fueran publicado cerca de tiempo entre sí, independientemente de dónde fue publicado "primero" (posiblemente con una mención de las respuestas de Ubuntu / no Ubuntu aquí). Aquí tiene una respuesta aceptada, que la de AskUbuntu no, lo que favorece fuertemente mantener esta abierta IMO. No tengo el representante para votar para cerrar AskUbuntu, pero estoy votando para volver a abrir la pregunta aquí.
un CVn

Respuestas:


20

Si está en Linux, al cargar el loopmódulo, asegúrese de pasar una max_partopción al módulo para que los dispositivos de bucle sean particionables.

Verifique el valor actual:

cat /sys/module/loop/parameters/max_part

Si es 0:

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

Para que esta configuración sea persistente, agregue la siguiente línea /etc/modprobe.confa un archivo /etc/modprobe.dsi ese directorio existe en su sistema:

options loop max_part=31

Si modprobe -r loopfalla porque "El bucle del módulo está integrado", deberá agregarlo loop.max_part=31a la línea de comando del núcleo y reiniciar. Si su gestor de arranque es Grub2, agréguelo al valor de GRUB_CMDLINE_LINUXin etc/default/grub.

Ahora, puede crear un dispositivo de bucle particionable:

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/

(tenga en cuenta que necesita una versión relativamente reciente de Linux).


FATAL: El bucle del módulo está incorporado, ¿se puede resolver instalando la última versión de ubuntu (tengo 12.04)?
user35443

Si simplemente no es necesario modificar la sonda, pase la loop.max_part=31línea de comando del kernel
Alex

1
Ah, ya veo, si tienes un kernel reciente y pasas el max_part, el offset y el sizelimit no son necesarios en absoluto
Alex

Hmm, línea de comando del núcleo, demasiado difícil para mí. Aún así, gracias, acepta.
user35443

¿Está loop.maxpart=31o loop.max_part=31en la línea de comando del núcleo?
Cristian Ciupitu

4

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

La compensación especificada debe estar en bytes (1048576 = 2048 sectores * 512 bytes por sector).

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

Para obtener más información, consulte losetup y mount .


Hmm, offset, esto debería funcionar. ¿Y si tuviera más particiones?
user35443

Supongo que un bucle = una partición = un desplazamiento.
Alex

uhm, y ¿hay una opción para especificar también el tamaño, para que pueda limitarlo y colocar más particiones?
user35443

Lo siento, es mi culpa crear una nueva respuesta con una solución parcial, la respuesta correcta es de @ "Stephane Chazelas", él solo puede agregar las opciones de desplazamiento y límite de tamaño (luego eliminaré la mía)
Alex

No dejes que esté aquí, o el mío +1 no irá a ninguna parte.
user35443

2

Los siguientes procedimientos le permiten montar las particiones de la imagen para modificarlas.

opción losetup 2.21 -P

losetup -P -f --show my.img

Crea uno /dev/loopXpYpor partición.

Ventaja: ejecutable preinstalado en muchas distribuciones (paquete util-linux).

Desventaja: opción bastante reciente, no presente en Ubuntu 14.04.

losetup -P automatización

Uso:

$ 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

Fuente:

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

Salida:

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

donde loop0p1está la primera partición, entonces podemos hacer:

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

Ventaja de este método: funciona en Ubuntu 14.04 sin reiniciar.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.