跳转至

Linux运维

1 查看linux是centos或ubuntu

  1. 执行lsb_release -a,ubuntu版本会显示信息,centos版显示错误
  2. 执行cat /etc/redhat-release,centos版会显示信息,ubuntu版会显示错误

2 查看机器重启记录

  1. 执行:last reboot
$ last reboot
reboot   system boot  4.19.12-1.el7.el Tue Apr 19 18:10 - 19:12  (01:02)    
reboot   system boot  4.19.12-1.el7.el Sun Apr 17 21:41 - 19:12 (1+21:31)   
reboot   system boot  4.19.12-1.el7.el Sun Apr 17 04:28 - 19:12 (2+14:44)   
reboot   system boot  4.19.12-1.el7.el Sat Apr 16 20:39 - 19:12 (2+22:33)   
reboot   system boot  4.19.12-1.el7.el Fri Apr 15 06:56 - 19:12 (4+12:16)   
reboot   system boot  4.19.12-1.el7.el Thu Apr 14 19:43 - 19:12 (4+23:29)   
reboot   system boot  4.19.12-1.el7.el Sun Sep  5 00:29 - 19:41 (221+19:11) 
reboot   system boot  4.19.12-1.el7.el Sat Sep  4 05:26 - 19:41 (222+14:15) 
reboot   system boot  4.19.12-1.el7.el Wed Sep  1 08:12 - 19:41 (225+11:28) 
reboot   system boot  4.19.12-1.el7.el Tue Aug 31 03:17 - 19:41 (226+16:23) 
reboot   system boot  4.19.12-1.el7.el Thu Aug 26 22:11 - 19:41 (230+21:29) 
reboot   system boot  4.19.12-1.el7.el Thu Aug 26 17:06 - 19:41 (231+02:34) 
reboot   system boot  4.19.12-1.el7.el Thu Aug 26 16:43 - 19:41 (231+02:58) 
reboot   system boot  4.19.12-1.el7.el Fri Aug 20 11:30 - 19:41 (237+08:11) 

3 修改系统hostid

  • 示例
15ac1f1d
echo -ne '\x1d\x1f\xac\x15' > /etc/hostid

4 修改hostname

  • 临时修改:hostname 主机名,机器重启失效
  • 永久修改:编辑/etc/hostname文件,echo 主机名 > /etc/hostname

5 升级系统内核

centos7默认内核版本是3.10,此版本内核存在漏洞,k8s中建议使用4以上内核版本

# 1.查看当前内核版本
[root@k8s ~]# uname -r
3.10.0-1160.el7.x86_64
# 2.添加yum源仓库
[root@k8s ~]# mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup 
[root@k8s ~]# curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo 
[root@k8s ~]# curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
[root@k8s ~]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[root@k8s ~]# yum install -y https://www.elrepo.org/elrepo-release-7.0-4.el7.elrepo.noarch.rpm
# 3.更新yum源仓库(这步更新较多,速度比较慢)
[root@k8s ~]# yum -y update
# 4.下载内核
# 4.1查看可用的系统内核包,lt表长期支持版,mt表示当前稳定版
[root@k8s ~]# yum --disablerepo="*" --enablerepo="elrepo-kernel" list available
# 4.2安装内核,注意先要查看可用内核,我安装的是5.18.10版本的内核 (可能有些需要安装header包(内核include文件)等,请自行选择安装),kernel-mt-headers kernel-mt-tools kernel-mt-devel
[root@k8s ~]# yum --enablerepo=elrepo-kernel install kernel-ml -y 
# 4.3查看目前可用内核
[root@k8s ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.18.10-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
2 : CentOS Linux (0-rescue-338bf7be5ccb4bd4a9cd9e4ea1e91ad9) 7 (Core)

# 5.使用序号为0的内核,序号0是前面查出来的可用内核编号
[root@k8s ~]# grub2-set-default 0

# 6.生成 grub 配置文件并重启
[root@k8s ~]# grub2-mkconfig -o /boot/grub2/grub.cfg
# 7.重启机器
[root@k8s ~]# reboot
# 8.查看内核
[root@k8s ~]# uname -r
5.18.9-1.el7.elrepo.x86_64
# 9.安装内核头文件
[root@centos7 ~]# yum install "kernel-devel-uname-r == $(uname -r)"

6 删除内核

[root@centos7 ~]# uname -r
5.18.15-1.el7.elrepo.x86_64
[root@centos7 ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.18.15-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (3.10.0-1160.71.1.el7.x86_64) 7 (Core)
2 : CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core)
3 : CentOS Linux (0-rescue-338bf7be5ccb4bd4a9cd9e4ea1e91ad9) 7 (Core)
[root@centos7 ~]# rpm -qa | grep kernel
kernel-tools-3.10.0-1160.71.1.el7.x86_64
kernel-ml-5.18.15-1.el7.elrepo.x86_64
kernel-3.10.0-1160.el7.x86_64
kernel-3.10.0-1160.71.1.el7.x86_64
kernel-tools-libs-3.10.0-1160.71.1.el7.x86_64

## 删除内核3.10.0的2个内核
[root@centos7 ~]# yum remove kernel-3.10.0-1160.71.1.el7.x86_64 -y
[root@centos7 ~]# yum remove kernel-3.10.0-1160.el7.x86_64 -y
[root@centos7 ~]# reboot
[root@centos7 ~]# awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg
0 : CentOS Linux (5.18.15-1.el7.elrepo.x86_64) 7 (Core)
1 : CentOS Linux (0-rescue-338bf7be5ccb4bd4a9cd9e4ea1e91ad9) 7 (Core)

7 普通用户使用 sudo

# 编辑/etc/sudoers文件
vi /etc/sudoers
# 在添加root ALL=(ALL) ALL那一列下面添加 "用户名 ALL=(ALL) ALL"
root ALL=(ALL) ALL
user ALL=(ALL) ALL
# wq!保存退出

8 Linux 给软件设置环境变量

  1. 打开环境变量配置文件
sudo vim /etc/profile
  1. 新增环境变量
# 在 export PATH 下一行新增如下命令,(假设将vscode可执行文件路径设为环境变量)
export VSCODE=/opt/apps/com.visualstudio.code/files/share/code/bin
export PATH=$PATH:$VSCODE
# /opt/apps/com.visualstudio.code/files/share/code/bin是vscode可执行文件路径
  1. 更新配置文件
source /etc/profile
  1. 直接使用命令打开软件
# code是/opt/apps/com.visualstudio.code/files/share/code/bin路径下的可执行文件名
code .

9 shell 补全 bash-complete

  • shell 补全功能:是当在命令行键入命令时,可以通过单击 tab 来自动补全,或双击 tab 显示所有匹配项。
  • 实现方法:通过 linux 自带的 complete,配置相应的规则即可
  • 示例
$ complete -W "one two three" test_complete
$ test_complete [TAB][TAB]
one    three  two    

9.1 complete 语法规则

10 设置 man 手册搜索路径

  • 使用场景:当我们手动安装软件时,可能需要将软件自带的 man 文件并没有在 man 默认搜索路径里,结果是导致 man 失效
  • 方法:
  • 修改 man 配置文件,如 ubuntu 下是 /etc/manpath.config,debian 下是 /etc/man_db.conf
  • 新增一行 MANDATORY_MANPATH /your/man/path, 如 MANDATORY_MANPATH /home/shw/tools/share/man

11 设置 PS1 变量

12 curl

  • 功能:用于网络间传输数据的工具,支持的协议有:HTTP, HTTPS, FTP, FTPS, SCP, SFTP, TFTP, DICT, TELNET, LDAP or FILE
  • 语法:curl [option] urls
  • 无选项:显示目标url数据,如curl https://www.baidu.com/,将输出网页源码
  • -o file>> file:指定输出文件,即重定向到指定文件
  • -s/--silent:不显示进程条和错误信息
  • -X/--request <command>:http中请求方式,如GET、PUT、POST,默认GET方法
  • -H/--header <header>:指定http头部内容
  • -d/--data <data>:指定http中body消息体内容
  • -T/--upload-file <file>:上传文件,如果用于ftp,在url后有/表示的是目录,否则当成文件名,如果文件存在,则覆盖,如果指定了-a,则追加写。如果用户http,则采用put方法
  • curl -u username:password URL:在访问需要授权的页面时,输入用户名和密码
  • curl -u username URL:同上,仅输入用户名,后根据提示输入密码
  • -C -:断点续传,当上一次下载任务尚未完成而异常终止,使用此选项可以接着上一次进程继续下载
  • -i:参数打印出服务器回应的 HTTP 标头
  • 示例:选项-o
$ curl https://www.baidu.com/ >>baidu.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2443  100  2443    0     0  22172      0 --:--:-- --:--:-- --:--:-- 22412
$ curl https://www.baidu.com/ -o baidu.html
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2443  100  2443    0     0  19924      0 --:--:-- --:--:-- --:--:-- 20190
  • 示例:-T -a
# 将本地baidu.html追加写入ftp://192.168.1.59/下的1.txt中
$ curl -aT baidu.html ftp://192.168.1.59/1.txt
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2443    0     0  100  2443      0   7437 --:--:-- --:--:-- --:--:--  7448

13 日志文件里面查找关键字

13.1 head和tail查看日志首位行

  • 查看日志 前 n行:
  • 语法:cat 文件名 | head -n 数量
  • 示例:cat log.log | head -n 200
  • 查看日志 尾 n行:
  • 语法:cat 文件名 | tail -n 数量
  • 示例:cat log.log | tail -n 200

13.2 grep 查找日志关键字

  1. 方法1:
  2. 语法:cat 文件名 | grep "关键词"
  3. 示例:cat log.log | grep "train"
  4. 方法2:
  5. 语法:grep -i "关键词" 文件名
  6. 示例:grep -i "train" log.log

14 chrony时间同步

# 安装chrony
[root@k8s ~]# yum install -y chrony
# 开机自启,启动chronyd服务,查看服务状态
[root@k8s ~]# systemctl enable chronyd
[root@k8s ~]# systemctl start chronyd
[root@k8s ~]# systemctl status chronyd
# 测试时间
[root@k8s ~]# date
Sun Jul  3 11:28:18 CST 2022

15 ssh互信

16 防火墙

16.1 不关闭防火墙暴露指定端口供外网访问

在开启防火墙时,如果想要外网访问主机,需要在防火墙配置中将此访问端口公开,否则访问会失败。比如你的机器作为web服务器,需要配置防火墙开放80端口公网才能访问。

17 systemd

17.1 systemctl管理程序

17.1.1 systemctl status 状态类型

在操作系统中,有某些服务只需要初始化一下就可以了;不需要在服务器中启动一个守护进程。这种服务初始化完成后就直接推出,其服务的状态就是active(exited)。

使用systemctl 查看服务的状态,返回的状态有以下几种: 1. loaded:系统服务已经初始化完成,加载过配置 2. active(running):正有一个或多个程序正在系统中执行, vsftpd就是这种模式 3. atcive(exited) :仅执行一次就正常结束的服务, 目前并沒有任何程序在系統中执行 4. atcive(waiting):正在执行当中,不过还在等待其他的事件才能继续处理 5. inactive :服务关闭 6. enbaled :服务开机启动 7. disabled :服务开机不自启 8. static :服务开机启动项不可被管理 9. failed :系统配置错误

18 pkg-config

  • 功能:获取已安装库的元信息(比如需要链接的lib库,包含的头文件信息)。需要配置库信息相关文件(.pc文件),然后pkg-config去解析

18.1 pkg-config使用

使用方式:首先要先定义.pc文件,然后将.pc文件所在目录写入PKG_CONFIG_PATH变量中,并导出,如export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig,这样pkg-config命令才能找到.pc文件 - 语法:pkg-config [option] 库名称 - 可选参数: - [--cflags]:显示如头文件包含的信息,如-I${libdir}/glib/include - [--libs]:显示库链接信息,如-L${libdir} -lgobject-1.3 - ... - 示例:pkg-config --cflags --libs fuse:获取libfuse的链接和头文件包含信息

18.2 .pc文件规则

.pc文件中每行具有2中含义:1.以=赋值的变量,如下面示例中prefix变量;2.以:标识的预定义的关键字,如下面示例中Name关键字 - 关键字如下: - Name:包名;(特点:简洁,可读;不是pkg-config命令中的库名) - Description:包名的描述信息。(简洁明了) - URL:可以为使用者获得更多信息或下载本包的网址 - Version:包的版本信息 - Requires:提供依赖包的检测功能。每一个依赖包以,区分,也可以使用=, <, >, >=, <=来指定版本;如Requires: glib-2.0 = 1.3.1 - Conflicts:提供冲突包的检测功能。每一个冲突包以,区分,也可以使用=, <, >, >=, <=来指定版本,也可以重复指定不同版本的包;如Conflicts: foobar=4.8 foobar <= 4.5-Libs:使用本包需要的链接信息,如Libs: -L${libdir} -lgobject-1.3-Libs.private:私有库的链接信息。静态链接需要使用。如Libs.private: -lm。Private libraries are libraries which are not exposed through your library, but are needed in the case of static linking. -Cflags:一些编译选项,包括头文件包含路径,如Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib/include` - 示例

##This is a comment
prefix=/home/hp/unst   # this defines a variable
exec_prefix=${prefix}  # defining another variable in terms of the first
libdir=${exec_prefix}/lib
includedir=${prefix}/include

Name: GObject                            # human-readable name
Description: Object/type system for GLib # human-readable description
Version: 1.3.1
URL: http://www.gtk.org
Requires: glib-2.0 = 1.3.1
Conflicts: foobar <= 4.5
Libs: -L${libdir} -lgobject-1.3
Libs.private: -lm
Cflags: -I${includedir}/glib-2.0 -I${libdir}/glib/include

19 查看系统相关信息

19.1 查看内存信息

cat /proc/meminfo

19.2 查看某一进程系统资源占用信息/proc/[PID]

  • /proc/[PID]目录下有以下文件(PID是进程号)
$ ls  /proc/1958076
attr       clear_refs       cpuset   fd       limits     mem         net        oom_score      projid_map  setgroups  statm    timers
autogroup  cmdline          cwd      fdinfo   loginuid   mountinfo   ns         oom_score_adj  root        smaps      status   uid_map
auxv       comm             environ  gid_map  map_files  mounts      numa_maps  pagemap        sched       stack      syscall  wchan
cgroup     coredump_filter  exe      io       maps       mountstats  oom_adj    personality    sessionid   stat       task

19.2.1 查看io信息

$ cat /proc/1958076/io
rchar: 21911
wchar: 1420
syscr: 53
syscw: 5
read_bytes: 0
write_bytes: 4096
cancelled_write_bytes: 0
  • 参数解释如下:
  • rchar:读出的总字节数,read或者pread()中的长度参数总和(pagecache中统计而来,不代表实际磁盘的读入)
  • wchar:写入的总字节数,write或者pwrite中的长度参数总和
  • syscr:read()或者pread()总的调用次数
  • syscw:write()或者pwrite()总的调用次数
  • read_bytes:实际从磁盘中读取的字节总数 (这里if=/dev/zero 所以没有实际的读入字节数)
  • write_bytes:实际写入到磁盘中的字节总数
  • cancelled_write_bytes:由于截断pagecache导致应该发生而没有发生的写入字节数(可能为负数)

19.2.2 查看进程的状态status

  • 参数解释如下:
  • VmHWM:物理内存占用的峰值
  • VmRSS:占用的物理内存

19.3 判断固态硬盘和机械硬盘

  1. 使用lsblk -d查看块设备名
  2. 使用cat /sys/block/[块设备名]/queue/rotational
  3. 输出0表示设备不可旋转(即固态硬盘)
  4. 输出1表示设备可以旋转(即机械硬盘)
  5. 示例:sdf是机械硬盘,sdg是固态硬盘
$ lsblk -d
NAME MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda    8:0    0   1.1T  0 disk 
sdb    8:16   0   1.1T  0 disk 
sdc    8:32   0   1.1T  0 disk 
sdd    8:48   0   1.1T  0 disk 
sde    8:64   0   1.1T  0 disk 
sdf    8:80   0   1.1T  0 disk 
sdg    8:96   0 447.1G  0 disk 
sdh    8:112  0 447.1G  0 disk 
sr0   11:0    1  1024M  0 rom  
$ cat /sys/block/sdf/queue/rotational
1
$ cat /sys/block/sdg/queue/rotational
0

19.4 查看linux发行版本

  • lsb_release -a

19.5 查询操作系统信息

  • uname -a

20 查看ip

20.1 hostname

shw@小锋哥:~$ hostname -I
172.22.227.232

20.2 ip

shw@小锋哥:~$ ip addr show

20.3 ifconfig

shw@小锋哥:~$ ifconfig