扩展Linux根目录分区

扩展用lvm方式创建的分区是非常简单的操作,但是因为之前没有操作过,简单的记录一下。

我不喜欢只有步骤的文章,但是因为是简单记录我又不想在这里写太多的理论知识,所以在看这篇文章之前,我希望你最好知道什么是lvm,也清楚lvm一些关键的词汇。

首先我们要知道,调整物理分区的大小是很麻烦的,所以调整虚拟分区的大小实际上是通过增加物理分区实现的。

之前用来做实验的虚拟机觉得不会用太多存储空间,就只添加了一个8G的硬盘,在根目录空间紧张的情况下,需要在虚拟机上扩容这块虚拟磁盘。新增的空间不能直接使用,需要到虚拟机中将根目录扩容才可以。

开机后可以看到,sda的空间已经扩大到20G了,需要通过添加分区将额外的12G利用起来。

简单的可以使用fdisk指令添加分区,创建新的主分区就可以了。选择分区编号和大小那里我都是选择默认的。

有些文章提到要使用t指令修改分区类型,我觉的其实是没有必要的,后面的pvcreate指令会替我们做这件事情的,但是我也是第一次做扩容的操作,所以还没有实验。

然后我们要使用这个分区创建pv, 使用命令 pvcreate [分区]。

现在将新创建的pv添加到vg中,使用命令vgextend [vg] [pv]。

最后扩展根目录的lv,使用命令 lvextend -l [pe 数量] [lv]。

扩展lv最好使用按照PE数量操作。

现在我用的/dev/centos/root这个虚拟分区的体积已经增大了,但是df -h查看一下。

根分区的大小并没有变化,因为这里显示的是文件系统的格式话后的分区大小,我们还需要扩展文件系统分区的大小。

最后的最后,使用xfs_growfs 指令扩展文件系统大小。

刚开始,我看的教程使用的是resize2fs指令,我试了几遍也没有用,然后我反应过来应该是文件系统不同,查询了一下,果然resize2fs指令是用来调整ext系列格式分区的。

 

Windows Server 2008 R2 创建 soft Raid5

很多人觉得用Windows创建软Raid的情况很少,但实际上Windows的软Raid软件已经很完善了,只是很少有人提,而且用Windows创建软Raid确实很简单,很方便。

当然我已经不推荐使用2008这种老版本的系统了,但是正好有客户询问,所以录制了一段简单的视频。

Node.js 学习笔记

因为之前对Node.js有一定的了解,所以很多基础已经有了,很多简单的入门的东西不会放在这里,更多的是一些自己原来的疑惑的梳理。

Node.js类的定义:

因为Node.js是弱类型的语言,相比其他弱类型语言,可以说是“将一切是对象”发挥到了极致,并且关键字里面也没有class,所以严格上说Node.js并没有定义类的机制。

Node.js 中的类都声明为函数,通过new 关键字创建对象。

function Hello() {
this.name = '';
this.set = function(name) {
this.name = name;
}
this.get = function() {
return this.name;
}
}

创建实例

hello = new Hello();

除了标准的定义方法我们还可以通过定义一个返回一个对象的函数实现。

我推荐用函数创建一个完整的对象并返回

function Hello() {
hello = {};
hello.set = function(name) {
this.name = name;
};
hello.get = function() {
return this.name;
};
return hello;
}

通过 hello = Hello(); 的方式实例化对象。

另外一种方式是利用闭包实现的

function Hello() {
var name = '';
function setName(newName) {
name = newName;
}
function getName() {
return name;
}
return {
set: setName,
get: getName,
};
}

同样通过 hello = Hello(); 的方式实例化对象。

第二种方式有一个问题就是 hello.name 并不是set函数和get函数操作的那个name,而且新定义hello的函数也没法直接操作set函数和get函数中操作的name,这就是闭包的特点,如果你想保护什么变量,当然可以采用这种方式,不过这种方式实在太繁琐了,而且新手很难理解。
其实Node.js定义类的方式类似与其他语言的构造函数,即使是静态语言,创建实例化对象都是通过执行构造函数实现的,只不过有些语言的构造函数是隐式声明和执行的罢了。
所以我们也可以在构造函数中加一些判断,以适应不同的情况。
比如:

function Hello(name='', way='') {
if (name!='') {
this.name = name;
this.greet = function () {
console.log('hello ' + name);
};
} else {
if (way == '') {
this.way = 'wave';
} else {
this.way = way;
}
this.greet = function () {
console.log(way + ' to everyone!');
};
}
}

参数传递顺序:

继上面的例子

function Hello(name='', way='') {
if (name!='') {
this.name = name;
this.greet = function () {
console.log('hello ' + name);
};
} else {
if (way == '') {
this.way = 'wave';
} else {
this.way = way;
}
this.greet = function () {
console.log(way + ' to everyone!');
};
}
}

如果我们示例化对象的时候使用

shakeman =new Hello(name=”, way=’shake’);

bowman = new Hello(way=’bow’, name=”);

结果一样不一样呢?

结果是不一样的,通过这个例子我发现Node.js并不是通过参数的左值进行确定值赋给谁,而是按照传参的顺序确定的。

前者定义的对象是

Hello { way: ‘shake’, greet: [Function] }

后者定义的对象是

Hello { name: ‘bow’, greet: [Function] }

用过python的人看到这里可能会觉得难受了。

双引号和单引号有没有区别:

几乎所有文档里都说单引号和双引号功能上没有区别,但是我在生成query语句的时候却发现并不相同。

比如

var query =’select * from test where name =”my name”‘.;

打印出的语句是

select * from test where name =”my name”。

var query =”select * from test where name =’my name'”;

打印出来却是

select * from test where name =\’my name\’

也就是说使用双引号,node会假设创建的字符串是原始字符串,并对需要转义的字符使用转义字符。

当然,这只是我测试的结果,我还没有找到证据证明我的这个观点。

restify API框架 学习笔记

终止处理链:

res.send(false)

返回错误:

res.send(err)

返回错误,错误码来自于:

err.statusCode

停止服务器:

next.ifError(err)

使用正则表达式设置路由:

server.get(/^\/([a-zA-Z0-9_\.~-]+)\/(.*)/, function(req, res, next) {

// params获取参数列表
  console.log(req.params[0]);
  console.log(req.params[1]);
  res.send(200);
  return next();
});

 

 

配置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 –permanent && 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/images/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添加到页面中了。