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

0%

好好学Linux:系统管理常用命令

1. 前言

本文记录linux中系统管理时常用的命令,备忘。

2. 查看硬件配置

2.1. 查看服务器型号

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

2.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文件解读(超易理解)

2.3. 查看内存

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

2.4. 查看磁盘

1
2
lsblk
df -h

2.5. 查看显卡

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

2.6. 查看网卡

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

3. 查看系统信息

3.1. 查看系统版本

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

3.2. 查看系统位数

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

3.3. 查看内核版本

1
2
uname -a
hostnamectl

3.4. 查看是否是物理机

1
2
dmidecode -s system-product-name
hostnamectl

4. 系统配置

4.1. 修改默认shell

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

4.2. 显示颜色

1
vim ~/.bashrc

取消 force_color_prompt=yes 的提示。

4.3. 禁止检查邮件

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

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

4.4. 添加用户

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

4.5. 给用户添加sudo权限

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

4.6. 添加用户组

1
groupadd docker

4.7. 添加用户到用户组

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

4.8. 用户切换用户组

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

1
2
newgrp docker
id

4.9. 从用户组删除用户

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

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

4.10. 删除用户

删除用户和用户目录

1
userdel -r voidking

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

1
2
3
userdel voidking

find /home/ -nouser | xargs rm -rfv

4.11. 切换用户

切换root

1
2
3
sudo -i
# or
sudo su

切换普通用户

1
su voidking

4.12. 修改用户家目录

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

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

4.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

4.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

4.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

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

1
ethtool -p eth2

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

4.17. 修改网卡配置

1、查看网卡配置

1
ethtool eth2

示例输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Settings for eth2:
Supported ports: [ TP ]
Supported link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Supported pause frame use: Symmetric
Supports auto-negotiation: Yes
Supported FEC modes: Not reported
Advertised link modes: 10baseT/Half 10baseT/Full
100baseT/Half 100baseT/Full
1000baseT/Full
Advertised pause frame use: Symmetric
Advertised auto-negotiation: Yes
Advertised FEC modes: Not reported
Speed: 100Mb/s
Duplex: Full
Auto-negotiation: on
Port: Twisted Pair
PHYAD: 1
Transceiver: internal
MDI-X: off (auto)
Supports Wake-on: pumbg
Wake-on: g
Current message level: 0x00000007 (7)
drv probe link
Link detected: yes

从输出可以看出,网卡支持千兆,但是实际上的速度是百兆。

2、设置网卡千兆全双工

1
2
3
ethtool -s eth2 speed 1000 duplex full
# or
ethtool -s eth2 speed 1000 duplex full autoneg on

如果执行完上面的命令后,主机断网,那么请检查网线是否支持千兆,大概率是网线的问题。

4.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 实例常用内核参数介绍

5. 软件安装

5.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

5.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

5.3. EPEL源

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

1
yum install epel-release

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

1
yum install jq

5.4. 安装指定版本软件

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

6. 问题排查

参考文档:《shell命令之问题排查》

7. Uncategories

7.1. 跟踪系统调用

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

1
strace ls /mnt

7.2. 时间和时间戳

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"

7.3. 还原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 即可。