Eu tenho uma máquina host KVM com várias VMs. Cada VM usa um volume lógico no host. Preciso copiar os LVs para outra máquina host.
Normalmente, eu usaria algo como:
dd if=/the/logical-volume of=/some/path/machine.dd
Para transformar o LV em um arquivo de imagem e use o SCP para movê-lo. Em seguida, use DD para copiar o arquivo de volta para um novo LV no novo host.
O problema com esse método é que você precisa do dobro do espaço em disco que a VM ocupa nas duas máquinas. ie um LV de 5 GB usa 5 GB de espaço para o LV e a cópia em dd também usa 5 GB de espaço adicional para a imagem. Isso é bom para LVs pequenos, mas e se (como é o meu caso) você tiver um LV de 500 GB para uma grande VM? A nova máquina host possui um disco rígido de 1 TB, portanto, não pode conter um arquivo de imagem dd de 500 GB e possui um volume lógico de 500 GB para copiar e espaço para o sistema operacional host e espaço para outros convidados menores.
O que eu gostaria de fazer é algo como:
dd if=/dev/mygroup-mylv of=192.168.1.103/dev/newvgroup-newlv
Em outras palavras, copie os dados diretamente de um volume lógico para outro na rede e pule o arquivo de imagem intermediário.
Isso é possível?
Respostas:
Claro, é claro que é possível.
Estrondo.
Faça um favor a si mesmo e use algo maior que o tamanho padrão do bloco. Talvez adicione bs = 4M (leitura / gravação em pedaços de 4 MB). Você pode ver que há alguns detalhes sobre tamanhos de blocos nos comentários; se isso é algo que você se faz com bastante frequência, reserve um tempo para experimentá-lo algumas vezes com tamanhos de bloco diferentes e veja por si mesmo o que oferece as melhores taxas de transferência.
Respondendo a uma das perguntas dos comentários:
Você pode canalizar a transferência através de pv para obter estatísticas sobre a transferência. É muito melhor do que a saída que você obtém ao enviar sinais
dd
.Eu também direi que, embora, obviamente, o uso do netcat - ou qualquer outra coisa que não imponha a sobrecarga de criptografia - seja mais eficiente, geralmente acho que a velocidade adicional ocorre com alguma perda de conveniência. A menos que eu esteja movendo conjuntos de dados muito grandes, normalmente fico com o ssh, apesar da sobrecarga, porque na maioria dos casos tudo já está configurado para Just Work.
fonte
dd
processo aoUSR1
sinal para exibir uma linha de status com o valor transferido. Obter o número do processo do seudd
processo com algo parecidops aux | grep dd
e, em seguida, usar esta PID com o comandokill -USR1 $PID
. A mensagem será exibida no terminal original onde você começoudd
.Aqui está uma versão otimizada, que mostra o progresso usando
pv
e usa BS para pedaços maiores e também usagzip
para reduzir o tráfego de rede.Isso é perfeito ao mover os dados entre conexões lentas, como servidores da Internet. Eu recomendo executar o comando dentro de uma sessão de tela ou tmux. Dessa forma, a conexão ssh com o host de onde você executa o comando pode ser desconectada sem problemas.
fonte
ssh -C
vez degzip
. Não tenho certeza se há um impacto no desempenho, mas é muito menos digitação.pv
pode causar problemas (na minha experiência, movendo mais 500 vps para outros servidores com este sistema) com o número de bytes e, após esse problema, os volumes lvm são inconsistentes. Os benefícios de ver o progresso do trabalho são nulos e perigosos. Se você gosta de ver o progresso, abra um console com ifto, por exemplo.Que tal usar um amigo antigo para fazer isso. NetCat.
No sistema que está perdendo o tipo de volume lógico
$ dd if=/dev/[directory]/[volume-name] | nc -l [any high number port]
Depois, no sistema receptor. tipo
$ nc -w 10 [ip or name] [port] | dd of=/dev/[directory/[volume name]
Traduzindo, orgin box dd esse arquivo e canalize-o para nc (netcat) que ouvirá essa porta. No sistema receptor, o netcat aguardará 10 segundos se não obtiver dados antes de fechar para [ip ou nome] em [porta] e depois canalize esses dados para dd para gravá-los.
fonte
Primeiro, eu tiraria um instantâneo do lv:
Depois disso, você deve criar um novo lv no novo host (por exemplo, usando lvcreate) com o mesmo tamanho. Em seguida, você pode copiar os dados diretamente para o novo host. Aqui está o meu exemplo do comando copy:
Eu usei o procedimento para copiar uma VM mantida proxmox pve para outro host. O volume lógico continha vários LVs adicionais que foram mantidos pela própria VM.
fonte
Primeiro, verifique se o volume lógico não está montado. Se for e você deseja fazer uma "cópia quente", crie primeiro um instantâneo e use-o:
lvcreate --snapshot --name transfer_snap --size 1G
Eu tenho que transferir muitos dados (7 TB) entre dois servidores conectados de 1 Gbit, então eu precisava da maneira mais rápida possível de fazê-lo.
Você deve usar SSH?
O uso de ssh está fora de questão, não por causa de sua criptografia (se você possui uma CPU com suporte AES-NI, não dói muito), mas por causa de seus buffers de rede. Aqueles não estão bem dimensionados. Existe uma versão Ssh corrigida que resolve esse problema, mas como não existem pacotes pré-compilados, isso não é muito conveniente.
Usando compactação
Ao transferir imagens de disco bruto, é sempre aconselhável usar a compactação. Mas você não deseja que a compactação se torne um gargalo. A maioria das ferramentas de compactação unix, como o gzip, são de thread único; portanto, se a compactação saturar uma CPU, será um gargalo. Por esse motivo, eu sempre uso pigz, uma variante gzip que usa todos os núcleos da CPU para compactação. E é necessário que você queira ir acima e acima da velocidade do GBit.
Usando criptografia
Como dito anteriormente, o ssh é lento. Se você possui uma CPU AES-NI, isso não deve ser um gargalo. Então, ao invés de usar o ssh, podemos usar o openssl diretamente.
Velocidades
Para lhe dar uma idéia do impacto na velocidade dos componentes, aqui estão meus resultados. Essas são velocidades de transferência entre dois sistemas de produção, lendo e gravando na memória. Os resultados reais dependem da velocidade da rede, da velocidade do disco rígido e da velocidade da CPU de origem! Estou fazendo isso para mostrar que pelo menos não há uma queda enorme no desempenho.
Simple nc dd: 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 47.3576 s, 106 MB/s +pigz compression level 1 (speed gain depends on actual data): network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 38.8045 s, 130 MB/s +pigz compression level 5: network traffic: 2.43GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 44.4623 s, 113 MB/s +compression level 1 + openssl encryption: network traffic: 2.52GiB 5033164800 bytes (5.0 GB, 4.7 GiB) copied, 43.1163 s, 117 MB/s
Conclusão: o uso de compactação proporciona uma aceleração notável, pois reduz muito o tamanho dos dados. Isso é ainda mais importante se você tiver velocidades de rede mais lentas. Ao usar a compactação, observe o uso da CPU. se o uso for maximizado, você pode tentar sem ele. Usar a compactação como apenas um pequeno impacto nos sistemas AES-NI, imho apenas porque rouba cerca de 30 a 40% da CPU.Usando a tela
Se você estiver transferindo muitos dados como eu, não deseja que eles sejam interrompidos por uma desconexão de rede do seu cliente ssh, portanto é melhor iniciá-lo com a tela dos dois lados. Esta é apenas uma observação, não vou escrever um tutorial de tela aqui.
Permite copiar
Instale algumas dependências (na origem e destino):
apt install pigz pv netcat-openbsd
em seguida, crie um volume no destino com o mesmo tamanho da fonte. Se não tiver certeza, use lvdisplay na fonte para obter o tamanho e criar o destino, ou seja:
lvcreate -n lvname vgname -L 50G
Em seguida, prepare o destino para receber os dados:
nc -l -p 444 | openssl aes-256-cbc -d -salt -pass pass:asdkjn2hb | pigz -d | dd bs=16M of=/dev/vgname/lvname
e quando estiver pronto, inicie a transferência na fonte:
pv -r -t -b -p -e /dev/vgname/lvname | pigz -1 | openssl aes-256-cbc -salt -pass pass:asdkjn2hb | nc <destip/host> 444 -q 1
Nota: Se você estiver transferindo os dados localmente ou não se importa com criptografia, basta remover a parte Openssl dos dois lados. Se você se importa, asdkjn2hb é a chave de criptografia, você deve alterá-la.
fonte