衢州鸭头城隍庙店 發表於 2023-8-21 00:00:00

搭建基于Ubuntu Server的PXE自动安装环境的实用指南

<p>
        <img style="max-width:100%!important;height:auto!important;"title="搭建基于Ubuntu Server的PXE自动安装环境的实用指南" alt="搭建基于Ubuntu Server的PXE自动安装环境的实用指南" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/903e3519b6f60206153f68f1e03c1387.jpg" width="auto"></p>
<p>
        Ubuntu 在不断进化,从 20.04 开始,Ubuntu 决定更新实时服务器安装程序,只用 Subiquity 就能完全完成操作系统及附加程序的自动安装。以前用的 kickstart、debian-installer 都不是 Ubuntu 自家技术,用起来也不是很方便。</p>
<p>
        同时,PXE 技术虽然出来很久了,但是整个安装过程还不是特别顺畅,随着 Ubuntu 升级到 20.04,使用 cloud-init 安装配置实现 Subiquity 参数的自动填写,整个过程变得些微优雅起来,让我有较大兴趣尝试使用 PXE 安装 Ubuntu 20.04 Server。</p>
<p>
        本文,我想讲的是在 Ubuntu 20.04 Server 上搭建一套自动安装 Ubuntu 20.04 Server 的部署环境,其主要内容有两部分:</p>
<ol>
<li>
                使用 PXE 自动从网络加载安装程序,发起安装。</li>
        <li>
                使用 Ubuntu 的自动安装功能,自动加载 cloud-init 安装配置,完成操作系统的自动选择。</li>
</ol>
<p>
        第一部分所有操作系统应该都是一样的,第二部分和 Ubuntu 20.04 版本紧密相关,其他的操作系统需要考虑其他方法。</p>
<h3 class="mume-header" id="pxe-%E5%AE%89%E8%A3%85%E6%B5%81%E7%A8%8B">
        PXE 安装流程</h3>
<p>
        PXE(<ruby>预启动执行环境<rt>Pre-boot Execution Environment</rt></ruby>)的实现依赖于网卡,只有支持 PXE 客户端的网卡才能实现网络自动安装。这种网卡实现了 DHCP 客户端和 TFTP 客户端,在 BIOS 的引导下通过 DHCP 协议自动分配 IP 地址,通过 TFTP 获取最小内核,然后在最小内核环境下通过 HTTP 协议或 NFS 协议获取 Ubuntu 安装版本。之后最小内核引导进行 Ubuntu 20.04 的安装。</p>
<p>
        下图是详细的安装流程。</p>
<p class="article_img">
         </p>
<p>
        <img style="max-width:100%!important;height:auto!important;"title="搭建基于Ubuntu Server的PXE自动安装环境的实用指南" alt="搭建基于Ubuntu Server的PXE自动安装环境的实用指南" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/19f8874069ca83182bedd9739809a060.jpg"></p>
<p>
        上图有几个前提:</p>
<ol>
<li>
                网卡支持 PXE,今年新出的网卡基本都支持,同时 BIOS 的启动项也要配置,请大家自行研究。</li>
        <li>
                UEFI 启动才会请求 <code>bootx64.efi</code>,如果是<ruby>传统启动模式<rt>Legacy</rt></ruby>),那么 PXE 客户端会请求 <code>pxelinux.0</code>。</li>
        <li>
                可以采用 nfsboot 方式,这个流程采用的是 ISO 镜像下载再安装的方式。</li>
</ol>
<h3 class="mume-header" id="%E5%AE%89%E8%A3%85%E5%BF%85%E9%A1%BB%E7%9A%84%E6%9C%8D%E5%8A%A1%E7%AB%AF%E8%BD%AF%E4%BB%B6">
        安装必须的服务端软件</h3>
<ol>
<li>
                安装 DHCP、TFTP 服务器。<code>dnsmasq</code> 同时实现了 DHCP、TFTP、DNS 三种服务器
                <p>
                        <code>sudo apt-get install dnsmasq</code></p>
        </li>
        <li>
                安装 HTTP 服务器
                <p>
                        HTTP 服务器有很多,大家可以使用自己的熟悉的服务器如 Nginx,这里使用的是apache2</p>
                <p>
                        <code>sudo apt-get install apache2</code></p>
        </li>
</ol>
<h3 class="mume-header" id="%E5%87%86%E5%A4%87%E5%90%AF%E5%8A%A8%E6%96%87%E4%BB%B6">
        准备启动文件</h3>
<ol>
<li>
                下载 UEFI 引导文件:<code>shim.signed</code>、<code>grub-efi-amd64-signed</code>
                <ol class="linenums">
<li class="L0">
                                <code><span class="kwd">apt-get</span><span class="pln"> download shim</span><span class="pun">.</span><span class="kwd">signed</span></code>
</li>
                        <li class="L1">
                                <code><span class="kwd">apt-get</span><span class="pln"> download grub</span><span class="pun">-</span><span class="pln">efi</span><span class="pun">-</span><span class="pln">amd64</span><span class="pun">-</span><span class="kwd">signed</span></code>
</li>
                </ol>
</li>
        <li>
                下载 Ubuntu 20.04 Server ISO 镜像
                <p>
                        直接去官网下载,我下载的是 <code>ubuntu-20.04.2-live-server-amd64.iso</code>,需要注意的是只有 Live 版本才能支持 subiquity。</p>
        </li>
</ol>
<h3 class="mume-header" id="%E5%88%9B%E5%BB%BA-tftp-%E6%96%87%E4%BB%B6%E5%A4%B9">
        创建 TFTP 文件夹</h3>
<p>
        TFTP 文件夹是 TFTP 服务的根目录,PXE 启动过程中下载的文件都存在在该目录中:</p>
<ol class="linenums">
<li class="L0">
                <code><span class="pln">tftp</span></code>
</li>
        <li class="L1">
                <code><span class="pun">├──</span><span class="pln"> boot</span></code>
</li>
        <li class="L2">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">└──</span><span class="pln"> live</span><span class="pun">-</span><span class="pln">server</span></code>
</li>
        <li class="L3">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> initrd</span></code>
</li>
        <li class="L4">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">└──</span><span class="pln"> vmlinuz</span></code>
</li>
        <li class="L5">
                <code><span class="pun">├──</span><span class="pln"> grub</span></code>
</li>
        <li class="L6">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> bootx64</span><span class="pun">.</span><span class="pln">efi</span></code>
</li>
        <li class="L7">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> font</span><span class="pun">.</span><span class="pln">pf2</span></code>
</li>
        <li class="L8">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">└──</span><span class="pln"> grub</span><span class="pun">.</span><span class="pln">cfg</span></code>
</li>
        <li class="L9">
                <code><span class="pun">└──</span><span class="pln"> grubx64</span><span class="pun">.</span><span class="pln">efi</span></code>
</li>
</ol>
<p>
        说明:</p>
<ol>
<li>
                <code>bootx64.efi</code>、<code>grubx64.efi</code> 引导程序来自 <code>shim.signed</code> 安装包</li>
        <li>
                <code>grub.cfg</code> 自行创建</li>
        <li>
                其他文件来自 Ubuntu 安装包</li>
        <li>
                这五个文件是需要的,但是目录结构是自行创建的,大家可以根据自己的喜好修改</li>
</ol>
<h4 class="mume-header" id="%E5%88%9B%E5%BB%BA%E7%9B%AE%E5%BD%95">
        创建目录</h4>
<p>
        在 <code>/home/mine</code>(可根据实际情况修改)目录下创建 <code>tftp</code> 目录:</p>
<ol class="linenums">
<li class="L0">
                <code><span class="kwd">mkdir</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span></code>
</li>
        <li class="L1">
                <code><span class="kwd">mkdir</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">grub</span></code>
</li>
        <li class="L2">
                <code><span class="kwd">mkdir</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">boot</span></code>
</li>
        <li class="L3">
                <code><span class="kwd">mkdir</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">live</span><span class="pun">-</span><span class="pln">server</span></code>
</li>
</ol>
<h4 class="mume-header" id="%E8%8E%B7%E5%8F%96%E5%BC%95%E5%AF%BC%E6%96%87%E4%BB%B6">
        获取引导文件</h4>
<ol>
<li>
                在安装包下载目录创建一个 <code>shim</code> 文件夹</li>
        <li>
                解压 <code>shim</code> 安装包到 <code>shim</code>文件夹:<code>dpkg -x &lt;%刚才下载的shim.signed 安装包包名%&gt; shim</code>
</li>
        <li>
                解压 grub 安装包到 <code>grub</code> 文件夹</li>
        <li>
                拷贝引导文件到 <code>tftp</code>目录</li>
</ol>
<ol class="linenums">
<li class="L0">
                <code><span class="kwd">cp</span><span class="pln"> </span><span class="pun">./</span><span class="pln">sgrub</span><span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">grub</span><span class="pun">/</span><span class="pln">x86_64</span><span class="pun">-</span><span class="pln">efi</span><span class="pun">-</span><span class="kwd">signed</span><span class="pun">/</span><span class="pln">grubnetx64</span><span class="pun">.</span><span class="pln">efi</span><span class="pun">.</span><span class="kwd">signed</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">grubx64</span><span class="pun">.</span><span class="pln">efi</span></code>
</li>
        <li class="L1">
                <code><span class="kwd">cp</span><span class="pln"> </span><span class="pun">./</span><span class="pln">shim</span><span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="pln">lib</span><span class="pun">/</span><span class="pln">shim</span><span class="pun">/</span><span class="pln">shimx64</span><span class="pun">.</span><span class="pln">efi</span><span class="pun">.</span><span class="kwd">signed</span><span class="pln"> </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">grub</span><span class="pun">/</span><span class="pln">bootx64</span><span class="pun">.</span><span class="pln">efi</span></code>
</li>
</ol>
<h4 class="mume-header" id="%E8%8E%B7%E5%8F%96%E5%86%85%E6%A0%B8%E9%95%9C%E5%83%8F%E6%96%87%E4%BB%B6">
        获取内核镜像文件</h4>
<ol>
<li>
                在下载目录挂载 ISO 文件
                <ol class="linenums">
<li class="L0">
                                <code><span class="kwd">sudo</span><span class="pln"> </span><span class="kwd">mount</span><span class="pln"> ubuntu</span><span class="pun">-</span><span class="lit">20.04</span><span class="pun">.</span><span class="lit">2.0</span><span class="pun">-</span><span class="pln">desktop</span><span class="pun">-</span><span class="pln">amd64</span><span class="pun">.</span><span class="pln">iso </span><span class="pun">/</span><span class="pln">media</span></code>
</li>
                </ol>
<p>
                        系统会提示只读,不影响使用。</p>
                <ol class="linenums">
<li class="L0">
                                <code><span class="kwd">mount</span><span class="pun">:</span><span class="pln"> </span><span class="pun">/</span><span class="pln">media</span><span class="pun">:</span><span class="pln"> WARNING</span><span class="pun">:</span><span class="pln"> device </span><span class="kwd">write</span><span class="pun">-</span><span class="kwd">protected</span><span class="pun">,</span><span class="pln"> mounted read</span><span class="pun">-</span><span class="pln">only</span><span class="pun">.</span></code>
</li>
                </ol>
</li>
        <li>
                拷贝内核镜像文件
                <ol class="linenums">
<li class="L0">
                                <code><span class="kwd">cp</span><span class="pln"> </span><span class="pun">/</span><span class="pln">media</span><span class="pun">/</span><span class="pln">casper</span><span class="pun">/</span><span class="pln">initrd </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">live</span><span class="pun">-</span><span class="pln">server</span></code>
</li>
                        <li class="L1">
                                <code><span class="kwd">cp</span><span class="pln"> </span><span class="pun">/</span><span class="pln">media</span><span class="pun">/</span><span class="pln">casper</span><span class="pun">/</span><span class="pln">vmlinuz </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">live</span><span class="pun">-</span><span class="pln">server</span></code>
</li>
                </ol>
</li>
        <li>
                拷贝 grub 文件
                <p>
                        <code>grub.cfg</code> 拷贝过来做个参考,内容会被全部修改掉。</p>
                <ol class="linenums">
<li class="L0">
                                <code><span class="kwd">cp</span><span class="pln"> </span><span class="pun">/</span><span class="pln">media</span><span class="pun">/</span><span class="pln">grub</span><span class="pun">/</span><span class="pln">font</span><span class="pun">.</span><span class="pln">pf2 </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">grub</span></code>
</li>
                        <li class="L1">
                                <code><span class="kwd">cp</span><span class="pln"> </span><span class="pun">/</span><span class="pln">media</span><span class="pun">/</span><span class="pln">grub</span><span class="pun">/</span><span class="pln">grub</span><span class="pun">.</span><span class="pln">cfg </span><span class="pun">/</span><span class="pln">home</span><span class="pun">/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span><span class="pun">/</span><span class="pln">grub</span></code>
</li>
                </ol>
</li>
</ol>
<h3 class="mume-header" id="%E9%85%8D%E7%BD%AE-dnsmasq">
        配置 dnsmasq</h3>
<p>
        关键配置有以下几个:</p>
<ol>
<li>
                配置 DHCP 地址段</li>
        <li>
                配置引导文件目录</li>
        <li>
                配置 tftp 根目录</li>
        <li>
                配置日志路径</li>
        <li>
                配置服务网卡,多网卡机器需关注</li>
</ol>
<ol class="linenums">
<li class="L0">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">配置外网</span><span class="pln"> DNS </span><span class="pun">服务器地址</span></code>
</li>
        <li class="L1">
                <code><span class="pln">server</span><span class="pun">=</span><span class="lit">114.114</span><span class="pun">.</span><span class="lit">114.144</span></code>
</li>
        <li class="L2">
                 </li>
        <li class="L3">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">指定服务的网卡</span></code>
</li>
        <li class="L4">
                <code><span class="kwd">interface</span><span class="pun">=</span><span class="pln">enp2s0</span><span class="pun">,</span><span class="pln">lo</span></code>
</li>
        <li class="L5">
                 </li>
        <li class="L6">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">绑定端口</span></code>
</li>
        <li class="L7">
                <code><span class="pln">bind</span><span class="pun">-</span><span class="pln">interfaces</span></code>
</li>
        <li class="L8">
                 </li>
        <li class="L9">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">设置</span><span class="pln"> DHCP </span><span class="pun">分发</span><span class="pln"> IP </span><span class="pun">端范围、地址掩码、</span><span class="pln">IP </span><span class="pun">地址有效时间</span></code>
</li>
        <li class="L0">
                <code><span class="pln">dhcp</span><span class="pun">-</span><span class="pln">range</span><span class="pun">=</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.100</span><span class="pun">,</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.150</span><span class="pun">,</span><span class="lit">255.255</span><span class="pun">.</span><span class="lit">255.0</span><span class="pun">,</span><span class="lit">12h</span></code>
</li>
        <li class="L1">
                 </li>
        <li class="L2">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">指定网关地址</span></code>
</li>
        <li class="L3">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">和安装无关,应该可以不配置</span></code>
</li>
        <li class="L4">
                <code><span class="pln">dhcp</span><span class="pun">-</span><span class="pln">option</span><span class="pun">=</span><span class="lit">3</span><span class="pun">,</span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.9</span></code>
</li>
        <li class="L5">
                 </li>
        <li class="L6">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">指定</span><span class="pln"> DNS </span><span class="pun">服务器地址</span></code>
</li>
        <li class="L7">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">和安装无关,应该可以不配置</span></code>
</li>
        <li class="L8">
                <code><span class="pln">dhcp</span><span class="pun">-</span><span class="pln">option</span><span class="pun">=</span><span class="lit">6</span><span class="pun">,</span><span class="lit">114.114</span><span class="pun">.</span><span class="lit">114.114</span></code>
</li>
        <li class="L9">
                 </li>
        <li class="L0">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">设置引导程序相对</span><span class="pln"> tftp </span><span class="pun">根目录的路径</span></code>
</li>
        <li class="L1">
                <code><span class="pln">dhcp</span><span class="pun">-</span><span class="pln">match</span><span class="pun">=</span><span class="kwd">set</span><span class="pun">:</span><span class="pln">efi</span><span class="pun">-</span><span class="pln">x86_64</span><span class="pun">,</span><span class="pln">option</span><span class="pun">:</span><span class="pln">client</span><span class="pun">-</span><span class="pln">arch</span><span class="pun">,</span><span class="lit">7</span></code>
</li>
        <li class="L2">
                <code><span class="pln">dhcp</span><span class="pun">-</span><span class="pln">boot</span><span class="pun">=</span><span class="pln">tag</span><span class="pun">:</span><span class="pln">efi</span><span class="pun">-</span><span class="pln">x86_64</span><span class="pun">,</span><span class="pln">grub</span><span class="pun">/</span><span class="pln">bootx64</span><span class="pun">.</span><span class="pln">efi</span></code>
</li>
        <li class="L3">
                 </li>
        <li class="L4">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">启用</span><span class="pln"> tftp </span><span class="pun">服务</span></code>
</li>
        <li class="L5">
                <code><span class="pln">enable</span><span class="pun">-</span><span class="pln">tftp</span></code>
</li>
        <li class="L6">
                 </li>
        <li class="L7">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">设置</span><span class="pln"> tftp </span><span class="pun">根路径</span></code>
</li>
        <li class="L8">
                <code><span class="pln">tftp</span><span class="pun">-</span><span class="pln">root</span><span class="pun">=</span><span class="str">/home/</span><span class="pln">mine</span><span class="pun">/</span><span class="pln">tftp</span></code>
</li>
        <li class="L9">
                 </li>
        <li class="L0">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">设置日志路径</span></code>
</li>
        <li class="L1">
                <code><span class="pln">log</span><span class="pun">-</span><span class="pln">facility</span><span class="pun">=</span><span class="str">/var/</span><span class="pln">log</span><span class="pun">/</span><span class="pln">dnsmasq</span><span class="pun">.</span><span class="pln">log</span></code>
</li>
</ol>
<p>
        修改配置后,重启 <code>dnsmasq</code> 服务才能生效。</p>
<h3 class="mume-header" id="%E5%88%9B%E5%BB%BA-http-%E6%96%87%E4%BB%B6%E5%A4%B9">
        创建 HTTP 文件夹</h3>
<p>
        Apache2 的默认服务根目录是 <code>/var/www/html</code>,在其下创建目录:</p>
<ol class="linenums">
<li class="L0">
                <code><span class="pln">html</span><span class="pun">/</span></code>
</li>
        <li class="L1">
                <code><span class="pun">├──</span><span class="pln"> autoinstall</span></code>
</li>
        <li class="L2">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">├──</span><span class="pln"> meta</span><span class="pun">-</span><span class="pln">data</span></code>
</li>
        <li class="L3">
                <code><span class="pun">│</span><span class="pln">   </span><span class="pun">└──</span><span class="pln"> user</span><span class="pun">-</span><span class="pln">data</span></code>
</li>
        <li class="L4">
                <code><span class="pun">├──</span><span class="pln"> index</span><span class="pun">.</span><span class="pln">html</span></code>
</li>
        <li class="L5">
                <code><span class="pun">└──</span><span class="pln"> iso</span></code>
</li>
        <li class="L6">
                <code><span class="pun">└──</span><span class="pln"> ubuntu</span><span class="pun">-</span><span class="lit">20.04</span><span class="pun">.</span><span class="lit">2</span><span class="pun">-</span><span class="pln">live</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">amd64</span><span class="pun">.</span><span class="pln">iso</span></code>
</li>
</ol>
<p>
        说明:</p>
<ol>
<li>
                <code>autoinstall</code> 目录存放参数自动配置文件,<code>user-data</code>、<code>meta-data</code> 是cloud-init 要求的文件名</li>
        <li>
                <code>iso</code> 目录存放操作系统镜像文件</li>
</ol>
<h4 class="mume-header" id="%E5%88%9B%E5%BB%BA%E7%9B%AE%E5%BD%95-1">
        创建目录</h4>
<ol class="linenums">
<li class="L0">
                <code><span class="kwd">mkdir</span><span class="pln"> </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">autoinstall</span></code>
</li>
        <li class="L1">
                <code><span class="kwd">mkdir</span><span class="pln"> </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">iso</span></code>
</li>
</ol>
<h4 class="mume-header" id="%E6%8B%B7%E8%B4%9D-iso-%E6%96%87%E4%BB%B6">
        拷贝 ISO 文件</h4>
<p>
        到下载目录拷贝 ISO 文件:</p>
<ol class="linenums">
<li class="L0">
                <code><span class="kwd">cp</span><span class="pln"> ubuntu</span><span class="pun">-</span><span class="lit">20.04</span><span class="pun">.</span><span class="lit">2</span><span class="pun">-</span><span class="pln">live</span><span class="pun">-</span><span class="pln">server</span><span class="pun">-</span><span class="pln">amd64</span><span class="pun">.</span><span class="pln">iso </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">iso</span></code>
</li>
</ol>
<h4 class="mume-header" id="%E5%88%9B%E5%BB%BA%E5%8F%82%E6%95%B0%E8%87%AA%E5%8A%A8%E9%85%8D%E7%BD%AE%E6%96%87%E4%BB%B6">
        创建参数自动配置文件</h4>
<p>
        先创建空文件,<code>meta-data</code> 无需修改,<code>user-data</code> 后续会详细描述配置。</p>
<ol class="linenums">
<li class="L0">
                <code><span class="kwd">touch</span><span class="pln"> </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">autoinstall</span><span class="pun">/</span><span class="pln">user</span><span class="pun">-</span><span class="pln">data</span></code>
</li>
        <li class="L1">
                <code><span class="kwd">touch</span><span class="pln"> </span><span class="pun">/</span><span class="kwd">var</span><span class="pun">/</span><span class="pln">www</span><span class="pun">/</span><span class="pln">html</span><span class="pun">/</span><span class="pln">autoinstall</span><span class="pun">/</span><span class="pln">meta</span><span class="pun">-</span><span class="pln">data</span></code>
</li>
</ol>
<h3 class="mume-header" id="%E9%85%8D%E7%BD%AE-grubcfg">
        配置 grub.cfg</h3>
<ol class="linenums">
<li class="L0">
                <code><span class="kwd">if</span><span class="pln"> loadfont </span><span class="pun">/</span><span class="pln">grub</span><span class="pun">/</span><span class="pln">font</span><span class="pun">.</span><span class="pln">pf2 </span><span class="pun">;</span><span class="pln"> </span><span class="kwd">then</span></code>
</li>
        <li class="L1">
                <code><span class="kwd">set</span><span class="pln"> gfxmode</span><span class="pun">=</span><span class="kwd">auto</span></code>
</li>
        <li class="L2">
                <code><span class="kwd">insmod</span><span class="pln"> efi_gop</span></code>
</li>
        <li class="L3">
                <code><span class="kwd">insmod</span><span class="pln"> efi_uga</span></code>
</li>
        <li class="L4">
                <code><span class="kwd">insmod</span><span class="pln"> gfxterm</span></code>
</li>
        <li class="L5">
                <code><span class="pln">terminal_output gfxterm</span></code>
</li>
        <li class="L6">
                <code><span class="kwd">fi</span></code>
</li>
        <li class="L7">
                 </li>
        <li class="L8">
                <code><span class="kwd">set</span><span class="pln"> menu_color_normal</span><span class="pun">=</span><span class="pln">white</span><span class="pun">/</span><span class="pln">black</span></code>
</li>
        <li class="L9">
                <code><span class="kwd">set</span><span class="pln"> menu_color_highlight</span><span class="pun">=</span><span class="pln">black</span><span class="pun">/</span><span class="pln">light</span><span class="pun">-</span><span class="pln">gray</span></code>
</li>
        <li class="L0">
                <code><span class="kwd">set</span><span class="pln"> </span><span class="kwd">timeout</span><span class="pun">=</span><span class="lit">5</span></code>
</li>
        <li class="L1">
                 </li>
        <li class="L2">
                <code><span class="pln">menuentry </span><span class="str">"Ubuntu server 20.04 autoinstall"</span><span class="pln"> </span><span class="pun">{</span></code>
</li>
        <li class="L3">
                <code><span class="kwd">set</span><span class="pln"> gfxpayload</span><span class="pun">=</span><span class="pln">keep</span></code>
</li>
        <li class="L4">
                <code><span class="pln">linux </span><span class="pun">/</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">live</span><span class="pun">-</span><span class="pln">server</span><span class="pun">/</span><span class="pln">vmlinuz root</span><span class="pun">=</span><span class="str">/dev/</span><span class="pln">ram0 ramdisk_size</span><span class="pun">=</span><span class="lit">1500000</span><span class="pln"> </span><span class="kwd">ip</span><span class="pun">=</span><span class="pln">dhcp url</span><span class="pun">=</span><span class="str">'http://192.168.1.9/iso/ubuntu-20.04.2-live-server-amd64.iso'</span><span class="pln"> autoinstall ds</span><span class="pun">=</span><span class="pln">nocloud</span><span class="pun">-</span><span class="pln">net\;s</span><span class="pun">=</span><span class="pln">http</span><span class="pun">:</span><span class="com">//192.168.1.9/autoins</span></code>
</li>
        <li class="L5">
                <code><span class="pln">tall</span><span class="pun">/</span><span class="pln"> </span><span class="pun">---</span></code>
</li>
        <li class="L6">
                <code><span class="pln">initrd </span><span class="pun">/</span><span class="pln">boot</span><span class="pun">/</span><span class="pln">live</span><span class="pun">-</span><span class="pln">server</span><span class="pun">/</span><span class="pln">initrd</span></code>
</li>
        <li class="L7">
                <code><span class="pun">}</span></code>
</li>
        <li class="L8">
                 </li>
</ol>
<p>
        <code>menuentry</code> 之前是配置样式,也可以删除,重点关注 <code>menuentry "Ubuntu server 20.04 autoinstall"</code> 内的配置:</p>
<ol>
<li>
                指定镜像文件相对于 <code>tftp</code> 根目录的路径 <code>/boot/live-server/initrd</code>
</li>
        <li>
                <code>root=/dev/ram0 ramdisk_size=1500000</code> 为了指定内核镜像挂载空间,是否可删除我不确定</li>
        <li>
                <code>ip=dhcp</code> 指定内核镜像挂载后使用 DHCP 获取 IP 地址</li>
        <li>
                <code>url=</code> 指定 ISO 文件的网络存放路径</li>
        <li>
                <code>autoinstall ds=nocloud-net\;s=http://192.168.1.9/autoinstall/ ---</code> 该配置指明参数自动填写,并指明配置文件所在路径</li>
</ol>
<h4 class="mume-header" id="%E5%9D%91">
        坑</h4>
<p>
        网上很多文章配置是这么写的 <code>ds=nocloud-net;s=http://192.168.1.9/autoinstall/</code>,我试了很多次,都没有自动安装。</p>
<p>
        在网上查到,由于 UEFI 启动使用了 grub,它将 <code>;</code> 识别为了特殊字符,所以要在 <code>;</code>前加 <code>\</code> 转义。</p>
<h3 class="mume-header" id="%E9%85%8D%E7%BD%AE-user-data">
        配置 user-data</h3>
<ol class="linenums">
<li class="L0">
                <code><span class="com">#</span><span class="pln">cloud</span><span class="pun">-</span><span class="pln">config</span></code>
</li>
        <li class="L1">
                <code><span class="pln">autoinstall</span><span class="pun">:</span></code>
</li>
        <li class="L2">
                <code><span class="pln">version</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span></code>
</li>
        <li class="L3">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">修改</span><span class="pln">apt </span><span class="pun">服务地址</span></code>
</li>
        <li class="L4">
                <code><span class="pln">apt</span><span class="pun">:</span></code>
</li>
        <li class="L5">
                <code><span class="pln">primary</span><span class="pun">:</span></code>
</li>
        <li class="L6">
                <code><span class="pun">-</span><span class="pln"> arches</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="kwd">default</span><span class="pun">]</span></code>
</li>
        <li class="L7">
                <code><span class="pln">uri</span><span class="pun">:</span><span class="pln"> https</span><span class="pun">:</span><span class="com">//mirrors.tuna.tsinghua.edu.cn/ubuntu</span></code>
</li>
        <li class="L8">
                <code><span class="pln">user</span><span class="pun">-</span><span class="pln">data</span><span class="pun">:</span></code>
</li>
        <li class="L9">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">配置时区</span></code>
</li>
        <li class="L0">
                <code><span class="pln">timezone</span><span class="pun">:</span><span class="pln"> </span><span class="typ">Asia</span><span class="pun">/</span><span class="typ">Shanghai</span></code>
</li>
        <li class="L1">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">去使能</span><span class="pln"> root</span><span class="pun">账号</span></code>
</li>
        <li class="L2">
                <code><span class="pln">disable_root</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span></code>
</li>
        <li class="L3">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">配置用户</span><span class="pln"> </span></code>
</li>
        <li class="L4">
                <code><span class="pln">identity</span><span class="pun">:</span></code>
</li>
        <li class="L5">
                <code><span class="kwd">hostname</span><span class="pun">:</span><span class="pln"> ubuntu</span><span class="pun">-</span><span class="pln">server</span></code>
</li>
        <li class="L6">
                <code><span class="pln">password</span><span class="pun">:</span><span class="pln"> </span><span class="str">"yours"</span></code>
</li>
        <li class="L7">
                <code><span class="pln">username</span><span class="pun">:</span><span class="pln"> ubuntu</span></code>
</li>
        <li class="L8">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">配置键盘</span><span class="pln"> </span></code>
</li>
        <li class="L9">
                <code><span class="pln">keyboard</span><span class="pun">:</span><span class="pln"> </span><span class="pun">{</span><span class="pln">layout</span><span class="pun">:</span><span class="pln"> us</span><span class="pun">,</span><span class="pln"> variant</span><span class="pun">:</span><span class="pln"> </span><span class="str">''</span><span class="pun">}</span></code>
</li>
        <li class="L0">
                <code><span class="kwd">locale</span><span class="pun">:</span><span class="pln"> en_US</span><span class="pun">.</span><span class="pln">UTF</span><span class="pun">-</span><span class="lit">8</span></code>
</li>
        <li class="L1">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">配置代理</span></code>
</li>
        <li class="L2">
                <code><span class="pln">proxy</span><span class="pun">:</span><span class="pln"> http</span><span class="pun">:</span><span class="com">//192.168.1.112:3128</span></code>
</li>
        <li class="L3">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">默认安装</span><span class="kwd">ssh</span><span class="pln"> server</span></code>
</li>
        <li class="L4">
                <code><span class="kwd">ssh</span><span class="pun">:</span></code>
</li>
        <li class="L5">
                <code><span class="pln">install</span><span class="pun">-</span><span class="pln">server</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span></code>
</li>
        <li class="L6">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">指定安装的包</span></code>
</li>
        <li class="L7">
                <code><span class="pln">packages</span><span class="pun">:</span></code>
</li>
        <li class="L8">
                <code><span class="pun">-</span><span class="pln"> net</span><span class="pun">-</span><span class="pln">tools</span></code>
</li>
        <li class="L9">
                <code><span class="pun">-</span><span class="pln"> python3</span><span class="pun">-</span><span class="pln">pip</span></code>
</li>
        <li class="L0">
                <code><span class="com">#</span><span class="pln"> </span><span class="pun">配置磁盘分区</span></code>
</li>
        <li class="L1">
                <code><span class="pln">storage</span><span class="pun">:</span></code>
</li>
        <li class="L2">
                <code><span class="pln">grub</span><span class="pun">:</span></code>
</li>
        <li class="L3">
                <code><span class="pln">reorder_uefi</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">False</span></code>
</li>
        <li class="L4">
                <code><span class="pln">config</span><span class="pun">:</span></code>
</li>
        <li class="L5">
                <code><span class="pun">-</span><span class="pln"> </span><span class="pun">{</span><span class="pln">ptable</span><span class="pun">:</span><span class="pln"> gpt</span><span class="pun">,</span><span class="pln"> path</span><span class="pun">:</span><span class="pln"> </span><span class="str">/dev/</span><span class="pln">sda</span><span class="pun">,</span><span class="pln"> wipe</span><span class="pun">:</span><span class="pln"> superblock</span><span class="pun">-</span><span class="pln">recursive</span><span class="pun">,</span><span class="pln"> preserve</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> name</span><span class="pun">:</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span></code>
</li>
        <li class="L6">
                <code><span class="pln">grub_device</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> type</span><span class="pun">:</span><span class="pln"> disk</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">id</span><span class="pun">:</span><span class="pln"> disk</span><span class="pun">-</span><span class="pln">sda</span><span class="pun">}</span></code>
</li>
        <li class="L7">
                <code><span class="pun">-</span><span class="pln"> </span><span class="pun">{</span><span class="pln">device</span><span class="pun">:</span><span class="pln"> disk</span><span class="pun">-</span><span class="pln">sda</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">size</span><span class="pun">:</span><span class="pln"> </span><span class="lit">536870912</span><span class="pun">,</span><span class="pln"> wipe</span><span class="pun">:</span><span class="pln"> superblock</span><span class="pun">,</span><span class="pln"> flag</span><span class="pun">:</span><span class="pln"> boot</span><span class="pun">,</span><span class="pln"> number</span><span class="pun">:</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span></code>
</li>
        <li class="L8">
                <code><span class="pln">preserve</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> grub_device</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">,</span><span class="pln"> type</span><span class="pun">:</span><span class="pln"> partition</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">id</span><span class="pun">:</span><span class="pln"> partition</span><span class="pun">-</span><span class="lit">0</span><span class="pun">}</span></code>
</li>
        <li class="L9">
                <code><span class="pun">-</span><span class="pln"> </span><span class="pun">{</span><span class="pln">fstype</span><span class="pun">:</span><span class="pln"> fat32</span><span class="pun">,</span><span class="pln"> volume</span><span class="pun">:</span><span class="pln"> partition</span><span class="pun">-</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> preserve</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> type</span><span class="pun">:</span><span class="pln"> format</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">id</span><span class="pun">:</span><span class="pln"> format</span><span class="pun">-</span><span class="lit">0</span><span class="pun">}</span></code>
</li>
        <li class="L0">
                <code><span class="pun">-</span><span class="pln"> </span><span class="pun">{</span><span class="pln">device</span><span class="pun">:</span><span class="pln"> disk</span><span class="pun">-</span><span class="pln">sda</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">size</span><span class="pun">:</span><span class="pln"> </span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> wipe</span><span class="pun">:</span><span class="pln"> superblock</span><span class="pun">,</span><span class="pln"> flag</span><span class="pun">:</span><span class="pln"> </span><span class="str">''</span><span class="pun">,</span><span class="pln"> number</span><span class="pun">:</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span></code>
</li>
        <li class="L1">
                <code><span class="pln">preserve</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> type</span><span class="pun">:</span><span class="pln"> partition</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">id</span><span class="pun">:</span><span class="pln"> partition</span><span class="pun">-</span><span class="lit">1</span><span class="pun">}</span></code>
</li>
        <li class="L2">
                <code><span class="pun">-</span><span class="pln"> </span><span class="pun">{</span><span class="pln">fstype</span><span class="pun">:</span><span class="pln"> ext4</span><span class="pun">,</span><span class="pln"> volume</span><span class="pun">:</span><span class="pln"> partition</span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> preserve</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">,</span><span class="pln"> type</span><span class="pun">:</span><span class="pln"> format</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">id</span><span class="pun">:</span><span class="pln"> format</span><span class="pun">-</span><span class="lit">1</span><span class="pun">}</span></code>
</li>
        <li class="L3">
                <code><span class="pun">-</span><span class="pln"> </span><span class="pun">{</span><span class="pln">device</span><span class="pun">:</span><span class="pln"> format</span><span class="pun">-</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> path</span><span class="pun">:</span><span class="pln"> </span><span class="pun">/,</span><span class="pln"> type</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">mount</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">id</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">mount</span><span class="pun">-</span><span class="lit">1</span><span class="pun">}</span></code>
</li>
        <li class="L4">
                <code><span class="pun">-</span><span class="pln"> </span><span class="pun">{</span><span class="pln">device</span><span class="pun">:</span><span class="pln"> format</span><span class="pun">-</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> path</span><span class="pun">:</span><span class="pln"> </span><span class="str">/boot/</span><span class="pln">efi</span><span class="pun">,</span><span class="pln"> type</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">mount</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">id</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">mount</span><span class="pun">-</span><span class="lit">0</span><span class="pun">}</span></code>
</li>
        <li class="L5">
                 </li>
</ol>
<p>
        说明:</p>
<ol>
<li>
                密码需要加密,可以先用工具对自己的密码进行加密后填入</li>
        <li>
                代理不是必须的配置,与网络拓扑有关</li>
        <li>
                磁盘分区配置要注意,配置不对会导致自动安装走不下去,提示 crash;这个配置的整体思路是先格式化 <code>disk-sda</code>,然后在 <code>disk-sda</code> 下划分 <code>/dev/sda1</code>、<code>/dev/sda2</code> ,然后分别挂载 <code>/</code>、<code>/boot/efi</code> 目录</li>
        <li>
                安装过程日志在 <code>/var/log/installer/</code>,如果安装失败可以通过 <code>nc</code> 等工具实时发出去</li>
</ol>
<h3 class="mume-header" id="%E7%BD%91%E7%BB%9C%E6%8B%93%E6%89%91">
        网络拓扑</h3>
<ol>
<li>
                我在电脑上搭建了 DHCP、TFTP、HTTP 三种服务</li>
        <li>
                我在代理机上搭建了 squid,作为 HTTP 代理</li>
        <li>
                目标机器不能上网,三台机器在同一个局域网</li>
</ol>
<p class="article_img">
         </p>
<p>
        <img style="max-width:100%!important;height:auto!important;"title="搭建基于Ubuntu Server的PXE自动安装环境的实用指南" alt="搭建基于Ubuntu Server的PXE自动安装环境的实用指南" border="0" height="auto" src="https://zhuji.jb51.net/uploads/img/202305/11c05f5157fcc829e503c08dcdcaf79f.jpg"></p>
<h3 class="mume-header" id="%E9%85%8D%E7%BD%AE%E9%9D%99%E6%80%81-ip">
        配置静态 IP</h3>
<p>
        在服务机开始服务前,需要在提供服务的网卡上配置静态 IP,Ubuntu 20.04 配置 netplan 即可,参考以下配置修改文件 <code>/etc/netplan/00-installer-config.yaml</code>,修改完成后执行 <code>netplan apply</code> 配置即可生效。</p>
<ol class="linenums">
<li class="L0">
                <code><span class="com">#</span><span class="pln"> </span><span class="typ">This</span><span class="pln"> </span><span class="kwd">is</span><span class="pln"> the network config written by </span><span class="str">'subiquity'</span></code>
</li>
        <li class="L1">
                <code><span class="pln">network</span><span class="pun">:</span></code>
</li>
        <li class="L2">
                <code><span class="pln">ethernets</span><span class="pun">:</span></code>
</li>
        <li class="L3">
                <code><span class="pln">enp2s0</span><span class="pun">:</span></code>
</li>
        <li class="L4">
                <code><span class="pln">addresses</span><span class="pun">:</span></code>
</li>
        <li class="L5">
                <code><span class="pun">-</span><span class="pln"> </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.9</span><span class="pun">/</span><span class="lit">24</span></code>
</li>
        <li class="L6">
                <code><span class="pln">gateway4</span><span class="pun">:</span><span class="pln"> </span><span class="lit">192.168</span><span class="pun">.</span><span class="lit">1.1</span></code>
</li>
        <li class="L7">
                <code><span class="pln">nameservers</span><span class="pun">:</span></code>
</li>
        <li class="L8">
                <code><span class="pln">addresses</span><span class="pun">:</span></code>
</li>
        <li class="L9">
                <code><span class="pun">-</span><span class="pln"> </span><span class="lit">114.114</span><span class="pun">.</span><span class="lit">114.114</span></code>
</li>
        <li class="L0">
                <code><span class="pln">search</span><span class="pun">:</span></code>
</li>
        <li class="L1">
                <code><span class="pun">-</span><span class="pln"> </span><span class="lit">114.114</span><span class="pun">.</span><span class="lit">114.114</span></code>
</li>
</ol>
<h3 class="mume-header" id="%E9%B8%A3%E8%B0%A2">
        鸣谢</h3>
<ol>
<li>
                文章的基石来自 Grffion,没有这篇文章我会摸索更长时间</li>
        <li>
                这篇 askubuntu 的讨论 解决了坑</li>
        <li>
                user-data 磁盘分区配置来自 小崔</li>
</ol>
<p>
        原文链接:https://linux.cn/article-13693-1.html</p>
頁: [1]
查看完整版本: 搭建基于Ubuntu Server的PXE自动安装环境的实用指南