Diskless 无盘linux集群搭建

2023-06-12
3分钟阅读时长

搭建无盘 linux 系统需要3种服务(器),

NFS服务器作为文件服务器,存放系统内核等文件

TFTP服务器也作为文件服务器,存放引导文件

DHCP服务器用来分配机器的IP

对于高可用的生产环境,将3种服务器分别放置于不同的物理机/虚拟机/docker中,降低耦合度

一、centos安装DHCP服务器

1.安装服务

yum -y install dhcp

2.开启服务

systemctl enable dhcpd --now

3.配置

编辑 /etc/dhcp/dhcpd.conf

# dhcpd.conf
#
# Sample configuration file for ISC dhcpd
#

# option definitions common to all supported networks...
log-facility local7;
#  万兆内网
subnet 10.100.69.0 netmask 255.255.255.0 {          #指定为那个网段分配网络参数
   range 10.100.69.60 10.100.69.200;               #设置准备为客户端分配的IP地址范围
   option domain-name-servers 10.100.69.1;     #设置分配给客户端的DNS服务器地址
   option routers 10.100.69.1;                  #设置分配给客户端的网关地址。
   default-lease-time 315360000;                       # 地址租赁时间 600秒后失效
   max-lease-time 2147483647;
   next-server 10.100.69.51;                    # 下一个要访问的地址,就是tftp地址。
   filename "pxelinux.0";                         #要访问tftp上哪一个文件。
   host login01 {hardware ethernet 18:66:DA:59:C2:6D;fixed-address 10.100.69.60;}
   host node01 {hardware ethernet 74:a4:b5:00:e6:18;fixed-address 10.100.69.101;}
   host node02 {hardware ethernet 74:a4:b5:00:fb:1c;fixed-address 10.100.69.102;}
   host node03 {hardware ethernet 74:A4:B5:00:EA:2E;fixed-address 10.100.69.103;}
}

我们的网络有两个网段,万兆和千兆,配置按照自己实际情况编辑

4.防火墙

firewall-cmd --permanent --add-service=dhcp
firewall-cmd --reload

二、centos安装NFS服务器

服务端

1.安装服务

yum -y install nfs-utils nfs-utils-lib rpcbind 

2.创建共享目录

mkdir /public
chmod 777 /public

3.配置

/public 10.249.1.0/24(rw,sync,no_root_squash)

解释:将/public 目录共享给10.249.1.0 网段下的所有机器

参数含义: rw 表示设置目录可读写 sync 表示数据会同步写入到内存和硬盘中,相反 rsync 表示数据会先暂存于内存中,而非直接写入到硬盘中。 no_root_squash NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限 no_all_squash 不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都不会拥有匿名用户权限

4.及时生效

exportfs -r

5.配置防火墙

修改 /etc/sysconfig/nfs ,绑定下面的服务的端口

RQUOTAD_PORT=1001
LOCKD_TCPPORT=30001
LOCKD_UDPPORT=30002
MOUNTD_PORT=1002

将上面端口加入防火墙

firewall-cmd --zone=public --add-port=111/tcp --add-port=111/udp --add-port=2049/tcp --add-port=2049/udp --add-port=1001/tcp --add-port=1001/udp --add-port=1002/tcp --add-port=1002/udp --add-port=30001/tcp --add-port=30002/udp --permanent
firewall-cmd --reload

6.启动服务

systemctl start rpcbind
systemctl start nfs
service nfslock start

开机启动

systemctl enable rpcbind
systemctl enable nfs

客户端

1.安装服务

yum install nfs-utils -y

2.检查

[root@test ~]# showmount 10.249.1.23
Hosts on 10.249.1.23:

3.挂载

mount 10.249.1.23:/public /public

三、centos安装TFTP服务器

1.安装服务

yum -y install tftp-server  xinetd

2.配置

编辑 /etc/xinetd.d/tftp

protocol = udp                        # TFTP默认使用UDP协议
wait = no                             # no表示客户机可以多台一起连接,yes表示客户机只能一台一台连接
server_args = -s /var/lib/tftpboot    # 指定TFTP根目录(引导文件的存储路径)
disable = no                          # no表示开启TFTP服务

3.启动服务

systemctl start tftp
systemctl enable tftp
systemctl start xinetd
systemctl enable xinetd

4.配置防火墙

firewall-cmd --permanent --add-service=tftp
firewall-cmd --reload

四、构建系统盘

1.禁用selinux

编辑 /etc/sysconfig/selinux, 修改 SELINUX=disabled , 重启系统

2.设置环境变量

export NFSROOT=/home/nfsroot
mkdir ${NFSROOT}

3.安装基础环境

yum -y groupinstall Base --installroot=${NFSROOT} --releasever=/
yum -y  install kernel nfs-utils kernel-devel vim git tree make cmake gcc gcc-gfortran gcc-c++ python3 python3-pip patch net-tools  --installroot=${NFSROOT} --releasever=/

4.配置自动挂载

$NFSROOT/etc/fstab

none /tmp tmpfs defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0

5.配置hostname

$NFSROOT/etc/hosts

127.0.0.1 localhost
192.168.0.100 nfsserver

hostname ip 对应按照自己实际情况编辑

6.配置whereami

$NFSROOT/bin/whereami

#!/bin/bash
# finds node's hostname based on matching IP in /etc/hosts
PATH=/sbin:/bin:/usr/sbin:/usr/bin
IP=`ifconfig | egrep 'inet.*broadcast' \
| sed -e 's/.*inet \(.*\).*netmask.*/\1/'`
grep $IP /etc/hosts | /usr/bin/awk '{print $2}'

执行命令:

chmod +x ${NFSROOT}/bin/whereami

7.配置 rc.loca

$NFSROOT/etc/rc.local

#!/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
# set hostname
hostname `/bin/whereami`
touch /var/lock/subsys/local

执行命令:

chmod +x ${NFSROOT}/etc/rc.local

8.配置root用户

依次执行命令

chroot ${NFSROOT}
passwd root
exit

其中第二条命令输入密码后如果报错认证失败,那是因为2.1 的操作未做/未生效

9.创建 基于ram的引导内核

依次执行命令

echo 'add_dracutmodules+="nfs"' >> $NFSROOT/etc/dracut.conf
chroot $NFSROOT
dracut --no-hostonly --nolvmconf -m "nfs network base" --xz /boot/initramfs.pxe-$(uname -r) $(uname -r)
chmod ugo+r /boot/initramfs.pxe-$(uname -r)
exit

注意dracut生产pxe引导文件需要kernel一致,否则无法成功引导

五、PXE配置

1.准备 PXE 引导程序

yum -y install syslinux
cp /usr/share/syslinux/* /var/lib/tftpboot/

2.复制内核和系统文件

将$NFSROOT目录下的文件 通过rsync 命令(保留权限、用户信息、软连接等全部文件属性,cp无法做到)拷贝到nfs服务器下

rsync -av ${NFSROOT}/ root@nfsserver:/public/centos7

将引导文件和内核文件拷贝到 tftp服务器下 ,查看刚才生成的引导文件和内核

# cd ${NFSROOT}/boot && ls
config-3.10.0-1160.83.1.el7.x86_64         symvers-3.10.0-1160.83.1.el7.x86_64.gz
grub                                       System.map-3.10.0-1160.83.1.el7.x86_64
initramfs-3.10.0-1160.83.1.el7.x86_64.img  vmlinuz-3.10.0-1160.83.1.el7.x86_64
initramfs.pxe-3.10.0-1160.el7.x86_64
scp initramfs.pxe-3.10.0-1160.el7.x86_64 vmlinuz-3.10.0-1160.83.1.el7.x86_64 tftpserver:/var/lib/tftpboot

3.创建pxecfg

mkdir /var/lib/tftpboot/pxelinux.cfg  
# vim /var/lib/tftpboot/pxelinux.cfg/default   # 在pxelinux.cfg目录下创建default并编辑配置文件
# boot centos7 with tftp&nfs
default menu.c32
prompt 10
menu title CentOS diskless

ontimeout master
timeout 50

label master
  menu label master
  kernel vmlinuz-3.10.0-1160.90.1.el7.x86_64
  append netboot=nfs initrd=initramfs.pxe-3.10.0-1160.90.1.el7.x86_64 bond=bond0:eno1,eno2:mode=802.3ad,lacp_rate=1,miimon=100,xmit_hash_policy=layer2+3 ip=:::::bond0:dhcp  root=nfs:10.100.69.51:/home/master rw selinux=0  panic=60 ipv6.disable=1

label node
  menu label node
  kernel vmlinuz-3.10.0-1160.90.1.el7.x86_64
  append netboot=nfs initrd=initramfs.pxe-3.10.0-1160.90.1.el7.x86_64 bond=bond0:enp10s0f0,enp10s0f1:mode=802.3ad,lacp_rate=1,miimon=100,xmit_hash_policy=layer2+3 ip=:::::bond0:dhcp  root=nfs:10.100.69.51:/home/node rw selinux=0  panic=60 ipv6.disable=1

label memtest
  menu label memtest
  kernel memtest86+

重启TFTP服务

systemctl restart tftp