学习了一下 PXE,有时间搭建一个 PXE 服务器玩玩,以下仅为我的理解

关于 PXE

PXE 是一种系统引导方式,由 Intel 提出(文末有 PDF 文档下载)。PXE 的客户端已经内置在网卡中,服务端需要搭建(需要保证搭建网络环境安全,PXE 服务是不安全的),一般用于企业大量机器的系统安装

BIOS 启动选项中经常见到的 通过网络 (IPv4、IPv6) 启动就是 PXE 服务

PXE 服务端的搭建需要 DHCP(或 proxyDHCP,详见后文) 和 TFTP 服务,其中

  • DHCP 服务用来分配 IP 地址并发放 PXE 的 TFTP 地址等信息
  • TFTP 服务向客户端传输文件(引导文件、安装文件等)

也就是说在 PXE 中,一般启动方式中的从存储介质(U盘、硬盘)读取文件改为从远程服务器下载——省去了装系统时一个个拔插U盘的动作,在给大量机器装系统的场景下更高效

PXE 的启动过程

关于 PXE (预启动执行环境)

  1. 客户端(PC 网卡)向网络广播包含了 PXE 标签(表示要从网络启动,区分于一般的DHCP请求)的扩展 DHCP 包
  2. DHCP服务捕获到这些包,向客户端发送 IP 地址信息
  3. 客户端再向 DHCP 服务器请求 TFTP 服务器地址
  4. DHCP 服务器返回 TFTP 服务器地址
  5. 客户端再向 DHCP 服务器请求 TFTP 服务器中启动镜像的路径(包含文件名称)
  6. DHCP 服务器返回启动镜像的路径
  7. 客户端连接 TFTP 服务器,请求启动镜像
  8. TFTP 服务器发送启动镜像,客户端将启动镜像下载到内存中

之后的启动过程与 PXE 无关,可见 PXE 只负责系统引导部分

关于 proxyDHCP

proxyDHCP 是为非 PXE 的 DHCP 环境提供 PXE 服务的软件

非八股文版本:上文提到的 DHCP 服务默认包含了 PXE,而在家庭网络中,DHCP服务一般内置在路由器(或网络运营商送的带路由功能的光猫)中,这些设备的 DHCP 服务一般是不支持 PXE 的,这时就可以在网络中专门用一个电脑搭建 PXE 服务,来接管网络中的 PXE 请求

proxyDHCP 的启动过程:关于 PXE (预启动执行环境)

与上文相同,只是拆分了 IP 分配和 TFTP 信息获取——DHCP 负责 IP 分配,proxyDHCP 负责返回 TFTP 信息

文档下载

Intel 的 PXE PDF 文档:pxe spec

被星球大战2的 “For the better, right?” meme 刷屏,心血来潮点子萌生想把这个搬到 Wallpaper Engine

找种子->下电影->截图->拼接->发布图片壁纸,一气呵成,但是总觉得什么都不加的 meme 少了味道,于是又想加入自定义文字

Wallpaper Engine 的场景和视频壁纸并不支持,只能通过网页壁纸来实现

下文将展示如何在 Wallpaper Engine 的网页壁纸中添加用户自定义文字(其他用户属性同理)

环境

  • Windows 10
  • Wallpaper Engine 1.6.22

参考

步骤

以下步骤假设已经写好网页 index.html,内容大致如下

<head>
<!-- meta -->
<!-- some css -->
</head>
<body>
<div>
    <span id="text1"></span>
</div>
<div>
    <span id="text2"></span>
</div>
<div>
    <span id="text3"></span>
</div>
<div>
    <span id="text4"></span>
</div>
<script></script>
</body>

需要实现:在 Wallpaper Engine 中用户可以自定义这四个 span 中的内容

在壁纸项目中添加用户属性

在壁纸编辑器中打开 编辑 – 更改项目设置 – 添加属性,出现对话框(下图为场景壁纸的选项,网页壁纸还会多两个文件和目录选项)Wallpaper Engine 网页壁纸添加用户自定义属性

添加四个文本框属性,并记住它们的关键字 (key)Wallpaper Engine 网页壁纸添加用户自定义属性

添加 wallpaperPropertyListener 代码

打开 index.html,在 script 标签内添加 js 代码

window.wallpaperPropertyListener = {
    applyUserProperties: function(properties) {
        if (properties.text1) {
            var span = documents.getElementById("text1");
        span.innerHTML = properties.text1.value;
        }
    if (properties.text2) {
            var span = documents.getElementById("text2");
        span.innerHTML = properties.text2.value;
        }
    if (properties.text3) {
            var span = documents.getElementById("text3");
        span.innerHTML = properties.text3.value;
        }
    if (properties.text4) {
            var span = documents.getElementById("text4");
        span.innerHTML = properties.text4.value;
        }
    },
};

wallpaperPropertyListener 是 Wallpaper Engine 独有的对象,在其他浏览器中无效

壁纸项目中添加的用户属性通过 properties.[属性关键字] 来访问

if (properties.属性关键字) 实现了在对应关键字 (key) 的属性发生变化时执行 if 内的逻辑

在 if 声明中可以添加更加复杂的逻辑

其他属性的使用可以查看官方文档 Wallpaper Engine – Designer Documentation – User Properties Continue reading “Wallpaper Engine 网页壁纸添加用户自定义属性”