preseed cadeia de comando falha com caractere de nova linha usando init-inj init

3

Estou criando uma nova máquina virtual usando o comando virt-install do libvirt. O comando extrai um arquivo de pré-configuração local do hipervisor usando initrd-inject:

virt-install \
--autostart \
--name vm1 \
--ram 4096 \
--location=http://archive.ubuntu.com/ubuntu/dists/precise/main/installer-amd64/ \
--initrd-inject=/var/lib/libvirt/preseeds/vms/preseed.cfg \
--extra-args="locale=en_US console-setup/ask_detect=false keyboard-configuration/layoutcode=us hostname=virtual domain=unassigned-domain interface=auto" \
--vcpu=4 \
--vnc \
--vnclisten=0.0.0.0 \
--noautoconsole \
--os-type=linux \
--os-variant=ubuntukarmic \
-w bridge=br0 \
-w bridge=br1 \
-w network=default \
 --disk format=qcow2,size=20,bus=virtio,path=/export/vm/vm1.qcow2

Tudo funciona bem até a parte late_command do preseed que imprime dinamicamente um script upstart para o arquivo com a seguinte linha:

d-i preseed/late_command string printf "description \"the run-once bootstrap\"\n\nstart on net-device-up\nstop on runlevel [!2345]\n\npre-start script\n wget -O /root/bootstrap.sh http://my.bootstrap/bootstrap;\nchmod +x /root/bootstrap.sh;\n  /root/bootstrap.sh > /var/log/bootstrap.log 2>&1\nend script" > /target/etc/init/run_bootstrap.conf

O instalador do Ubuntu 12.04 para o vm pára e vejo as seguintes informações nos logs de depuração do instalador:

Feb 21 19:44:54 preseed: running preseed command preseed/late_command: printf "description \"the run-once bootstrap\"
Feb 21 19:44:54 log-output: sh: syntax error: unterminated quoted string
Feb 21 19:44:54 finish-install: /bin/preseed_command: return: line 23: Illegal number: start
Feb 21 19:44:54 finish-install: warning: /usr/lib/finish-install.d/07preseed returned error code 2

A sintaxe para o preseed se bem, porque ele é executado corretamente sobre http na linha extra-args ao invés de através do initrd-inject. Além disso, as aspas duplas escapam corretamente, porque o problema ainda existe se elas forem removidas.

Meu hipervisor está em debian-squeeze com virtinst = 0.600.3-3 escolhido a partir de sid.

    
por simplystuart 21.02.2013 / 20:55

1 resposta

1

Tanto quanto eu posso dizer: A barra invertida é um caractere de escape para novas linhas no formato de arquivo preseed. Se você precisar de uma barra invertida para aparecer em um comando shell, a única solução que encontrei é codificar com base64 o valor que você precisa. Por exemplo, se você precisar de um rc.local personalizado e não quiser buscá-lo com "wget" (ou não, porque não há nenhuma configuração de DNS no ambiente de pós-instalação, como em 18.04), é possível codifique o script:

$ base64 < my-rc.local | tr -d \n

Em seguida, o seu preseed deve conter:

ubiquity ubiquity/success_command string echo your_base64_encoded_file | base64 -d > /target/etc/rc.local ; chmod +x /target/etc/rc.local

(Eu tive que aprender isso da maneira mais difícil.)

    
por 28.09.2018 / 01:07