Linux杂谈:一些常用命令

目录

linux杂谈:一些常用命令

linux信息收集

 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
##linux杂谈:一些常用命令
#查看操作系统版本信息
 cat /etc/openEuler-latest
 cat /etc/os-release
 cat /etc/openEuler-release
#查看操作系统版本信息
 uname -a

#备份yum源
 cp /etc/yum.repos.d/openEuler.repo /etc/yum.repos.d/openEuler.repo.bak

#系统升级openeuler
dnf update | tee update_log
reboot

#系统降级openeuler
dnf downgrade | tee downgrade_log
reboot


#查看内核版本 ,redhat-linux
rpm -p kernel
#删除....内核版本
dnf -y remove .......
#删除....内核版本
dnf remove --oldinstallonly --setopt installonly_limit=2 kernel
#查看文本文件所在行
grep root /etc/passwd
 
#执行如下命令可以设置一个新的系统时间:
date -s "20190712 18:30:50" 
#执行如下命令将系统时间同步到硬件,防止系统重启后时间被还原。 hwclock --systohc

#重启一下我们修改过的网卡,nmtui修改ip
[root@7-2 ~]# nmcli connection up ens3 ens33  ens34  ens35

查看硬件信息

  1. 查看cpu的统计信息

    1
    
    # lscpu
  2. 查看CPU相关参数

    1
    
    # cat /proc/cpuinfo
  3. 查看系统内存信息

    1
    
    # cat /proc/meminfo
  4. 查看内存信息

    1
    
    # dmidecode -t memory
  5. 查看硬盘和分区分布

    1
    
    # lsblk
  6. 看硬盘和分区的详细信息

    1
    
    # fdisk -l
  7. 查看网卡硬件信息

    1
    
    # lspci | grep -i 'eth'
  8. 查看所有网络接口

    1
    2
    3
    
    # ip a
    # yum install -y net-tools
    # ifconfig
  9. 查看某个网络接口的详细信息

    1
    
    # ethtool enp7s0 (以enp7s0为例)

查看软件信息

  1. 查看软件包的详细信息

    1
    
    # rpm -qi systemd(以systemd为例)
  2. 查看软件包提供的模块

    1
    
    # rpm -q --provides systemd  (以systemd为例)
  3. 查看所有已安装软件包

    1
    
    # rpm -qa | grep systemd (以systemd为例)
  4. 查看软件包文件列表

    1
    
    # rpm -ql python3-rpm  (以python3-rpm为例)

查看OS日志

  1. 查看系统启动后的信息和错误日志

    1
    
    # cat  /var/log/messages
  2. 查看安全相关的日志信息

    1
    
    # cat /var/log/secure
  3. 查看邮件相关的日志信息

    1
    
    # cat /var/log/maillog
  4. 查看定时任务相关的日志信息

    1
    
    # cat /var/log/cron
  5. 查看守护进程启动和停止相关的日志消息

    1
    
    # cat /var/log/boot.log

I/O

基本概念

I/O表示输入(Input)/输出(Output),输入指系统接收信号或数据的操作,输出指从系统发出信号或数据的操作。对于CPU 和主存储器的组合,任何信息传入或传出 CPU/内存组合,就会被认为是 I/O

常用I/O性能分析工具

  1. vmstat

    1
    2
    
    # 使用vmstat进行监测,报告磁盘相关统计信息
    vmstat -d

    zh-cn_image_0000001389098425

    在命令的输出信息中,各字段所代表的含义如下:

    字段含义
    reads-total:已成功完成的读取总数。-merged:分组读取(导致一次I/O)。-sectors:扇区读取成功。-ms:读取花费的毫秒数。
    writes-total:已成功完成的写入总数。-merged:分组写入(导致一次I/O)。-sectors:写入成功的扇区。-ms:写入所花费的毫秒数。
    IO-cur:正在进行的 I/O 数。-sec:I/O 所花费的秒数。

基础配置

设置语言环境

您可以通过localectl修改系统的语言环境,对应的参数设置保存在/etc/locale.conf文件中。这些参数会在系统启动过程中被systemd的守护进程读取。

显示当前语言环境状态

显示当前语言环境,命令如下:

1
localectl status

例如显示系统当前的设置,命令和输出如下:

1
2
3
4
# localectl status
   System Locale: LANG=zh_CN.UTF-8
       VC Keymap: cn
      X11 Layout: cn

列出可用的语言环境

显示当前可用的语言环境,命令如下:

1
# localectl list-locales

例如显示当前系统中所有可用的中文环境,命令和输出如下:

1
2
# localectl list-locales | grep zh
zh_CN.UTF-8

设置语言环境

要设置语言环境,在root权限下执行如下命令,其中 locale 是您要设置的语言类型,取值范围可通过localectl list-locales获取,请根据实际情况修改。

1
# localectl set-locale LANG=locale

例如设置为简体中文语言环境,在root权限下执行如下命令:

1
# localectl set-locale LANG=zh_CN.UTF-8

说明:

修改后需要重新登录或者在root权限下执行source /etc/locale.conf命令刷新配置文件,使修改生效。

设置键盘

您可以通过localectl修改系统的键盘设置,对应的参数设置保存在/etc/locale.conf文件中。这些参数,会在系统启动的早期被systemd的守护进程读取。

显示当前设置

显示当前键盘设置,命令如下:

1
# localectl status

例如显示系统当前的设置,命令和输出如下:

1
2
3
4
# localectl status
   System Locale: LANG=zh_CN.UTF-8
       VC Keymap: cn
      X11 Layout: cn

列出可用的键盘布局

显示当前可用的键盘布局,命令如下:

1
# localectl list-keymaps

例如显示系统当前的中文键盘布局,命令和输出如下:

1
2
# localectl list-keymaps | grep cn
cn

设置键盘布局

设置键盘布局,在root权限下执行如下命令,其中 map 是您想要设置的键盘类型,取值范围可通过localectl list-keymaps获取,请根据实际情况修改:

1
# localectl set-keymap map

此时设置的键盘布局同样也会应用到图形界面中。

设置完成后,查看当前状态:

1
2
3
4
# localectl status
   System Locale: LANG=zh_CN.UTF-8
       VC Keymap: cn
      X11 Layout: us

设置日期和时间

本节介绍如何通过timedatectl、date、hwclock命令来设置系统的日期、时间和时区等。

使用timedatectl命令设置

显示日期和时间

显示当前的日期和时间,命令如下:

1
# timedatectl

例如显示系统当前的日期和时间,命令和输出如下:

1
2
3
4
5
6
7
8
# timedatectl
               Local time: Mon 2019-09-30 04:05:00 EDT
           Universal time: Mon 2019-09-30 08:05:00 UTC
                 RTC time: Mon 2019-09-30 08:05:00
                Time zone: China Standard Time (CST), UTC +8
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

通过远程服务器进行时间同步

您可以启用NTP远程服务器进行系统时钟的自动同步。是否启用NTP,可在root权限下执行如下命令进行设置。其中 boolean 可取值yes和no,分别表示启用和不启用NTP进行系统时钟自动同步,请根据实际情况修改。

说明:

若启用了NTP远程服务器进行系统时钟自动同步,则不能手动修改日期和时间。若需要手动修改日期或时间,则需确保已经关闭NTP系统时钟自动同步。可执行timedatectl set-ntp no命令进行关闭。

例如开启自动远程时间同步,命令如下:

1
# timedatectl set-ntp yes

修改日期

说明:

修改日期前,请确保已经关闭NTP系统时钟自动同步。

修改当前的日期,在root权限下执行如下命令,其中 YYYY 代表年份,MM 代表月份,DD 代表某天,请根据实际情况修改:

1
# timedatectl set-time YYYY-MM-DD

例如修改当前的日期为2019年8月14号,命令如下:

1
# timedatectl set-time '2019-08-14'

修改时间

说明:

修改时间前,请确保已经关闭NTP系统时钟自动同步。

修改当前的时间,在root权限下执行如下命令,其中 HH 代表小时,MM 代表分钟,SS 代表秒,请根据实际情况修改:

1
# timedatectl set-time HH:MM:SS

例如修改当前的时间为15点57分24秒,命令如下:

1
# timedatectl set-time 15:57:24

修改时区

显示当前可用时区,命令如下:

1
timedatectl list-timezones

要修改当前的时区,在root权限下执行如下命令,其中 time_zone 是您想要设置的时区,请根据实际情况修改:

1
# timedatectl set-timezone time_zone

例如修改当前的时区,首先查询所在地域的可用时区,此处以Asia为例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
# timedatectl list-timezones | grep Asia
Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr
Asia/Aqtau
Asia/Aqtobe
Asia/Ashgabat
Asia/Baghdad
Asia/Bahrain
……

Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk
Asia/Taipei
Asia/Tashkent
Asia/Tbilisi
Asia/Tehran
Asia/Thimphu
Asia/Tokyo

然后修改当前的时区为“Asia/Shanghai”,命令如下:

1
# timedatectl set-timezone Asia/Shanghai

使用date命令设置

显示当前的日期和时间

显示当前的日期和时间,命令如下:

1
# date

默认情况下,date命令显示本地时间。要显示UTC时间,添加–utc或-u参数:

1
# date --utc

要自定义对应的输出信息格式,添加 +“format” 参数:

1
# date +"format"

表 1 参数说明

格式参数说明
%H小时以HH格式(例如 17)。
%M分钟以MM格式(例如 37)。
%S秒以SS格式(例如 25)。
%d日期以DD格式(例如 15)。
%m月份以MM格式(例如 07)。
%Y年份以YYYY格式(例如 2019)。
%Z时区缩写(例如CEST)。
%F日期整体格式为YYYY-MM-DD(例如 2019-7-15),等同%Y-%m-%d。
%T时间整体格式为HH:MM:SS(例如 18:30:25),等同%H:%M:%S。

实际使用示例如下:

  • 显示当前的日期和本地时间。

    1
    2
    
    # date 
    2019年 08月 17日 星期六 17:26:34 CST
  • 显示当前的日期和UTC时间。

    1
    2
    
    # date --utc
    2019年 08月 17日 星期六 09:26:18 UTC
  • 自定义date命令的输出。

    1
    2
    
    # date +"%Y-%m-%d %H:%M"
    2019-08-17 17:24

修改时间

要修改当前的时间,添加–set或者-s参数。在root权限下执行如下命令,其中 HH 代表小时,MM 代表分钟,SS 代表秒,请根据实际情况修改:

1
# date --set HH:MM:SS

默认情况下, date命令设置本地时间。要设置UTC时间,添加–utc或-u参数:

1
# date --set HH:MM:SS --utc

例如修改当前的时间为23点26分00秒,在root权限下执行如下命令:

1
# date --set 23:26:00

修改日期

修改当前的日期,添加–set或者-s参数。在root权限下执行如下命令,其中 YYYY 代表年份,MM 代表月份,DD 代表某天,请根据实际情况修改:

1
# date --set YYYY-MM-DD

例如修改当前的日期为2019年11月2日,命令如下:

1
# date --set 2019-11-02

使用hwclock命令设置

可以使用 hwclock 命令设置硬件时钟RTC (Real Time Clock) 。

硬件时钟和系统时钟

Linux 将时钟分为:

  • 系统时钟 (System Clock) :当前Linux Kernel中的时钟。
  • 硬件时钟 RTC:主板上由电池供电的主板硬件时钟,该时钟可以在BIOS的 “Standard BIOS Feature” 项中进行设置。

当Linux启动时,会读取硬件时钟,并根据硬件时间来设置系统时间。

显示日期和时间

显示当前硬件的日期和时间,在root权限下执行如下命令:

1
# hwclock

例如显示当前硬件的日期和时间,命令和输出如下:

1
2
# hwclock
2019-08-26 10:18:42.528948+08:00

设置日期和时间

修改当前硬件的日期和时间,在root权限下执行如下命令,其中 dd 表示日,mm 表示月份,yyyy 表示年份,HH 表示小时,MM 表示分钟,请根据实际情况修改:

1
# hwclock --set --date "yyyy-mm-dd HH:MM"

例如修改当前的时间为2019年10月21日21点17分,命令如下:

1
# hwclock --set --date "2019-10-21 21:17"

管理用户

在Linux中,每个普通用户都有一个帐户,包括用户名、密码和主目录等信息。除此之外,还有一些系统本身创建的特殊用户,它们具有特殊的意义,其中最重要的是管理员帐户,默认用户名是root。同时Linux也提供了用户组,使每一个用户至少属于一个组,从而便于权限管理。

用户和用户组管理是系统安全管理的重要组成部分,本章主要介绍openEuler提供的用户管理和组管理命令,以及为普通用户分配特权的方法。

管理用户

增加用户

useradd命令

在root权限下,通过useradd命令可以为系统添加新用户信息,其中 options 为相关参数, username 为用户名称。

1
useradd [options] username

用户信息文件

与用户帐号信息有关的文件如下:

  • /etc/passwd:用户帐号信息文件。
  • /etc/shadow:用户帐号信息加密文件。
  • /etc/group:组信息文件。
  • /etc/default/useradd:定义默认设置文件。
  • /etc/login.defs:系统广义设置文件。
  • /etc/skel:默认的初始配置文件目录。

创建用户实例

例如新建一个用户名为userexample的用户,在root权限下执行如下命令:

1
# useradd userexample

说明:

没有任何提示,表明用户建立成功。这时并没有设置用户的口令,请使用passwd命令修改用户的密码,没有设置密码的新帐号不能登录系统。

使用id命令查看新建的用户信息,命令如下:

1
2
# id userexample
uid=1001(userexample)    gid=1001(userexample)    groups=1001(userexample)

修改用户userexample的密码:

1
# passwd userexample

建议在修改用户密码时满足密码复杂度要求,密码的复杂度的要求如下:

  1. 口令长度至少8个字符。

  2. 口令至少包含大写字母、小写字母、数字和特殊字符中的任意3种。

  3. 口令不能和帐号一样。

  4. 口令不能使用字典词汇。

    • 查询字典 在已装好的openEuler环境中,可以通过如下命令导出字典库文件dictionary.txt,用户可以查询密码是否在该字典中。

      1
      
      cracklib-unpacker /usr/share/cracklib/pw_dict > dictionary.txt
    • 修改字典

      1. 修改上面导出的字典文件,执行如下命令更新系统字典库。

        1
        
        # create-cracklib-dict dictionary.txt
      2. 在原字典库基础上新增其他字典内容custom.txt。

        1
        
        # create-cracklib-dict dictionary.txt custom.txt

根据提示两次输入新用户的密码,完成密码更改。过程如下:

1
2
3
4
5
# passwd userexample
Changing password for user userexample.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.

说明:

若打印信息中出现“BAD PASSWORD: The password fails the dictionary check - it is too simplistic/systematic”,表示设置的密码过于简单,建议设置复杂度较高的密码。

修改用户帐号

修改密码

普通用户可以用passwd修改自己的密码,只有管理员才能用passwd username为其他用户修改密码。

修改用户shell设置

使用chsh命令可以修改自己的shell,只有管理员才能用chsh username为其他用户修改shell设置。

用户也可以使用usermod命令修改shell信息,在root权限下执行如下命令,其中 new_shell_path 为目标shell路径,username 为要修改用户的用户名,请根据实际情况修改:

1
usermod -s new_shell_path username

例如,将用户userexample的shell改为csh,命令如下:

1
# usermod -s /bin/csh userexample

修改主目录

  • 修改主目录,可以在root权限下执行如下命令,其中 new_home_directory 为已创建的目标主目录的路径,username 为要修改用户的用户名,请根据实际情况修改:

    1
    
    usermod -d new_home_directory username
  • 如果想将现有主目录的内容转移到新的目录,应该使用-m选项,命令如下:

    1
    
    usermod -d new_home_directory -m username

修改UID

修改用户ID,在root权限下执行如下命令,其中 UID 代表目标用户ID,username 代表用户名,请根据实际情况修改:

1
usermod -u UID username

该用户主目录中所拥有的文件和目录都将自动修改UID设置。但是,对于主目录外所拥有的文件,只能使用chown命令手动修改所有权。

修改帐号的有效期

如果使用了影子口令,则可以在root权限下,执行如下命令来修改一个帐号的有效期,其中 MM 代表月份,DD 代表某天,YY 代表年份,username 代表用户名,请根据实际情况修改:

1
usermod -e MM/DD/YY username

删除用户

在root权限下,使用userdel命令可删除现有用户。

例如,删除用户Test,命令如下:

1
# userdel Test

如果想同时删除该用户的主目录以及其中所有内容,要使用-r参数递归删除。

说明:

不建议直接删除已经进入系统的用户,如果需要强制删除,请使用 userdel -f Test 命令。

管理员帐户授权

使用sudo命令可以允许普通用户执行管理员帐户才能执行的命令。

sudo命令允许已经在/etc/sudoers文件中指定的用户运行管理员帐户命令。例如,一个已经获得许可的普通用户可以运行如下命令:

1
sudo /usr/sbin/useradd newuserl

实际上,sudo的配置完全可以指定某个已经列入/etc/sudoers文件的普通用户可以做什么,不可以做什么。

/etc/sudoers的配置行如下所示。

  • 空行或注释行(以#字符打头):无具体功能的行。

  • 可选的主机别名行:用来创建主机列表的简称。必须以Host_Alias关键词开头,列表中的主机必须用逗号隔开,如:

    1
    
    Host_Alias  linux=ted1,ted2

    其中ted1和ted2是两个主机名,可使用linux(别名)称呼它们。

  • 可选的用户别名行:用来创建用户列表的简称。用户别名行必须以User_Alias关键词开头,列表中的用户名必须以逗号隔开。其格式同主机别名行。

  • 可选的命令别名行:用来创建命令列表的简称。必须以Cmnd_Alias开头,列表中的命令必须用逗号隔开。

  • 可选的运行方式别名行:用来创建用户列表的简称。不同的是,使用这样的别名可以告诉sudo程序以列表中某一用户的身份来运行程序。

  • 必要的用户访问说明行。

    用户访问的说明语法如下:

    1
    
    user host = [ run as user ] command list

    在user处指定一个真正的用户名或定义过的别名,host也可以是一个真正的主机名或者定义过的主机别名。默认情况下,sudo执行的所有命令都是以root身份执行。如果您想使用其他身份可以指定。command list可以是以逗号分隔的命令列表,也可以是一个已经定义过的别名,如:

    1
    
    ted1   ted2=/sbin/shutdown

    这一句说明ted1可以在ted2主机上运行关机命令。

    1
    
    newuser1 ted1=(root) /usr/sbin/useradd,/usr/sbin/userdel

    这一句说明ted1主机上的newuser1具有以root用户权限执行useradd,userdel命令的功能。

    说明:

    • 可以在一行定义多个别名,中间用冒号 (:) 隔开。
    • 可在命令或命令别名之前加上感叹号 (!),使该命令或命令别名无效。
    • 有两个关键词:ALL和NOPASSWD。ALL意味着“所有”(所有文件、所有主机或所有命令),NOPASSWD意味着不用密码。
    • 通过修改用户访问,将普通用户的访问权限修改为同root一样,则可以给普通用户分配特权。

下面是一个sudoers文件的例子:

1
2
3
4
5
6
#sudoers files
#User alias specification
User_Alias ADMIN=ted1:POWERUSER=globus,ted2
#user privilege specification
ADMIN ALL=ALL
POWERUSER ALL=ALL,!/bin/su

其中:

  • User_Alias ADMIN=ted1:POWERUSER=globus,ted2

    定义了两个别名ADMIN和POWERUSER

  • ADMIN ALL=ALL

    说明在所有主机上,ADMIN用户都可以以root身份执行所有命令

  • POWERUSER ALL=ALL,!/bin/su

    给POWERUSER用户除了运行su命令外等同ADMIN的权限

管理用户组

增加用户组

groupadd命令

在root权限下,通过groupadd命令可以为系统添加新用户组信息,其中 options 为相关参数, groupname 为用户组名称。

1
groupadd [options] groupname

用户组信息文件

与用户组信息有关的文件如下:

  • /etc/gshadow:用户组信息加密文件。
  • /etc/group:组信息文件。
  • /etc/login.defs:系统广义设置文件。

创建用户组实例

例如新建一个用户组名为groupexample的用户,在root权限下执行如下命令:

1
# groupadd groupexample

修改用户组

修改GID

修改用户组ID,在root权限下执行如下命令,其中 GID 代表目标用户组ID, groupname 代表用户组,请根据实际情况修改:

1
# groupmod -g GID groupname

修改用户组名

修改用户组名,在root权限下执行如下命令,其中 newgroupname 代表新用户组名, oldgroupname 代表已经存在的待修改的用户组名,请根据实际情况修改:

1
# groupmod -n newgroupname oldgroupname

删除用户组

在root权限下,使用groupdel命令可删除用户组。

例如,删除用户组Test,命令如下:

1
# groupdel Test

说明:

groupdel不能直接删除用户的主组,如果需要强制删除用户主组,请使用 groupdel -f Test 命令。

将用户加入用户组或从用户组中移除

在root权限下,使用gpasswd命令将用户加入用户组或从用户组中移除。

例如,将用户 userexample 加入用户组 Test ,命令如下:

1
# gpasswd -a userexample Test

例如,将用户 userexampleTest 用户组中移除,命令如下:

1
# gpasswd -d userexample Test

切换用户组

一个用户同时属于多个用户组时,则在用户登录后,使用newgrp命令可以切换到其他用户组,以便具有其他用户组的权限。

例如,将用户 userexample 切换到 Test 用户组,命令如下:

1
newgrp Test

使用DNF管理软件包

DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,以及更新系统到最新可用版本。

说明:

  • DNF与YUM完全兼容,提供了YUM兼容的命令行以及为扩展和插件提供的API。
  • 使用DNF需要管理员权限,本章所有命令需要在管理员权限下执行。

配置DNF

DNF配置文件

DNF 的主要配置文件是 /etc/dnf/dnf.conf,该文件包含两部分:

  • “main”部分保存着DNF的全局设置。
  • “repository”部分保存着软件源的设置,可以有零个或多个“repository”。

另外,在/etc/yum.repos.d 目录中保存着零个或多个repo源相关文件,它们也可以定义不同的“repository”。

所以openEuler软件源的配置一般有两种方式,一种是直接配置/etc/dnf/dnf.conf文件中的“repository”部分,另外一种是在/etc/yum.repos.d目录下增加.repo文件。

配置main部分

/etc/dnf/dnf.conf 文件包含的“main”部分,配置示例如下:

1
2
3
4
5
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True

常用选项说明:

表 1 main参数说明

参数说明
cachedir缓存目录,该目录用于存储RPM包和数据库文件。
keepcache可选值是1和0,表示是否要缓存已安装成功的那些RPM包及头文件,缺省值为0,即不缓存。
debuglevel设置dnf生成的debug信息。取值范围:[0-10],数值越大会输出越详细的debug信息。缺省值为2,设置为0表示不输出debug信息。
clean_requirements_on_remove删除在dnf remove期间不再使用的依赖项,如果软件包是通过DNF安装的,而不是通过显式用户请求安装的,则只能通过clean_requirements_on_remove删除软件包,即它是作为依赖项引入的。 缺省值为True。
best升级包时,总是尝试安装其最高版本,如果最高版本无法安装,则提示无法安装的原因并停止安装。缺省值为True。
obsoletes可选值1和0,设置是否允许更新陈旧的RPM包。缺省值为1,表示允许更新。
gpgcheck可选值1和0,设置是否进行gpg校验。缺省值为1,表示需要进行校验。
plugins可选值1和0,表示启用或禁用dnf插件。缺省值为1,表示启用dnf插件。
installonly_limit设置可以同时安装“installonlypkgs”指令列出包的数量。缺省值为3,不建议降低此值。

配置repository部分

repository部分允许您定义定制化的openEuler软件源仓库,各个仓库的名称不能相同,否则会引起冲突。配置repository部分有两种方式,一种是直接配置/etc/dnf/dnf.conf文件中的“repository”部分,另外一种是配置/etc/yum.repos.d目录下的.repo文件。

  • 直接配置/etc/dnf/dnf.conf文件中的“repository”部分

    下面是[repository]部分的一个最小配置示例:

    1
    2
    3
    
    [repository]
    name=repository_name
    baseurl=repository_url

    说明:

    openEuler提供在线的镜像源,地址:https://repo.openeuler.org/。以 openEuler 23.09的aarch64版本为例,baseurl可配置为https://repo.openeuler.org/openEuler-23.09/OS/aarch64/。

    选项说明:

    表 2 repository参数说明

    参数说明
    name=repository_name软件仓库(repository )描述的字符串。
    baseurl=repository_url软件仓库(repository )的地址。使用http协议的网络位置:例如 http://path/to/repo使用ftp协议的网络位置:例如 ftp://path/to/repo本地位置:例如 file:///path/to/local/repo
  • 配置/etc/yum.repos.d目录下的.repo文件

    openEuler提供了多种repo源供用户在线使用,各repo源含义可参考系统安装。使用root权限添加openEuler repo源,示例如下:

    1
    2
    3
    4
    5
    6
    7
    8
    
    # vi /etc/yum.repos.d/openEuler.repo
    
    [OS]
    name=openEuler-$releasever-OS
    baseurl=https://repo.openeuler.org/openEuler-{version}/OS/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=https://repo.openeuler.org/openEuler-{version}/OS/$basearch/RPM-GPG-KEY-openEuler

    说明:

    • enabled为是否启用该软件源仓库,可选值为1和0。缺省值为1,表示启用该软件源仓库。
    • gpgkey为验证签名用的公钥。

显示当前配置

  • 显示当前的配置信息:

    1
    
    # dnf config-manager --dump
  • 显示相应软件源的配置,首先查询repo id:

    1
    
    # dnf repolist

    然后执行如下命令,显示对应id的软件源配置,其中 repository 为查询得到的repo id:

    1
    
    # dnf config-manager --dump repository
  • 您也可以使用一个全局正则表达式,来显示所有匹配部分的配置:

    1
    
    # dnf config-manager --dump glob_expression

创建本地软件源仓库

要建立一个本地软件源仓库,请按照下列步骤操作。

  1. 安装createrepo软件包。

    1
    
    # dnf install createrepo
  2. 将需要的软件包复制到一个目录下,如/mnt/local_repo/ 。

  3. 创建软件源。

    1
    
    # createrepo /mnt/local_repo

添加、启用和禁用软件源

本节将介绍如何通过“dnf config-manager”命令添加、启用和禁用软件源仓库。

添加软件源

要定义一个新的软件源仓库,您可以在 /etc/dnf/dnf.conf 文件中添加“repository”部分,或者在/etc/yum.repos.d/目录下添加“.repo”文件进行说明。建议您通过添加“.repo”的方式,每个软件源都有自己对应的“.repo”文件,以下介绍该方式的操作方法。

要在您的系统中添加一个这样的源,请在root权限下执行如下命令,执行完成之后会在/etc/yum.repos.d/目录下生成对应的repo文件。其中 repository_url 为repo源地址,详情请参见表2

1
# dnf config-manager --add-repo repository_url

启用软件源

要启用软件源,请在root权限下执行如下命令,其中 repository 为新增.repo文件中的repo id(可通过dnf repolist查询):

1
# dnf config-manager --set-enable repository

您也可以使用一个全局正则表达式,来启用所有匹配的软件源。其中 glob_expression 为对应的正则表达式,用于同时匹配多个repo id:

1
# dnf config-manager --set-enable glob_expression

禁用软件源

要禁用软件源,请在root权限下执行如下命令:

1
# dnf config-manager --set-disable repository

同样的,您也可以使用一个全局正则表达式来禁用所有匹配的软件源:

1
# dnf config-manager --set-disable glob_expression

管理软件包

使用dnf能够让您方便的进行查询、安装、删除软件包等操作。

搜索软件包

您可以使用rpm包名称、缩写或者描述搜索需要的RPM包,使用命令如下:

1
# dnf search httpd (以httpd为例)

列出软件包清单

要列出系统中所有已安装的以及可用的RPM包信息,使用命令如下:

1
# dnf list all

要列出系统中特定的RPM包信息,使用命令如下:

1
# dnf list httpd  (以httpd为例)

显示RPM包信息

要显示一个或者多个RPM包信息,多个包之间以空格分隔,使用命令如下:

1
# dnf info httpd zip  (以httpd,zip两个包为例)

安装RPM包

要安装一个软件包及其所有未安装的依赖,请在root权限下执行如下命令:

1
# dnf install package_name

您也可以通过添加软件包名字同时安装多个软件包。配置文件/etc/dnf/dnf.conf添加参数strict=False,运行dnf命令参数添加–setopt=strict=0。请在root权限下执行如下命令:

1
# dnf install package_name package_name... --setopt=strict=0

示例如下:

1
# dnf install httpd

说明:

安装RPM包过程中,若出现安装失败,可参考问题5:安装时出现软件包冲突、文件冲突或缺少软件包导致安装失败

下载软件包

使用dnf下载软件包,请在root权限下输入如下命令:

1
# dnf download package_name

如果需要同时下载未安装的依赖,则加上–resolve,使用命令如下:

1
# dnf download --resolve package_name

示例如下:

1
# dnf download --resolve httpd

删除软件包

要卸载软件包以及相关的依赖软件包,请在root权限下执行如下命令:

1
# dnf remove package_name...

示例如下:

1
# dnf remove totem

检查并更新

dnf可以检查您的系统中是否有软件包需要更新。您可以通过dnf列出需要更新的软件包,并可以选择一次性全部更新或者只对指定包进行更新。

检查更新

如果您需要显示当前系统可用的更新,使用命令如下:

1
# dnf check-update

升级

如果您需要升级单个软件包,在root权限下执行如下命令:

1
# dnf update package_name

例如升级rpm包,示例如下:

1
# dnf update anaconda-gui.aarch64 (以anaconda-gui包为例)

类似的,如果您需要升级软件包组,在root权限下执行如下命令:

1
# dnf group update group_name

更新所有的包和它们的依赖

要更新所有的包和它们的依赖,在root权限下执行如下命令:

1
# dnf update

dnf常用相关命令

dnf命令在安装升级时能够自动解析包的依赖关系,一般的使用方式如下:

1
dnf <command> <packages name>

常用的命令如下:

  • 安装,需要在root权限下执行。

    1
    
    # dnf install <packages name>
  • 升级,需要在root权限下执行。

    1
    
    # dnf update <packages name>
  • 回退,需要在root权限下执行。

    1
    
    # dnf downgrade <packages name>
  • 检查更新

    1
    
    # dnf check-update
  • 卸载,需要在root权限下执行。

    1
    
    # dnf remove <packages name>
  • 查询

    1
    
    # dnf search <packages name>
  • 本地安装,需要在root权限下执行。

    1
    
    # dnf localinstall <absolute path to package name>
  • 查看历史记录

    1
    
    # dnf history
  • 清除缓存目录

    1
    
    # dnf clean all
  • 更新缓存

    1
    
    # dnf makecache

dnf命令及其相关概述

命令概述
repolist显示已配置的软件repo源。
installLinux上安装单个或多个软件包。
upgrade升级Linux上的一个或多个软件包。
list列出一个或一组软件包。
info显示关于软件包或软件包组的详细信息。
updateinfo显示关于包的公告信息。
search在软件包详细信息中搜索指定字符串。
check-update检查是否有软件包升级。
remove从系统中移除一个或多个软件包。
reinstall重装一个包。
downgrade降级软件包。
autoremove删除所有原先因为依赖关系安装的不需要的软件包。
distro-sync同步已经安装的软件包到最新可用版本。
makecache创建元数据缓存。
repository-package对指定仓库中的所有软件包运行命令。
provides查找提供指定内容的软件包。
group显示或使用组信息。
history显示或使用事务历史。
clean删除已缓存的数据。

操作1. 已配置的软件repo

显示已配置的软件仓库,默认添加 –enabled 选项(显示启用的仓库)。

1
2
3
4
5
6
7
8
9
# dnf repolist --enabled
repo id                                                                   repo name
EPOL                                                                      EPOL
OS                                                                        OS
debuginfo                                                                 debuginfo
everything                                                                everything
pkgship_elasticsearch                                                     Elasticsearch repositor
source                                                                    source
update                                                                    update
  • –all: 显示所有的软件仓库
  • –disabled: 显示被禁用的软件仓库
  • –enabled: 显示已经启用的仓库(默认)

操作2. 安装单个或多个软件包

通过install 命令可以安装RPM包。

1
# dnf install 软件包

安装软件包的过程中可能会存在冲突的包或无法安装的包,可以在命令中增加 –allowerasing 来替换冲突的软件包或 –skip-broken 来跳过无法安装的软件包。

1
# dnf install 软件包 [软件包 ...] --allowerasing --skip-broken

当使用dnf安装软件包时,通过添加 –installroot 设置软件包安装的根目录。

1
# dnf install 软件包 --installroot 软件包安装的根目录

需要临时指定特定的repo源安装时,可以添加 –setopt=reposdir= 选项来指定repo源的加载目录。

1
# dnf install 软件包 --setopt=reposdir=repo源的加载目录

在安装选项时,不需要交互式确认时,可以通过添加 -y 或**–assumeyes** 使需要安装的软件包全部自动应答为

1
# dnf install 软件包 -y

指定特定的repo源安装rpm包时,可以通过指定 –repo–enablerepo 选项。为了达到相同的效果,也可以通过使用 –disablerepo 选项来禁用匹配的repo源,此处推荐您使用–repo选项来安装RPM包。

1
# dnf install 软件包 --repo=repo源

操作3. 重新安装软件包

系统上的软件包需要执行重新安装操作时,可以执行 reinstall 命令。

1
# dnf reinstall 软件包

操作4. 升级一个或多个软件包

  • 通过upgradeupdate升级Linux上的一个或多个软件包。
1
2
# dnf upgrade 软件包 [软件包 ...]
# dnf update 软件包 [软件包 ...]

操作5. 软件包降级

当软件包版本过高发生兼容性问题时,可以采用降级的方式解决。

1
# dnf downgrade 软件包

操作6. 列出一个或一组软件包

罗列系统中已安装的软件包和配置的repo仓中存在的软件包列表,可以使用 list 命令。

1
# dnf list

可以通过添加选项过滤显示的包列表

  • –all: 显示所有的软件包(默认)
  • –available: 只显示可用的软件包
  • –installed: 只显示已安装的软件包
  • –extras: 只显示额外的软件包
  • –updates: 只显示需要被升级的软件包
  • –upgrades: 只显示需要被升级的软件包
  • –autoremove: 只显示需要被删除的软件包
  • –recent: 限制最近被改变的软件包

操作7. 查看软件包详细信息

查看软件包的详细信息时,可以使用info 命令。

1
# dnf info 软件包

操作8. 搜索软件包

如需在系统中安装软件包,但不确定软件包全称时,可使用search命令查找匹配的包。

1
# dnf search 软件包

操作9. 卸载一个或多个软件包

删除已过期或重复的软件包时,可使用remove命令移除一个软件包。

1
# dnf remove 软件包
  • –duplicates: 删除已安装(重复)的软件包
  • –oldinstallonly: 移除过期的“仅安装”软件包

操作10. 自动删除因为依赖关系安装的软件包

删除因为依赖关系安装的不需要的软件包时,可使用autoremove命令。

1
# dnf autoremove 软件包

管理服务

本章介绍如何使用systemd进行系统和服务管理。

简介

systemd是在Linux下,与SysV和LSB初始化脚本兼容的系统和服务管理器。systemd使用socket和D-Bus来开启服务,提供基于守护进程的按需启动策略,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有更高的并行性能。

概念介绍

systemd开启和监督整个系统是基于unit的概念。unit是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit有一个具有相同名字的配置文件,是守护进程Avahi的一个封装单元)。unit有多种类型,如表1所示。

表 1 unit说明

unit名称后缀名描述
Service unit.service系统服务。
Target unit.target一组systemd units。
Automount unit.automount文件系统挂载点。
Device unit.device内核识别的设备文件。
Mount unit.mount文件系统挂载点。
Path unit.path在一个文件系统中的文件或目录。
Scope unit.scope外部创建的进程。
Slice unit.slice一组用于管理系统进程分层组织的units。
Socket unit.socket一个进程间通信的Socket。
Swap unit.swapswap设备或者swap文件。
Timer unit.timersystemd计时器。

所有的可用systemd unit类型,可在如表2所示的路径下查看。

表 2 可用systemd unit类型

路径描述
/usr/lib/systemd/system/随安装的RPM产生的systemd units。
/run/systemd/system/在运行时创建systemd units。
/etc/systemd/system/由系统管理员创建和管理的systemd units。

管理系统服务

systemd提供systemctl命令来运行、关闭、重启、显示、启用/禁用系统服务。

sysvinit命令和systemd命令

systemd提供systemctl命令与sysvinit命令的功能类似。当前版本中依然兼容service和chkconfig命令,相关说明如表3,但建议用systemctl进行系统服务管理。

表 3 sysvinit命令和systemd命令的对照表

sysvinit命令systemd命令备注
service network startsystemctl start network.service用来启动一个服务 (并不会重启现有的)。
service network stopsystemctl stop network.service用来停止一个服务 (并不会重启现有的)。
service network restartsystemctl restart network.service用来停止并启动一个服务。
service network reloadsystemctl reload network.service当支持时,重新装载配置文件而不中断等待操作。
service network condrestartsystemctl condrestart network.service如果服务正在运行那么重启它。
service network statussystemctl status network.service检查服务的运行状态。
chkconfig network onsystemctl enable network.service在下次启动时或满足其他触发条件时设置服务为启用。
chkconfig network offsystemctl disable network.service在下次启动时或满足其他触发条件时设置服务为禁用。
chkconfig networksystemctl is-enabled network.service用来检查一个服务在当前环境下被配置为启用还是禁用。
chkconfig –listsystemctl list-unit-files –type=service输出在各个运行级别下服务的启用和禁用情况。
chkconfig network –listls /etc/systemd/system/*.wants/network.service用来列出该服务在哪些运行级别下启用和禁用。
chkconfig network –addsystemctl daemon-reload当您创建新服务文件或者变更设置时使用。

显示所有当前服务

如果您需要显示当前正在运行的服务,使用命令如下:

1
systemctl list-units --type service

如果您需要显示所有的服务(包括未运行的服务),需要添加-all参数,使用命令如下:

1
# systemctl list-units --type service --all

例如显示当前正在运行的服务,命令如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# systemctl list-units --type service
UNIT                        LOAD   ACTIVE     SUB           DESCRIPTION  
atd.service                 loaded active     running       Deferred execution scheduler  
auditd.service              loaded active     running       Security Auditing Service  
avahi-daemon.service        loaded active     running       Avahi mDNS/DNS-SD Stack  
chronyd.service             loaded active     running       NTP client/server  
crond.service               loaded active     running       Command Scheduler  
dbus.service                loaded active     running       D-Bus System Message Bus  
dracut-shutdown.service     loaded active     exited        Restore /run/initramfs on shutdown  
firewalld.service           loaded active     running       firewalld - dynamic firewall daemon  
getty@tty1.service          loaded active     running       Getty on tty1  
gssproxy.service            loaded active     running       GSSAPI Proxy Daemon  
......

显示服务状态

如果您需要显示某个服务的状态,可执行如下命令:

1
systemctl status name.service

相关状态显示参数说明如表4所示。

表 4 状态参数说明

参数描述
Loaded说明服务是否被加载,并显示服务对应的绝对路径以及是否启用。
Active说明服务是否正在运行,并显示时间节点。
Main PID相应的系统服务的PID值。
CGroup相关控制组(CGroup)的其他信息。

如果您需要鉴别某个服务是否运行,可执行如下命令:

1
systemctl status name.service

is-active命令的返回结果如下:

表 5 is-active命令的返回结果

状态含义
active(running)有一个或多个程序正在系统中执行。
active(exited)仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者 是挂载时才会进行一次的 quotaon 功能。
active(waiting)正在执行当中,不过要等待其他的事件才能继续处理。例如:打印的队列相关服务 就是这种状态,虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机 服务来进行下一步打印的功能
inactive这个服务没有运行

同样,如果您需要判断某个服务是否被启用,可执行如下命令:

1
systemctl is-enabled name.service

is-enabled命令的返回结果如下:

表 6 is-enabled命令的返回结果

状态含义
“enabled”已经通过 /etc/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软链接被永久启用。
“enabled-runtime”已经通过 /run/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软链接被临时启用。
“linked”虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软链接已经存在于 /etc/systemd/system/ 永久目录中。
“linked-runtime”虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软链接已经存在于 /run/systemd/system/ 临时目录中。
“masked”已经被 /etc/systemd/system/ 目录永久屏蔽(软链接指向 /dev/null 文件),因此 start 操作会失败。
“masked-runtime”已经被 /run/systemd/systemd/ 目录临时屏蔽(软链接指向 /dev/null 文件),因此 start 操作会失败。
“static”尚未被启用,并且单元文件的 “[Install]” 小节中没有可用于 enable 命令的选项。
“indirect”尚未被启用,但是单元文件的 “[Install]” 小节中 Also= 选项的值列表非空(也就是列表中的某些单元可能已被启用)、或者它拥有一个不在 Also= 列表中的其他名称的别名软链接。对于模版单元来说,表示已经启用了一个不同于 DefaultInstance= 的实例。
“disabled”尚未被启用,但是单元文件的 “[Install]” 小节中存在可用于 enable 命令的选项
“generated”单元文件是被单元生成器动态生成的。被生成的单元文件可能并未被直接启用,而是被单元生成器隐含的启用了。
“transient”单元文件是被运行时API动态临时生成的。该临时单元可能并未被启用。
“bad”单元文件不正确或者出现其他错误。 is-enabled 不会返回此状态,而是会显示一条出错信息。 list-unit-files 命令有可能会显示此单元。

例如查看gdm.service服务状态,命令如下:

1
2
3
4
5
6
7
# systemctl status gdm.service
gdm.service - GNOME Display Manager   Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled)   Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
 Main PID: 1029 (gdm)
   CGroup: /system.slice/gdm.service
           ├─1029 /usr/sbin/gdm
           ├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...           
           └─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.

运行服务

如果您需要运行某个服务,请在root权限下执行如下命令:

1
systemctl start name.service

例如运行httpd服务,命令如下:

1
# systemctl start httpd.service

关闭服务

如果您需要关闭某个服务,请在root权限下执行如下命令:

1
systemctl stop name.service

例如关闭蓝牙服务,命令如下:

1
# systemctl stop bluetooth.service

重启服务

如果您需要重启某个服务,请在root权限下执行如下命令:

1
systemctl restart name.service

执行命令后,当前服务会被关闭,但马上重新启动。如果您指定的服务,当前处于关闭状态,执行命令后,服务也会被启动。

例如重启蓝牙服务,命令如下:

1
# systemctl restart bluetooth.service

启用服务

如果您需要在开机时启用某个服务,请在root权限下执行如下命令:

1
systemctl enable name.service

例如设置httpd服务开机时启动,命令如下:

1
2
# systemctl enable httpd.service
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'

禁用服务

如果您需要在开机时禁用某个服务,请在root权限下执行如下命令:

1
systemctl disable name.service

例如在开机时禁用蓝牙服务启动,命令如下:

1
2
3
# systemctl disable bluetooth.service
Removed /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
Removed /etc/systemd/system/dbus-org.bluez.service.

改变运行级别

Target和运行级别

systemd用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其他服务,来创建自己的目标。表7列举了systemd下的目标和常见runlevel的对应关系。

表 7 运行级别和systemd目标

运行级别systemd目标(target)描述
0runlevel0.target,poweroff.target关闭系统。
1, s, singlerunlevel1.target,rescue.target单用户模式。
2, 4runlevel2.target,runlevel4.target,multi-user.target用户定义/域特定运行级别。默认等同于3。
3runlevel3.target,multi-user.target多用户,非图形化。用户可以通过多个控制台或网络登录。
5runlevel5.target,graphical.target多用户,图形化。通常为所有运行级别3的服务外加图形化登录。
6runlevel6.target,reboot.target重启系统。
emergencyemergency.target紧急Shell。

查看系统默认启动目标

查看当前系统默认的启动目标,命令如下:

1
systemctl get-default

查看当前系统所有的启动目标

查看当前系统所有的启动目标,命令如下:

1
systemctl list-units --type=target

改变默认目标

改变系统默认的目标,在root权限下执行如下命令:

1
systemctl set-default name.target

改变当前目标

改变当前系统的目标,在root权限下执行如下命令:

1
systemctl isolate name.target

切换到救援模式

改变当前系统为救援模式,在root权限下执行如下命令:

1
systemctl rescue

这条命令和“systemctl isolate rescue.target”类似。命令执行后会在串口有如下打印信息:

1
2
3
You are in rescue mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):

说明:

从救援模式进入正常模式,用户需要重启系统。

切换到紧急模式

改变当前系统为紧急模式,在root权限下执行如下命令:

1
systemctl emergency

这条命令和“systemctl isolate emergency.target”类似。命令执行后会在串口有如下打印信息:

1
2
3
You are in emergency mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):

说明:

从紧急模式进入正常模式,用户需要重启系统。

关闭、暂停和休眠系统

systemctl命令

systemd通过systemctl命令可以对系统进行关机、重启、休眠等一系列操作。当前仍兼容部分Linux常用管理命令,对应关系如表8。建议用户使用systemctl命令进行操作。

表 8 命令对应关系

Linux常用管理命令systemctl命令描述
haltsystemctl halt关闭系统
poweroffsystemctl poweroff关闭电源
rebootsystemctl reboot重启

关闭系统

关闭系统并下电,在root权限下执行如下命令:

1
systemctl poweroff

关闭系统但不下电机器,在root权限下执行如下命令:

1
systemctl halt

执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“–no-wall”参数。具体命令如下:

1
systemctl --no-wall poweroff

重启系统

重启系统,在root权限下执行如下命令:

1
systemctl reboot

执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“–no-wall”参数。具体命令如下:

1
systemctl --no-wall reboot

使系统待机

使系统待机,在root权限下执行如下命令:

1
systemctl suspend

使系统休眠

使系统休眠,在root权限下执行如下命令:

1
systemctl hibernate

使系统待机且处于休眠状态,在root权限下执行如下命令:

1
systemctl hybrid-sleep

管理进程

操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主要存储,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源,当用户提出一个请求时,造成好像系统被用户独占的假象。实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户任务、操作系统任务、邮件和打印任务等。本章节将从用户的角度讲述如何控制进程。

查看进程

Linux是一个多任务系统,经常需要对这些进程进行一些调配和管理。要进行管理,首先就要知道现在的进程情况:有哪些进程、进程的状态如何等。Linux提供了多种命令来了解进程的状况。

who命令

who命令主要用于查看当前系统中的用户情况。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。

例如查看系统中的用户及其状态。使用如下:

1
2
3
4
5
6
7
8
9
# who
admin     tty1         Jul 28 15:55
admin     pts/0        Aug  5 15:46 (192.168.0.110)
admin     pts/2        Jul 29 19:52 (192.168.0.110)
root     pts/3        Jul 30 12:07 (192.168.0.110)
root     pts/4        Jul 31 10:29 (192.168.0.144)
root     pts/5        Jul 31 14:52 (192.168.0.11)
root     pts/6        Aug  6 10:12 (192.168.0.234)
root     pts/8        Aug  6 11:34 (192.168.0.234)

ps命令

ps命令是最基本又非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等,大部分进程信息都是可以通过执行该命令得到的。

ps命令最常用的还是用来监控后台进程的工作情况,因为后台进程是不与屏幕、键盘这些标准输入/输出设备进行通信的,所以如果需要检测其状况,就可使用ps命令。ps命令的常见选项如表1所示。

表 1 选项说明

选项描述
-e显示所有进程。
-f全格式。
-h不显示标题。
-l使用长格式。
-w宽行输出。
-a显示终端上的所有进程,包括其他用户的进程。
-r只显示正在运行的进程。
-x显示没有控制终端的进程。

例如显示系统中终端上的所有进程。命令如下:

1
2
3
4
5
6
# ps -a
  PID TTY          TIME CMD
12175 pts/6    00:00:00 bash
24526 pts/0    00:00:00 vsftpd
29478 pts/5    00:00:00 ps
32461 pts/0    1-01:58:33 sh

top命令

top命令和ps命令的基本作用是相同的,显示系统当前的进程和其他状况,但是top是一个动态显示过程,即可以通过用户按键来不断刷新进程的当前状态,如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。其实top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU的任务列表。该命令可以按CPU使用、内存使用和执行时间对任务进行排序,而且该命令的很多特性都可以通过交互式命令或者在定制文件中进行设定。

top命令输出的示例如图1所示:

图 1 top显示 img

kill命令

**当需要中断一个前台进程的时候,通常足使用“Ctrl+c”组合键,而对于后台进程不能用组合键来终止,这时就可以使用kill命令。该命令可以终止前台和后台进程。**终止后台进程的原因包括:该进程占用CPU的时间过多、该进程已经死锁等。

kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送的信号,那么缺省值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用KILL信号(它的编号为9),而该信号不能被捕捉。

kill命令的浯法格式有以下两种方式:

1
2
kill [-s 信号 | -p] [-a] 进程号…
kill -l [信号]

其中进程号可以通过ps命令的输出得到。-s选项是给程序发送指定的信号,详细的信号可以用“kill -l”命令查看;-p选项只显示指定进程的ID号。

杀死pid为1409的进程,在root权限下执行如下命令:

1
# kill -9 1409

显示所有的信号及其编号对应关系,示例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
 6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

调度启动进程

有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这些任务。要使用自动启动进程的功能,就需要掌握以下几个启动命令。

定时运行一批程序(at)

at命令

用户使用at命令在指定时刻执行指定的命令序列。该命令至少需要指定一个命令和一个执行时间。at命令可以只指定时间,也可以时间和日期一起指定。

at命令的语法格式如下:

1
2
 at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间
 at -c 作业 [作业…]

设置时间

at允许使用一套相当复杂的时间指定方法,比如:

  • 接受在当天的hh:mm(小时:分钟)式的时间指定。如果该时间已经过去,那么就放在第二天执行。
  • 使用midnight(深夜)、noon(中午)、teatime(饮茶时间,一般是下午4点)等比较模糊的词语来指定时间。
  • 采用12小时计时制,即在时间后面加上AM(上午)或者PM(下午)来说明是上午还是下午。
  • 指定命令执行的具体日期,指定格式为month day(月日)或者mm/dd/yy(月/日/年)或者dd.mm.yy(日.月.年)。指定的日期必须跟在指定时间的后面。

上面介绍的都是绝对计时法,其实还可以使用相对计时法,这对于安排不久就要执行的命令是很有好处的。指定格式为now+count time-units,now就是当前时间,time-units是时间单位,这里可以是minutes(分钟)、hours(小时)、days(天)、weeks(星期)。count是时间的数量,究竟是几天,还是几小时等。还有一种计时方法就是直接使用today(今天)、tomorrow(明天)来指定完成命令的时间。下面通过一些例子来说明具体用法。

例如指定在今天下午4:30执行某个命令。假设现在时间是中午12:30,2019年6月7日,可用命令格式如下:

1
2
3
4
5
6
7
8
 at 4:30pm
 at 16:30
 at 16:30 today
 at now+4 hours
 at now+ 240 minutes
 at 16:30 7.6.19
 at 16:30 6/7/19
 at 16:30 Jun 7

以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误,例如上例可以写成:at 16:30 6/7/19。

执行权限

对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的所有者。

例如在6月8日上午10点执行slocate -u命令。在root权限下执行命令如下:

1
2
3
4
# at  10:00  6/8/19
at> slocate -u
at>
[1]+   Stopped    at  10:00  6/8/19

上面的结果中,输入at命令之后,会出现提示符at>,提示用户输入命令,在此输入了slocate -u,然后按回车键。还可以输入多条命令,当所有要执行的命令输入结束后,按“Ctrl+d”键结束at命令。

在任何情况下,管理员帐户都可以使用这个命令。对于其他用户来说,是否可以使用就取决于/etc/at.allow和/etc/at.deny文件。

周期性运行一批程序(cron)

前面介绍at命令都会在一定时间内完成一定任务,但是它只能执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,以后就不再执行了。但是在很多情况下需要周期性重复执行一些命令,这时候就需要使用cron命令来完成任务。

运行机制

首先cron命令会搜索/var/spool/cron目录,寻找以/etc/passwd文件中的用户名命名的crontab文件,被找到的这种文件将装入内存。比如一个用户名为userexample的用户,对应的crontab文件应该是/var/spool/cron/userexample,即以该用户命名的crontab文件存放在/var/spool/cron目录下面。

cron命令还将搜索/etc/crontab文件,这个文件是用不同的格式写成的。cron启动以后,它将首先检查是否有用户设置了crontab文件,如果没有就转入睡眠状态,释放系统资源。所以该后台进程占用资源极少,它每分钟被唤醒一次,查看当前是否有需要运行的命令。

命令执行结束后,任何输出都将作为邮件发送给crontab的所有者,或者是/etc/crontab文件中MAILTO环境变量中指定的用户。这是cron的工作原理,但是cron命令的执行不需要用户干涉,用户只需要修改crontab中要执行的命令。

crontab命令

crontab命令用于安装、删除或者显示用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行,而且每个用户都可以有自己的crontab文件。

crontab命令的常用方法如下:

  • crontab -u //设置某个用户的cron服务,root用户在执行crontab时需要此参数。
  • crontab -l //列出某个用户cron服务的详细内容。
  • crontab -r //删除某个用户的cron服务。
  • crontab -e //编辑某个用户的cron服务。

例如root查看自己的cron设置。命令如下:

1
# crontab -u root -l

crontab文件

在crontab文件中输入需要执行的命令和时间。该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:

1
minute hour day-of-month month-of-year day-of-week commands

对于每一项的说明如表2所示。

表 2 参数说明

参数描述
minute分钟(0~59)。
hour小时(0~23)。
day-of-month一个月的第几天(1~31)。
month-of-year一年的第几个月(1~12)。
day-of-week一周的星期几(0~6),0代表星期天。
commands需要执行的命令。

这些项都不能为空,必须指定值。除了数字还有几个特殊的符号“*”、“/”和“-”、“,”。其中,代表所有的取值范围内的数字,/代表每的意思,“/5”表示每5个单位,“-”代表从某个数字到某个数字,“,”用于分开几个离散数字。对于要执行的命令,调用的时候需要写出命令的完整路径。

例如晚上18点到22点之间每两个小时,在/tmp/test.txt文件中加入sleepy文本。在crontab文件中对应的行如下:

1
* 18-22/2 * * * echo "sleepy" >> /tmp/test.txt

**每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件。**此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e来编辑。用户也可以另外建立一个文件,使用“cron文件名”命令导入cron设置。

假设有个用户名为userexample,它需要为自己创建一个crontab文件。步骤如下:

  1. 首先可以使用任何文本编辑器建立一个新文件,并向该文件加入需要运行的命令和要定期执行的时间,假设该文件为 ~/userexample.cron。

  2. 然后在root权限下使用crontab命令安装这个文件,使之成为该用户的crontab文件。命令如下:

    1
    
    # crontab -u userexample ~/userexample.cron

这样crontab文件就建立好了,可以转到/var/spool/cron目录下面查看,发现多了一个userexample文件。这个文件就是所需的crontab文件。

说明:

cron启动后,每过一分钟读一次crontab文件,检查是否要执行里面的命令。因此该文件被修改后不需要重新启动cron服务。

编辑配置文件

cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此通过配置这个文件也能得到cron的服务。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式如下:

1
2
3
4
5
6
7
8
9
SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root  //如果出现错误,或者有数据输出,将发邮件给这个帐号
HOME=/
#  run-parts
01  * * * *   root run-parts /etc/cron.hourly     //每个小时执行一次/etc/cron.hourly里的脚本
02 4 * * *   root run-parts /etc/cron.daily    //每天执行一次/etc/cron.daily里的脚本
22 4 * * 0  root run-parts /etc/cron.weekly     //每周执行一次/etc/cron.weekly里的脚本
42 4 1  * *  root run-parts /etc/cron.monthly     //每月执行一次/etc/cron.monthly里的脚本

说明:

如果去掉run-parts参数,其后面就是运行的某个脚本名,而不是目录名。

挂起/恢复进程

作业控制允许进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复后将从中止处开始继续运行。只要在键盘上按“Ctrl+Z”键,即可挂起当前的前台作业。在键盘上按“Ctrl+Z”键后,将挂起当前执行的命令cat。使用jobs命令可以显示shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。

恢复进程执行时,有两种选择:用fg命令将挂起的作业放回到前台执行;用bg命令将挂起的作业放到后台执行。灵活使用上述命令,将给自己带来很大的方便。

搭建repo服务器

说明:

openEuler提供了多种repo源供用户在线使用,各repo源含义可参考系统安装。若用户无法在线获取openEuler repo源,则可使用openEuler提供的ISO发布包创建为本地openEuler repo源。本章节中以openEuler-{version}-aarch64-dvd.iso发布包为例,请根据实际需要的ISO发布包进行修改。

概述

将openEuler提供的ISO发布包openEuler-{version}-aarch64-dvd.iso创建为repo源,如下以使用nginx进行repo源部署,提供http服务为例进行说明。

创建/更新本地repo源

使用mount挂载,将openEuler的ISO发布包openEuler-{version}-aarch64-dvd.iso创建为repo源,并能够对repo源进行更新。

获取ISO发布包

请从如下网址获取openEuler的ISO发布包:

https://repo.openeuler.org/openEuler-{version}/ISO/

挂载ISO创建repo源

在root权限下使用mount命令挂载ISO发布包。

示例如下:

1
# mount /home/openEuler/openEuler-{version}-aarch64-dvd.iso /mnt/

挂载好的mnt目录如下:

1
2
3
4
5
6
7
8
9
.
│── boot.catalog
│── docs
│── EFI
│── images
│── Packages
│── repodata
│── TRANS.TBL
└── RPM-GPG-KEY-openEuler

其中,Packages为rpm包所在的目录,repodata为repo源元数据所在的目录,RPM-GPG-KEY-openEuler为openEuler的签名公钥。

创建本地repo源

可以拷贝ISO发布包中相关文件至本地目录以创建本地repo源,示例如下:

1
2
3
4
5
# mount /home/openEuler/openEuler-{version}-aarch64-dvd.iso /mnt/
# mkdir -p /home/openEuler/srv/repo/
# cp -r /mnt/Packages /home/openEuler/srv/repo/
# cp -r /mnt/repodata /home/openEuler/srv/repo/
# cp -r /mnt/RPM-GPG-KEY-openEuler /home/openEuler/srv/repo/

从而本地repo目录如下:

1
2
3
4
.
│── Packages
│── repodata
└── RPM-GPG-KEY-openEuler

Packages为rpm包所在的目录,repodata为repo源元数据所在的目录,RPM-GPG-KEY-openEuler为openEuler的签名公钥。

更新repo源

更新repo源有两种方式:

  • 通过新版本的ISO更新已有的repo源,与创建repo源的方式相同,即挂载ISO发布包或重新拷贝ISO发布包至本地目录。

  • 在repo源的Packages目录下添加rpm包,然后通过createrepo命令更新repo源。

    1
    
    # createrepo --update --workers=10 ~/srv/repo

    其中,–update表示更新,–workers表示线程数,可自定义。

    说明:

    若命令打印信息为“createrepo:未找到命令”,则表示未安装createrepo软件,可在root权限下执行dnf install createrepo进行安装。

部署远端repo源

安装openEuler操作系统,在openEuler上通过nginx部署repo源。

nginx安装与配置

请自行下载nginx工具并在root权限下安装nginx。

  1. 安装nginx之后,在root权限下配置/etc/nginx/nginx.conf。

    说明:

    文档中的配置内容仅供参考,请用户根据实际情况(例如安全加固需要)进行配置。

     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
    
    user  nginx;
    worker_processes  auto;                          # 建议设置为core-1
    error_log  /var/log/nginx/error.log  warn;       # log存放位置
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
    
        log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                          '$status $body_bytes_sent "$http_referer" '
                          '"$http_user_agent" "$http_x_forwarded_for"';
    
        access_log  /var/log/nginx/access.log  main;
        sendfile        on;
        keepalive_timeout  65;
    
        server {
            listen       80;
            server_name  localhost;                 # 服务器名(url)
            client_max_body_size 4G;
            root         /usr/share/nginx/repo;                 # 服务默认目录
    
            location / {
                autoindex            on;            # 开启访问目录下层文件
                autoindex_exact_size on;
                autoindex_localtime  on; 
            }
    
        }
    
    }

启动nginx服务

  1. 在root权限下通过systemctl命令启动nginx服务:

    1
    2
    
    # systemctl enable nginx
    # systemctl start nginx
  2. nginx是否启动成功可通过下面命令查看:

    1
    
    # systemctl status nginx
    • 图1表示nginx服务启动成功

      图 1 nginx服务启动成功 img

    • 若nginx服务启动失败,查看错误信息:

    1
    
    # systemctl status nginx.service --full

    图 2 nginx服务启动失败 img

    图2所示nginx服务创建失败,是由于目录/var/spool/nginx/tmp/client_body创建失败,在root权限下手动进行创建,类似的问题也这样处理:

    1
    2
    3
    4
    5
    
    # mkdir -p /var/spool/nginx/tmp/client_body
    # mkdir -p /var/spool/nginx/tmp/proxy
    # mkdir -p /var/spool/nginx/tmp/fastcgi
    # mkdir -p /usr/share/nginx/uwsgi_temp
    # mkdir -p /usr/share/nginx/scgi_temp

repo源部署

  1. 在root权限下创建nginx配置文件/etc/nginx/nginx.conf中指定的目录/usr/share/nginx/repo:

    1
    
    # mkdir -p /usr/share/nginx/repo
  2. 在root权限下修改目录/usr/share/nginx/repo的权限:

    1
    
    # chmod -R 755 /usr/share/nginx/repo
  3. 设置防火墙规则,开启nginx设置的端口(此处为80端口),在root权限下通过firewall设置端口开启:

    1
    2
    
    # firewall-cmd --add-port=80/tcp --permanent
    # firewall-cmd --reload

    在root权限下查询80端口是否开启成功,输出为yes则表示80端口开启成功:

    1
    
    # firewall-cmd --query-port=80/tcp

    也可在root权限下通过iptables来设置80端口开启:

    1
    
    # iptables -I INPUT -p tcp --dport 80 -j ACCEPT
  4. nginx服务设置好之后,即可通过ip直接访问网页,如图3

    图 3 nginx部署成功 img

  5. 通过下面几种方式将repo源放入到/usr/share/nginx/repo下:

    • 在root权限下拷贝镜像中相关文件至/usr/share/nginx/repo下,并修改目录权限。

      1
      2
      3
      4
      5
      
      # mount /home/openEuler/openEuler-{version}-aarch64-dvd.iso  /mnt/
      # cp -r /mnt/Packages /usr/share/nginx/repo
      # cp -r /mnt/repodata /usr/share/nginx/repo
      # cp -r /mnt/RPM-GPG-KEY-openEuler /usr/share/nginx/repo
      # chmod -R 755 /usr/share/nginx/repo

      openEuler-{version}-aarch64-dvd.iso存放在/home/openEuler目录下。

    • 使用root在/usr/share/nginx/repo下创建repo源的软链接。

      1
      
      # ln -s /mnt /usr/share/nginx/repo/os

      /mnt为已经创建好的repo源,/usr/share/nginx/repo/os将指向/mnt。

使用repo源

repo可配置为yum源,yum(全称为 Yellow dog Updater, Modified)是一个Shell前端软件包管理器。基于RPM包管理,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载和安装。

repo配置为yum源(软件源)

构建好的repo可以配置为yum源使用,在/etc/yum.repos.d/目录下使用root权限创建.repo的配置文件(必须以.repo为扩展名),分为本地和http服务器配置yum源两种方式:

  • 配置本地yum源

    在/etc/yum.repos.d目录下创建openEuler.repo文件,使用构建的本地repo源作为yum源,openEuler.repo的内容如下:

    1
    2
    3
    4
    5
    6
    
    [base]
    name=base
    baseurl=file:///home/openEuler/srv/repo
    enabled=1
    gpgcheck=1
    gpgkey=file:///home/openEuler/srv/repo/RPM-GPG-KEY-openEuler

    说明:

    • [repoid]中的repoid为软件仓库(repository)的ID号,所有.repo配置文件中的各repoid不能重复,必须唯一。示例中repoid设置为base
    • name为软件仓库描述的字符串。
    • baseurl为软件仓库的地址。
    • enabled为是否启用该软件源仓库,可选值为1和0。缺省值为1,表示启用该软件源仓库。
    • gpgcheck可设置为1或0,1表示进行gpg(GNU Private Guard)校验,0表示不进行gpg校验,gpgcheck可以确定rpm包的来源是有效和安全的。
    • gpgkey为验证签名用的公钥。
  • 配置http服务器yum源

    在/etc/yum.repos.d目录下创建openEuler.repo文件。

    • 若使用用户部署的http服务端的repo源作为yum源,openEuler.repo的内容如下:

      1
      2
      3
      4
      5
      6
      
      [base]
      name=base
      baseurl=http://192.168.139.209/
      enabled=1
      gpgcheck=1
      gpgkey=http://192.168.139.209/RPM-GPG-KEY-openEuler

      说明:

      “192.168.139.209”为示例地址,请用户根据实际情况进行配置。

    • 若使用openEuler提供的openEuler repo源作为yum源,以AArch64架构的OS repo源为例,openEuler.repo的内容如下:

      1
      2
      3
      4
      5
      6
      
      [base]
      name=base
      baseurl=http://repo.openeuler.org/openEuler-{version}/OS/aarch64/
      enabled=1
      gpgcheck=1
      gpgkey=http://repo.openeuler.org/openEuler-{version}/OS/aarch64/RPM-GPG-KEY-openEuler

repo优先级

当有多个repo源时,可通过在.repo文件的priority参数设置repo的优先级(如果不设置,默认优先级是99,当相同优先级的源中存在相同rpm包时,会安装最新的版本)。其中,1为最高优先级,99为最低优先级,如给openEuler.repo配置优先级为2:

1
2
3
4
5
6
7
[base]
name=base
baseurl=http://192.168.139.209/
enabled=1
priority=2
gpgcheck=1
gpgkey=http://192.168.139.209/RPM-GPG-KEY-openEuler

搭建FTP服务器

总体介绍

FTP简介

FTP(File Transfer Protocol)即文件传输协议,是互联网最早的传输协议之一,其最主要的功能是服务器和客户端之间的文件传输。FTP使用户可以通过一套标准的命令访问远程系统上的文件,而不需要直接登录远程系统。另外,FTP服务器还提供了如下主要功能:

  • 用户分类

    默认情况下,FTP服务器依据登录情况,将用户分为实体用户(real user)、访客(guest)、匿名用户(anonymous)三类。三类用户对系统的访问权限差异较大,实体用户具有较完整的访问权限,匿名用户仅有下载资源的权限。

  • 命令记录和日志文件记录

    FTP可以利用系统的syslogd记录数据,这些数据包括用户历史使用命令与用户传输数据(传输时间、文件大小等),用户可以在/var/log/中获得各项日志信息。

  • 限制用户的访问范围

    FTP可以将用户的工作范围限定在用户主目录。用户通过FTP登录后系统显示的根目录就是用户主目录,这种环境被称为change root,简称chroot。这种方式可以限制用户只能访问主目录,而不允许访问/etc、/home、/usr/local等系统的重要目录,从而保护系统,使系统更安全。

FTP使用到的端口

FTP的正常工作需要使用到多个网络端口,服务器端会使用到的端口主要有:

  • 命令通道,默认端口为21
  • 数据通道,默认端口为20

两者的连接发起端不同,端口21主要接收来自客户端的连接,端口20则是FTP服务器主动连接至客户端。

vsftpd简介

由于FTP历史悠久,它采用未加密的传输方式,所以被认为是一种不安全的协议。为了更安全地使用FTP,这里介绍FTP较为安全的守护进程vsftpd(Very Secure FTP Daemon)。

之所以说vsftpd安全,是因为它最初的发展理念就是构建一个以安全为中心的FTP服务器。它具有如下特点:

  • vsftpd服务的启动身份为一般用户,具有较低的系统权限。此外,vsftpd使用chroot改变根目录,不会误用系统工具。
  • 任何需要较高执行权限的vsftpd命令均由一个特殊的上层程序控制,该上层程序的权限较低,以不影响系统本身为准。
  • vsftpd整合了大部分FTP会使用到的额外命令(例如dir、ls、cd等),一般不需要系统提供额外命令,对系统来说比较安全。

使用vsftpd

安装vsftpd

使用vsftpd需要安装vsftpd软件,在已经配置yum源的情况下,通过root权限执行如下命令,即可完成vsftpd的安装。

1
# dnf install vsftpd

管理vsftpd服务

启动、停止和重启vsftpd服务,请在root权限下执行对应命令。

  • 启动vsftpd服务

    1
    
    # systemctl start vsftpd

    可以通过netstat命令查看通信端口21是否开启,如下显示说明vsftpd已经启动。

    1
    2
    
    # netstat -tulnp | grep 21
    tcp6       0      0 :::21                   :::*                    LISTEN      19716/vsftpd

    说明:

    如果没有netstat命令,可以执行dnf install net-tools命令安装后再使用netstat命令。

  • 停止vsftpd服务

    1
    
    # systemctl stop vsftpd
  • 重启vsftpd服务

    1
    
    # systemctl restart vsftpd

配置vsftpd

vsftpd配置文件介绍

用户可以通过修改vsftpd的配置文件,控制用户权限等。vsftpd的主要配置文件和含义如表1所示,用户可以根据需求修改配置文件的内容。更多的配置参数含义可以通过man查看。

表 1 vsftpd配置文件介绍

配置文件含义
/etc/vsftpd/vsftpd.confvsftpd进程的主配置文件,配置内容格式为“参数=参数值”,且参数和参数值不能为空。vsftpd.conf 的详细介绍可以使用如下命令查看:man 5 vsftpd.conf
/etc/pam.d/vsftpdPAM(Pluggable Authentication Modules)认证文件,主要用于身份认证和限制一些用户的操作。
/etc/vsftpd/ftpusers禁止使用vsftpd的用户列表文件。默认情况下,系统帐号也在该文件中,因此系统帐号默认无法使用vsftpd。
/etc/vsftpd/user_list禁止或允许登录vsftpd服务器的用户列表文件。该文件是否生效,取决于主配置文件vsftpd.conf中的如下参数:userlist_enable:是否启用userlist机制,YES为启用,此时userlist_deny配置有效,NO为禁用。userlist_deny:是否禁止user_list中的用户登录,YES为禁止名单中的用户登录,NO为允许命令中的用户登录。例如userlist_enable=YES,userlist_deny=YES,则user_list中的用户都无法登录。
/etc/vsftpd/chroot_list是否限制在主目录下的用户列表。该文件默认不存在,需要手动建立。它是主配置文件vsftpd.conf中参数chroot_list_file的参数值。其作用是限制还是允许,取决于主配置文件vsftpd.conf中的如下参数:chroot_local_user:是否将所有用户限制在主目录,YES为启用,NO禁用。chroot_list_enable:是否启用限制用户的名单,YES为启用,NO禁用。例如chroot_local_user=YES,chroot_list_enable=YES,且指定chroot_list_file=/etc/vsftpd/chroot_list时,表示所有用户被限制在其主目录下,而chroot_list中的用户不受限制。
/usr/sbin/vsftpdvsftpd的唯一执行文件。
/var/ftp/匿名用户登录的默认根目录,与ftp帐户的用户主目录有关。

默认配置说明

说明:

文档中的配置内容仅供参考,请用户根据实际情况(例如安全加固需要)进行修改。

openEuler系统中 ,vsftpd默认不开放匿名用户,使用vim命令查看主配置文件,其内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=NO
listen_ipv6=YES
pam_service_name=vsftpd
userlist_enable=YES

其中各参数含义如表2所示。

表 2 参数说明

参数含义
anonymous_enable是否允许匿名用户登录,YES为允许匿名登录,NO为不允许。
local_enable是否允许本地用户登入,YES 为允许本地用户登入,NO为不允许。
write_enable是否允许登录用户有写权限,YES为启用上传写入功能,NO为禁用。
local_umask本地用户新增档案时的umask值。
dirmessage_enable当用户进入某个目录时,是否显示该目录需要注意的内容,YES为显示注意内容,NO为不显示。
xferlog_enable是否记录使用者上传与下载文件的操作,YES为记录操作,NO为不记录。
connect_from_port_20Port模式进行数据传输是否使用端口20,YES为使用端口20,NO为不使用端口20。
xferlog_std_format传输日志文件是否以标准xferlog格式书写,YES为使用该格式书写,NO为不使用。
listen设置vsftpd是否以stand alone的方式启动,YES为使用stand alone方式启动,NO为不使用该方式。
pam_service_name支持PAM模块的管理,配置值为服务名称,例如vsftpd。
userlist_enable是否支持/etc/vsftpd/user_list文件内的帐号登录控制,YES为支持,NO为不支持。
tcp_wrappers是否支持TCP Wrappers的防火墙机制,YES为支持,NO为不支持。
listen_ipv6是否侦听IPv6的FTP请求,YES为侦听,NO为不侦听。listen和listen_ipv6不能同时开启。

配置本地时间

概述

openEuler系统中,vsftpd默认使用GMT时间(格林尼治时间),可能和本地时间不一致,例如GMT时间比北京时间晚8小时,请用户改为本地时间,否则服务器和客户端时间不一致,在上传下载文件时可能引起错误。

设置方法

在root权限下设置vsftpd时间为本地时间的操作步骤如下:

  1. 打开配置文件vsftpd.conf,将参数use_localtime的参数值改为YES。命令如下:

    1
    
    # vim /etc/vsftpd/vsftpd.conf

    配置内容如下:

    1
    
    use_localtime=YES
  2. 重启vsftpd服务。

    1
    
    # systemctl restart vsftpd
  3. 设置vsftpd服务开机启动。

    1
    
    # systemctl enable vsftpd

配置欢迎信息

使用vsftpd服务,建议新建欢迎信息文件(没有也不影响使用)。在root权限下设置vsftpd的欢迎信息welcome.txt文件的操作步骤如下:

  1. 打开配置文件vsftpd.conf,加入欢迎信息文件配置内容后保存退出。

    1
    
    # vim /etc/vsftpd/vsftpd.conf

    需要加入的配置行如下:

    1
    
    banner_file=/etc/vsftpd/welcome.txt
  2. 建立欢迎信息。即打开welcome.txt文件,写入欢迎信息后保存退出。

    1
    
    # vim /etc/vsftpd/welcome.txt

    欢迎信息举例如下:

    1
    
    Welcome to this FTP server!

配置系统帐号登录权限

一般情况下,用户需要限制部分帐号的登录权限。用户可根据需要进行配置。

vsftpd有两个默认存放用户名单的文件,来对访问FTP服务的用户身份进行管理和限制。vsftpd会分别检查两个配置文件,只要是被任何一个文件所禁止的用户,FTP访问到本机的请求都会被拒绝。

  • /etc/vsftpd/user_list:可以作为用户白名单,或者是黑名单,或者无效名单,由userlist_enable和userlist_deny这两个参数决定。
  • /etc/vsftpd/ftpusers:只能是用户黑名单,不受任何参数限制。

验证FTP服务是否搭建成功

可以使用openEuler提供的FTP客户端进行验证。命令和回显如下,根据提示输入用户名(用户为系统中存在的用户)和密码。如果显示Login successful,即说明FTP服务器搭建成功。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# ftp localhost
Trying 127.0.0.1...
Connected to localhost (127.0.0.1).
220-Welcome to this FTP server!
220
Name (localhost:root): USERNAME
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bye
221 Goodbye.

说明:

如果没有ftp命令,可以在root权限下执行dnf install ftp命令安装后再使用ftp命令。

配置防火墙

如果要将FTP开放给Internet使用,需要在root权限下对防火墙和SElinux进行设置。

1
2
3
4
5
# firewall-cmd --add-service=ftp --permanent
success
# firewall-cmd --reload
success
# setsebool -P ftpd_full_access on

传输文件

概述

这里给出vsftpd服务启动后,如何进行文件传输的指导。

连接服务器

命令格式

ftp [hostname | ip-address]

其中hostname为服务器名称,ip-address为服务器IP地址。

操作说明

在openEuler系统的命令行终端,执行如下命令:

1
# ftp ip-address

根据提示输入用户名和密码,认证通过后显示如下,说明ftp连接成功,此时进入了连接到的服务器目录。

1
ftp>

在该提示符下,可以输入不同的命令进行相关操作:

  • 显示服务器当前路径

    1
    
    ftp>pwd
  • 显示本地路径,用户可以将该路径下的文件上传到FTP服务器对应位置

    1
    
    ftp>lcd
  • 退出当前窗口,返回本地Linux终端

    1
    
    ftp>!

下载文件

通常使用get或mget命令下载文件。

get使用方法

  • 功能说明:将文件从远端主机中传送至本地主机中

  • 命令格式:get [remote-file] [local-file]

    其中 remote-file 为远程文件,local-file 为本地文件

  • 示例:获取远程服务器上的/home/openEuler/openEuler.htm文件到本地/home/myopenEuler/,并改名为myopenEuler.htm,命令如下:

    1
    
    ftp> get /home/openEuler/openEuler.htm /home/myopenEuler/myopenEuler.htm

mget使用方法

  • 功能说明:从远端主机接收一批文件至本地主机

  • 命令格式:mget [remote-file]

    其中 remote-file 为远程文件

  • 示例:获取服务器上/home/openEuler/目录下的所有文件,命令如下:

    1
    2
    
    ftp> cd /home/openEuler/
    ftp> mget *.*

    说明:

    • 此时每下载一个文件,都会有提示信息。如果要屏蔽提示信息,则在 mget *.* 命令前先执行prompt off
    • 文件都被下载到Linux主机的当前目录下。比如,在/home/myopenEuler/下运行的ftp命令,则文件都下载到/home/myopenEuler/下。

上传文件

通常使用put或mput命令上传文件。

put使用方法

  • 功能说明:将本地的一个文件传送到远端主机中

  • 命令格式:put [local-file] [remote-file]

    其中 remote-file 为远程文件,local-file 为本地文件

  • 示例:将本地的myopenEuler.htm传送到远端主机/home/openEuler/,并改名为openEuler.htm,命令如下:

    1
    
    ftp> put myopenEuler.htm /home/openEuler/openEuler.htm

mput使用方法

  • 功能说明:将本地主机中一批文件传送至远端主机

  • 命令格式:mput [local-file]

    其中 local-file 为本地文件

  • 示例:将本地当前目录下所有htm文件上传到服务器/home/openEuler/下,命令如下:

    1
    2
    
    ftp> cd /home/openEuler/
    ftp> mput *.htm

删除文件

通常使用delete或mdelete命令删除文件。

delete使用方法

  • 功能说明:删除远程服务器上的一个或多个文件

  • 命令格式:delete [remote-file]

    其中 remote-file 为远程文件

  • 示例:删除远程服务器上/home/openEuler/下的openEuler.htm文件,命令如下:

    1
    2
    
    ftp> cd /home/openEuler/
    ftp> delete openEuler.htm

mdelete使用方法

功能说明:删除远程服务器上的文件,常用于批量删除

  • 命令格式:mdelete [remote-file]

    其中 remote-file 为远程文件

  • 示例:删除远程服务器上/home/openEuler/下所有a开头的文件,命令如下:

    1
    2
    
    ftp> cd /home/openEuler/
    ftp> mdelete a*

断开服务器

断开与服务器的连接,使用bye命令,如下:

1
ftp> bye

搭建web服务器

Apache服务器

概述

Web(World Wide Web)是目前最常用的Internet协议之一。目前在Unix-Like系统中的web服务器主要通过Apache服务器软件实现。为了实现运营动态网站,产生了LAMP(Linux + Apache +MySQL + PHP)。web服务可以结合文字、图形、影像以及声音等多媒体,并支持超链接(Hyperlink)的方式传输信息。

openEuler系统中的web服务器版本是Apache HTTP服务器2.4版本,即httpd,一个由Apache软件基金会发展而来的开源web服务器。

管理httpd

概述

通过systemctl工具,可以对httpd服务进行管理,包括启动、停止、重启服务,以及查看服务状态等。本章介绍Apache HTTP服务的管理操作,以指导用户使用。

前提条件

  • 为了能够使用Apache HTTP服务,请确保您的系统中已经安装httpd服务的rpm包。在root权限下执行如下命令进行安装:

    1
    
    # dnf install httpd

    更多关于管理服务的内容,请参见管理服务

  • 启动、停止和重启httpd服务,需要使用root权限。

启动服务

  • 启动并运行httpd服务,命令如下:

    1
    
    # systemctl start httpd
  • 假如希望在系统启动时,httpd服务自动启动,则命令和回显如下:

    1
    2
    
    # systemctl enable httpd
    Created symlink /etc/systemd/system/multi-user.target.wants/httpd.service → /usr/lib/systemd/system/httpd.service.

说明:

假如正在运行的Apache HTTP服务器作为一个安全服务器,系统开机启动后需要密码,这个密码使用的是加密的私有SSL密钥。

停止服务

  • 停止运行的httpd服务,命令如下:

    1
    
    # systemctl stop httpd
  • 如果希望防止服务在系统开机阶段自动开启,命令和回显如下:

    1
    2
    
    # systemctl disable httpd
    Removed /etc/systemd/system/multi-user.target.wants/httpd.service.

重启服务

重启服务有三种方式:

  • 完全重启服务

    1
    
    # systemctl restart httpd

    该命令会停止运行的httpd服务并且立即重新启动它。一般在服务安装以后或者去除一个动态加载的模块(例如PHP)时使用这个命令。

  • 重新加载配置

    1
    
    # systemctl reload httpd

    该命令会使运行的httpd服务重新加载它的配置文件。任何当前正在处理的请求将会被中断,从而造成客户端浏览器显示一个错误消息或者重新渲染部分页面。

  • 重新加载配置而不影响激活的请求

    1
    
    # apachectl graceful

    该命令会使运行的httpd服务重新加载它的配置文件。任何当前正在处理的请求将会继续使用旧的配置文件。

验证服务状态

验证httpd服务是否正在运行。

1
# systemctl is-active httpd

回显为“active”说明服务处于运行状态。

配置文件说明

当httpd服务启动后,默认情况下它会读取如表1所示的配置文件。

表 1 配置文件说明

文件说明
/etc/httpd/conf/httpd.conf主要的配置文件
/etc/httpd/conf.d配置文件的辅助目录,这些配置文件也被包含在主配置文件当中一个配置文件的辅助目录被包含在主要的配置文件中

虽然默认配置可以适用于多数情况,但是用户至少需要熟悉里面的一些重要配置项。配置文件修改完成后,可以在root权限下使用如下命令检查配置文件可能出现的语法错误。

1
# apachectl configtest

如果回显如下,说明配置文件语法正确。

1
Syntax OK

说明:

  • 在修改配置文件之前,请先备份原始文件,以便出现问题时能够快速恢复配置文件。
  • 需要重启web服务,才能使修改后的配置文件生效。

管理模块和SSL

概述

httpd服务是一个模块化的应用,它和许多动态共享对象DSO(Dynamic Shared Objects)一起分发。动态共享对象DSO,在必要情况下,可以在运行时被动态加载或卸载。服务器操作系统中这些模块位于/usr/lib64/httpd/modules/目录下。本节介绍如何加载和写入模块。

加载模块

为了加载一个特殊的DSO模块,在配置文件中使用加载模块指示。独立软件包提供的模块一般在/etc/httpd/conf.modules.d目录下有他们自己的配置文件。

例如,加载asis DSO模块的操作步骤如下:

  1. 在/etc/httpd/conf.modules.d/00-optional.conf文件中,使用root权限取消注释如下配置行。

    1
    
    LoadModule asis_module modules/mod_asis.so
  2. 加载完成后,请使用root权限重启httpd服务以便于重新加载配置文件。

    1
    
    # systemctl restart httpd
  3. 加载完成后,在root权限下使用httpd -M的命令查看是否已经加载了asis DSO模块。

    1
    
    # httpd -M | grep asis

    回显如下,说明asis DSO模块加载成功。

    1
    
    asis_module (shared)

说明:

httpd 的常用命令

  • httpd -v : 查看httpd的版本号。
  • httpd -l:查看编译进httpd程序的静态模块。
  • httpd -M:查看已经编译进httpd程序的静态模块和已经加载的动态模块。

SSL介绍

安全套接层SSL(Secure Sockets Layer)是一个允许服务端和客户端之间进行安全通信的加密协议。其中,传输层安全性协议TLS(Transport Layer Security)为网络通信提供了安全性和数据完整性保障。openEuler支持Mozilla NSS(Network Security Services)作为安全性协议TLS进行配置。加载SSL的操作步骤如下:

  1. 在root权限下安装mod_ssl的rpm包。

    1
    
    # dnf install mod_ssl
  2. 安装完成后,请在root权限下重启httpd服务以便于重新加载配置文件。

    1
    
    # systemctl restart httpd
  3. 加载完成后,在root权限下使用httpd -M的命令查看是否已经加载了SSL。

    1
    
    # httpd -M | grep ssl

    回显如下,说明SSL已加载成功。

    1
    
    ssl_module (shared)

验证web服务是否搭建成功

Web服务器搭建完成后,可以通过如下方式验证是否搭建成功。

  1. 在root权限下查看服务器的IP地址,命令如下:

    1
    
    # ip a
  2. 在root权限下配置防火墙:

    1
    2
    3
    4
    
    # firewall-cmd --add-service=http --permanent
    success
    # firewall-cmd --reload
    success
  3. 验证web服务器是否搭建成功,用户可选择Linux或Windows系统进行验证。

    • 使用Linux系统验证

      执行如下命令,查看是否可以访问网页信息,服务搭建成功时,该网页可以正常访问。

      1
      
      # curl http://192.168.1.60

      执行如下命令,查看命令返回值是否为0,返回值为0,说明httpd服务器搭建成功。

      1
      
      # echo $?
    • 使用Windows系统验证

      打开浏览器,在地址栏输入如下地址,如果能正常访问网页,说明httpd服务器搭建成功。

      http://192.168.1.60

      如果修改了端口号,输入地址格式如下:

      http://192.168.1.60:端口号

Nginx服务器

概述

Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能,并且支持很多第三方的模块扩展。

安装

  1. 配置本地yum源,详细信息请参考搭建repo服务器

  2. 清除缓存。

    1
    
    # dnf clean all
  3. 创建缓存。

    1
    
    # dnf makecache
  4. 在root权限下安装nginx服务。

    1
    
    # dnf install nginx
  5. 查看安装后的rpm包。

    1
    
    # dnf list all | grep nginx

管理nginx

概述

通过systemctl工具,可以对nginx服务进行管理,包括启动、停止、重启服务,以及查看服务状态等。本章介绍nginx服务的管理操作,以指导用户使用。

前提条件

  • 为了能够使用nginx服务,请确保您的系统中已经安装nginx服务。若未安装,可参考安装进行安装。
  • 更多关于管理服务的内容,请参见管理服务
  • 启动、停止和重启nginx服务,需要使用root权限。

启动服务

  • 启动并运行nginx服务,命令如下:

    1
    
    # systemctl start nginx
  • 假如希望在系统启动时,nginx服务自动启动,则命令和回显如下:

    1
    2
    
    # systemctl enable nginx
    Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.

说明:

假如正在运行的nginx服务器作为一个安全服务器,系统开机启动后需要密码,这个密码使用的是加密的私有SSL密钥。

停止服务

  • 停止运行的nginx服务,命令如下:

    1
    
    # systemctl stop nginx
  • 如果希望防止服务在系统开机阶段自动开启,命令和回显如下:

    1
    2
    
    # systemctl disable nginx
    Removed /etc/systemd/system/multi-user.target.wants/nginx.service.

重启服务

重启服务有三种方式:

  • 完全重启服务

    1
    
    # systemctl restart nginx

    该命令会停止运行的nginx服务并且立即重新启动它。一般在服务安装以后或者去除一个动态加载的模块(例如PHP)时使用这个命令。

  • 重新加载配置

    1
    
    # systemctl reload nginx

    该命令会使运行的nginx服务重新加载它的配置文件。任何当前正在处理的请求将会被中断,从而造成客户端浏览器显示一个错误消息或者重新渲染部分页面。

  • 平滑重启nginx

    1
    
    # kill -HUP 主进程ID

    该命令会使运行的nginx服务重新加载它的配置文件。任何当前正在处理的请求将会继续使用旧的配置文件。

验证服务状态

验证nginx服务是否正在运行

1
# systemctl is-active nginx

回显为“active”说明服务处于运行状态。

配置文件说明

当nginx服务启动后,默认情况下它会读取如表2所示的配置文件。

表 2 配置文件说明

文件说明
/etc/nginx/nginx.conf主要的配置文件
/etc/nginx/conf.d配置文件的辅助目录,这些配置文件也被包含在主配置文件当中一个配置文件的辅助目录被包含在主要的配置文件中

虽然默认配置可以适用于多数情况,但是用户至少需要熟悉里面的一些重要配置项。配置文件修改完成后,可以在root权限下使用如下命令检查配置文件可能出现的语法错误。

1
# nginx -t

如果回显信息中有“syntax is ok”,说明配置文件语法正确。

说明:

  • 在修改配置文件之前,请先备份原始文件,以便出现问题时能够快速恢复配置文件。
  • 需要重启web服务,才能使修改后的配置文件生效。

管理模块

概述

nginx服务是一个模块化的应用,它和许多动态共享对象DSO(Dynamic Shared Objects)一起分发。动态共享对象DSO,在必要情况下,可以在运行时被动态加载或卸载。服务器操作系统中这些模块位于/usr/lib64/nginx/modules/目录下。本节介绍如何加载和写入模块。

加载模块

为了加载一个特殊的DSO模块,在配置文件中使用加载模块指示。独立软件包提供的模块一般在/usr/share/nginx/modules目录下有他们自己的配置文件。

openEuler操作系统中使用dnf install nginx安装nginx时会自动加载DSO。

验证web服务是否搭建成功

Web服务器搭建完成后,可以通过如下方式验证是否搭建成功。

  1. 在root权限下查看服务器的IP地址,命令如下:

    1
    
    # ip a

    回显信息如下,说明服务器IP为 192.168.1.60。

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    enp3s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    inet 192.168.1.60  netmask 255.255.255.0  broadcast 192.168.1.255
    inet6 fe80::5054:ff:fe95:499f  prefixlen 64  scopeid 0x20<link>
    ether 52:54:00:95:49:9f  txqueuelen 1000  (Ethernet)
    RX packets 150713207  bytes 49333673733 (45.9 GiB)
    RX errors 0  dropped 43  overruns 0  frame 0
    TX packets 2246438  bytes 203186675 (193.7 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    enp4s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
    ether 52:54:00:7d:80:9e  txqueuelen 1000  (Ethernet)
    RX packets 149937274  bytes 44652889185 (41.5 GiB)
    RX errors 0  dropped 1102561  overruns 0  frame 0
    TX packets 0  bytes 0 (0.0 B)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
    
    lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    inet 127.0.0.1  netmask 255.0.0.0
    inet6 ::1  prefixlen 128  scopeid 0x10<host>
    loop  txqueuelen 1000  (Local Loopback)
    RX packets 37096  bytes 3447369 (3.2 MiB)
    RX errors 0  dropped 0  overruns 0  frame 0
    TX packets 37096  bytes 3447369 (3.2 MiB)
    TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
  2. 在root权限下配置防火墙:

    1
    2
    3
    4
    
    # firewall-cmd --add-service=http --permanent
    success
    # firewall-cmd --reload
    success
  3. 验证web服务器是否搭建成功,用户可选择Linux或Windows系统进行验证。

    • 使用Linux系统验证

      执行如下命令,查看是否可以访问网页信息,服务搭建成功时,该网页可以正常访问。

      1
      
      # curl http://192.168.1.60

      执行如下命令,查看命令返回值是否为0,返回值为0,说明nginx服务器搭建成功。

      1
      
      # echo $?
    • 使用Windows系统验证

      打开浏览器,在地址栏输入如下地址,如果能正常访问网页,说明nginx服务器搭建成功。

      http://192.168.1.60

      如果修改了端口号,输入地址格式如下:

      http://192.168.1.60:端口号

搭建数据库服务器

PostgreSql服务器

软件介绍

PostgreSQL的架构如图1所示,主要进程说明如表1所示。

图 1 PostgreSql架构 img

表 1 PostgreSql中的主要进程说明

进程类别进程名称说明
主进程PostmasterPostmaster是整个数据库实例的总控进程,负责启动和关闭该数据库实例。
常驻进程Postgres(常驻进程)管理后端的常驻进程,也称为“postmaster”。其默认侦听UNIXDomain Socket和TCP/IP(Windows等,一部分的平台只侦听TCP/IP)的5432端口,等待来自前端的连接处理。侦听的端口号可以在PostgreSql的设置文件postgresql.conf中修改。
子进程Postgres(子进程)子进程根据pg_hba.conf定义的安全策略来判断是否允许进行连接,根据策略,会拒绝某些特定的IP及网络,或者也可以只允许某些特定的用户或者对某些数据库进行连接。Postgres会接受前端过来的查询,然后对数据库进行检索,最后把结果返回,有时也会对数据库进行更新。更新的数据同时还会记录在事务日志里面(PostgreSQL称为WAL日志)。这个主要是当停电、服务器宕机、重新启动的时候进行恢复处理的时候使用。另外,把日志归档保存起来,可在需要进行恢复的时候使用。在PostgreSQL 9.0以后,通过把WAL日志传送其他的postgreSQL,可以实时的进行数据库复制,这就是所谓的“数据库复制”功能。
辅助进程SysLogger(系统日志)需要在Postgres.conf中logging_collection设置为on,此时主进程才会启动Syslogger辅助进程。
BgWriter(后台写)把共享内存中的脏页写到磁盘上的进程。主要是为了提高插入、更新和删除数据的性能。
WALWriter(预写式日志)在修改数据之前把修改操作记录到磁盘中,以便后面更新实时数据时就不需要数据持久化到文件中。
PgArch(归档)WAL日志会被循环使用,PgArch在归档前会把WAL日志备份出来。通过PITY(Point in Time Recovery)技术,可以在数据库进行一次全量备份后,将全量备份时间点之后的WAL日志通过归档进行备份,然后凭借数据库的全量备份再加上后面产生的WAL日志,即可把数据库向前推到全量备份后的任意一个时间点。
AutoVacuum(系统自动清理)在PostgreSQL数据库中,对表进行DELETE操作后,旧的数据并不会立即被删除,并且,在更新数据时,也并不会在旧的数据上做更新,而是新生成一行数据。旧的数据只是被标识为删除状态,只有在没有并发的其他事务读到这些就数据时,它们才会被清除。这个清除工作就由AutoVacuum进程完成。
PgStat(统计收集)做数据的统计收集工作。主要用于查询优化时的代价估算,包括一个表和索引进行了多少次的插入、更新、删除操作,磁盘块读写的次数、行的读次数。pg_statistic中存储了PgStat收集的各类信息。
CheckPoint(检查点)检查点是系统设置的事务序列点,设置检查点保证检查点前的日志信息刷到磁盘中。

配置环境

说明:

以下环境配置仅为参考示例,具体配置视实际需求做配置

关闭防火墙并取消开机自启动

说明:

测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。

  1. 在root权限下停止防火墙。

    1
    
    systemctl stop firewalld
  2. 在root权限下关闭防火墙。

    1
    
    systemctl disable firewalld

    说明:

    执行disable命令关闭防火墙的同时,也取消了开机自启动。

修改SELINUX为disabled

在root权限下修改配置文件。

1
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

创建组和用户

说明:

服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。

  1. 在root权限下创建PostgreSQL用户(组)。

    1
    2
    
    groupadd postgres
    useradd -g postgres postgres
  2. 在root权限下设置postgres用户密码(重复输入密码)。

    1
    
    passwd postgres

搭建数据盘

说明:

  • 测试极限性能时,建议单独挂载IO性能更优的NVME SSD存储介质创建PostgreSQL测试实例,避免磁盘IO对性能测试结果的影响,本文以单独挂载NVME SSD为例,参考步骤1~步骤4。
  • 非性能测试时,在root权限下执行以下命令,创建数据目录即可。然后跳过本小节: mkdir /data
  1. 在root权限下创建文件系统(以xfs为例,根据实际需求创建文件系统),若磁盘之前已做过文件系统,执行此命令会出现报错,可使用-f参数强制创建文件系统。

    1
    
    mkfs.xfs /dev/nvme0n1
  2. 在root权限下创建数据目录。

    1
    
    mkdir /data
  3. 在root权限下挂载磁盘。

    1
    
    mount -o noatime,nobarrier /dev/nvme0n1 /data

数据目录授权

  1. 在root权限下修改目录权限。

    1
    
    chown -R postgres:postgres /data/

安装、运行和卸载

安装

  1. 配置本地yum源,详细信息请参考搭建repo服务器

  2. 清除缓存。

    1
    
    dnf clean all
  3. 创建缓存。

    1
    
    dnf makecache
  4. 在root权限下安装PostgreSQL服务器。

    1
    
    dnf install postgresql-server
  5. 查看安装后的rpm包。

    1
    
    rpm -qa | grep postgresql

运行

初始化数据库

须知:

此步骤在postgres用户下操作。

  1. 切换到已创建的PostgreSQL用户。

    1
    
    su - postgres
  2. 初始化数据库,其中命令中的/usr/bin是命令initdb所在的目录。

    1
    
    usr/bin/initdb -D /data/
启动数据库
  1. 启动PostgreSQL数据库。

    1
    
    /usr/bin/pg_ctl -D /data/ -l /data/logfile start
  2. 确认PostgreSQL数据库进程是否正常启动。

    1
    
    ps -ef | grep postgres

    命令执行后,打印信息如下图所示,PostgreSQL相关进程已经正常启动了。

    img

登录数据库
  1. 登录数据库。

    1
    
    /usr/bin/psql -U postgres

    img

    说明:

    初次登录数据库,无需密码。

配置数据库帐号密码
  1. 登录后,设置postgres密码。

    1
    
    postgres=#alter user postgres with password '123456';

    img

退出数据库
  1. 执行\q退出数据库。

    1
    
    postgres=#\q
停止数据库
  1. 停止PostgreSQL数据库。

    1
    
    /usr/bin/pg_ctl -D /data/ -l /data/logfile stop

卸载

  1. 在postgres用户下停止数据库。

    1
    
    /usr/bin/pg_ctl -D /data/ -l /data/logfile stop
  2. 在root用户下执行dnf remove postgresql-server卸载PostgreSQL数据库。

    1
    
    dnf remove postgresql-server

管理数据库角色

创建角色

可以使用CREATE ROLE语句或createuser来创建角色。createuser是对CREATE ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。

1
CREATE ROLE rolename [ [ WITH ] option [ ... ] ];
1
createuser rolename

其中:

  • rolename:角色名。
  • option为参数选项,常用的有:
    • SUPERUSER | NOSUPERUSER:决定一个新角色是否为"超级用户",若未指定,则默认为NOSUPERUSER,即不是超级用户。
    • CREATEDB | NOCREATEDB:定义一个角色是否能创建数据库,若未指定,则默认为NOCREATEDB,即不能创建数据库。
    • CREATEROLE | NOCREATEROLE:决定一个角色是否可以创建新角色,若未指定,则默认为NOCREATEROLE,即不能创建新角色。
    • INHERIT | NOINHERIT:决定一个角色是否"继承"它所在组的角色的权限。一个带有 INHERIT 属性的角色可以自动使用已经赋与它直接或间接所在组的任何权限。若未指定,则默认为INHERIT。
    • LOGIN | NOLOGIN:决定一个角色是否可以登录,一个拥有LOGIN属性的角色可以认为是一个用户,若无此属性的角色可以用于管理数据库权限,但是并不是用户,若未指定,则默认为NOLOGIN。但若创建角色是使用的是CREATE USER而不是CREATE ROLE,则默认是LOGIN属性。
    • [ ENCRYPTED | UNENCRYPTED ] PASSWORD ‘password’:设置角色的密码,密码只对那些拥有 LOGIN 属性的角色有意义。ENCRYPTED | UNENCRYPTED表示是否对密码进行加密,若未指定,则默认为ENCRYPTED,即加密。
    • VALID UNTIL ’timestamp’:角色的密码失效的时间戳,若为指定,则表示密码永久有效。
    • IN ROLE rolename1:列出一个或多个现有的角色,新角色rolename将立即加入这些角色,成为rolename1的成员。
    • ROLE rolename2:列出一个或多个现有的角色,它们将自动添加为新角色rolename的成员,即新角色为"组"。

要使用这条命令,必须拥有 CREATEROLE 权限或者是数据库超级用户。

示例

创建一个可以登录的角色roleexample1。

1
postgres=# CREATE ROLE roleexample1 LOGIN;

创建一个密码为123456的角色roleexample2。

1
postgres=# CREATE ROLE roleexample2 WITH LOGIN PASSWORD '123456';

创建角色名为roleexample3的角色。

1
[postgres@localhost ~]# createuser roleexample3

查看角色

可以使用SELECT语句或psql的元命令\du查看角色。

1
SELECT rolename FROM pg_roles;
1
\du

其中:rolename:角色名。

示例

查看roleexample1角色。

1
postgres=# SELECT roleexample1 from pg_roles;

查看现有角色。

1
postgres=# \du

修改角色

修改用户名

可以使用ALTER ROLE语句修改一个已经存在的角色名。

1
ALTER ROLE oldrolername RENAME TO newrolename;

其中:

  • oldrolername:旧的角色名。
  • newrolename:新的角色名。
修改用户示例

将角色名roleexample1修改为roleexapme2。

1
postgres=# ALTER ROLE roleexample1 RENAME TO roleexample2;
修改用户密码

可以使用ALTER ROLE语句修改一个角色的登录密码。

1
ALTER ROLE rolename PASSWORD 'password'

其中:

  • rolename:角色名。
  • password:密码。
修改角色密码示例

将roleexample1的密码修改为456789。

1
postgres=# ALTER ROLE roleexample1 WITH PASSWORD '456789';

删除角色

可以使用DROP ROLE语句或dropuser来删除角色。dropuser是对DROP ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。

1
DROP ROLE rolename;
1
dropuser rolename

其中:rolename为角色名。

示例

删除userexample1角色。

1
postgres=# DROP ROLE userexample1;

删除userexample2角色。

1
[postgres@localhost ~]# dropuser userexample2

角色授权

可以使用GRANT语句来对角色授权。

对角色授予表的操作权限:

1
GRANT { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

对角色授予序列的操作权限:

1
GRANT { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

对角色授予数据库的操作权限:

1
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

对角色授予函数的操作权限:

1
GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

对角色授予过程语言的操作权限:

1
GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

对角色授予模式的操作权限:

1
GRANT { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

对角色授予表空间的操作权限:

1
GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] TO { rolename | GROUP groupname | PUBLIC } [, ...] [ WITH GRANT OPTION ]

将角色rolename1的成员关系赋予角色rolename2:

1
GRANT rolename1 [, ...] TO rolename2 [, ...] [ WITH ADMIN OPTION ]

其中:

  • SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL [ PRIVILEGES ]:用户的操作权限,ALL [ PRIVILEGES ]表示所有的权限,PRIVILEGES关键字在 PostgreSQL里是可选的,但是严格的SQL 要求有这个关键字。
  • ON字句:用于指定权限授予的对象。
  • tablename:表名。
  • TO字句:用来指定被赋予权限的角色。
  • rolename、rolename1、rolename2:角色名。
  • groupname:角色组名。
  • PUBLIC:表示该权限要赋予所有角色,包括那些以后可能创建的用户。
  • WITH GRANT OPTION:表示权限的接收者也可以将此权限赋予他人,否则就不能授权他人。该选项不能赋予给PUBLIC。
  • sequencename:序列名。
  • databasename:数据库名。
  • funcname ( [ [ argmode ] [ argname ] argtype [, …] ] ):函数名及其参数。
  • langname:过程语言名。
  • schemaname:模式名。
  • tablespacename:表空间名。
  • WITH ADMIN OPTION:表示成员随后就可以将角色的成员关系赋予其他角色,以及撤销其他角色的成员关系。
示例

对userexample授予数据库database1的CREATE权限。

1
postgres=# GRANT CREATE ON DATABASE database1 TO userexample;

对所有用户授予表table1的所有权限。

1
postgres=# GRANT ALL PRIVILEGES ON TABLE table1 TO PUBLIC;

删除用户权限

可以使用REVOKE语句来撤销以前赋予一个或多个角色的权限。

撤销角色对表的操作权限:

1
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | REFERENCES | TRIGGER } [,...] | ALL [ PRIVILEGES ] } ON [ TABLE ] tablename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...]

撤销角色对序列的操作权限:

1
REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [,...] | ALL [ PRIVILEGES ] } ON SEQUENCE sequencename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

撤销角色对数据库的操作权限:

1
REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [,...] | ALL [ PRIVILEGES ] } ON DATABASE databasename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

撤销角色对函数的操作权限:

1
REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON FUNCTION funcname ( [ [ argmode ] [ argname ] argtype [, ...] ] ) [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

撤销角色对过程语言的操作权限:

1
REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE langname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

撤销角色对模式的操作权限:

1
REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [,...] | ALL [ PRIVILEGES ] } ON SCHEMA schemaname [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

撤销角色对表空间的操作权限:

1
REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespacename [, ...] FROM { rolename | GROUP groupname | PUBLIC } [, ...] [ CASCADE | RESTRICT ]

删除rolename2的rolename1的成员关系:

1
REVOKE [ ADMIN OPTION FOR ] rolename1 [, ...] FROM rolename2 [, ...] [ CASCADE | RESTRICT ]

其中:

  • GRANT OPTION FOR:表示只是撤销对该权限的授权的权力,而不是撤销该权限本身。
  • SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL [ PRIVILEGES ]:用户的操作权限,ALL [ PRIVILEGES ]表示所有的权限,PRIVILEGES关键字在 PostgreSQL里是可选的,但是严格的SQL 要求有这个关键字。
  • ON字句:用于指定撤销权限的对象。
  • tablename:表名。
  • FROM字句:用来指定被撤销权限的角色。
  • rolename、rolename1、rolename2:角色名。
  • groupname:角色组名。
  • PUBLIC:表示撤销隐含定义的、拥有所有角色的组,但并不意味着所有角色都失去了权限,那些直接得到的权限以及通过一个组得到的权限仍然有效。
  • sequencename:序列名。
  • CASCADE:撤销所有依赖性权限。
  • RESTRICT:不撤销所有依赖性权限。
  • databasename:数据库名。
  • funcname ( [ [ argmode ] [ argname ] argtype [, …] ] ):函数名及其参数。
  • langname:过程语言名。
  • schemaname:模式名。
  • tablespacename:表空间名。
  • ADMIN OPTION FOR:表示传递的授权不会自动收回。
示例

对userexample授予数据库database1的CREATE权限。

1
postgres=# GRANT CREATE ON DATABASE database1 TO userexample;

对所有用户授予表table1的所有权限。

1
postgres=# GRANT ALL PRIVILEGES ON TABLE table1 TO PUBLIC;

管理数据库

创建数据库

可以使用CREATE DATABASE语句或createdb来创建数据库。createrdb是对CREATE DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。

1
CREATE DATABASE databasename;
1
createdb databasename

其中:databasename为数据库名。

要使用这条命令,必须拥有CREATEDB权限。

示例

创建一个数据库database1。

1
postgres=# CREATE DATABASE database1;

选择数据库

可以使用\c语句来选择数据库。

1
\c databasename;

其中:databasename为数据库名称。

示例

选择databaseexample数据库。

1
postgres=# \c databaseexample;

查看数据库

可以使用\l语句来查看数据库。

1
\l;
示例

查看所有数据库。

1
postgres=# \l;

删除数据库

可以使用DROP DATABASE语句或dropdb来删除数据库。dropdb是对DROP DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。

注意:

删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。

1
DROP DATABASE databasename;
1
dropdb databasename

其中:databasename为数据库名称。

DROP DATABASE会删除数据库的系统目录项并且删除包含数据的文件目录。

DROP DATABASE只能由超级管理员或数据库拥有者执行。

示例

删除databaseexample数据库。

1
postgres=# DROP DATABASE databaseexample;

备份数据库

可以使用pg_dump命令备份数据库,将数据库转储到一个脚本文件或其他归档文件中。

1
pg_dump [option]... [databasename] > outfile

其中:

  • databasename:数据库名称。如果没有声明这个参数,那么使用环境变量 PGDATABASE 。如果那个环境变量也没声明,那么使用发起连接的用户名。
  • outfile:数据库备份的文件。
  • option:pg_dump命令参数选项,多个参数之间可以使用空格分隔。常用的pg_dump命令参数选项如下:
    • -f,–file= filename :指输出到指定的文件。如果忽略,则使用标准输出。
    • -d,–dbname= databasename :指定转储的数据库。
    • -h,–host= hostname :指定主机名。
    • -p,–port= portnumber :指定端口。
    • -U,–username= username :指定连接的用户名。
    • -W,–password:强制口令提示(自动)。
示例

备份主机为192.168.202.144,端口为3306,postgres用户下的database1数据库到db1.sql中。

1
[postgres@localhost ~]#  pg_dump -h 192.168.202.144 -p 3306 -U postgres -W database1 > db1.sql

恢复数据库

可以使用psql命令恢复数据库。

1
psql [option]... [databasename [username]] < infile

其中:

  • databasename:数据库名称。如果没有声明这个参数,那么使用环境变量 PGDATABASE 。如果那个环境变量也没声明,那么使用发起连接的用户名。
  • username:用户名。
  • infile:pg_dump命令中的outfile参数。
  • option:psql命令参数选项,多个参数之间可以使用空格分隔。常用的psql命令参数选项如下:
    • -f,–file=filename:指输出到指定的文件。如果忽略,则使用标准输出。
    • -d,–dbname=databasename:指定转储的数据库。
    • -h,–host=hostname:指定主机名。
    • -p,–port=portnumber:指定端口。
    • -U,–username=username:指定连接的用户名。
    • -W,–password:强制口令提示(自动)。

psql命令不会自动创建databasename数据库,所以在执行psql恢复数据库之前需要先创建databasename数据库。

示例

将db1.sql脚本文件导入到主机为192.168.202.144,端口为3306,postgres用户下newdb数据库中。

1
2
[postgres@localhost ~]# createdb newdb
[postgres@localhost ~]# psql -h 192.168.202.144 -p 3306 -U postgres -W -d newdb < db1.sql

Mariadb服务器

软件介绍

MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品,MariaDB还提供了许多更好的新特性。

MariaDB的架构如图2所示。

图 2 MariaDB逻辑架构 img

当Mariadb接受到Sql语句时,其详细的执行过程如下:

  1. 当客户端连接到mariadb的时候,会认证客户端的主机名、用户、密码,认证功能可以做成插件。
  2. 如果登录成功,客户端发送sql命令到服务端。由解析器解析sql语句。
  3. 服务端检查客户端是否有权限去获取它想要的资源。
  4. 如果查询已经存储在query cache当中,那么结果立即返回。
  5. 优化器将会找出最快的执行策略,或者是执行计划,也就是说优化器可以决定什么表将会被读,以及哪些索引会被访问,哪些临时表会被使用,一个好的策略能够减少大量的磁盘访问和排序操作等。
  6. 存储引擎读写数据和索引文件,cache用来加速这些操作,其他的诸如事物和外键特性,都是在存储引擎层处理的。

存储引擎在物理层管控数据,它负责数据文件、数据、索引、cache等的管理,这使得管理和读取数据变得更高效,每一张表,都有一个.frm文件,这些文件包含着表的定义。

每一个存储引擎管理、存储数据的方式都是不同的,所支持的特性和性能也不尽相同。例如:

  • MyISAM,适合读多写少的环境,且不支持事务,支持全文索引等。
  • noDB,支持事务,支持行锁和外键等。
  • MEMORY,将数据存储在内存当中。
  • CSV,将数据存储为CSV格式。

配置环境

说明:

以下环境配置仅为参考示例,具体配置视实际需求做配置

关闭防火墙并取消开机自启动

说明:

测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。

  1. 在root权限下停止防火墙。

    1
    
    systemctl stop firewalld
  2. 在root权限下关闭防火墙。

    1
    
    systemctl disable firewalld

    说明:

    执行disable命令关闭防火墙的同时,也取消了开机自启动。

修改SELINUX为disabled

  1. 在root权限下修改配置文件。

    1
    
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

创建组和用户

说明:

服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。

  1. 在root权限下创建MySQL用户(组)。

    1
    
    groupadd mysql
    1
    
    useradd -g mysql mysql
  2. 在root权限下设置MySQL用户密码。

    1
    
    passwd mysql

    重复输入密码(根据实际需求设置密码)。

搭建数据盘

说明:

  • 进行性能测试时,数据目录使用单独硬盘,需要对硬盘进行格式化并挂载,参考方法一或者方法二。
  • 非性能测试时,在root权限下执行mkdir /data创建数据目录即可。然后跳过本小节。
方法一:在root权限下使用fdisk进行磁盘管理
  1. 创建分区(以/dev/sdb为例,根据实际情况创建)

    1
    
    fdisk /dev/sdb
  2. 输入n,按回车确认。

  3. 输入p,按回车确认。

  4. 输入1,按回车确认。

  5. 采用默认配置,按回车确认。

  6. 采用默认配置,按回车确认。

  7. 输入w,按回车保存。

  8. 创建文件系统(以xfs为例,根据实际需求创建文件系统)

    1
    
    mkfs.xfs /dev/sdb1
  9. 挂载分区到“/data”以供操作系统使用。

    1
    
    mkdir /data
    1
    
    mount /dev/sdb1 /data
  10. 执行命令“vi /etc/fstab", 编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。

    其中,/dev/nvme0n1p1为示例,具体名称以实际情况为准。

    img

方法二:在root权限下使用LVM进行磁盘管理

说明:

此步骤需要安装镜像中的lvm2相关包,步骤如下:

  • 配置本地yum源,详细信息请参考搭建repo服务器。如果已经执行,则可跳过此步。
  • 在root权限下执行yum install lvm2命令安装lvm2。
  1. 创建物理卷(sdb为硬盘名称,具体名字以实际为准)。

    1
    
    pvcreate /dev/sdb
  2. 创建物理卷组(其中datavg为创建的卷组名称,具体名字以实际规划为准)。

    1
    
    vgcreate datavg  /dev/sdb
  3. 创建逻辑卷(其中600G为规划的逻辑卷大小,具体大小以实际情况为准;datalv为创建的逻辑卷的名字,具体名称以实际规划为准)。

    1
    
    lvcreate -L 600G -n datalv datavg
  4. 创建文件系统。

    1
    
    mkfs.xfs /dev/datavg/datalv
  5. 创建数据目录并挂载。

    1
    2
    
    mkdir /data
    mount /dev/datavg/datalv /data
  6. 执行命令vi /etc/fstab,编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。

    其中,/dev/datavg/datalv为示例,具体名称以实际情况为准。

    img

创建数据库目录并且授权

  1. 在已创建的数据目录 /data 基础上,使用root权限继续创建进程所需的相关目录并授权MySQL用户(组)。

    1
    2
    3
    4
    
    mkdir -p /data/mariadb
    cd /data/mariadb
    mkdir data tmp run log
    chown -R mysql:mysql /data

安装、运行和卸载

安装

  1. 配置本地yum源,详细信息请参考搭建repo服务器

  2. 清除缓存。

    1
    
    dnf clean all
  3. 创建缓存。

    1
    
    dnf makecache
  4. 在root权限下安装mariadb服务器。

    1
    
    dnf install mariadb-server
  5. 查看安装后的rpm包。

    1
    
    rpm -qa | grep mariadb

运行

  1. 在root权限下开启mariadb服务器。

    1
    
    systemctl start mariadb
  2. 在root权限下初始化数据库。

    1
    
    /usr/bin/mysql_secure_installation

    命令执行过程中需要输入数据库的root设置的密码,若没有密码则直接按“Enter”。然后根据提示及实际情况进行设置。

  3. 登录数据库。

    1
    
    mysql -u root -p

    命令执行后提示输入密码。密码为2中设置的密码。

    说明:

    执行 \q 或者 exit 可退出数据库。

卸载

  1. 在root权限下关闭数据库进程。

    1
    2
    
    ps -ef | grep mysql
    kill -9 进程ID
  2. 在root权限下执行dnf remove mariadb-server命令卸载mariadb。

    1
    
    dnf remove mariadb-server

管理数据库用户

创建用户

可以使用CREATE USER语句来创建一个或多个用户,并设置相应的口令。

1
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';

其中:

  • username:用户名。
  • host:主机名,即用户连接数据库时所在的主机的名字。若是本地用户可用localhost,若在创建的过程中,未指定主机名,则主机名默认为“%”,表示一组主机。
  • password:用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器,但从安全的角度而言,不推荐这种做法。

使用CREATE USER语句必须拥有数据库的INSERT权限或全局CREATE USER权限。

使用CREATE USER语句创建一个用户帐号后,会在系统自身的数据库的user表中添加一条新记录。若创建的帐户已经存在,则语句执行时会出现错误。

新创建的用户拥有的权限很少,只允许进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。

示例

创建密码为123456,用户名为userexample1的本地用户。

1
> CREATE USER 'userexample1'@'localhost' IDENTIFIED BY '123456';

创建密码为123456,用户名为userexample2,主机名为192.168.1.100的用户。

1
> CREATE USER 'userexample2'@'192.168.1.100' IDENTIFIED BY '123456';

查看用户

可以使用SHOW GRANTS语句或SELECT语句查看一个或多个用户。

查看特定用户:

1
SHOW GRANTS [FOR 'username'@'hostname'];
1
SELECT USER,HOST,PASSWORD FROM mysql.user WHERE USER='username';

查看所有用户:

1
SELECT USER,HOST,PASSWORD FROM mysql.user;

其中:

  • username:用户名。
  • hostname:主机名。
示例

查看userexample1用户。

1
> SHOW GRANTS FOR 'userexample1'@'localhost';

查看mysql数据库中所有用户。

1
> SELECT USER,HOST,PASSWORD FROM mysql.user;

修改用户

修改用户名

可以使用RENAME USER语句修改一个或多个已经存在的用户名。

1
RENAME USER 'oldusername'@'hostname' TO 'newusername'@'hostname';

其中:

  • oldusername:旧的用户名。
  • newusername:新的用户名。
  • hostname:主机名。

RENAME USER语句用于对原有的帐号进行重命名。若系统中旧帐号不存在或者新帐号已存在,则该语句执行时会出现错误。

使用RENAME USER语句,必须拥有数据库的UPDATE权限或全局CREATE USER权限。

修改用户示例

将用户名userexample1修改为userexapme2,主机名为locahost。

1
> RENAME USER 'userexample1'@'localhost' TO 'userexample2'@'localhost';
修改用户密码

可以使用SET PASSWORD语句修改一个用户的登录密码。

1
SET PASSWORD FOR 'username'@'hostname' = PASSWORD('newpassword');

其中:

  • FOR ‘username’@‘hostname’:FOR字句,可选项,指定欲修改密码的用户名及主机名。
  • PASSWORD(’newpassword’):表示使用函数PASSWORD()设置新口令,即新口令必须传递到函数PASSWORD()中进行加密。

注意:

PASSWORD()函数为单向加密函数,一旦加密后不能解密出原明文。

在SET PASSWORD语句中,若不加上FOR子句,表示修改当前用户的密码。

FOR字句中必须以’username’@‘hostname’的格式给定,username为帐户的用户名,hostname为帐户的主机名。

欲修改密码的帐号必须在系统中存在,否则语句执行时会出现错误。

修改用户密码示例

将用户名为userexample的密码修改为0123456,主机名为locahost。

1
> SET PASSWORD FOR 'userexample'@'localhost' = PASSWORD('0123456') ;

删除用户

可以使用DROP USER语句来删除一个或多个用户帐号以及相关的权限。

1
DROP USER 'username1'@'hostname1' [,'username2'@'hostname2']…;

注意:

用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,因为数据库并不会记录创建了这些对象的帐号。

DROP USER语句可用于删除一个或多个数据库帐号,并删除其原有权限。

使用DROP USER语句必须拥有数据库的DELETE权限或全局CREATE USER权限。

在DROP USER语句的使用中,若没有明确地给出帐号的主机名,则该主机名默认为“%”。

示例

删除用户名为userexample的本地用户。

1
> DROP USER 'userexample'@'localhost';

用户授权

可以使用GRANT语句来对新建用户的授权。

1
GRANT privileges ON databasename.tablename TO 'username'@'hostname';

其中:

  • ON字句:用于指定权限授予的对象和级别。
  • privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所有的权限则使用ALL。
  • databasename:数据库名。
  • tablename:表名。
  • TO字句:用来设定用户密码,以及指定被赋予权限的用户。
  • username:用户名。
  • hostname:主机名。

如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*。

如果在TO子句中给系统中存在的用户指定密码,则新密码会将原密码覆盖。

如果权限被授予给一个不存在的用户,则会自动执行一条CREATE USER语句来创建这个用户,但同时必须为该用户指定密码。

示例

对本地用户userexample授予SELECT和INSERT权限。

1
> GRANT SELECT,INSERT ON *.* TO 'userexample'@'localhost';

删除用户权限

可以使用REVOKE语句来删除一个用户的权限,但此用户不会被删除。

1
REVOKE privilege ON databasename.tablename FROM 'username'@'hostname';

其中REVOKE语句的参数与GRANT语句的参数含义相同。

要使用 REVOKE 语句,必须拥有数据库的全局CREATE USER权限或UPDATE权限。

示例

删除本地用户userexample的INSERT权限。

1
> REVOKE INSERT ON *.* FROM 'userexample'@'localhost';

管理数据库

创建数据库

可以使用CREATE DATABASE语句来创建数据库。

1
CREATE DATABASE databasename;

其中:databasename为数据库名称,且数据库名称不区分大小写。

示例

创建数据库名为databaseexample的数据库。

1
> CREATE DATABASE databaseexample;

查看数据库

可以使用SHOW DATABASES语句来查看数据库。

1
SHOW DATABASES;
示例

查看所有数据库。

1
> SHOW DATABASES;

选择数据库

一般创建表,查询表等操作首先需要选择一个目标数据库。可以使用USE语句来选择数据库。

1
USE databasename;

其中:databasename为数据库名称。

示例

选择databaseexample数据库。

1
> USE databaseexample;

删除数据库

可以使用DROP DATABASE语句来删除数据库。

注意:

删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。

1
DROP DATABASE databasename;

其中:databasename为数据库名称。

DROP DATABASE命令用于删除创建过(已存在)的数据库,且会删除数据库中的所有表,但数据库的用户权限不会自动删除。

要使用DROP DATABASE,您需要数据库的DROP权限。

DROP SCHEMA是DROP DATABASE的同义词。

示例

删除databaseexample数据库。

1
> DROP DATABASE databaseexample;

备份数据库

可以在root权限下使用mysqldump命令备份数据库。

备份一个或多个表:

1
mysqldump [options] databasename [tablename ...] > outfile

备份一个或多个库:

1
mysqldump [options] -databases databasename ... > outfile

备份所有库:

1
mysqldump [options] -all-databases > outputfile

其中:

  • databasename:数据库名称。
  • tablename:数据表名称。
  • outfile:数据库备份的文件。
  • options:mysqldump命令参数选项,多个参数之间可以使用空格分隔。常用的mysqldump命令参数选项如下:
    • -u, –user= username :指定用户名。
    • -p, –password[= password]:指定密码。
    • -P, –port= portnumber :指定端口。
    • -h, –host= hostname :指定主机名。
    • -r, –result-file= filename :将导出结果保存到指定的文件中,等同于“>”。
    • -t:只备份数据。
    • -d:只备份表结构。
示例

备份主机为192.168.202.144,端口为3306,root用户下的所有数据库到alldb.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --all-databases > alldb.sql

备份主机为192.168.202.144,端口为3306,root用户下的db1数据库到db1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --databases db1 > db1.sql

备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的tb1表到db1tb1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 db1 tb1 > db1tb1.sql

只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的表结构到db1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -d db1 > db1.sql

只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的数据到db1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 > db1.sql

恢复数据库

可以在root权限下使用mysql命令恢复数据库。

恢复一个或多个表:

1
mysql -h hostname -P portnumber -u username -ppassword databasename < infile

其中:

  • hostname:主机名。
  • portnumber:端口号。
  • username:用户名。
  • password:密码。
  • databasename:数据库名。
  • infile:mysqldump命令中的outfile参数。
示例

恢复数据库。

1
# mysql -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 < db1.sql

MySQL服务器

软件介绍

**MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。**MySQL是业界最流行的RDBMS (Relational Database Management System,关系数据库管理系统)之一,尤其在WEB应用方面。

关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就加快了速度并提高了灵活性。

MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权模式,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。

配置环境

说明:

以下环境配置仅为参考示例,具体配置视实际需求做配置

关闭防火墙并取消开机自启动

说明:

测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。

  1. 在root权限下停止防火墙。

    1
    
    systemctl stop firewalld
  2. 在root权限下关闭防火墙。

    1
    
    systemctl disable firewalld

    说明:

    执行disable命令关闭防火墙的同时,也取消了开机自启动。

修改SELINUX为disabled

  1. 在root权限下修改配置文件。

    1
    
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux

创建组和用户

说明:

服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。

  1. 在root权限下创建MySQL用户(组)。

    1
    
    groupadd mysql
    1
    
    useradd -g mysql mysql
  2. 在root权限下设置MySQL用户密码。

    1
    
    passwd mysql

    重复输入密码(根据实际需求设置密码)。

搭建数据盘

说明:

  • 进行性能测试时,数据目录使用单独硬盘,需要对硬盘进行格式化并挂载,参考方法一或者方法二。
  • 非性能测试时,在root权限下执行mkdir /data创建数据目录即可。然后跳过本小节:
方法一:在root权限下使用fdisk进行磁盘管理
  1. 创建分区(以/dev/sdb为例,根据实际情况创建)

    1
    
    fdisk /dev/sdb
  2. 输入n,按回车确认。

  3. 输入p,按回车确认。

  4. 输入1,按回车确认。

  5. 采用默认配置,按回车确认。

  6. 采用默认配置,按回车确认。

  7. 输入w,按回车保存。

  8. 创建文件系统(以xfs为例,根据实际需求创建文件系统)

    1
    
    mkfs.xfs /dev/sdb1
  9. 挂载分区到“/data”以供操作系统使用。

    1
    
    mkdir /data
    1
    
    mount /dev/sdb1 /data
  10. 执行命令“vi /etc/fstab", 编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。

    其中,/dev/nvme0n1p1为示例,具体名称以实际情况为准。

    img

方法二:在root权限下使用LVM进行磁盘管理

说明:

此步骤需要安装镜像中的lvm2相关包,步骤如下:

  • 配置本地yum源,详细信息请参考搭建repo服务器。如果已经执行,则可跳过此步。
  • 执行yum install lvm2安装lvm2。
  1. 创建物理卷(sdb为硬盘名称,具体名字以实际为准)。

    1
    
    pvcreate /dev/sdb
  2. 创建物理卷组(其中datavg为创建的卷组名称,具体名字以实际规划为准)。

    1
    
    vgcreate  datavg  /dev/sdb
  3. 创建逻辑卷(其中600G为规划的逻辑卷大小,具体大小以实际情况为准;datalv为创建的逻辑卷的名字,具体名称以实际规划为准)。

    1
    
    lvcreate -L 600G -n datalv datavg
  4. 创建文件系统。

    1
    
    mkfs.xfs /dev/datavg/datalv
  5. 创建数据目录并挂载。

    1
    
    mkdir /data
    1
    
    mount /dev/datavg/datalv /data
  6. 执行命令vi /etc/fstab,编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。

    其中,/dev/datavg/datalv为示例,具体名称以实际情况为准。

    img

创建数据库目录并且授权

  1. 在已创建的数据目录 /data 基础上,使用root权限继续创建进程所需的相关目录并授权MySQL用户(组)。

    1
    2
    3
    4
    
    mkdir -p /data/mysql
    cd /data/mysql
    mkdir data tmp run log
    chown -R mysql:mysql /data

安装、运行和卸载

安装

  1. 配置本地yum源,详细信息请参考搭建repo服务器章节。

  2. 清除缓存。

    1
    
    dnf clean all
  3. 创建缓存。

    1
    
    dnf makecache
  4. 在root权限下安装MySQL服务器。

    1
    
    dnf install mysql-server
  5. 查看安装后的rpm包。

    1
    
    rpm -qa | grep mysql-server

运行

  1. 修改配置文件。

    1. 在root权限下创建my.cnf文件,其中文件路径(包括软件安装路径basedir、数据路径datadir等)根据实际情况修改。

      1
      
      vi /etc/my.cnf

      编辑my.cnf内容如下:

       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      
      [mysqld_safe]
      log-error=/data/mysql/log/mysql.log
      pid-file=/data/mysql/run/mysqld.pid
      [mysqldump]
      quick
      [mysql]
      no-auto-rehash
      [client]
      default-character-set=utf8
      [mysqld]
      basedir=/usr/local/mysql
      socket=/data/mysql/run/mysql.sock
      tmpdir=/data/mysql/tmp
      datadir=/data/mysql/data
      default_authentication_plugin=mysql_native_password
      port=3306
      user=mysql
    2. 确保my.cnf配置文件修改正确。

      1
      
      cat /etc/my.cnf

      img

      注意:

      其中basedir为软件安装路径,请根据实际情况修改。

    3. 在root权限下修改/etc/my.cnf文件的组和用户为mysql:mysql

      1
      
      chown mysql:mysql /etc/my.cnf
  2. 配置环境变量。

    1. 安装完成后,在root权限下将MySQL二进制文件路径到PATH。

      1
      
      echo export  PATH=$PATH:/usr/local/mysql/bin  >> /etc/profile

      注意:

      其中PATH中的“/usr/local/mysql/bin“路径,为MySQL软件安装目录下的bin文件的绝对路径。请根据实际情况修改。

    2. 在root权限下使环境变量配置生效。

      1
      
      source /etc/profile
  3. 在root权限下初始化数据库。

    说明:

    本步骤倒数第2行中有初始密码,请注意保存,登录数据库时需要使用。

    1
    2
    3
    4
    
    # mysqld --defaults-file=/etc/my.cnf --initialize
    2020-03-18T03:27:13.702385Z 0 [System] [MY-013169] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.17) initializing of server in progress as process 34014
    2020-03-18T03:27:24.112453Z 5 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: iNat=)#V2tZu
    2020-03-18T03:27:28.576003Z 0 [System] [MY-013170] [Server] /usr/local/mysql/bin/mysqld (mysqld 8.0.17) initializing of server has completed

    查看打印信息,打印信息中包括“initializing of server has completed”表示初始化数据库完成,且打印信息中“A temporary password is generated for root@localhost: iNat=)V2tZu”的“iNat=)V2tZu”为初始密码。

  4. 启动数据库。

    注意:

    如果第一次启动数据库服务,以root用户启动数据库,则启动时会提示缺少mysql.log文件而导致失败。使用mysql用户启动之后,会在/data/mysql/log目录下生成mysql.log文件,再次使用root用户启动则不会报错。

    1. 在root权限下修改文件权限。

      1
      2
      
      chmod 777 /usr/local/mysql/support-files/mysql.server
      chown mysql:mysql /var/log/mysql/*
    2. 在root权限下启动MySQL。

      1
      2
      
      cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql
      chkconfig mysql on

      以mysql用户启动数据库。

      1
      2
      
      su - mysql
      service mysql start
  5. 登录数据库。

    说明:

    • 提示输入密码时,请输入3产生的初始密码。
    • 如果采用官网RPM安装方式,则mysql文件在/usr/bin目录下。登录数据库的命令根据实际情况修改。
    1
    
    # /usr/local/mysql/bin/mysql -uroot -p  -S /data/mysql/run/mysql.sock

    img

  6. 配置数据库帐号密码。

    1. 登录数据库以后,修改通过root用户登录数据库的密码。

      1
      
      mysql> alter user 'root'@'localhost' identified by "123456";
    2. 创建全域root用户(允许root从其他服务器访问)。

      1
      
      mysql> create user 'root'@'%' identified by '123456';
    3. 进行授权。

      1
      2
      
      mysql> grant all privileges on *.* to 'root'@'%';
      mysql> flush privileges;

      img

  7. 退出数据库。

    执行 \q 或者 exit 退出数据库。

    1
    
    mysql> exit

    img

卸载

  1. 在root权限下关闭数据库进程。

    1
    2
    
    ps -ef | grep mysql
    kill -9 进程ID
  2. 在root权限下执行dnf remove mysql命令卸载MySQL。

    1
    
    dnf remove mysql

管理数据库用户

创建用户

可以使用CREATE USER语句来创建一个或多个用户,并设置相应的口令。

1
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password';

其中:

  • username:用户名。
  • host:主机名,即用户连接数据库时所在的主机的名字。若是本地用户可用localhost,若在创建的过程中,未指定主机名,则主机名默认为“%”,表示一组主机。
  • password:用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器,但从安全的角度而言,不推荐这种做法。

使用CREATE USER语句必须拥有数据库的INSERT权限或全局CREATE USER权限。

使用CREATE USER语句创建一个用户帐号后,会在系统自身的数据库的user表中添加一条新记录。若创建的帐户已经存在,则语句执行时会出现错误。

新创建的用户拥有的权限很少,只允许进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。

示例

创建密码为123456,用户名为userexample1的本地用户。

1
> CREATE USER 'userexample1'@'localhost' IDENTIFIED BY '123456';

创建密码为123456,用户名为userexample2,主机名为192.168.1.100的用户。

1
> CREATE USER 'userexample2'@'192.168.1.100' IDENTIFIED BY '123456';

查看用户

可以使用SHOW GRANTS语句或SELECT语句查看一个或多个用户。

查看特定用户:

1
SHOW GRANTS [FOR 'username'@'hostname'];
1
SELECT USER,HOST,PASSWORD FROM mysql.user WHERE USER='username';

查看所有用户:

1
SELECT USER,HOST FROM mysql.user;

其中:

  • username:用户名。
  • hostname:主机名。
示例

查看userexample1用户。

1
> SHOW GRANTS FOR 'userexample1'@'localhost';

查看mysql数据库中所有用户。

1
> SELECT USER,HOST FROM mysql.user;

修改用户

修改用户名

可以使用RENAME USER语句修改一个或多个已经存在的用户名。

1
RENAME USER 'oldusername'@'hostname' TO 'newusername'@'hostname';

其中:

  • oldusername:旧的用户名。
  • newusername:新的用户名。
  • hostname:主机名。

RENAME USER语句用于对原有的帐号进行重命名。若系统中旧帐号不存在或者新帐号已存在,则该语句执行时会出现错误。

使用RENAME USER语句,必须拥有数据库的UPDATE权限或全局CREATE USER权限。

修改用户示例

将用户名userexample1修改为userexapme2,主机名为locahost。

1
> RENAME USER 'userexample1'@'localhost' TO 'userexample2'@'localhost';
修改用户密码

可以使用SET PASSWORD语句修改一个用户的登录密码。

1
SET PASSWORD FOR 'username'@'hostname' = 'newpassword';

其中:

  • FOR ‘username’@‘hostname’:FOR字句,可选项,指定欲修改密码的用户名及主机名。
  • ’newpassword’:新密码。

在SET PASSWORD语句中,若不加上FOR子句,表示修改当前用户的密码。

FOR字句中必须以’username’@‘hostname’的格式给定,username为帐户的用户名,hostname为帐户的主机名。

欲修改密码的帐号必须在系统中存在,否则语句执行时会出现错误。

修改用户密码示例

将用户名为userexample的密码修改为0123456,主机名为locahost。

1
> SET PASSWORD FOR 'userexample'@'localhost' = '0123456';

删除用户

可以使用DROP USER语句来删除一个或多个用户帐号以及相关的权限。

1
DROP USER 'username1'@'hostname1' [,'username2'@'hostname2']…;

注意:

用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,因为数据库并不会记录创建了这些对象的帐号。

DROP USER语句可用于删除一个或多个数据库帐号,并删除其原有权限。

使用DROP USER语句必须拥有数据库的DELETE权限或全局CREATE USER权限。

在DROP USER语句的使用中,若没有明确地给出帐号的主机名,则该主机名默认为“%”。

示例

删除用户名为userexample的本地用户。

1
> DROP USER 'userexample'@'localhost';

用户授权

可以使用GRANT语句来对新建用户的授权。

1
GRANT privileges ON databasename.tablename TO 'username'@'hostname';

其中:

  • ON字句:用于指定权限授予的对象和级别。
  • privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所有的权限则使用ALL。
  • databasename:数据库名。
  • tablename:表名。
  • TO字句:用来设定用户密码,以及指定被赋予权限的用户。
  • username:用户名。
  • hostname:主机名。

如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*。

如果在TO子句中给系统中存在的用户指定密码,则新密码会将原密码覆盖。

如果权限被授予给一个不存在的用户,则会自动执行一条CREATE USER语句来创建这个用户,但同时必须为该用户指定密码。

示例

对本地用户userexample授予SELECT和INSERT权限。

1
> GRANT SELECT,INSERT ON *.* TO 'userexample'@'localhost';

删除用户权限

可以使用REVOKE语句来删除一个用户的权限,但此用户不会被删除。

1
REVOKE privilege ON databasename.tablename FROM 'username'@'hostname';

其中REVOKE语句的参数与GRANT语句的参数含义相同。

要使用 REVOKE 语句,必须拥有数据库的全局CREATE USER权限或UPDATE权限。

示例

删除本地用户userexample的INSERT权限。

1
> REVOKE INSERT ON *.* FROM 'userexample'@'localhost';

管理数据库

创建数据库

可以使用CREATE DATABASE语句来创建数据库。

1
CREATE DATABASE databasename;

其中:databasename为数据库名称,且数据库名称不区分大小写。

示例

创建数据库名为databaseexample的数据库。

1
> CREATE DATABASE databaseexample;

查看数据库

可以使用SHOW DATABASES语句来查看数据库。

1
SHOW DATABASES;
示例

查看所有数据库。

1
> SHOW DATABASES;

选择数据库

一般创建表,查询表等操作首先需要选择一个目标数据库。可以使用USE语句来选择数据库。

1
USE databasename;

其中:databasename为数据库名称。

示例

选择databaseexample数据库。

1
> USE databaseexample;

删除数据库

可以使用DROP DATABASE语句来删除数据库。

注意:

删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。

1
DROP DATABASE databasename;

其中:databasename为数据库名称。

DROP DATABASE命令用于删除创建过(已存在)的数据库,且会删除数据库中的所有表,但数据库的用户权限不会自动删除。

要使用DROP DATABASE,您需要数据库的DROP权限。

DROP SCHEMA是DROP DATABASE的同义词。

示例

删除databaseexample数据库。

1
> DROP DATABASE databaseexample;

备份数据库

可以在root权限下使用mysqldump命令备份数据库。

备份一个或多个表:

1
mysqldump [options] databasename [tablename ...] > outfile

备份一个或多个库:

1
mysqldump [options] -databases databasename ... > outfile

备份所有库:

1
mysqldump [options] -all-databases > outputfile

其中:

  • databasename:数据库名称。
  • tablename:数据表名称。
  • outfile:数据库备份的文件。
  • options:mysqldump命令参数选项,多个参数之间可以使用空格分隔。常用的mysqldump命令参数选项如下:
    • -u, –user= username :指定用户名。
    • -p, –password[= password]:指定密码。
    • -P, –port= portnumber :指定端口。
    • -h, –host= hostname :指定主机名。
    • -r, –result-file= filename :将导出结果保存到指定的文件中,等同于“>”。
    • -t:只备份数据。
    • -d:只备份表结构。
示例

备份主机为192.168.202.144,端口为3306,root用户下的所有数据库到alldb.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --all-databases > alldb.sql

备份主机为192.168.202.144,端口为3306,root用户下的db1数据库到db1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 --databases db1 > db1.sql

备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的tb1表到db1tb1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 db1 tb1 > db1tb1.sql

只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的表结构到db1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -d db1 > db1.sql

只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的数据到db1.sql中。

1
mysqldump -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 > db1.sql

恢复数据库

可以在root权限下使用mysql命令恢复数据库。

恢复一个或多个表:

1
mysql -h hostname -P portnumber -u username -ppassword databasename < infile

其中:

  • hostname:主机名。
  • portnumber:端口号。
  • username:用户名。
  • password:密码。
  • databasename:数据库名。
  • infile:mysqldump命令中的outfile参数。
示例

恢复数据库。

1
# mysql -h 192.168.202.144 -P 3306 -uroot -p123456 -t db1 < db1.sql

openGauss服务器

软件介绍

openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。

安装

安装指南请参见《openGauss rpm安装》

管理数据库角色

创建角色

可以使用CREATE ROLE语句来创建角色,在数据库界面执行。

1
CREATE ROLE role_name [ [ WITH ] option [ ... ] ] [ ENCRYPTED | UNENCRYPTED ] { PASSWORD | IDENTIFIED BY } { 'password' [EXPIRED] | DISABLE };

其中:

  • role_name:角色名。
  • password:登录密码。
  • option为参数选项,常用的有:
    • SYSADMIN | NOSYSADMIN:决定一个新角色是否为"系统管理员",具有SYSADMIN属性的角色拥有系统最高权限。缺省为NOSYSADMIN。
    • CREATEDB | NOCREATEDB:定义一个角色是否能创建数据库,若未指定,则默认为NOCREATEDB,即不能创建数据库。
    • CREATEROLE | NOCREATEROLE:决定一个角色是否可以创建新角色,若未指定,则默认为NOCREATEROLE,即不能创建新角色。
    • INHERIT | NOINHERIT:这些子句决定一个角色是否“继承”它所在组的角色的权限。不推荐使用。
    • LOGIN | NOLOGIN:具有LOGIN属性的角色才可以登录数据库。一个拥有LOGIN属性的角色可以认为是一个用户。
    • ENCRYPTED | UNENCRYPTED:控制密码存储在系统表里的口令是否加密。按照产品安全要求,密码必须加密存储,所以,UNENCRYPTED在openGauss中禁止使用。因为系统无法对指定的加密口令字符串进行解密,所以如果目前的口令字符串已经是用SHA256加密的格式,则会继续照此存放,而不管是否声明了ENCRYPTED或UNENCRYPTED。这样就允许在dump/restore的时候重新加载加密的口令。
    • VALID UNTIL:设置角色失效的时间戳。如果省略了该子句,角色无有效结束时间限制。
    • IN ROLE:新角色立即拥有IN ROLE子句中列出的一个或多个现有角色拥有的权限。不推荐使用。
    • ROLE:ROLE子句列出一个或多个现有的角色,它们将自动添加为这个新角色的成员,拥有新角色所有的权限。

要使用这条命令,必须拥有 CREATE ROLE 权限或者是系统管理员。

示例

创建一个角色,名为manager,密码为xxxxxxxxx。

1
openGauss=# CREATE ROLE manager IDENTIFIED BY 'xxxxxxxxx';

创建一个角色,从2015年1月1日开始生效,到2026年1月1日失效。

1
openGauss=# CREATE ROLE miriam WITH LOGIN PASSWORD 'xxxxxxxxx' VALID BEGIN '2015-01-01' VALID UNTIL '2026-01-01';

查看角色

可以使用SELECT语句或gsql的元命令du或者du+查看角色。

1
SELECT * FROM pg_roles;
1
\du
1
\du+
示例

查看所有角色名包括内置角色。

1
openGauss=# SELECT rolname from pg_roles;

查看现有角色不包含内置角色。

1
openGauss=# \du

修改角色

修改用户名

可以使用ALTER ROLE语句修改一个已经存在的角色名。

1
ALTER ROLE oldrolename RENAME TO newrolename;

其中:

  • oldrolename:旧的角色名。
  • newrolename:新的角色名。
修改用户示例

将角色名manager修改为newmanager。

1
openGauss=# ALTER ROLE manager RENAME TO newmanager;
修改用户密码

可以使用ALTER ROLE语句修改一个角色的登录密码。

1
ALTER ROLE rolename with PASSWORD 'password'

其中:

  • rolename:角色名。
  • password:密码。
修改角色密码示例

将manager的密码修改为xxxxxxxxx。

1
openGauss=# ALTER ROLE manager with PASSWORD 'xxxxxxxxx';

删除角色

可以使用DROP ROLE语句来删除角色。在数据库界面执行。

1
DROP ROLE rolename;

其中:rolename为角色名。

示例

删除manager角色。

1
openGauss=# DROP ROLE manager;

角色授权

可以使用GRANT语句来对角色授权。

对角色授予表或视图的操作权限:

1
2
3
4
5
6
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER | ALTER | DROP | COMMENT | INDEX | VACUUM } [, ...] 
      | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
       | ALL TABLES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] 
    [ WITH GRANT OPTION ];

对角色授予序列的操作权限:

1
2
3
4
5
6
GRANT { { SELECT | UPDATE | USAGE | ALTER | DROP | COMMENT } [, ...] 
      | ALL [ PRIVILEGES ] }
    ON { [ [ LARGE ] SEQUENCE ] sequence_name [, ...]
       | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...] 
    [ WITH GRANT OPTION ];

对角色授予数据库的操作权限:

1
2
3
4
5
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...]
      | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];

对角色授予函数的操作权限:

1
2
3
4
5
GRANT { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
       | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];

对角色授予过程语言的操作权限:

1
2
3
4
GRANT { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];

将模式的访问权限赋予指定的角色:

1
2
3
4
GRANT { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];

对角色授予表空间的操作权限:

1
2
3
4
GRANT { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    TO { [ GROUP ] role_name | PUBLIC } [, ...]
    [ WITH GRANT OPTION ];

将角色rolename1的成员关系赋予角色rolename2:

1
GRANT rolename1 [, ...] TO rolename2 [, ...] [ WITH ADMIN OPTION ]

其中:

  • SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL PRIVILEGES:用户的操作权限,ALL PRIVILEGES表示所有的权限。
  • ON字句:用于指定权限授予的对象。
  • tablename:表名。
  • TO字句:用来指定被赋予权限的角色。
  • rolename1、rolename2:角色名。
  • PUBLIC:表示该权限要赋予所有角色,包括那些以后可能创建的用户。
  • WITH GRANT OPTION:被授权的用户也可以将此权限赋予他人,否则就不能授权给他人。这个选项不能赋予PUBLIC。
  • sequence_name:序列名。
  • database_name:数据库名。
  • function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, …] ] )} [, …]:函数名及其参数。
  • lang_name:过程语言名。
  • schema_name:模式名。
  • tablespace_name:表空间名。
  • WITH ADMIN OPTION:表示成员随后就可以将角色的成员关系赋予其他角色,以及撤销其他角色的成员关系。
示例

对manager授予数据库database1的CREATE权限。·

1
openGauss=# GRANT CREATE ON DATABASE database1 TO manager;

对所有用户授予表table1的所有权限。

1
openGauss=# GRANT ALL PRIVILEGES ON TABLE table1 TO PUBLIC;

删除用户权限

可以使用REVOKE语句来撤销一个或多个角色的权限。

撤销角色对表的操作权限:

1
2
3
4
5
6
7
REVOKE [ GRANT OPTION FOR ]
    { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | ALTER | DROP | COMMENT | INDEX | VACUUM }[, ...] 
    | ALL [ PRIVILEGES ] }
    ON { [ TABLE ] table_name [, ...]
       | ALL TABLES IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];

撤销角色对序列的操作权限:

1
2
3
4
5
6
7
REVOKE [ GRANT OPTION FOR ]
    { { SELECT | UPDATE | ALTER | DROP | COMMENT }[, ...] 
    | ALL [ PRIVILEGES ] }
     ON { [ [ LARGE ] SEQUENCE ] sequence_name [, ...]
       | ALL SEQUENCES IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];

撤销角色对数据库的操作权限:

1
2
3
4
5
6
REVOKE [ GRANT OPTION FOR ]
    { { CREATE | CONNECT | TEMPORARY | TEMP | ALTER | DROP | COMMENT } [, ...] 
    | ALL [ PRIVILEGES ] }
    ON DATABASE database_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];

撤销角色对函数的操作权限:

1
2
3
4
5
6
REVOKE [ GRANT OPTION FOR ]
    { { EXECUTE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON { FUNCTION {function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, ...] ] )} [, ...]
       | ALL FUNCTIONS IN SCHEMA schema_name [, ...] }
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];

撤销角色对过程语言的操作权限:

1
2
3
4
5
REVOKE [ GRANT OPTION FOR ]
   { USAGE | ALL [ PRIVILEGES ] }
    ON LANGUAGE lang_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];

撤销角色对模式的操作权限:

1
2
3
4
5
REVOKE [ GRANT OPTION FOR ]
    { { CREATE | USAGE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON SCHEMA schema_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];

撤销角色对表空间的操作权限:

1
2
3
4
5
REVOKE [ GRANT OPTION FOR ]
    { { CREATE | ALTER | DROP | COMMENT } [, ...] | ALL [ PRIVILEGES ] }
    ON TABLESPACE tablespace_name [, ...]
    FROM { [ GROUP ] role_name | PUBLIC } [, ...]
    [ CASCADE | RESTRICT ];

删除rolename2的rolename1之间的成员关系:

1
REVOKE [ ADMIN OPTION FOR ] rolename1 [, ...] FROM rolename2 [, ...] [ CASCADE | RESTRICT ]

其中:

  • GRANT OPTION FOR:表示只是撤销对该权限的授权的权力,而不是撤销该权限本身。
  • SELECT、INSERT、UPDATE、DELETE、REFERENCES、TRIGGER、USAGE、CREATE、CONNECT、TEMPORARY、TEMP、EXECUTE、ALL PRIVILEGES:用户的操作权限,ALL PRIVILEGES表示所有的权限。
  • ON字句:用于指定撤销权限的对象。
  • table_name:表名。
  • FROM字句:用来指定被撤销权限的角色。
  • rolename1、rolename2:角色名。
  • PUBLIC:表示撤销隐含定义的、拥有所有角色的组,但并不意味着所有角色都失去了权限,那些直接得到的权限以及通过一个组得到的权限仍然有效。
  • sequence_name:序列名。
  • CASCADE:撤销所有依赖性权限。
  • RESTRICT:不撤销所有依赖性权限。
  • database_name:数据库名。
  • function_name ( [ {[ argmode ] [ arg_name ] arg_type} [, …] ] )} [, …]:函数名及其参数。
  • lang_name:过程语言名。
  • schema_name:模式名。
  • tablespace_name:表空间名。
  • ADMIN OPTION FOR:表示传递的授权不会自动收回。
示例

对manager授予数据库database1的CREATE权限。

1
openGauss=# GRANT CREATE ON DATABASE database1 TO manager;

对所有用户撤销表table1的所有权限。

1
openGauss=# REVOKE ALL PRIVILEGES ON TABLE table1 FROM PUBLIC;

管理数据库

创建数据库

可以使用CREATE DATABASE语句来创建数据库。在数据库界面使用。

1
CREATE DATABASE databasename;

其中:databasename为数据库名。

要使用这条命令,必须拥有CREATEDB权限。

示例

创建一个数据库database1。

1
openGauss=# CREATE DATABASE database1;

选择数据库

可以使用\c语句来选择数据库。

1
\c databasename;

其中:databasename为数据库名称。

示例

选择database_example数据库。

1
openGauss=# \c database_example;

查看数据库

可以使用\l语句来查看数据库。

1
\l;
示例

查看所有数据库。

1
openGauss=# \l;

删除数据库

可以使用DROP DATABASE语句来删除数据库。

注意:

删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。

1
DROP DATABASE databasename;

其中:databasename为数据库名称。

DROP DATABASE会删除数据库的系统目录项并且删除包含数据的文件目录。

DROP DATABASE只能由超级管理员或数据库管理者执行。

示例

删除databaseexample数据库。

1
openGauss=# DROP DATABASE databaseexample;

备份数据库

gs_dump支持将数据库信息导出至纯文本格式的SQL脚本文件或其他归档文件中。

1
2
gs_dump [OPTION]... [DBNAME]
gs_dump -p port_number postgres -f dump1.sql

其中:

  • DBNAME前面不需要加短或长选项。DBNAME指定要连接的数据库。 例如: 不需要-d,直接指定DBNAME。
  • dump1.sql:数据库备份的文件。
  • option:gs_dump命令参数选项,多个参数之间可以使用空格分隔。常用的gs_dump命令参数选项如下:
    • -F, –format=c|d|t|p:选择输出格式。格式如下:
      • p|plain:输出一个文本SQL脚本文件(默认)。
      • c|custom:输出一个自定义格式的归档,并且以目录形式输出,作为gs_restore输入信息。该格式是最灵活的输出格式,因为能手动选择,而且能在恢复过程中将归档项重新排序。该格式默认状态下会被压缩。
      • d|directory:该格式会创建一个目录,该目录包含两类文件,一类是目录文件,另一类是每个表和blob对象对应的数据文件。
      • t|tar:输出一个tar格式的归档形式,作为gs_restore输入信息。tar格式与目录格式兼容;tar格式归档形式在提取过程中会生成一个有效的目录格式归档形式。但是,tar格式不支持压缩且对于单独表有8GB的大小限制。此外,表数据项的相应排序在恢复过程中不能更改.
    • -h, –host=HOSTNAME:指定主机名。
    • -p, –port=PORT:指定端口。
    • -U, –username=NAME:指定连接的用户名。
    • -W, –password=PASSWORD:指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W选项;如果没有-W选项,并且不是系统管理员,“Dump Restore工具”会提示用户输入密码。
    • -w, –no-password:不出现输入密码提示。如果主机要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。
示例

执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.sql文件格式为纯文本格式。

1
[openGauss@localhost ~]#  gs_dump -U omm -W password -f backup/MPPDB_backup.sql -p port postgres -F p

执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.dmp文件格式为自定义归档格式。

1
gs_dump -U omm -W password -f backup/MPPDB_backup.dmp -p port postgres -F c

恢复数据库

gs_restore是openGauss提供的针对gs_dump导出数据的导入工具。通过此工具可将由gs_dump生成的导出文件进行导入。

1
gs_restore [OPTION]... FILE

其中:

  • FILE没有短选项或长选项。用来指定归档文件所处的位置。
  • 作为前提条件,需输入dbname或-l选项。不允许用户同时输入dbname和-l选项。
  • gs_restore默认是以追加的方式进行数据导入。为避免多次导入造成数据异常,在进行导入时,建议使用“-c” 参数,在重新创建数据库对象前,清理(删除)已存在于将要还原的数据库中的数据库对象。
  • option:通用参数如下:
    • -f,–file=FILENAME:指定生成脚本的输出文件,或使用-l时列表的输出文件。
    • -d, –dbname=NAME:连接数据库dbname并直接导入到该数据库中。
    • -h, –host=HOSTNAME:指定主机名。
    • -p, –port=PORT:指定端口。
    • -U, –username=NAME:指定连接的用户名。
    • -W, –password=PASSWORD:指定用户连接的密码。如果主机的认证策略是trust,则不会对系统管理员进行密码验证,即无需输入-W参数;如果没有-W参数,并且不是系统管理员,“gs_restore”会提示用户输入密码。
示例

执行gs_restore,将导出的MPPDB_backup.dmp文件(自定义归档格式)导入到postgres数据库。

1
[openGauss@localhost ~]# gs_restore -W password backup/MPPDB_backup.dmp -p port -d postgres

网卡无法启动

1
2
3
4
5
6
7
8
#用ifconfig查看,发现网卡不见了。用ifconfig -a查看,发现ens33网卡是在的,只是状态是down的。
#临时的解决方法:
#使用ifconfig命令,直接启动ens33网卡
[root@centos7 ~]# ifconfig ens33 up
#然后,临时配置一个IP地址
[root@centos7 ~]# ifconfig ens33 192.168.100.1 netmask 255.255.255.0
 
注意:此方法再虚拟机重启后失效。

管理RPM包

RPM的全名是Red Hat Package Manager,本意是Red Hat 软件包管理。在openEuler、Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用。

RPM以数据库记录的方式将需要的软件安装到Linux主机的一套管理程序,特点是将要安装的软件先编译并打包,通过包装好的软件中默认的数据库记录,记录这个软件在安装的时候需要的依赖属性模块,在用户的Linux主机安装时,RPM会先根据软件里的记录数据,查询Linux主机的依赖属性软件是否满足:

  • 若满足则予以安装。
  • 若不满足则不安装。

安装时将该软件的信息全部写入RPM的数据库中以便后续查询、验证与卸载。

zh-cn_other_0000001337581224

  1. rpm包默认安装路径

通常情况下,RPM采用系统默认的安装路径(默认安装路径可以通过命令查询,后续章节中将会详细介绍),所有安装文件都会按照类别分散到如下表格所示的目录中。

表 1 RPM安装路径及其含义

安装路径含义
/etc/配置文件安装目录。
/usr/bin/可执行命令安装目录。
/usr/lib/程序所使用的函数库保存位置。
/usr/share/doc基本软件使用手册保存位置。
/usr/share/man/帮助文件保存位置。

注意: RPM包支持手动指定安装路径,但此方式不推荐使用。通过手动指定安装路径后,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需手动配置才能被系统识别)。

RPM 包的常用操作命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#1. 安装
rpm -ivh package.rpm:安装指定的 RPM 包,其中-i表示安装,-v表示显示详细信息,-h表示以哈希符号显示安装进度。
 
#2. 升级
rpm -Uvh package.rpm:升级指定的 RPM 包,如果系统中未安装该包,则会进行安装。-U选项用于升级操作。
 
#3. 卸载
rpm -e package:卸载指定的已安装软件包,-e表示卸载操作。
 
#4. 查询
rpm -qa:查询系统中已安装的所有 RPM 包。可以通过管道符|与grep命令结合使用,来查找特定的软件包。例如,rpm -qa | grep openssh可以查找系统中已安装的 OpenSSH 相关的 RPM 包。
rpm -qi package:查询指定软件包的详细信息,包括软件的描述、版本、依赖关系等。
rpm -ql package:查询指定软件包安装的文件列表,显示该软件包在系统中安装的所有文件及其路径。

rpm命令选项

操作1. 软件包RPM签名检查

Linux机器安装RPM包之前,需要检查PGP签名,确保签名的完整性和来源无问题后,使用RPM命令中的以下选项来验证有效性。

1
rpm --checksig nano-2.3.1-10.el7.x86_64.rpm

操作2. 安装RPM包

Linux系统中安装RPM包时,请在rpm命令中使用 -i 选项。

1
rpm -ivh nano-2.3.1-10.el7.x86_64.rpm
  • -i : 安装软件包
  • -v: 详细信息
  • -h: 套件安装时列出标记

操作3. 查询已安装的RPM包

查询Linux系统中已经安装的RPM包(dnf),可以在rpm命令中使用 -q 选项。

1
rpm -q dnf
  • -q: 查询操作

如果系统未安装给定的包,会出现以下错误信息。

1
2
# rpm -q dnf
package dnf is not installed

操作4. 查询所有已安装的RPM包

查询Linux系统中安装的所有RPM包,请在rpm命令中使用 -qa 选项。

1
2
3
4
5
# rpm -qa 
dracut-config-rescue-055-7.oe2203sp2.x86_64
parted-3.5-1.oe2203sp2.x86_64
irqbalance-1.8.0-9.oe2203sp2.x86_64
......

注意:一般在使用 -qa 选项时,会配合管道符 “|” 一起使用,提升查找的准确率。

操作5. 查看已安装的RPM包详细信息

在rpm命令中使用 -qi 选项来验证系统中安装的RPM包的详细信息。

 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
# rpm -qi python3
Name        : python3
Version     : 3.9.9
Release     : 24.oe2203sp2
Architecture: x86_64
Install Date: Wed 30 Mar 2022 08:30:23 AM UTC
Group       : Unspecified
Size        : 35916839
License     : Python
Signature   : RSA/SHA1, Wed 30 Mar 2022 03:29:30 AM UTC, Key ID d557065eb25e7f66
Source RPM  : python3-3.9.9-24.oe2203sp2.x86_64.rpm
Build Date  : Tue 15 Mar 2022 12:00:00 AM UTC
Build Host  : obs-worker1639015616-x86-0001
Packager    : http://openeuler.org
Vendor      : http://openeuler.org
URL         : https://www.python.org/
Summary     : Interpreter of the Python3 programming language
Description :
Python combines remarkable power with very clear syntax. It has modules,
classes, exceptions, very high level dynamic data types, and dynamic
typing. There are interfaces to many system calls and libraries, as well
as to various windowing systems. New built-in modules are easily written
in C or C++ (or other languages, depending on the chosen implementation).
Python is also usable as an extension language for applications written
in other languages that need easy-to-use scripting or automation interfaces.

This package Provides python version 3.

操作6. 查看未安装的RPM包所有文件

查看未安装的RPM包的文件列表,可以在rpm命令中使用 -qlp 选项。

1
2
3
4
5
6
7
# rpm -qlp pkgship-2.2.0-10.oe2203sp2.noarch.rpm
/etc/ima/digest_lists.tlv/0-metadata_list-compact_tlv-pkgship-2.2.0-10.oe2203sp2.noarch
/etc/ima/digest_lists/0-metadata_list-compact-pkgship-2.2.0-10.oe2203sp2.noarch
/etc/pkgship/auto_install_pkgship_requires.sh
/etc/pkgship/conf.yaml
/etc/pkgship/package.ini
......

操作7. 查看未安装的RPM包依赖项

查看未安装的RPM包编译的依赖包列表,可以在rpm命令中使用 -qRp 选项。

1
2
3
4
5
6
7
8
# rpm -qRp pkgship-2.2.0-10.oe2203sp2.noarch.rpm
/bin/bash
/bin/sh
/usr/bin/python3
config(pkgship) = 2.2.0-10.oe2203sp2
python3
python3-Flask-Limiter
......

操作8. 验证所有已安装的RPM包

验证已安装的RPM包时,将包中安装的文件信息与rpm数据库中存储的包元数据中获取的文件的信息进行比较,可以通过在rpm命令中使用 -Va 选项。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# rpm -Va
S.5....T.  c /root/.bashrc
.......T.  c /etc/yum.repos.d/openEuler.repo
S.5....T.  c /etc/issue
S.5....T.  c /etc/issue.net
S.5....T.  c /etc/csh.login
S.5....T.  c /etc/profile
.M....G..  g /var/log/lastlog
.M.......  c /boot/grub2/grubenv
......

rpm -Va命令相关输出字段及其含义:

字段含义
S文件长度发生变化。
M文件的访问权限或文件类型发生变化。
5MD5校验和发生变化。
D设备节点的属性发生变化。
L文件的符号链接发生变化。
U文件/子目录/ 设备节点的owner发生变化。
G文件/子目录/ 设备节点的group发生变化。
T文件最后一次的修改时间发生变化。

操作9. 查看特定文件的RPM包

在Linux上找到一个提供特定二进制文件的RPM包,可以在rpm命令中使用 -qf 选项。

1
2
# rpm -qf /usr/share/doc/pkgship
pkgship-2.2.0-10.oe2203sp2.noarch.rpm

操作10. 查看已安装RPM包中的文件

查看特定RPM包的安装文件列表,可以在rpm命令中使用 -ql 选项。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# rpm -ql dnf
/etc/bash_completion.d/dnf
/etc/ima/digest_lists.tlv/0-metadata_list-compact_tlv-dnf-4.14.0-14.oe2203sp2.noarch
/etc/ima/digest_lists/0-metadata_list-compact-dnf-dnf-4.14.0-14.oe2203sp2.noarch
/usr/bin/dnf
/usr/lib/systemd/system/dnf-makecache.service
/usr/lib/systemd/system/dnf-makecache.timer
/usr/share/doc/dnf
/usr/share/doc/dnf/AUTHORS
/usr/share/doc/dnf/README.rst
/usr/share/licenses/dnf
/usr/share/licenses/dnf/COPYING
/usr/share/licenses/dnf/PACKAGE-LICENSING
/var/cache/dnf

操作11. 查看最近安装的RPM包

Linux是一个多用户操作系统,在使用过程中,其他用户可能已经安装了部分软件包。如需在系统中找到最近安装的包,可以在rpm命令中使用 -qa –last 选项。

1
2
3
4
# rpm -qa --last
ntp-4.2.8p15-11.oe2203sp2.x86_64
ntpstat-0.6-4.oe2203sp2.noarch
ntp-help-4.2.8p15-11.oe2203sp2.noarch

操作12. 只查看已安装RPM包的文档

可以从Linux Man页面获得任何命令的帮助(/usr/share/doc/Package_Name-Version_Number/docs* 文档存放路径),查看安装的RPM包相关联的文档列表,请在rpm命令中使用 -qdf 选项,并输入二进制文件路径

1
2
3
4
5
6
7
8
9
# rpm -qdf /usr/bin/grep
/usr/share/doc/grep/NEWS
/usr/share/doc/grep/README
/usr/share/doc/grep/THANKS
/usr/share/doc/grep/TODO
/usr/share/info/grep.info.gz
/usr/share/man/man1/egrep.1.gz
/usr/share/man/man1/fgrep.1.gz
/usr/share/man/man1/grep.1.gz

操作13. 升级已安装的RPM包

通过使用 -Uvh 选项和rpm命令,可以轻松地将已经安装的rpm包升级到最新版本。

1
2
# rpm -Uvh pkgship-2.2.0-10.oe2203sp2.noarch.rpm
Preparing...        ################################# [100%]

注意:升级安装的RPM包时,会删除旧RPM包,安装新RPM包。

操作14. 移除已安装的RPM包

删除安装在系统上的rpm包,请在rpm命令中使用 -ev-e 选项。

1
rpm -ev pkgship

操作15. 重建损坏的RPM数据库

在尝试使用yum update命令更新系统时,可能会收到一条错误消息(RPM数据库已损坏),如果收到该信息,请在RPM命令中使用 –rebuilddb 选项。

1
2
rm /var/lib/rpm/__db*
rpm --rebuilddb

操作16. 检查特定包的漏洞是否已修复

可以通过在rpm命令中使用 –changelog 选项并输入相应的CVE来实现。

1
rpm -q --changelog python-2.6.6 | grep -i "CVE-2019-9636"

操作17. 导入RPM GPG密钥

默认情况下,当向Linux系统添加新的存储库时,GPG密钥将自动导入。同时,也可在RPM命令中添加**–import** 手动导入RPM GPG密钥,用于从存储库下载时检查包的完整性。

1
rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-OpenEuler-24.03-LTS-SP1

配置SSH

  1. SSH服务介绍

SSH(Secure Shell)**是目前较可靠,专为远程登录会话和其他网络服务**提供安全性保障的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。透过SSH可以对所有传输的数据进行加密,并防止DNS欺骗和IP欺骗。OpenSSH是SSH协议的免费开源实现。

  1. 配置SSH服务
1
2
3
4
5
6
7
8
# 打开并修改/etc/ssh/sshd_config文件
vi /etc/ssh/sshd_config

# 重新启动SSH服务
systemctl restart sshd

# 检查SSH服务状态
systemctl status sshd
  1. SSH服务配置文件主要选项
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# 指定SSH协议版本(Specify SSH Protocol Version)
Protocol 2

# 允许的用户(Allowed Users)
AllowUsers xxx

# 被拒绝的用户(Denied Users)
DenyUser root

# 配置会话超时(Configure Session Timeout)
ClientAliveInterval 120

# 禁用SSH根登录(Disable SSH Root Login)
PermitRootLogin no

# 配置或更改SSH端口号(Configure or Change SSH Port Number)
Port 1234

# 禁用SSH密码身份验证 (Disable SSH Password Authentication)
PasswordAuthentication no

SSH时出现WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!

**翻译过来就是 警告:远程主机标识已更改!**ssh服务是通过公钥和私钥来进行连接的,它会把每个曾经访问过计算机或服务器的公钥(public key),记录在~/.ssh/known_hosts 中,当下次访问曾经访问过的计算机或服务器时,ssh就会核对公钥,如果和上次记录的不同,OpenSSH会发出警告。 使用命令清除所连接的IP ssh-keygen -R XX.XX.XX.XX

nmcli配置网络

配置 IP

nmcliNetworkManager 的命令行管理工具,它让你能完全通过命令来查询、配置和控制Linux系统的网络连接,非常适合服务器、远程终端或无图形界面的环境

它的设计哲学是“一个工具,完成所有”,替代了传统的 ifconfigroute 和手动编辑 /etc/network/interfaces/etc/sysconfig/network-scripts/ 下配置文件的方式,提供了更统一、强大的管理方式。

🔧 使用 nmcli 配置静态 IP(有线连接)

这是最常用的场景。假设你要为网卡 enp3s0(请用 ip addrnmcli device status 确认你的实际网卡名)配置静态IP。

核心思路是:修改(或新建)一个与该网卡绑定的“连接”。在 NetworkManager 里,“设备”是物理网卡,“连接”是配置方案,一个设备可以有多个连接配置,但一次只能激活一个。

以下是两种最清晰、可靠的方法:

方法一:直接修改现有连接(推荐,最直接)

此方法直接修改当前活跃的连接配置。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# 1. 先找到当前设备关联的连接名
nmcli connection show

# 假设找到的连接名是 “有线连接 1”,设备是 enp3s0
# 2. 一次性修改所有关键参数(执行后会立即生效并自动重新连接)
sudo nmcli connection modify "有线连接 1" \
    ipv4.addresses "192.168.1.100/24" \
    ipv4.gateway "192.168.1.1" \
    ipv4.dns "8.8.8.8 8.8.4.4" \
    ipv4.method manual \
    connection.autoconnect yes

# 3. 重新激活连接使配置生效
sudo nmcli connection up "有线连接 1"

方法二:新建一个连接配置

如果不想改动原配置,或想保留多套配置方案,可以新建连接。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# 1. 为设备 enp3s0 新建一个名为 “my-static-ip” 的连接,并配置静态IP
sudo nmcli connection add type ethernet con-name "my-static-ip" ifname enp3s0 \
    ipv4.addresses "192.168.1.100/24" \
    ipv4.gateway "192.168.1.1" \
    ipv4.dns "8.8.8.8" \
    ipv4.method manual \
    autoconnect yes

# 2. 激活这个新连接(会自动断开旧连接)
sudo nmcli connection up "my-static-ip"

关键参数解释

  • ipv4.addresses "192.168.1.100/24":设置IP地址和子网掩码(/24255.255.255.0)。
  • ipv4.gateway "192.168.1.1":设置默认网关。
  • ipv4.dns "8.8.8.8 ...":设置DNS服务器,多个用空格隔开。
  • ipv4.method manual:表示使用静态IP(手动配置)。dhcp 表示自动获取。
  • connection.autoconnect yes:设置开机自动连接。

📚 其他常用 nmcli 操作

你可以通过以下命令组合,完成绝大多数网络管理任务:

任务命令说明
查看设备状态nmcli device status查看所有网络设备(网卡)的连接状态
查看连接配置nmcli connection show
nmcli connection show "连接名"
列出所有连接配置,或查看某个配置的详细信息
启用/禁用连接sudo nmcli connection up "连接名"
sudo nmcli connection down "连接名"
激活停用一个连接配置。
连接 WiFinmcli device wifi list
nmcli device wifi connect "SSID" password "密码"
扫描WiFi列表并连接。
创建热点nmcli device wifi hotspot ifname wlan0 ssid "MyHotspot" password "12345678"用指定网卡创建WiFi热点。
重载配置sudo nmcli connection reload在手动修改了网络配置文件后,重载配置(不会断开当前连接)。
监控动态nmcli monitor实时监控设备、连接的动态事件(如连接、断开),按 Ctrl+C 退出。

重要提示

  1. 连接名(con-name):操作时,通常使用你在图形界面或命令中设置的**“连接名”**,而不是设备名。用 nmcli connection show 查看。
  2. 生效与持久化nmcli 的配置修改是即时生效且自动持久化的,配置会保存到 /etc/NetworkManager/system-connections/ 目录下。
  3. 排错:如果配置后网络不通,按顺序检查:
    • ip addr show 确认IP是否配置上。
    • ping 网关IP 检查局域网。
    • ping 8.8.8.8 检查外网。
    • nslookup baidu.com 检查DNS。

使用nmcli命令

说明:

使用nmcli命令配置的网络配置可以立即生效且系统重启后配置也不会丢失。

nmcli介绍

nmcli是NetworkManager的一个命令行工具,它提供了使用命令行配置由NetworkManager管理网络连接的方法。nmcli命令的基本格式为:

1
# nmcli [OPTIONS] OBJECT { COMMAND | help }

其中,OBJECT选项可以是general、networking、radio、connection或device等。在日常使用中,最常使用的是-t, –terse(用于脚本)、-p, –pretty选项(用于用户)及-h, –help选项,用户可以使用“nmcli help”获取更多参数及使用信息。

1
# nmcli help

常用命令使用举例如下:

  • 显示NetworkManager状态:

    1
    
    # nmcli general status
  • 显示所有连接:

    1
    
    # nmcli connection show
  • 只显示当前活动连接,如下所示添加-a, –active:

    1
    
    # nmcli connection show --active
  • 显示由NetworkManager识别到的设备及其状态:

    1
    
    # nmcli device status
  • 使用nmcli工具启动和停止网络接口,在root权限下执行如下命令:

    1
    2
    
    # nmcli connection up id enp3s0
    # nmcli device disconnect enp3s0

设备管理

连接到设备

使用如下命令,NetworkManager将连接到对应网络设备,尝试找到合适的连接配置,并激活配置。

1
# nmcli device connect "$IFNAME"

如果不存在相应的配置连接,NetworkManager将创建并激活具有默认设置的新配置文件。

断开设备连接

使用如下命令,NetworkManager将断开设备连接,并防止设备自动激活。

1
# nmcli device disconnect "$IFNAME"

设置网络连接

列出目前可用的网络连接:

1
2
3
4
5
6
7
# nmcli con show


NAME    UUID                                  TYPE      DEVICE
enp4s0  5afce939-400e-42fd-91ee-55ff5b65deab  ethernet  enp4s0
enp3s0  c88d7b69-f529-35ca-81ab-aa729ac542fd  ethernet  enp3s0
virbr0  ba552da6-f014-49e3-91fa-ec9c388864fa  bridge    virbr0

说明:

输出结果中的NAME字段代表连接ID(名称)。

添加一个网络连接会生成相应的配置文件,并与相应的设备关联。检查可用的设备,方法如下:

1
2
3
4
5
6
7
8
# nmcli dev status

DEVICE      TYPE      STATE      CONNECTION
enp3s0      ethernet  connected  enp3s0
enp4s0      ethernet  connected  enp4s0
virbr0      bridge    connected  virbr0
lo          loopback  unmanaged  --
virbr0-nic  tun       unmanaged  --
配置动态IP连接
配置IP

要使用 DHCP 分配网络时,可以使用动态IP配置添加网络配置文件,命令格式如下:

1
nmcli connection add type ethernet con-name connection-name ifname interface-name

例如创建名为net-test的动态连接配置文件,在root权限下使用以下命令:

1
2
# nmcli connection add type ethernet con-name net-test ifname enp3s0
Connection 'net-test' (a771baa0-5064-4296-ac40-5dc8973967ab) successfully added.

NetworkManager 会将参数 connection.autoconnect 设定为 yes,并将设置保存到 “/etc/sysconfig/network-scripts/ifcfg-net-test”文件中,在该文件中会将 ONBOOT 设置为 yes。

激活连接并检查状态

在root权限下使用以下命令激活网络连接:

1
2
# nmcli con up net-test 
Connection successfully activated (D-Bus active path:/org/freedesktop/NetworkManager/ActiveConnection/5)

检查这些设备及连接的状态,使用以下命令:

1
2
3
4
5
6
7
8
# nmcli device status

DEVICE      TYPE      STATE      CONNECTION
enp4s0      ethernet  connected  enp4s0
enp3s0      ethernet  connected  net-test
virbr0      bridge    connected  virbr0
lo          loopback  unmanaged  --
virbr0-nic  tun       unmanaged  --
配置静态IP连接
配置IP

添加静态 IPv4 配置的网络连接,可使用以下命令:

1
nmcli connection add type ethernet con-name connection-name ifname interface-name ip4 address gw4 address

说明:

如果要添加 IPv6 地址和网关信息,使用 ip6 和 gw6 选项。

例如创建名为 net-static的静态连接配置文件,在root权限下使用以下命令:

1
# nmcli con add type ethernet con-name net-static ifname enp3s0 ip4 192.168.0.10/24 gw4 192.168.0.254

还可为该设备同时指定 IPv6 地址和网关,示例如下:

1
2
# nmcli con add type ethernet con-name test-lab ifname enp3s0 ip4 192.168.0.10/24 gw4 192.168.0.254 ip6 abbe::**** gw6 2001:***::*
Connection 'net-static' (63aa2036-8665-f54d-9a92-c3035bad03f7) successfully added.

NetworkManager 会将其内部参数 ipv4.method 设定为 manual,将 connection.autoconnect 设定为yes,并将设置写入 /etc/sysconfig/network-scripts/ifcfg-net-static 文件,其中会将对应 BOOTPROTO 设定为 none,将 ONBOOT 设定为 yes。

设定两个 IPv4 DNS 服务器地址,在root权限下使用以下命令:

1
# nmcli con mod net-static ipv4.dns "*.*.*.* *.*.*.*"

设置两个 IPv6 DNS 服务器地址,在root权限下使用以下命令:

1
# nmcli con mod net-static ipv6.dns "2001:4860:4860::**** 2001:4860:4860::****"
激活连接并检查状态

激活新的网络连接,在root权限下使用以下命令:

1
2
# nmcli con up net-static ifname enp3s0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)

检查这些设备及连接的状态,使用以下命令:

1
2
3
4
5
6
7
8
# nmcli device status

DEVICE      TYPE      STATE      CONNECTION
enp4s0      ethernet  connected  enp4s0
enp3s0      ethernet  connected  net-static
virbr0      bridge    connected  virbr0
lo          loopback  unmanaged  --
virbr0-nic  tun       unmanaged  --

查看配置的连接详情,使用以下命令(使用 -p,–pretty 选项在输出结果中添加标题和分段):

 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
# nmcli -p con show net-static 
===============================================================================
Connection profile details (net-static )
===============================================================================
connection.id:                          net-static
connection.uuid:                        b9f18801-6084-4aee-af28-c8f0598ff5e1
connection.stable-id:                   --
connection.type:                        802-3-ethernet
connection.interface-name:              enp3s0
connection.autoconnect:                 yes
connection.autoconnect-priority:        0
connection.autoconnect-retries:         -1 (default)
connection.multi-connect:               0 (default)
connection.auth-retries:                -1
connection.timestamp:                   1578988781
connection.read-only:                   no
connection.permissions:                 --
connection.zone:                        --
connection.master:                      --
connection.slave-type:                  --
connection.autoconnect-slaves:          -1 (default)
connection.secondaries:                 --
connection.gateway-ping-timeout:        0
connection.metered:                     unknown
connection.lldp:                        default
connection.mdns:                        -1 (default)
connection.llmnr:                       -1 (default)
添加 Wi-Fi 连接

有两种方式添加Wi-Fi 连接。

方法1. 通过网络接口连接wifi

连接到由SSID或BSSID指定的wifi网络。命令如下,该命令找到匹配的连接或创建一个连接,然后在设备上激活它。

1
2
nmcli device wifi connect "$SSID" password "$PASSWORD" ifname "$IFNAME"  
nmcli --ask device wifi connect "$SSID"
方法2. 通过配置文件连接Wi-Fi

1,使用以下命令查看可用 Wi-Fi 访问点:

1
# nmcli dev wifi list

2,使用以下命令生成使用的静态 IP 配置,但允许自动 DNS 地址分配的 Wi-Fi 连接:

1
# nmcli con add con-name Wifi ifname wlan0 type wifi ssid MyWifi ip4 192.168.100.101/24 gw4 192.168.100.1

3,请使用以下命令设定 WPA2 密码,例如 “answer”:

1
2
# nmcli con modify Wifi wifi-sec.key-mgmt wpa-psk
# nmcli con modify Wifi wifi-sec.psk answer

4,使用以下命令更改 Wi-Fi 状态:

1
# nmcli radio wifi [ on | off ]
更改属性

请使用以下命令检查具体属性,比如 mtu:

1
2
# nmcli connection show id 'Wifi ' | grep mtu
802-11-wireless.mtu: auto

使用如下命令更改设置的属性:

1
# nmcli connection modify id 'Wifi ' 802-11-wireless.mtu 1350

使用如下命令确认更改:

1
2
# nmcli connection show id 'Wifi ' | grep mtu
802-11-wireless.mtu: 1350

配置静态路由

  • 使用nmcli命令为网络连接配置静态路由,使用命令如下:

    1
    
    # nmcli connection modify enp3s0 +ipv4.routes "192.168.122.0/24 10.10.10.1"
  • 使用编辑器配置静态路由,使用如下命令:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    
    # nmcli con edit type ethernet con-name enp3s0
    ===| nmcli interactive connection editor |===
    Adding a new '802-3-ethernet' connection
    Type 'help' or '?' for available commands.
    Type 'describe [<setting>.<prop>]' for detailed property description.
    You may edit the following settings: connection, 802-3-ethernet (ethernet), 802-1x, ipv4, ipv6, dcb
    nmcli> set ipv4.routes 192.168.122.0/24 10.10.10.1
    nmcli>
    nmcli> save persistent
    Saving the connection with 'autoconnect=yes'. That might result in an immediate activation of the connection.
    Do you still want to save? [yes] yes
    Connection 'enp3s0' (1464ddb4-102a-4e79-874a-0a42e15cc3c0) successfully saved.
    nmcli> quit
  • 使用如下命令激活连接以生效配置:

    1
    
    # nmcli con up enp3s0

使用ip命令

说明:

使用ip命令配置的网络配置可以立即生效但系统重启后配置会丢失。

配置IP地址

使用ip命令为接口配置地址,命令格式如下,其中 interface-name 为网卡名称。

1
# ip addr [ add | del ] address dev interface-name
配置静态地址

在root权限下,配置静态IP地址,使用示例如下:

1
# ip address add 192.168.0.10/24 dev enp3s0

查看配置结果,在root权限使用如下命令:

1
2
3
4
5
6
7
8
9
# ip addr show dev enp3s0
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:aa:ad:4a brd ff:ff:ff:ff:ff:ff
    inet 192.168.202.248/16 brd 192.168.255.255 scope global dynamic noprefixroute enp3s0
       valid_lft 9547sec preferred_lft 9547sec
    inet 192.168.0.10/24 scope global enp3s0
       valid_lft forever preferred_lft forever
    inet6 fe80::32e8:cc22:9db2:f4d4/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
配置多个地址

ip 命令支持为同一接口分配多个地址,可在root权限下重复多次使用 ip 命令实现分配多个地址。使用示例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# ip address add 192.168.2.223/24 dev enp4s0
# ip address add 192.168.4.223/24 dev enp4s0
# ip addr

3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:aa:da:e2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.203.12/16 brd 192.168.255.255 scope global dynamic noprefixroute enp4s0
       valid_lft 8389sec preferred_lft 8389sec
    inet 192.168.2.223/24 scope global enp4s0
       valid_lft forever preferred_lft forever
    inet 192.168.4.223/24 scope global enp4s0
       valid_lft forever preferred_lft forever
    inet6 fe80::1eef:5e24:4b67:f07f/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

配置静态路由

如果需要静态路由,可使用 ip route add 命令在路由表中添加,使用 ip route del 命令删除。最常使用的 ip route 命令格式如下:

1
# ip route [ add | del | change | append | replace ] destination-address

在root权限下使用 ip route 命令显示当前的 IP 路由表。示例如下:

1
2
3
4
5
6
7
# ip route

default via 192.168.0.1 dev enp3s0 proto dhcp metric 100
default via 192.168.0.1 dev enp4s0 proto dhcp metric 101
192.168.0.0/16 dev enp3s0 proto kernel scope link src 192.168.202.248 metric 100
192.168.0.0/16 dev enp4s0 proto kernel scope link src 192.168.203.12 metric 101
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown

在主机地址中添加一个静态路由,在 root 权限下,使用以下命令格式:

1
# ip route add 192.168.2.1 via 10.0.0.1 [dev interface-name]

其中 192.168.2.1 是用点分隔的十进制符号中的 IP 地址,10.0.0.1 是下一个跃点,interface-name 是进入下一个跃点的退出接口。

要在网络中添加一个静态路由,即代表 IP 地址范围的 IP 地址,请在root权限下运行以下命令格式:

1
# ip route add 192.168.2.0/24 via 10.0.0.1 [dev interface-name]

其中 192.168.2.1 是目标网络的 IP 地址,10.0.0.1 是网络前缀,interface-name 为网卡名称。

配置网络

  1. 配置IP地址

    使用IP命令为接口配置地址,interface-name为网卡名称。

    1
    
    ip addr [ add | del ] address dev interface-name
  2. 配置静态地址

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    
    # 配置静态IP地址
    ip address add 192.168.0.10/24 dev enp3s0
    
    # 查看配置结果,在root权限使用如下命令
    ip addr show dev enp3s0
    
    # 结果如下
    2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:aa:ad:4a brd ff:ff:ff:ff:ff:ff
    inet 192.168.202.248/16 brd 192.168.255.255 scope global dynamic noprefixroute enp3s0
    valid_lft 9547sec preferred_lft 9547sec
    inet 192.168.0.10/24 scope global enp3s0
    valid_lft forever preferred_lft forever
    inet6 fe80::32e8:cc22:9db2:f4d4/64 scope link noprefixroute
    valid_lft forever preferred_lft forever
  3. 配置静态路由

    静态路由,可使用 ip route add 命令在路由表中添加,使用 ip route del 命令删除。常用的 ip route 命令格式如下:

    1
    
    ip route [ add | del | change | append | replace ] destination-address
    • 在主机地址中添加一个静态路由,在 root 权限下,使用以下命令格式:
    1
    
    ip route add 192.168.2.1 via 10.0.0.1 [dev interface-name]
    • 在网络中添加一个静态路由,在root权限下运行以下命令格式:
    1
    
    ip route add 192.168.2.0/24 via 10.0.0.1 [dev interface-name]
  4. 通过ifcfg文件配置网络

    通过在root权限下修改ifcfg文件实现,在/etc/sysconfig/network-scripts/目录中生成名为ifcfg-enp4s0的文件中,修改参数配置,示例如下:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    
    TYPE=Ethernet
    PROXY_METHOD=none
    BROWSER_ONLY=no
    BOOTPROTO=none
    IPADDR=192.168.0.10
    PREFIX=24
    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=enp4s0static
    UUID=xx
    DEVICE=enp4s0
    ONBOOT=yes

通过ifcfg文件配置网络

说明:

通过ifcfg文件配置的网络配置不会立即生效,修改文件后(以ifcfg-enp3s0为例),需要在root权限下执行nmcli con reload;nmcli con up enp3s0命令以重新加载配置文件并激活连接才生效。

配置静态网络

以enp4s0网络接口进行静态网络设置为例,通过在root权限下修改ifcfg文件实现,在/etc/sysconfig/network-scripts/目录中生成名为ifcfg-enp4s0的文件中,修改参数配置,示例如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.0.10
PREFIX=24
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=enp4s0static
UUID=08c3a30e-c5e2-4d7b-831f-26c3cdc29293
DEVICE=enp4s0
ONBOOT=yes

配置动态网络

要通过ifcfg文件为em1接口配置动态网络,请按照如下操作在/etc/sysconfig/network-scripts/目录中生成名为 ifcfg-em1 的文件,示例如下:

1
2
3
DEVICE=em1
BOOTPROTO=dhcp
ONBOOT=yes

要配置一个向DHCP服务器发送不同的主机名的接口,请在ifcfg文件中新增一行内容,如下所示:

1
DHCP_HOSTNAME=hostname

要配置忽略由DHCP服务器发送的路由,防止网络服务使用从DHCP服务器接收的DNS服务器更新/etc/resolv.conf。请在ifcfg文件中新增一行内容,如下所示:

1
PEERDNS=no

要配置一个接口使用具体DNS服务器,请将参数PEERDNS=no,并在ifcfg文件中添加以下行:

1
2
DNS1=ip-address
DNS2=ip-address

其中ip-address是DNS服务器的地址。这样就会让网络服务使用指定的DNS服务器更新/etc/resolv.conf。

配置默认网关

在确定默认网关时,首先解析 /etc/sysconfig/network 文件,然后解析 ifcfg 文件 ,将最后读取的 GATEWAY 的取值作为路由表中的默认路由。

在动态网络环境中,使用 NetworkManager 管理主机时,建议设置为由 DHCP 来分配。

通过 nmtui 工具

nmtui 工具提供了一个交互式的界面,可以用来配置网络连接。要使用 nmtui 工具,以 root 权限执行以下命令:

1
# nmtui

选择 Edit a connection 选项,然后选择要编辑的网络连接,按 Enter 键,进入编辑界面。

在交互界面中,可以使用方向键选择要编辑的选项,按 Tab 键切换到下一个选项,按 Enter 键进入编辑状态,按 Esc 键退出编辑状态。可以使用方向键选择 IPV4 CONFIGURATION 或 IPV6 CONFIGURATION 的配置方式,并选择 Show 显示详细信息。

配置主机名

简介

hostname有三种类型:static、transient和pretty。

  • static:静态主机名,可由用户自行设置,并保存在/etc/hostname 文件中。
  • transient:动态主机名,由内核维护,初始是 static 主机名,缺省值为“localhost”。可由DHCP或mDNS在运行时更改。
  • pretty:灵活主机名,允许使用自由形式(包括特殊/空白字符)进行设置。静态/动态主机名遵从域名的通用限制。

说明:

static和transient主机名只能包含a-z、A-Z、0-9、“-”和“.”,不能在开头或结尾处使用句点,不允许使用两个相连的句点,大小限制为 64 个字符。

使用hostnamectl配置主机名

查看所有主机名

查看当前的主机名,使用如下命令:

1
# hostnamectl status

说明:

如果命令未指定任何选项,则默认使用status选项。

设定所有主机名

在root权限下,设定系统中的所有主机名,使用如下命令:

1
# hostnamectl set-hostname name

设定特定主机名

在root权限下,通过不同的参数来设定特定主机名,使用如下命令:

1
# hostnamectl set-hostname name [option...]

其中option可以是–pretty、–static、–transient中的一个或多个选项。

如果–static或–transient与–pretty选项一同使用时,则会将static和transient主机名简化为pretty主机名格式,使用“-”替换空格,并删除特殊字符。

当设定pretty主机名时,如果主机名中包含空格或单引号,需要使用引号。命令示例如下:

1
# hostnamectl set-hostname "Stephen's notebook" --pretty

清除特定主机名

要清除特定主机名,并将其还原为默认形式,在root权限下,使用如下命令:

1
# hostnamectl set-hostname "" [option...]

其中 "" 是空白字符串,option是–pretty、–static和–transient中的一个或多个选项。

远程更改主机名

在远程系统中运行hostnamectl命令时,要使用-H,–host 选项,在root权限下使用如下命令:

1
# hostnamectl set-hostname -H [username]@hostname new_hostname

其中hostname是要配置的远程主机,username为自选项,new_hostname为新主机名。hostnamectl会通过SSH连接到远程系统。

使用nmcli配置主机名

查询static主机名,使用如下命令:

1
# nmcli general hostname

在root权限下,将static主机名设定为host-server,使用如下命令:

1
# nmcli general hostname host-server

要让系统hostnamectl感知到static主机名的更改,在root权限下,重启hostnamed服务,使用如下命令:

1
# systemctl restart systemd-hostnamed

通过 nmtui 工具

nmtui 提供了一个交互式的界面,可以用来配置网络连接。要使用 nmtui 工具,以 root 权限执行以下命令:

1
# nmtui

选择 Set system hostname 选项,输入新的主机名,然后按 Enter 键。选择 OK 确认修改。

配置网络绑定

Linux网络绑定(Bonding)是将多个物理网卡(NIC)逻辑上聚合成一个单一逻辑网卡的技术,其主要目的是提升网络可靠性和/或带宽。它类似于网络硬件中的“链路聚合组”(LAG)或“端口聚合”。

网络绑定的主要作用

作用说明典型应用场景
1. 高可用/容错最主要的作用。当主网卡或链路故障时,流量毫秒级切换到备用网卡,实现业务不中断。服务器、网关等对网络连续性要求极高的设备。
2. 带宽聚合将多个物理链路的带宽叠加,提升总吞吐量(需要交换机支持对应模式,如LACP)。需要大带宽的数据传输、存储网络(如NAS)。
3. 负载均衡出站流量可以在多个网卡间智能分发,以优化资源利用。高并发访问的Web服务器、计算集群。

使用 nmcli 配置网络绑定(以主备模式为例)

最常见且稳定的模式是 active-backup(主备模式),它提供故障切换但不增加带宽。以下是使用 nmcli 创建名为 mybond0 的绑定连接的完整步骤。

核心步骤流程图

flowchart TD
    A[“准备两块物理网卡
如 eth1 与 eth2”] --> B[“创建绑定接口 bond0
(设置模式为 active-backup)”] B --> C[“将 eth1 添加为绑定从属接口”] B --> D[“将 eth2 添加为绑定从属接口”] C --> E[“激活绑定连接及所有从属连接”] D --> E E --> F[“验证绑定状态与故障切换”]

步骤1:创建绑定接口(Bond Interface)

此命令会创建一个名为 bond0逻辑绑定接口,并设置其IP地址(示例为静态IP)。

1
2
3
4
5
6
sudo nmcli connection add type bond con-name bond0 ifname bond0 \
    bond.options "mode=active-backup,miimon=100" \
    ipv4.addresses "192.168.1.50/24" \
    ipv4.gateway "192.168.1.1" \
    ipv4.dns "8.8.8.8" \
    ipv4.method manual

关键参数详解

  • type bond:创建类型为“bond”的连接。
  • con-name bond0 ifname bond0:连接名和设备名都设为 bond0
  • bond.options:绑定的核心选项。
    • mode=active-backup:设置为主备模式(故障切换)。
    • miimon=100:每100毫秒检查一次链路状态,是实现快速切换的关键。
  • 其余为标准的静态IP配置。

步骤2:将物理网卡添加为“从属接口”(Slave)

将两块物理网卡(例如 eth1eth2)挂载到刚创建的 bond0 上。

1
2
3
4
# 添加 eth1 作为 bond0 的从属
sudo nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname eth1 master bond0
# 添加 eth2 作为 bond0 的从属
sudo nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname eth2 master bond0

参数解释

  • type ethernet:连接类型是以太网。
  • slave-type bond:指定从属类型为bond。
  • master bond0:指明主设备是 bond0

步骤3:激活所有连接

激活绑定连接,它会自动激活其从属连接。

1
sudo nmcli connection up bond0

验证与状态查看

配置后,务必进行验证。

  1. 查看绑定状态

    1
    
    cat /proc/net/bonding/bond0

    输出会详细显示绑定模式、当前活动接口、所有从接口状态及链路检查计数,这是最重要的诊断文件

  2. 查看网络设备状态

    1
    
    nmcli device status

    确认 bond0 为“已连接”,eth1eth2 为“已连接”且显示为 bond0 的从属。

  3. 测试故障切换

    • 在持续ping服务器IP(例如 ping 192.168.1.50 -t)的同时,断开 eth1 的网线
    • 观察ping日志,应该只丢1-2个包(约 miimon 设置的时间)就恢复,表示切换成功。
    • 查看 /proc/net/bonding/bond0,会显示当前活动接口已变为 eth2

其他常用绑定模式简介

除了 active-backupbond.options 中的 mode 参数还可以设置为其他模式以满足不同需求:

模式名称特点交换机要求
balance-rr轮询出站流量轮流使用所有网卡,可负载均衡和聚合带宽无需特殊配置。
balance-xorXOR哈希基于源/目IP和端口哈希选择网卡,保证同一会话流量走同一链路。无需特殊配置。
802.3adLACP动态聚合行业标准,能动态聚合链路并提供带宽聚合与容错必须支持并配置LACP。
balance-tlb自适应传输负载均衡智能出站负载均衡,入站由当前活动接口处理。无需交换机支持无需特殊配置。

总结与建议

  • 入门首选:对于追求高可用性的服务器,active-backup(主备模式) 是最简单、最稳定的选择。
  • 生产环境:若追求带宽聚合且网络设备支持,应使用 802.3ad(LACP) 模式。
  • 关键排查:配置后务必 cat /proc/net/bonding/bond0 查看详细状态。
  • 永久生效nmcli 的配置会自动持久化,重启后依然有效。

使用nmcli

  • 创建名为mybond0的绑定,使用示例如下:

    1
    
    # nmcli con add type bond con-name mybond0 ifname mybond0 mode active-backup
  • 添加从属接口,使用示例如下:

    1
    
    # nmcli con add type bond-slave ifname enp3s0 master mybond0

    要添加其他从属接口,重复上一个命令,并在命令中使用新的接口,使用示例如下:

    1
    2
    
    # nmcli con add type bond-slave ifname enp4s0 master mybond0
    Connection 'bond-slave-enp4s0' (05e56afc-b953-41a9-b3f9-0791eb49f7d3) successfully added.
  • 要启动绑定,则必须首先启动从属接口,使用示例如下:

nmcli con up bond-slave-enp3s0

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/14)

nmcli con up bond-slave-enp4s0

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/15)

1
2
3
  
  现在可以启动绑定,使用示例如下:
  

nmcli con up mybond0

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/16)

1
2
3
4
5
### 使用命令行 

#### 检查是否已安装Bonding内核模块 

在系统中默认已加载相应模块。要载入绑定模块,可在root权限下使用如下命令:

modprobe –first-time bonding

1
显示该模块的信息,可在root权限下使用如下命令:

modinfo bonding

1
2
3
4
5
6
7
更多命令请在root权限下使用modprobe --help查看。

#### 创建频道绑定接口

要创建绑定接口,可在root权限下通过在 /etc/sysconfig/network-scripts/ 目录中创建名为 ifcfg-bondN 的文件(使用接口号码替换 N,比如 0)。

根据要绑定接口类型的配置文件来编写相应的内容,比如网络接口。接口配置文件示例如下:

DEVICE=bond0 NAME=bond0 TYPE=Bond BONDING_MASTER=yes IPADDR=192.168.1.1 PREFIX=24 ONBOOT=yes BOOTPROTO=none BONDING_OPTS=“bonding parameters separated by spaces”

1
2
3
4
5
#### 创建从属接口 

创建频道绑定接口后,必须在从属接口的配置文件中添加 MASTER 和 SLAVE 指令。

例如将两个网络接口enp3s0 和 enp4s0 以频道方式绑定,其配置文件示例分别如下:

TYPE=Ethernet NAME=bond-slave-enp3s0 UUID=3b7601d1-b373-4fdf-a996-9d267d1cac40 DEVICE=enp3s0 ONBOOT=yes MASTER=bond0 SLAVE=yes

TYPE=Ethernet NAME=bond-slave-enp4s0 UUID=00f0482c-824f-478f-9479-abf947f01c4a DEVICE=enp4s0 ONBOOT=yes MASTER=bond0 SLAVE=yes

1
2
3
#### 激活频道绑定 

要激活绑定,则需要启动所有从属接口。请在root权限下,运行以下命令:

ifup enp3s0

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)

ifup enp4s0

Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/8)

1
2
3
4
5
6
7
说明:

对于已经处于“up”状态的接口,请首先使用“ifdown *enp3s0* ”命令修改状态为down,其中 *enp3s0* 为实际网卡名称。

完成后,启动所有从属接口以便启动绑定(不将其设定为 “down”)。

要让 NetworkManager 感知到系统所做的修改,在每次修改后,请在root权限下,运行以下命令:

nmcli con load /etc/sysconfig/network-scripts/ifcfg-device

1
查看绑定接口的状态,请在root权限下运行以下命令:

ip link show

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:aa:ad:4a brd ff:ff:ff:ff:ff:ff 3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000 link/ether 52:54:00:aa:da:e2 brd ff:ff:ff:ff:ff:ff 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000 link/ether 86:a1:10:fb:ef:07 brd ff:ff:ff:ff:ff:ff 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000 link/ether 52:54:00:29:35:4c brd ff:ff:ff:ff:ff:ff

1
2
3
4
5
6
7
8
9
#### 创建多个绑定

系统会为每个绑定创建一个频道绑定接口,包括 BONDING_OPTS 指令。使用这个配置方法可让多个绑定设备使用不同的配置。请按照以下操作创建多个频道绑定接口:

- 创建多个 ifcfg-bondN 文件,文件中包含 BONDING_OPTS 指令,让网络脚本根据需要创建绑定接口。
- 创建或编辑要绑定的现有接口配置文件,添加 SLAVE 指令。
- 使用 MASTER 指令工具在频道绑定接口中分配要绑定的接口,即从属接口。

以下是频道绑定接口配置文件示例:

DEVICE=bondN NAME=bondN TYPE=Bond BONDING_MASTER=yes IPADDR=192.168.1.1 PREFIX=24 ONBOOT=yes BOOTPROTO=none BONDING_OPTS=“bonding parameters separated by spaces”

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
在这个示例中,使用绑定接口的号码替换 N。例如要创建两个接口,则需要使用正确的 IP 地址创建两个配置文件 ifcfg-bond0 和 ifcfg-bond1。

### 使用 nmtui 工具 

在 nmtui 工具中,选择 **Edit a connection**,然后选择 **Bond**,按照提示输入相关信息,即可创建绑定。

返回 nmtui 的主菜单,选择 **Activate a connection**,然后选择刚刚创建的绑定,即可激活绑定。

## IPv6使用差异说明(vs IPv4) 

### 配置说明 

#### 设置接口设备MTU值 

##### 概述 

IPv6场景中会发现整个路由路径中的最小mtu的值作为当前链接的PMTU的值,源端根据PMTU的值确定是否进行分片发送,而在整个路径中的其他设备将不再需要进行分片处理,从而可以降低中间路由设备的负载大小。其中IPv6 PMTU设置的最小值为1280。

##### 设置接口设备的mtu 

如果在配置了IPv6地址的接口上设置mtu的值小于1280(IPv6 PMTU设置的最小值),则会导致该接口的IPv6地址被删除。并且无法再次添加IPv6地址。所以在IPv6场景中,对接口设备的mtu的配置一定要大于等于1280。 请在root权限下运行如下命令查看具体现象:

ip addr show enp3s0

3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0 valid_lft 38663sec preferred_lft 38663sec inet6 2001:222::2/64 scope global valid_lft forever preferred_lft forever

ip link set dev enp3s0 mtu 1200

ip addr show enp3s0

3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1200 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0 valid_lft 38642sec preferred_lft 38642sec

ip addr add 2001:222::2/64 dev enp3s0

RTNETLINK answers: No buffer space available

ip link set dev enp3s0 mtu 1500

ip addr show enp3s0

3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0 valid_lft 38538sec preferred_lft 38538sec

ip addr add 2001:222::2/64 dev enp3s0

ip addr show enp3s0

3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0 valid_lft 38531sec preferred_lft 38531sec inet6 2001:222::2/64 scope global valid_lft forever preferred_lft forever

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#### 有状态自动配置IPv6地址 

##### 概述 

IPv6与IPv4都可以在root权限下通过DHCP的方式获得IP地址。IPv6地址有两种配置方式:无状态自动配置和有状态自动配置。

- 无状态自动配置

  不需要DHCP服务进行管理,设备根据网络RA(路由公告)获得网络前缀,或者link-local地址为固定fe80::。而接口ID则根据ifcfg配置IPV6_ADDR_GEN_MODE的具体设置来进行自动获得:

  1. IPv6_ADDR_GEN_MODE="stable-privacy" 则根据设备及网络环境来确定一个随机接口ID。
  2. IPv6_ADDR_GEN_MODE="EUI64" 则根据设备MAC地址来确定接口ID。

- 有状态自动配置:需要DHCP服务器进行管理分配,服从DHCPv6协议来从DHCPv6服务器端租赁IPv6地址。

  在有状态自动配置IPv6地址时,DHCPv6服务端可以通过客户端设置的vendor class将客户端进行分类,不同类别分配不同地址段的IPv6地址。在IPv4场景中,客户端可以直接用dhclient的-V选项来设置vendor-class-identifier,DHCP服务端在配置文件中根据vendor-class-identifier来对客户端进行分类处理。而IPv6场景中,如果使用同样的方法对客户端分类,则分类并不会生效。

dhclient -6 -V

1
2
3
4
5
6
7
8

这是由于DHCPv6和DHCP协议存在较大差异,DHCPv6的可选项中使用vendor-class-option替代了DHCP中的vendor-class-identifier。而dhclient的-V选项并不能设置vendor-class-option。

##### 有状态自动配置IPv6地址时dhclient设置vendor class方法 

- 在客户端使用配置文件方式添加对vendor class的设置,使用方法如下:

客户端配置文件(/etc/dhcp/dhclient6.conf),文件位置可以自定义,在使用时需要通过dhclient -cf选项来指定配置文件:

option dhcp6.vendor-class code 16 = {integer 32, integer 16, string}; interface “enp3s0” { send dhcp6.vendor-class ; }

 1
 2
 3
 4
 5
 6
 7
 8
 9
10

说明:



- <Enterprise-ID number>,32位整型数字,企业标识号,企业通过IANA注册。
- <vendor class string length>,16位整型数字,vendor class字符串长度。
- <vendor class string>,要设置的vendor class字符串,例如:“HWHW”。

客户端使用方法:

dhclient -6 -cf /etc/dhcp/dhclient6.conf

1
- DHCPv6服务端配置文件(/etc/dhcp/dhcpd6.conf),需要dhcpd -cf选项来指定该配置文件:

option dhcp6.vendor-class code 16 = {integer 32, integer 16, string}; subnet6 fc00:4:12:ffff::/64 { class “hw” { match if substring ( option dhcp6.vendor-class, 6, 10 ) = “HWHW”; } pool6 { allow members of “hw”; range6 fc00:4:12:ffff::ff10 fc00:4:12:ffff::ff20; } pool6 { allow unknown clients; range6 fc00:4:12:ffff::100 fc00:4:12:ffff::120; } }

1
2
3
4
5
6

说明:

substring ( option dhcp6.vendor-class, 6, 10 ) 其中子字符串的开始位置为6,因为前面包含4个字节的<Enterprise-ID number>和2个字节的<string length>。而子字符串的结束位置为:6+<vendor class string length>。这里vendor class string为“HWHW”,字符串的长度为4,所以子字符串的结束位置为6+4=10。用户可以根据实际需要来确定<vendor class string>及相应的<vendor class string length>。

服务端使用方法:

dhcpd -6 -cf /etc/dhcp/dhcpd6.conf

1
2
3
4
5
6
7
8
9
#### 内核支持socket相关系统调用 

##### 概述 

IPv6地址长度扩展到128比特,所以有足够的IPv6地址可供分配使用。同时IPv6头相比IPv4头进行了简化,并增强了IPv6的自动配置功能。IPv6地址分为单播地址,组播地址和任意播地址。常用的单播地址又包含:链路本地地址(link-local address),唯一本地地址(Unique local address)和全局地址(global address)。由于IPv6的全局地址十分充足,唯一本地地址一般不被使用(其前身为站点本地地址(site-local address),已于2004年被废弃)。当前主要使用的单播地址为:链路本地地址(link-local address)和全局地址(global address)。当前内核支持socket系统调用,在使用单播地址的链路本地地址和全局地址时存在差异。

##### link-local地址和global地址在socket调用时的差异 

RFC 2553: Basic Socket Interface Extensions for IPv6 定义sockaddr_in6的数据结构如下;

struct sockaddr_in6 {
uint8_t sin6_len; /* length of this struct /
sa_family_t sin6_family; /
AF_INET6 /
in_port_t sin6_port; /
transport layer port # /
uint32_t sin6_flowinfo; /
IPv6 flow information /
struct in6_addr sin6_addr; /
IPv6 address /
uint32_t sin6_scope_id; /
set of interfaces for a scope */ };

1
2
3
4
5
说明:

sin6_scope_id: 32位整型,对于链路本地地址(link-local address),对于链路范围的sin6_addr,它可以用来标识指定的接口索引号。如果是站点范围的sin6_addr,则用来作为站点的标识符(站点本地地址已被抛弃)。

在使用link-local地址进行socket通信时,在构造目的地址时,需要指定该地址所对应的接口索引号。一般可以通过if_nametoindex函数将接口名转化为接口索引号。具体方式如下,

int port = 1234; int sk_fd; int iff_index = 0; char iff_name[100] = “enp3s0”; char * ll_addr[100] = “fe80::123:456:789”; struct sockaddr_in6 server_addr;

memset(&server_addr,0,sizeof(structsockaddr_in6)); iff_index=if_nametoindex(iff_name);

server_addr.sin6_family=AF_INET6; server_addr.sin6_port=htons(port); server_addr.sin6_scope_id=iff_index; inet_pton(AF_INET6, ll_addr, &(server_addr.sin6_addr));

sk_fd=socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP); connect(sk_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in6));

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
#### IPv4的dhclient守护进程持久化配置 

##### 概述 

通过NetworkManager服务来管理网络服务时,如果接口ifcfg-<interface-name>配置文件中配置了DHCP方式获得IP地址,则相应地NetworkManager服务会拉起dhclient守护进程来通过DHCP协议方式来从DHCP服务器获取IP地址。

dhclient提供了"-1"选项来决定dhclient进程在未获得DHCP服务响应时,是会不断持久化尝试请求地址还是会尝试时间超时后退出。针对IPv4的dhclient守护进程,可以在ifcfg-<interface-name>配置文件中设置PERSISTENT_DHCLIENT来决定是否设置IPv4的dhclient进程的持久化。

##### 约束限制

1. 当dhclient进程在运行中被杀死,network服务无法自动将其拉起,可靠性需要用户自己保障。
2. 配置了持久化选项PERSISTENT_DHCLIENT,需要确保有相应的DHCP服务器。如果在拉起network时无可用DHCP服务器,dhclient进程不断尝试发送请求包但无回应,则会导致network服务卡死直到network服务超时失败。由于network服务在拉起多个网卡的IPv4 dhclient进程时,是通过串行的方式来拉起的。如果有网卡配置了持久化而DHCP服务器没有准备好,则会导致network服务在给该网卡获取IPv4地址超时卡死,进而导致后续网卡无法获得IPv4/IPv6地址。

以上两种约束限制是特殊的应用场景,需要用户自己进行可靠性保障。

##### IPv4 DHCP和IPv6 DHCPv6方式获取地址的配置差异 

可以通过配置接口ifcfg-<interface-name>参数来分别实现IPv4和IPv6通过DHCP/DHCPv6协议来动态获取IP地址,具体配置说明如下;

BOOTPROTO=none|bootp|dhcp DHCPV6C=yes|no PERSISTENT_DHCLIENT=yes|no|1|0

 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
- BOOTPROTO: none表示静态配置IPv4地址,bootp|dhcp则会拉起DHCP dhclient来动态获取IPv4地址。

- DHCPV6C: no表示静态配置IPv6地址,yes则会拉起DHCPv6 dhclient来动态获取IPv6地址。

- PERSISTENT_DHCLIENT:no|0表示IPv4的dhclient进程配置为“非持久化”,当dhclient向DHCP服务器发送一次请求报文而无响应,则会间隔一段时间后退出,退出值为2。yes|1则表示IPv4的dhclient进程配置为“持久化”,dhclient会向DHCP服务器反复发送请求报文。**如果没有配置PERSISTENT_DHCLIENT项,则IPv4的dhclient会默认设置为“持久化”**。

  说明:

  PERSISTENT_DHCLIENT配置只针对IPv4生效,对IPv6相关dhclient -6进程不生效,IPv6默认不进行持久化配置。

#### iproute相关命令配置IPv4与IPv6时的差异说明

##### 概述

由于IPv4和IPv6是两个不同的协议标准,iproute相关命令在使用方法上存在一定的差异。本章节主要梳理iproute包中用户经常使用到命令在IPv4和IPv6使用方面的差异,从而可以更好地指导用户使用iproute包中相关命令。

iproute相关命令均需要在root权限下运行。

##### IPv6地址的生命周期

| **IPv6状态** | **解释**                                                     |
| :----------- | :----------------------------------------------------------- |
| tentative    | 临时状态:刚添加地址还处于地址重复检测DAD过程。              |
| preferred    | 首选状态:完成DAD过程,没有收到相应的NA报文,表示该地址没有冲突。 |
| deprecated   | 弃用状态:地址有一定的使用时限(valid_lft和preferred_lft),preferred_lft到期后地址会变化deprecated状态。该状态下的地址不能用于创建新的连接,但是原有的连接可以继续使用。 |
| invalid      | 无效状态:使用时限超过preferred_lft一段时间后仍然没有成功进行租约续约,则valid_lft时间到后地址状态会被设置为invalid,表示该地址不可以再被使用。 |

其他说明:

- preferred_lft:preferred lifetime,地址为首选状态的寿命,preferred_lft没有到期的地址可以用于正常通信使用,若有多个preferred地址则按照内核具体机制选择地址。
- valid_lft: valid lifetime,地址有效的寿命,在[preferred_lft, valid_lft]时间段内该地址不能被用于新建连接,已经创建的连接继续有效。

##### ip link 命令 

命令:

ip link set IFNAME mtu MTU

1
2
3
4
5
IPv6中PMTU的最小值为1280,如果mtu值设置小于1280则会导致IPv6地址丢失。其他设备无法ping通该IPv6地址。

##### ip addr命令 

1. 命令:

ip [-6] addr add IFADDR dev IFNAME

1
2
3
4
5
添加IPv6地址可以选择添加-6选项也可以不添加,ip addr命令会根据具体地址类型来判断是ipv4地址还是IPv6地址。

如果指定“-6”选项,但是IFADDR 是ipv4地址则会有错误返回。

2. 命令:

ip [-6] addr add IFADDR dev IFNAME [home|nodad]

1
2
3
4
5
6
[home|nodad] 选项只针对IPv6地址有效。

- home:将该地址指定为RFC 6275中定义的家庭地址。(这是移动节点从家庭链路获取的地址, 是移动节点的永久地址,如果移动节点保持在相同的归属链路中,则各种实体之间的通信照常进行。)
- nodad:配置该项(仅限IPv6)添加此地址时不执行重复地址检测DAD(RFC 4862)。如果一台设备上多个接口通过nodad配置了多个相同的IPv6地址,则会按照接口顺序使用该IPv6地址。同一个接口上不能添加一个nodad一个非nodad的相同IPv6地址。因为两个地址是一样的,所以会报“RTNETLINK answers: File exists”。

3. 命令:

ip [-6] addr del IFADDR dev IFNAME

1
2
3
删除IPv6地址可以选择添加-6选项也可以不添加,ip addr del命令会根据具体地址类型来判断是ipv4地址还是IPv6地址。

4. 命令:

ip [-6] addr show dev IFNAME [tentative|-tentative|deprecated|-deprecated|dadfailed|-dadfailed|temporary]

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
- 不指定-6选项,则会同时打印IPv4和IPv6地址。指定-6选项则只打印IPv6地址。
- [tentative|-tentative|deprecated|-deprecated|dadfailed|-dadfailed|temporary],这些选项只针对IPv6,可以根据IPv6地址状态对地址进行筛选查看。
  1. tentative:(仅限IPv6)仅列出尚未通过重复地址检测的地址。
  2. -tentative:(仅限IPv6)仅列出当前未处于重复地址检测过程中的地址。
  3. deprecated:(仅限IPv6)仅列出已弃用的地址。
  4. -deprecated:(仅限IPv6)仅列出未弃用的地址。
  5. dadfailed:(仅限IPv6)仅列出重复地址检测失败的地址。
  6. -dadfailed:(仅限IPv6)仅列出未重复地址检测失败的地址。
  7. temporary:(仅限IPv6)仅列出临时地址

##### ip route命令 

1. 命令:

ip [-6] route add ROUTE [mtu lock MTU]

1
2
3
4
- -6选项:添加IPv6路由可以选择添加-6选项也可以不添加,ip route命令会根据具体地址类型来判断是IPv4地址还是IPv6地址。
- mtu lock MTU:锁定路由的MTU值。如果不锁定MTU,则MTU的值则可能在PMTUD过程中被内核改变。如果锁定MTU,则不会尝试PMTUD,所有IPv4包都将不设置DF位发出,IPv6包则会按照MTU进行分段处理。

2. 命令:

ip [-6] route del ROUTE

1
2
3
4
5
删除IPv6路由可以选择添加-6选项也可以不添加,ip route命令会根据具体地址类型来判断是IPv4地址还是IPv6地址。

##### ip rule命令 

1. 命令:

ip [-6] rule list

1
2
3
-6选项:设置-6选项打印IPv6的策略路由,不设置-6选项打印IPv4的策略路由。所以需要根据具体协议类型来配置-6选项。

2. 命令:

ip [-6] rule [add|del] [from|to] ADDR table TABLE pref PREF

 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
-6选项:IPv6相关的策略路由表项需要设置-6选项,否则会报错:“Error: Invalid source address.”。相应地,IPv4相关的策略路由表项不可以设置-6选项,否则会报错:“Error: Invalid source address.”。

#### NetworkManager服务配置差异说明 

##### 概述 

NetworkManager服务使用ifup/ifdown的逻辑接口定义进行高级网络设置。其参数大多数都是在/etc/sysconfig/network和/etc/sysconfig/network-scripts/ifcfg-<interface-name>两个配置文件设置。前者为全局设置,后者为指定网卡的设置,当两者有冲突时,后者生效。

##### 配置差异说明 

其中在/etc/sysconfig/network下的配置差异有

| **IPv4** | **IPv6**                                                     | **含义说明**                                       |
| :------- | :----------------------------------------------------------- | :------------------------------------------------- |
| NA       | IPV6FORWARDING=yes\|no                                       | IPv6转发,默认不转发。                             |
| NA       | IPV6_AUTOCONF=yes\|no                                        | IPv6转发打开是no,否则是yes                      |
| NA       | IPV6_ROUTER=yes\|no                                          | IPv6转发打开是yes,否则是no                      |
| NA       | IPV6_AUTOTUNNEL=yes\|no                                      | 指定Tunnel为自动隧道模式,默认是no               |
| GATEWAY  | IPV6_DEFAULTGW=<IPv6 address[%interface]> (optional)         | IPv6中设置默认网关                             |
| NA       | IPV6_DEFAULTDEV=<interface> (optional)                       | 指定默认转发的网卡。                               |
| NA       | IPV6_RADVD_PIDFILE=<pid-file> (optional)                     | 默认ipv6_radvd_pid路径/var/run/radvd/radvd.pid |
| NA       | IPV6_RADVD_TRIGGER_ACTION=startstop\|reload\|restart\|SIGHUP (optional) | radvd默认触发动作                                |

而在/etc/sysconfig/network-scripts/ifcfg-<interface-name>下的差异主要有:



| **IPv4**                   | **IPv6**                                             | **含义说明**                                              |
| :------------------------- | :--------------------------------------------------- | :-------------------------------------------------------- |
| IPADDRn                    | IPV6ADDR=<IPv6 address>[/<prefix length>]            | ip地址                                                  |
| PREFIXn                    | NA                                                   | 网络前缀,网络别名和ppp无效,优先级高于NETMASK          |
| NETMASKn                   | NA                                                   | 子网掩码,仅用于别名和ppp                               |
| GATEWAY                    | IPV6_DEFAULTGW=<IPv6 address[%interface]> (optional) | 默认网关。                                                |
| MTU                        | IPV6_MTU=<MTU of link> (optional)                    | 默认MTU                                                 |
| IPV4_FAILURE_FATAL=yes\|no | IPV6_FAILURE_FATAL                                   | 缺省值是no。若设置为yesdhclient失败ifup-eth会直接退出 |
| NA                         | IPV6_PRIVACY=rfc3041                                 | 默认禁用。                                                |
| NA                         | IPV6INIT=yes\|no                                     | 默认开启IPv6                                            |
| NA                         | IPV6FORWARDING=yes\|no                               | 默认关闭,已废弃。                                        |

### FAQ

#### iscsi-initiator-utils不支持登录fe80 IPv6地址 

##### 问题现象 

客户端通过IPv6登录iscsi服务端时,使用如“iscsiadm -m node -p ipv6address -l”的命令格式登录,如果是全局地址(global address),直接替换将命令范例中的“ipv6address”替换为全局地址即可;但如果是链路本地地址(link-local addressfe80开头的IPv6地址)则无法使用,因为iscsi-initiator-utils目前机制还不支持用链路本地地址link-local address)地址登录iscsi服务端

##### 原因分析

如果使用格式如“iscsiadm -m node -p fe80::xxxx -l”登录,会登录超时返回,这是因为使用链路本地地址必须指定接口,否则使用iscsi_io_tcp_connect函数调用connect函数会失败,并且产生标准错误码22

如果使用格式如“iscsiadm -m node -p fe80::xxxx%enp3s0 -l”登录时,iscsi_addr_match函数会将地址fe80::xxxx%enp3s0”与服务端返回的node信息中的地址fe80::xxxx”对比,对比结果不匹配,导致登录失败。

因此,**iscsi-initiator-utils目前机制还不支持用链路本地地址link-local address)登录iscsi服务端**

#### 网卡down掉之后,IPv6地址丢失

##### 问题现象 

通过ip link down+up网卡或ifconfig down+up网卡命令,将网卡down掉之后再上线,查看网卡上配置的ip地址,发现ipv4地址不丢失,而配置的IPv6地址丢失

##### 原因分析

内核中的处理逻辑为如果网卡设置为down状态,会清空所有IPv4及IPv6地址,将网卡重新up之后ipv4地址自动恢复,网卡上自动配置的IPv6链路本地地址也会恢复,但是其他IPv6地址默认会丢失。如果需要保留这些IPv6地址,可以通过“sysctl -w net.ipv6.conf.<网卡名>.keep_addr_on_down=1”来实现。

#### bond口已具有多个IPv6地址时,添加或删除IPv6地址耗时过久 

##### 问题现象 

下列方式配置或删除(包括flushIPv6地址X为动态变化的低16位,并且配置在bond口时,耗时会随已配置的IPv6地址数量成倍增加。例如由4个物理网卡组成的bond口添加IPv6地址时,单线程添加删除3000IPv6地址均需大概5分钟,而普通物理网卡耗时在10秒内。

ip a add/del 192:168::18:X/64 dev DEVICE

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
##### 原因分析 

bond口在添加IPv6地址时,会生成IPv6组播地址,并进行同步到所有的物理网卡上,此耗时会随IPv6数量增加而增加,导致耗时过长。

##### 解决方法 

IPv6的组播地址是由IPv6地址的低24位与33-33-ff组合生成,组播地址过多会导致添加删除耗时增加,如果生成的组播地址为少量,耗时不会受此影响。

建议添加IPv6地址时,可保持低24位一致,保持高位变动,单网卡中仅需一个网段的一个地址即可与外部正常通信,此配置更符合常规使用。

#### Rsyslog在IPv4和IPv6混合使用场景中日志传输延迟 

##### 问题现象 

rsyslog客户端配置文件同时配置IPv4和IPv6地址,且端口配置相同的情况下,服务端收集log时会概率性出现日志打印延迟。

##### 原因分析 

延迟是因为rsyslog内部存在缓冲队列机制,默认情况下需要缓冲区队列达到一定数量才会写入文件。

##### 解决方法

可在root权限下通过配置Direct模式,关闭缓冲队列机制解决该问题。在rsyslog远程传输服务端的/etc/rsyslog.d目录下新增的远程传输配置文件中,最开头增加如下配置:

ActionQueueType Direct

MainMsgQueueType Direct

 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
说明:
- Direct模式减少队列大小为1,所以在队列中会保留1条日志到下次日志打印;
- Direct模式会降低服务器端的rsyslog性能。

## 系统资源性能查看

## CPU 

### 基本概念 

中央处理器(Central Processing Unit,简称CPU)是计算机的主要设备之一,其功能是解释计算机指令以及处理计算机软件中的数据。

1. 物理核:可以真实看到的CPU核,有独立的电路元件以及L1、L2缓存,可以独立地执行指令。一个CPU可以有多个物理核。
2. 逻辑核:在同一个物理核内,逻辑层面上存在的核。一般一个物理核对应一个线程,但是如果开启了超线程,当超线程数量为n时,一个物理核可以分成n个逻辑核。可以通过lscpu命令查看服务器中有多少个CPU,每个CPU中有几个物理核,以及每个CPU有几个逻辑核。

### 常用CPU性能分析工具

1. uptime:可用于**打印系统平均负载**,通过查看最后三个数字,可以判断平均负载的变化趋势。 平均负载大于CPU数量时表示CPU不足以服务线程,部分线程在等待;平均负载小于CPU数量,代表当前还有余量。

   ![zh-cn_image_0000001384808269](https://docs.openeuler.openatom.cn/assets/24.03_LTS_SP1/zh-cn_image_0000001384808269.CjnTXZKx.png)

2. vmstat:可以**动态地了解系统资源的使用情况**,以及查看系统中是哪一个环节最占用系统资源。 通过**vmstat -h**命令可以查看命令详解参数。 例如:

   ```shell
   #使用vmstat进行监测,每隔1秒刷新一次
   vmstat 1

img

在命令的输出信息中,各字段所代表的含义如下:

字段含义
procs进程信息字段。
memory内存信息字段。
swap交换分区信息字段。
io磁盘读/写信息字段。
system系统信息字段。
cpuCPU信息字段。-us:非内核进程消耗 CPU 运算时间的百分比。-sy:内核进程消耗 CPU 运算时间的百分比。-id:空闲。-wa:等待 I/O 所消耗的 CPU 百分比。-st:被虚拟机所盗用的 CPU 百分比。
  1. ps:可用于查看正在运行的进程

    1
    2
    
    # 查看系统中所有的进程,以及查看进程的父进程的 PID 和进程优先级
    ps -le

    zh-cn_image_0000001337039920

    1
    2
    
    # 查看当前shell产生的进程
    ps -l

    zh-cn_image_0000001385611905

  2. top:可以动态地持续监听进程的运行状态,显示最消耗CPU的进程

    1
    
    top

    zh-cn_image_0000001335457246

vim/vi 文本编辑器

1)常用快捷键:

(在一般模式下使用):

 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
#在光标后一位开始插入
a 

#在该行的最后插入
A 

#在该行的最前面插入
I 

#直接跳到文件的首行
gg 

#直接跳到文件的末行
G 

#删除一行;3dd 删除3行;yy 复制一行;3yy 复制3行;p 粘贴;u:即undo撤销操作;
dd 

#进入字符选择模式,选择完成后,按y复制,按p粘贴
v 

#进入块选择模式,选择完成后,按y复制,按p粘贴
ctrl+v 

#进入行选择模式,选择完成后,按y复制,按p粘贴
shift+v 

2)查找并替换

1 显示行号 :set nu

2 隐藏行号::set nonu

3 查找关键字 :/you ## 效果:查找文件中出现的you,并定位到第一个找到的地方,按n可以定位到下一个匹配位置(按N定位到上一个)

4 替换操作 :s/sad/bbb 查找光标所在行的第一个sad,替换为bbb

1
:%s/sad/bbb 查找文件中所有sad,替换为bbb

head 显示文件内容头部

1
2
#查看文件头部的10行
head -10 install.log 

tail 显示文件内容尾部

1
2
3
4
5
6
7
tail -10 install.log 查看文件尾部的10行

tail +10 install.log 查看文件 10–>末行

tail -f install.log 小f跟踪文件的唯一inode号,就算文件改名后,还是跟踪原来这个inode表示的文件

tail -F install.log 大F按照文件名来跟踪

windows永恒之蓝测试

在CMD窗口下,输入如下命令:netstat –ano | findstr “445”,找出相关进程号,其中SYN_SENT状态,很显然,该电脑被感染永恒之蓝病毒了

找出相关进程号对应的进程,在cmd下输入tasklist | findstr 20164,看看是哪个进程产生该数据包

打开任务管理器,找到相应的进程,先打开文件位置,然后结束进程

Cockpit 是什么具体解释:

1
systemctl enable --now cockpit.socket

这条命令的作用是启用并立即启动 Cockpit Web 控制台的按需监听服务

1. Cockpit 是什么?

  • Cockpit 是一个基于 Web 的 Linux 服务器管理界面
  • 可通过浏览器(端口 9090)管理服务器:监控系统状态、管理服务、配置网络、查看日志等

2. cockpit.socket 的特殊性

  • 这是 Socket 激活(Socket Activation) 方式
  • 与传统服务不同:
    • 普通服务:cockpit.service 会一直运行
    • Socket 服务:cockpit.socket监听端口,当有连接请求时才启动服务

3. 命令执行的具体效果:

1
systemctl enable --now cockpit.socket
  • enable:设置开机自动启动
  • --now:立即启动(无需重启系统)
  • 结果:
    1. 系统开始监听 9090 端口
    2. 当用户通过浏览器访问时,才启动 cockpit 服务
    3. 空闲一段时间后,服务会自动停止(节省资源)

4. 与传统启动方式的对比:

1
2
# Socket 方式(按需启动 - 推荐)
systemctl enable --now cockpit.socket

5. 验证命令:

1
2
3
4
5
6
7
8
# 查看 socket 状态
systemctl status cockpit.socket

# 查看监听端口
ss -ltn | grep 9090

# 如果服务未按需启动,可检查
systemctl status cockpit.service

6. 访问方式:

  • 浏览器访问:https://你的服务器IP:9090
  • 使用系统账户密码登录

7. 关闭/禁用方法:

1
2
3
4
5
# 停止并禁用
systemctl disable --now cockpit.socket

# 如果 cockpit.service 已被激活运行,也需要停止
systemctl stop cockpit.service

优点:Socket 激活方式更节省资源,特别适合不经常使用的管理界面。

ubuntu拓荒指南

1.ubuntu上报E: Unable to locate package update错误的解决方法

1
2
3
4
5
6
7
#如果第一次使用系统,软件库缓存没有更新会包找不到软件包的错误。使用下面命令更新
 
sudo apt update
 
#注意,上面的命令不是apt install,因为使用apt installapt 包管理器会搜索缓存以获取包和版本信息,然后通##过网络从其存储库下载它。如果软件包不在此缓存中,系统将无法安装软件包。
 
新装系统,缓存是空的。首先应该运行 apt update 命令。这样就不会出现E: Unable to locate package 错误。

[ubuntu上报E: Unable to locate package update错误的解决方法 – 知乎](https://zhuanlan.zhihu.com/p/484067483#:~:text=ubuntu上报E%3A Unable to locate package update错误的解决方法 1 1.检查软件包名名称:,4. 检查 Ubuntu 版本的活跃程度 Ubuntu 有两种主要的版本。 常规版本支持九个月,而长期支持版本支持五年。)

2.ubuntu使用ping命令未发现

1
Sudo apt-get install iputils-ping

用户管理及权限、用户授权,登陆相关命令

useradd 添加用户。 添加一个tom用户,设置它属于users组,并添加注释信息:useradd -g users -c “hr tom” tom useradd -c “Name Surname ” -g admin -d /home/user1 -s /bin/bash user1 创建一个属于 “admin” 用户组的用户

usermod 修改系统已经存在用户属性。 修改tom用户的登陆名为tomcat:usermod -l tomcat tom

将tomcat添加到sys和root组(-G,-g)中:usermod -G sys,root tomcat 查看tomcat的组信息:groups tomcat usermod -c “User FTP” -g system -d /ftp/user1 -s /bin/nologin user1 修改用户属性

userdel 删除用户。 userdel -r spark 加一个-r就表示把用户及用户的主目录都删除

groupadd 添加用户群组+groupmod组修改 passwd 修改用户密码。 chage 修改用户密码有效期限。 id 查看用户的uid/gid及归属的用户群组

groupmod -n new_group_name old_group_name 重命名一个用户组

chmod 改变文件、目录权限

chmod -R 770 aaa/ ##如果要将一个文件夹的所有内容权限统一修改,则可以-R参数 chmod ugo+rwx directory1 ##设置目录的所有人(u)、群组(g)以及其他人(o)以读(r )、写(w)和执行(x)的权限 chmod go-rwx directory1 ##删除群组(g)与其他人(o)对目录的读写执行权限

find / -perm -u+s 罗列一个系统中所有使用了SUID控制的文件 chmod u+s /bin/file1 设置一个二进制文件的 SUID 位 – 运行该文件的用户也被赋予和所有者同样的权限 chmod u-s /bin/file1 禁用一个二进制文件的 SUID位 chmod g+s /home/public 设置一个目录的SGID 位 – 类似SUID ,不过这是针对目录的 chmod g-s /home/public 禁用一个目录的 SGID 位 chmod o+t /home/public 设置一个文件的 STIKY 位 – 只允许合法所有人删除文件 chmod o-t /home/public 禁用一个目录的 STIKY 位 chgrp 更改文件用户群组。

chown 改变文件、目录的属主和属组 chown :angela aaa ## 改变所属组 chown angela:angela aaa/ ## 同时修改所属用户和所属组 chown -R user1 directory1 ##改变一个目录的所有人属性并同时改变改目录下所有文件的属性

umask 显示、设置权限掩码。

whoami 显示当前有效用户名称,相当于执行id -un命令。 who 显示目前已登录系统的用户信息。 w 显示已登陆系统的用户列表,并显示用户正在执行的指令。 last 显示已登入系统的用户。 lastlog 显示系统中所有用户最近一次的登录信息。 users 显示当前登录系统的所有用户的用户列表。 finger 查找、显示用户信息。

gpasswd

将tomcat用户从root组和sys组删除:gpasswd -d tomcat root&&gpasswd -d tomcat sys 将america组名修改为am:groupmod -n am america

Docker

启动 docker #启动docker sudo systemctl start docker

#查看docker服务状态 running 就是启动成功 sudo systemctl status docker

设置 docker 开机自启 sudo systemctl enable docker

#镜像命令 docker images:列出所有镜像 docker search [image]:搜索 Docker 镜像 docker pull [image]:拉取指定镜像 docker rmi [image]:删除指定镜像 #容器命令 docker ps:列出当前所有正在运行的容器 docker ps -a:列出所有容器,包括已经停止的容器 docker create [image]:创建一个新的容器,但不启动它 docker start [container]:启动一个容器 docker stop [container]:停止一个容器 docker rm [container]:删除一个容器 docker exec -it [container] [command]:在运行中的容器中执行命令 #其他命令 docker info:显示 Docker 系统信息 docker version:显示 Docker 版本信息 docker logs [container]:查看容器的日志 docker network ls:列出 Docker 网络 docker network create [network]:创建一个新的 Docker 网络 docker network connect [network] [container]:将容器连接到指定的 Docker 网络 docker network disconnect [network] [container]:将容器从指定的 Docker 网络中断开连接

创建挂载的目录 vi /mydata/mysql/conf/my.cnf

输入以下mysql配置文件

[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqld] init_connect=’SET collation_connection = utf8_unicode_ci’ init_connect=’SET NAMES utf8′ character-set-server=utf8 collation-server=utf8_unicode_ci skip-character-set-client-handshake skip-name-resolve

docker pull mysql:5.7

docker run -p 3306:3306 –name mysql
-v /mydata/mysql/log:/var/log/mysql
-v /mydata/mysql/data:/var/lib/mysql
-v /mydata/mysql/conf:/etc/mysql/conf.d
-e MYSQL_ROOT_PASSWORD=root
-d mysql:5.7

-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口 -v /mydata/mysql/conf:/etc/mysql/conf.d:将配置文件夹挂载到主机 -v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机 -v /mydata/mysql/data:/var/lib/mysql:将数据文件夹挂载到主机 -e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码

使用容器mysql命令行工具

docker exec -it mysql mysql -uroot -proot

设置 root 远程访问

//设置远程root密码登录,与本地root密码登录不同 grant all privileges on . to ‘root’@’%’ identified by ‘root’ with grant option; // 如需修改 //alter user ‘root’@’%’ identified with mysql_native_password by ‘123456’; flush privileges;

进入容器内部,查看配置文件是否挂载成功

docker exec -it mysql /bin/bash

cd /etc/mysql/conf.d cat my.cnf

容器化安装 Redis 容器

创建挂载的目录 vi /mydata/redis/conf/redis.conf 1 输入以下配置文件

# 暂无 #password= 123

1、下载镜像文件,创建实例并启动 不多废话,直接上代码

docker pull redis

docker run -p 6379:6379 –name redis
-v /mydata/redis/data:/data
-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf
-d redis redis-server /etc/redis/redis.conf

参数说明

-p 6379:6379:将容器的 3306 端口映射到主机的 3306 端口 -v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf:将配置文件夹挂载到主机 -v /mydata/redis/data:/data :将数据文件夹挂载到主机 2、进入容器 #重启redis docker restart redis #启动redis客户端 docker exec -it redis redis-cli

Docker 容器化安装 Nacos容器 mysql创建nacos的数据库 create database nacos_config

SQL 文件:db/nacos-db.sql · yeye/gmall – 码云 – 开源中国 (gitee.com)

Nacos配置

创建挂载的目录 mkdir -p /mydata/nacos/conf/ #新建nacos的logs目录 mkdir -p /mydata/nacos/logs/ vim /mydata/nacos/conf/application.properties #新建并修改nacos的配置文件

server.contextPath=/nacos server.servlet.contextPath=/nacos server.port=8848

spring.datasource.platform=mysql

db.num=1 db.url.0=jdbc:mysql://xx.xx.xx.x:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root

nacos.cmdb.dumpTaskInterval=3600 nacos.cmdb.eventTaskInterval=10 nacos.cmdb.labelTaskInterval=300 nacos.cmdb.loadDataAtStart=false

management.metrics.export.elastic.enabled=false

management.metrics.export.influx.enabled=false

server.tomcat.accesslog.enabled=true server.tomcat.accesslog.pattern=%h %l %u %t “%r” %s %b %D %{User-Agent}i

nacos.security.ignore.urls=/,//*.css,//.js,/**/.html,//*.map,//.svg,/**/.png,//*.ico,/console-fe/public/,/v1/auth/login,/v1/console/health/,/v1/cs/,/v1/ns/,/v1/cmdb/,/actuator/,/v1/console/server/ nacos.naming.distro.taskDispatchThreadCount=1 nacos.naming.distro.taskDispatchPeriod=200 nacos.naming.distro.batchSyncKeyCount=1000 nacos.naming.distro.initDataRatio=0.9 nacos.naming.distro.syncRetryDelay=5000 nacos.naming.data.warmup=true nacos.naming.expireInstance=true

注意: 这里的配置需要把数据库链接配置一下。

db.num=1

db.url.0=jdbc:mysql://xx.xx.xx.x:3306/nacos_devtest_prod?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true

db.user=user

db.password=pass

修改为自己的数据库地址和账号密码

下载镜像文件,创建实例并启动 不多废话,直接上代码

docker pull nacos/nacos-server:1.1.4 docker run -d
–name nacos
-p 8848:8848
–restart=always
-e JVM_XMS=256m
-e JVM_XMX=256m
-e MODE=standalone
-v /mydata/nacos/logs:/home/nacos/logs
-v /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties
nacos/nacos-server

参数说明

-p 6379:6379:将容器的 3306 端口映射到主机的 3306 端口 /mydata/nacos/conf/application.properties:/home/nacos/conf/application.properties:将配置文件夹挂载到主机 -v /mydata/nacos/logs:/home/nacos/logs:将日志文件夹挂载到主机 进入容器 #重启redis docker restart nacos #进入容器 docker exec -it nacos bash

访问 Nacos 访问地址:http://x.x.x.x:8848/nacos (这里是服务器的ip地址) 账号密码:nacos / nacos

进去了就算成功 “\”这是啥意思.好像是空格,删掉直接把下一行的内容跟上一行放一起就行

tcpdump -i ens33 -w ./xxx.cap //指定网口抓包 tcpdump -i ens33 src net 10.193.17.4 -w ./package.cap //指定网口+SIP抓包并保存./package.cap

date //查看系统时间 hwclock //查看硬件时间 date –s “2017-08-10 10:21:00” //系统时间校准 hwclock –w //同步时间给硬件服务器

systemctl status firewalld //查看防火墙状态 systemctl stop firewalld //临时关闭防火墙 systemctl disable firewalld //永久防火墙开机自关闭 systemctl start firewalld //临时打开防火墙 systemctl enable firewalld //防火墙开机启动

systemctl stop network.service systemctl start network.service service network restart //重启网卡 cd /etc/sysconfig/network-scripts/ //查看网卡信息的路径 ethtool xxx(ens33) //查看网卡xxx状态,包括速率、Link状态,传输类型等;

Buy me a coffee
微信微信
0%