xcat软件简介
xCAT (Extreme Cloud Administration Toolkit)是一个开源的可扩展的高级集群管理和配置工具,允许使用者通过一个单点控制和管理一个集群系统。xCAT最先是为IBM xSeries系列Linux Cluster做的第三方软件。它在简化集群管理的同时,还使集群能够方便地实现快速扩展,从而提高了系统管理员的工作效率。
xCAT软件包基本上全部由一系列有用的perl脚本构成,所以使用者修改代码后不需要重新再编译和安装,而是可以很方便地根据自己的需求直接修改脚本来定制出自己需要的xCAT软件。
xCAT是基于客户机/服务器架构的应用程序,客户端和服务器端的通信主要是由管理节点上运行的xCAT daemon(xcatd)来控制的,可以说运行于管理节点上的xCAT daemon(xcatd)就是整个xCAT软件正常工作的心脏。当管理节点上的xCAT daemon(xcatd)接收到计算节点发送过来的用XML封装的的命令时,它将通过ACL(Access Control Lists)来判定发送者是否有权限执行这些命令。此外,xCAT daemon(xcatd)在安装配置计算节点和各个节点重新启动的时候还会收集各个节点发来的状态和资源信息。整个系统架构如下图所示:
xCAT管理节点(xCAT管理节点):
- 安装了xCAT软件的服务器,并用作在整个群集上执行系统管理的单点服务器。在此节点上,数据库配置为存储xCAT节点定义。启用网络服务(dhcp,tftp,http等)以在操作系统部署中响应。
服务节点:
一台或多台定义的“从”服务器在管理节点下运行,以帮助系统管理以减少使用单个管理节点时的负载(cpu,网络带宽)。在管理非常大的群集时,此概念是必需的。
计算节点:
计算节点是xCAT管理的目标服务器。
网络服务(dhcp,tftp,http等):
通过网络执行操作系统部署所需的各种网络服务。xCAT将自动启动并配置网络服务,而无需系统管理员的任何干预。
xCAT包含多种集群管理和部署功能,主要包括:批量安装OS、批量部署无盘系统、节点配置信息管理和同步、批量管理节点并行执行命令等。此文档中使用的主要功能是采用xCAT批量启动无盘系统,并且在无盘系统中进行节点硬盘镜像与恢复,通过此方法可以快速进行硬盘镜像恢复,部署操作系统。
xcat安装测试
-
本次下载得版本为2.15.1,软件包分别为xcat-core-2.15.1-linux.tar.bz2,xcat-dep-2.15.1-linux.tar.bz2
提取xcat–core
1
tar -jvxf xcat-core-2.15.1-linux.tar.bz2
通过
mklocalrepo.sh
在xcat-core
目录中运行脚本,为xcat-core配置本地存储库:1
2cd xcat-core/
./mklocalrepo.sh提取xcat-dep
1
2cd xcat-dep/rh7/x86_64/
./mklocalrepo.sh安装xcat
1
yum install xCAT
将配置文件添加到bash环境
1
source /etc/profile.d/xcat.sh
检查xcat版本
1
lsxcatd -a
通过site表查看数据库是否已初始化
1
2
3
4
5
6
7
8
9
10
11
12tabdump site
#key,value,comments,disable
"blademaxp","64",,
"fsptimeout","0",,
"installdir","/install",,
"ipmimaxp","64",,
"ipmiretries","3",,
"ipmitimeout","2",,
"consoleondemand","no",,
"master","10.0.50.204",,
"forwarders","10.0.100.235,10.0.100.236",,
"nameservers","10.0.50.204",,启动和停止
安装后xcat会自动启动可通过如下命令控制启停
1
2systemctl start xcatd
systemctl stop xcatdxcat管理节点配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
321.配置 networks table,删除不需要的网口,只保留管理网接口供dhcp使用
tabedit networks
2.配置passwd table,passwd table中记录的是无盘启动节点的用户名和密码
tabedit passwd
#key,username,password,cryptmethod,authdomain,comments,disable
"system","root","111111",,,,
3.配置DNS服务
hostname head4.sugon.com
hostnamectl set-hostname head4.sugon.com
vim /etc/resolv.conf
search sugon.com
nameserver x.x.x.x
vim /etc/hosts
10.10.10.46 head4 head4.sugon.com
chdef -t site domain="sugon.com"
chdef -t site forwarders="x.x.x.x" ##没有可不配置
chdef -t site master="10.0.50.204"
chdef -t site nameservers="10.0.50.204"
makedns -n ##初始化DNS
nslookup 10.0.50.204 ##测试DNS服务
4.配置DHCP服务
chdef -t site dhcpinterfaces=eno1
makedhcp -n
systemctl status dhcpd.services ##测试DHCP服务
xcat进行无盘系统的安装
在选择或创建一个安装镜像
XCAT使用copycds命令创建一个镜像并用于节点的安装。copycds将拷贝DVDs/ISOs中的内容到目的文件夹,默认会创建几种不同启动方式的镜像。创建命令如下:
1
2
3
4copycds <path>/<specific-distro>.iso
copycds CentOS-7-x86_64-DVD-1810.iso
Copying media to /install/centos7.6/x86_64
Media copy operation successful列出创建的镜像列表
1
2
3
4
5
6
7
8
9
10lsdef -t osimage
centos7.6-x86_64-install-compute (osimage) #disk安装镜像
centos7.6-x86_64-netboot-compute (osimage) #diskless安装镜像
centos7.6-x86_64-statelite-compute (osimage) #nfs无盘启动镜像
tabdump osimage
#imagename,groups,profile,imagetype,description,provmethod,rootfstype,osdistroname,osupdatename,cfmdir,osname,osvers,osarch,synclists,postscripts,postbootscripts,serverrole,isdeletable,kitcomponents,environvar,comments,disable
"centos7.6-x86_64-install-compute",,"compute","linux",,"install",,"centos7.6-x86_64",,,"Linux","centos7.6","x86_64",,,,,,,,,
"centos7.6-x86_64-netboot-compute",,"compute","linux",,"netboot",,"centos7.6-x86_64",,,"Linux","centos7.6","x86_64",,,,,,,,,
"centos7.6-x86_64-statelite-compute",,"compute","linux",,"statelite",,"centos7.6-x86_64",,,"Linux","centos7.6","x86_64",,,,,,,,,其中,netboot-compute是默认的无盘镜像,运行genimage命令生成无盘启动镜像
1
genimage centos7.6-x86_64-netboot-compute
无盘镜像保存在/install/netboot/centos7.6/x86_64/compute目录下,genimage命令后,会在该文件夹下生成initrd-stateless.gz initrd-statelite.gz kernel rootimg文件。其中kernel和initrd文件是启动的kernel和init文件。整个os包含在rootimg文件夹。packimage命令会将rootimg打包为cpio格式,启动无盘的实际传输的是rootimg.cpio.gz文件。
在无盘镜像安装rpm软件包
1.编辑默认安装软件包文件
1
vim /opt/xcat/share/xcat/netboot/rh/compute.pkglist
将更多软件包添加到这个文件,重新运行命令构建镜像
1
genimage centos7.6-x86_64-netboot-compute
chroot到镜像内进行安装:
挂载镜像
1
2
3
4
5
6
7
8
9
10
11
12mount CentOS-7-x86_64-DVD-1810.iso /install/netboot/centos7.6/x86_64/compute/rootimg/mnt/
##配置本地yum源
vim /etc/yum.repos.d/local.repo
[local]
name=Local repo
baseurl=file///mnt
gpgcheck=0
enabled=1
##若系统盘里没有的软件包例如epel软件源
yum install --downloadonly --downloaddir=/root partclone #下载到本地
rpm -iv partclone-0.3.12-1.el7.x86_64 #安装软件包
rpm -iv ntfs-3g-2017.3.23-11.el7.x86_64.rpm打包镜像
1
2
3
4
5packimage centos7.6-x86_64-netboot-compute #打包镜像
Packing contents of /install/netboot/centos7.6/x86_64/compute/rootimg
archive method:cpio
compress method:gzip无盘系统进行镜像提取和恢复
将节点硬盘OS镜像与恢复基本包括2类方法:
1) 不识别硬盘文件系统,直接整体拷贝。可以采用dd直接复制整个硬盘,这种方法需要拷贝硬盘所有的块,速度很慢。
2) 识别硬盘文件系统的每一个分区,只镜像和恢复有数据的部分。能够进行硬盘分区镜像的工具有很多,如:FSArchiver、partclone、sysimage等工具。不同的工具可以识别不同的文件系统。在本文种采用partclone工具,partclone能识别大部分文件系统,比较通用。
3) 大部分分区克隆和镜像工具只能对文件系统分区进行操作,无法复制MBR,恢复硬盘分区后可以挂载各个分区,并重装grub2使硬盘可以启动。
本集群comput1为镜像提取节点,comput2~40为镜像恢复节点
启动无盘节点
可以通过ipmitool配置节点从网络启动,启动无盘系统。
注意:无盘系统只能通过Legancy方式启动,不能通过UEFI启动!需要确保BIOS配置为UEFI and Legancy模式或Legancy 模式。UEFI only无法启动无盘系统!
1
2
3ipmitool -H 10.10.20.1 -U admin -P admin chassis bootdev pxe
ipmitool -H 10.10.20.1 -U admin -P admin power off
ipmitool -H 10.10.20.1 -U admin -P admin power on网络启动节点,可以正常进入无盘系统
制作无盘启动镜像
在comput1进行镜像的提取
parted -l /dev/sda
legancy引导的mbr分区,格式如下
注意:
legancy分区的Partition Table为msdos
GPT分区的分区表为gpt
BIOS采用Legancy启动方式,硬盘可以为msdos或gpt硬盘(推荐使用msdos,legancy采用gpt 启动需要做特殊处理)。
BIOS采用UEFI启动方式,硬盘必须采用gpt方式。UEFI启动需要有一个uefi分区,分区为fat32 文件系统。
克隆系统原有分区为安装标准镜像
克隆分区前,先检测文件系统,以免克隆时报错,执行
fsck /dev/sda1 fsck /dev/sda2
然后开始克隆
partclone.ext4 -d -c -s /dev/sda1 -o /root/sda1.img
partclone.ext4 -d -c -s /dev/sda2 -o /dev/sda2
交换分区的处理
交换分区swap不需要克隆,但在克隆上面分区前,需要修改xcat-A系统中/etc/fstab文件中swap行,将此行的UUID号改为绝对路径/dev/nvme0n1p4(镜像恢复时,swap的UUID和所克隆的镜像UUID不一致)。对于UEFI引导的GPT分区,有一个/boot/efi分区,文件系统为fat32,用partclone.vfat克隆。镜像提取完成后,把/root/nvme0n1p1-3.img复制到xcat-server服务节点,方便后续节点镜像恢复。
1
2
3
4
5mount /dev/sda1 /mnt
vim /etc/fstab
UUID=bccf823d-0f65-4806-8861-537dbf3b6423 / ext4 defaults 1 1
UUID=8ecce756-26ad-46fd-9ecb-cd4cb4ab91d1 /boot ext4 defaults 1 2
/dev/sda3 swap swap defaults 0 0交换分区swap不需要克隆,但在克隆上面分区前,需要修改comput1系统中/etc/fstab文件中swap行,将此行的UUID号改为绝对路径/dev/sda3(镜像恢复时,swap的UUID和所克隆的镜像UUID不一致)。对于UEFI引导的GPT分区,有一个/boot/efi分区,文件系统为fat32,用partclone.vfat克隆。镜像提取完成后,把/root/sda3.img复制到head4服务节点,方便后续节点镜像恢复。
镜像恢复到comput2-40节点
利用无盘方式启动comput2-40节点,进入无盘系统后,可以查看硬盘分区信息:
parted -l /dev/sda
将提取的镜像sda1.img sda2.img从comput1复制到无盘后的comout2-40节点
1
2mksquashfs sda* centos7.4_comput1_20200618.fs ##可以用该命令将备份的img镜像文件进行进一步压缩
mount centos7.4_comput1_20200618.fs /media/ ###将文件进行挂载读取为了防止之前的硬盘上有文件系统,可以用parted工具将分区删除后重新对硬盘进行分区,再格式化。分区大小和文件系统可以参考镜像节点comput1,格式化分区
1
2
3parted -s /dev/sda rm 1
parted -s /dev/sda rm 2
parted -s /dev/sda rm 3msdos引导的分区命令(每个分区都要指定为主分区)
1
2
3
4
5
6
7parted -s /dev/sda mklabel msdos
parted -s /dev/sda mkpart primary ext4 1049KB 525MB
parted -s /dev/sda mkpart primary ext4 525MB 283GB
parted -s /dev/sda mkpart primary linux-swap 283GB 300GB
mkfs.ext4 /dev/sda1 #格式化分区
mkfs.ext4 /dev/sda2
mkswap /dev/sda3uefi引导的gpt分区
1
2
3
4
5
6
7
8
9
10parted -s /dev/sda set 1 boot on ##设置从efi分区引导
parted -s /dev/sda mklabel gpt
parted -s /dev/sda mkpart fat32 1049kB 1075MB
parted -s /dev/sda mkpart ext4 1075MB 3222MB
parted -s /dev/sda mkpart ext4 3222MB 239GB
parted -s /dev/sda mkpart linux-swap 239GB 256GB
mkfs.vfat /dev/sda1 #格式化分区
mkfs.ext4 /dev/sda2
mkfs.ext4 /dev/sda3
mkswap /dev/sda4恢复文件系统
格式化好各个分区后,采用partclone工具将镜像恢复到分区:
msdos格式的分区恢复
1
2
3
4
5fsck /dev/sda1 ##检查分区是否完好
fsck /dev/sda2
fsck /dev/sda3
partclone.ext4 -d -r -s /media/sda1.img -o /dev/sda1 ##从备份文件恢复分区系统
partclone.ext4 -d -r -s /media/sda2.img -o /dev/sda2uefi引导的gpt格式的分区恢复
1
2
3partclone.vfat -d -r -s /root/nvme0n1p1.img -o /dev/sda1
partclone.ext4 -d -r -s /root/nvme0n1p2.img -o /dev/sda2
partclone.ext4 -d -r -s /root/nvme0n1p3.img -o /dev/sda3针对bios legancy启动的mbr分区,需进行如下操作,恢复完分区文件系统后,将各个分区挂载到/mnt目录下,然后chroot,重装grub2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56mount /dev/sda2 /mnt
mount /dev/sda1 /mnt/boot
mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys
chroot /mnt grub2-mkconfig -o /boot/grub2/grub.cfg
chroot /mnt grub2-install /dev/sda
###配置网卡地址
eth0_mac=`ip addr show enp5s0f0 | grep link|head -n 1|awk '{print $2}'`
name=`cat $IPLIST |awk '($2=="'$eth0_mac'") {print $1}'`
eth0_ip=`cat $IPLIST |awk '($1=="'$name'") {print $3}'`
ib0_ip=`cat $IPLIST |awk '($1=="'$name'") {print $4}'`
SET_ETH0_IP()
{
cd /mnt/etc/sysconfig/network-scripts
cat > ifcfg-enp5s0f0 << END
TYPE=Ethernet
BOOTPROTO=static
NAME=enp5s0f0
DEVICE=enp5s0f0
ONBOOT=yes
IPADDR=$eth0_ip
NETMASK=255.255.0.0
END
}
SET_IB0_IP()
{
cd /mnt/etc/sysconfig/network-scripts
cat > ifcfg-ib0 << END
DEVICE=ib0
BOOTPROTO=static
TYPE=Infiniband
NM_CONTROLLED=no
ONBOOT=yes
IPADDR=$ib0_ip
NETMASK=255.255.0.0
END
}
SET_HOSTNAME()
{
echo ${name} > /mnt/etc/hostname
hostname ${name}
sleep 2;
}
SET_HOSTNAME
SET_ETH0_IP
SET_IB0_IP
echo "Install system Centos 7.4 successfully"
sleep 5
echo -e "\033[1;32mThe end time is `date`\033[0m"
rebootmurder p2p 下载
Murder是Twitter的开源项目,适合大文件的分发。murder是基于BitTornado的p2p传输软件,下图是集中式分发和分布式分发的特点
上图为集中式和分布式murder架构对比,集中式的系统需要所有的服务器要轮流排队到同一台服务器上进行文件下载传输,很受网络带宽限制,而分布式murder p2p文件传输,则利用 p2p 的特点让所有的节点都可以协助进行文件传输。整体架构图如图所示:
整个Murder由三个组件构成:
1、Tracker
它是运行在一台服务器上的单个服务,用来根据哪些torrent文件正在被分发,以及管理和维护Peer节点的信息和状态。2、Seeder
存放需要向其他主机分发的文件的服务器。Seeder将要分发的真实文件制作成torrent,这个torrent文件很小,只存放关于真实文件的基本Hash信息,torrent文件需要先分发到要下载文件的服务器(peer)上。3、Peer
就是要接收文件的服务器,他们之间可以互相传输文件。Murder的使用示例
我这里有4台服务器,角色分别如下:
tracker 192.168.1.220
seeder 192.168.1.220
peers 192.168.1.222、192.168.1.228、192.168.1.229
Tracker和Seeder在同一服务器上。
1. 下载和部署Murder
从https://github.com/lg/murder下载zip包,并解压到/opt目录下;
在所有的服务器(Tracker、Seeder、Peers)上,将Murder部署在/opt目录下,部署后的目录为:/opt/murder-master
2. 启动Tracker服务
在Tracker服务器上执行:
cd /opt/murder-master/dist
nohup python murder_tracker.py –port 8998 –dfile data –logfile urder_tracker.log &
–port tracker监听的端口,默认是8998
–dfile 存储近期下载信息的文件
–logfile tracker日志文件,默认是标准输出
###### 3. 在Seeder服务器上准备好要分发的文件,并创建种子
**在Seeder服务器上,要分发的文件:**
*[liuxiaowen@test04v ~/lxw]$ du -h /home/liuxiaowen/lxw/test.tar.gz*
*3.1G /home/liuxiaowen/lxw/test.tar.gz*
**制作种子:**
1
2
cd /opt/murder-master/dist/
python murder_make_torrent.py /home/liuxiaowen/lxw/test.tar.gz 192.168.1.220:8998 /tmp/test.tar.gz.torrent
其中,第一个参数为要分发的文件;第二个参数为Tracker服务器的地址和端口;第三个参数为torrent文件路径。
**将种子文件分发至Peers:**
用Ansible将很小的torrent文件,分发至所有peers节点,关于Ansible的使用,请自行搜索,你也可以使用SCP。
1
ansible myhosts -m synchronize -a “src=/tmp/test.tar.gz.torrent dest=/tmp/”
**启动Seeder服务:**
1
2
cd /opt/murder-master/dist/*
python murder_client.py seed /tmp/test.tar.gz.torrent /home/liuxiaowen/lxw/test.tar.gz 192.168.1.220
最后一个IP是Seeder服务器本机IP。
4. ###### **在peer节点执行下载**
单个节点下载:在peer节点上,
1
2
cd /opt/murder-master/dist/
python murder_client.py peer /tmp/test.tar.gz.torrent /tmp/test.tar.gz 192.168.1.220
单台当然不能体现Murder的优势了,使用Ansible命令,在多台Peer节点上同时下载:
1
ansible myhosts -m shell -a “python /opt/murder-master/dist/murder_client.py peer /tmp/test.tar.gz.torrent /tmp/test.tar.gz 192.168.1.220″