Criando imagens de disco como um usuário normal

4

Eu quero ser capaz de executar o seguinte script como usuário normal (como root, ele corre bem):

#!/bin/sh

dd if=/dev/zero bs=8192 count=128 of=disk.img
mkfs -t ext2 -F disk.img
losetup /dev/loop0 disk.img
mount /dev/loop0
echo aaaa > /mnt/aa
umount /mnt
losetup -d /dev/loop0

Para esse fim, eu

1) adicionou a entrada apropriada para / etc / fstab (somente então o usuário normal pode executar 'mount / dev / loop0'):

/dev/loop0  /mnt  ext2    defaults,loop,users,noauto      0 0

2) adicionou o usuário em questão ao grupo 'disk' (somente então o usuário pode executar 'losetup' - / dev / loop0 é de propriedade do grupo 'disk')

Agora, esperamos que o último problema seja que, quando eu corro como usuário normal, recebo o erro 'permissão negada' de 'echo'. Não é de admirar, porque após a montagem, as permissões do diretório / mnt mudam para 755 root: root, e obviamente um usuário normal não pode criar arquivos dentro dele.

Como devo criar meu 'disk.img' para que, quando montado, seja gravável pelo próprio usuário que o criou?

Editar:

A solução 'pmount' proposta parece ter o mesmo problema. Etapas de reprodução:

1) instale 'pmount' e adicione '/ dev / loop0' ao /etc/pmount.allow

2) execute o seguinte como um usuário normal:

#!/bin/sh

dd if=/dev/zero bs=8192 count=128 of=disk.img
mkfs -t ext2 -F disk.img
losetup /dev/loop0 disk.img
pmount -w /dev/loop0
echo aaaa > /media/loop0/aa
pumount /media/loop0
losetup -d /dev/loop0

Você ainda receberá 'permissão negada' pelo echo pela mesma razão que nós a obtivemos antes - as permissões do diretório / media / loop0 / são 755:

[user@server test]$ ls -l /media/
total 1
drwxr-xr-x 3 root root 1024 Jul 22 13:40 loop0
[user@server test]$ ls -l /media/loop0/
total 12
drwx------ 2 root root 12288 Jul 22 13:40 lost+found

Edit2:

Consegui resolver isso - a opção 'root_owner' para mkfs.ext3 é útil:

#!/bin/sh

WHOAMI='whoami'

uid=$(id -u $WHOAMI)
gid=$(id -g $WHOAMI)

dd if=/dev/zero bs=8192 count=128 of=disk.img
mkfs.ext3 -E root_owner=$uid:$gid disk.img
losetup /dev/loop0 disk.img
mount /dev/loop0
echo aaaa > /mnt/aa
umount /mnt
losetup -d /dev/loop0

Em seguida, após a montagem, o ponto de montagem é de propriedade do usuário que está executando o script e, em seguida, o usuário pode escrever dentro de:)

    
por Leszek 22.07.2016 / 13:48

2 respostas

3

Use pmount em vez de mount .

  

pmount ("policy mount") é um wrapper em torno do programa de montagem padrão que permite que usuários normais montem dispositivos removíveis sem uma entrada /etc/fstab correspondente.

Provavelmente queira o ...

  

-w , --read-write

     

Força o dispositivo a ser montado como leitura / gravação. Se nem -r nor -w for especificado, o kernel escolherá um padrão apropriado.

Assim, você pode descartar a entrada fstab e não precisa adicionar o usuário ao grupo disk .

Ele permite a montagem em qualquer lugar abaixo de /media/ se o dispositivo estiver listado em /etc/pmount.allow , para que também resolva quaisquer problemas de permissão.

    
por Rinzwind 22.07.2016 / 13:58
1

Rinzwind: meu script simplificado que postei na pergunta acima não mostra, mas há um problema com a solução 'pmount'.

O problema é que parece ser capaz de montar / media.

O script completo é mais complicado: ele cria um arquivo de imagem grande de 500MB (imagem de um USB pendrive), particiona em 2 partições (FAT32 e Ext3), monta ambos em TMPFS (/ tmp / loop0p1 e / tmp / loop0p2 ) e escreve um loooot de dados dentro.

É importante poder montar o TMPFS para que esta operação seja rápida - na minha experiência, fazê-lo dentro do TMPFS faz isso mais de 10 vezes mais rápido do que fazê-lo em um dispositivo de bloco real em um HD.

/ media não é o TMPFS ...

    
por Leszek 22.07.2016 / 14:21