Linux下通过Shell脚本自动配置IP地址

时间:2024-04-05 08:47:23

在X86平台中,应系统要求,每块板卡的IP地址需要根据槽位号自动配置。这里提供一个示例。

1、获取槽位号

目前板子上槽位号是通过bmc进行获取,cpu通过ipmitool工具得知自己的槽位号,可以创建一个应用程序,代码如下:

/*
 ============================================================================
 Name        : slot_test.c
 Author      : felven
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#include <sys/time.h>
#include <fcntl.h>
#include <unistd.h>

int gslot=0;
int gchasis=0;
int grack=0;

int getSlot()
{
	FILE *fstream=NULL;
	char buff[1024];
	int errno=0;
	int temp1,temp2;
	memset(buff,0,sizeof(buff));
	if(NULL==(fstream=popen("ipmitool raw 6 0x2a","r")))
	{
		fprintf(stderr,"execute command failed:%s",strerror(errno));
		return -1;
	}
	while(NULL!=fgets(buff,sizeof(buff),fstream))
	{
		sscanf(buff, " %x %x", &temp1,&temp2);
	//	printf("temp1 is %d temp2 is %d %d\n",temp1,temp2,(~temp2)&0x1F);
	}
	gslot=(~temp2)&0x1F;
	gchasis=(~temp1)&0x7F;
	return 1;
}

int main(void) {
	int res=getSlot();
	printf("%d %d %d\n",gslot,gchasis,grack);
	return 1;
}

最后打印的glost gchasis grack分别为槽位号,插箱号,机柜号。

2、使用shell脚本进行配置

由于板子上网卡数目固定,所以名称也知道了,最简单的办法就是根据名称遍历进行IP地址的配置,shell脚本如下

#!/bin/bash

vpx_eth_name=("enp2s0f0" "enp2s0f1" "enp7s0" "enp9s0f0" "enp9s0f1" "enp9s0f2" "enp9s0f3")

net_vpx_autocfg()
{
	echo "vpx_net_autocfg"
	vpx_get_eth_name=(${vpx_eth_name[*]})
	cd /opt/pet
	get_info=`./slot_test`

	get_slotid=$(echo $get_info | cut -d ' ' -f 1)
	get_chassisid=$(echo $get_info | cut -d ' ' -f 2)
	get_rackid=$(echo $get_info | cut -d ' ' -f 3)

	sleep 1
	printf 'slot is %d\n' $get_slotid
	printf 'chasis is %d\n' $get_chassisid
	printf 'rack is %d\n' $get_rackid

	hostnamectl set-hostname node${get_slotid}

    cd /etc/sysconfig/network-scripts/

	get_ip4=$(expr $get_slotid \* 10 + $get_chassisid)
	ifdown  ifcfg-${vpx_get_eth_name[0]}
	sed -i '/IPADDR=/d'  ifcfg-${vpx_get_eth_name[0]}
	echo "IPADDR=192.168.80.$get_ip4" >>  ifcfg-${vpx_get_eth_name[0]}
	ifup   ifcfg-${vpx_get_eth_name[0]}

	ifdown   ifcfg-${vpx_get_eth_name[1]}
	sed -i '/IPADDR=/d'  ifcfg-${vpx_get_eth_name[1]}
	echo "IPADDR=192.168.90.$get_ip4" >>  ifcfg-${vpx_get_eth_name[1]}
	ifup   ifcfg-${vpx_get_eth_name[1]}

	ifdown   ifcfg-${vpx_get_eth_name[2]}
	sed -i '/IPADDR=/d'  ifcfg-${vpx_get_eth_name[2]}
	echo "IPADDR=192.168.100.$get_ip4" >>  ifcfg-${vpx_get_eth_name[2]}
	ifup   ifcfg-${vpx_get_eth_name[2]}

	ifdown   ifcfg-${vpx_get_eth_name[3]}
	sed -i '/IPADDR=/d'  ifcfg-${vpx_get_eth_name[3]}
	echo "IPADDR=192.168.3.$get_ip4" >>  ifcfg-${vpx_get_eth_name[3]}
	ifup   ifcfg-${vpx_get_eth_name[3]}

	ifdown   ifcfg-${vpx_get_eth_name[4]}
	sed -i '/IPADDR=/d'  ifcfg-${vpx_get_eth_name[4]}
	echo "IPADDR=192.168.4.$get_ip4" >>  ifcfg-${vpx_get_eth_name[4]}
	ifup  ifcfg-${vpx_get_eth_name[4]}

	ifdown  ifcfg-${vpx_get_eth_name[5]}
	sed -i '/IPADDR=/d' ifcfg-${vpx_get_eth_name[5]}
	echo "IPADDR=192.168.5.$get_ip4" >> ifcfg-${vpx_get_eth_name[5]}
	ifup  ifcfg-${vpx_get_eth_name[5]}

	ifdown  ifcfg-${vpx_get_eth_name[6]}
	sed -i '/IPADDR=/d' ifcfg-${vpx_get_eth_name[6]}
	echo "IPADDR=192.168.6.$get_ip4" >> ifcfg-${vpx_get_eth_name[6]}
	ifup  ifcfg-${vpx_get_eth_name[6]}

	sleep 1
	systemctl stop network.service 
	sleep 1
	systemctl start network.service 
}

net_vpx_autocfg


这里就配置了7个网卡的IP地址

Linux下通过Shell脚本自动配置IP地址

3、系统上电自动执行

只需要在rc.local中增加脚本即可,如下图所示

Linux下通过Shell脚本自动配置IP地址

以上就完成了根据槽位号自动配置板卡的IP地址