配置syslinux菜单界面

CentOS 7的安装引导菜单简洁美观,但是我们制作的pxe启动却需要使用指令引导,这真的算不上优雅。所以我们现在来制作一个启动引导菜单。

本文参考syslinux官网config文档操作,编辑菜单的详细参数可以参考menu文档。设计布局比较复杂,所以我们就复制CentOS7的布局到我们的配置文件中就可以了。

首先需要找到CentOS7安装光盘中的syslinux配置文件。挂载光盘到/media目录,syslinux的配置文件就在/media/isolinux中,打开isolinux.cfg。内容如下:

我们只需要参考这个文件编辑我们放在/var/lib/tftpboot/pxelinux/pxelinux.cfg/目录下的default就可以实现一个和CentOS7安装引导目录一样美观引导菜单。

注意,如果你的/var/lib/tftpboot/pxelinux目录下没有vesamenu.c32,你可以拷贝/media/isolinux目录下的vesamenu.c32文件到该目录下。

然后配置default文件如下,详细各参数是什么一次请参考syslinux官网文档,各标签中append的参数可以参考红帽的文档中的引导选项章节

然后开启PXE客户机,因为我没有使用背景图片,所以引导菜单看起来是下面的样子,如果你觉得很丑可以使用背景图片。

在原有PXE服务器上配置UEFI启动方式

先前我们已经配置了供BIOS启动使用的PXE服务器了,但是考虑到可能使用超过2T的系统盘,所以在原有的基础上配置供UEFI启动使用的环境。本文同样参考红帽CentOS7的文档准备网络安装章节。

之前我们已经配置过了dhcpd、tftp、httpd服务器了,就不需要重新配置了,只需要在原有的基础上添加UEFI启动文件。

挂载安装镜像光盘到/media目录,拷贝shim和grub2-efi安装包到/root目录,使用rpm2cpio shim-version-architecture.rpm | cpio -dimv命令提取shim包。在/var/lib/tftpboot/创建uefi目录。使用cp publicly_available_directory/boot/efi/EFI/redhat/shim.efi /var/lib/tftpboot/uefi/拷贝shim.efi到uefi目录,使用cp publicly_available_directory/boot/efi/EFI/redhat/grubx64.efi /var/lib/tftpboot/uefi/拷贝grubx64.efi到uefi目录。

在uefi目录创建grub.cfg文件,配置如下:

 

然后拷贝vmlinuz和initrd.img到uefi目录。

现在服务器已经配置好了,可是我还没有能从网络PXE启动的主板,现在还没发测试。

配置 Kickstart 安装

Kickstart的作用就是将安装系统过程中的配置自动化,同时也可以执行简单的脚本。这里我们就用最简单的办法先跑一边 Kickstart 安装。

首先配置一个空白的虚拟机,配置合适的虚拟磁盘,不要配置cdrom,不要安装系统,需要和之前配置的PXE_Server在同一个虚拟网络中。

开机,使用PXE安装,配置成想要的系统。安装完成后可以在/root目录下看到anaconda-ks.cfg文件,这个配置文件就是安装我们刚才的配置生成的。现在我们需要把他放在PXE_Server上,让PXE_Clinet通过网络抓取这个文件。

拷贝anaconda-ks.cfg到PXE服务器的/var/www/html目录下,通过浏览器访问http://192.168.100.3/anaconda-ks.cfg,测试是否能打开kickstart配置文件。然后修改/var/lib/tftpboot/pxelinux/pxelinux.cfg/目录下的default文件。参考红帽教程如何执行Kickstart安装?章节添加inst.ks配置项。如下:

 

使用现在虚拟机在通过PXE安装的时候就可以自动获取到Kickstart配置文件了。

新建一个空白的虚拟机进行测试。安装过程会自动执行,除了输入linux选项,不需要任何输入操作。

使用安装时生成的kickstart 配置文件不能满足我们的需求,我们需要对kickstart进行一定的定制。

1.禁用防火墙和selinux,虽然我非常不建议禁用防火墙和selinux,但是我的同事觉得有selinux和防火墙部署程序经常遇到问题太麻烦了,所以还是先禁用掉防火墙和selinux吧。我们需要在kickstart 配置文件中添加 firewall –disabled 和 selinux –permissive 来实现。

2.安装完成后自动重启,安装程序完成后默认是等待用户进行重启的,但是自动部署不可能等着用户去重启,需要安装完成后就自动重启并完成后面的操作,所以我们需要加入一行 reboot 指令。

3.配置安装后动作。

使用CentOS 7 搭建PXE_Server

具体部署过程参考redhat官方文档准备网络安装章节

新的项目需要部署大量的系统,所以需要做一个PXE_Server,之前有做过PXE_Server,但是过程没有记录下来。这次不光需要使用PXE安装操作系统,还需要进行设置和采集信息,所以后面还需要部署kickstart服务器。

首先需要一个可以正常使用的linux系统,我全新安装了一个CentOS 7 虚拟机,为了方便测试并且不影响公司其他人使用网络,我选择了使用NAT网络,并且需要关闭VMware的虚拟网络的DHCP,以免和后面PXE_Server的DHCP发生冲突。

因为关闭了DHCP,为了能使用yum安装软件,完成系统安装后需要配置网络,我是用nmtui工具进行配置。

配置的时候留意子网前缀和网关地址。

使用yum install tftp-server -y 安装tftp,安装成功后修改/etc/xinet.d/tftp 文件,将 disabled 参数从 yes 改为 no。如果使用防火墙需要允许tftp服务通过防火墙,测试环境下可以关闭防火墙。使用firewall-cmd –add-service=tftp –permanent永久允许tftp通过防火墙,success之后使用firewall-cmd –reload重载配置。

随后安装DHCP服务,我使用的是红帽条件的dhcpd服务,红帽官网有专门的教程。使用yum install dhcp -y安装dhcpd,如果你不需要进一步了解如何配置dhcp,按照网络安装章节的教程进行就可以了。配置/etc/dhcp/dhcpd.conf如下:

修改地址段为适合自己的配置。

接下来安装pxelinux.0,它的作用相当于传统启动中的grub。打开完整的DVD ISO镜像,我安装系统的时候使用的是minimal镜像,所以需要把VMware虚拟CD-ROM中的镜像换成完整的镜像,并将CD-ROM连接到虚拟机,后面也会用这个镜像做安装文件。将镜像挂载到/media目录,拷贝syslinux 的rpm包到合适的目录,教程中卸载了CD-ROM,因为我们后面还要继续用这个文件,所以就不卸载了。

然后使用rpm2cpio 提取rpm包,指令类似 rpm2cpio syslinux-4.05-13.el7.x86_64.rpm | cpio -dimv。使用mkdir /var/lib/tftpboot/pxelinux 创建pxelinux目录,并将提取出的pxelinux.0文件拷贝到pxelinux中,执行cp ~/usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux。

在pxelinux/创建pxelinux.cfg/目录,并在pxelinux.cfg目录中创建default配置文件。参照红帽教程配置default文件,其中inst.repo=项目需要配置安装源,我们准备使用http安装源,所以先搭建引导要用的http服务器。

其他配置选项参考红帽文档引导选项的章节。配置http安装源教程参考准备安装源章节

首先使用yum install httpd -y安装httpd服务器,然后将DVD ISO 映像挂载到http服务器root目录中。教程中将文件全部拷贝到了http服务器root目录,我这里图省事就直接将影响挂载到了服务器目录,毕竟我们用的本来就是虚拟机。在/var/www/html下创建centos7目录,将/dev/cdrom挂载到/var/www/html/centos7目录下。随后使用systemctl start httpd.service 启动httpd,使用浏览器访问确认是否生效,注意需要使用firewalld-cmd –add-service=http –permannet && firewalld-cmd –reload配置firewalld允许http服务。可以访问之后别忘了打开httpd的开机启动,使用systemctl enable httpd.service。

继续编辑/var/lib/tftpboot/pxelinux/pxelinux.cfg/default文件,修改inst.repo=http://192.168.100.3/centos7。

复制引导映像到tftpboot/pxelinux/目录,使用命令cp /media/pxeboot/{vmlinuz,initrd.img} /var/lib/tftpboot/pxelinux/。

下面运行tftpd和dhcp服务PXE_Server就算搭建完成了,因为tftp现在已经不依赖xinetd了可以不用按照教程上的systemctl start xinetd.service 启动tftpd,而是直接执行systemctl start tftp。

下面进行PXE启动测试。

安装一台全新的虚拟机,设置硬盘但不设置cdrom。启动后PXE启动获得了正确的ip地址和配置文件,出现boot:提示符后回车启动默认选项,这是提示Could not find kernel image: vesamenu.c32之前配置的时候也出现过这个错误,我还不清楚是我理解不够还是红帽官方的文档有问题。解决的办法是看到boot:提示符后输入linux回车。或者修改default配置文件中的default为linux,就可以直接使用回车启动了。

 

使用U盘安装CentOS7卡在”Starting dracut initqueue hook…”的原因及解决办法

使用U盘安装系统的过程中遇到卡在Starting dracut initqueue hook这里的情况,过一会会报timeout的错误。这是因为安装程序没有找到安装程序运行时映像位置。

安装程序是按照卷标寻找分区的,可以在开机过程中按tab编辑开机选项,uefi启动按e编辑。

我们可以看到卷标是CentOS 7 x86_64,但是卷标长度超出了windows的卷标长度限制。有教程说在这里编辑卷标为U盘的卷标就可以启动了,但是我试了一下没有用,可能是需要编辑分区的卷标。

所以按照之前查到的资料,编辑启动选项,按照路径查找镜像分区。首先等待timeout报错完成,这是会进入dracut的简易终端,cd /dev 执行ls查看有哪些分区,我的分区有sda和sdb、sdb4,所以sdb4就是镜像所在的分区,编辑inst.stage2=hd:LABEL=CentOS\x207\x2086_64为inst.stage2=hd:/dev/sdb4按enter开机,efi安装按ctrl+x启动。之后就能正常开机了。

使用Smart Slider 制作页面滚动横幅

如果想要在wordpress网页上添加滚动横幅,我推荐使用smart slider这款插件,相比其他的slider插件,这款插件的交互更加清晰便捷,而且功能也十分强大。

首先创建一个简单的三张图片的滚动横幅体验一下。

点击NEW SLIDER,我更喜欢全宽度的网页,所以选择全宽度,起个名字,其他参数我保持默认,点击创建。

然后点击NEW SLIDE 添加合适的图片。

如果你想制作更加精良的滚动横幅,下面的内容才是这款插件的亮点。

滚动页面,下方可以看到选择slider的设置项目,一共有两行,上面一行是slider的控制参数,下面一行是组件的参数。

可以调节的参数很多,需要细细摸索。如果你熟悉js,可以在developer栏中添加js控制程序。

控制组件如果没有太多需求可以保持默认。

下面我们来看一下怎么编辑slide,点击我们刚才创建的任意一个slide,编辑slide。

可以看到可以编辑的内容是相当丰富的。

每一个slide由background和上面的元素组成,其实刚才我们创建的时候添加的图片就是背景图,我们可以继续在背景图上添加内容。

编辑slide的编辑器使用的是类似ps的图层的概念,可以在一层一层的添加内容。

要对内容进行定位首先要添加一个结构层,其实就是使用盒子模型创建布局。

这里我添加一个特殊布局。然后添加各种层到slide,然后拖动层到想要添加的布局中。

默认的布局可能不符合你的要求,这时你可以调节布局比例。这类似于bootstrap的网格,布局被划分为行和列,通过调整行中列的比例进行控制。

此时,你就拥有了一个内容丰富的slide了。

当然我这里只是粗略的走了一个过程,各种动画和布局还是需要细节调整的,除了图片,你甚至可以添加通过视频链接添加视频层,虽然只支持youtuve和vimeo。

然后我们就可以使用短代码将创建的slider添加到页面中了。

 

使用AT模式控制ESP8266模块与设备进行通信

想要测试网络有没有接通,最方便的方式就是使用ping测试,ESP8266提供了AT+PING=<IP>的指令,我们可以使用AT+PING=”192.168.0.1″指令ping一下路由器,当然,如果你的路由器ip和我们的不一样要修改IP参数。当然你也可以选择ping外网域名,比如AT+PING=”www.baidu.com”。

可以使用AT+CIPDNS_CUR?查看DNS地址,这个DNS地址是临时获取到的地址,也可以使用AT+CIPDNS_DEF=1,”DNS1″,”DNS2″设置指定dns地址并保存到flash中,其实DNS1和DNS2应指定需要的dns服务器的ip地址。

现在我们可以使用安可信提供的TCP&UDP测试工具尝试使用ESP8266与电脑进行通信。

ESP8266支持两种传输模式,可以使用AT+CIPMODE=<mode>进行设置,这两种模式分别是:

0:普通传输模式

1:透传模式,仅支持TCP单连接和UDP固定通信对端的情况

因为透传模式信息直接发送,操作比较简单,我们先使用透传模式测试通信。

使用AT+CIPMODE=1设置传输模式为透传模式。注意上面的指令仅仅是暂时使用透传模式,不会将设置保存到flash,要使用AT+SAVETRANSLINK命令保存透传模式到flash。

打开TCP&UDP测试工具,创建服务器,然后启用服务器,有防火墙的应该选择允许,记录下IP地址和端口号。

要进行通信,首先要建立连接,以TCP连接为例,首先建立ESP8266到电脑的TCP连接,使用AT+CIPSTART指令建立连接。比如:AT+CIPSTART=”TCP”,”192.168.0.131″,3456,就是建立到192.168.0.131:3456端口的连接。成功后可以接收到CONNECT的提示。同时可以在TCP&UDP测试工具中看到已经建立的连接。

然后使用AT+CIPSEND指令发送数据。在透传模式中使用AT+CIPSEND后进入发送模式,ESP8266每接受2048字节数据或20ms后就会将数据发送的服务器。

要停止通信回到指令模式需要单独发送一包+++,注意在发送+++的时候要取消勾选发送新行,不然ESP8266会将其当作要发送的内容。要继续使用命令需要等待至少1秒。

现在我们就已经可以通过TCP与其他设备进行通信了。

更新ESP8266固件

因为在测试网络通信的时候发现有些指令不能用,所以先更新一下固件版本。

使用AT+GMR查看ESP8266的固件版本,发现已经比较老了,最新的固件可以到乐鑫官网下载,固件和烧写工具分别在AT页面工具页面下载。

要进行烧写,首先要将ESP8266阵脚连接成烧写模式,将GPIO0接地,EN接高电平,不要上电,先把USB转串口模块接到电脑上,打开烧录工具。

选择ESP8266 DownloadTool,按照下载的固件中的Readme.md文件中的指引选择合适的bin文件到对应的地址。

选择晶振频率,我没有找到文档说明我用的模块的晶振频率,我本来以为是40M的,烧写之后全是乱码不能用,改用26M烧写成功,选择FLASH SIZE,通过查看Flash芯片上的型号,查询到是8Mbit的,选择合适的COM口和波特率。点击start。

看到等待上电同步之后,连接ESP8266模块的电源。

然后就可以看到烧写的进度,烧写完成后断开电源,将GPIO0悬空,再接通电源。可能会提示错误,可以再次点击START并重新插拔电源线,多试几次可能就可以成功了。

发送AT+GMR查看固件版本。

使用AT模式控制ESP8266模块连接网络

ESP-01S是安信可使用乐鑫公司出品的使用ESP8266芯片开发的一款WiFi模块。详细参数可以访问安信可官网查看。

首先使用USB转串口模块在电脑上测试AT命令。推荐使用安信可出品的串口调试工具,可以在安信可开发工具清单页面下载。

首先连接USB转串口和ESP8266模块,在产品参数页面我们可以看到这个模块一共有8个阵脚,使用AT模式只需要连接其中5个脚,分别是VCC、GND、TXD、RXD、EN,其中EN需要连接高电平才能进入AT模式,可以使用上拉电阻,也可以直接接VCC,注意VCC使用的是3.3V电源,接5V电源会烧坏。

将USB串口模块连接到电脑上,打开安信可串口调试助手,选择正确的端口号和波特率后打开串口,默认波特率是115200,也可以使用AT指令设置指定波特率。

使用杜邦线接通ESP8266电源,可以从串口助手看到一些乱码,这不需要担心,ESP8266开始工作之前输出乱码是正常的。看到ready提示符之后说明你的ESP8266模块可以工作了。可以发送”AT”指令进行测试,模块会回复”OK”表示工作正常,注意要勾选发送新行,因为ESP8266的AT指令都是以回车换行结束的。

下面使用AT指令将ESP8266模块连接到路由器,具体的AT指令可以在乐鑫官方文档中查询。

ESP8266有三种工作模式,分别是:

1: Station模式

2:SoftAP模式

3:SoftAP+Station模式

这里使用Station将ESP8266作为局域网设备连接到网络,发送AT+CWMODE_DEF=1设置工作模式,并将设置保存到flash中。你也可以使用3模式进行连接,因为我后面的实验都是使用ESP8266作为设备,所以将模式设置为1模式。

使用AT+CWJAP_DEF指令将ESP8266模块连接到希望连接的AP上,这个指令有两个参数,分别是UUID和密码,参数之间使用英文逗号分隔,注意字符串参数都需要加双引号。例如我要连接到我的路由器使用AT+CWJAP_DEF=”MERCURY_3A2″,”********”指令进行连接,你需要将UUID和密码设置为你要用的UUID和密码。

可以使用AT+CIPSTA?指令查询ESP8266获取到的IP地址。

可以使用AT+CWDHCP?指令查询ESP8266 DHCP设置。

可以使用AT+CWAUTOCONN?查询开机是否自动连接AP,通过设置该参数为1或0控制开机是否连接路由器。

更多AT指令可以从AT指令文档中查看。稍后我会介绍如何使用AT指令与其他设备通信。

在ARDUINO上使用DHT库采集DHT22温湿度传感器的数据

DHT22使用的是单总线的设计,利用高电平时间长短表示1和0,这样的设计简化了外部接口,Arduino官网的项目多是采用DHT.h这个库来采集数据,这个库是Adafruit开发的众多库中的一员。

如果只安装DHT库,编译会报错,因为这个库依赖Adafruit Unified Sensor 库。

安装好了库之后从DHT库下载一个简单的DHTtester示例就可以从串口看到温湿度的数据了。

 

如果你使用的是DHT11,只需要取消#define DHTTYPE DHT11的注释,添加#define DHTTYPE DHT22 的注释就可以了。