Linux常用配置项

修改主机名

1
2
3
# 注意:主机名不要使用下划线,但支持横线、数字. 数字中间也不要使用小数点,会导致一些服务起不来
hostname ubuntu18-04 # 临时设置主机名
hostnamectl set-hostname ubuntu18-04 # 永久设置主机名

创建账号和修改密码

CentOS批量添加用户和修改密码_批量修改centos6服务器用户密码_烟雨醉梦里的博客-CSDN博客

Linux:如何在centos下创建新用户名和密码_centos创建用户_技术探索者的博客-CSDN博客

centos 7修改用户名和密码_centos7修改用户名_古人诚不我欺的博客-CSDN博客

Centos 7 忘记密码重置用户密码 - 简书 (jianshu.com)

创建账号/修改密码

1
2
# 修改账号密码
echo 密码 | passwd --stdin 账号名

配置开机默认用户

配置文件路径:/etc/gdm/custom.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
vim  /etc/gdm/custom.conf
# GDM configuration storage
[daemon]
# Uncomment the line below to force the login screen to use Xorg
#WaylandEnable=false
[security]
[xdmcp]
[chooser]
[debug]
# Uncomment the line below to turn on debugging
#Enable=true

# 在 [daemon] 下写入:
AutomaticLoginEnable=True
AutomaticLogin=<用户名>

重启系统后即可自动进入你指定的账户了。

配置静态IP地址

Centos 7配置静态IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 编辑网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static # 静态
IPADDR=10.0.0.181 # IP地址
PREFIX=24 # 子网掩码
DNS=10.0.0.1 # DNS地址
GATEWAY=10.0.0.1 # 网关地址
DEFROUTE=yes
NAME=eth0
DEVICE=eth0
ONBOOT=yes # 开启自动启动
#重启网络
systemctl restart network

ubuntu配置静态IP地址

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
27
28
29
30
31
32
33
34
35
36
37
# 18.04和20.04的网卡配置文件名是01-netcfg.yaml, 22.04版本变为00-installer-config.yaml
# 编辑网卡配置文件
vim /etc/netplan/01-netcfg.yaml
network:
ethernets:
eth0: #网卡名
addresses: [10.0.0.182/24] #静态IP地址
dhcp4: no #取消ipv4的dhcp
optional: true
gateway4: 10.0.0.1 #网关地址
nameservers:
addresses: [180.76.76.76,223.5.5.5 ] #DNS地址,多个用逗号分隔,中间不要有空格
version: 2
renderer: networkd
#重启网络
sudo netplan apply

# 2204配置静态IP地址,gateway4已经被弃用需要使用routes参数配置网关
vim /etc/netplan/00-installer-config.yaml
network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
dhcp6: no
addresses:
- 10.0.0.10/24
routes:
- to: default
via: 10.0.0.2
nameservers:
addresses:
- 180.76.76.76
- 223.5.5.5
# 重启网络
sudo netplan apply

Centos 8配置静态IP地址

在centos 8之后,使用systemctl restart network命令重启网络时,会出现以下报错:

1
2
Failed to restart network.service: Unit network.service not found.
意思为无法重启网络服务,原因是无法找到network.service网络服务。

在rhel8(含centos8)上,在/etc/sysconfig/network-scripts/里也看不到任何脚本文件(centos7中此路径下包含网卡配置文件和一些脚本),没有传统的network.service。因此只能通过NM命令工具集进行网络配置。换言之,在rhel8上,必须开启NM,否则无法使用网络。

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
27
28
# 编辑网卡配置文件
vim /etc/sysconfig/network-scripts/ifcfg-ens32
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=066b4926-b40c-4c28-a5b4-2310d2b96613
DEVICE=eth0
ONBOOT=yes
IPADDR=192.168.1.200
NETMASK=255.255.255.0
GATEWAY=192.168.1.254
DNS1=223.5.5.5
DNS2=180.76.76.76
PREFIX=24

# 重载重载ens32 网卡
nmcli c reload eth0
# 启用connection(相当于ifup)
nmcli c up eth0

nmcli常用命令一览

Centos8 配置静态IP - 浅雨凉 - 博客园 (cnblogs.com)

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 查看ip(类似于ifconfig、ip addr)
nmcli

# 创建connection,配置静态ip(等同于配置ifcfg,其中BOOTPROTO=none,并ifup启动)
nmcli c add type ethernet con-name ens32 ifname ens32 ipv4.addr 192.168.1.100/24 ipv4.gateway 192.168.1.1 ipv4.method manual
# 创建connection,配置动态ip(等同于配置ifcfg,其中BOOTPROTO=dhcp,并ifup启动)
nmcli c add type ethernet con-name ens32 ifname ens32 ipv4.method auto

# 修改ip(非交互式)
nmcli c modify ens32 ipv4.addr '192.168.1.200/24'
nmcli c up ens32

# 启用connection(相当于ifup)
nmcli c up ens32

# 停止connection(相当于ifdown)
nmcli c down

# 删除connection(类似于ifdown并删除ifcfg)
nmcli c delete ens32

# 查看connection列表
nmcli c show

# 查看connection详细信息
nmcli c show ens32

# 重载所有ifcfg或route到connection(不会立即生效)
nmcli c reload

# 立即生效connection,有3种方法
nmcli c up ens32
nmcli d reapply ens32
nmcli d connect ens32

# 查看device详细信息
nmcli d show # 查看所有device详细信息
nmcli d show ens32 # 查看指定device的详细信息

# 查看NM纳管状态
nmcli n

# 开启NM纳管
nmcli n on

# 关闭NM纳管(谨慎执行)
nmcli n off

yum、apt的基本使用

yum/dnf常用命令

DNF,即DaNdiFied,是新一代的RPM软件包管理器。DNF 发行日期是2015年5月11日,DNF 包管理器采用Python 编写,发行许可为GPL v2,首先出现在Fedora 18 发行版中。在 RHEL 8.0 版本正式取代了 YUM,DNF包管理器克服了YUM包管理器的一些瓶颈,提升了包括用户体验,内存占用,依赖分析,运行速度等.

yum客户端配置文件

1
2
/etc/yum.conf               #为所有仓库提供公共配置
/etc/yum.repos.d/*.repo: #为每个仓库的提供配置文件

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
yum instll -y package_name    # 安装指定软件包并确认安装
yum update # 更新系统中所有软件包
yum upgrade package_name # 升级指定的软件包:
yum repolist # 列出可用的镜像源
yum list # 列出所有可用的package和package组,会有大量输出
yum clean all # 清除所有缓冲数据
yum makecache # 缓存本地yum源
yum provides httpd # 查看提供某个命令的rpm包
yum deplist httpd # 列出一个包所有依赖的包
yum remove package_name # 删除指定软件包
yum install --downloadonly --downloaddir=/package_installdir/ package_name # 软件包仅下载不安装,如果下载的包有依赖也会一起下载. 如果提示没有--downloadonly选项则需要安装yum-plugin-downloadonly软件包(只有centos 6需要);
yum search package_name # 搜索可用的软件包
yum info package_name # 显示已安装的软件包的信息
yum installed # 查看已经安装的包
yum list available # 查看可安装的包
yum list updates # 查看可以升级的包
yum check-update # 检查更新

yum仓库管理

1
2
3
4
5
yum repolist all               # 显示所有资源库
yum repolist enabled # 显示所有已启动的资源库
yum repolist disabled # 显示所有被禁用的资源库
yum-config-manager --disable epel # 禁用仓库epel
yum-config-manager --enable epel #启用仓库epel

apt常用命令

apt 相当于 apt-get、apt-cache apt-config 中最常用命令选项的集合

apt 具有更精减但足够的命令选项,而且参数选项的组织方式更为有效。此外,启用的几个特性也非常 有帮助。例如:可以在使用 apt 命令安装或删除程序时看到进度条,apt 还会在更新存储库数据库时提示

用户可升级的软件包个数 apt 与 apt-get 有一些类似的命令选项,但它并不能完全向下兼容 apt-get 命令,也即可用 apt 替换部分 apt-get 系列命令,但不是全部.

APT包索引配置文件:

1
2
/etc/apt/sources.list 
/etc/apt/sources.list.d

常用命令

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
27
apt list                  #列出包含条件的包(已安装,可升级等),等于yum list
apt list --installed #列出已安装的软件包
apt edit-sources #编辑source源⽂件
apt search apache2 #搜索安装包apache2
apt show apache2 #或者apt-cache show apache2 更详细, 查看仓库中软件包的详细信息
apt-cache madison nginx #查看仓库中软件包有哪些版本可以安装
apt install apache2 #或者apt-get install apache2, 在线安装软件包apache2
apt install nginx=1.14.0-0ubuntu1.6 #安装软件包的时候指定安装具体的版本,配合apt-cache madison使用
apt remove apache2 #卸载单个软件包但是保留配置⽂件
apt purge apache2 #卸载单个软件包以及删除配置⽂件
apt autoremove apache2 #删除安装包并解决依赖关系
apt update #更新本地软件包列表索引,修改了apt仓库后必须执⾏
apt upgrade #升级所有已安装且可升级到新版本的软件包
apt full-upgrade # 或者apt-get dist-upgrade, 在线升级整个系统软件包,自动处理依赖关系,必要时可以移除旧软件包。

#查看文件来自于哪个包,类似redhat中的yum provides <filename>
apt-file search 'string' #默认是包含此字符串的文件
apt-file search -x '正则表达式'
apt-file search -F /path/file

#查询软件xxx依赖哪些包
apt depends xxx
apt-cache depends xxx

#查询软件xxx被哪些包依赖
apt rdepends xxx
apt-cache rdepends xxx

安装常用软件包

ubuntu

1
2
3
4
5
apt install purge ufw lxd lxd-client lxcfs lxc-common
apt install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip libevent-dev
apt install procps # top 命令
apt install iputils-ping # ping 命令
apt install net-tools # 网络工具

centos

1
2
# 最小化安装建议的软件包
yum install gcc make autoconf gcc-c++ glibc glibc-devel pcre pcre-devel openssl openssl-devel systemd-devel zlib-devel vim lrzsz tree tmux lsof tcpdump wget net-tools iotop bc bzip2 zip unzip nfs-utils man-pages autofs

rpm、dpkg包的基本查询和使用

rpm常用命令

RPM包默认安装路径: 通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到目录中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 默认安装路径	            含 义
/etc/ # 配置文件安装目录
/usr/bin/ # 可执行的命令安装目录
/usr/lib/ # 程序所使用的函数库保存位置
/usr/share/doc/ # 基本的软件使用手册保存位置
/usr/share/man/ # 帮助文件保存位置


# rpm常用命令
rpm -Uvh 包全名 # RPM 包的升级
rpm -ivh xxx.rpm # 安装 RPM, 后跟详细路径,h显示进度,v显示过程
rpm -ivh xxx.rpm --force # 强行安装
rpm -e 包全名 # 卸载
rpm -qa vsftpd # 查询安装的包,后跟明确的包名,以vsftpd为例
rpm -qa |wc -l # 列出所有安装的包,并统计数量
rpm -qa |grep vsft # 利用grep进行模糊搜索,如搜索vsftpd包
rpm -qi vsftpd # 查看包的信息,安装日期等
rpm -ql vsftpd # 列出包中所有文件列表
rpm -qc vsftpd # 列出包的配置文件
rpm -q --scripts vsftpd #列出包中的脚本文件
rpm -qf /etc/issue # 查看某个文件来自哪个包,如/etc/issue

dpkg常用命令

注意:一般建议不要使用dpkg卸载软件包。因为删除包时,其它依赖它的包不会卸载,并且可能无法再正常运行

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
27
28
29
30
31
32
#安装包
dpkg -i package.deb

#删除包,不建议,不自动卸载依赖于它的包
dpkg -r package

#删除包(包括配置文件)
dpkg -P package

#列出当前已安装的包,类似rpm -qa
dpkg -l

#查看软件包信息
dpkg -I package.deb

#列出该包的状态,包括详细信息,类似rpm –qi
dpkg -s package

#列出该包中所包含的文件,类似rpm –ql
dpkg -L package

#搜索包含pattern的包,类似rpm –qf
dpkg -S <pattern>

#配置包,-a 使用,配置所有没有配置的软件包
dpkg --configure package

#列出 deb 包的内容,⽂件及⽬录内容,类似rpm –qpl
dpkg -c package.deb

#解开 deb 包的内容
dpkg --unpack package.deb

配置sshd root远程登陆

默认情况下,ubuntu不允许root⽤⼾远程ssh,如果有实际场景需要允许 root⽤⼾远程ssh,则需要设置root密码,并且编辑/etc/ssh/sshd_config ⽂件(注意,不是/etc/ssh/ssh_config文件)修改如下 :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
vim /etc/ssh/sshd_config
32 #PermitRootLogin prohibit-password #默认为禁⽌登录
33 PermitRootLogin yes #改为允许登录
57 #PasswordAuthentication yes
58 PasswordAuthentication yes #打开密码认证,其实默认就是允许通过密码认证登录

su - root #切换到root⽤户环境
passwd root #设置密码
systemctl restart sshd #重启ssh服务并测试root⽤户远程ssh连接


# 使用命令修改ssd配置文件
sudo sed -i 's/^#\?PermitRootLogin.*/PermitRootLogin yes/g' /etc/ssh/sshd_config;
sudo sed -i 's/^#\?PasswordAuthentication.*/PasswordAuthentication yes/g' /etc/ssh/sshd_config;
# 重启服务
systemctl restart sshd

修改网卡名称为eth0

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# 编辑grub配置文件/etc/sysconfig/grub
sudo vim /etc/default/grub
# 在GRUB_CMDLINE_LINUX前面添加参数net.ifnames=0 biosdevname=0,前后使用空格分隔
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 find_preseed=/preseed.cfg auto noprompt priority=critical locale=en_US"
# ubuntu重新生成grub配置并更新内核参数
grub-mkconfig -o /boot/grub/grub.cfg
#centos重新生成grub配置并更新内核参数
grub2-mkconfig -o /boot/grub2/grub.cfg
# 或者都可以使用下面的命令更新grub配置
sudo update-grub
# 重启
reboot

#centos修改网卡配置文件: 复制网卡配置文件, 名称可能会不同
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-eth0
#编辑网卡配置文件, 修改网卡名称
vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=static
IPADDR=10.0.0.181
PREFIX=24
DNS=10.0.0.1
GATEWAY=10.0.0.1
DEFROUTE=yes
NAME=eth0 #修改为新的eth0
DEVICE=eth0 #修改为新的eth0
ONBOOT=yes
#重启网络
systemctl restart network

# ubuntu修改网卡配置文件, 名称可能不同,使用tab补全即可
vim /etc/netplan/01-netcfg.yaml
network:
ethernets:
eth0: #修改网卡名
addresses: [10.0.0.182/24] #静态IP地址
dhcp4: no #取消ipv4的dhcp
optional: true
gateway4: 10.0.0.1 #网关地址
nameservers:
addresses: [180.76.76.76,223.5.5.5 ] #DNS地址,多个用逗号分隔
version: 2
renderer: networkd
#重启网络
sudo netplan apply

查看和关闭防火墙

1
2
3
4
5
6
7
# centos 7/8
systemctl stop firewalld
systemctl disable --now firewalld
systemctl status firewalld

# ubuntu
sudo ufw disable && sudo ufw status

查看和关闭Selinux

1
2
3
4
5
6
7
8
9
10
11
12
13
# Ubuntu 中默认没有安装 SELinux, Ubuntu有一个类似于SELinux的强制访问控制系统,名为AppArmor。
sudo systemctl status apparmor # 查看apparmor状态
sudo systemctl stop apparmor # 停止apparmor
sudo systemctl disable apparmor # 禁止apparmor

# 查看selinux状态
sestatus # 或者 getenforce
# 查看selinux配置文件, SELinux共有3个状态enforcing (执行中)、permissive(不执行但产生警告)、disabled(关闭)
cat /etc/selinux/config
#临时关闭selinux, 设置为permissive模式;setenforce 1 设置为enforcing模式;
setenforce 0
#永久关闭selinux需要编辑配置文件
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/config

查看和关闭swap分区

1
2
3
4
5
6
7
8
9
swapoff -a   # 临时关闭

# 永久关闭swap需要编辑配置文件,将swap分区注释掉并重启生效
vim /etc/fstab
/dev/mapper/rl-root / xfs defaults 0 0
UUID=e309bcf8-7056-4f7d-961a-3e6c8b1e2c48 /boot xfs defaults 0 0
UUID=D330-01CD /boot/efi vfat umask=0077,shortname=winnt 0 2
/dev/mapper/rl-home /home xfs defaults 0 0
# /dev/mapper/rl-swap none swap defaults 0 0 #注释掉swap分区

配置系统服务systemd

systemd(是的,全小写,即使在句子开头也是小写),是初始化程序(init)和 SystemV 初始化脚本的现代替代者。

像 init 一样,systemd 是所有进程之母,它负责使 Linux 主机启动到可以做生产性任务的状态。systemd 设定的一些功能比老的初始化程序要广泛得多,它要管理正在运行的 Linux 主机的许多方面,包括挂载文件系统、管理硬件、处理定时器以及启动和管理生产性主机所需的系统服务。

centos6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
service [服务] start     # 启动服务
service [服务] stop #停止服务
service [服务] restart #重启服务
service [服务] status #查看服务状态
chkconfig [服务] on #设置服务在各等级为on,开机启动,“各等级”包括2、3、4、5等级
chkconfig [服务] off #设置服务禁止开机启动
chkconfig --add name #添加service, 添加一个chkconfig管理的service,并在/etc/rc[0-6].d 目录下添加相应的符号链接
chkconfig --del name #删除service, 从chkconfig 管理名单中删除该service,并且删除 /etc/rc[0-6].d 目录下所有与之关联的符号链接
chkconfig --list [name] # 列出service的启动信息, 如果不指定name,会列出所有services的信息。

# 设置service运行级别
chkconfig --level 2345 httpd on #设置httpd在运行级别为2、3、4的情况下都是on(开启)的状态
#指定运行级为2,3,4,5
#等级0表示:表示关机
#等级1表示:单用户模式
#等级2表示:无网络连接的多用户命令行模式
#等级3表示:有网络连接的多用户命令行模式
#等级4表示:不可用
#等级5表示:带图形界面的多用户模式
#等级6表示:重新启动

centos7/8、ubuntu

可能是史上最全面易懂的 Systemd 服务管理教程!( 强烈建议收藏 )-腾讯云开发者社区-腾讯云 (tencent.com)

常用命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 配置文件
/etc/systemd/system:系统或用户自定义的配置文件 Ubuntu: Unit文件指向该目录
/run/systemd/system:软件运行时生成的配置文件
/usr/lib/systemd/system:系统或第三方软件安装时添加的配置文件。 CentOS 7/8:Unit 文件指向该目录

systemctl daemon-reload #重新加载服务,每次修改了 unit 的配置文件后,需要执行以下命令重新加载 unit 的配置文件
systemctl enable docker #设置开机自动启动docker
systemctl status docker #查看 docker服务状态
systemctl start docker #启动docker
systemctl enable --now docker #立即启动并设置为开机启动
systemctl disable docker #取消 unit 开机启动

systemctl is-enabled docker #查看 unit 是否开机启动
systemctl cat docker.service #查看 Unit 配置文件的内容
systemctl -H [email protected] status httpd.service # 显示远程主机的某个 Unit 的状态

# 列出所有正在运行的服务(即所有已加载和正在运行的服务)
systemctl list-units --type=service --state=running #或者 systemctl --type=service --state=running

# 列出所有已加载但处于活动状态的服务,包括正在运行的服务和已退出的服务,可以添加--state选项,其值为active
systemctl list-units --type=service --state=active #或者 systemctl --type=service --state=active

target启动管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看当前系统的所有 Target
systemctl list-unit-files --type=target

systemctl list-units --type=target # 获取当前正在使用的运行target

# 查看一个 Target 包含的所有 Unit
systemctl list-dependencies multi-user.target

# 查看启动时的默认Target运行级别
systemctl get-default

# 设置启动时的默认 Target运行级别为mulit-user,进入图形化界面,需要重启才能看到效果
systemctl set-default multi-user.target
# 设置启动时的默认 Target运行级别为mulit-user, 不进入图形界面的多用户模式,需要重启才能看到效果。
systemctl set-default graphical.target

systemctl isolate multi-user.target # 在不重启的情况下,切换到运行级别mulit-user下
systemctl isolate graphical.target # 在不重启的情况下,切换到图形界面下

systemctl: 用于检查和控制各种系统服务和资源的状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 重启系统
systemctl reboot

# 关闭系统,切断电源
systemctl poweroff

# 进入睡眠模式,暂停系统
systemctl suspend

# 系统进入休眠状态
systemctl hibernate

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

# 强制进入救援状态(单用户状态)
systemctl rescue
# 强制进入紧急救援模式
systemctl emergency

systemd-analyze: 显示此次系统启动时运行每个服务所消耗的时间,可以用于分析系统启动过程中的性能瓶颈

1
2
3
4
5
6
7
8
9
10
11
# 查看启动耗时
systemd-analyze

# 查看每个服务的启动耗时
systemd-analyze blame

# 显示瀑布状的启动过程流
systemd-analyze critical-chain

# 显示指定服务的启动流
systemd-analyze critical-chain atd.service

hostnamectl: 查看和修改系统的主机名和主机信息

1
2
3
4
5
# 显示当前主机的信息
hostnamectl

# 设置主机名。
hostnamectl set-hostname rhel7

timedatectl: 用于查看和管理系统的时间和时区信息

1
2
3
4
5
6
7
8
9
10
11
# 查看当前时区设置
timedatectl

# 显示所有可用的时区
timedatectl list-timezones

# 设置当前时区
timedatectl set-timezone America/New_York #设置时区为美国纽约
timedatectl set-timezone Asia/Shanghai #设置时区为中国上海
timedatectl set-time YYYY-MM-DD #设置年,月,日
timedatectl set-time HH:MM:SS #设置时间:小时,分钟,秒

loginctl: 用于管理系统已登录用户和 Session 的信息

1
2
3
4
5
6
7
8
# 列出当前 session
loginctl list-sessions

# 列出当前登录用户
loginctl list-users

# 列出显示指定用户的信息
loginctl show-user ruanyf

systemd-ask-password: 辅助性工具,用星号屏蔽用户的任意输入,然后返回实际输入的内容

1
2
PASSWORD=$(systemd-ask-password "Input Your Passowrd:")
systemd-detect-virt

systemd-detect-virt:显示主机的虚拟化类型

1
systemd-detect-virt

systemd-run: 用于将任意指定的命令包装成一个临时的后台服务运行

systemd-run 中文手册 金步国

systemd-run 可以将一个指定的操作变成后台运行的服务。它的效果似乎与直接在命令后加上表示后台运行的 & 符号很相似。然而,它让命令成为服务还意味着,它的生命周期将由 Systemd 控制。具体来说,包括以下好处:

  • 服务的生命击期由 Systemd 接管,不会随着启动它的控制台关闭而结束
  • 可以通过 systemctl 工具管理服务的状态
  • 可以通过 journalctl 工具查看和管理服务的日志信息
  • 可以通过 Systemd 提供的方法限制服务的 CPU、内存、磁盘 IO 等系统资源的使用情况。

systemd unit配置文件

[systemd.index 中文手册 ]https://www.jinbuguo.com/systemd/systemd.index.htm

unit部分: systemd.unit 中文手册

service部分: systemd.service

如何杀死进程: systemd.kill 中文手册

进程环境变量: systemd.exec 中文手册

常见service unit文件示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# prometheus, 注意,每个单元之间必须有空行分开
vi /usr/lib/systemd/system/prometheus.service
[Unit]
Description=Prometheus server daemon
After=network.target

[Service]
Type=simple
User=prometheus #运行的用户
Group=prometheus #运行的组
KillMode=process
Restart=on-failure
ExecStart=/usr/local/prometheus/prometheus --config.file "/usr/local/prometheus/prometheus.yml" --web.listen-address "0.0.0.0:9090" --storage.tsdb.retention.time=60d #数据默认保存时间为15天,启动时加上此参数可以控制数据保存时间
ExecReload=/bin/kill -HUP $MAINPID

[Install]
WantedBy=multi-user.target

service unit文件说明

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
# docker
vim /usr/lib/systemd/system/docker.service
[Unit]
Description=Docker Application Container Engine # 当前 unit 的描述
Documentation=https://docs.docker.com # 文档地址
After=network-online.target firewalld.service time-set.target # 表示本 unit 应该在某服务之后启动,只涉及启动顺序,不涉及依赖关系

# 服务的依赖关系:
#Requires:表示本 unit 与其它 unit 之间存在强依赖关系,如果本 unit 被激活,此处列出的 unit 也会被激活,如果其中一个依赖的 unit 无法激活,systemd 都不会启动本 unit.
#Wants: 如果依赖的 unit 启动失败,不影响本 unit 的继续运行
#BindsTo:当指定的 unit 停止时,也会导致本 unit 停止
#PartOf:当指定的 unit 停止或重启时,也会导致本 unit 停止或重启
Wants=network-online.target

[Service]
# 设置进程的启动类型。必须设为 simple, exec, forking, oneshot, dbus, notify, idle之一
#simple: 默认值, ExecStart= 进程就是该服务的主进程, 并且 systemd 会认为在创建了该服务的主服务进程之后,该服务就已经启动完成。
#notify: 该服务将会在启动完成之后通过 [sd_notify](https://www.jinbuguo.com/systemd/sd_notify.html) 之类的接口发送一个通知消息。systemd 将会在启动后继单元之前, 首先确保该进程已经成功的发送了这个消息。
#dbus: 该服务只有获得了 BusName=指定的 D-Bus 名称之后,systemd 才会认为该服务启动完成,才会开始启动后继单元。 设为此类型相当于隐含的依赖于 dbus.socket 单元。
#forking: ExecStart=进程将会在启动过程中使用 fork()系统调用。 也就是当所有通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为主服务进程继续运行。 这是传统UNIX守护进程的经典做法。 在这种情况下,systemd 会认为在父进程退出之后,该服务就已经启动完成。 如果使用了此种类型,那么建议同时设置 PIDFile= 选项,以帮助 systemd 准确可靠的定位该服务的主进程。 systemd 将会在父进程退出之后 立即开始启动后继单元。
#idle: 与 simple`类似,不同之处在于, 服务进程将会被延迟到所有活动任务都完成之后再执行。
#exec: 只有在该服务的主服务进程执行完成之后,systemd 才会认为该服务启动完成。 其他后继单元必须一直阻塞到这个时间点之后才能继续启动。
#建议对长时间持续运行的服务尽可能使用 `Type=simple` (这是最简单和速度最快的选择)。 注意,simple类型的服务无法报告启动失败、也无法在服务完成初始化后对其他单元进行排序
#当当客户端需要通过仅由该服务本身创建的IPC通道(而非由 systemd 创建的套接字或 D-bus 之类)连接到该服务的时候, notify或 dbus(该服务必须提供 D-Bus 接口) 才是最佳选择, 这两种类型都允许服务进程精确的安排何时算是服务启动成功、何时可以继续启动后继单元。 notify类型需要服务进程明确使用 sd_notify()函数或类似的API, 否则,可以使用 forking作为替代(它支持传统的UNIX服务启动协议)。
Type=notify

ExecStart=/usr/local/bin/dockerd #服务启动时执行的命令和参数
ExecReload=/bin/kill -s HUP $MAINPID # 重启服务时执行的命令
TimeoutStartSec=0 #等待服务停止/启动的时间(以秒为单位)
RestartSec=2 # 重新启动服务前的睡眠时间(以秒为单位)

# 配置当服务的进程退出、被杀死或达到超时时是否重新启动服务
#no 服务将不会重新启动,这是默认设置
#on-failure 仅在服务进程异常退出时重启,所谓“异常退出”是指:退出码不为"0"
#on-abnormal 如果进程因信号或超时而终止时重新启动
#always 总是重新启动
Restart=always

StartLimitBurst=3
StartLimitInterval=60s

# PIDFile=该服务PID文件的路径(一般位于 /run/目录下)。 强烈建议在 Type=forking的情况下明确设置此选项。 如果设为相对路径,那么表示相对于 /run/目录。 systemd 将会在此服务启动完成之后,从此文件中读取主服务进程的PID 。

# WorkingDirectory=:设置进程的工作目录

# User=, Group=:设置进程在执行时使用的用户与组,既可以设为一个数字形式的 UID/GID 也可以设为一个字符串形式的名称

# BusName= 设置与此服务通信所使用的 D-Bus 名称。 在 `Type=dbus` 的情况下 必须明确设置此选项。

# ExecStartPre=: 服务启动之前执行的命令

# ExecStartPost=: 服务启动之后执行的命令

# ExecStop=:服务停止时执行的命令和参数

# ExecStopPost=:服务停止之后执行的命令

LimitNOFILE=infinity
LimitNPROC=infinity
LimitCORE=infinity
TasksMax=infinity
Delegate=yes

# 定义systemd如何停止服务
#control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
#process:只杀主进程
#mixed:主进程将收到SIGTERM信号,子进程收到SIGKILL信号
#none:没有进程会被杀掉,只是执行 ExecStop= 动作, 而不杀死任何进程。 这会导致即使单元已经停止, 但是该单元的 cgroup 依然一直存在, 直到其中的进程全部死亡。
KillMode=process

OOMScoreAdjust=-500

[Install]
#Alias:当前 unit 可用于启动的别名,此处列出的名称必须与服务文件名具有相同的后缀(即类型),在执行 systemctl enable 时将创建从这些名称到 unit 文件名的符号链接
#RequiredBy:表示该服务所在的Target,它的值是一个或多个Target,当 systemctl enable 时 unit 符号链接会放入 /etc/systemd/system 目录下面以 Target名 + .required 后缀构成的子目录中
#WantedBy:表示该服务所在的Target,它的值是一个或多个Target,当前 systemctl enable 时 unit符号链接会放入 /etc/systemd/system 目录下面以 Target名 + .wants 后缀构成的子目录中
#Also:当 systemctl enable 或 systemctl disable 时会同时 enable 和 disable 的其它 unit 列表
#Target的含义是服务组,表示一组服务 WantedBy=multi-user.target 指的是,unit 所在的 Target 是multi-user.target(多用户模式)
#这个设置非常重要,因为执行systemctl enable 是会将 unit 链接到 /etc/systemd/system/multi-user.target.wants目录之中,实现开机启动的功能
WantedBy=multi-user.target

进程环境变量:
* $PATH:可执行文件的目录列表(冒号分隔的绝对路径), 此值固定为 `/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin`
* $LANG:本地化设置。可以通过 locale.conf(5) 文件设置
* $USER, $LOGNAME, $HOME, $SHELL:用户名, 用户名, 家目录, 登录shell
* $MAINPID:单元主进程的PID (如果能确定的话)

日志管理工具 journalctl

[journalctl 中文手册 金步国] (jinbuguo.com)

1 概述

journalctl是ubuntu/centos7及以上专有的日志管理工具,该工具是从message这个文件里读取信息。Systemd统一管理所有Unit的启动日志。带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件是/etc/systemd/journald.conf

2 journalctl 使用方法

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# 查看所有日志, 默认情况下,只保存本次启动的日志
journalctl
# 查看内核日志(不显示应用日志)
journalctl -k
# 查看系统本次启动的日志
journalctl -b
journalctl -b -0

# 查看上一次启动的日志,如上次系统崩溃,需要查看日志时就要看上一次的启动日志。需更改设置:
#修改配置文件/etc/systemd/journald.conf, 将systemd-journald服务配置为在重新启动后永久保留系统日志,只需要将Storage参数设置为persistent。提交更改后,重新启动systemd-journald服务以使配置更改生效:
vim /etc/systemd/journald.conf
[Journal]
Storage=persistent #修改此处
#重启systemd-journald服务
systemctl restart systemd-journald
#查看上一次启动的日志
journalctl -b -1

# 查看指定时间的日志
journalctl --since yesterday #查看昨天的日志
journalctl --since "2023-08-9 20:00:00" --until "2023-08-10 13:00" #查看8月9日到8月10日的日志
journalctl --since "12:00" --until now #查看从12点到现在的日志

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

# 显示尾部指定行数的日志. 查看的是/var/log/messages的日志,但是格式上有所调整,如主机名格式不一样而已
journalctl -n 20

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

# 查看服务的日志
journalctl /usr/lib/systemd/systemd

# 查看进程的日志
journalctl _PID=1

# 显示所有 D-Bus 进程产生的日志
journalctl /usr/bin/dbus-daemon

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

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

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

# 实时滚动显示某个Unit的最新日志
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
journalctl -p err -b

# 以JSON格式(单行)输出
journalctl -b -u httpd.service -o json
#以JSON格式(多行)输出,可读性更好,建议选择多行输出
journalctl -b -u httpd.service -o json-pretty

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

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

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

生成随机字符

1
2
3
4
openssl rand -base64 8   # 生成随机base64码
echo $RANDOM # 随机数字
cat /dev/urandom |tr -dc '[:alnum:]'|head -c12 # 提取12位的随机数字和字母
echo $RANDOM 12345|tr -d ' ' #生成后缀为12345的随机数字

时间同步

搭建chrony时间同步服务器(局域网同步时间)

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 服务端
# apt install chrony -y
yum install chrony -y
cat > /etc/chrony.conf << EOF
pool ntp.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.0.0/24
local stratum 10
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
EOF

systemctl restart chronyd ; systemctl enable chronyd

# 客户端
# apt install chrony -y
yum install chrony -y
cat > /etc/chrony.conf << EOF
pool 192.168.0.31 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
keyfile /etc/chrony.keys
leapsectz right/UTC
logdir /var/log/chrony
EOF

systemctl restart chronyd ; systemctl enable chronyd

#使用客户端进行验证
chronyc sources -v

# 参数解释
#
# pool ntp.aliyun.com iburst
# 指定使用ntp.aliyun.com作为时间服务器池,iburst选项表示在初始同步时会发送多个请求以加快同步速度。
#
# driftfile /var/lib/chrony/drift
# 指定用于保存时钟漂移信息的文件路径。
#
# makestep 1.0 3
# 设置当系统时间与服务器时间偏差大于1秒时,会以1秒的步长进行调整。如果偏差超过3秒,则立即进行时间调整。
#
# rtcsync
# 启用硬件时钟同步功能,可以提高时钟的准确性。
#
# allow 192.168.0.0/24
# 允许192.168.0.0/24网段范围内的主机与chrony进行时间同步。
#
# local stratum 10
# 将本地时钟设为stratum 10,stratum值表示时钟的准确度,值越小表示准确度越高。
#
# keyfile /etc/chrony.keys
# 指定使用的密钥文件路径,用于对时间同步进行身份验证。
#
# leapsectz right/UTC
# 指定时区为UTC。
#
# logdir /var/log/chrony
# 指定日志文件存放目录。

设置时间和时区

设置时间

1

设置时区

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 查看当前时区设置
timedatectl

# 显示所有可用的时区
timedatectl list-timezones

# 设置当前时区
timedatectl set-timezone America/New_York #设置时区为美国纽约
timedatectl set-timezone Asia/Shanghai #设置时区为中国上海
timedatectl set-time YYYY-MM-DD #设置年,月,日
timedatectl set-time HH:MM:SS #设置时间:小时,分钟,秒


# 查看所有亚洲时区
ls /usr/share/zoneinfo/Asia/
# 修改时区
ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
# 更新硬件时钟
hwclock -w
# 查看时区设置
timedatectl status

优化内核参数

1

LVM磁盘分区

1