Como configurar um dispositivo de loop no momento da inicialização?

14

Quero configurar um dispositivo de loop no momento da inicialização. Gostaria de saber qual é a melhor maneira de fazer isso.

Eu procurei no google. Alguns dizem que a adição de uma regra do udev, outros dizem a inserção de scripts /etc/init.d, alguns até modificam o initramfs.

Então, qual é a melhor ou a maneira correta de fazer isso? Você poderia nos dar alguns detalhes (sobre como fazer)?

Obrigado.

Roun
fonte
Eu iria com /etc/init.d/something, ou /etc/rc.local, mas sugiro permanecer com qualquer método que funcione.
enzotib 29/07
6
Pelo que? Se você deseja que um arquivo seja montado no momento da inicialização, basta adicioná-lo ao / etc / fstab com a opção loop e o mount cuidará da configuração do dispositivo de loopback para você.
psusi 29/07
@psusi: Obrigado pelo seu conselho, mas para o meu propósito, a montagem não é suficiente e, de fato, o arquivo não pode ser simplesmente montado. É uma imagem de disco em vez de uma imagem de partição. E preciso saber o nome exato do dispositivo de loop para usá-lo para criar um disco virtual no VirtualBox. (Eu faço esse tipo de pensamento rígido virtual é mais fácil de compartilhar arquivos entre a máquina virtual e a máquina host A built-in pasta compartilhada não funciona para algumas aplicações..)
Roun
4
Você pode apenas apontar a máquina virtual para o arquivo e não para o dispositivo de loopback. Você também precisa ter muito cuidado para garantir que nunca execute a máquina virtual (ou a suspenda) e monte o sistema de arquivos no host ao mesmo tempo ou corromperá o fs. Por esse motivo, é uma idéia muito melhor usar a rede para que os arquivos de acesso de convidados que o host esteja compartilhando via nfs ou samba ou sshfs.
Psusi 29/07
@Roun: As partições no arquivo ainda podem ser montadas, embora você precise especificar o deslocamento do setor da partição desde o início do arquivo (por exemplo, mount /disk.img /mnt -o loop,offset=2048para a primeira partição). Compensações ou fdisk podem ser encontrados deslocamentos assim que o dispositivo de loop estiver configurado (veja minha resposta abaixo).
precisa saber é o seguinte

Respostas:

7

Existem pelo menos três maneiras "apropriadas" de fazer coisas de inicialização no Ubuntu (presumindo que você não queira apenas montá-lo), listadas aqui em ordem decrescente de preferência:

  1. /etc/init/*.conf (Subir na vida)
  2. /etc/init.d/* (sysvinit)
  3. /etc/rc.local (script de mudança de nível de execução)

Há também a possibilidade de usar as regras do udev, mas elas serão complicadas. Eu recomendo contra isso. O script sysvinit é um exagero para uma coisa tão pequena, então vou me concentrar nas outras duas opções. O script de alteração do nível de execução é mais simples (embora menos preferido), então vou começar por aí.

O /etc/rc.localarquivo é simplesmente executado pelo /etc/init.d/rc.localscript sysvinit, que é (por padrão) executado pela última vez ao alternar para qualquer nível de execução "on" normal (por exemplo, quando você inicializa normalmente, mas não quando você desliga ou entra no modo de recuperação). Para implementar a configuração do dispositivo de inicialização, basta adicioná-lo no final de /etc/rc.local, assumindo que seu arquivo seja chamado /srv/diskimagee que você deseja usar /dev/loop0como dispositivo de loop:

losetup /dev/loop0 /srv/diskimage

Isso é realmente tudo o que existe. Obviamente, substitua os nomes de arquivos pelo que funcionar melhor em sua configuração.

Se quiser ser um pouco mais específico, é possível criar um trabalho Upstart para ele, que o configura assim que o sistema de arquivos que o contém foi montado. Um exemplo seria o seguinte, supondo que esse /srvfosse o ponto de montagem que contém seu diskimagearquivo:

description     "Setup loop devices after filesystems are mounted"

start on mounted MOUNTPOINT=/srv
task
exec losetup /dev/loop0 /srv/diskimage

Isso deve ser simples o suficiente para seguir conceitualmente: a primeira linha é apenas um comentário para leitores humanos, e é necessário que a Upstart aguarde até que o /srvsistema de arquivos seja montado, execute o processo de losetup e considere-se concluído quando o processo terminar com êxito (a " tarefa ", em oposição a um serviço persistente). Basta colocar esse conteúdo em um arquivo correspondente /etc/init/*.conf. Eu escolheria /etc/init/losetup.confeu mesmo.

As vantagens dos trabalhos Upstart /etc/rc.localpara uma coisa tão simples são pequenas, mas importantes. Primeiro, ele /etc/rc.localestá obsoleto e seu uso como apenas uma "caixa de areia bagunçada para fazer as coisas" é desaprovado por praticamente todo mundo hoje em dia. Entre outras razões para desaprová-lo, alguns programas que usam esse arquivo simplesmente substituem o conteúdo e é difícil reconciliar diferentes scripts que precisam ser inseridos no mesmo arquivo. Segundo, o Upstart realmente lida com a verificação de dependência para você (certificando-se de que o sistema de arquivos seja montado primeiro); portanto, se houver um problema ao montar o sistema de arquivos, ele não serátente configurar o dispositivo de loop .... mas depois de resolvê-lo e montá-lo. Terceiro, o Upstart é muito mais flexível: você pode, por exemplo, ser inteligente o suficiente para encontrar um dispositivo de loop não utilizado e "emitir" esse dispositivo de loop para uso em outros trabalhos iniciantes, semelhante ao modo como usamos a variável "MOUNTPOINT" neste exemplo acima.

zanfur
fonte
Como o /etc/init/losetup.conf invocou ??? Não o seu trabalho para mim ...
Imran
1

Como o @psusi apontou, a maneira mais fácil é adicionar a seguinte linha ao seu /etc/fstabarquivo

/path/to/loop/device       /path/to/mount/point       auto       loop       0 0

Agora reinicie ou execute mount -acomo root. Em seguida, o dispositivo deve ser montado. Você pode verificar isso com lsblk.

navigaid
fonte