AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / ubuntu / Perguntas / 1235723
Accepted
Andrew Lowther
Andrew Lowther
Asked: 2020-05-06 07:53:01 +0800 CST2020-05-06 07:53:01 +0800 CST 2020-05-06 07:53:01 +0800 CST

Instalação automatizada do servidor 20.04 usando PXE e imagem de servidor ao vivo

  • 772

Como fazer uma instalação totalmente automatizada do Ubuntu 20.04 Server usando o PXE e a imagem do servidor ao vivo ?

Razão

Com a versão 20.04, parece claro que o Ubuntu está pressionando ainda mais a opção do instalador do servidor ao vivo ( subiquity ). A imagem do debian-installer (di) foi renomeada para legado. Assim como o instalador do netboot que eu normalmente prefiro. A versão 20.04 também apresenta uma nova opção de instalação automatizada para o instalador do servidor ativo.

server pxe netinstall 20.04 subiquity
  • 2 2 respostas
  • 43566 Views

2 respostas

  • Voted
  1. Best Answer
    Andrew Lowther
    2020-05-06T07:53:01+08:002020-05-06T07:53:01+08:00

    Instalação totalmente automatizada do servidor Ubuntu 20.04 usando PXE

    Estas são as etapas para fazer uma instalação totalmente automatizada do Ubuntu 20.04 Server usando o PXE com a imagem do servidor ao vivo . Achei o processo levemente documentado e cheio de problemas. Nestas etapas, estou instalando o 20.04 em um servidor baseado em UEFI .

    edit : essas etapas foram adaptadas para um servidor baseado em BIOS no Deploy Ubuntu 20.04 em bare metal ou virtualbox VM por pxelinux, o cloud-init não pega o arquivo de dados do usuário

    edit : essas etapas foram criadas especificamente para o 20.04lançamento do Ubuntu ( subiquity 20.04.3). A versão das subiquityalterações a cada lançamento. Por exemplo, o 20.04.3lançamento do Ubuntu tem subiquity 21.08.2. Por causa do desenvolvimento ativo de subiquityalgumas das informações neste post não são completamente precisas para lançamentos mais recentes.

    Há muitas variações para essas etapas possíveis. Eles podem ser personalizados e adaptados para atender às necessidades de cada um. O objetivo é fornecer um exemplo de como fazer isso e ajudar outros usuários a superar os problemas encontrados.

    links sobre o instalador

    • https://wiki.ubuntu.com/FocalFossa/ReleaseNotes#Installer
    • https://ubuntu.com/server/docs/install/autoinstall
    • https://discourse.ubuntu.com/t/server-installer-plans-for-20-04-lts/13631
    • https://discourse.ubuntu.com/t/netbooting-the-live-server-installer/14510

    referências de configuração

    • https://ubuntu.com/server/docs/install/autoinstall-reference
    • https://curtin.readthedocs.io/en/latest/topics/config.html

    Código fonte

    • https://github.com/CanonicalLtd/subiquity
    • https://github.com/canonical/curtin

    Construir um servidor tftp

    Todas as etapas a seguir são executadas como root. Estes foram testados em um servidor Ubuntu 18.04.

    Instale o servidor tftp e um servidor web

    apt-get -y install tftpd-hpa apache2
    

    Configure o apache para servir arquivos do diretório tftp

    cat > /etc/apache2/conf-available/tftp.conf <<EOF
    <Directory /var/lib/tftpboot>
            Options +FollowSymLinks +Indexes
            Require all granted
    </Directory>
    Alias /tftp /var/lib/tftpboot
    EOF
    a2enconf tftp
    systemctl restart apache2
    

    Baixe a iso do servidor ao vivo

    wget http://old-releases.ubuntu.com/releases/20.04/ubuntu-20.04-live-server-amd64.iso -O /var/lib/tftpboot/ubuntu-20.04-live-server-amd64.iso
    

    Extraia o kernel e o initramfs do iso do servidor ativo

    mount /var/lib/tftpboot/ubuntu-20.04-live-server-amd64.iso /mnt/
    cp /mnt/casper/vmlinuz /var/lib/tftpboot/
    cp /mnt/casper/initrd /var/lib/tftpboot/
    umount  /mnt
    

    Baixe a imagem do grub para carregar via PXE

    wget http://archive.ubuntu.com/ubuntu/dists/focal/main/uefi/grub2-amd64/current/grubnetx64.efi.signed -O /var/lib/tftpboot/pxelinux.0
    

    Configurar grub. Esta configuração fornecerá uma opção de inicialização totalmente automatizada, bem como uma opção de inicialização manual

    mkdir -p /var/lib/tftpboot/grub
    cat > /var/lib/tftpboot/grub/grub.cfg <<'EOF'
    default=autoinstall
    timeout=30
    timeout_style=menu
    menuentry "Focal Live Installer - automated" --id=autoinstall {
        echo "Loading Kernel..."
        # make sure to escape the ';' or surround argument in quotes
        linux /vmlinuz ip=dhcp url=http://${pxe_default_server}/tftp/ubuntu-20.04-live-server-amd64.iso autoinstall ds="nocloud-net;s=http://${pxe_default_server}/tftp/" root=/dev/ram0 cloud-config-url=/dev/null
        echo "Loading Ram Disk..."
        initrd /initrd
    }
    menuentry "Focal Live Installer" --id=install {
        echo "Loading Kernel..."
        linux /vmlinuz ip=dhcp url=http://${pxe_default_server}/tftp/ubuntu-20.04-live-server-amd64.iso root=/dev/ram0 cloud-config-url=/dev/null
        echo "Loading Ram Disk..."
        initrd /initrd
    }
    EOF
    

    Configure o cloud-init com a configuração de instalação automática. Primeiro executei a instalação manualmente para obter o /var/log/installer/autoinstall-user-dataarquivo gerado para usar como base. Em seguida, fiz modificações com base em minhas necessidades e erros encontrados.

    cat > /var/lib/tftpboot/meta-data <<EOF
    instance-id: focal-autoinstall
    EOF
    
    cat > /var/lib/tftpboot/user-data <<'EOF'
    #cloud-config
    autoinstall:
      version: 1
      # use interactive-sections to avoid an automatic reboot
      #interactive-sections:
      #  - locale
      apt:
        # even set to no/false, geoip lookup still happens
        #geoip: no
        preserve_sources_list: false
        primary:
        - arches: [amd64, i386]
          uri: http://us.archive.ubuntu.com/ubuntu
        - arches: [default]
          uri: http://ports.ubuntu.com/ubuntu-ports
      # r00tme
      identity: {hostname: focal-autoinstall, password: $6$.c38i4RIqZeF4RtR$hRu2RFep/.6DziHLnRqGOEImb15JT2i.K/F9ojBkK/79zqY30Ll2/xx6QClQfdelLe.ZjpeVYfE8xBBcyLspa/,
        username: ubuntu}
      keyboard: {layout: us, variant: ''}
      locale: en_US.UTF-8
      # interface name will probably be different
      network:
        network:
          version: 2
          ethernets:
            ens192:
              critical: true
              dhcp-identifier: mac
              dhcp4: true
      ssh:
        allow-pw: true
        authorized-keys: []
        install-server: true
      # this creates an efi partition, /boot partition, and root(/) lvm volume
      storage:
        grub:
          reorder_uefi: False
        swap:
          size: 0
        config:
        - {ptable: gpt, path: /dev/sda, preserve: false, name: '', grub_device: false,
          type: disk, id: disk-sda}
        - {device: disk-sda, size: 536870912, wipe: superblock, flag: boot, number: 1,
          preserve: false, grub_device: true, type: partition, id: partition-sda1}
        - {fstype: fat32, volume: partition-sda1, preserve: false, type: format, id: format-2}
        - {device: disk-sda, size: 1073741824, wipe: superblock, flag: linux, number: 2,
          preserve: false, grub_device: false, type: partition, id: partition-sda2}
        - {fstype: ext4, volume: partition-sda2, preserve: false, type: format, id: format-0}
        - {device: disk-sda, size: -1, flag: linux, number: 3, preserve: false,
          grub_device: false, type: partition, id: partition-sda3}
        - name: vg-0
          devices: [partition-sda3]
          preserve: false
          type: lvm_volgroup
          id: lvm-volgroup-vg-0
        - {name: lv-root, volgroup: lvm-volgroup-vg-0, size: 100%, preserve: false,
          type: lvm_partition, id: lvm-partition-lv-root}
        - {fstype: ext4, volume: lvm-partition-lv-root, preserve: false, type: format,
          id: format-1}
        - {device: format-1, path: /, type: mount, id: mount-2}
        - {device: format-0, path: /boot, type: mount, id: mount-1}
        - {device: format-2, path: /boot/efi, type: mount, id: mount-3}
    write_files:
      # override the kernel package
      - path: /run/kernel-meta-package
        content: |
          linux-virtual
        owner: root:root
        permissions: "0644"
      # attempt to also use an answers file by providing a file at the default path.  It did not seem to have any effect
      #- path: /subiquity_config/answers.yaml
      #  content: |
      #    InstallProgress:
      #      reboot: no
      #  owner: root:root
      #  permissions: "0644"
    EOF
    

    Configurar DHCP

    Defina as opções de DHCP 66,67 de acordo com a documentação do seu servidor DHCP.

    Inicialize seu servidor

    Neste ponto, você deve ser capaz de inicializar seu servidor baseado em UEFI e realizar uma instalação completamente automática.

    Erros encontrados

    • O servidor que está sendo instalado requer mais de 2 GB de RAM. Acabei criando uma VM com 3 GB para teste. EDITAR Usar o cloud-config-url=/dev/nullargumento do kernel evitará cloud-inito download desnecessário da iso, o que reduz a memória necessária , reduz o tráfego de rede e acelera o tempo de inicialização.
    • O arquivo gerado /var/log/installer/autoinstall-user-datafoi quebrado das seguintes maneiras
      • Não há versionpropriedade, o que causou uma falha de validação. adicionei a propriedade
      • A networkseção exigia outro nível de aninhamento. Este bug é mencionado na referência de configuração
      • A preservepropriedade em cada item storage configprecisava ser definida como false . Caso contrário , o curtin não instalaria em um disco em branco
      • A keyboardpropriedade togglefoi definida como nula, o que causou uma falha de validação. Eu simplesmente removi a propriedade
    • Quando o curtin é instalado em um dispositivo UEFI, ele reordena a ordem de inicialização para que a opção de inicialização atual seja a primeira da lista. O resultado é que a inicialização da rede se torna a primeira opção na próxima reinicialização. Então, quando a instalação é feita e a reinicialização acontece... você acaba no ambiente PXE novamente em vez de inicializar a partir do disco. Encontrei uma opção de curtin não documentada . Felizmente, a subiquidade passa essa configuração para curtinreorder_uefi
    • A aptopção de configuração geoipparece não funcionar. Sempre havia logs para solicitações de geoip
    • O uso de valores legíveis por humanos para tamanhos de partição (por exemplo size: 512M, ) resultou no armazenamento do tamanho como flutuante, levando a erros ao dimensionar volumes LVM como uma porcentagem. Evitar valores legíveis por humanos parece corrigir isso

    Outros recursos ausentes

    Eu não me aprofundei tanto nisso. Eles são baseados no que meus arquivos preseed fariam. A maioria deles provavelmente poderia ser corrigida com o uso inteligente de early-commands, late-commandse cloud-init . Eu também posso ter perdido alguma coisa

    • Uma maneira de definir o fuso horário
    • Uma maneira de definir a senha de root
    • Uma maneira de configurar um proxy apenas apt. Eu gosto de usar apt-cacher-ngpara apt, mas não funciona como proxy geral. O instalador assume que qualquer proxy que você configurar serve para tudo
    • Uma maneira de pausar no final da instalação em vez de reiniciar automaticamente. A solução é adicionar um valor a interactive-sections, mas isso resulta em 3 pausas
    • Permitir configuração direta do curtin . Você precisa criar yaml para cloud-init para fornecer yaml para subiquity , que então gera yaml para curtin . Isso forneceria mais flexibilidade de configuração para poder fornecer o yaml curtin diretamente
    • Permitir configuração de inicialização de nuvem direta. Você precisa criar yaml para cloud-init para fornecer yaml para subiquity , que então gera yaml para cloud-init na máquina instalada. Esses arquivos devem ser fáceis de modificar com late-commands, mas eu não tentei
    • Capacidade de escolher o pacote do kernel. Descobri que a imagem do kernel instalada é baseada no que está escrito no /run/kernel-meta-package. Isso é codificado linux-genericno initramfs. Eu prefiro usar o linux-virtualpacote para VMs. Consegui usar a configuração cloud-init para substituir o arquivo

    Editar 1

    O arquivo resultante /target/var/lib/cloud/seed/nocloud-net/user-datausado pelo cloud-init durante a primeira inicialização. As respostas indicam que a lock-passwdpropriedade tem um erro de digitação e pode afetar alguns usuários

    #cloud-config
    growpart: {mode: 'off'}
    locale: en_US.UTF-8
    preserve_hostname: true
    resize_rootfs: false
    ssh_pwauth: true
    users:
    - gecos: ubuntu
      groups: [adm, cdrom, dip, plugdev, lxd, sudo]
      lock-passwd: false
      name: ubuntu
      passwd: $6$.c38i4RIqZeF4RtR$hRu2RFep/.6DziHLnRqGOEImb15JT2i.K/F9ojBkK/79zqY30Ll2/xx6QClQfdelLe.ZjpeVYfE8xBBcyLspa/
      shell: /bin/bash
    
    • 38
  2. ububob
    2020-05-14T04:40:10+08:002020-05-14T04:40:10+08:00

    Eu defino o fuso horário na seção 'user-data' do arquivo de dados do usuário e também defino a senha de root lá; assim:

    #cloud-config
    autoinstall:
      version: 1
      ...
      user-data:
        timezone: Europe/London
        disable_root: false
        chpasswd:
          list: |
            root:HASHEDPASSWORD
      ...
    
    • 1

relate perguntas

  • Como interagir graficamente com um servidor sem cabeça?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve