0x00 引言
Linux内核开发所用到的工具。
0x01 Vim
想用终端开发软件的程序员都会选择Vim,使用方法参考菜鸟教程。
0x02 Linux系统运维常用工具
1 | 1 top |
1、top
除了 top ,还可以使用 htop 命令,但是需要安装。
top命令经常用来监控Linux的系统状况,比如cpu、内存的使用,命令如下:
1 | $ top |
1.1、系统运行时间和平均负载
- top:当前时间
- up:系统已运行的时间
- user:当前登录用户的数量
- load average:相应最近5、10和15分钟内的平均负载,每隔5秒钟检查一次活跃的进程数。
1.2、进程状态
按”t”切换显示状态。
- total:总共进程数
- running:运行中进程
- sleeping:休眠中进程
- stopped:停止中进程
- zombie:僵尸进程
1.3、CPU状态
按”1”显示所有CPU状态。
- us / user: 用户空间占用CPU的百分比
- sy / system: 内核空间占用CPU的百分比
- ni / niced:改变过优先级的进程占用CPU的百分比
- id:空闲CPU百分比
- wa / IO wait: IO等待占用CPU的百分比
- hi:处理硬件中断占用CPU的百分比
- si: 处理软件中断占用CPU的百分比
- st:这个虚拟机被hypervisor偷去时间占用CPU的百分比(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。
1.4、内存使用
按”m”切换显示状态。
内存区-Mem
- total:物理内存总量
- used:使用中的内存总量
- free:空闲内存总量
- buffers/cache:缓存的内存量
交换分区-Swap
- total:交换区总量
- used:使用的交换区总量
- free:空闲交换区总量
- avail Mem:缓冲的交换区总量
1.5、各进程的状态监控
按”f”可添加需要监控的状态变量,按”M”可按各进程内存占有百分比降序排列,按”P”可按各进程CPU占有百分比降序排列。
- PID:进程ID,进程的唯一标识符
- USER:进程所有者的实际用户名。
- PR:进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。
- NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
- VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
- RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
- SHR:SHR是进程使用的共享内存。共享内存大小,单位kb
- S:这个是进程的状态。它有以下不同的值:
- D:不可中断的睡眠态。
- R:运行态
- S:睡眠态
- T:被跟踪或已停止
- Z:僵尸态
- %CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。
- %MEM:进程使用的可用物理内存百分比。
- TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
- COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)
2、free
free 命令显示系统内存的使用情况,包括物理内存、交换内存(swap)和内核缓冲区内存,命令如下:
1 | # 最直接 |
- Mem行:是内存的使用情况。
- Swap行:是交换空间的使用情况。
- total列:显示系统总的可用物理内存和交换空间大小。
- used列:显示已经被使用的物理内存和交换空间。
- free列:显示还有多少物理内存和交换空间可用使用。
- shared列:显示被共享使用的物理内存大小。
- buff/cache列:显示被 buffer 和 cache 使用的物理内存大小。
- available列:显示还可以被应用程序使用的物理内存大小。
3、vmstat
vmstat命令可对操作系统的虚拟内存、进程、CPU活动进行监控,命令如下:
1 | # 时间间隔2s,采样10次 |
进程-Procs
- r: 运行队列中进程数量
- b: 等待IO的进程数量
内存-Memory
- swpd: 使用虚拟内存大小
- free: 可用内存大小
- buff: 用作缓冲的内存大小
- cache: 用作缓存的内存大小
交换分区-Swap
- si: 每秒从交换区写到内存的大小
- so: 每秒写入交换区的内存大小
IO
- in: 每秒中断数,包括时钟中断。【interrupt】
- cs: 每秒上下文切换数。【count/second】
CPU
- us: 用户进程执行时间(user time)
- sy: 系统进程执行时间(system time)
- id: 空闲时间(包括IO等待时间),中央处理器的空闲时间 。以百分比表示。
- wa: 等待IO时间
4、slabtop
Linux内核需要为临时对象如任务或者设备结构和节点分配内存,缓存分配器管理着这些类型对象的缓存。现代Linux内核部署了该缓存分配器以持有缓存,称之为片。不同类型的片缓存由片分配器维护。本文集中讨论slabtop命令,该命令显示了实时内核片缓存信息。
1 | # slabtop排序方式设置为最常用的cache size |
5、pmap
pmap命令用于报告进程的内存映射关系,是Linux调试及运维一个很好的工具,这里自己写个代码来测试该工具:
1 | // 编译具有如下代码的test.cpp文件 |
编译完成后,使用如下命令运行:
1 | # 在后台执行test程序 |
6、dmesg
dmesg命令用于显示开机信息。
1 | # "-T"代表log打印出时间,"-d"代表log打印出两条指令之间的差值 |
7、lsof
lsof用于查看进程打开的文件或打开文件的进程:
1 | lsof -p 1359 # 查看某个PID进程打开的所有文件 |
8、ulimit
ulimit用于为由它生成的 shell进程及其子进程的资源使用设置限制:
1 | $ ulimit -a |
排查某个进程文件符占用的方法:
1 | # 查看每个进程的文件符上限 |
9、pstack
排查CPU占用高的方法:
1 | # 查看高CPU占用的进程PID |
0x03 Linux系统开发常用工具
1 | 1 日志读取-journalctl |
1、日志读取-journalctl
在Systemd出现之前,Linux系统及各应用的日志都是分别管理的,Systemd开始统一管理了所有Unit的启动日志,这样带来的好处就是可以只用一个 journalctl命令,查看所有内核和应用的日志。
1 | # -----1、查看所有日志----- |
2、进程服务管理-systemctl/service
systemd对应的进程管理命令是systemctl。
1 | # -----1、进程开启/关闭/重启----- |
服务管理命令使用的是service。
1 | # 如果要开启ssh服务 |
3、核心转储-coredump
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。
1 | # 安装 |
4 进程查询-ps + grep/pgrep/pidof/pstree
ps指令能显示进程的消息,grep是Linux下的文本过滤工具,它俩是个组合工具。我们经常用如下命令查找进程:
1 | # 查看当前终端的PID |
5、杀死进程-kill/killall/pkill
1 | # kill能杀死指定的ID进程,需要在杀进程之前使用ps等命令再配合grep来查找进程 |
6、网络通信-ping/nc/tracert
1 | # -----1、ping单个目标----- |
7、硬件信息-dmidecode + lspci
1 | # -----1、所有硬件信息----- |
8、文件操作-cat/less/more/mv/cp/rm/chmod/ls+file+stat/grep/echo/find/locate/which/whereis/sed
1 | # -----1、cat----- |
9、帮助指令-man
man命令可查看指令帮助、配置文件帮助和编程帮助等信息
1 | # 打印man指令信息 |
10、屏保设置-xset
命令 | 功能 |
---|---|
xset s off | 禁用屏幕保护 |
xset s 3600 3600 | 设置空闲时间为1小时 |
xset -dpms | 关闭 DPMS |
xset s off -dpms | 禁用 DPMS 并阻止屏幕进入空闲 |
xset dpms force on | 立即打开屏幕 |
xset dpms force off | 立即关闭屏幕 |
xset dpms force standby | 强制屏幕进入待命状态 |
xset dpms force suspend | 强制屏幕进入暂停状态 |
xset -q | 查询xset状态 |
11、超级用户-sudo/pkexec
root用户和非root用户正常执行命令时,使用的PATH配置文件为 /etc/environment
1 | # -----1、sudo----- |
12、文件内容操作-tail/wc/sort/uniq/paste
tail 命令可用于查看文件的内容,有一个常用的参数 -f 常用于查阅正在改变的日志文件。
1 | # 实时打印日志文件 |
13、压缩文件-zip/rar/tar/xz
zip
1 | # ====== 压缩文件 ====== |
rar
1 | # ====== 压缩文件 ====== |
tar
1 | # ====== 压缩文件 ====== |
xz
1 | # ====== 压缩文件 ====== |
14、挂载-mount
1 | # ====== 查看所有挂载信息 ====== |
15、分区信息-df/fdisk/lsblk/blkid
1 | # ====== df ====== |
16、权限更改-chmod/chown/chroot/chattr/getfacl+setfacl
1 | # 文件权限分类 |
17、用户管理-useradd/userdel/usermod/groups/passwd
1 | # 创建一般用户 |
18、二进制文件分析-file/ldd/ltrace/strace/hexdump/strings/readelf/nm
参考良许的文章,用 /bin/pwd 程序为例:
1 | # -----1、file----- |
19、日志保存-sosreport
快速保存所有日志的工具
1 | # 安装 |
20、远程文件操作-scp/rsync
scp用来做全量备份,每次都是完全拷贝,效率低下。rsync用来做增量备份,每次仅拷贝发生变化的文件,效率高。
1 | # scp传输本地文件到目标主机文件目录 |
21、读取转换数据-dd
dd可从标准输入或文件中读取数据,根据指定的格式来转换数据,在输出到文件、设备或标准输出。比较典型的作用就是制作系统U盘:
1 | # dd制作系统U盘,bs参数代表同时设置读入/输出的块大小 |
22、历史终端命令-history
能够列出终端使用的历史命令记录。
1 | # 列出历史3条命令 |
23、终端代理-proxychains
24、打开文件-xdg-open
1 | xdg-open '文件路径' |
25、用户信息-who/id/loginctl/hostnamectl
1 | # who查看所有tty上的用户 |
26、密码过期设置-chage
1 | # 用法 chage [选项] 用户名 |
27、环境变量-export/locale/env
1 | # export |
28、编辑器-gedit/dedit
1 | # gconf-editor |
29、反汇编-objdump/strings
1 | # 反汇编目标文件或者可执行文件的命令 - objdump |
30、电源指令-poweroff/shutdown/reboot/Hibernate/suspend/logout/rtcwake
首先,介绍计算机电源状态S1~S5:
状态 | 含义 | 对应字段 |
---|---|---|
S1 | 普通待机模式(suspend) | standby |
S2 | 冻结I/O设备 | freeze |
S3 | 待机到内存 | mem |
S4 | 待机到硬盘-休眠(hibernate) | disk |
S5 | 关机(poweroff/shutdown) | off |
当前计算机支持哪些状态都可以在/sys/power/state查到:
1 | # 查阅当前系统支持的休眠模式 |
想实现进入对应状态,可用以下指令:
1 | # 进入S1(可直接输入 suspend) |
想实现进入电源状态后定时开机,可以使用rtcwake命令:
1 | # -m 代表需要进入的状态 |
31、键鼠输入事件监听-libinput
1 | # 安装 |
32、窗口查看进程-xprop
1 | # 打开xprop,点击想要查看详情的窗口 |
33、多屏查询-xrandr
34、输入输出重定向
标准输出指的就是显示器,使用”>”,”>>”,”2>”,”&>”能够重新控制输出的设备:
1 | # ">" 代表覆盖写入,">>"代表追加写入 |
输入重定向,有一个从键盘获取信息存入文件的例子,不是很懂
1 | cat > ok << EOF #交互式 |
管道符用于将前一个命令的执行结果作为后一个命令的执行参数
1 | # 最常见的用法 |
35、ssh免密码登录
1 | # server1: |
36、计划任务-cron
1 | # 符号含义 |
37、网络配置-nmcli/ifconfig/netstat/route
1 | # 网络设备信息 |
38、驱动管理-insmod/rmmod/lsmod/modinfo
1 | # insmod - 加载驱动 |
39、命令行运行时间-time
1 | # 查看命令行运行一条程序花费的时间 |
40 md5校验 - md5sum
1 | # 查看文件是否被更改,其实只需要看它的md5值就行 |
41、内建操作 - type/enable
1 | # 查看命令是否是shell内建 |
42、设置别名 - alias
1 | # alias命令用于设置指令的别名 |
43、文件加密 - tar + openssl + dd
1 | # 加密文件/文件夹 |
44、文本处理 - awk
1 | # 截取ps获得结果的第二个字符串,以空格分隔 |
45、去除符号信息 - strip
1 | # 从特定文件中剥掉一些符号信息和调试信息,使文件变小以及防止反编译 |
46、动态库配置 - ldconfig
linux环境下,运行时库默认会搜寻/lib和/usr/lib。但是除此之外还有一个配置文件/etc/ld.so.conf与配置文件夹/etc/ld.so.conf.d能设置除上述两个路径之外的库文件,其配置更新的命令就是ldconfig:
1 | # 使用方法 |
47、内核审计管理 - auditctl
使用auditctl命令可以对内核中的审计系统进行控制,可以用来获取audit状态和添加/删除audit规则:
1 | # 报告内核的审计子系统状态 |
48、防火墙管理 - iptables
iptables的主要功能是实现对网络数据包进出设备及转发的控制:
1 | # 查看iptables列表 |
49、进程间通信信息 - ipcs
多进程间通信常用的技术手段包括共享内存、消息队列、信号量,他们均可使用ipcs命令查看
1 | # 信号量查询 |
50、远程端口查询 - telnet
查看远程IP的某个端口是否存活,可以使用telnet命令:
1 | # 端口未打开 |
51、换行符格式转换 - dos2unix/unix2dos
windows的换行符为CR LF(\r\n),linux的换行符为LF(\n),使用dos2unix/unix2dos命令可方便地转换:
1 | # CR LF -> LF |
52、修改二进制rpath - chrpath/patchelf
可以直接修改二进制库的rpath
1 | # 查看rpath |
53、数据包截获 - tcpdump
网络数据采集分析工具
1 | # 截获来自某IP的数据包 |
54、不挂起 - nohup
由终端拉起的进程,即使终端退出也不杀死进程
1 | # 示例 |
0x04 Linux Shell命令
1 | 1 首行指令 |
1、首行指令
首行指令用于声明使用的终端:
1 |
2、变量声明
注意’=’左右不能有空格
1 |
|
3、常用表达式
1 | # 文件表达式 |
4、文件生成
1 |
|
5、命令执行
命令执行使用 ‘ ` ‘ 符号包含,将返回的打印结果赋给左值:
1 |
|
6、后台运行
添加&运行后,在当前终端可以继续执行其他的命令
1 |
|
7、脚本调用
脚本调用有三种方法:
1 | # 方法一: fork |
8、流程语句
1 | # if语句 |
9、交互语句
1 | read -p "If you need clean(Y/n):" clean |
10、数组运算
1 | A=(a b c def) |
11、系统判断
1 | if [[ "$OSTYPE" == "linux-gnu" ]]; then |
12、守护进程
1 | while true; |
13、文件操作
1 | # 读取文件某key对应的value |
14、杀死进程
1 | # 在shell脚本中杀死某进程名的进程 |
15、参数传递
1 |
|
16、去除别名
1 | # 在指令前加上反斜杠,可以忽略掉 alias 的指定选项。 |
17、随机数生成
1 | # 生成数组中的某个数 |
18、字符串分割
1 |
|
0x05 Linux系统日志系统
历史记录
命令 | 功能 |
---|---|
last | grep reboot | 查看重启的命令 |
history | 历史终端操作 |
history -c | 删除历史终端操作 |
查看文件
命令 | 功能 |
---|---|
tail -f /var/log/* | 实时查看那个文件 |
cat /var/log/message | 查看那个文件 |