Top命令参数相关系统知识总结

平均负载

平均负载是指单位时间内,系统处于可运行状态(R 状态 Running 或 Runnable)和不可中断状态(Uninterruptible Sleep,也称为 Disk Sleep) 的平均进程数,也就是平均活跃进程数,它和 CPU 使用率并没有直接关系

进程状态

linux中断机制

参考

什么是中断机制?

操作系统需要管理外设,但是外设的速度远远低于CPU的速度,所以我们需要一种机制来弥补这种速度鸿沟,提高CPU的效率。

为此我们引入了中断机制,让外设在需要操作系统处理外设相关事件的时候,能够主动通知操作系统,即打断操作系统和应用的正常执行,让操作系统完成外设的相关处理,然后在恢复操作系统和应用的正常执行。

当CPU收到中断或者异常的事件时,它会暂停执行当前的程序或任务,通过一定的机制跳转到负责处理这个信号的相关处理例程中,在完成对这个事件的处理后再跳回到刚才被打断的程序或任务中

硬中断

由与系统相连的外设(比如网卡、硬盘)自动产生的。主要是用来通知操作系统系统外设状态的变化。比如当网卡收到数据包的时候,就会发出一个中断。我们通常所说的中断指的是硬中断(hardirq)。

软中断

为了满足实时系统的要求,中断处理应该是越快越好。linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。

buff/cache

过高时会导致物理内存占用过高

Swap交换分区

Swap分区在系统的物理内存不够用的时候,把硬盘内存中的一部分空间释放出来,以供当前运行的程序使用。那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap分区中,等到那些程序要运行时,再从Swap分区中恢复保存的数据到内存中

虚拟内存

虚拟内存计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等。

服务器挖矿木马[kthreaddi]处理记录

参考

[kthreaddi]挖矿病毒处理,终于解决了!

Linux – kthreaddi 进程导致CPU超高问题 处理记录

处理服务器恶意程序 kthreaddi挖矿

记服务器被入侵挖矿病毒kthreaddi处理解决过程思路

第一次处理

使用参考链接2方式,清除了定时任务,kill -s 9 进程之后正常了。由于同事离职没有收到反馈并继续观察。

第二次处理

后续接手项目,发现又有了继续按原方法清理定时任务,发现一条特别的定时任务,路径在/data/wwwroot/default/phpmyadmin 下,[kthreaddi]进程用户是www可能是通过php web方式注入的。看了一下使用oneinstack脚本后没有删除默认工具目录,于是删除default目录。然后禁用nginx默认虚拟主机使其无法通过ip访问,使用安全组关闭其他端口只开放常用端口。

kill 进程,发现没有用还是会自动重启,看了参考链接1的方式,得到灵感猜想可能有另一个进程负责重启[kthreaddi]进程。使用netstat -ltnp命令发现了一个非法进程监听 52281端口

于是kill 掉 非法进程,然后kill 掉 [kthreaddi] 进程,top命令观察发现正常了。

总结

此类木马通过定时任务重启,也可能结合systemd 或init脚本开机自启, 也可能使用其它伪装的正常进程来重启

延展阅读,更复杂案例top查看不到进程

应急响应:记一次花样贼多的挖矿病毒

Linux挖矿木马的技术演进探讨

Shell学习资料笔记

极客时间

https://github.com/geektime-geekbang/geekbanglinux/tree/master/ppt

Bash4.0 中文手册

Bash4.0 英文手册

https://www.gnu.org/savannah-checkouts/gnu/bash/manual/bash.html

Bash教程

https://wangdoc.com/bash/index.html

explainshell

https://explainshell.com/

Shell常用语法和案例

简单笔记

执行方式 bash ./xxx.sh ./xxx.sh (子进程运行) | source ./xxx.sh . xxx.sh (当前进程运行,会更改当前目录)

bash ./xxx.sh 可以不需要赋予执行权限 其它的方式需要 chmod u+x(r) xxx.sh

内建命令不需要创建子进程,对当前shell生效

环境变量配置

Linux环境变量设置/etc/profile、/etc/bashrc、~/.profile、~/.bashrc区别

Linux下/etc/profile 文件和/etc/profile.d区别以及相关说明

/etc/profile.d/目录增加脚本,或者/etc/profile增加内容后执行如下命令生效

source /etc/profile

linux开发环境 软件多版本共存方案

原理很简单,linux一切都是文件,多安装几个版本,软件名称和相关的配置用名字区分开即可。另一种方案是使用docker本文不做介绍

composer

运行composer 表示1版本 composer2表示2版本

PHP

多版本php共存,php是基于oneinstack安装的,通过软链接创建php默认版本,写个shell脚本方便切换。图中 php就是软链接。另一种现有php多版本解决方案是宝塔linux,是使用python写的运维工具

Linux进程管理 常用命令和工具

参考

极客时间

Linux命令搜索

10分钟教会你看懂 top

《linux编程基础》

top 显示或管理执行中的程序

头部信息

显示项说明
top – 09:44:56当前系统时间
up 43 min系统已经运行时间43分钟
1 user当前登录用户数量
load average: 0.24, 0.40, 0.53三个数字对应1 分钟、5 分钟、15 分钟的平均负载
进程信息Tasks 第二行
349 total系统中的进程数量349个
2 running处于运行态的进程数量
346 sleeping处于睡眠态的进程数量
0 stopped处于停止态的进程数量
0 zombie处于僵尸态的进程数量
CPU信息 %Cpu(s) 第三行
0.3 us用户占用cpu百分比 us=user
0.2 sy系统占用cpu百分比 sy=system
0.0 ni用户进程空间内改变过优先级的进程占用cpu百分比 ni=nice
99.3 id空闲进程占用cpu百分比 id=idle
0.1 wa硬件设备I/O 等待占用 占用cpu百分比 wa=wait
0.0 hi硬中断占用cpu百分比 hi=hardirq
0.0 si软中断占用cpu百分比 si=softirq
0.0 st虚拟机被hypervisior(虚拟监视器)偷去的时间所占的百分比
内存信息MiB(单位) Mem 第四行
15896.6 total物理内存总量
10442.7 free 空闲内存总量
2328.9 used使用的物理内存总量
3125.1 buff/cache缓冲内存(缓存) 内存总量
交换分区信息(虚拟内存)MiB(单位) Swap 第五行
2048.0 total交换区总容量
2048.0 free空闲交换区总容量
0.0 used使用的交换区总量
12667.6 avail Mem可用交换区总量

进程列表标题头

标题头说明
PID进程PID 进程的唯一标识
USER进程的运行用户
PR进程优先级
NInice值用来控制进程优先级 对应nice命令操作
VIRT虚拟内存大小,即进程使用的虚拟内存总量,单位为K
RES常驻内存及大小,即进程使用的违背换出的物理内存大小,单位为B
SHR共享内存大小,单位为KB
S进程状态 对应PS命令的中的STAT
%CPU上次更新到现在的CPU时间占用,默认按此值排序
%MEM进程使用物理内存站总内存的百分比
TIME进程占CPU的总时长,单位为1/100秒

快捷键

热键说明
M根据常驻内存集RES大小为进程排序
P根据%CPU为进程排序
T根据TIME + 为进程排序
r重置一个进程的优先级
i忽略限制和僵尸进程
k终止一个进程

htop [非内部命令]一个互动的进程查看器,可以动态观察系统进程状况

top的升级版

ps 报告当前系统的进程状态

ps -aux| grep 进程名称 //查看指定名称的进程
ps -aux| grep php-fpm |wc -l //统计php-fpm进程数量

pstree 以树状图的方式展现进程之间的派生关系

kill 发送信号到进程

kill -s 9 PID //杀死进程

skill 向选定的进程发送信号冻结进程 用于向选定的进程发送信号,冻结进程。这个命令初学者并不常用,深入之后牵涉到系统服务优化之后可能会用到。

killall 使用进程的名称来杀死一组进程 我们可以使用kill命令杀死指定进程PID的进程,如果要找到我们需要杀死的进程,我们还需要在之前使用ps等命令再配合grep来查找进程,而killall把这两个过程合二为一,是一个很好用的命令。

pkill 可以按照进程名杀死进程 pkill和killall应用方法差不多,也是直接杀死运行中的程序;如果您想杀掉单个进程,请用kill来杀掉。

查看进程所在目录

ll /proc/{PID}  //{PID}为进程pid

进程启动管理

chkconfig 检查或设置系统的各种服务

systemctl 系统服务管理器systemd指令

strace  是一个集诊断、调试、统计与一体的工具

文件系统基础知识

参考

概念

磁盘文件系统 操作磁盘,存储文件

闪存文件系统 操作移动设备,存储文件

数据库文件系统

文件管理方面的一个新概念是一种基于数据库的文件系统的概念。不再(或者不仅仅)使用分层结构管理,文件按照他们的特征进行区分,如文件类型、专题、作者或者亚数据进行区分。于是文件检索就可以按照SQL风格甚至自然语言风格进行。例如BFS[1]WinFS

网络文件系统

NFS,Network File System是一种将远程主机上的分区(目录)经网络挂载到本地系统的一种机制

常见文件系统介绍

RAW文件系统是一种磁盘未经处理或者未经格式化产生的文件系统,最快的方法是立即格式化

FAT32

  • 操作系统 Win95OSR2之后/Linux
  • 扇区范围 512bytes~64KB
  • 最大单一文件 2bytes-4GB
  • 最大格式化容量 2TB(但NT内核系统限制为32GB)
  • 档案数量 4194304

NTFS

  • 操作系统 Win2000之后 /Linux Ubuntu默认支持 Centos需要安装软件支持
  • 扇区范围 512bytes~ 64KB
  • 最大单一文件 受最大分割容量
  • 最大格式化容量 2TB~256TB(受MBR影响)
  • 档案数量 无-不受限制

centos安装ntfs支持

centos7  

unix系统哲学一切都是文件

linux 设备和文件目录

设备设备在Linux中的文件名
IDE硬盘/dev/hd[a-d]
SCS/SATA/USB硬盘/dev/sd[a-p]
U盘/dev/sd/[a-p] 与SATA相同
软驱/dev/fd[0-1]
打印机25针:/dev/ip[0-2]
USB:/dev/usb/lp[0-15]
鼠标USB:/dev/usb/mouse[0-15]
PS2:/dev/psaux
当前CD ROM/DVD ROM/dev/cdrom
当前鼠标/dev/mouse
磁带机IDE:/dev/ht0
SCSI:/dev/st0
目录说明
/根目录,zhhibaohao只包含目录不包含具体文件
/bin存放可执行文件
/dev存放设备文件
/rootroot用户的工作目录
/home普通用户的工作目录
/lib存放动态链接库文件,类似于Win的dll,一般以SO结尾;也存放与内核相关的文件
/boot启动时用到的文件,内核,引导程序
/etc系统管理文件,配置文件
/mnt挂载存储设备的挂载目录
/proc系统内存映射直接通过访问目录获取系统信息
/opt附加应用目录
/tmp存放临时文件系统重启后不会保存
/swp虚拟内存交换文件
/usr用户程序/usr/bin 库文件/usr/lib 文档/usr/share/doc

linux tmpsf 文件系统

字符编码知识 乱码原因

参考

字符编码基础知识其一

字符编码笔记:ASCII,Unicode 和 UTF-8 ——阮一峰

分享一下我所了解的字符编码知识

字符编码详解及由来(UNICODE,UTF-8,GBK)

字符编码详解(基础) ——PHP鸟哥

文件和字符编码

编码方式之ASCII、ANSI、Unicode概述

字节(Byte或byte):计算机系统中用于计量存储容量的一种计量单位, 1B=8bit

字符(Character)是各种文字和符号的总称,包括各国家文字、标点符号、图形符号、数字等,但是一个字符在计算机中占用多少字节是与编码方式有关的,不同的编码方式占用的内存不一样。例如:标点符号+是一个字符,汉字我们是两个字符,在GBK编码中一个汉字占2个字节,在UTF-8编码中一个汉字占3个字节。

mysql(utf8mb4编码)中varchar(255) 255是字符长度不需要考虑不同字符(中文,英文)字节占用问题这是mysql底层处理的

字节字符有什么联系和区别呢?简单来说字节是计算机存储和操作的最小单位,字符是人们阅读的最小单位;字节是存储(物理)概念,字符是逻辑概念;字节代表数据(内涵和本质),字符代表其含义字符由字节组成
举几个例子说明两者区别:“中国”包含2个字符,GBK编码表示需要4个字节,UTF-8编码需要6个字节;数字“1234567890”,包含10个字符,用int32类型表示只需4个字节

编码规范 随着计算机的普及,人们希望能在计算机中显示字符,但是计算机只能显示0和1这样的二进制数,为了显示字符,国际组织就制定了编码规范,希望使用不同的二进制数来表示代表不同的字符,这样电脑就可以根据二进制数来显示其对应的字符。所谓字符集其实就是一套编码规范中的子概念,所以我们通常就称呼其为XX编码,XX字符集。例如:GBK 编码规范,根据这套编码规范,计算机就可以在中文字符和二进制数之间相互转换。而使用GBK编码就可以使计算机显示中文字符。

字库表 一套编码规范不一定包含世界上所有的字符,每套编码规范都有自己的使用场景,而字库表就存储了某种编码规范中能显示的所有字符,计算机就是根据二进制数字库表中找到与之对应的字符然后显示给用户的字库表相当于一个存储字符的数据库。例如:几乎所有汉字都保存在GBK 编码规范的字库表中。所以可以显示汉字,但法语,俄语并不在其字库表中,所以使用GBK编码的文档不能正常显示法语,俄语等不包含在其字库表中的字符。

编码字符集(字符集)在一个字库表中,每一个字符都有一个对应的二进制地址,而编码字符集就是这些地址的集合。字符集定义了字符和二进制的对应关系,为每个字符分配了唯一的编号。可以将字符集理解成一个很大的表格,它列出了所有字符和二进制的对应关系,计算机显示文字或者存储文字,就是一个查表的过程

字符编码(编码方式 )而字符编码规定了如何将字符的编号存储到计算机中,如果使用了类似 GB2312 和 GBK 的变长存储方案(不同的字符占用的字节数不一样),那么为了区分一个字符到底使用了几个字节,就不能将字符的编号直接存储到计算机中,字符编号在存储之前必须要经过转换,在读取时还要再逆向转换一次,这套转换方案就叫做字符编码。

字符集和字符编码的关系

通常特定的字符集采用特定的编码方式(即一种字符集对应一种字符编码(例如:ASCII、IOS-8859-1、GB2312、GBK,都是即表示了字符集又表示了对应的字符编码,但Unicode不是,它采用现代的模型)),因此基本上可以将两者视为同义词
字符和字符编码的异同可参见:https://www.cnblogs.com/lanhaicode/p/11214827.html

粗略总结

  • 解码过程:一个较短的二进制数,通过一种编码方式,转换成编码字符集中正常的地址,然后在字库表中找到一个对应的字符,最终显示给用户。  
  • 编码过程:字库表中的一个文字或符号,在字符集中找到对应的二进制串,然后通过一种编码方式,存储到计算机存储设备中

常见的编码规范及其发展过程

单字节

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码),是最早产生的编码规范,共128个字符,用7位二进制表示(00000000-01111111即0x00-0x7F),可以看出ASCII码只需要1个字节的存储空间,它没有特定的编码方式,直接使用地址对应的二进制数来表示,非要说那就叫他ASCII 编码方式。可以表示阿拉伯数字和大小写英文字母,以及一些简单的符号。

EASCII(Extended ASCII),256个字符,用8位二进制表示(00000000-11111111即0x00-0xFF)。当计算机传到了欧洲,国际标准化组织在ASCII的基础上进行了扩展,形成了ISO-8859标准,跟EASCII类似,兼容ASCII,在高128个码位上有所区别。ISO-8859-1编码范围使用了单字节内的所有空间,在支持ISO-8859-1的系统中传输和存储其他任何编码的字节流都不会被抛弃。换言之,把其他任何编码的字节流当作ISO-8859-1编码看待都没有问题。这是个很重要的特性

MySQL数据库默认编码是Latin1就是利用了这个特性。ASCII编码是一个7位的容器,ISO-8859-1编码是一个8位的容器。由此可见,ISO-8859-1只占1个字节,且MySQL数据库默认编码就是ISO-8859-1,有时,tomcat服务器默认也是使用ISO-8859-1编码,然而ISO-8859-1是不支持中文的,有时这就是在浏览器上显示乱码的原因。但是由于欧洲的语言环境十分复杂,所以根据各地区的语言又形成了很多子标准,ISO-8859-1、ISO-8859-2、ISO-8859-3、……、ISO-8859-16。 

双字节  

当计算机传到了亚洲,256个码位就不够用了。于是乎继续扩大二维表,单字节改双字节,16位二进制数,65536个码位。在不同国家和地区又出现了很多编码,中国的GB2312港台的BIG5、日本的Shift JIS,韩国的Euc-kr等等。


GBK全称《汉字内码扩展规范》,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字。GBK字符集中所有字符占2个字节,不论中文英文都是2个字节。 没有特殊的编码方式,习惯称呼GBK 编码。

一般在国内,汉字较多时使用。GBK(Chinese Internal Code Specification)是GB2312的扩展,GBK 向下与 GB 2312 编码兼容,向上支持 ISO 10646.1国际标准,是前者向后者过渡过程中的一个承上启下的产物。ISO 10646 是国际化标准组织 ISO 公布的一个编码标准,即 Universal Multilpe-Octet Coded Character Set(简称UCS),与 Unicode 组织的 Unicode 编码完全兼容。
GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字,完全兼容GB2312-80标准,支持国际标准ISO/IEC10646-1和国家标准GB13000-1中的全部中日韩汉字,并包含了BIG5编码中的所有汉字。 

多字节

当互联网席卷了全球,地域限制被打破了,不同国家和地区的计算机在交换数据的过程中,由于之前出现的各种不同的编码方式,文本就会出现乱码的问题,即对同一组二进制数据,不同的编码会解析出不同的字符。而当某个字符集中没有文本中的字符编码时,就会出现乱码。

通用字符集UCS(Universal Character Set)对应两种编码:对每一个字符采用四个8比特字节编码的称为UCS-4,对每一个字符采用两个8比特字节编码的称为UCS-2。

Unicode字符集的出现就是为了解决这个问题。Unicode 是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母AinU+0041表示英语的大写字母AU+4E25表示汉字。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表

需要注意的是,Unicode 只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

比如,汉字的 Unicode 是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说,这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

这里就有两个严重的问题,第一个问题是,如何才能区别 Unicode 和 ASCII ?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个问题是,我们已经知道,英文字母只用一个字节表示就够了,如果 Unicode 统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

它们造成的结果是:1)出现了 Unicode 的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示 Unicode。2)Unicode 在很长一段时间内无法推广

互联网的普及,强烈要求出现一种统一的编码方式。UTF-8 就是在互联网上使用最广的一种 Unicode 的实现方式。其他实现方式还包括 UTF-16(字符用两个字节或四个字节表示)和 UTF-32(字符用四个字节表示),不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8 是 Unicode 的实现方式之一。

BOM

BOM(字节顺序标记, byte-order mark)也是我们常见到的名词, 比如我们的代码文件都要求使用UTF-8无BOM形式保存, 不然有可能编译不过, 或者出现一些诡异的事情.
BOM实际上是位于码位U+FEFF的Unicode字符的名称.
对于UTF-16, UCS-2, UTF-32 / UCS-4这类码元不是8位的编码方式来说, 编码后的数据要存储/传输时, 必然会有字节序的问题, BOM出现在字节流的开头, 则用于标识该字节流的字节序. 各编码方案按自己的方式对U+FEFF进行编码, 放在头部即可标志编码该字节流时使用的字节序.
比如, 当我们知道即将读取的字节流以UTF-16编码, 字节序未知, 读到的前两个字节是0xFF, 0xFE, Unicode中U+FFFE则不映射到字符, 而这两个字节必定是编码的U+FEFF, 因此可以判断当前字节流使用小端序, 即UTF-16 LE

对于UTF-8, 由于它使用的是8位的码元, 不存在字节序的问题, 也不建议在头部添加BOM, 因为可能影响到一些工具, 因此使用无BOM的UTF-8成了主流.

ANSI

ANSI全称(American National Standard Institite)美国国家标准学会(美国的一个非营利组织),首先ANSI不是指的一种特定的编码,而是不同地区扩展编码方式的统称,各个国家和地区所独立制定的兼容ASCII,但互相不兼容的字符编码,微软统称为ANSI编码

总结对照

常用的字符编码ASCII,GBK,GB2312,BIG5,UTF-8 英文和中文简繁

Unicode字符集的编码方式有UTF-8,UTF-16,UTF-32

中文乱码产生的原因

PHP获取中文的第一个字符

//多字节字符串 PHP文件编码为UTF-8
$str = '你好PHP';
var_dump($str[0]); //输出结果 b"ä",乱码
var_dump(substr($str, 0, 1));//输出结果 b"ä",乱码
var_dump(substr($str, 0, 3));//输出结果 你 ,utf-8编码中一个汉字是三个字节
var_dump(mb_substr($str, 0, 1));//输出结果 你

PHP处理字符串的方式默认是把字符串作为单字节字符处理的,例如数组方式取字符和普通字符串函数

PHP处理多字节字符串需要用这些扩展 国际化与字符编码支持 常用的有mbstring 扩展和 iconv 函数

mbstring扩展支持的编码 https://www.php.net/manual/zh/mbstring.supported-encodings.php

iconv_get_encoding 获取 iconv 扩展的内部配置变量,

文本文件和二进制的区别

文本文件是二进制文件的一种,底层存储也是0和1;文本文件可读性和移植性好,但表现字符有限;二进制文件数据存储紧凑,无字符编码限制。文本文件基本上只能存放数字、文字、标点等有限字符组成的内容;二进制没有字符约束,可随意存储图像、音视频等数据。

用存储数字的例子可以形象的看出文本文件和二进制文件存储内容上的差异。例如要存储数字1234567890,文本文件要存储0-9这十个数字的ASCII码,对应的十六进制表示为:31 32 33 34 35 36 37 38 39 30,占用10个字节;1234567890对应的二进制为“‭0100 1001 1001 0110 0000 0010 1101 0010‬”,占用4个字节(二进制表示32位,一个字节8位),存储到文件的16进制表示为(大端):49 96 02 D2。

文本文件按字符存放内容,二进制按字节存放,这是两种文件最本质的区别。根据这个特性,可以推断出一些常见结论:二进制文件常常比文本文件紧凑,占用空间少;文本文件更友好易用,能用所见即所得的方式编辑;二进制文件常常需要专用程序打开,等等。

回过头看文本编辑器打开二进制文件常常是乱码的现象。例如一个二进制文件存放了一个整数1234(四个字节),用16进制表示为:00 00 04 D2。文本编辑器打开后逐个字符解释,会发现这几个字节拼不出可显示的字符,只好乱码相待。乱码的原因是文本编辑器不能正确解析字节流,这也是二进制文件需要用专用软件打开的原因。例如jpg文件要用看图软件打开,如果用音乐播放器打开,完蛋!视频文件要用播放器打开,用压缩软件打开,歇菜!有的专用软件会做处理打开不支持的格式后不做反应,有的会报错。

文件格式

Windows按文件拓展名识别文件格式,并调用对应的程序打开文件;

(类)Unix系统,拓展名可有可无,有file命令,这个命令可以告诉我们文件到底是什么格式文件拓展名不是文件格式的本质区别,内容才是。把a.zip改成a.txt/a.jgp/a.mp3,无论什么文件名,file都让其原形毕露:Zip archive data, at least v1.0 to extract。file命令的工作原理可这篇文章

PHP读取txt文本文件获取第一个字符乱码

参考

PHP检测文件BOM头

ANSCII编码对照表

有一个ASCII的编码的文本文件,在linux上打开会显示乱码,因此使用windows记事本打开转成了UTF-8编码,然后用php读取该文本文件第一个字符时出现乱码,原因是windows记事本保存文件时会给文本文件增加bom头。

php检测处理bom头的原理,就是用ord函数检测前三个字符在ASCII编码中的数字是否为239,187,191

if (ord($contents[0]) === 239 && ord($contents[1]) === 187 && ord($contents[2]) == 191)
{
   $contents = substr($contents, 3);
   var_dump($contents[0]);
}

对应的字符如下

用户的操作系统类型是不确定,因此文本文件的字符编码也无法确定 ,需要对用户上传的文本文件转换字符编码

$fileContents = file_get_contents($path);//读取文件字符串,此处可以用框架方法替代
$encoding = mb_detect_encoding($fileContent, ['ASCII', 'GBK', 'GB2312', 'BIG5', 'UTF-8']);//获取文件内容编码
$fileContent = mb_convert_encoding($fileContent, 'UTF-8', $encoding);//转码
//$contents = iconv($encoding, 'UTF-8', $contents);//iconv也可以

Systemd 基础使用

Linux默认启动采用init进程,init进程是所有进程的父进程

sudo /etc/init.d/apache2 start
service apache2 start

上述启动方式缺点:

  • 启动时间长,init进程是串行启动,即按顺序一个接一个的启动
  • 启动脚本复杂,init进程只是执行启动脚本,不管其它事情,脚本需要自己处理,这使得脚本变得很长

Systemd 就是为了解决init方式启动的问题诞生的.他的设计目标是,微系统启动和管理提供一套完整的解决方案

根据linux管理字母d (daemon)是守护进程的缩写.Systemd,的含义就是整个系统的守护进程. 作者Lennart Poettering

systemd架构图
任务旧指令新指令
使某服务自动启动chkconfig –level 3 httpd onsystemctl enable httpd.service
使某服务不自动启动chkconfig –level 3 httpd offsystemctl disable httpd.service
检查服务状态service httpd statussystemctl status httpd.service (服务详细信息) systemctl is-active httpd.service (仅显示是否 Active)
显示所有已启动的服务chkconfig –listsystemctl list-units –type=service
启动服务service httpd startsystemctl start httpd.service
停止服务service httpd stopsystemctl stop httpd.service
重启服务service httpd restartsystemctl restart httpd.service
重载服务service httpd reloadsystemctl reload httpd.service
对比

常用命令

Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面

$ systemctl --version //查看版本

$ systemctl --version
systemd 237
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid

systemctl 是systemd的主命令,用于管理系统

$ sudo systemctl reboot //重启系统

$ sudo systemctl poweroff //关闭系统 切断电源

$ sudo systemctl halt //cpu 停止工作

$ sudo systemctl suspend //暂停系统

$ sudo systemctl hibernate //让系统进入冬眠状态

$ sudo systemctl hybrid-sleep //让系统进入交互式休眠状态

$ sudo systemctl rescue //启动进入救援状态 单用户状态

一旦修改配置文件,就要让 SystemD 重新加载配置文件,然后重新启动,否则修改不会生效。

$ sudo systemctl daemon-reload
$ sudo systemctl restart httpd.service

systemd-analyze 分析启动进程

# systemd-analyze
Startup finished in 487ms (kernel) + 2.776s (initrd) + 20.229s (userspace) = 23.493s

systemd-analyze blame 分析启动时各个进程花费的时间

# systemd-analyze blame
8.565s mariadb.service
....

systemd-analyze critical-chain 分析启动时的关键链

# systemd-analyze critical-chain
The time after the unit is active or started is printed after the "@" character.
The time the unit takes to start is printed after the "+" character.
multi-user.target @20.222s
└─mariadb.service @11.657s +8.565s
......

systemctl list-unit-files 列出所有可用单元

# systemctl list-unit-files
UNIT FILE                                   STATE   
proc-sys-fs-binfmt_misc.automount           static  
.....

systemctl list-units 列出所有运行中单元

# systemctl list-units
UNIT                                        LOAD   ACTIVE SUB       DESCRIPTION
proc-sys-fs-binfmt_misc.automount           loaded active waiting   Arbitrary Executable File Formats File Syste
evices-pl...erial8250-tty-ttyS2.device loaded active plugged 
...
systemctl list-units  列出所有失败单元
UNIT          LOAD   ACTIVE SUB    DESCRIPTION
kdump.service loaded failed failed Crash recovery kernel arming
...

systemctl is-enabled crond.service 检查某个单元(如 cron.service)是否启用

# systemctl is-enabled crond.service
enabled

systemctl kill httpd 使用systemctl命令杀死服务

# systemctl kill httpd

systemd-cgtop 按CPU、内存、输入和输出列出控制组

# systemd-cgtop
Path                                                              Tasks   %CPU   Memory  Input/s Output/s
/                                                                    83    1.0   437.8M        -        -
/system.slice                                                         -    0.1        -        -        -
...  

查看日志

Systemd 统一管理所有 Unit 的启动日志

journalctl命令,查看所有日志(内核日志和应用日志)

日志的配置文是/etc/systemd/journald.conf

#排错常用
#-xe是排查问题时最常用的参数:
#-e 从结尾开始看
#-x 相关目录(如:问题相关的网址)
sudo journalctl -xe 

#查看所有日志(默认情况下 ,只保存本次启动的日志)
$ sudo journalctl

# 查看内核日志(不显示应用日志)
$ sudo journalctl -k

# 查看系统本次启动的日志
$ sudo journalctl -b
$ sudo journalctl -b -0

# 查看上一次启动的日志(需更改设置)
$ sudo journalctl -b -1

# 查看指定时间的日志
$ sudo journalctl --since="2012-10-30 18:17:16"
$ sudo journalctl --since "20 min ago"
$ sudo journalctl --since yesterday
$ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00"
$ sudo journalctl --since 09:00 --until "1 hour ago"

# 显示尾部的最新10行日志
$ sudo journalctl -n

# 显示尾部指定行数的日志
$ sudo journalctl -n 20

# 实时滚动显示最新日志
$ sudo journalctl -f

# 查看指定服务的日志
$ sudo journalctl /usr/lib/systemd/systemd

# 查看指定进程的日志
$ sudo journalctl _PID=1

# 查看某个路径的脚本的日志
$ sudo journalctl /usr/bin/bash

# 查看指定用户的日志
$ sudo journalctl _UID=33 --since today

# 查看某个 Unit 的日志
$ sudo journalctl -u nginx.service
$ sudo journalctl -u nginx.service --since today

# 实时滚动显示某个 Unit 的最新日志
$ sudo journalctl -u nginx.service -f

# 合并显示多个 Unit 的日志
$ journalctl -u nginx.service -u php-fpm.service --since today

# 查看指定优先级(及其以上级别)的日志,共有8级
# 0: emerg
# 1: alert
# 2: crit
# 3: err
# 4: warning
# 5: notice
# 6: info
# 7: debug
$ sudo journalctl -p err -b

# 日志默认分页输出,--no-pager 改为正常的标准输出
$ sudo journalctl --no-pager

# 以 JSON 格式(单行)输出
$ sudo journalctl -b -u nginx.service -o json

# 以 JSON 格式(多行)输出,可读性更好
$ sudo journalctl -b -u nginx.serviceqq
 -o json-pretty

# 显示日志占据的硬盘空间
$ sudo journalctl --disk-usage

# 指定日志文件占据的最大空间
$ sudo journalctl --vacuum-size=1G

# 指定日志文件保存多久
$ sudo journalctl --vacuum-time=1years

相关文章

Systemd 入门教程:命令篇

systemctl 命令完全指南

systemctl

物理机安装Linux系统采坑记录

此处物理机指普通的PC电脑和笔记本非服务器

基础知识

boot是可引导bai光盘,iso是国际标du准光盘格式(全世界zhi能读DVD的设备都支持),udf是统一光盘dao格式(Universal Disc Format,全世界能读DVD的设备绝大多数都支持)

通常电脑主板支持两种模式 UEFI和BIOS

UEFI

百科

BIOS

百科

UEFI Bios支持两种启动模式

Legacy+UEFI启动模式和UEFI启动模式,其中Legacy+UEFI启动模指的是UEFI和传统BIOS共存模式,可以兼容传统BIOS引导模式启动操作系统;UEFI启动模式只是在UEFI引导模式启动操作系统。

  选定启动模式并安装操作系统,安装后只能使用设定的模式,用于启动操作系统;
  操作系统安装时使用Legacy+UEFI模式,兼容在传统BIOS引导模式启动操作系统;
  操作系统安装时使用UEFI引导模式,只能在UEFI引导模式启动操作系统。

Legacy+UEFI模式与UEFI模式的区别

    1、Legacy+UEFI启动模式是基于某些电脑硬件设备和操作系统(如WinXP/7)还不支持基于UEFI BIOS的情况,考虑从传统BIOS引导模式启动。传统BIOS引导模式允许Hba,模块设备使用Rom选项。

    2、UEFI启动模式用于操作系统自动从预启动的操作环境,加载到一种操作系统上,从而使开机程序化繁为简,节省时间。并且支持2T以上硬盘,加强对硬件的支持

boot.iso为网络安装版,dvd1为完整安装版

linux刻录

dd bs=4M if=ubuntu-19.10-desktop-amd64.iso of=/dev/sdc status=progress
2463842304字节(2.5 GB)已复制, 587.050253 s, 4.2 MB/s
记录了587+1 的读入
记录了587+1 的写出
2463842304字节(2.5 GB)已复制,587.361 秒,4.2 MB/秒

bs代表字节为单位的块大小 if镜像文件 of输出设备 status=progress 显示进度

刻录centos8时无法启动,iso文件正常是阿里云下载的使用file命令查看包含MBR分区信息,最后发现问题是文件系统问题,用linux刻录linux系统时推荐是ext4文件系统,也可能只有centos8的镜像有这个问题,其它版本和系统没有验证

file CentOS-8.2.2004-x86_64-dvd1.iso

CentOS-8.2.2004-x86_64-dvd1.iso: DOS/MBR boot sector; partition 2 : ID=0xef, start-CHS (0x3ff,254,63), end-CHS (0x3ff,254,63), startsector 23800, 20380 sectors

在dd后,需要把优盘再次格式化为fat32文件系统,参考

出现isolinux.bin missing or corrupt错误

参考

linux下制作u盘启动盘

是因为磁盘目录 of=/dev/sdc 末尾有数字需要去掉

Device     Boot Start       End   Sectors  Size Id Type
/dev/sdd4  *      256 125033618 125033363 59.6G  c W95 FAT32 (LBA)

fdisk -l 显示的磁盘末尾有4 刻录时选择输出路径则为 of=/dev/sdd

windows使用软碟通刻录

启动时汇报启动脚本超时无法发现/dev/root,原因是软碟通会把U盘的标签就是驱动器名称会截断比如centos-8-2-2004-x86_64 截断成centos8-2与启动项的不一致,解决方法百度有很多。个人推荐刻录windows启动盘就用windows支持的文件系统使用windows系统刻录,同理linux就用linux支持的文件系统使用dd刻录

Virtual Box (Linux) 安装增强模式

参考

  • https://www.jianshu.com/p/7c556c783bb2
  • https://www.cnblogs.com/mychangee/p/12087954.html

centos

1.点击设备->安装增加功能->下载增加镜像,底部镜像按钮挂载VBoxGuestAddtions.iso 运行

2.运行后报错,没有安装内核,需要安装内核和gcc 并且保持kernel 和kernel-devel版本一致

yum install -y kernel-devel kernel-headers gcc make

yum -y upgrade kernel kernel-devel

reboot

uname -r //查看当前启动的内核版本

rpm -qa | grep kernel-[0-9] //查看全部的内核

yum remove xxxx //删除旧版本内核

或者可以使用下面两个命令中的一个安装和Linux内核版本匹配的kernel-devel

yum install -y "kernel-devel-uname-r == $(uname -r)"

yum install -y kernel-devel-xxxx 

centos 8 报错

https://github.com/geerlingguy/packer-centos-8/issues/4

$ cat /var/log/vboxadd-setup.log
Building the main Guest Additions 6.0.12 module for kernel 4.18.0-80.7.1.el8_0.x86_64.
Error building the module.  Build output follows.
make V=1 CONFIG_MODULE_SIG= -C /lib/modules/4.18.0-80.7.1.el8_0.x86_64/build M=/tmp/vbox.0 SRCROOT=/tmp/vbox.0 -j1 modules
Makefile:958: *** "Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y, please install libelf-dev, libelf-devel or elfutils-libelf-devel".  Stop.
make: *** [/tmp/vbox.0/Makefile-footer.gmk:111: vboxguest] Error 2
Could not find the X.Org or XFree86 Window System, skipping.
modprobe vboxguest failed
yum(dnf)install -y elfutils-libelf-devel elfutils-libelf-devel.x86_64

sh VBoxLinuxAdditions.run

ubuntu desktop

#先更新
sudo apt update && sudo apt upgrade

安装增加功能

同 centos 设备 >> 安装增强功能

#根据报错信息安装如下包
sudo apt install gcc make perl

共享文件夹

挂载点要设置到登录用户的家目录/home/xxx/dirname 下,会自动创建文件夹,使用chmod和chown 修改权限无效

使用如下命令手动挂载方式,可以更改权限目录

sudo mount -t vboxsf downloads /home/www/share

ubuntu server