系统自动创建的网卡设备,在系统再次重启后,始终未能应用手动准备的配置文件,即使是从老配置复制的,所以就改用nmcli命令配置,而弃用原配置,这就需要手动配置好IP或在自动配置过程中检查IP配置是否正确。
如果有哪位仁兄有更简捷有效的方式,还望不吝赐教
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 |
#!/bin/bash ################################### # function RHEL9最小化安装后网卡名由ens*改为eth*,并配置好ipv4 # # 参考创建或使用示例: # touch /root/sh/ch_eth_name.sh; chmod 700 /root/sh/ch_eth_name.sh # 系统重启前:/root/sh/ch_eth_name.sh before # 系统重启后:/root/sh/ch_eth_name.sh after # Change History: # date author note # 2015/12/11 nieyf@yangfannie.com 原创,为RHEL7使用。原创地址:https://yangfannie.com/949.html # 2017/09/07 brook 改编 # 2023/06/29 brook 大改编为RHEL9可使用 # 其它备注: # 参考:https://www.cnblogs.com/stdin/p/15026175.html https://www.cnblogs.com/meizy/p/nmcli_connection_id.html https://blog.51cto.com/dayu/5522088 # 通过SSH远程修改RHEL9(Almalinux9或RockyLinux9等)的网卡名ens*为eth*(包括DEVICE和NAME等),通常需要确保网络自动恢复,而修改网络设备名(Device)是要修改内核启动参数的。 # 实践中发现修改内核启动参数后(添加net.ifnames=0 biosdevname=0),会自动创建以eth开头命名的网卡名,而事先无论是通过nmcli修改网络名称NAME还是手动修改”/etc/NetworkManager/system-connections/”中的配置,如果网络名和系统自动创建的不一样,均在系统Device变更并重启后,不被应用,(重启前直接修改为Wired connection 1?但也没有成功)。 # 根据观察,至少UUID变了,(重启前删除配置文件中的UUID和HWADDR?,实践也没有成功),这需要根据系统自动创建的NAME重新修改,所以我这儿偿试了系统重启后自动执行修改NAME等名称。 # 但折腾了一段时间,发现系统自动创建的网卡设备,在系统再次重启后,始终未能应用手动准备的配置文件,即使是从老配置复制的,所以就改用nmcli命令配置,而弃用原配置,这就需要手动配置好IP或在自动配置过程中检查IP配置是否正确。 # 如果有哪位仁兄有更简捷有效的方式,还望不吝赐教。 ################################### ############# ENV ################# # 脚本名称,临时文件或邮件中可能用到,避免同类脚本的变量的冲突,下面直接取脚本名 export project_name=`echo ${0##*/} | cut -d’.’ -f 1` # 工作目录,可能会产生临时文件 export work_dir=/root/sh # 临时文件目录 export tmp_dir=${work_dir}/tmp # 日志目录 export log_dir=${work_dir}/log # 数据目录 export var_dir=${work_dir}/var ############# 配置结束 ################## # 时间和环境变量,一般无需修改 export datetime=$(date +%Y%m%d–%H%M) export LANG=C #export LC_ALL=C export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin export parameter1=$1 export HOME=/root ############# PROC ################# # 记录开始时间 start_time=$(date +%s) echo “” echo “######” echo “`date +”%Y–%m–%d %H:%M:%S“` 运行开始” ### 函数 ### # 帮助信息 function help_msg() { echo –e “\033[41merror!!! 小心点,不要慌,现在出错了,请仔细查看下面的帮助信息:\033[0m RHEL9最小化安装后网卡名由ens*改为eth* HELP: parameter eg: before, after before 系统重启前用的参数,通常在RHEL9最小化安装后,没有额外网络(比如docker,vpn等)时执行。 after 系统重启后用的参数,通常在执行参数before之后,待系统重启后,执行该参数。 exec eg: sh $0 before # 系统重启前 sh $0 after # 系统重启后 \033[41merror!!! 小心点,不要慌,现在出错了,请仔细查看上面的帮助信息:\033[0m“ } cd $work_dir test –d $tmp_dir || mkdir –p $tmp_dir test –d $log_dir || mkdir –p $log_dir test –d $var_dir || mkdir –p $var_dir if [ “$parameter1” == “” ] || [ “$parameter1” == “help” ]; then help_msg echo “`date +”%Y–%m–%d %H:%M:%S“` error, exit.” exit elif [ “$parameter1” == “before” ]; then # 禁用网卡命名规则,重新配置grub配置并更新内核参数 i=`grep –c “net.ifnames=0 biosdevname=0” /etc/default/grub` if [ $i –eq 0 ];then sed –ri “/GRUB_CMDLINE_LINUX/s/(.*)\”/\1 net.ifnames=0 biosdevname=0\”/” /etc/default/grub grub2–mkconfig –o /boot/grub2/grub.cfg fi # 创建系统重启后需要执行的命令 systemctl enable rc–local > /dev/null 2>&1 chmod +x /etc/rc.d/rc.local i=`grep –c “^/bin/bash ${work_dir}/${project_name}.sh after >> ${log_dir}/${project_name}.log 2>&1” /etc/rc.d/rc.local` if [ $i –eq 0 ];then echo “没有发现系统重启后网卡改名脚本执行配置,添加配置” echo “/bin/bash ${work_dir}/${project_name}.sh after >> ${log_dir}/${project_name}.log 2>&1” >> /etc/rc.d/rc.local elif [ $i –eq 1 ];then echo “有发现系统重启后网卡改名脚本执行配置” else echo “error” fi # 系统重启后,不便查找旧配置名称,所以重启系统之前,先把配置备份,并检查自动获取的IP配置是否正确 new_net_num=–1 cat /dev/null > /${tmp_dir}/old_net_name.txt cat /proc/net/dev | grep ‘ens[0-9]*:’ | grep –v ‘lo’ | cut –d: –f1 | sort >> /${tmp_dir}/old_net_name.txt while read line do old_net_name=$line new_net_num=`expr $new_net_num + 1` Wired_conn_num=`expr $new_net_num + 1` # 移动原配置到新位置临时备份,(重启后也用不到,新网卡不会应用老配置,所以不用保留到原位置) mv –f /etc/NetworkManager/system–connections/${old_net_name}.nmconnection ${tmp_dir}/eth${new_net_num}.nmconnection # 获取原IP配置信息 ipv4_addr=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “address1” | awk –F‘=’ ‘{ print $2; }’ | awk –F‘,’ ‘{ print $1; }’` ipv4_gateway=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “address1” | awk –F‘=’ ‘{ print $2; }’ | awk –F‘,’ ‘{ print $2; }’` ipv4_method=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “method=” | awk –F‘=’ ‘{ print $2; }’` ipv4_dns=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “dns=” | awk –F‘[=]’ ‘{ print $2,$3,$4; }’ | sed ‘s/;/,/’ | sed –e ‘s/,[ ]*$//g’` if [ “${ipv4_addr}” == “” ];then ipv4_addr_conf=“”;else ipv4_addr_conf=ipv4.addr;fi if [ “${ipv4_gateway}” == “” ];then ipv4_gateway_conf=“”;else ipv4_gateway_conf=ipv4.gateway;fi if [ “${ipv4_dns}” == “” ];then ipv4_dns_conf=“”;else ipv4_dns_conf=ipv4.dns;fi echo –e “系统重启后将对eth${new_net_num}(原${old_net_name})执行: nmcli connection modify Wired\ connection\ ${Wired_conn_num} connection.id eth${new_net_num} nmcli connection modify eth${new_net_num} connection.interface–name eth${new_net_num} nmcli connection modify eth${new_net_num} ${ipv4_addr_conf} ${ipv4_addr} ${ipv4_gateway_conf} ${ipv4_gateway} ipv4.method ${ipv4_method} ${ipv4_dns_conf} ${ipv4_dns} nmcli con reload eth${new_net_num} nmcli con up eth${new_net_num} “ done < /${tmp_dir}/old_net_name.txt echo –e “\033[41m至少应该保证有网关的主网卡在系统重启并应用IP配置后,能够自动恢复网络,若检查可行,请立即重启系统,使用网络设备名称变更生效,其余IP配置可在之后手动纠正\033[0m” # init 6 elif [ “$parameter1” == “after” ]; then # 系统重启后,自动创建的网卡很可能是auto模式,应该尽快完成网络名称的变更和TCP/IP的预期配置 echo “” echo –e “变更前的网络配置:” nmcli con show ip a new_net_num=–1 while read line do old_net_name=$line new_net_num=`expr $new_net_num + 1` Wired_conn_num=`expr $new_net_num + 1` # 修改网络名 nmcli connection modify Wired\ connection\ ${Wired_conn_num} connection.id eth${new_net_num} nmcli connection modify eth${new_net_num} connection.interface–name eth${new_net_num} # 获取原IP配置信息 ipv4_addr=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “address1” | awk –F‘=’ ‘{ print $2; }’ | awk –F‘,’ ‘{ print $1; }’` ipv4_gateway=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “address1” | awk –F‘=’ ‘{ print $2; }’ | awk –F‘,’ ‘{ print $2; }’` ipv4_method=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “method=” | awk –F‘=’ ‘{ print $2; }’` ipv4_dns=`sed –n /ipv4/,/ipv6/{p} ${tmp_dir}/eth${new_net_num}.nmconnection | grep “dns=” | awk –F‘[=]’ ‘{ print $2,$3,$4; }’ | sed ‘s/;/,/’ | sed –e ‘s/,[ ]*$//g’` # 修改IP配置并应用 echo “对eth${new_net_num}(原${old_net_name})配置原IP” if [ “${ipv4_addr}” == “” ];then ipv4_addr_conf=“”;else ipv4_addr_conf=ipv4.addr;fi if [ “${ipv4_gateway}” == “” ];then ipv4_gateway_conf=“”;else ipv4_gateway_conf=ipv4.gateway;fi if [ “${ipv4_dns}” == “” ];then ipv4_dns_conf=“”;else ipv4_dns_conf=ipv4.dns;fi nmcli connection modify eth${new_net_num} ${ipv4_addr_conf} ${ipv4_addr} ${ipv4_gateway_conf} ${ipv4_gateway} ipv4.method ${ipv4_method} ${ipv4_dns_conf} ${ipv4_dns} nmcli con reload eth${new_net_num} nmcli con up eth${new_net_num} done < /${tmp_dir}/old_net_name.txt echo “” echo –e “\033[41m请立即检查网络名称变更是否成功,成功变更后,请注释或删除/etc/rc.d/rc.local文件中关于${project_name}的配置!\033[0m” echo –e “变更后的网络配置:” nmcli con show ip a i=`grep –c “/bin/bash ${work_dir}/${project_name}.sh after >> ${log_dir}/${project_name}.log 2>&1” /etc/rc.d/rc.local` if [ $i –eq 0 ];then # echo “没有发现系统重启后网卡改名脚本执行配置了” true elif [ $i –eq 1 ];then echo “有发现系统重启后网卡改名脚本执行配置,注释,如需再次执行,请取消注释” sed “/${project_name}.sh/s/^/#/” –i /etc/rc.d/rc.local else echo “error” fi fi echo “” stop_time=$(date +%s) echo “`date +”%Y–%m–%d %H:%M:%S“` 运行结束” echo “本次脚本运行了$((${stop_time}-${start_time}))秒。” |
发表回复