一个计算机技术爱好者与学习者

0%

shell命令之系统管理

1. 查看硬件配置

1.1. 查看服务器型号

1
2
dmidecode
dmidecode | grep "System Information" -A16

1.2. 查看CPU

物理CPU数(physical id):主板上实际插入的cpu数量,可以数不重复的 physical id 有几个。
CPU核心数(cpu cores):单块CPU上面能处理数据的芯片组的数量,如双核、四核等
逻辑CPU数:一般情况下,逻辑CPU=物理CPU个数×每颗核数;如果开启了超线程技术,逻辑CPU=物理CPU个数×每颗核数x2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 查看CPU详细信息
lscpu
cat /proc/cpuinfo

# 查询物理CPU数量
lscpu | grep -i "Architecture" | wc -l
cat /proc/cpuinfo | grep "physical id" |sort | uniq | wc -l

# 查询每颗物理CPU核数
lscpu | grep "per socket"
cat /proc/cpuinfo | grep "core id" | sort | uniq | wc -l

# 查询系统的每颗物理CPU核心是否启用超线程技术
lscpu | grep -e "per socket" -e "per core"
cat /proc/cpuinfo | grep -e "cpu cores" -e "siblings" | sort | uniq

# 查询系统具有多少个逻辑CPU
lscpu | grep -i "CPU(s):"
cat /proc/cpuinfo | grep "processor" | wc -l

lscpu查看到的Core(s) per socket表示这颗物理CPU有多少核心,Thread(s) per core表示每个核心能同时处理多少线程。

参考文档:/proc/cpuinfo文件解读(超易理解)

1.3. 查看内存

1
2
3
4
# 查看内存
free -h
free -m
cat /proc/meminfo

1.4. 查看磁盘

1
2
lsblk
df -h

1.5. 查看显卡

1
2
3
4
lspci | grep -i vga # 最前面的序号是显卡代号
lspci | grep -i nvidia
lspci -v -s 02:00.0 # 通过显卡序号查看显卡详情
lshw -numeric -C display # 查看所有显卡详情

1.6. 查看网卡

1
lspci | grep Ethernet # 查看网卡是百兆、千兆、还是万兆网卡

2. 查看系统信息

2.1. 查看系统版本

1
2
3
4
5
lsb_release -a
cat /etc/issue
cat /etc/os-release
cat /etc/centos-release
hostnamectl

2.2. 查看系统位数

1
2
3
4
uname -a
file /bin/ls
getconf LONG_BIT
hostnamectl

2.3. 查看内核版本

1
2
uname -a
hostnamectl

2.4. 查看是否是物理机

1
2
dmidecode -s system-product-name
hostnamectl

2.5. 查看系统日志

1
2
3
4
dmesg -T
dmesg -T | grep -i -e "error" -e "fail"

journalctl -xb

dmesg用于显示内核环境下的系统日志,包括内核启动时的信息、硬件检测信息、内核模块加载信息、内核错误等。通常用于诊断系统启动和运行时出现的问题。dmesg命令显示的日志信息来自系统内核环缓冲区,因此是最新的系统日志。

journalctl -xb命令用于查看 systemd 日志,输出系统启动时的所有日志信息,包括内核消息、系统服务和应用程序的日志信息。其中,-x 参数显示完整的日志信息,-b 参数表示显示系统启动时的日志信息。

通过 journalctl -xb 命令,可以查看系统启动时的各个服务启动情况,应用程序启动情况,以及其他系统级别的消息。可以用来诊断系统启动过程中的错误和问题。

更多journalctl的用法,参考文档《systemctl命令》

2.6. 查看重启前的系统日志

/var/log目录下存在dmesg日志文件:

1
2
3
4
dmesg
dmesg.0
dmesg.1.gz
...

dmesg 日志文件中保存的是本次重启后的日志,而 dmesg.0 是这次重启前的 dmesg 日志,dmesg.1.gz 是上次重启前的 dmesg 日志,依次类推。

1
2
journalctl -k -b -1
journalctl -r -k -b -1

3. 系统配置

3.1. 修改默认shell

1
2
3
4
echo $SHELL
cat /etc/shells
which bash
chsh -s /bin/bash

3.2. 显示颜色

1
vim ~/.bashrc

取消 force_color_prompt=yes 的提示。

3.3. 禁止检查邮件

系统经常提示:您在 /var/spool/mail/root 中有新邮件

1
2
echo "unset MAILCHECK" >> /etc/profile
source /etc/profile

3.4. 添加用户

1
2
useradd -m voidking -s /bin/bash
passwd voidking

3.5. 给用户添加sudo权限

参考文档:《shell命令之sudo》

3.6. 添加用户组

1
groupadd docker

3.7. 添加用户到用户组

1
2
usermod -G docker -a gitlab-runner
usermod -G root -a gitlab-runner

3.8. 用户切换用户组

如果一个用户属于多个用户组,可以切换默认用户组。

1
2
newgrp docker
id

3.9. 从用户组删除用户

1
2
gpasswd -d docker gitlab-runner
groups gitlab-runner

或者直接修改 /etc/group 文件,删除对应行。

3.10. 删除用户

删除用户和用户目录

1
userdel -r voidking

删除用户,然后删除用户目录

1
2
3
userdel voidking

find /home/ -nouser | xargs rm -rfv

3.11. 切换用户

切换root

1
2
3
sudo -i
# or
sudo su

切换普通用户

1
su voidking

3.12. 修改用户家目录

1
2
usermod -d /data/voidking voidking # 切换用户家目录到 /data/voidking
usermod -md /data/voidking voidking # 切换用户家目录,同时把原来家目录中的内容移动到新的家目录

对于root用户,需要先进入单用户模式,才能进行修改家目录操作。

3.13. 添加字体

查看字体

1
fc-list

添加字体

1
2
3
4
mkdir -p /usr/share/fonts/win/
cd /usr/share/fonts/win/
rz # 或者 wget/scp
tar -xzvf fonts.tgz

添加字体后更新缓存

1
2
fc-cache -fv
fc-list

3.14. 设置临时IP

添加临时IP

1
ip addr add 192.168.51.20/24 dev em1

删除临时IP

1
ip addr del 192.168.51.20/24 dev em1

3.15. 网桥从属网卡

两台主机通过网线直连,并且设置了临时IP后,如果发现互ping不通,那么可以检查下桥接从属网卡配置。
有的时候,一个网桥可能会添加多个从属网卡,从而导致网卡设置了IP但是不通。

从属网卡在网络中起到以下作用:

  • 扩展网络端口:通过将多个网卡添加到网桥或交换机上,可以增加网络设备的端口数量,从而连接更多的设备或虚拟机。
  • 实现网络聚合:从属网卡可以用于实现网络聚合,将多个物理网卡绑定在一起,提供更高的带宽和冗余。
  • 实现冗余和容错:通过将多个从属网卡连接到网桥或交换机上,可以实现冗余路径,当一个路径发生故障时,可以切换到其他路径,提高网络的可靠性和容错性。
  • 提供网络隔离:从属网卡可以用于隔离网络流量,将不同类型的流量或不同网络的流量分开处理,增加网络的安全性和性能。

查看网桥信息

1
2
3
ip addr # 可以查看到网卡从属的网桥
brctl show
bridge link

增加网桥从属网卡

1
bridge link set dev eth2 master br0

删除网桥从属网卡

1
2
3
ip link set dev eth2 down
brctl delif br0 eth2
ip link set dev eth2 up

3.16. 确定网卡编号和网口对应关系

1
ethtool -p eth2

执行上面的命令后,观察网口,闪烁的那个网口就是网卡编号对应的网口。

3.17. 修改网卡配置

1、查看网卡配置

1
ethtool eth2

2、设置网卡千兆全双工

1
ethtool -s eth2 speed 1000 duplex full

3.18. 修改内核参数

1、查看内核参数,例如

1
sysctl net.core.rmem_max

2、修改内核参数,例如

1
sysctl -w net.core.rmem_max=2097152

3、永久生效修改内核参数

1
2
3
vim /etc/sysctl.conf
# 写入 net.core.rmem_max=2097152
sysctl -p

如果用的是其它的配置文件,那么需要指定它,例如

1
sysctl -p /etc/sysctl.d/mysettings.conf

参考文档:Linux 实例常用内核参数介绍

4. 软件安装

4.1. 查看命令属于哪个软件包

1、centos7

1
2
yum makecache fast
yum whatprovides lsb_release

2、ubuntu

1
2
3
apt-get install -y apt-file
apt-file update
apt-file search ifconfig

4.2. 重建软件安装源

centos7

1
2
3
4
5
cd /etc/yum.repos.d
rm -f *.repo
scp 192.168.56.101:/etc/yum.repos.d/* .
yum clean all
yum makecache fast

4.3. EPEL源

EPEL(ExtraPackagesforEnterpriseLinux)是基于Fedora的一个项目,为RedHat系的操作系统提供额外的高质量软件包。

1
yum install epel-release

安装epel源之后,可以安装很多原本 No package xxx available 的软件,比如jq:

1
yum install jq

4.4. 安装指定版本软件

以安装Docker为例,参考文档《Docker入门篇》

5. 问题排查

5.1. 查看CPU负载

1
2
3
4
top
top # 按1,查看每个逻辑CPU的使用情况
uptime
htop

一个逻辑CPU可以处理一个线程,一般当 load average 超过逻辑CPU数量的70%,就可以认为 CPU 的负载较高。

5.2. 查看内存占用

查看内容总的占用情况

1
free -h

查看哪个进程占用内存较多

1
2
3
top # 然后输入大写的M

ps aux --sort=-%mem | head

5.3. 查看磁盘空间占用

1
2
3
4
5
6
7
du -sh * # 不包含隐藏文件
du -sh .[!.]* # 查看隐藏文件

cd /
du -sh * --exclude=proc --exclude=data* # 通过字符串匹配排除一些目录或文件,也会排除匹配到的子目录和子文件

du -sh * --threshold=1G # 筛选大于1G的目录或文件

5.4. 查看磁盘空间占用(快速版)

当文件比较多时,du执行速度太慢,这时可以使用它的升级版ncdu(NCurses Disk Usage

1、安装ncdu

1
yum install -y ncdu

ncdu二进制安装方法

1
2
3
4
5
# wget https://dev.yorhel.nl/download/ncdu-2.2.1.tar.gz
wget https://dev.yorhel.nl/download/ncdu-2.2.1-linux-x86_64.tar.gz --no-check-certificate
tar -xzvf ncdu-2.2.1-linux-x86_64.tar.gz
cp ncdu /usr/local/bin
ln -s /usr/local/bin/ncdu /usr/bin/ncdu

2、扫描指定目录磁盘空间占用

1
ncdu /home/voidking

3、全局扫描磁盘空间占用

1
ncdu / --exclude=/data/mntnfs

等到扫描结束后,通过上下按键和Enter按键,可以查看每一个目录的磁盘空间占用情况。

5.5. 查看磁盘IO负载

1
iostat -x

在iostat命令的输出中,磁盘IO请求队列长度对应的是avgqu-sz字段,表示平均每秒的I/O请求队列长度。它可以用来判断系统的磁盘IO瓶颈情况,如果该值超过了磁盘的最大IO队列长度,就说明磁盘IO请求队列积压了,系统IO性能可能会受到影响。一般来说,当avgqu-sz值超过1时,就可能会有IO瓶颈的风险。

5.6. 测试磁盘读写性能

测试读取性能:

1
dd if=/path/to/testfile of=/dev/null bs=1M count=1000

从 /path/to/testfile 测试文件中读取数据并将其丢弃,将结果输出到/dev/null,以避免干扰测试。bs=1M指定每个数据块的大小为1MB,count=1000指定要读取的数据块数量。

测试写入性能:

1
dd if=/dev/zero of=/path/to/testfile bs=1M count=1000 conv=fdatasync

将/path/to/testfile替换为要进行测试的文件路径,bs=1M和count=1000指定了数据块的大小和数量,conv=fdatasync确保数据同步写入磁盘。

5.7. 查看网络负载

1
iftop

详情参考《iftop命令》

5.8. 查看会话数

1
ss

输出示例:

1
2
3
State      Recv-Q Send-Q      Local Address:Port       Peer Address:Port
LISTEN 0 128 *:22 *:*
LISTEN 0 100 127.0.0.1:25 *:*
  • State: 显示套接字的状态,比如 LISTEN 表示正在监听连接,ESTAB 表示连接已经建立。
  • Recv-Q: 接收队列的大小。
  • Send-Q: 发送队列的大小。
  • Local Address:Port: 本地 IP 地址和端口号。
  • Peer Address:Port: 远程 IP 地址和端口号。

5.9. 查看进程和线程

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看所有进程
ps -ef
# or
ps aux

# 查看所有进程,并且显示进程启动的全部命令
ps auxww

# 查看所有进程,并且显示进程的线程
ps -efL

# 查看某个进程的线程
ps -T -p 12345

5.10. 根据端口找进程

已知端口号(例如22),怎样查找对应的进程(PID)?怎样找到该进程启动命令?

方法一:使用lsof

1
2
lsof -i:22
ps -ef | grep 12345

方法二:使用netstat

1
2
netstat -nlp | grep ":22"
ps -ef | grep 12345

5.11. 查看端口是否可以正常连接

1
2
3
4
5
6
7
8
nc -v 192.168.56.101 8080
nc -zv -w 5 192.168.56.101 8080
# 成功返回0,5s超时失败返回1

telnet 192.168.56.101 8080
echo '' | timeout --signal=9 5 telnet 192.168.56.101 8080
echo 'q' | timeout --signal=9 5 telnet -e 'q' 192.168.56.101 8080
# 成功返回1,5s超时失败返回137

5.12. 查看进程资源占用

1、查看进程的实时资源占用

1
2
3
top -p 12234
# or
cat /proc/12345/status

2、查看进程从启动到此刻的资源占用平均值

1
ps aux | grep 12345

参考文档:

5.13. 查看本机IP地址

1、查看本机当前namespace所有IP地址
ifconfig 或者 ip address

2、获取某个网卡的IP地址
ifconfig eth0 | awk 'NR==2{print $2}'

5.14. 查看外网出口IP

curl myip.ipip.net

5.15. 查看局域网所有IP

需求:查看当前局域网已经分配的IP,已知局域网为192.168.56.0/24
1、通过扫描更新arp缓存

1
2
3
4
# 执行快,但是某些情况下无法更新arp缓存
nmap -sP 192.168.56.0/24
# 执行慢,但是肯定可以更新arp缓存
nmap -PR 192.168.56.0/24

2、查看本地arp缓存

1
2
cat /proc/net/arp | awk '{print $1}' | grep '192.168' | sort  
arp -a | awk '{print $2}' | grep '192.168' | sort

5.16. 根据IP排序

需求:/proc/net/arp中的内容,根据IP进行排序

1
cat /proc/net/arp | grep 192.168.56 | sort -t'.' -k1n,1 -k2n,2 -k3n,3 -k4n,4

5.17. 测试mtu值

MTU是Maximum Transmission Unit的缩写,表示最大传输单元,MTU的单位是字节。大部分网络设备的MTU都是1500。
把本机的MTU设成比网关的MTU小或相同,就可以减少丢包。如果本机的MTU比网关的MTU大,大的数据包就会被拆开来传送,这样会产生很多数据包碎片,增加丢包率。
把数据包长度加上数据包头28字节,就得到MTU的值。

1
2
ping -c 3 -s 1472 -M do www.baidu.com
ping -c 3 -s 1473 -M do www.baidu.com

5.18. 带宽测试

1、安装测试工具iperf

1
yum install -y iperf

2、启动iperf服务端

1
iperf -s

3、使用iperf客户端测试网速

1
iperf -c 192.168.56.112 -i 3

5.19. 跟踪系统调用

假设ls执行卡住,可以通过strace命令查看ls具体的执行情况

1
strace ls /mnt

5.20. 修复文件系统

fsck(file system check)是一个用于检查和修复文件系统中错误的命令。它可以检测和修复文件系统中的逻辑错误、链接错误、磁盘损坏、超级块错误等。fsck通过扫描文件系统和相关数据结构,以确定文件系统的状态,并尝试修复错误。它可以改善文件系统的健康状态和性能,并保护用户数据。

文件系统出错时的表现:

  • 系统无法启动。
  • 系统上的文件损坏(通常您可能会看到输入/输出错误)。
  • 连接的驱动器(包括闪存驱动器/SD 卡)未按预期工作。

1、卸载挂载

1
umount /dev/sdb

2、检查并修复文件系统

1
fsck -y /dev/sdb

参考文档:如何使用fsck修复Linux文件系统错误

5.21. 检测磁盘坏扇区

badblocks是一个用于检测坏磁盘扇区的命令。它通过扫描磁盘或磁盘分区,并标记坏扇区。坏扇区可能会导致数据丢失或读写错误,因此通过badblocks命令可以帮助识别和排除这些扇区。badblocks可以在文件系统创建之前或之后使用,以确保磁盘或分区没有坏扇区。

1、检测整个磁盘并输出到文件

1
badblocks -s -v -o /root/bb-sdb.log /dev/sdb

如果报错:badblocks: Value too large for defined data type invalid end block (15625879552): must be 32-bit value

那么需要修改命令为:

1
badblocks -b 5120 -s -v -o /root/bb-sdb.log /dev/sdb

-b 参数默认为512,意思为512字节一扇区,对于大硬盘需要把这个参数修改为5120,那么就能顺利执行了。最后得到的结果也要除以10,就是真正的坏道位置了。

2、暴力写测试整个磁盘

1
badblocks -s -w /dev/sdb 

参考文档:badblocks

6. Uncategories

6.1. 时间和时间戳

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 输出时间
date

# 输出时间并格式化
date "+%Y-%m-%d %H:%M:%S"

# 时间转时间戳(秒)
date "+%s"

# 时间转时间戳(微秒)
microsecond=$(($(date "+%s%N")/1000000))

# 时间戳(秒)转时间
date -d @1612351314 "+%Y-%m-%d %H:%M:%S"

6.2. 还原history

万万没想到,centos4.3的history -c命令,不止会清除当前登录的操作历史记录,还会清除 .bash_history 中的内容。

如果不小心清除了 .bash_history 中的内容,该怎么办?如果屏幕上还残留着history的历史记录,那么还有得救。
拷贝屏幕上的内容,到 history.txt,假设内容为:

1
2
3
244486  2021-01-08 17:35:18 cd haojin
244487 2021-01-08 17:36:01 vim main.py
244488 2021-01-08 17:38:33 python main.py

怎么恢复成标准的 .bash_history 格式呢?使用如下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/bash

cat /dev/null > bash_history
while read line
do
time=$(echo $line | awk '{print $2" "$3}')
#cmd=$(echo $line | awk '{$1="";$2="";$3="";print $0}')
cmd=$(echo $line | awk -F " " '{for (i=4;i<=NF;i++)printf("%s ", $i);print ""}')
timestamp=$(date -d "$time" +%s)
echo "#"$timestamp >> bash_history
echo $cmd >> bash_history
done < history.txt

执行完成,使用 bash_history 替换 .bash_history 即可。

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-shell-system/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~