Linux下通过Shell脚本自动配置IP地址
在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地址
3、系统上电自动执行
只需要在rc.local中增加脚本即可,如下图所示
以上就完成了根据槽位号自动配置板卡的IP地址