跳到主要内容

12 篇博文 含有标签「Linux」

查看所有标签

CentOS 升级内核

· 阅读需 4 分钟

CentOS 升级内核

1、查看当前内核版本

$ uname -a
Linux k8s-master 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
2、升级内核

更新 yum 源仓库

$ yum -y update

启用 ELRepo 仓库

ELRepo 仓库是基于社区的用于企业级 Linux 仓库,提供对 RedHat Enterprise (RHEL) 和 其他基于 RHEL的 Linux 发行版(CentOS、Scientific、Fedora 等)的支持。 ELRepo 聚焦于和硬件相关的软件包,包括文件系统驱动、显卡驱动、网络驱动、声卡驱动和摄像头驱动等。

#导入ELRepo仓库的公共密钥
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org

#安装ELRepo仓库的yum源
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm

3、查看可用的系统内核包

$ yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 可以看到 lt 的和 ml 两个版本的

4、安装最新版本内核

$ yum --enablerepo=elrepo-kernel install kernel-ml

--enablerepo 选项开启 CentOS 系统上的指定仓库。默认开启的是 elrepo,这里用 elrepo-kernel 替换。

5、设置 grub2

内核安装好后,需要设置为默认启动选项并重启后才会生效

查看系统上的所有可用内核:

$ sudo awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (4.18.7-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-862.11.6.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-514.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-063ec330caa04d4baae54c6902c62e54) 7 (Core)

设置新的内核为grub2的默认版本

服务器上存在4 个内核,我们要使用 4.18 这个版本,可以通过 grub2-set-default 0 命令或编辑 /etc/default/grub 文件来设置

方法1、通过 grub2-set-default 0 命令设置

# 其中 0 是上面查询出来的可用内核
grub2-set-default 0

方法2、编辑 /etc/default/grub 文件

# 设置 GRUB_DEFAULT=0,通过上面查询显示的编号为 0 的内核作为默认内核:

$ vim /etc/default/grub
GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=0
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=cl/root rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

生成 grub 配置文件并重启

$ grub2-mkconfig -o /boot/grub2/grub.cfg
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.18.7-1.el7.elrepo.x86_64
Found initrd image: /boot/initramfs-4.18.7-1.el7.elrepo.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-862.11.6.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-862.11.6.el7.x86_64.img
Found linux image: /boot/vmlinuz-3.10.0-514.el7.x86_64
Found initrd image: /boot/initramfs-3.10.0-514.el7.x86_64.img
Found linux image: /boot/vmlinuz-0-rescue-063ec330caa04d4baae54c6902c62e54
Found initrd image: /boot/initramfs-0-rescue-063ec330caa04d4baae54c6902c62e54.img
done

$ reboot

6、验证

$ uname -a
Linux test 5.4.155-1.el7.elrepo.x86_64 #1 SMP Mon Oct 18 17:53:28 EDT 2021 x86_64 x86_64 x86_64 GNU/Linux

7、删除旧内核(可选)

查看系统中全部的内核:

$ rpm -qa | grep kernel
kernel-3.10.0-514.el7.x86_64
kernel-ml-4.18.7-1.el7.elrepo.x86_64
kernel-tools-libs-3.10.0-862.11.6.el7.x86_64
kernel-tools-3.10.0-862.11.6.el7.x86_64
kernel-3.10.0-862.11.6.el7.x86_64

方法1、yum remove 删除旧内核的 RPM 包

$ yum remove kernel-3.10.0-514.el7.x86_64 \
kernel-tools-libs-3.10.0-862.11.6.el7.x86_64 \
kernel-tools-3.10.0-862.11.6.el7.x86_64 \
kernel-3.10.0-862.11.6.el7.x86_64

方法2、yum-utils 工具

# 如果安装的内核不多于 3 个,yum-utils 工具不会删除任何一个。只有在安装的内核大于 3 个时,才会自动删除旧内核。

# 安装yum-utils
$ yum install yum-utils

# 删除旧版本
package-cleanup --oldkernels

Centos 源码编译指定版本内核

· 阅读需 1 分钟

Centos 源码编译指定版本内核

# 下载目标内核源。例如:
wget https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.14.49.tar.xz
tar -xf linux-4.14.49.tar.xz
cd linux-4.14.49

# 应用补丁 (https://github.com/wavezhang/k8s-ipvs-toa)
patch -p1 < ../k8s-ipvs-toa/k8s-ipvs.patch

# 踩了很多坑,需要安装很多工具
yum groupinstall "Development Tools" -y

yum install openssl patch gcc automake autoconf libtool make \
zlib-devel elfutils elfutils-libelf-devel -y

yum install epel-release -y
yum install openssl-devel bc -y
yum install ncurses-devel ntpdate -y


cp /boot/config-3.10.0-229.el7.x86_64 .config

sh -c 'yes "" | make oldconfig'

make -j30 bzImage

make -j30 modules

make -j30 modules_install

make install


# 查看插入顺序,看一下
cat /boot/grub2/grub.cfg |grep "menuentry "
awk -F\' '$1=="menuentry " {print $2}' /etc/grub2.cfg

# 修改启动顺序
grub2-set-default 'CentOS Linux (4.14.49) 7 (Core)'

# 查看启动顺序
grub2-editenv list

# 重启生效
reboot

编译指定(toa)模块

# toa 模块
wget https://github.com/Huawei/TCP_option_address/archive/master.zip

unzip master.zip
cd TCP_option_address-master/src

# 编译,加载模块
make
insmod toa.ko

# 查看模块
lsmod | grep toa

Linux 装x指南

· 阅读需 9 分钟

为什么要整理这种?

只有能讲出来和写出来的东西才是自己的,此文章为 Linux 日常操作指南。 快捷操作 -> 装x必备

你说你懂 Linux,其实大家都懂点,连测试和前端可能都经常打点命令去压测或者部署测试什么的,那你如何证明你更熟悉,来用熟练的快捷操作让旁边观摩的人暗暗惊叹吧~

命令行光标移动指令

光标快速切换到行首尾
ctrl a  行首
ctrl e 行尾
删除至行尾 | 清除当前光标位置之前的一个单词
ctrl k  可以将当前光标位置之后的所有部分快速清除
ctrl w 可以清除当前光标位置之前的一个单词
删除此条命令行
ctrl u  可以直接将整行命令直接清除
左|右 移动一个单词
esc b  左移一个单词
esc f 右移一个单词

vim 常用记录

光标漫游
j  向下
k 向上
h 向左
l 向右

shift + 上下左右 光标快速移动

gg 快速到文件头
G 快速到文件尾

shift 4($) 快速到行尾
shift 6(^) 快速到行首

i 插入模式
o 在下一行插入
复制 / 剪切
yy  复制一行
3yy 复制三行
yw 复制光标开始的第一个单词
y$ 复制光标到行尾

x 剪切光标所在字符
3x 剪切光标所在处往后的三个字符
删除 / 粘贴
dd  删除一行
3dd 删除三行
dw 删除一个单词
df" 删除到出现的第一个双引号

p 粘贴
ctrl + v 块模式
# 举个例子
1. 按下 gg 到行首
2. 按 `ctrl+v` 进入可视化模式,然后按 G 到行尾
3. 按 `I` 进入插入模式,输入 #
4. 按两次 ecs 回到普通模式,每一行都会生效
命令行模式
# 在普通模式下,输入 : 即可进入

%s/$/sth/ 在行尾追加sth
%s/\^M//g 替换掉dos换行符,\^M使用ctrl+v + Enter即可输入
g/^\s*$/d 删除空行以及只有空格的行
%s/#.*//g 删除#之后的字符
查找字符串
# 在普通模式下,按下/直接进入查找

n 查找下一个匹配
N 查找上一个匹配
2n 查找下面第二个匹配
宏录制

一般不咋用,用上了还挺酷的,算是 vim 特有操作

1. 按下 gg 到行首
2. 按下 qa 进行宏录制,a 是我们起的一个标记名称
3. 按 I 进入插入模式,输入 list.add("
4. 按 ESC 进入普通模式,然后按 $ 跳到行尾, 按 a 输入 ")
5. 按 j 进入下一行,然后按 ^ 回到行首
6. 再次按下 q 结束宏录制
7. 输入 @a 触发宏测试一下录制效果
8. 输入 3@a 重复宏3次,也就是影响下面的3行

aaa
bbb
ccc
⬇️
list.add("aaa")
list.add("bbb")
list.add("ccc")
其他操作
r    替换字符
ggVG 全选
u 恢复更改
:e /tmp/a 在同一个编辑器内打开/tmp/a文件。同一个编辑器的缓冲区是剪贴板是共享的,可以方便在多个文件中复制

wq wqa q! qa! 保存退出和不保存退出,a 即为 all 的意思

sed 常用记录

常用替换模式(更高级的我很少用)
sed '/^txt/s/a/b/g' file
# /^txt/ 选择以 ^txt 开头的行 ,s是substitute意思,a 是要匹配的字符,b 是要替换成为的字符,g 为flag

# 示例(匹配 test.txt 文件中 config 字符的行,以及后面的三行,将a替换为b)
sed '/config/, +3 s/a/b/g' test.txt
示范例子
# 统计文件中有每个单词出现了多少次
sed 's/ /\n/g' file | sort | uniq -c

# 查找目录中的py文件,删掉所有行级注释,并创建.bak 的备份文件
find ./ -name "*.py" | xargs sed -i.bak '/^[ ]*#/d'

awk 常用记录

常用文本筛选功能 (比如做一些日志处理和统计)
awk -F "," '/^a/' {print $1} file
# -F "," 参数
# '/^a/' 范围
# {print $1} 操作

# 举个例子1:采用awk统计netstat命令的一些网络状态
netstat -ant |
awk ' \
BEGIN{print "State","Count" } \
/^tcp/ \
{ rt[$6]++ } \
END{ for(i in rt){print i,rt[i]} }'
# 输出结果为:
State Count
LAST_ACK 1
LISTEN 64
CLOSE_WAIT 43
ESTABLISHED 719
SYN_SENT 5
TIME_WAIT 146

# 例子2,跟例子1的效果其实一样的:
netstat -ant | awk '{print $6}' | sort | uniq -c | sort -n -k 1 -r
示范例子
# 外网连接数,根据ip分组
netstat -ant | awk '/^tcp/{print $4}' | awk -F: '!/^:/{print $1}' | sort | uniq -c

# 输出 nginx 日志的 ip 和每个 ip 的 pv,pv 最高的前10
awk -F"|" '{print $3}' access.log | sort | uniq -c | sort -nk1 -r | head -n10

Linux 运维一定要懂得命令

CPU
  • 使用top查看cpu的load,使用 shift+p 按照 cpu 排序。

    需要了解 wa,us 等都是什么意思

  • 使用uptime查看系统启动时间和load

    什么算是系统过载 ?(服务所收到的请求量原大于它能处理的请求,load值需跟核心数做对比)

  • ps 命令勃大茎深,除了查进程号外,你还需要知道R、S、D、T、Z、<、N状态位的含义

  • topps 很多功能是相通的,比如 watch "ps -mo %cpu,%mem,pid,ppid,command ax" 相当于top的进程列表;

    top -n 1 -bcps -ef 的结果相似。

  • 有生就有死,可以用kill杀死进程。

    对java来说,需要关注 kill -9kill -15kill -3 的含义,kill的信号太多了,可以用kill -l查看,搞懂大多数信号大有裨益。

  • 如果暂时不想死,可以通过&符号在后台执行,比如tail -f a.log &

    jobs命令可以查看当前后台的列表,想恢复的话,使用fg回到幕前。

    这都是终端作业,当你把term关了你的后台命令也会跟着消失,所以想让你的程序继续执行的话,需要nohup命令,此命令需要牢记

top 中的 wa 是指当CPU空闲且磁盘IO阻塞的时间占比。注意这里只统计磁盘IO,不包含网络IO
top 中的 us 是指用户空间占用CPU百分比

kill -15 系统级别杀死,告知需要关闭,让其自行停止并退出,当然有些进程会拒绝结束
kill -9 内核级别杀死,需要立即退出,强制杀死
kill -3 可以打印进程各个线程的堆栈信息,默认保存为 /proc/${pid}/cwd/antBuilderOutput.log
#注:如果 -Xrs JVM选择没有被使用,kill -3命令会被忽略,可以使用 jstack -l [java pid] > jstack.out 来达到一样的效果
内存
  • free -m 命令,了解free、used、cached、swap各项的含义

  • cat /proc/meminfo 查看更详细的内存信息

    细心的朋友可能注意到,CPU和内存的信息,通过top等不同的命令显示的数值是一样的。

  • slabtop 用来显示内核缓存占用情况,比如遍历大量文件造成缓存目录项。

    曾在生产环境中遇到因执行find /造成dentry_cache耗尽服务器内存。

  • vmstat 命令是我最喜欢也最常用的命令之一,可以以最快的速度了解系统的运行状况。

    每个参数的意义都要搞懂。

  • swapon、swapoff 开启,关闭交换空间

  • sar 又一统计类轮子,一般用作采样工具

存储
  • 使用df -h查看系统磁盘使用概况
  • lsblk 列出块设备信息
  • du 查看目录或者文件大小
网络
  • rsync 强大的同步工具,可以增量哦

  • netstat 查看Linux中网络系统状态信息,各种

  • ss 它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

  • curl、wget 模拟请求工具、下载工具。

    如wget -r https://baidu.com 将下载整个站点

  • ab Apache服务器的性能测试工具

  • ifstat 统计网络接口流量状态

  • nslookup 查询域名DNS信息的工具,在内网根据ip查询域名是爽爆了

  • nc 网络工具中的瑞士军刀,不会用真是太可惜了

  • arp 可以显示和修改IP到MAC转换表

  • traceroute 显示数据包到主机间的路径,俗称几跳,跳的越少越快

  • tcpdump 不多说了,去下载 wireshark了

网络方面推荐安装体验一下kali Linux(有很多渗透工具,界面UI也很有安全【黑客】风格),上面的工具会让你 high 到极点。

上面资源的组合途径

/proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。只不过以文件系统的方式为访问系统内核数据的操作提供接口。系统的所有状态都逃不过它的火眼金睛。例如:

  • cat /proc/vmstat 看一下,是不是和vmstat命令的输出很像?
  • cat /proc/meminfo 是不是最全的内存信息
  • cat /proc/slabinfo 这不就是slabtop的信息么
  • cat /proc/devices 已经加载对设备们
  • cat /proc/loadavg load avg原来就躺在这里啊
  • cat /proc/stat 所有的CPU活动信息
  • ls /proc/$pid/fd 静静地躺着lsof的结果
以 java 应用为例:

![在这里插入图片描述](/img/Linux 装x实录/1.jpeg)

举个例子:

怎么查看某个Java进程里面占用CPU最高的一个线程具体信息?

  • 获取进程中占用CPU最高的线程,计为n。

    • 使用 top top -H -p pid,肉眼观察之
    • 使用 ps ps -mo spid,lwp,stime,time,%cpu -p pid
  • 将线程号转化成十六进制 printf 0x%x n

  • 使用 jstack 找到相应进程,打印线程后的100行信息 jstack -l pid| grep spid -A 100

最后附上经典一图 ![在这里插入图片描述](/img/Linux 装x实录/2.jpeg)