一些shell脚本,记录

~以下脚本与linux内核编译相关
一、为Makefile文件添加扩展版本号同时删除生成"*.bz2"文件的代码

#!/bin/bash
#本脚用途
#1.为Makefile文件添加扩展版本号,例:clemm -test
#2.使用“make binrpm-pkg”生成rpm包时禁止产生/boot/*.bz2文件
set -e		#出错则退出脚本
mkfilename="Makefile"   #目标文件
keyv="EXTRAVERSION ="   #扩展版本号关键字

nline=$(cat -n "$mkfilename" | grep "$keyv" | head -n 1)	#获取$keyv所在行字符串
nlinenum=$(echo $nline | awk '{print $1}')	#获取$keyv所在行数
nline=$(echo $nline | awk 'sub($1,"")' | sed  -e 's/^\s*//' -e 's/\s*$//')	
sedcom=$nline$1

sed -i -e "$nlinenum s/$nline/$sedcom/" $mkfilename
#删除用于生成bz2文件的命令,在 scripts/package/mkspec 中
mkspecfile="./scripts/package/mkspec"
keya="bzip2 -9 --keep vmlinux"
keyb="mv vmlinux.bz2"

sed -i -e "/$keya/d" $mkspecfile
sed -i -e "/$keyb/d" $mkspecfile
exit 0 

二、从linux的git仓库中导出指定内核
本脚本需要两个参数,第一个为版本号或者40位的commit-id,第二个参数为输出文件名,可选参数,如果第一个参数为版本号,则输出文件为“linux-版本号.tar.gz”;如果是commid-id,则输出文件为“commit-id.tar.gz”。仅支持“tar.gz”文件
脚本如下:

#!/bin/bash

#导出指定版本的linux
#第一个参数版本号或者commit-id,第二个参数输出文件名称,默认会之追加"tar.gz"后缀
#例:export-linux 5.4.1
#或者commit-id

#set -x
ECHO_RED_COLOR='\E[1;31m'  #红
ECHO_GREEN_COLOR='\E[1;32m' #绿
ECHO_YELOW_COLOR='\E[1;33m' #黄
ECHO_BLUE_COLOR='\E[1;34m'  #蓝
ECHO_COLOR_RES='\E[0m'

TMP=$1
OUTFILE=$2

if [ $# -lt 1 ]; then
	echo "There can only be one parameter."
	echo "export-linux [version number]"
else
	#如果参数中有“.”,说明是版本号,如果是一个40位的字符串,说明是commit-id
	echo $TMP | grep -P '[0-9]\.[0-9]' > /dev/null
	par1_ver=$?
	echo $TMP | grep -P '[\w]{40}' > /dev/null
	par1_id=$?
	set -e
	#如果$?等于0,说明是版本号
	if [ $par1_ver -eq 0 ]; then
		set +e
		linux_ver_line=$(git log --pretty=oneline -1 v$TMP)
		#echo $linux_ver_line
		if [ $? -ne 0 ]; then	#如果不是0,说明未找到
			echo "Please wait..."
			linux_ver_line=$(git log --pretty=oneline | grep "Linux $TMP" -m 1)
		fi
		if [ $? -ne 0 ]; then
			echo "Not found linux "
			exit 1
		fi
		linux_ver="linux "$TMP
		#echo $linux_ver
		#截取commit id
		commit_id=${linux_ver_line:0:40}
		#询问是否导出
		set -e
	elif [ $par1_id -eq 0 ]; then
		#确定为commit-id
		commit_id=$TMP
		linux_ver=$TMP
		yn='y'
	elif [ $TMP = "now" ]; then
		#当前第一个log
		commit_id=$(git log --pretty=oneline -1)
		commit_id=${commit_id:0:40}
		linux_ver=$commit_id
		yn='y'
	else
		#参数格式有问题
		echo "参数错误,仅限版本号或者commit-id"
		exit 2
	fi
	echo "commit id= "$commit_id
	echo -n -e "Find ${ECHO_RED_COLOR}'${linux_ver}'${ECHO_COLOR_RES},do you want to get this version?[y/N]"
	read yn
	case $yn in
		[yY])
			if [ -z "$OUTFILE" ]; then
				#如果OUTFILE不存在,则重新定义OUTFILE
				OUTFILE=${linux_ver// /-}.tar.gz
			fi
			echo "Code file: ${OUTFILE}" 
			echo "Generating code package..."
			set +e
			git archive --format tar.gz --output  "${OUTFILE}" $commit_id
			if [ $? -ne 0 ]; then
				echo "导出失败"
				rm ${OUTFILE}
				exit 3
			fi
			set -e
			du -sh $OUTFILE
			;;
	esac
fi

~以下脚本与linux内核管理相关
三、设置centos8开机默认的内核
centos8使用grub2来管理引导,“grub2-set-default”就是用来设置开机启动项的,但是参数为内核在grub2.cfg中的序号或者全名,使用起来比较麻烦,这个脚本会读取" /boot/loader/entries/"文件夹下的内核配置文件(每一个配置文件对应了一个内核,因此只要使用配置文件的名称就可以作为“grub2-set-default”的参数)。效果如下,内核名前放了一个序号,同时当前使用的内核会用红色字体显示,这里看不出来,只要输入序号,就可以修改开机默认的内核。

	0---d056c7f8bbc64ac5b28c721b928b0f7b-0-rescue
	1---d056c7f8bbc64ac5b28c721b928b0f7b-5.4.0.x86_64
	2---d056c7f8bbc64ac5b28c721b928b0f7b-5.6.0-server
	3---d056c7f8bbc64ac5b28c721b928b0f7b-5.9.0-release
选择需要开机默认内核序号:

脚本如下:

#!/bin/bash
#本文件用来设置centos的开机默认内核

ECHO_RED_COLOR='\E[1;31m'  #红
ECHO_GREEN_COLOR='\E[1;32m' #绿
ECHO_YELOW_COLOR='\E[1;33m' #黄
ECHO_BLUE_COLOR='\E[1;34m'  #蓝
ECHO_COLOR_RES='\E[0m'

#/boot/loader/entries/ 包含了可使用的内核配置文件,读取该目录文件名
kernel_list=(`ls /boot/loader/entries/ | awk 'match($0,/(.+)\.conf/,a){print a[1]}' `)
cur_kernel=(`grub2-editenv list | grep saved_entry | awk 'match($0,/saved_entry=(.+)/,curker){print curker[1]}'`)
count=0
for i in "${kernel_list[@]}"
do
	if [ ${i} = $cur_kernel ]; then
		echo -e " ${ECHO_RED_COLOR}\t"$count"---"${i}"${ECHO_COLOR_RES}"
	else
		echo -e "\t"$count"---"${i}
	fi
	((count+=1))
done

read -p "选择需要开机默认内核序号: " -t 30 kernel_check
if [ ! $kernel_check ]; then
	exit
fi

echo $kernel_check | grep -E "[^0-9]" >> /dev/null
if (( $? != 0 )) && (( $kernel_check >= $count )); then
    echo "输入有效序号!"
    exit
fi

echo -n -e "是否设置 ${ECHO_RED_COLOR}'${kernel_list[kernel_check]}'${ECHO_COLOR_RES} 为默认开机启动内核(y|N):"
read -t 30 yn
case $yn in
	[yY])
		#echo ${kernel_list[kernel_check]}
		grub2-set-default ${kernel_list[kernel_check]}
		if (( $? != 0 )); then
			echo "设置失败"
		else
			echo "设置成功"
		fi
esac

四、删除指定内核
此脚本目前只能删除由rpm或者yum安装的内核,其他方法如编译安装“make install”之类的可以手动删除,假设内核名称为“5.4.10.x86_64”,那么你需要删除以下文件或者文件夹
/boot/vmlinuz-5.4.10.x86_64
/boot/System.map-5.4.10.x86_64
/boot/initramfs-5.4.10.x86_64.img
/boot/config-5.4.10.x86_64
/boot/loader/entries/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-5.4.10.x86_64.conf
/lib/modules/5.4.10.x86_64
另外,如果要删除的是当前运行的内核,要注意”/boot/vmlinuz“、”/boot/System.map“,这两个文件是两个软连接,指开机默认的内核,删除内核前要先修改链接到其他内核上。还有/boot/efi/目录下的某个目录中有"grubenv"文件,此文件的“saved_entry”项用来控制开机默认的内核名。删除内核要慎重,否则会造成无法开机的情况。
个人建议centos安装内核最好使用rpm包,这样管理起来方便一点,如果你要自己编译内核,可以使用"make binrpm-pkg",会在用户根目录rpmbuild/RPMS/x86_64文件夹中生成内核rpm包。
脚本效果:

	0---kernel-5.6.0_server-1.x86_64
	1---kernel-5.4.65_mm_patch-2.x86_64
	2---kernel-devel-5.9.0_release-1.x86_64
	3---kernel-ml-devel-5.8.11-1.el8.elrepo.x86_64
	4---kernel-5.9.0_release-1.x86_64
	5---kernel-headers-5.9.0_release-1.x86_64
选择需要移除的内核序号: 

脚本:

#!/bin/bash

ECHO_RED_COLOR='\E[1;31m'  #红
ECHO_GREEN_COLOR='\E[1;32m' #绿
ECHO_YELOW_COLOR='\E[1;33m' #黄
ECHO_BLUE_COLOR='\E[1;34m'  #蓝
ECHO_COLOR_RES='\E[0m'

kernel_list=(`rpm -qa | grep "kernel" | grep -v "cj8\." | tr ' ' ' '`)
count=0
for i in ${kernel_list[@]}
do
    echo -e "\t"$count"---"${i}
    ((count=count+1))
done
read  -p "选择需要移除的内核序号: " -t 30 kernel_i
if [ ! $kernel_i ]; then 
    exit
fi
echo $kernel_i | grep -E "[^0-9]" >> /dev/null
if (( $? != 0 )) && (( $kernel_i >= $count )); then
    echo "输入有效序号!"
    exit
fi
echo -n -e "是否移除 ${ECHO_RED_COLOR}'${kernel_list[kernel_i]}'${ECHO_COLOR_RES} (y|N):"
read  -t 30 yn
case $yn in
    [yY])
        rpm -e ${kernel_list[kernel_i]}
esac
bootclean

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值