Debian 安装程序 + 预安装:

Debian 安装程序 + 预安装:

多年来,我一直在使用 pxelinux 部署 Ubuntu(自 12.04 以来)以及其他 Linux。使用 Debian 安装程序,它运行良好。这些天我一直在尝试部署 20.04,它也基本可以正常工作。只有一个问题,“用户数据”文件从未被拾取。无论我做什么,我总是会收到安装程序提出的所有问题。这是我的环境:

  1. 我在文件服务器的/var/www/html/ubuntu/cloud-init下创建了一个user-data文件,其内容如下:
## cloud-config

autoinstall:
  version: 1
  apt:
    preserve_sources_list: false
    primary:
    - arches: [default]
      uri: [...]/images/ubuntu

  identity: {realname: wrsadmin, username: wrsadmin}
  keyboard: {layout: us, toggle: null, variant: ''}
  locale: en_US
  network:
    ethernets:
      enp0s3:
        critical: true
        dhcp-identifier: mac
        dhcp4: true
        nameservers:
          addresses: [128.224.160.11, 128.224.160.12]
          search: [wrs.com., corp.ad.wrs.com.]
    version: 2
  ssh:
    allow-pw: true
    authorized-keys: []
    install-server: true

  late-commands:
    - rm -f /target/etc/resolv.conf
    - wget -O /target/etc/resolv.conf [...]/ubuntu/resolv.conf
    - chattr +i /target/etc/resolv.conf
    
  1. pxelinux 的“默认”文件。如下所示,当我使用 Debian-Installer 网络启动文件时,PXE 可以工作,preseed 也可以工作。当我使用 cloud-init 格式的网络启动文件时,PXE 也可以工作,900MB 服务器实时映像已成功加载。但是,“autoinstall ds=nocloud-net;s=[...]/ubuntu/cloud-init/”就像不存在一样。

Debian 安装程序 + 预安装:

LABEL Ubuntu 20.04 x64 legacy
  MENU LABEL Ubuntu 20.04 x64 legacy
  TEXT HELP
  Ubuntu 20.04 x64 legacy
  ENDTEXT
  KERNEL Linux/Ubuntu2004/linux
  APPEND vga=normal initrd=Linux/Ubuntu2004/initrd.gz locale=en_US.UTF-8 keyboard-configuration/layoutcode=us ipv6.disable=1 url=[...]/ubuntu/preseed/preseed2004.cfg

Cloud-init + 用户数据

LABEL Ubuntu 20.04 x64
  MENU LABEL Ubuntu 20.04 x64
  TEXT HELP
  Ubuntu 20.04 x64
  ENDTEXT
  KERNEL Linux/Ubuntu2004/vmlinuz
  APPEND initrd=Linux/Ubuntu2004/initrd ip=dhcp url=[...]/images/ubuntuExtra/ubuntu2004/ubuntu-20.04-live-server-amd64.iso autoinstall ds=nocloud-net;s=[...]/ubuntu/cloud-init/

你能帮忙诊断一下我哪个部分做错了吗?

答案1

我能够使用这些步骤在基于 BIOS 的虚拟机上进行自动安装。它们略微修改自我的 UEFI 步骤。希望它们能提供一个例子来帮助你解决问题。你可以根据自己的环境进行调整

搭建一个tftp服务器

以下步骤均以 root 身份运行。这些步骤已在 Ubuntu 18.04 服务器上进行了测试。

安装 tftp 服务器、web 服务器和 syslinux 文件

apt-get -y install tftpd-hpa apache2 pxelinux

配置 apache 以从 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

将 syslinux 文件复制到 tftp 目录

cp /usr/lib/PXELINUX/gpxelinux.0 /var/lib/tftpboot/pxelinux.0.bios
cp /usr/lib/syslinux/modules/bios/*.c32 /var/lib/tftpboot

下载实时服务器 iso

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

从实时服务器 iso 中提取内核和 initramfs

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

配置 syslinux

MYIP=$(hostname --ip-address)
mkdir -p /var/lib/tftpboot/pxelinux.cfg
cat > /var/lib/tftpboot/pxelinux.cfg/default <<EOF
DEFAULT vesamenu.c32
TIMEOUT 600
ONTIMEOUT focal-live-install-autoinstall
PROMPT 0

NOESCAPE 1

LABEL focal-live-install
        MENU DEFAULT
        MENU label Install focal
        KERNEL vmlinuz
        INITRD initrd
        APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://${MYIP}/tftp/ubuntu-20.04-live-server-amd64.iso

LABEL focal-live-install-autoinstall
        MENU DEFAULT
        MENU label Install focal - autoinstall
        KERNEL vmlinuz
        INITRD initrd
        APPEND root=/dev/ram0 ramdisk_size=1500000 ip=dhcp url=http://${MYIP}/tftp/ubuntu-20.04-live-server-amd64.iso autoinstall ds=nocloud-net;s=http://${MYIP}/tftp/cloud-init-bios/ cloud-config-url=/dev/null

EOF

配置云初始化使用自动安装配置。我首先手动运行安装以获取生成的/var/log/installer/autoinstall-user-data文件作为基础。然后我根据我的需求和遇到的错误进行了修改。

mkdir -p /var/lib/tftpboot/cloud-init-bios/
cat > /var/lib/tftpboot/cloud-init-bios/meta-data <<EOF
instance-id: focal-autoinstall
EOF
cat > /var/lib/tftpboot/cloud-init-bios/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 bios_grub partition, /boot partition, and root(/) lvm volume
  storage:
    config:
    - {ptable: gpt, path: /dev/sda, wipe: superblock, preserve: false, name: '', grub_device: true,
      type: disk, id: disk-sda}
    - {device: disk-sda, size: 1048576, flag: bios_grub, number: 1, preserve: false,
      type: partition, id: partition-0}
    - {device: disk-sda, size: 1073741824, wipe: superblock, flag: '', number: 2,
      preserve: false, type: partition, id: partition-1}
    - {fstype: ext4, volume: partition-1, preserve: false, type: format, id: format-0}
    - {device: disk-sda, size: -1, wipe: superblock, flag: '', number: 3,
      preserve: false, type: partition, id: partition-2}
    - name: ubuntu-vg
      devices: [partition-2]
      preserve: false
      type: lvm_volgroup
      id: lvm_volgroup-0
    - {name: ubuntu-lv, volgroup: lvm_volgroup-0, size: 100%, preserve: false,
      type: lvm_partition, id: lvm_partition-0}
    - {fstype: ext4, volume: lvm_partition-0, preserve: false, type: format, id: format-1}
    - {device: format-1, path: /, type: mount, id: mount-1}
    - {device: format-0, path: /boot, type: mount, id: mount-0}
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

配置 DHCP

根据 DHCP 服务器的文档设置 DHCP 选项 66,67。

启动服务器

此时,您应该能够启动基于 UEFI 的服务器并执行完全自动安装。

答案2

当我使用基于 UEFI 的服务器(使用 grub 而不是 syslinux)执行此操作时,我必须在命令行中转义分号。

尝试改变

ds=nocloud-net;s=http://blah/ubuntu/cloud-init/

ds=nocloud-net\;s=http://blah/ubuntu/cloud-init/

我发现检查安装程序环境的最简单方法是使用alt-f2控制台并使用命令

dmesg | grep 'Command line'

这将显示是否ds传递了完整的参数,或者是否只传递到了;

答案3

/var/log/httpd/access_log 中仅生成了三个条目(并且没有新条目/var/log/httpd/error_log):

128.224.180.84 - - [14/May/2020:09:48:45 +0800] "GET /images/ubuntuExtra/ubuntu2004/ubuntu-20.04-live-server-amd64.iso HTTP/1.1" 200 952107008 "-" "Wget"
128.224.180.84 - - [14/May/2020:09:49:35 +0800] "GET /images/ubuntuExtra/ubuntu2004/ubuntu-20.04-live-server-amd64.iso HTTP/1.1" 200 952107008 "-" "Cloud-Init/20.1-10-g71af48df-0ubuntu5"
128.224.180.84 - - [14/May/2020:09:50:06 +0800] "GET /images/ubuntuExtra/ubuntu2004/ubuntu-20.04-live-server-amd64.iso HTTP/1.1" 200 952107008 "-" "Cloud-Init/20.1-10-g71af48df-0ubuntu5"

第一个条目显示安装程序正在加载实时图像,我可以理解。

但是我不明白以下两个条目。而且肯定没有用于加载自动安装文件的条目,我不知道为什么。

相关内容