Coding Poet, Coding Science

Keep Stupid, Keep Hungry


  • 归档

  • 分类

  • 标签

  • 资源

  • 关于

  • 搜索
  • 简体中文
  • English (US)
close
Coding Poet, Coding Science

命令行下面的关机,PXE远程启动

发表于 2014-09-20 | 更新于 2016-12-14 |

下午针对这个问题google了一下,原因大概就是 halt 是强制关机,而poweroff 会先给 ACPI (Advanced Configuration and Power Management Interface)一个命令,之后再关机(不知道这么理解是不是准确,逃)。感觉是我直接用 halt 才出的问题。继而观察了下这三个命令,

shutdown实际上是调用init 0, init 0会cleanup一些工作然后调用halt或者poweroff。其实主要区别是halt和poweroff,做没有acpi的系统上,halt只是关闭了os,电源还在工作,你得手动取按一下那个按钮,而poweroff会发送一个关闭电源的信号给acpi。但在现在的系统上,他们实际上都一样了

可以参考juju-charm上面的关于maas的区域控制器的介绍。上面用图表的形式列出了区域控制器所依赖的psql、sstream等组件。

远程启动

不同计算机支持的远程启动协议是各种各样的,在Intel的机器上,使用的是所谓的PXE(Preboot Execution Enviroment)技术。PXE协议是根据服务器端收到的工作站的MAC地址,使用DHCP服务给这个MAC地址指定一个IP。在PXE中,待启动的机器常称为工作站。PXE工作的大致过程是,工作站开机后,PXE BootROM(网卡上的自启芯片)获得控制权之前先做自我测试,然后以广播形式发出一个请求FIND帧。服务器若收到工作站的要求,就会发出DHCP回应。内容包括用户端的IP地址、预设通讯通道、开机映象文件等。工作站收到后回应相应的帧请求传送所需文件。之后将会有多次协商过程,以决定启动参数。之后BootROM由TFTP通讯协议从服务器下载开机映象文件。这个映象档就是软盘映象文件(系统映象文件)。工作站使用TFTP接收启动文件后,将控制权转交启动块,引导操作系统映象,完成自启动过程。

配置过程中,针对DHCP、TFTP、NFS进行相应的配置。DHCP用于将引导模块交给工作站,TFTP用于传送操作系统映象,而NFS用于加载开机启动时所需的各个文件。

TFTP的配置可由xinetd决定。而DHCP中的一些选项是与TFTP启动配合的。所以在正常配置好DHCP服务器之后,由next-server选项指定TFTP服务器的地址,由filename选项指定TFTP服务器文件的路径。这是因为,根据DHCP协议的规范,next-server就是TFTP服务器的地址。

## 目标机器的DHCP配置项
host target {
## 目标机器所匹配的MAC地址
hardware ethernet 00:13:21:1F:F1:82;
## 目标机器分配到的IP地址
fixed-address 192.168.0.10;
## 目标机器所使用的网关地址
option routers 192.168.0.254;
## 目标机器所用的DNS
option domain-name-servers 208.67.222.222,208.67.220.220;
## 指定TFTP服务器的地址。如果TFTP与DHCP服务器是一个IP,则可以忽略
next-server 192.168.0.2;
## 指定开机文档在TFTP服务器上的路径
filename "/ubuntu-installer/i386/pxelinux.0";
}

然后可以开启TFTP服务,并且操作系统映象也可以放在TFTP服务器上。对于Ubuntu来说,可以将光盘中的/install/netboot/ubuntu-installer/目录复制到TFTP目录下面。之后,打开客户机的电源,BIOS中选择从网络启动即可。

上面的DHCP配置中仅有被启动的工作站的配置节,而正常的DHCP应当有针对子网的配置。dhcpd.conf文件的其他部分可参考示例文件:

ddns-update-style none;
ignore client-updates;
allow booting;
allow bootp;

subnet 192.168.5.0 netmask 255.255.255.0 {
option routers 192.168.5.1;
option subnet-mask 255.255.255.0;
option domain-name-servers 202.112.128.50;
range dynamic-bootp 192.168.5.33 192.168.5.38;
default-lease-time 21600;
max-lease-time 43200;
}

我们知道,本地启动的时候,有GRUB和LINUX系统映象两个文件。前面的pxelinux.0就相当于GRUB、整个光盘就相当于开机系统。linux发行版光盘的install/netboot目录中有pxelinux.0文件及相应的配置选项,使用的时候,该文件夹的内容全部拷贝到TFTP根目录下面。

Ubuntu一系的软件,光盘映象基本上都放在HTTP服务器上。也就是操作系统映象自TFTP传到工作站并运行的时候,Ubuntu自动从本网络的一台HTTP服务器上查找安装所需文档。此时,我们可以选择将整个光盘映象挂载至HTTP服务器的 /ubuntu目录下面。工作站的PXELINUX启动的时候,会向我们询问操作系统映象的地址。

如果合适,我们也可以将安装好的系统分发给其它的工作站,而不用远程安装系统。

实战

首先安装Ubuntu上所需要的各种软件,然后将Ubuntu14.04的映象下载过来。

apt-get install nfs-common nfs-kernel-server
apt-get install tftpd-hpa tftp-hpa
apt-get install isc-dhcp-server

DHCP服务的端口号是TCP67,而TFTP服务的端口号是UDP59,可以通过netstat命令查看相关的设置。

tftp-hpa使用的配置文件是 /etc/default/tftpd-hpa ,可以根据需要,将TFTP的服务器目录改变到其它的位置。不过,配置的时候,注意权限问题。

isc-dhcp-server使用的配置文件是 /etc/dhcp/dhcpd.conf 。配置的时候按照格式。

配置DHCP的时候,应将这里的DHCP与服务器上的DHCP区分开。一般而言,笔记本在连接无线的时候,有线网络并不受到影响。这个时候我们可以指定本机的地址,然后在dhcpd.conf文件中,将网关的位置填写成自己的。其实,如果是局域网里面访问,则根本不需要网关地址。因为局域网中的主机访问,不需要通过网关。

NFS服务是可选的。如果需要使用这个服务的话,使用NFS的时候,别忘了安装nfs-kernel-server。然后编辑 /etc/exports 文件,选择需要导出的数据。

然而在共享的时候,NFS需要用户的密码。这一点需要我们注意。没有/etc/exports里面的文件的时候,导出的目录是空的,NFSD守护进程也不会运行。简单的导出可 以是 /srv/www *(ro) 这样的行。

PXELINUX介绍

其实使用TFTP服务全部依赖于所谓的PXELINUX启动程序。该程序与SYSLINUX、EXTLINUX同属于一个发行版。PXELINUX的pxelinux.0文件所在的TFTP的根目录,其实就相当于本地启动的时候的boot分区而已。

下载PXELINUX程序之后,将 /usr/lib/syslinux/pxelinux.0 文件复制在TFTP根目录下面。然后在TFTP根目录下建立pxelinux.cfg目录。在目录中建立default文件。其实,PXELINUX的解释是, pxelinux.cfg目录代表了对不同的客户机的启动选项的配置,以便支持不同的系统。而只有一个default文件的时候,相当于局域网中只有一个主机。

下面是PXELINUX的配置文件的一个示例写法:

DEFAULT ubuntu
LABEL ubuntu
kernel linux
append initrd=initrd.nfs root=/dev/nfs nfsroot=192.168.1.88:/home/cache/netboot/root ip=dhcp rw

kernel与append命令所需的linux与initrd文件,都是以TFTP根目录为根所得到的文件路径。因此内核linux与initrd文件要与pxelinux.0一起放在TFTP根目录下。

任何linux内核均支持root=这样的参数,大部分也支持nfsroot选项。如果把nfsroot都指定了,那么工作站将以nfsroot所指的位置作为根系统。然后,找到根系统后,我们就可以从根文件系统的 /etc/fstab中加载其它的NFS挂载选项。通过不同的组合,可以实现无盘工作站或者有盘工作站。

如果理解了内核的root=选项,以及联想到OpenSUSE安装光盘具有指定光盘位置的选项,那么远程安装系统就不是什么困难的事情了。

对于Ubuntu来说,不同之处在于,Ubuntu的安装映象支持ks=选项,而ks=又可以调用http服务,因此Ubuntu具有从HTTP服务器上下载文件的能力。显然,如果工作站能够下载服务器上的安装映象,那么自然就能够完成接下来的安装。

网络唤醒功能

网络唤醒功能一个是网卡支持,第二个是BIOS启用,另外一个是有应用工具。网卡的支持是生产商的问题。BIOS中启用与否,可以在机器BIOS中启用,应用工具则是运行在具体操作系统下面的。

linux的ethtool工具可以用于修改网卡上WOL的状态,决定从网络唤醒是否启用。使用 ethtool -s eth0 wol g 就可以启用网卡的网络唤醒功能。 wol d表示禁用。

linux的 wakeonlan工具是唤醒网卡的终端。它接受MAC地址作为参数,唤醒局域网中具有此MAC的机器。

完成PXE启动的时候,导出NFSROOT目录,配置为

/etc/exports: the access control list for filesystems which may be exported
    to NFS clients.  See exports(5).

Example for NFSv2 and NFSv3:
/srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)

Example for NFSv4:
/srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
/srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)

/srv/www    *(ro)
/srv/tftpboot/ *(no_subtree_check,rw,no_root_squash,async)

然后在启动文件 pxelinux.cfg/default 中配置启动选项为:

# D-I config version 2.0
prompt 0
timeout 100

DEFAULT ubuntu
LABEL ubuntu
KERNEL ../ubuntu/casper/vmlinuz.efi
APPEND initrd=../ubuntu/casper/initrd.lz boot=casper netboot=nfs root=/dev/nfs nfsroot=10.10.10.1:/srv/tftpboot/ubuntu ip=dhcp

其中 /srv/tftpboot/ubuntu 相当于光盘的根目录,里面有linux安装光盘里面的所有的文件。这种方式只需要NFS就可以,不用HTTP服务,因此是一种比较好的解决的办法。

剩下的就是 wakonlan 的测试了。这也应该是不成为问题的。只需要将网卡配置好就可以了。

Coding Poet, Coding Science

Scala语言编程

发表于 2014-09-14 | 更新于 2016-12-14 | 分类于 编程语言 |

接触过许多编程语言后,对Scala也就不那么热心了。一句话,Scala有的,有什么是在其它编程语言中没有的么?像函数式编程语言、面向对象编程,找了一打,也找不到以Scala为代表。在具体特性上,Python的字典,比Scala的映射表其实更为好用。在叠代上,Python至少更方便,而且C#的LINQ查询似乎比Scala走得更远。Scala是静态类型的,而现在,有很多脚本语言已经成为了“高级动态语言”,这也是Scala望尘莫及的。

个人觉得,对Scala语言的正确定位是,它是一种新的开发应用的方式,按照Scala的这种方式,并不需要激进的革命,传统的程序员就可以完成转型。因此,软件工程与编程语言的结合得到了保留,一个语言同时也就是为一个软件工程而生。

甚至C#,因为所使用的CLR技术,比Scala更强调机器的技术。Java和Scala一系的基础结构其实很简单,就是脱离机器的JVM虚拟机。得益于对这个虚拟机的优化,它们得以演变成独立的生态环境。而像Python与Ruby这样的,对于怎样编译其实并不关心,因为有CLR帮助它们,所以Python与Ruby可以更强调编程的灵活。

阅读全文 »
Coding Poet, Coding Science

MathGL绘图工具

发表于 2014-09-13 | 更新于 2016-12-14 |

该绘图工具的应用也很广,但是之前一直都没有能够接触到。现在才将相关的内容补充到笔记当中,希望这是一个非常有效的绘图的工具。

MathGL在Ubuntu下的安装是一件简单的事,安装mathgl关键字开头的程序、文档、头文件与库文件、面向Python语言的python-mathgl库,以及udav可视化工具即可。MathGL支持几种不同的编程方式,面向C、C++、Fortran、Octave或者Python。根据需要,应当安装上不同的接口。也许有一天,支持R也是可行的。此外,MathGL工具还可以分析一种称为MGL的脚本文件,该脚本文件可以方便地完成MathGL中的一些绘图操作,是值得学习的一种操作方式。

在绘图过程中,MathGL有自己的字体系统,但是尽量可以做到与TeX的兼容。不仅可以方便地选择字体,而且提供了大量的数学符号。这些对于初学者及一般的应用都是非常充足的。

MathGL有很多优点。如脚本化的绘图语言、C++的执行效率、多语言接口、支持输出多种图形格式、内建多种绘图方法、支持MPI等编程接口、与C++等宿主语言的数据结构融合。这些使它成为很有吸引力的一个绘图库。

MathGL基础操作

首先我们介绍在MathGL在C++下的使用。像C++这类接口,一般要安装lib*这样的软件包,而不只mathgl软件包一个,这样g++在编译的时候,才可能与正确的库文件链接。这是一个需要注意的地方。如果下面的MathGL C++程序出错,根据编译器反馈的错误信息,我们应当能够发现错误、纠正错误。

#include <mgl2/mgl.h>
int main(int argc, char* argv[])
{
    mglGraph graph;
    graph.FPlot("sin(pi*x)");
    graph.WriteFrame("test.png");
    return 0;
}

编译、运行mathgl1.cpp,查看图片所使用的Bash命令建议为:

g++ -lmgl mathgl1.cpp -o mathgl1
./mathgl1
eog sample.png

注:如果使用了其它的绘图接口,可能需要使用 -lmgl-wnd 等库。

MathGL的绘图画布中使用帧、子图等概念,因此一个 mglGraph对象可以创造出多个子图的组合,以及多个帧的组合。后者使MathGL有制作动画的能力。

使用MGL脚本的时候,MathGL中有 mglconv 工具和 mglview工具可以使用。它们 是运行MGL脚本的宿主环境。

MathGL库支持的输出方式,包括向图形终端输出,此方式下可以完成一些交互式的动作;直接写入到点阵或者矢量图形格式,此方式下直接运行MathGL的C++程序以得到结果。

窗口绘图、GLUT绘图与输出到文件

绘图到一个单独的窗口,或者使用GLUT库输出,道理是一样的。

#include <mgl2/mgl.h>
#include <mgl2/window.h>

int do_draw(mglGraph *graph)
{
    graph->Rotate(60,40);
    graph->Box();
    return 0;
}

int main(int argc, char* argv[])
{
    mglWindow window(do_draw, "MathGL Window example');
    int status = window.Run();
    return status;
}

原理就是如此了,不过在Ubuntu上有些错误,可能是安装MathGL的问题。

使用GLUT作为后端的时候,更为简单,因为不用WX组件了。

#include <mgl2/mgl.h>
#include <mgl2/glut.h>

int do_draw(mglGraph *graph)
{
    graph->Rotate(60,40);
    graph->Box();
    return 0;
}

int main(int argc, char* argv[])
{
    mglGLUT window(do_draw, "MathGL Window example");
    return 0;
}

在编译的时候,调用

g++ mglut.cpp -o mglut -lmgl -lmgl-glut

如果将 -lmgl 选项放在 mglut.cpp的前面,似乎总会出现连接错误。这个问题 目前还不知道是怎么样的一回事。

在GLUT界面中,使用aswd按键旋转图形,使用r与f切换透明(transparency)与光照(lighting)状态。按键x可以退出窗口。

说明:以后我们的绘图的时候,就使用上面的代码所提供的方法,把绘图的代码都放在 do\_draw() 函数里面,然后由 mglGLUT对象调用。这样可以使我们更 专心于图形的绘制。

如果是输出到文件,那么调用 mglGraph 对象的 WritePNG()、 WriteEPS() 等 函数即可。在使用g++编译的时候,除了-lmgl 选项,其它都不用。

动画的制作使用 mglGraph对象的多帧功能。如果是保存GIF格式,在绘出每帧 之前,就应当使用mglGraph 的 StartGIF() 函数保存文件,并在完成所有的帧的绘制之后使用 CloseGIF() 函数关闭GIF文件的描述符。

保存动画还有另一种方法,就是绘制完当前帧后,以frameXX.jpg的格式保存当前帧,然后切换到下一帧。所有的帧都各自输出成JPEG格式后,使用ImageMagick提供的convert命令将JPEG制作成MPG。

MathGL也支持在Qt绘图画布中绘图,图形作为Qt窗口的一部分。但是那并非MathGL绘图语言的核心。现在不讲,或许以后结合PyQt库使用MathGL的时候这个功能我们会用到。

MathGL对子图绘制的支持

MathGL采用“选中-绘制”的方法支持子图的绘制,也就是一个mglGraph 对象使用 SubPlot()方法选中一块子图区域,之后还是使用 mglGraph 对象的Title()等函数来操作绘图,此时图形会自动绘制在当前的子图上。在绘制子图的时候,另一种编程实现是“切换-绘制”的方法。该方法是调用当前绘图对象的方法产生一个子图对象,通过操作子图对象的方法在子图上绘图。Asymptote与Mathplotlib等都是采用这种方法。MathGL是前一种方法,因此要与后一种实现方式区分开。

int do_draw(mglGraph *g)
{
    g->SubPlot(2,2,0); g->Box();
    g->Puts(mglPoint(-1,1,1),:"Just box", ":L");
    g->InPlot(0.2,0.5,0.7,1,false);
    g->Box();
    g->Puts(mglPoint(0,1.2), "InPlot Example");

    g->SubPlot(2,2,1);
    g->Title("Rotate only");
    g->Rotate(50,60);
    g->Box();

    g->SubPlot(2,2,2);
    g->Title("Rotate and Aspect");
    g->Rotate(50,60);
    g->Aspect(1,1,2);
    g->Box();

    g->SubPlot(2,2,3);
    g->Title("Aspect in other direction");
    g->Rotate(50,60);
    g->Aspect(1,2,2);
    g->Box();

    return 0;
}

更复杂的子图绘制方式,可以参考 MultiPlot() 、StickPlot() 等函数。

剩下的就是具体各种图形的绘制了。

使用MathGL绘制动画示例

int do_draw(mglGraph *gr)
{
    gr->NewFrame();
    gr->Rotate(60,40);
    gr->Box();
    gr->EndFrame();
    gr->NewFrame();
    gr->Box();
    gr->Axis("xy");
    gr->EndFrame();
    return gr->GetNumFrame();
}

使用MGL脚本语言

MGL脚本语言其实是很方便的一个东西。该语言每一行都代表一个命令,类似于tcl脚本,而且连注释的格式都是与tcl语言相同的:从#开始直到行尾。另一方面,MGL脚本按行分析语句,语句的第一个单词代表一个命令,像Bash中那样。而MGL脚本中的字符串用成对的单引号括起来,如果需要跨行,则使用反斜杠加换行表示将本行与下一行联系在一起。

MGL脚本中的命令都来自 mglGraph的成员函数,因此只要我们了解了MathGL面向C++的库的用法,自然就知道如何写MGL脚本文件。

除此之外,MGL还有一些定义函数、声明变量的语句。它们都转成相应的C++的语法。在C++中使用MGL语言也是可行的,因为MGL脚本会通过 Parse()函数 被解析,由 Execute()函数执行。(两个函数都在mgl2/mgl.h头文件中)。

A. A. Balakin所蓍的《MathGL官方文档》中的《MathGL core》一章,既介绍了MathGL语言(C++库的函数),同时又介绍了MGL的命令,是MGL语言与MathGL库的最标准的参考手册。

MathGL所提供的mglconv工具可以将MGL脚本转换成PGF/TikZ、EPS、PRC、SVG等格式,因此也可以作为一个实用的面向TeX文档的接口。这样一来,可能在MathGL中文字处理变得更简单了。

Coding Poet, Coding Science

Gnuplot绘图

发表于 2014-06-26 | 更新于 2017-04-24 | 分类于 出版 , 绘图 |

使用过很多的绘图的软件了,但是用起来总是不那么方便。而且我的绘图是在文档当中的,要求与文档有相同的风格。但是通常情况下,这些都难以达到。因此,不管是Asymptote还是其它的软件,配置起来都比较麻烦。

MetaPost的问题是,Metapost与XeTeX不太兼容。使用中文的时候又不方便了。所以我们还是使用其它的方法。

gnuplot有一个优点,就是它可输出成TeX的源代码的格式。第一种是LaTeX自带的picture环境,在里面直接绘图。第二种是tikz环境。无论哪一种环境,排版的工作都是连同文字一起的。所以正文是什么格式,其它文章也可以是这样的格式。

如果将gnuplot的输出改成picture环境,那么在每个gnuplot文件前面添加如下的行:

set terminal latex    ## 也可以是emtex环境。
set output "pic.tex"  ## 生成的.tex文件。

然后使用\input{pic.tex}将生成的文件嵌入到文本中,注意段落的安排,以及将图表排版有适当的空格。

阅读全文 »
Coding Poet, Coding Science

Awk工具与编程语言

发表于 2014-06-16 | 更新于 2016-12-14 | 分类于 操作系统 , 实用工具 |

说明

刚接触unix相关的书籍的时候,里面有一章是专门介绍awk的使用的。但当时觉得它过于复杂,很难记住它是什么,能干什么。想来是因为我知识的储备还不够。Awk主要的思想就是,它的确是一种设计得非常精巧的编程语言,很好地满足了实际应用的同时,也能够让我们以软件工程,编译原理等理论性的东西欣赏它。因此,我就知道awk的使用不再是一件困难的事情。

awk基础

有些东西,理解它的过程,就好像是要进入一个豪华的庭院,要进入门内,非得绕过门前的屏风墙。不这样,就看不到里面的风景。

awk本身的语法是比较怪异的。然而外面的人看到的,往往是用awk写出来的程序,而非程序的规范。所以就不得要领。人们又常常抱着学习awk就直接是为了处理文本的功利目的,一旦不能一眼看出来它在处理文本上的直观,就放弃了。但是,绝大部分事情,是不能凭感官的。我们必须要有一种理论的指导。

阅读全文 »
1…678…11
Istyasna

Istyasna

GO FORTH now and create masterpieces of the publishing art!

55 日志
36 分类
189 标签
RSS
GitHub Aliyun
Creative Commons
Links
  • Homepage
  • Hainan University
  • Qi Qi
© 2016 - 2017 Istyasna
由 Hexo 强力驱动
主题 - NexT.Mist