Como criar um arquivo de imagem de partição formatada do zero?

16

Eu preciso criar um sistema de arquivos com apenas uma partição do nada ( /dev/zero). Eu tentei esta sequência de comandos:

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

Basicamente, preciso criar um arquivo de imagem de 64 MB preenchido com zeros. Então eu uso fdiskpara adicionar uma nova partição para o novo sistema de arquivos (que finalmente deve ser o FAT32), iniciando no setor 2048e usando todos os demais setores.

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

Mas aqui estou atingindo problemas. Se eu configurar um loopdispositivo e formatá-lo usando mkfs -t vfat, a tabela de partição será substituída e o sistema de arquivos (FAT32) será colocado no disco. Não preciso de um disco inteiro formatado com o FAT32, apenas da minha partição primária.

Alguém sabe como posso formatar apenas uma partição da imagem de disco bruto, não a imagem inteira?

user35443
fonte
Esclareça o que você quer dizer com a configuração de um dispositivo de loop e poste toda a sua mkfschamada. Eu tive que ler sua postagem três vezes para entender seu problema. Embora eu não possa ajudá-lo, estou interessado em saber por que você cria um arquivo de imagem (!), Mas ainda assim quero deixar os primeiros n "setores" sem uso.
Bananguin 17/08/2013
Ok, editei. Quero deixar os primeiros n setores (o que há de errado com os setores?) Não utilizados, pois preciso colocar meus gerenciadores de inicialização em algum lugar.
user35443
Crossposted
Michael Mrozek
@MichaelMrozek Há considerações que se aplicam a algumas distribuições do Linux, mas não ao Ubuntu (importa se loopé um módulo ou incorporado ao kernel), então eu acho que é útil para cada site ter sua versão da pergunta e votei para reabrir.
Gilles 'SO- stop be evil'
@MichaelMrozek Pessoalmente, acho que o AskUbuntu é mais específico do que o Unix e o Linux, portanto, se uma pergunta é postada cruzada para ambos, a menos que haja motivos específicos para fechar aqui, é o do AskUbuntu que deve ser fechado como postado cruzado, se houver postados próximos um do outro, independentemente de onde foram publicados "primeiro" (possivelmente com uma menção de respostas do Ubuntu / não-Ubuntu aqui). Aqui, ele possui uma resposta aceita, a que não é solicitada no AskUbuntu, o que favorece fortemente manter este IMO aberto. Não tenho o representante para votar para fechar no AskUbuntu, mas estou votando para reabrir a pergunta aqui.
um CVn 19/09/13

Respostas:

20

Se no Linux, ao carregar o loopmódulo, certifique-se de passar ummax_part opção ao módulo para que os dispositivos de loop sejam particionáveis.

Verifique o valor atual:

cat /sys/module/loop/parameters/max_part

Se for 0:

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

Para tornar essa configuração persistente, adicione a seguinte linha a /etc/modprobe.confou a um arquivo, /etc/modprobe.dse esse diretório existir em seu sistema:

options loop max_part=31

Se modprobe -r loopfalhar porque “O loop do módulo está embutido”, você precisará adicionar loop.max_part=31à sua linha de comando do kernel e reiniciar. Se o seu bootloader é Grub2, adicionar a ele para o valor de GRUB_CMDLINE_LINUXnoetc/default/grub .

Agora, você pode criar um dispositivo de loop particionável:

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/

(observe que você precisa de uma versão relativamente recente do Linux).

Stéphane Chazelas
fonte
FATAL: O loop do módulo está embutido. Isso pode ser resolvido com a instalação da última versão do ubuntu (eu tenho 12.04)?
user35443
Se é incorporado apenas não precisava modprobe, passe o loop.max_part=31para a linha de comando do kernel
Alex
11
Ah eu vejo, se você tem um kernel recente e você passar o max_part o deslocamento ea sizelimit não são necessários em tudo
Alex
Hmm, linha de comando do kernel, muito difícil para mim. Ainda obrigado, aceite.
user35443
É loop.maxpart=31ou está loop.max_part=31na linha de comando do kernel?
Cristian Ciupitu
4

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

O deslocamento especificado deve estar em bytes (1048576 = 2048 setores * 512 bytes por setor).

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

Para mais informações, consulte losetup and mount .

Alex
fonte
Hmm, deslocamento, isso deve funcionar. E se eu tivesse mais partições?
user35443
Eu acho que um loop = uma partição = um deslocamento.
18713 Alex
uhm, e existe uma opção para especificar também o tamanho, para que eu possa limitá-lo e colocar mais partições?
user35443
Desculpe minha falha ao criar uma nova resposta com uma solução parcial, a resposta certa é de @ "Stephane Chazelas", ele pode apenas adicionar as opções de deslocamento e sizelimit (então vou excluir a minha) #
Alex Alex
Não deixe estar aqui, ou o meu +1 não vai a lugar nenhum.
user35443
2

Os procedimentos a seguir permitem montar as partições da imagem para modificá-las.

opção losetup 2,21 -P

losetup -P -f --show my.img

Cria um /dev/loopXpYpor partição.

Vantagem: executável pré-instalado em muitas distros (pacote util-linux).

Desvantagem: opção bastante recente, não presente no Ubuntu 14.04.

losetup -P automação

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

Fonte:

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

Resultado:

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

Onde loop0p1está a primeira partição, para que possamos fazer:

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

Vantagem deste método: funciona no Ubuntu 14.04 sem reiniciar.

Ciro Santilli adicionou uma nova foto
fonte