ps -aux --sort -rss|head -n 5 |
linux系统找出4个占用内存最多的进程 |
ps -aux|grep "D" |
找出D状态的进程 |
ps -A -ostat,ppid,pid,cmd |grep -e '^[Zz]';kill -9 Pid |
Linux系统找出僵尸进程并杀死僵尸进程 |
du -sh |
linux系统查看目录总大小 |
du -h –max-depth=0 * |
linux系统查看目录下子目录的大小 |
du -k /var/*|sort -nr //按字节大小排序 |
Linux系统查看/var目录下面文件的大小 |
ls -lSh |
Linux系统对目录下下文件按大小排序 |
ps -A -ostat,ppid,pid,cmd | grep -e '^[T]' |
linux查看已经停止进程 |
https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3/iptables |
了解iptables防火墙技术详细博客 |
systemctl stop firewalld.service |
centos7临时关闭防火墙 |
systemctl disabled firewalld.service |
centos7永久关闭防火墙 |
firewall-cmd --state |
centos7查看防火墙状态 |
systemctl start firewalld.service |
centos7开启防火墙 |
iptables -t filter -nvxL |
Linux查看防火墙过滤表(filter)的规则 |
iptables -t mangle -nvxL |
Linux查看防火墙过滤表(mangle)的规则 |
iptables -t nat -nvxL |
Linux查看防火墙过滤表(nat)的规则 |
iptables -t raw -nvxL |
Linux查看防火墙过滤表(raw)的规则 |
iptables -t raw --line -nvxL INPUT |
序号列出Linux查看防火墙过滤表(filter)中INPUT链的规则 |
iptables -t filter -F INPUT |
删除filter表中INPUT链中的所有规则的命令 |
iptables -t filter -F |
删除filter表中所有所有规则(所有链规则都被删除) |
iptables -t filter -I INPUT -s 192.168.1.1 -j DROP |
丢弃来至192.168.1.1的访问 |
iptables -t filter -I INPUT -s 192.168.1.1,192.168.1.2 -j DROP |
丢弃来至192.168.1.1,192.168.1.2 IP的访问(-s匹配多个IP用逗号隔开) |
iptables -t filter -I INPUT -s 192.168.1.0/24 -j DROP |
丢弃来至 192.168.1.0/24网段的访问 |
iptables -t filter -A INPUT ! -s 192.168.1.146 -j ACCEPT |
只要发往本机的报文的源地址不是192.168.1.146,就接受报文(!:表示取反) |
iptables -t filter -I INPUT -s 192.168.1.1 -d 10.198.1.2 -j DROP |
丢弃从192.168.1.1发往192.168.1.2这个IP的报文(IP1位源地址,IP2位目标地址,规则设在IP2服务器上) |
iptables -t filter -I INPUT -d 192.168.1.1 -j DROP |
丢弃发往目标地址1的所有数据包,源地址不指定默认位0.0.0.0(-d:指定目标地址) |
iptables -t filter -I INPUT -s 192.168.1.1 -d 10.198.1.2 -p tcp -j DROP |
丢弃从192.168.1.1发往192.168.1.2 IP的报文(IP1位源地址,IP2位目标地址,规则设在IP2服务器上,-p:匹配协议) |
iptables -t filter -I INPUT 2 -s 192.168.1.2 -j DROP |
在编号2出插入一条规则,之前编号为2的规则下移为编号3 |
iptables -t filter -A INPUT -s 192.168.1.2 -j DROP |
在filter表的INPUT链中追加一条丢弃规则 |
iptables -t filter -D INPUT 3 |
删除编号为3的规则 |
iptables -t filter -R INPUT 2 -s 192.168.1.2 -j ACCEPT |
把编号为2的链由DROP改为ACCEPT |
iptables -t filter -P FORWARD DROP |
把iptables防火墙中filter表中的FORWARD链改为DROP |
watch -n -1 "cat /sys/devices/system/cpu/cpu*/cpufreq/sacling_cur_freq" |
查看CPu动态频率 |
iostat -d -x -k 1 |
产看磁盘的详细IO情况 |
iostat -d -k 1 |
查看TPS和吞吐量信息(磁盘读写速度单位为KB) |
iostat -d -m 2 |
查看TPS和吞吐量信息(磁盘读写速度单位为MB) |
netstat -atunlpresc |
查看网络端口 |
parted /dev/sdb |
parted对sdb盘进行分区 |
mklabel gpt |
把sdb盘设置成gpt分区 |
mklabel msdos |
把sdb盘设置成MBR分区 |
mkpart primary 0 -1 |
将sdb盘整体划分成一个主分区 |
mkpart primary 0 1024M |
将sdb盘划分成第一个主分区,分区大小1024M |
mkpart primary 1024M 10240M |
将sdb盘划分成第二个主分区,分区大小9216M |
rm 1 |
删除主分区1 |
top |
在top监视下按P,按照CPU占用排序;按M则按照内存占用排序,按1查看每个逻辑CPU的负载情况 |
top -d 2 |
每隔2秒显式所有进程的资源占用情况 |
top -c |
每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名),不断按P对进程按照CPU占用量排名 |
top -Hp pid |
查看进程下的所有线程的信息 |
top -H |
然后敲1,可以看到每个CPU的占有率情况(查看所有线程) |
cat /sys/block/sda/queue/nr_requests |
查看sda盘的请求IO队列大小(nr_requests:请求的IO调度队列大小,I/O调度器中的最大I/O操作数是nr_requests * 2。读和写是分开的) |
cat /sys/block/sda/device/queue_depth |
查看落再底层sda盘上的队列深度(queue_depth:请求在磁盘设备上的队列深度,已经分配到底层设备的I/O操作是queue_depth) |
ll /etc |sort -k 2 -nr |grep -v "total" |
把/etc下面目录文件所拥有的个数从大到小排序显示(-k:以第几列为参数值排序,-v:过虑掉不要的关键字行) |
ll /etc |sort -k 5 -nr |grep -v "total" |
把/etc下面目录文件容量按照大到小排序显示(-k:以第几列为参数值排序,-v:过虑掉不要的关键字行) |
vmstat |
系统整体的CPU使用率、上下文切换次数、中断次数,海包括处于运行和不可中断状态的进程 vmstat:工具可以查看系统的内存、CPU 上下文切换以及中断次数: vmstat 1 //每隔1秒输出 procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 3 0 0 157256 3241604 5144444 0 0 20 0 26503 33960 18 7 75 0 0 17 0 0 159984 3241708 5144452 0 0 12 0 29560 37696 15 10 75 0 0 6 0 0 162044 3241816 5144456 0 0 8 120 30683 38861 17 10 73 0 0 cs:则为每秒的上下文切换次数。 in:则为每秒的中断次数。 r:就绪队列长度,正在运行或等待 CPU 的进程。 b:不可中断睡眠状态的进程数,例如正在和硬件交互 |
sar |
系统整体的CPU使用率,包括可配置的历史数据 |
ps |
每个进程的状态和CPU使用率 |
htop |
top增强版 |
lsoft |
文件打开最大数 |
pcstat |
查看文件在内存中的缓存大小以及缓存比例(pcstat 是一个基于 Go 语言开发的工具,所以安装它之前,你首先应该安装 Go 语言) |
pidstat:查看进程I/O |
pidstat -w 5 //选项查看具体进程的上下文切换次数 pidstat -wt 1 //表示输出线程上下文切换的指标 pidstat -w -p 3217281 1 10:19:13 UID PID cswch/s nvcswch/s Command 10:19:14 0 3217281 0.00 18.00 stress 10:19:15 0 3217281 0.00 18.00 stress 10:19:16 0 3217281 0.00 28.71 stress 其中cswch/s和nvcswch/s表示自愿上下文切换和非自愿上下文切换。 自愿上下文切换:是指进程无法获取所需资源,导致的上下文切换。比如说, I/O、内存等系统资源不足时,就会发生自愿上下文切换。 非自愿上下文切换:则是指进程由于时间片已到等原因,被系统强制调度,进而发生的上下文切换。比如说,大量进程都在争抢 CPU 时,就容易发生非自愿上下文切换 -d:显示I/O统计信息 -r:显示各个进程的内存使用统计 -s:堆栈的利用率 -u: CPU利用率 -w:任务切换状况 -v:显示任务的线程数和文件描述符数 |
iotop |
|
mpstat |
CPU动态使用情况 |
dstat |
I/O状况查询 |
top |
系统平均负载:是处于可运行或不可中断状态的平均进程数。 可运行进程:使用 CPU 或等待使用 CPU 的进程 不可中断状态进程:正在等待某些 IO 访问,一般是和硬件交互,不可被打断(不可被打断的原因是为了保护系统数据一致,防止数据读取错误) 系统平均负载升高的原因 一般来说,系统平均负载升高意味着 CPU 使用率上升。但是他们没有必然联系,CPU 密集型计算任务较多一般系统平均负载会上升,但是如果 IO 密集型任务较多也会导致系统平均负载升高但是此时的 CPU 使用率不一定高,可能很低因为很多进程都处于不可中断状态,等待 CPU 调度也会升高系统平均负载 |
CPU性能排查思路 |
top 系统CPU => vmstat 上下文切换次数 => pidstat 非自愿上下文切换次数 => 各类进程分析工具(perf strace ps execsnoop pstack) top 用户CPU => pidstat 用户CPU => 一般是CPU计算型任务 top 僵尸进程 => 各类进程分析工具(perf strace ps execsnoop pstack) top 平均负载 => vmstat 运行状态进程数 => pidstat 用户CPU => 各类进程分析工具(perf strace ps execsnoop pstack) top 等待IO CPU => vmstat 不可中断状态进程数 => IO分析工具(dstat、sar -d) top 硬中断 => vmstat 中断次数 => 查看具体中断类型(/proc/interrupts) top 软中断 => 查看具体中断类型(/proc/softirqs) => 网络分析工具(sar -n、tcpdump) 或者 SCHED(pidstat 非自愿上下文切换) top命令执行以后,大写M,按内存使用情况排序;大写P,按cpu使用情况排序;大写H,显示线程数 |
内存 |
整个系统的页表可以通过查询/proc/meminfo来查询,每个进程的页表大小可以查看:cat /proc/<PID>/status中的VmPTE大小 每个页(4k)需要使用一个页表项(PTE)来管理,所以一个进程对应的页表所维护物理内存大小为(物理内存+SWAP)/4k*8字节 |
pmap pid |
pmap - report memory map of a process(查看进程的内存映像信息) |
cat /proc/interrupts |
显示中断 |
cat /proc/version |
显示内核的版本 |
cat /proc/net/dev |
显示网络适配器及统计 |
cat /proc/mounts |
显示已加载的文件系统 |
ln -s file1 lnk1 |
创建一个指向文件或目录的软链接 |
ln file1 lnk1 |
创建一个指向文件的物理链接 |
rpm -q -a --qf '%10{SIZE}t%{NAME}n' | sort -k1,1n |
以大小为依据依次显示已安装的rpm包所使用的空间 (fedora, redhat类系统) |
groupadd group_name |
创建一个新用户组 |
groupdel group_name |
删除一个用户组 |
groupmod -n new_group_name old_group_name |
重命名一个用户组 |
useradd -c "Name Surname " -g admin -d /home/user1 -s /bin/bash user1 |
创建一个属于 "admin" 用户组的用户 |
useradd user1 |
创建一个新用户 |
userdel -r user1 |
删除一个用户 ( '-r' 排除主目录) |
usermod -c "User FTP" -g system -d /ftp/user1 -s /bin/nologin user1 |
修改用户属性 |
passwd user1 |
修改一个用户的口令 (只允许root执行) |
chage -E 2005-12-31 user1 |
设置用户口令的失效期限 |
pwck '/etc/passwd' |
的文件格式和语法修正以及存在的用户 |
grpck '/etc/passwd' |
的文件格式和语法修正以及存在的群组 |
newgrp group_name |
登陆进一个新的群组以改变新创建文件的预设群 |
文件的特殊属性 - 使用 "+" 设置权限,使用 "-" 用于取消 |
|
chattr +a file1 |
只允许以追加方式读写文件 |
chattr +c file1 |
允许这个文件能被内核自动压缩/解压 |
chattr +d file1 |
在进行文件系统备份时,dump程序将忽略这个文件 |
chattr +i file1 |
设置成不可变的文件,不能被删除、修改、重命名或者链接 |
chattr +s file1 |
允许一个文件被安全地删除 |
chattr +S file1 |
一旦应用程序对这个文件执行了写操作,使系统立刻把修改的结果写到磁盘 |
chattr +u file1 |
若文件被删除,系统会允许你在以后恢复这个被删除的文件 |
lsattr |
显示特殊的属性 |
打包和压缩文件 |
|
bunzip2 file1.bz2 |
解压一个叫做 'file1.bz2'的文件 |
bzip2 file1 |
压缩一个叫做 'file1' 的文件 |
gunzip file1.gz |
解压一个叫做 'file1.gz'的文件 |
gzip file1 |
压缩一个叫做 'file1'的文件 |
gzip -9 file1 |
最大程度压缩 |
rar a file1.rar test_file |
创建一个叫做 'file1.rar' 的包 |
rar a file1.rar file1 file2 dir1 |
同时压缩 'file1', 'file2' 以及目录 'dir1' |
rar x file1.rar |
解压rar包 |
unrar x file1.rar |
解压rar包 |
tar -cvf archive.tar file1 |
创建一个非压缩的 tarball |
tar -cvf archive.tar file1 file2 dir1 |
创建一个包含了 'file1', 'file2' 以及 'dir1'的档案文件 |
tar -tf archive.tar |
显示一个包中的内容 |
tar -xvf archive.tar |
释放一个包 |
tar -xvf archive.tar -C /tmp |
将压缩包释放到 /tmp目录下 |
tar -cvfj archive.tar.bz2 dir1 |
创建一个bzip2格式的压缩包 |
tar -jxvf archive.tar.bz2 |
解压一个bzip2格式的压缩包 |
tar -cvfz archive.tar.gz dir1 |
创建一个gzip格式的压缩包 |
tar -zxvf archive.tar.gz |
解压一个gzip格式的压缩包 |
zip file1.zip file1 |
创建一个zip格式的压缩包 |
zip -r file1.zip file1 file2 dir1 |
将几个文件和目录同时压缩成一个zip格式的压缩包 |
unzip file1.zip |
解压一个zip格式压缩包 |
RPM 包 - (Fedora, Redhat及类似系统) |
|
rpm -ivh package.rpm |
安装一个rpm包 |
rpm -ivh --nodeeps package.rpm |
安装一个rpm包而忽略依赖关系警告 |
rpm -U package.rpm |
更新一个rpm包但不改变其配置文件 |
rpm -F package.rpm |
更新一个确定已经安装的rpm包 |
rpm -e package_name.rpm |
删除一个rpm包 |
rpm -qa |
显示系统中所有已经安装的rpm包 |
rpm -qa | grep httpd |
显示所有名称中包含 "httpd" 字样的rpm包 |
rpm -qi package_name |
获取一个已安装包的特殊信息 |
rpm -qg "System Environment/Daemons" |
显示一个组件的rpm包 |
rpm -ql package_name |
显示一个已经安装的rpm包提供的文件列表 |
rpm -qc package_name |
显示一个已经安装的rpm包提供的配置文件列表 |
rpm -q package_name --whatrequires |
显示与一个rpm包存在依赖关系的列表 |
rpm -q package_name --whatprovides |
显示一个rpm包所占的体积 |
rpm -q package_name --scripts |
显示在安装/删除期间所执行的脚本l |
rpm -q package_name --changelog |
显示一个rpm包的修改历史 |
rpm -qf /etc/httpd/conf/httpd.conf |
确认所给的文件由哪个rpm包所提供 |
rpm -qp package.rpm -l |
显示由一个尚未安装的rpm包提供的文件列表 |
rpm --import /media/cdrom/RPM-GPG-KEY |
导入公钥数字证书 |
rpm --checksig package.rpm |
确认一个rpm包的完整性 |
rpm -qa gpg-pubkey |
确认已安装的所有rpm包的完整性 |
rpm -V package_name |
检查文件尺寸、 许可、类型、所有者、群组、MD5检查以及最后修改时间 |
rpm -Va |
检查系统中所有已安装的rpm包- 小心使用 |
rpm -Vp package.rpm |
确认一个rpm包还未安装 |
rpm2cpio package.rpm | cpio --extract --make-directories *bin* |
从一个rpm包运行可执行文件 |
rpm -ivh /usr/src/redhat/RPMS/`arch`/package.rpm |
从一个rpm源码安装一个构建好的包 |
rpmbuild --rebuild package_name.src.rpm |
从一个rpm源码构建一个 rpm 包 |
YUM 软件包升级器 |
Fedora, RedHat及类似系统包管理器 |
yum clean all |
清除原有yum缓存 |
yum repolist |
列出仓库信息 |
yum install software |
安装 |
yum update |
更新 |
yum list software |
查看软件 |
yum list all |
查看所有软件 |
yum list installed |
列出已安装软件 |
yum list available |
列出可安装软件 |
yum reinstall software |
重新安装 |
yum info software |
查看软件信息 |
yum whatprovides file |
根据文件找出包含此文件的软件 |
yum history |
查看系统中软件管理信息 |
yum history info |
对该数字为id的信息进行显示 |
yum groups list |
列出软件组 |
yum groups info |
查看软件组的信息 |
yum groups install sfgroup |
安装软甲组 |
yum groups remove sfgroup |
卸载软件组 |
yum install package_name |
下载并安装一个rpm包 |
yum localinstall package_name.rpm |
将安装一个rpm包,使用你自己的软件仓库为你解决所有依赖关系 |
yum update package_name.rpm |
更新当前系统中所有安装的rpm包 |
yum update package_name |
更新一个rpm包 |
yum remove package_name |
删除一个rpm包 |
yum search package_name |
在rpm仓库中搜寻软件包 |
yum clean packages |
清理rpm缓存删除下载的包 |
yum clean headers |
删除所有头文件 |
yum makecache |
使其更新缓存生效 |
ifconfig eth0 |
显示一个以太网卡的配置 |
ifup eth0 |
启用一个 'eth0' 网络设备 |
ifdown eth0 |
禁用一个 'eth0' 网络设备 |
slabtop |
slab内存分配查询 |
ssh -v -p username@ip;-v 调试模式(会打印日志),-p 指定端口,username:登录用户,ip:远程主机; telnet ip port; curl ip:port; wget ip:port; |
Linux端口四种测试方法 |
awk |
AWK善于按照用户定义的格式化输出文本信息,awk每次读取文本一行,每一行又被指定的分隔符划分成多列,读取行后列,列用$1...$n表示, |
awk内置参数 |
F:间隔符;NR:输出行记录数:NF:输出列记录数;$0:表示整行输出 |
awk '/^ab/' /etc/passwd |
passwd文件中输出所有以ab开头的行 |
awk '/^[no|yes]/' /etc/passwd |
passwd文件中输出所有以no或yes开头的行 |
ifconfig|awk -F " " '{if(NR==2)print "ip=" $2}' |
过滤Linux系统的Ip地址 |
awk '{if(NR>=20 && NR<=30)print $0}' /etc/passwd |
只输出/etc/passwd文件的20到30之间的行 |
awk -F '[: /]+' '{print $1,$6}' passwd1 |
以:或/为分割符输出每一行第1和第6列的置,"+"加号为正则表达式匹配":"和"/"出现一次或者多次 |
sed命令 |
非交互式。处理文件时,把当前处理的行存储在临时缓冲区(称为“模式空间”(Pattern Space))中,即它是基于模式匹配过滤及修改文本 |
sed参数 |
i:直接修改文件内容,而不是输出到终端,n:安静模式,屏蔽默认输出(全部文本),只有经过sed特殊处理的那一行才会被列出来,e :指定sed动作,可以由多个-e指定多个动作,{}:可组合多个命令,以分号分隔 |
sed -ne '$=' test.txt |
统计文本有多少行 |
sed -n -e '1p' test.txt |
仅输出文件的第一行内容 |
sed -n -e '5p' test.txt |
仅输出第5行内容 |
sed -n -e '1,5p' test.txt |
输出第1至第5行之间的内容 |
sed -n -e '5p,$p' test.txt |
输出第5至最后一行之间的内容 |
sed -n -e '$p' test.txt |
输出文件的最后一行内容 |
sed -sne 'p' test.txt test1.txt test2.txt |
输出3个文件的内容 |
sed -sne '$p' test.txt test1.txt test2.txt |
输出3个文件最后一行的内容 |
sed -n -e '/systemd/p' test.txt |
仅输出包含字符串“systemd”的行 |
sed -n -e '/^systemd/p' test.txt |
仅输出以符串“systemd”开头的行 |
sed -n -e '/systemd$/p' test.txt |
仅输出以符串“systemd”结尾的行 |
sed -n -e '/./p' test.txt |
仅输出含有字符的行(过滤掉文本中的空行) |
sed -n -e '/^$/p' test.txt |
仅输出文本中空行 |
sed -ne '/\/usr\/sbin\/nologin/p'test.txt |
输出含有“/usr/sbin/nologin/”字符串的有所行 |
sed -n -e '/admin.*false/p'test.txt |
仅输出包含字符串“admin”后面有字符串“false”的行(在它们之间有任意数量的任意字符) |
sed -i '/^HOSTNAME/cHOSTNAME=mysvr.tarena.com' /etc/sysconfig/network |
修改 /etc/sysconfig/network文件中以HOSTNAME开头的整行,c表示替换整行(-i:表示直接修改文件内容,不加i只是把文件内容替换输出屏幕,原文件内容不修改) |
sed -i 's/book/books/' file |
将file文件中每一行的第一个book替换为books |
sed -i 's/book/books/g' file |
替换file文件每一行中的所有匹配到的book |
sed -i 's|book|books|2g' file |
从file每一行第二个匹配到的开始替换(注意:竖线也可以作为sed分隔符) |
sed -i '/^$/d' file |
删除空白行 |
sed -i '2d' file |
删除第二行 |
sed -i '$d' file |
删除最后一行 |
sed -i '2,$d' file |
删除第二行到最后一行 |
sed -i '/^test/d' file |
删除所有以test开头的行 |
sed -i 's/^/#/g' file |
给文件的每行加上#号 |
sed -i 's/|/\,/g' *.txt |
将所有文件|替换为逗号 |
sed -i 's/^#//g' file |
去掉文件每行开头的#号 |
sed -i 's/^ //g' file |
去掉文件每行开头的空格 |
sed -e '1d' result.txt |
从文件example.txt 中排除第一行 |
sed -n '/stringa1/p' |
查看只包含词汇 "string1"的行 |
sed -e 's/ *$//' example.txt |
删除每一行最后的空白字符 |
sed -e 's/stringa1//g' example.txt |
从文档中只删除词汇 "string1" 并保留剩余全部 |
sed -n '1,5p;5q' example.txt |
查看从第一行到第5行内容 |
sed -n '5p;5q' example.txt |
查看第5行 |
sed -e 's/00*/0/g' example.txt |
用单个零替换多个零 |
sed 's/stringa1/stringa2/g' example.txt |
将example.txt文件中的 "string1" 替换成 "string2" |
sed '/^$/d' example.txt 从example.txt |
文件中删除所有空白行 |
sed '/ *#/d; /^$/d' example.txt 从example.txt |
文件中删除所有注释和空白行 |
echo 'esempio' | tr '[:lower:]' '[:upper:]' |
合并上下单元格内容 |
grep |
文件过滤神器,-v :反向选择,-i :忽略大小写,-E:支持扩展正则表达式,-r:递归搜索,搜索当前目录和子目录 |
grep -E 'A|B' file |
输出匹配到含有A或B的行 |
grep -i ‘abc' file |
匹配输出含有abc的行,忽略大小写 |
find |
文件、目录查找命令 |
find /etc/ -iname "*.conf" |
忽略大小写查找以".conf"结尾的文件或者目录(因没指定输出文件类型,所以会输出所有类型的文件) |
find /etc/ -iname "abc*" |
忽略大小写查找以"abc"开头的文件或者目录(因没指定输出文件类型,所以会输出所有类型的文件) |
find /etc/ -type f -exec ls -l {} \; |
查找/etc目录下所有文件并输出 |
find /etc/ -type f | xargs -i ls -l |
查找/etc目录下所有文件并输出 |
find /etc/ -name "*.conf" |
把查找到以.conf结尾的所有文件复制到/tmp目录下面 |
find /etc/ -name "*.conf" -exec cp -rf {} /tmp/ \; |
把查找到以.conf结尾的所有文件复制到/tmp目录下面 |
find /etc/ -name "*.conf"|xargs -i cp -rf {} /tmp |
把查找到以.conf结尾的所有文件复制到/tmp目录下面 |
find /var/log/ -mtime +30 -exec rm -f {} \; |
删除30天前的文件 |
find /var/log/ -mtime +30 | xargs -i rm -f {} |
删除30天前的文件 |
find . -name "*.log" -size +10M|xargs -i rm -f {} |
找出大于10M日志并删除 |
find . -name "*.log" -size -10M| -exec i rm {} -f; |
找出小于10M日志并删除 |
find . -name "*.log" -size +10K -exec rm -f {} \; |
找出大于10K日志并删除 |
find . -empty -type f | xargs -i rm -f {} |
找出当前目录下空文件并删除 |
find /var/log/ -name "*.log" -mtime +30 -exec cp -rf {} /tmp/ \; |
查找出目录中的日志文件,并且其存在时间超过30天,将其复制到/tmp目录下 |
find /etc/ -type f -newer /etc/passwd |
查找在修改/etc/passwd此文件之前修改的所有文件(此条命令可以查找修改某个文件时其他也受到关联影响的文件) |
cd /etc/yum.repos.d |
查看Linux源(yum)配置情况 |
ipmitool -I lanplus -H ip -U user -P PASSWORD user list |
ipmitool -I lanplus -H 10.198.75.88 -U admin -P Admin#123 user list //查看所有底层管理口用户 |
ipmitool -I lanplus -H ip -U user -P PASSWORD chassis status |
查看设备状态 |
ipmitool -I lanplus -H ip -U user -P PASSWORD lan print 1 |
查看BMC网络信息 |
ipmitool -I lanplus -H ip -U user -P PASSWORD power reset |
重启服务器 |
ipmitool -I lanplus -H ip -U user -P PASSWORD user set password 2 newpassword |
修改BMC用户密码 |
cat /sys/class/fc_host/host3/node_name |
查询linux系统下HBA卡WWN号 |
cat /dev/urandom | sed 's/[^a-zA-Z]//g' | strings -n 5 | head -n 5 |
随机生成5个长度为5的字符串,其中strings表示长度,head表示个数 |
cd /etc/yum.repos.d |
查看Linux源(yum)配置情况 |
dmidecode -t |
按照指定显示服务器硬件信息 |
dmidecode -q |
显示服务器主要硬件信息 |
lspci |
查看PCI总线命令 |
lscpu |
查看CPU信息命令 |
lshw -short |
查看各硬件信息 |
lsscsi |
列出像硬盘和光驱等 scsi/sata 设备的信息(组合阵列的盘也会列出,但lsblk只列出阵列组合后逻辑出来的盘) |
chkconfig --list |
列出所有系统服务 |
blktrace |
硬盘跟踪工具 |
Linux内存大页 |
Linux内存大页在需消耗大块内存的场景可以提升系统性能,大页的使用要根据场景来应用,在KVM虚拟化中可以使用大页来提高性能 宿主机的大页是平均分到每个 NUMA 节点上的,除非某个 NUMA 节点本身没有足够的可用连续内存来生成大页,那么此时大页将由另外一个 NUMA 节点生成,虚拟机要使用宿主机的大页技术,还必须在虚拟机配置表修改支持 当大页面的总数为 256,有 2 个 NUMA 节点时,那么每个 NUMA 节点的大页数为 256/2 = 128 个 cat /sys/devices/system/node/node*/meminfo | fgrep Huge //查看NUMA节点的大页资源 cat /proc/meninfo | grep -i HugePage//查看宿主机大页的配置情况 重点:AnonHugePages参数统计的是Transparent HugePages (THP,透明大页),THP与Hugepages不是一回事,区别很大 |
useradd username -s /bin/bash -m /home/username -e 2022-12-31 -g groupname -G other groupname |
创建用户username指定运行的shell,目录、过期时间、属组、附加属组 |
Linux进程 |
|
R (TASK_RUNNING),可执行状态 |
只有在该状态的进程才可能在CPU上运行。而同一时刻可能有多个进程处于可执行状态,这些进程的task_struct结构(进程控制块)被放入对应CPU的可执行队列中(一个进程最多只能出现在一个CPU的可执行队列中)。进程调度器的任务就是从各个CPU的可执行队列中分别选择一个进程在该CPU上运行。 很多操作系统教科书将正在CPU上执行的进程定义为RUNNING状态、而将可执行但是尚未被调度执行的进程定义为READY状态,这两种状态在linux下统一为 TASK_RUNNING状态 |
S (TASK_INTERRUPTIBLE),可中断的睡眠状态 |
处于这个状态的进程因为等待某某事件的发生(比如等待socket连接、等待信号量),而被挂起。这些进程的task_struct结构被放入对应事件的等待队列中。当这些事件发生时(由外部中断触发、或由其他进程触发),对应的等待队列中的一个或多个进程将被唤醒。 通过ps命令我们会看到,一般情况下,进程列表中的绝大多数进程都处于TASK_INTERRUPTIBLE状态(除非机器的负载很高)。毕竟CPU就这么一两个,进程动辄几十上百个,如果不是绝大多数进程都在睡眠,CPU又怎么响应得过来。 |
D (TASK_UNINTERRUPTIBLE),不可中断的睡眠状态 |
与TASK_INTERRUPTIBLE状态类似,进程处于睡眠状态,但是此刻进程是不可中断的。不可中断,指的并不是CPU不响应外部硬件的中断,而是指进程不响应异步信号。 绝大多数情况下,进程处在睡眠状态时,总是应该能够响应异步信号的。否则你将惊奇的发现,kill -9竟然杀不死一个正在睡眠的进程了!于是我们也很好理解,为什么ps命令看到的进程几乎不会出现TASK_UNINTERRUPTIBLE状态,而总是TASK_INTERRUPTIBLE状态。 而TASK_UNINTERRUPTIBLE状态存在的意义就在于,内核的某些处理流程是不能被打断的。如果响应异步信号,程序的执行流程中就会被插入一段用于处理异步信号的流程(这个插入的流程可能只存在于内核态,也可能延伸到用户态),于是原有的流程就被中断了。(参见《linux内核异步中断浅析》) 在进程对某些硬件进行操作时(比如进程调用read系统调用对某个设备文件进行读操作,而read系统调用最终执行到对应设备驱动的代码,并与对应的物理设备进行交互),可能需要使用TASK_UNINTERRUPTIBLE状态对进程进行保护,以避免进程与设备交互的过程被打断,造成设备陷入不可控的状态。这种情况下的TASK_UNINTERRUPTIBLE状态总是非常短暂的,通过ps命令基本上不可能捕捉到。 linux系统中也存在容易捕捉的TASK_UNINTERRUPTIBLE状态。执行vfork系统调用后,父进程将进入TASK_UNINTERRUPTIBLE状态,直到子进程调用exit或exec(参见《神奇的vfork》)。 通过下面的代码就能得到处于TASK_UNINTERRUPTIBLE状态的进程: #include void main() { if (!vfork()) sleep(100); } 编译运行,然后ps一下: kouu@kouu-one:~/test$ ps -ax | grep a\.out 4371 pts/0 D+ 0:00 ./a.out 4372 pts/0 S+ 0:00 ./a.out 4374 pts/1 S+ 0:00 grep a.out 然后我们可以试验一下TASK_UNINTERRUPTIBLE状态的威力。不管kill还是kill -9,这个TASK_UNINTERRUPTIBLE状态的父进程依然屹立不倒。 |
T (TASK_STOPPED or TASK_TRACED),暂停状态或跟踪状态 |
向进程发送一个SIGSTOP信号,它就会因响应该信号而进入TASK_STOPPED状态(除非该进程本身处于TASK_UNINTERRUPTIBLE状态而不响应信号)。(SIGSTOP与SIGKILL信号一样,是非常强制的。不允许用户进程通过signal系列的系统调用重新设置对应的信号处理函数。) 向进程发送一个SIGCONT信号,可以让其从TASK_STOPPED状态恢复到TASK_RUNNING状态。 当进程正在被跟踪时,它处于TASK_TRACED这个特殊的状态。“正在被跟踪”指的是进程暂停下来,等待跟踪它的进程对它进行操作。比如在gdb中对被跟踪的进程下一个断点,进程在断点处停下来的时候就处于TASK_TRACED状态。而在其他时候,被跟踪的进程还是处于前面提到的那些状态。 对于进程本身来说,TASK_STOPPED和TASK_TRACED状态很类似,都是表示进程暂停下来。 而TASK_TRACED状态相当于在TASK_STOPPED之上多了一层保护,处于TASK_TRACED状态的进程不能响应SIGCONT信号而被唤醒。只能等到调试进程通过ptrace系统调用执行PTRACE_CONT、PTRACE_DETACH等操作(通过ptrace系统调用的参数指定操作),或调试进程退出,被调试的进程才能恢复TASK_RUNNING状态 |
Z (TASK_DEAD - EXIT_ZOMBIE),退出状态,进程成为僵尸进程 |
进程在退出的过程中,处于TASK_DEAD状态。 在这个退出过程中,进程占有的所有资源将被回收,除了task_struct结构(以及少数资源)以外。于是进程就只剩下task_struct这么个空壳,故称为僵尸。 之所以保留task_struct,是因为task_struct里面保存了进程的退出码、以及一些统计信息。而其父进程很可能会关心这些信息。比如在shell中,$?变量就保存了最后一个退出的前台进程的退出码,而这个退出码往往被作为if语句的判断条件。 当然,内核也可以将这些信息保存在别的地方,而将task_struct结构释放掉,以节省一些空间。但是使用task_struct结构更为方便,因为在内核中已经建立了从pid到task_struct查找关系,还有进程间的父子关系。释放掉task_struct,则需要建立一些新的数据结构,以便让父进程找到它的子进程的退出信息。 父进程可以通过wait系列的系统调用(如wait4、waitid)来等待某个或某些子进程的退出,并获取它的退出信息。然后wait系列的系统调用会顺便将子进程的尸体(task_struct)也释放掉。 子进程在退出的过程中,内核会给其父进程发送一个信号,通知父进程来“收尸”。这个信号默认是SIGCHLD,但是在通过clone系统调用创建子进程时,可以设置这个信号。 通过下面的代码能够制造一个EXIT_ZOMBIE状态的进程: #include void main() { if (fork()) while(1) sleep(100); } 编译运行,然后ps一下: kouu@kouu-one:~/test$ ps -ax | grep a\.out 10410 pts/0 S+ 0:00 ./a.out 10411 pts/0 Z+ 0:00 [a.out] 10413 pts/1 S+ 0:00 grep a.out 只要父进程不退出,这个僵尸状态的子进程就一直存在。那么如果父进程退出了呢,谁又来给子进程“收尸”? 当进程退出的时候,会将它的所有子进程都托管给别的进程(使之成为别的进程的子进程)。托管给谁呢?可能是退出进程所在进程组的下一个进程(如果存在的话),或者是1号进程。所以每个进程、每时每刻都有父进程存在。除非它是1号进程。 1号进程,pid为1的进程,又称init进程。 linux系统启动后,第一个被创建的用户态进程就是init进程。它有两项使命: 1、执行系统初始化脚本,创建一系列的进程(它们都是init进程的子孙); 2、在一个死循环中等待其子进程的退出事件,并调用waitid系统调用来完成“收尸”工作; init进程不会被暂停、也不会被杀死(这是由内核来保证的)。它在等待子进程退出的过程中处于TASK_INTERRUPTIBLE状态,“收尸”过程中则处于TASK_RUNNING状态。 |
X (TASK_DEAD - EXIT_DEAD),退出状态,进程即将被销毁 |
而进程在退出过程中也可能不会保留它的task_struct。比如这个进程是多线程程序中被detach过的进程(进程?线程?参见《linux线程浅析》)。或者父进程通过设置SIGCHLD信号的handler为SIG_IGN,显式的忽略了SIGCHLD信号。(这是posix的规定,尽管子进程的退出信号可以被设置为SIGCHLD以外的其他信号。) 此时,进程将被置于EXIT_DEAD退出状态,这意味着接下来的代码立即就会将该进程彻底释放。所以EXIT_DEAD状态是非常短暂的,几乎不可能通过ps命令捕捉到 |
信号是进程间通信机制中唯一的异步通信机制,可以看作是异步通知,通知接收信号的进程有哪些事情发生了 |
|
linux进程优先级 |
Linux 进程 分为3种类型 : 限期进程 、实时进程、普通进程,从 " 进程优先级 " 角度对比 , 优先级从高到低分别是 : 限期进程 > 实时进程 > 普通进程 限期进程 : 优先级为 -1 实时进程 : 优先级值为 0~99 ; 实时进程中优先级的数值越大 , 优先级越高,其优先是由内核设置的,只能从代码层把一个普通进程修改为实时进程;实时进程调度策略有:SCHED_FIFO:优先级高的先运行,优先级相同的按先进先出的队列方式运行;SCHED_RR:优先级高的先运行,优先级相同的以时间片轮询运行。top命令中RT值为:rt的标示此进程为实时进程 普通进程 :优先级值为 100~139; 普通进程中优先级的数值越小 , 优先级越高,用户可以修改nice值改变普通进程优先级 普通进程可以通过调整nice值来改变优先级 , 计算公式为:普通静态进程优先级=nice+120,nice取值[-20~19] top命令中PR值:PR是在top 命令执行后的显示,其代表的是进程的调度优先级,它与静态优先级(static_priority)关系为 static_priority=PR+100,static_priority取值为[100, 139],所以PR取值是 [0, 39],PR和NI关系为 : PR(new) = PR(old) + nice;普通进程的的调度策略是:CFS,完全公平调度策略 |
cgroup |
cgroups其名称源自控制组群(control groups)的缩写,是内核的一个特性,用于限制、记录和隔离一组进程的资源使用(CPU、内存、磁盘 I/O、网络等),cgroup文件系统是如何集成进vfs(虚拟文件系统).因为cgroup通过vfs向用户层提供接口,用户层通过挂载,创建目录,读写文件的方式与cgroup交互 资源限制:可以配置 cgroup,从而限制进程可以对特定资源(例如内存或 CPU)的使用量 优先级 :当资源发生冲突时,您可以控制一个进程相比另一个 cgroup 中的进程可以使用的资源量(CPU、磁盘或网络) 记录:在 cgroup 级别监控和报告资源限制 控制:您可以使用单个命令更改 cgroup 中所有进程的状态(冻结、停止或重新启动) Cgroups功能的实现依赖于四个核心概念:子系统、控制组、层级树、任务 子系统(subsystem):一个内核的组件,一个子系统代表一类资源调度控制器。例如内存子系统可以限制内存的使用量,CPU 子系统可以限制 CPU 的使用时间。子系统是真正实现某类资源的限制的基础 Subsystem(子系统) cgroups 中的子系统就是一个资源调度控制器(又叫 controllers) 在/sys/fs/cgroup/这个目录下可以看到cgroup子系统 cpu:使用调度程序控制任务对cpu的使用 cpuacct:自动生成cgroup中任务对cpu资源使用情况的报告 cpuset:可以为cgroup中的任务分配独立的cpu和内存 blkio:可以为块设备设定输入输出限制,比如物理驱动设备 devices:可以开启或关闭cgroup中任务对设备的访问 freezer: 可以挂起或恢复cgroup中的任务 pids:限制任务数量 memory:可以设定cgroup中任务对内存使用量的限定,并且自动生成这些任务对内存资源使用情况的报告 perf_event:使用后使cgroup中的任务可以进行统一的性能测试 net_cls:docker没有直接使用它,它通过使用等级识别符标记网络数据包,从而允许linux流量控制程序识别从具体cgroup中生成的数据包 ns :名称空间子系统 控制组(control group):控制组就是一组按照某种标准划分的进程。Cgroups中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用cgroups以控制组为单位分配的资源,同时受到cgroups以控制组为单位设定的限制 层级(hierarchy):由一系列的控制组按照树状结构排列组成的。这种排列方式可以使得控制组拥有父子关系,子控制组默认拥有父控制组的属性,也就是子控制组会继承于父控制组。比如,系统中定义了一个控制组 c1,限制了 CPU 可以使用 1 核,然后另外一个控制组 c2 想实现既限制 CPU 使用 1 核,同时限制内存使用 2G,那么 c2 就可以直接继承 c1,无须重复定义 CPU 限制 任务(task) :在cgroup中,任务就是一个进程。一个任务可以是多个cgroup的成员,但这些cgroup必须位于不同的层级,子进程自动成为父进程cgroup的成员,可按需求将子进程移到不同的cgroup中 子系统、控制组、层级树、任务四者之间关系: 1.每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup ,此cgroup在创建层级时自动创建,后面在该层级中创建的cgroup都是此cgroup的后代)的初始成员。 2.一个子系统最多只能附加到一个层级。 3.一个层级可以附加多个子系统 4.一个任务可以是多个cgroup的成员,但是这些cgroup必须在不同的层级。 5.系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的cgroup。 cgroup安装及使用: yum install -y libcgroup //centos6上安装 yum install -y libcgroup-tools //centos7上安装 /etc/cgconfig.conf //配置文件 lssubsys -a //查看系统支持的所有子系统 mount -t cgroup //查询系统中已经mount 的cgroup的文件系统,这里的t表示type |
Linux系统中断 |
Linux系统把一个中断分为上半部中断和下半部中断,上半部中断也称为硬中断,下半部中断称为软中断; 上半部直接处理硬件请求,也就是我们常说的硬中断,特点是快速执行; 下半部则是由内核触发,也就是我们常说的软中断,特点是延迟执行; 举例:网卡接收到数据包后,会通过硬件中断的方式,通知内核有新的数据到了。这时,CPU就应该调用内核中断处理程序来响应它。 对上半部来说,既然是快速处理,其实就是要把网卡的数据读到内存中,然后更新一下硬件寄存器的状态(表示数据已经读好了),最后再发送一个软中断信号,通知下半部做进一步的处理。 而下半部被软中断信号唤醒后,需要从内存中找到网络数据,再按照网络协议栈,对数据进行逐层解析和处理,直到把它送给应用程序。 不过,软中断不只是包括硬件设备中断处理程序的下半部,一些内核自定义事件也属于软中断,比如内核调度等、BLOCK、NET_RX、NET_TX、SCHED、TIMER、HI、RCU 锁(内核里常用的一种锁)等 cat /proc/softirqs //查看软中断统计情况; cat /proc/interrupts //查看硬中断统计情况; watch -d cat /proc/softirqs //查看软中断的变化情况 watch -d cat /proc/interrupts //查看硬中断的变化情况 |
lsmod |
查看Linux系统加载的内核模块,此命令的数据来源于:cat /proc/modules文件的数据 |
irqblance服务 |
irqblance服务是Linux中断负载均衡工具,通过它可以把中断均分到CPU多核心上去处理 /etc/sysconfig/irqbalance //irqbalance配置文件 systemctl start/stop irqbalance.service //启动/停止irqbalance服务 systemctl disable irqbalance.service //禁用irqbalance服务,开机重启也不会生效 systemctl status irqbalance.service //查看irqbalance服务开机重启 |
user ALL = (ALL) ALL |
user标示允许的用户 ,第一个ALL标示主机的任何位置 第二个ALL标示任何用户 第三个ALL标示任何命令 |
tcpdump上传包手动安装 |
rpm -ivh libpcap0-0.9.8-50.10.1.x86_64.rpm rpm -ivh tcpdump-3.9.8-1.21.x86_64.rpm |
hwclock --show |
查看硬件的时间 |
hwclock --set --date '2016-01-08 15:15:15' |
置硬件时间(这个时间是RTC时间,也是UTC时间,UTC+8=CST) |
linux中tty是什么 |
终端是一种字符型设备,它有多种类型,通常使用tty来简称各种类型的终端设备。tty是Teletype的缩写。Teletype是最早出现的一种终端设备,很象电传打字机(或者说就是J),是由Teletype公司生产的。设备名放在特殊文件目录/dev/下 |
ethtool -g eth0 |
g --show-ring(显示物理网卡的队列深度信息) |
ethtool -l eth0 |
显示物理网卡队列数信息 |
ethtool -L eth0 combined 64 |
修改网卡队列深度为64 |
env |
查看系统的环境变量 |
numactl -H/numastat -m |
查看numa架构的内存 |
dmesg -T |
查看系统重启日志 |
top -p 2312 |
查看2312进程的负载 |
/opt/cloud/services/nova-compute/venv/bin/python2.7 /etc/nova-compute/nova-util/query_hypervisor_resource.py |
Nova查看内存(进入Python运行环境,执行名Python脚本) |
ls -l /etc/libvirt/qemu/ |
查看虚拟机XML配置文件 |
/etc/Hugepage.conf;/etc/Hugepages_node.conf |
UVP大页配置文件 |
cat /proc/meminfo |
查看大页配置 |
cat /proc/pid号/maps |
查看进程的虚拟地址空间,显示进程映射了的内存区域和访问权限 |
device mapper |
|
du -sh .[!.]* |
查看目录下隐藏文件的大小 |
sysctl -a|grep fs.file-max cat /proc/sys/fs/file-max |
查看系统能打开的最大文件数 |
echo "fs.file-max=655350">> /etc/sysctl.conf;sysctl -p |
修改系统的最大文件打开数并生效 |
vim /etc/security/limits.conf |
修改用户级打开的最大文件数(单个用户能打开最大文件数) |
ulimits -n |
查看用户级打开的最大文件数(单个用户能打开最大文件数) |
grep -iE 'vmx|svm' /proc/cpuinfo |
查看CPU是否支持虚拟化 |
blkid |
查看分区对应的UUID |
gcc hello.c -o hello.exe |
GCC把hello.c源文件编译成可执行文件hello.exe |
journalctl -k |
查看内核日志 |
journalctl -b |
查看系统本次启动的日志 |
journalctl -b -1 |
查看系统上次启动的日志 |
journalctl /usr/lib/systemd/system |
查看指定服务的日志 |
"/" |
标示根目录 |
"../" |
表示上级目录 |
"./" |
表示当前目录 |
dd if=/dev/sdb of=/root/backup |
将sdb盘的数据被分到/root/backup文件 |
dd if=root/backup of=dev/sdb |
将/root/backup文件备份数据恢复到sdb盘 |
dd if=/dev/sda of=/dev/sdb |
将sda盘的数据被分到sdb文件 |
dd if=/dev/sdb | gzip>/root/backup.gz |
将sdb盘数据通过gzip压缩保存为/root/backup.gz |
gzip -dc /root/backup.gz | dd of=/dev/sdb |
通过gzip解压/root/backup.gz文件并保存到/dev/sdb |
dd if=/dev/cdrom(hdc) of=/tmp/cd.iso |
拷贝光盘内容到指定文件夹,并保存为cd.iso文件 |
time dd if=dev/zero of=/test.dbf bs=4k count=100000 |
测试硬盘的写性能 |
rpm -qa|grep smartmontools |
查看smartctl软件是否安装 |
yum install -y smartmontools |
在redhat类系统安装smartctl工具 |
smartctl -i /dev/sda |
查看硬盘的基本参数 (设备型号、厂商、驱动版本等) |
smartctl -x /dev/sdb |
查看硬盘的所有smart和非smart的信息 |
smartctl --scan |
查看系统上的所有设备 |
smartctl -H /dev/sda |
查看硬盘的健康状况 |
smartctl -a /dev/sda -d megaraid,{n} |
对于raid设备, 需要加上 “-d megaraid,{n}” n 为raid控制器的编号,没做阵列则不加 |
smartctl -t short /dev/sda |
对磁盘进行短期测试 |
smartctl -l selftest /dev/sda |
查看磁盘测试结果 |
smartctl -l error /dev/sdb |
查看磁盘错误日志 |
kdump |
kdump 是一种先进的基于 kexec 的内核崩溃转储机制。当系统崩溃时,kdump 使用 kexec 启动到第二个内核。第二个内核通常叫做捕获内核,以很小内存启动以捕获转储镜像。第一个内核保留了内存的一部分给第二内核启动用。由于 kdump 利用 kexec 启动捕获内核,绕过了 BIOS,所以第一个内核的内存得以保留。这是内核崩溃转储的本质。 kdump 需要两个不同目的的内核,生产内核和捕获内核。生产内核是捕获内核服务的对像。捕获内核会在生产内核崩溃时启动起来,与相应的 ramdisk 一起组建一个微环境,用以对生产内核下的内存进行收集和转存 |
/sys/devices |
这是内核对系统中的所有设备分层表达模型,也是syfs文件系统管理设备的重要目录结构 |
/sys/block |
这里是系统中当前所有的块设备所在,按照功能来说放置在 /sys/class 之下会更合适,但只是由于历史遗留因素而一直存在于 /sys/block, 但从 2.6.22 开始就已标记为过时,只有在打开了 CONFIG_SYSFS_DEPRECATED 配置 下编译才会有这个目录的存在,并且在 2.6.26 内核 中已正式移到 /sys/class/block, 旧的接口 /sys/block 为了向后兼容保留存在,但其中的内容已经变为指向它们在 /sys/devices/ 中真实设备的符号链接文件 |
/sys/dev |
这个目录下维护一个按字符设备和块设备的主次号码(major:minor)链接到真实的设备(/sys/devices下)的符号链接文件,它是在内核 2.6.26 首次引入; |
/sys/bus |
这是内核 设备按总线类型分层放置的目录结构, devices 中的所有设备都是连接于某种总线之下,在这里的每一种具体总线之下可以找到每一个具体设备的符号链接,它也是构成 Linux 统一设备模型的一部分 |
/sys/class |
这是按照设备功能分类的设备模型,如系统所有输入设备都会出现在 /sys/class/input 之下,而不论它们是以何种总线连接到系统。它也是构成 Linux 统一设备模型的一部分 |
/sys/fs |
这 里按照设计是用于描述系统中所有文件系统,包括文件系统本身和按文件系统分类存放的已挂载点,但目前只有 fuse,gfs2 等少数文件系统支持 sysfs 接口,一些传统的虚拟文件系统(VFS)层次控制参数仍然在 sysctl (/proc/sys/fs) 接口中; |
touch $(date +%Y-%m-%d-%R)或者touch `date +%Y-%m-%d-%R` |
用日期时间戳作为文件名创建文件 |
Linux修改内核参数文件/proc/sys与/etc/sysctl.conf区别 |
Linux在系统运行时修改内核参数(/proc/sys与/etc/sysctl.conf),而不需要重新引导系统,这个功能是通过/proc虚拟文件系统实现的。 在/proc/sys目录下存放着大多数的内核参数,并且设计成可以在系统运行的同时进行更改, 可以通过更改/proc/sys中内核参数对应的文件达到修改内核参数的目的(修改过后,保存配置文件就马上自动生效),不过重新启动机器后之前修改的参数值会失效,所以只能是一种临时参数变更方案。(适合调试内核参数优化值的时候使用,如果设置值有问题,重启服务器还原原来的设置参数值了。简单方便。) 但是如果调试内核参数优化值结束后,需要永久保存参数值,就要通过修改/etc/sysctl.conf内的内核参数来永久保存更改。但只是修改sysctl文件内的参数值,确认保存修改文件后,设定的参数值并不会马上生效,如果想使参数值修改马上生效,并且不重启服务器,可以执命令sysctl -p sysctl –a //查看内核所有变量 |
kubectl get node |
查看k8s管理的容器节点 |
mcelog.service进程 |
mcelog 是 x86 的 Linux 系统上用来 检查硬件错误,特别是内存和CPU错误的工具:machine check exception |
yum-config-manager |
命令是对资源库(/etc/yum.repos.d/下的文件)进行增删改查 |
yum repolist all |
查询所有资源库 |
yum repolist enabled |
查询已启用的资源库 |
yum repolist disabled |
查询禁用的资源库 |
mount -t cgroup或者lssubsys -m |
查看已创建并挂载好的cgroup组 |
timedatectl |
查看系统所有时间信息 |
timedatectl set-timezone Asia/Shanghai |
设置时区为上海 |
hwclock -s |
让系统时间同步硬件RTC时间(以RTC时间为标准,系统时间就是date命令输出的时间,也叫本地时间,所在国的时间) |
hwclock -w |
让硬件RTC时间同步系统时间(以系统时间为标准) |
hwclock -u |
让硬件RTC时间保持在UTC时间(意思把RTC时间设置为UTC时间) |
hwclock --localtime |
让硬件RTC时间保持在本地时间(意思把RTC时间设置为本地时间) |
Centos同步时间(阿里云NTP服务为例) |
ntpdate ntp1.aliyun.com |
hwclock --systohc --localtime |
将硬件时钟调整为与本地时钟一致 |
关于yum |
yum(全称为 Yellow dog Updater, Modified)是一个在Fedora和RedHat以及SUSE中的Shell前端软件包管理器。基於RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装 |
关于epel |
EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,centos是redhat的开源版本,没有yum功能,所以需要安装epel,使得其具有yum功能,centos配置了epel,还需要配置repo,以使得软件源有软件,repo是配置源的,即配置从哪里下载包(以及依赖关系) |
yum install epel-release |
centos系统安装epel |
rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm |
centos系统添加wlnmp源(2019年初开始维护wlnmp一键安装包这个项目,起初只是为了在日常运维过程中,可以快速的部署lnmp服务,wlnmp一键安装包基于上游开源软件二次开发,可以在Linux系统上通过wlnmp提供的镜像源,快速部署Nginx/Mysql/PHP等常用软件,所有的包都以“w”开头,方便与官方包进行区分) |
centos7系统同步网络时间(以同步阿里云时间为例) |
rpm -ivh https://mirrors.wlnmp.com/centos/wlnmp-release-centos.noarch.rpm systemctl start ntpd timedatectl set-ntp yes ntpdate ntp1.aliyun.com timedatectl set-timezone Asia/Shanghai |
A机器免密ssh登录B机器(思路:在A机器生成公私钥,把公钥传到B机器) |
ssh-keygen -t rsa (-t:指定秘钥类型,dsa | ecdsa | ed25519 | rsa | rsa1) ssh-copy-id -i ~/.ssh/id_rsa.pub root@ip |
EOF用法(把EOF中的内容输出给cat,cat再把内容输入到1.txt) |
cat >> /root/1.txt << EOF 12345 12345 EOF |
查看网卡的MAC地址 |
cat /sys/class/net/ens160/address |
查看网卡的UUID |
cat /sys/class/dmi/id/product_uuid |
ip a |
查看网卡信息(显示比ifconfig全) |
centos连接公网跨大版本升级kernel |
步骤 1:检查已安装的内核版本,并记录 uname -rs 步骤 2:在 CentOS 7 中升级内核 CentOS 允许使用 ELRepo,这是一个第三方仓库,可以将内核升级到最新版本。 在 CentOS 7 上启用 ELRepo 仓库,运行如下命令: 导入该源的秘钥 rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 启用该源仓库 rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-5.el7.elrepo.noarch.rpm 查看有哪些内核版本可供安装 yum --disablerepo="*" --enablerepo="elrepo-kernel" list available 安装的长期稳定版本,稳定可靠或者安装指定版本 yum --enablerepo=elrepo-kernel install -y kernel-lt //安装长期稳定版本 yum --enablerepo=elrepo-kernel install -y kernel-ml.x86_64 0:6.2.6-1.el7.elrepo //安装指定版本 步骤 3:设置 GRUB 默认的内核版本 首先备份:cp /etc/default/grub /etc/default/grub.bak 为了让新安装的内核成为默认启动选项,你需要修改 GRUB 配置:vim /etc/default/grub ,设置 GRUB_DEFAULT=0 意思是 GRUB 初始化页面的第一个内核将作为默认内核 执行命令使配置文件生效:grub2-mkconfig -o /boot/grub2/grub.cfg 执行重启:reboot 查看版本是否改变:uname -r |
centos连接公网跨小本升级kernel |
yum list kernel yum update -y kernel |
centos离线升级kernel |
1.检查已安装的内核版本,并记录 uname -rs 2.下载内核RPM包到指定目录,下面以阿里云源内核链接下载(说明:lt长期维护版 ml最新稳定版,kernel-lt是内核包,kernel-lt-devel是与内核相匹配的内核开发环境,都需要升级,必须保证内核开发环境和内核版本一致) wget -P /tmp/kernel.file https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-5.4.163-1.el7.elrepo.x86_64.rpm wget -P /tmp/kernel.file https://elrepo.org/linux/kernel/el7/x86_64/RPMS/kernel-lt-devel-5.4.163-1.el7.elrepo.x86_64.rpm 3.切换到内核包的目录,安装内核包 rpm -ivh kernel-lt-5.4.163-1.el7.elrepo.x86_64.rpm rpm -ivh kernel-lt-devel-5.4.163-1.el7.elrepo.x86_64.rpm 4.设置 GRUB 默认的内核版本 首先备份:cp /etc/default/grub /etc/default/grub.bak 为了让新安装的内核成为默认启动选项,你需要修改 GRUB 配置:vim /etc/default/grub ,设置 GRUB_DEFAULT=0 意思是 GRUB 初始化页面的第一个内核将作为默认内核 执行命令使配置文件生效:grub2-mkconfig -o /boot/grub2/grub.cfg 执行重启:reboot 查看版本是否改变:uname -r |
清华大学内核包链接 |
https://mirrors.tuna.tsinghua.edu.cn/elrepo/kernel/el7/x86_64/RPMS/ |
阿里云内核包下载链接 |
|
wget -c |
c参数断点续传,适用大文件传输,网络不好的环境 |
CMA(Contiguous Memory Allocator) |
连续内存分配器用于分配大块的连续内存。内存管理系统会根据设备使用情况动态管理CMA区域的页面 |
readelf -S vmlinux |
查看内核包含的段信息 |
useradd Tom -s /bin/fasle 和useradd Tom -s /sbin/nologin 区别 |
被赋予/bin/false的用户禁止登录系统,一切服务都不可用,登录不会有报错提示,最严格限制,相当于被系统判了死刑,被赋予/sbin/nologin用户也无法使用bash或者其他shell登录系统,但是能可以使用系统资源,相当于被系统判了无期徒刑,比如各个系统账号,打印作业的lp管理账号,web服务器的apache管理账号,它们都可以运行系统上自己的服务,但无法交互式登录系统 |
useradd -g -G |
g:用户所属组,G:用户附加组 |
selinux |
SELinux是由美国国家安全局(NSA)开发的,整合在Linux内核当中,针对特定的进程与指定的文件资源进行权限控制的系统。即使你是root用户,也必须遵守SELinux的规则,可以有效防止root用户的误操作 SELinux时通过MAC的方式来管理进程,它控制的主体是进程,而目标则是该进程能否读取的文件资源 |