Linux杂谈:一些常用命令
linux杂谈:一些常用命令
linux信息收集
| |
查看硬件信息
查看cpu的统计信息
1# lscpu查看CPU相关参数
1# cat /proc/cpuinfo查看系统内存信息
1# cat /proc/meminfo查看内存信息
1# dmidecode -t memory查看硬盘和分区分布
1# lsblk看硬盘和分区的详细信息
1# fdisk -l查看网卡硬件信息
1# lspci | grep -i 'eth'查看所有网络接口
1 2 3# ip a # yum install -y net-tools # ifconfig查看某个网络接口的详细信息
1# ethtool enp7s0 (以enp7s0为例)
查看软件信息
查看软件包的详细信息
1# rpm -qi systemd(以systemd为例)查看软件包提供的模块
1# rpm -q --provides systemd (以systemd为例)查看所有已安装软件包
1# rpm -qa | grep systemd (以systemd为例)查看软件包文件列表
1# rpm -ql python3-rpm (以python3-rpm为例)
查看OS日志
查看系统启动后的信息和错误日志
1# cat /var/log/messages查看安全相关的日志信息
1# cat /var/log/secure查看邮件相关的日志信息
1# cat /var/log/maillog查看定时任务相关的日志信息
1# cat /var/log/cron查看守护进程启动和停止相关的日志消息
1# cat /var/log/boot.log
I/O
基本概念
I/O表示输入(Input)/输出(Output),输入指系统接收信号或数据的操作,输出指从系统发出信号或数据的操作。对于CPU 和主存储器的组合,任何信息传入或传出 CPU/内存组合,就会被认为是 I/O。
常用I/O性能分析工具
vmstat
1 2# 使用vmstat进行监测,报告磁盘相关统计信息 vmstat -d
在命令的输出信息中,各字段所代表的含义如下:
字段 含义 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的守护进程读取。
显示当前语言环境状态
显示当前语言环境,命令如下:
| |
例如显示系统当前的设置,命令和输出如下:
| |
列出可用的语言环境
显示当前可用的语言环境,命令如下:
| |
例如显示当前系统中所有可用的中文环境,命令和输出如下:
| |
设置语言环境
要设置语言环境,在root权限下执行如下命令,其中 locale 是您要设置的语言类型,取值范围可通过localectl list-locales获取,请根据实际情况修改。
| |
例如设置为简体中文语言环境,在root权限下执行如下命令:
| |
说明:
修改后需要重新登录或者在root权限下执行source /etc/locale.conf命令刷新配置文件,使修改生效。
设置键盘
您可以通过localectl修改系统的键盘设置,对应的参数设置保存在/etc/locale.conf文件中。这些参数,会在系统启动的早期被systemd的守护进程读取。
显示当前设置
显示当前键盘设置,命令如下:
| |
例如显示系统当前的设置,命令和输出如下:
| |
列出可用的键盘布局
显示当前可用的键盘布局,命令如下:
| |
例如显示系统当前的中文键盘布局,命令和输出如下:
| |
设置键盘布局
设置键盘布局,在root权限下执行如下命令,其中 map 是您想要设置的键盘类型,取值范围可通过localectl list-keymaps获取,请根据实际情况修改:
| |
此时设置的键盘布局同样也会应用到图形界面中。
设置完成后,查看当前状态:
| |
设置日期和时间
本节介绍如何通过timedatectl、date、hwclock命令来设置系统的日期、时间和时区等。
使用timedatectl命令设置
显示日期和时间
显示当前的日期和时间,命令如下:
| |
例如显示系统当前的日期和时间,命令和输出如下:
| |
通过远程服务器进行时间同步
您可以启用NTP远程服务器进行系统时钟的自动同步。是否启用NTP,可在root权限下执行如下命令进行设置。其中 boolean 可取值yes和no,分别表示启用和不启用NTP进行系统时钟自动同步,请根据实际情况修改。
说明:
若启用了NTP远程服务器进行系统时钟自动同步,则不能手动修改日期和时间。若需要手动修改日期或时间,则需确保已经关闭NTP系统时钟自动同步。可执行timedatectl set-ntp no命令进行关闭。
例如开启自动远程时间同步,命令如下:
| |
修改日期
说明:
修改日期前,请确保已经关闭NTP系统时钟自动同步。
修改当前的日期,在root权限下执行如下命令,其中 YYYY 代表年份,MM 代表月份,DD 代表某天,请根据实际情况修改:
| |
例如修改当前的日期为2019年8月14号,命令如下:
| |
修改时间
说明:
修改时间前,请确保已经关闭NTP系统时钟自动同步。
修改当前的时间,在root权限下执行如下命令,其中 HH 代表小时,MM 代表分钟,SS 代表秒,请根据实际情况修改:
| |
例如修改当前的时间为15点57分24秒,命令如下:
| |
修改时区
显示当前可用时区,命令如下:
| |
要修改当前的时区,在root权限下执行如下命令,其中 time_zone 是您想要设置的时区,请根据实际情况修改:
| |
例如修改当前的时区,首先查询所在地域的可用时区,此处以Asia为例:
| |
然后修改当前的时区为“Asia/Shanghai”,命令如下:
| |
使用date命令设置
显示当前的日期和时间
显示当前的日期和时间,命令如下:
| |
默认情况下,date命令显示本地时间。要显示UTC时间,添加–utc或-u参数:
| |
要自定义对应的输出信息格式,添加 +“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 代表秒,请根据实际情况修改:
| |
默认情况下, date命令设置本地时间。要设置UTC时间,添加–utc或-u参数:
| |
例如修改当前的时间为23点26分00秒,在root权限下执行如下命令:
| |
修改日期
修改当前的日期,添加–set或者-s参数。在root权限下执行如下命令,其中 YYYY 代表年份,MM 代表月份,DD 代表某天,请根据实际情况修改:
| |
例如修改当前的日期为2019年11月2日,命令如下:
| |
使用hwclock命令设置
可以使用 hwclock 命令设置硬件时钟RTC (Real Time Clock) 。
硬件时钟和系统时钟
Linux 将时钟分为:
- 系统时钟 (System Clock) :当前Linux Kernel中的时钟。
- 硬件时钟 RTC:主板上由电池供电的主板硬件时钟,该时钟可以在BIOS的 “Standard BIOS Feature” 项中进行设置。
当Linux启动时,会读取硬件时钟,并根据硬件时间来设置系统时间。
显示日期和时间
显示当前硬件的日期和时间,在root权限下执行如下命令:
| |
例如显示当前硬件的日期和时间,命令和输出如下:
| |
设置日期和时间
修改当前硬件的日期和时间,在root权限下执行如下命令,其中 dd 表示日,mm 表示月份,yyyy 表示年份,HH 表示小时,MM 表示分钟,请根据实际情况修改:
| |
例如修改当前的时间为2019年10月21日21点17分,命令如下:
| |
管理用户
在Linux中,每个普通用户都有一个帐户,包括用户名、密码和主目录等信息。除此之外,还有一些系统本身创建的特殊用户,它们具有特殊的意义,其中最重要的是管理员帐户,默认用户名是root。同时Linux也提供了用户组,使每一个用户至少属于一个组,从而便于权限管理。
用户和用户组管理是系统安全管理的重要组成部分,本章主要介绍openEuler提供的用户管理和组管理命令,以及为普通用户分配特权的方法。
管理用户
增加用户
useradd命令
在root权限下,通过useradd命令可以为系统添加新用户信息,其中 options 为相关参数, username 为用户名称。
| |
用户信息文件
与用户帐号信息有关的文件如下:
- /etc/passwd:用户帐号信息文件。
- /etc/shadow:用户帐号信息加密文件。
- /etc/group:组信息文件。
- /etc/default/useradd:定义默认设置文件。
- /etc/login.defs:系统广义设置文件。
- /etc/skel:默认的初始配置文件目录。
创建用户实例
例如新建一个用户名为userexample的用户,在root权限下执行如下命令:
| |
说明:
没有任何提示,表明用户建立成功。这时并没有设置用户的口令,请使用passwd命令修改用户的密码,没有设置密码的新帐号不能登录系统。
使用id命令查看新建的用户信息,命令如下:
| |
修改用户userexample的密码:
| |
建议在修改用户密码时满足密码复杂度要求,密码的复杂度的要求如下:
口令长度至少8个字符。
口令至少包含大写字母、小写字母、数字和特殊字符中的任意3种。
口令不能和帐号一样。
口令不能使用字典词汇。
查询字典 在已装好的openEuler环境中,可以通过如下命令导出字典库文件dictionary.txt,用户可以查询密码是否在该字典中。
1cracklib-unpacker /usr/share/cracklib/pw_dict > dictionary.txt修改字典
修改上面导出的字典文件,执行如下命令更新系统字典库。
1# create-cracklib-dict dictionary.txt在原字典库基础上新增其他字典内容custom.txt。
1# create-cracklib-dict dictionary.txt custom.txt
根据提示两次输入新用户的密码,完成密码更改。过程如下:
| |
说明:
若打印信息中出现“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 为要修改用户的用户名,请根据实际情况修改:
| |
例如,将用户userexample的shell改为csh,命令如下:
| |
修改主目录
修改主目录,可以在root权限下执行如下命令,其中 new_home_directory 为已创建的目标主目录的路径,username 为要修改用户的用户名,请根据实际情况修改:
1usermod -d new_home_directory username如果想将现有主目录的内容转移到新的目录,应该使用-m选项,命令如下:
1usermod -d new_home_directory -m username
修改UID
修改用户ID,在root权限下执行如下命令,其中 UID 代表目标用户ID,username 代表用户名,请根据实际情况修改:
| |
该用户主目录中所拥有的文件和目录都将自动修改UID设置。但是,对于主目录外所拥有的文件,只能使用chown命令手动修改所有权。
修改帐号的有效期
如果使用了影子口令,则可以在root权限下,执行如下命令来修改一个帐号的有效期,其中 MM 代表月份,DD 代表某天,YY 代表年份,username 代表用户名,请根据实际情况修改:
| |
删除用户
在root权限下,使用userdel命令可删除现有用户。
例如,删除用户Test,命令如下:
| |
如果想同时删除该用户的主目录以及其中所有内容,要使用-r参数递归删除。
说明:
不建议直接删除已经进入系统的用户,如果需要强制删除,请使用 userdel -f Test 命令。
管理员帐户授权
使用sudo命令可以允许普通用户执行管理员帐户才能执行的命令。
sudo命令允许已经在/etc/sudoers文件中指定的用户运行管理员帐户命令。例如,一个已经获得许可的普通用户可以运行如下命令:
| |
实际上,sudo的配置完全可以指定某个已经列入/etc/sudoers文件的普通用户可以做什么,不可以做什么。
/etc/sudoers的配置行如下所示。
空行或注释行(以#字符打头):无具体功能的行。
可选的主机别名行:用来创建主机列表的简称。必须以Host_Alias关键词开头,列表中的主机必须用逗号隔开,如:
1Host_Alias linux=ted1,ted2其中ted1和ted2是两个主机名,可使用linux(别名)称呼它们。
可选的用户别名行:用来创建用户列表的简称。用户别名行必须以User_Alias关键词开头,列表中的用户名必须以逗号隔开。其格式同主机别名行。
可选的命令别名行:用来创建命令列表的简称。必须以Cmnd_Alias开头,列表中的命令必须用逗号隔开。
可选的运行方式别名行:用来创建用户列表的简称。不同的是,使用这样的别名可以告诉sudo程序以列表中某一用户的身份来运行程序。
必要的用户访问说明行。
用户访问的说明语法如下:
1user host = [ run as user ] command list在user处指定一个真正的用户名或定义过的别名,host也可以是一个真正的主机名或者定义过的主机别名。默认情况下,sudo执行的所有命令都是以root身份执行。如果您想使用其他身份可以指定。command list可以是以逗号分隔的命令列表,也可以是一个已经定义过的别名,如:
1ted1 ted2=/sbin/shutdown这一句说明ted1可以在ted2主机上运行关机命令。
1newuser1 ted1=(root) /usr/sbin/useradd,/usr/sbin/userdel这一句说明ted1主机上的newuser1具有以root用户权限执行useradd,userdel命令的功能。
说明:
- 可以在一行定义多个别名,中间用冒号 (:) 隔开。
- 可在命令或命令别名之前加上感叹号 (!),使该命令或命令别名无效。
- 有两个关键词:ALL和NOPASSWD。ALL意味着“所有”(所有文件、所有主机或所有命令),NOPASSWD意味着不用密码。
- 通过修改用户访问,将普通用户的访问权限修改为同root一样,则可以给普通用户分配特权。
下面是一个sudoers文件的例子:
| |
其中:
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 为用户组名称。
| |
用户组信息文件
与用户组信息有关的文件如下:
- /etc/gshadow:用户组信息加密文件。
- /etc/group:组信息文件。
- /etc/login.defs:系统广义设置文件。
创建用户组实例
例如新建一个用户组名为groupexample的用户,在root权限下执行如下命令:
| |
修改用户组
修改GID
修改用户组ID,在root权限下执行如下命令,其中 GID 代表目标用户组ID, groupname 代表用户组,请根据实际情况修改:
| |
修改用户组名
修改用户组名,在root权限下执行如下命令,其中 newgroupname 代表新用户组名, oldgroupname 代表已经存在的待修改的用户组名,请根据实际情况修改:
| |
删除用户组
在root权限下,使用groupdel命令可删除用户组。
例如,删除用户组Test,命令如下:
| |
说明:
groupdel不能直接删除用户的主组,如果需要强制删除用户主组,请使用 groupdel -f Test 命令。
将用户加入用户组或从用户组中移除
在root权限下,使用gpasswd命令将用户加入用户组或从用户组中移除。
例如,将用户 userexample 加入用户组 Test ,命令如下:
| |
例如,将用户 userexample 从 Test 用户组中移除,命令如下:
| |
切换用户组
一个用户同时属于多个用户组时,则在用户登录后,使用newgrp命令可以切换到其他用户组,以便具有其他用户组的权限。
例如,将用户 userexample 切换到 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 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
创建本地软件源仓库
要建立一个本地软件源仓库,请按照下列步骤操作。
安装createrepo软件包。
1# dnf install createrepo将需要的软件包复制到一个目录下,如/mnt/local_repo/ 。
创建软件源。
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。
| |
启用软件源
要启用软件源,请在root权限下执行如下命令,其中 repository 为新增.repo文件中的repo id(可通过dnf repolist查询):
| |
您也可以使用一个全局正则表达式,来启用所有匹配的软件源。其中 glob_expression 为对应的正则表达式,用于同时匹配多个repo id:
| |
禁用软件源
要禁用软件源,请在root权限下执行如下命令:
| |
同样的,您也可以使用一个全局正则表达式来禁用所有匹配的软件源:
| |
管理软件包
使用dnf能够让您方便的进行查询、安装、删除软件包等操作。
搜索软件包
您可以使用rpm包名称、缩写或者描述搜索需要的RPM包,使用命令如下:
| |
列出软件包清单
要列出系统中所有已安装的以及可用的RPM包信息,使用命令如下:
| |
要列出系统中特定的RPM包信息,使用命令如下:
| |
显示RPM包信息
要显示一个或者多个RPM包信息,多个包之间以空格分隔,使用命令如下:
| |
安装RPM包
要安装一个软件包及其所有未安装的依赖,请在root权限下执行如下命令:
| |
您也可以通过添加软件包名字同时安装多个软件包。配置文件/etc/dnf/dnf.conf添加参数strict=False,运行dnf命令参数添加–setopt=strict=0。请在root权限下执行如下命令:
| |
示例如下:
| |
说明:
安装RPM包过程中,若出现安装失败,可参考问题5:安装时出现软件包冲突、文件冲突或缺少软件包导致安装失败。
下载软件包
使用dnf下载软件包,请在root权限下输入如下命令:
| |
如果需要同时下载未安装的依赖,则加上–resolve,使用命令如下:
| |
示例如下:
| |
删除软件包
要卸载软件包以及相关的依赖软件包,请在root权限下执行如下命令:
| |
示例如下:
| |
检查并更新
dnf可以检查您的系统中是否有软件包需要更新。您可以通过dnf列出需要更新的软件包,并可以选择一次性全部更新或者只对指定包进行更新。
检查更新
如果您需要显示当前系统可用的更新,使用命令如下:
| |
升级
如果您需要升级单个软件包,在root权限下执行如下命令:
| |
例如升级rpm包,示例如下:
| |
类似的,如果您需要升级软件包组,在root权限下执行如下命令:
| |
更新所有的包和它们的依赖
要更新所有的包和它们的依赖,在root权限下执行如下命令:
| |
dnf常用相关命令
dnf命令在安装升级时能够自动解析包的依赖关系,一般的使用方式如下:
| |
常用的命令如下:
安装,需要在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源。 |
| install | Linux上安装单个或多个软件包。 |
| upgrade | 升级Linux上的一个或多个软件包。 |
| list | 列出一个或一组软件包。 |
| info | 显示关于软件包或软件包组的详细信息。 |
| updateinfo | 显示关于包的公告信息。 |
| search | 在软件包详细信息中搜索指定字符串。 |
| check-update | 检查是否有软件包升级。 |
| remove | 从系统中移除一个或多个软件包。 |
| reinstall | 重装一个包。 |
| downgrade | 降级软件包。 |
| autoremove | 删除所有原先因为依赖关系安装的不需要的软件包。 |
| distro-sync | 同步已经安装的软件包到最新可用版本。 |
| makecache | 创建元数据缓存。 |
| repository-package | 对指定仓库中的所有软件包运行命令。 |
| provides | 查找提供指定内容的软件包。 |
| group | 显示或使用组信息。 |
| history | 显示或使用事务历史。 |
| clean | 删除已缓存的数据。 |
操作1. 已配置的软件repo
显示已配置的软件仓库,默认添加 –enabled 选项(显示启用的仓库)。
| |
- –all: 显示所有的软件仓库
- –disabled: 显示被禁用的软件仓库
- –enabled: 显示已经启用的仓库(默认)
操作2. 安装单个或多个软件包
通过install 命令可以安装RPM包。
| |
安装软件包的过程中可能会存在冲突的包或无法安装的包,可以在命令中增加 –allowerasing 来替换冲突的软件包或 –skip-broken 来跳过无法安装的软件包。
| |
当使用dnf安装软件包时,通过添加 –installroot 设置软件包安装的根目录。
| |
需要临时指定特定的repo源安装时,可以添加 –setopt=reposdir= 选项来指定repo源的加载目录。
| |
在安装选项时,不需要交互式确认时,可以通过添加 -y 或**–assumeyes** 使需要安装的软件包全部自动应答为是。
| |
指定特定的repo源安装rpm包时,可以通过指定 –repo 或 –enablerepo 选项。为了达到相同的效果,也可以通过使用 –disablerepo 选项来禁用匹配的repo源,此处推荐您使用–repo选项来安装RPM包。
| |
操作3. 重新安装软件包
系统上的软件包需要执行重新安装操作时,可以执行 reinstall 命令。
| |
操作4. 升级一个或多个软件包
- 通过upgrade或 update升级Linux上的一个或多个软件包。
| |
操作5. 软件包降级
当软件包版本过高发生兼容性问题时,可以采用降级的方式解决。
| |
操作6. 列出一个或一组软件包
罗列系统中已安装的软件包和配置的repo仓中存在的软件包列表,可以使用 list 命令。
| |
可以通过添加选项过滤显示的包列表
- –all: 显示所有的软件包(默认)
- –available: 只显示可用的软件包
- –installed: 只显示已安装的软件包
- –extras: 只显示额外的软件包
- –updates: 只显示需要被升级的软件包
- –upgrades: 只显示需要被升级的软件包
- –autoremove: 只显示需要被删除的软件包
- –recent: 限制最近被改变的软件包
操作7. 查看软件包详细信息
查看软件包的详细信息时,可以使用info 命令。
| |
操作8. 搜索软件包
如需在系统中安装软件包,但不确定软件包全称时,可使用search命令查找匹配的包。
| |
操作9. 卸载一个或多个软件包
删除已过期或重复的软件包时,可使用remove命令移除一个软件包。
| |
- –duplicates: 删除已安装(重复)的软件包
- –oldinstallonly: 移除过期的“仅安装”软件包
操作10. 自动删除因为依赖关系安装的软件包
删除因为依赖关系安装的不需要的软件包时,可使用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 | .swap | swap设备或者swap文件。 |
| Timer unit | .timer | systemd计时器。 |
所有的可用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 start | systemctl start network.service | 用来启动一个服务 (并不会重启现有的)。 |
| service network stop | systemctl stop network.service | 用来停止一个服务 (并不会重启现有的)。 |
| service network restart | systemctl restart network.service | 用来停止并启动一个服务。 |
| service network reload | systemctl reload network.service | 当支持时,重新装载配置文件而不中断等待操作。 |
| service network condrestart | systemctl condrestart network.service | 如果服务正在运行那么重启它。 |
| service network status | systemctl status network.service | 检查服务的运行状态。 |
| chkconfig network on | systemctl enable network.service | 在下次启动时或满足其他触发条件时设置服务为启用。 |
| chkconfig network off | systemctl disable network.service | 在下次启动时或满足其他触发条件时设置服务为禁用。 |
| chkconfig network | systemctl is-enabled network.service | 用来检查一个服务在当前环境下被配置为启用还是禁用。 |
| chkconfig –list | systemctl list-unit-files –type=service | 输出在各个运行级别下服务的启用和禁用情况。 |
| chkconfig network –list | ls /etc/systemd/system/*.wants/network.service | 用来列出该服务在哪些运行级别下启用和禁用。 |
| chkconfig network –add | systemctl daemon-reload | 当您创建新服务文件或者变更设置时使用。 |
显示所有当前服务
如果您需要显示当前正在运行的服务,使用命令如下:
| |
如果您需要显示所有的服务(包括未运行的服务),需要添加-all参数,使用命令如下:
| |
例如显示当前正在运行的服务,命令如下:
| |
显示服务状态
如果您需要显示某个服务的状态,可执行如下命令:
| |
相关状态显示参数说明如表4所示。
表 4 状态参数说明
| 参数 | 描述 |
|---|---|
| Loaded | 说明服务是否被加载,并显示服务对应的绝对路径以及是否启用。 |
| Active | 说明服务是否正在运行,并显示时间节点。 |
| Main PID | 相应的系统服务的PID值。 |
| CGroup | 相关控制组(CGroup)的其他信息。 |
如果您需要鉴别某个服务是否运行,可执行如下命令:
| |
is-active命令的返回结果如下:
表 5 is-active命令的返回结果
| 状态 | 含义 |
|---|---|
| active(running) | 有一个或多个程序正在系统中执行。 |
| active(exited) | 仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者 是挂载时才会进行一次的 quotaon 功能。 |
| active(waiting) | 正在执行当中,不过要等待其他的事件才能继续处理。例如:打印的队列相关服务 就是这种状态,虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机 服务来进行下一步打印的功能 |
| inactive | 这个服务没有运行 |
同样,如果您需要判断某个服务是否被启用,可执行如下命令:
| |
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服务状态,命令如下:
| |
运行服务
如果您需要运行某个服务,请在root权限下执行如下命令:
| |
例如运行httpd服务,命令如下:
| |
关闭服务
如果您需要关闭某个服务,请在root权限下执行如下命令:
| |
例如关闭蓝牙服务,命令如下:
| |
重启服务
如果您需要重启某个服务,请在root权限下执行如下命令:
| |
执行命令后,当前服务会被关闭,但马上重新启动。如果您指定的服务,当前处于关闭状态,执行命令后,服务也会被启动。
例如重启蓝牙服务,命令如下:
| |
启用服务
如果您需要在开机时启用某个服务,请在root权限下执行如下命令:
| |
例如设置httpd服务开机时启动,命令如下:
| |
禁用服务
如果您需要在开机时禁用某个服务,请在root权限下执行如下命令:
| |
例如在开机时禁用蓝牙服务启动,命令如下:
| |
改变运行级别
Target和运行级别
systemd用目标(target)替代了运行级别的概念,提供了更大的灵活性,如您可以继承一个已有的目标,并添加其他服务,来创建自己的目标。表7列举了systemd下的目标和常见runlevel的对应关系。
表 7 运行级别和systemd目标
| 运行级别 | systemd目标(target) | 描述 |
|---|---|---|
| 0 | runlevel0.target,poweroff.target | 关闭系统。 |
| 1, s, single | runlevel1.target,rescue.target | 单用户模式。 |
| 2, 4 | runlevel2.target,runlevel4.target,multi-user.target | 用户定义/域特定运行级别。默认等同于3。 |
| 3 | runlevel3.target,multi-user.target | 多用户,非图形化。用户可以通过多个控制台或网络登录。 |
| 5 | runlevel5.target,graphical.target | 多用户,图形化。通常为所有运行级别3的服务外加图形化登录。 |
| 6 | runlevel6.target,reboot.target | 重启系统。 |
| emergency | emergency.target | 紧急Shell。 |
查看系统默认启动目标
查看当前系统默认的启动目标,命令如下:
| |
查看当前系统所有的启动目标
查看当前系统所有的启动目标,命令如下:
| |
改变默认目标
改变系统默认的目标,在root权限下执行如下命令:
| |
改变当前目标
改变当前系统的目标,在root权限下执行如下命令:
| |
切换到救援模式
改变当前系统为救援模式,在root权限下执行如下命令:
| |
这条命令和“systemctl isolate rescue.target”类似。命令执行后会在串口有如下打印信息:
| |
说明:
从救援模式进入正常模式,用户需要重启系统。
切换到紧急模式
改变当前系统为紧急模式,在root权限下执行如下命令:
| |
这条命令和“systemctl isolate emergency.target”类似。命令执行后会在串口有如下打印信息:
| |
说明:
从紧急模式进入正常模式,用户需要重启系统。
关闭、暂停和休眠系统
systemctl命令
systemd通过systemctl命令可以对系统进行关机、重启、休眠等一系列操作。当前仍兼容部分Linux常用管理命令,对应关系如表8。建议用户使用systemctl命令进行操作。
表 8 命令对应关系
| Linux常用管理命令 | systemctl命令 | 描述 |
|---|---|---|
| halt | systemctl halt | 关闭系统 |
| poweroff | systemctl poweroff | 关闭电源 |
| reboot | systemctl reboot | 重启 |
关闭系统
关闭系统并下电,在root权限下执行如下命令:
| |
关闭系统但不下电机器,在root权限下执行如下命令:
| |
执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“–no-wall”参数。具体命令如下:
| |
重启系统
重启系统,在root权限下执行如下命令:
| |
执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“–no-wall”参数。具体命令如下:
| |
使系统待机
使系统待机,在root权限下执行如下命令:
| |
使系统休眠
使系统休眠,在root权限下执行如下命令:
| |
使系统待机且处于休眠状态,在root权限下执行如下命令:
| |
管理进程
操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主要存储,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源,当用户提出一个请求时,造成好像系统被用户独占的假象。实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户任务、操作系统任务、邮件和打印任务等。本章节将从用户的角度讲述如何控制进程。
查看进程
Linux是一个多任务系统,经常需要对这些进程进行一些调配和管理。要进行管理,首先就要知道现在的进程情况:有哪些进程、进程的状态如何等。Linux提供了多种命令来了解进程的状况。
who命令
who命令主要用于查看当前系统中的用户情况。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。
例如查看系统中的用户及其状态。使用如下:
| |
ps命令
ps命令是最基本又非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等,大部分进程信息都是可以通过执行该命令得到的。
ps命令最常用的还是用来监控后台进程的工作情况,因为后台进程是不与屏幕、键盘这些标准输入/输出设备进行通信的,所以如果需要检测其状况,就可使用ps命令。ps命令的常见选项如表1所示。
表 1 选项说明
| 选项 | 描述 |
|---|---|
| -e | 显示所有进程。 |
| -f | 全格式。 |
| -h | 不显示标题。 |
| -l | 使用长格式。 |
| -w | 宽行输出。 |
| -a | 显示终端上的所有进程,包括其他用户的进程。 |
| -r | 只显示正在运行的进程。 |
| -x | 显示没有控制终端的进程。 |
例如显示系统中终端上的所有进程。命令如下:
| |
top命令
top命令和ps命令的基本作用是相同的,显示系统当前的进程和其他状况,但是top是一个动态显示过程,即可以通过用户按键来不断刷新进程的当前状态,如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。其实top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU的任务列表。该命令可以按CPU使用、内存使用和执行时间对任务进行排序,而且该命令的很多特性都可以通过交互式命令或者在定制文件中进行设定。
top命令输出的示例如图1所示:
图 1 top显示

kill命令
**当需要中断一个前台进程的时候,通常足使用“Ctrl+c”组合键,而对于后台进程不能用组合键来终止,这时就可以使用kill命令。该命令可以终止前台和后台进程。**终止后台进程的原因包括:该进程占用CPU的时间过多、该进程已经死锁等。
kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送的信号,那么缺省值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用KILL信号(它的编号为9),而该信号不能被捕捉。
kill命令的浯法格式有以下两种方式:
| |
其中进程号可以通过ps命令的输出得到。-s选项是给程序发送指定的信号,详细的信号可以用“kill -l”命令查看;-p选项只显示指定进程的ID号。
杀死pid为1409的进程,在root权限下执行如下命令:
| |
显示所有的信号及其编号对应关系,示例如下:
| |
调度启动进程
有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这些任务。要使用自动启动进程的功能,就需要掌握以下几个启动命令。
定时运行一批程序(at)
at命令
用户使用at命令在指定时刻执行指定的命令序列。该命令至少需要指定一个命令和一个执行时间。at命令可以只指定时间,也可以时间和日期一起指定。
at命令的语法格式如下:
| |
设置时间
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日,可用命令格式如下:
| |
以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误,例如上例可以写成:at 16:30 6/7/19。
执行权限
对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的所有者。
例如在6月8日上午10点执行slocate -u命令。在root权限下执行命令如下:
| |
上面的结果中,输入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设置。命令如下:
| |
crontab文件
在crontab文件中输入需要执行的命令和时间。该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:
| |
对于每一项的说明如表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文件中对应的行如下:
| |
**每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件。**此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e来编辑。用户也可以另外建立一个文件,使用“cron文件名”命令导入cron设置。
假设有个用户名为userexample,它需要为自己创建一个crontab文件。步骤如下:
首先可以使用任何文本编辑器建立一个新文件,并向该文件加入需要运行的命令和要定期执行的时间,假设该文件为 ~/userexample.cron。
然后在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是针对系统的任务。此文件的文件格式如下:
| |
说明:
如果去掉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发布包。
示例如下:
| |
挂载好的mnt目录如下:
| |
其中,Packages为rpm包所在的目录,repodata为repo源元数据所在的目录,RPM-GPG-KEY-openEuler为openEuler的签名公钥。
创建本地repo源
可以拷贝ISO发布包中相关文件至本地目录以创建本地repo源,示例如下:
| |
从而本地repo目录如下:
| |
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。
安装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 36user 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服务
在root权限下通过systemctl命令启动nginx服务:
1 2# systemctl enable nginx # systemctl start nginxnginx是否启动成功可通过下面命令查看:
1# systemctl status nginx图1表示nginx服务启动成功
图 1 nginx服务启动成功

若nginx服务启动失败,查看错误信息:
1# systemctl status nginx.service --full图 2 nginx服务启动失败

如图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源部署
在root权限下创建nginx配置文件/etc/nginx/nginx.conf中指定的目录/usr/share/nginx/repo:
1# mkdir -p /usr/share/nginx/repo在root权限下修改目录/usr/share/nginx/repo的权限:
1# chmod -R 755 /usr/share/nginx/repo设置防火墙规则,开启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 ACCEPTnginx服务设置好之后,即可通过ip直接访问网页,如图3:
图 3 nginx部署成功

通过下面几种方式将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/repoopenEuler-{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:
| |
搭建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的安装。
| |
管理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.conf | vsftpd进程的主配置文件,配置内容格式为“参数=参数值”,且参数和参数值不能为空。vsftpd.conf 的详细介绍可以使用如下命令查看:man 5 vsftpd.conf |
| /etc/pam.d/vsftpd | PAM(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/vsftpd | vsftpd的唯一执行文件。 |
| /var/ftp/ | 匿名用户登录的默认根目录,与ftp帐户的用户主目录有关。 |
默认配置说明
说明:
文档中的配置内容仅供参考,请用户根据实际情况(例如安全加固需要)进行修改。
openEuler系统中 ,vsftpd默认不开放匿名用户,使用vim命令查看主配置文件,其内容如下:
| |
其中各参数含义如表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_20 | Port模式进行数据传输是否使用端口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时间为本地时间的操作步骤如下:
打开配置文件vsftpd.conf,将参数use_localtime的参数值改为YES。命令如下:
1# vim /etc/vsftpd/vsftpd.conf配置内容如下:
1use_localtime=YES重启vsftpd服务。
1# systemctl restart vsftpd设置vsftpd服务开机启动。
1# systemctl enable vsftpd
配置欢迎信息
使用vsftpd服务,建议新建欢迎信息文件(没有也不影响使用)。在root权限下设置vsftpd的欢迎信息welcome.txt文件的操作步骤如下:
打开配置文件vsftpd.conf,加入欢迎信息文件配置内容后保存退出。
1# vim /etc/vsftpd/vsftpd.conf需要加入的配置行如下:
1banner_file=/etc/vsftpd/welcome.txt建立欢迎信息。即打开welcome.txt文件,写入欢迎信息后保存退出。
1# vim /etc/vsftpd/welcome.txt欢迎信息举例如下:
1Welcome 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服务器搭建成功。
| |
说明:
如果没有ftp命令,可以在root权限下执行dnf install ftp命令安装后再使用ftp命令。
配置防火墙
如果要将FTP开放给Internet使用,需要在root权限下对防火墙和SElinux进行设置。
| |
传输文件
概述
这里给出vsftpd服务启动后,如何进行文件传输的指导。
连接服务器
命令格式
ftp [hostname | ip-address]
其中hostname为服务器名称,ip-address为服务器IP地址。
操作说明
在openEuler系统的命令行终端,执行如下命令:
| |
根据提示输入用户名和密码,认证通过后显示如下,说明ftp连接成功,此时进入了连接到的服务器目录。
| |
在该提示符下,可以输入不同的命令进行相关操作:
显示服务器当前路径
1ftp>pwd显示本地路径,用户可以将该路径下的文件上传到FTP服务器对应位置
1ftp>lcd退出当前窗口,返回本地Linux终端
1ftp>!
下载文件
通常使用get或mget命令下载文件。
get使用方法
功能说明:将文件从远端主机中传送至本地主机中
命令格式:get [remote-file] [local-file]
其中 remote-file 为远程文件,local-file 为本地文件
示例:获取远程服务器上的/home/openEuler/openEuler.htm文件到本地/home/myopenEuler/,并改名为myopenEuler.htm,命令如下:
1ftp> get /home/openEuler/openEuler.htm /home/myopenEuler/myopenEuler.htm
mget使用方法
功能说明:从远端主机接收一批文件至本地主机
命令格式:mget [remote-file]
其中 remote-file 为远程文件
示例:获取服务器上/home/openEuler/目录下的所有文件,命令如下:
1 2ftp> 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,命令如下:
1ftp> put myopenEuler.htm /home/openEuler/openEuler.htm
mput使用方法
功能说明:将本地主机中一批文件传送至远端主机
命令格式:mput [local-file]
其中 local-file 为本地文件
示例:将本地当前目录下所有htm文件上传到服务器/home/openEuler/下,命令如下:
1 2ftp> cd /home/openEuler/ ftp> mput *.htm
删除文件
通常使用delete或mdelete命令删除文件。
delete使用方法
功能说明:删除远程服务器上的一个或多个文件
命令格式:delete [remote-file]
其中 remote-file 为远程文件
示例:删除远程服务器上/home/openEuler/下的openEuler.htm文件,命令如下:
1 2ftp> cd /home/openEuler/ ftp> delete openEuler.htm
mdelete使用方法
功能说明:删除远程服务器上的文件,常用于批量删除
命令格式:mdelete [remote-file]
其中 remote-file 为远程文件
示例:删除远程服务器上/home/openEuler/下所有a开头的文件,命令如下:
1 2ftp> cd /home/openEuler/ ftp> mdelete a*
断开服务器
断开与服务器的连接,使用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服务是否正在运行。
| |
回显为“active”说明服务处于运行状态。
配置文件说明
当httpd服务启动后,默认情况下它会读取如表1所示的配置文件。
表 1 配置文件说明
| 文件 | 说明 |
|---|---|
| /etc/httpd/conf/httpd.conf | 主要的配置文件 |
| /etc/httpd/conf.d | 配置文件的辅助目录,这些配置文件也被包含在主配置文件当中一个配置文件的辅助目录被包含在主要的配置文件中 |
虽然默认配置可以适用于多数情况,但是用户至少需要熟悉里面的一些重要配置项。配置文件修改完成后,可以在root权限下使用如下命令检查配置文件可能出现的语法错误。
| |
如果回显如下,说明配置文件语法正确。
| |
说明:
- 在修改配置文件之前,请先备份原始文件,以便出现问题时能够快速恢复配置文件。
- 需要重启web服务,才能使修改后的配置文件生效。
管理模块和SSL
概述
httpd服务是一个模块化的应用,它和许多动态共享对象DSO(Dynamic Shared Objects)一起分发。动态共享对象DSO,在必要情况下,可以在运行时被动态加载或卸载。服务器操作系统中这些模块位于/usr/lib64/httpd/modules/目录下。本节介绍如何加载和写入模块。
加载模块
为了加载一个特殊的DSO模块,在配置文件中使用加载模块指示。独立软件包提供的模块一般在/etc/httpd/conf.modules.d目录下有他们自己的配置文件。
例如,加载asis DSO模块的操作步骤如下:
在/etc/httpd/conf.modules.d/00-optional.conf文件中,使用root权限取消注释如下配置行。
1LoadModule asis_module modules/mod_asis.so加载完成后,请使用root权限重启httpd服务以便于重新加载配置文件。
1# systemctl restart httpd加载完成后,在root权限下使用httpd -M的命令查看是否已经加载了asis DSO模块。
1# httpd -M | grep asis回显如下,说明asis DSO模块加载成功。
1asis_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的操作步骤如下:
在root权限下安装mod_ssl的rpm包。
1# dnf install mod_ssl安装完成后,请在root权限下重启httpd服务以便于重新加载配置文件。
1# systemctl restart httpd加载完成后,在root权限下使用httpd -M的命令查看是否已经加载了SSL。
1# httpd -M | grep ssl回显如下,说明SSL已加载成功。
1ssl_module (shared)
验证web服务是否搭建成功
Web服务器搭建完成后,可以通过如下方式验证是否搭建成功。
在root权限下查看服务器的IP地址,命令如下:
1# ip a在root权限下配置防火墙:
1 2 3 4# firewall-cmd --add-service=http --permanent success # firewall-cmd --reload success验证web服务器是否搭建成功,用户可选择Linux或Windows系统进行验证。
使用Linux系统验证
执行如下命令,查看是否可以访问网页信息,服务搭建成功时,该网页可以正常访问。
1# curl http://192.168.1.60执行如下命令,查看命令返回值是否为0,返回值为0,说明httpd服务器搭建成功。
1# echo $?使用Windows系统验证
打开浏览器,在地址栏输入如下地址,如果能正常访问网页,说明httpd服务器搭建成功。
如果修改了端口号,输入地址格式如下:
Nginx服务器
概述
Nginx 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,其特点是占有内存少,并发能力强,支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能,并且支持很多第三方的模块扩展。
安装
配置本地yum源,详细信息请参考搭建repo服务器。
清除缓存。
1# dnf clean all创建缓存。
1# dnf makecache在root权限下安装nginx服务。
1# dnf install nginx查看安装后的rpm包。
1# dnf list all | grep nginx
管理nginx
概述
通过systemctl工具,可以对nginx服务进行管理,包括启动、停止、重启服务,以及查看服务状态等。本章介绍nginx服务的管理操作,以指导用户使用。
前提条件
启动服务
启动并运行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服务是否正在运行
| |
回显为“active”说明服务处于运行状态。
配置文件说明
当nginx服务启动后,默认情况下它会读取如表2所示的配置文件。
表 2 配置文件说明
| 文件 | 说明 |
|---|---|
| /etc/nginx/nginx.conf | 主要的配置文件 |
| /etc/nginx/conf.d | 配置文件的辅助目录,这些配置文件也被包含在主配置文件当中一个配置文件的辅助目录被包含在主要的配置文件中 |
虽然默认配置可以适用于多数情况,但是用户至少需要熟悉里面的一些重要配置项。配置文件修改完成后,可以在root权限下使用如下命令检查配置文件可能出现的语法错误。
| |
如果回显信息中有“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服务器搭建完成后,可以通过如下方式验证是否搭建成功。
在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 24enp3s0: 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在root权限下配置防火墙:
1 2 3 4# firewall-cmd --add-service=http --permanent success # firewall-cmd --reload success验证web服务器是否搭建成功,用户可选择Linux或Windows系统进行验证。
使用Linux系统验证
执行如下命令,查看是否可以访问网页信息,服务搭建成功时,该网页可以正常访问。
1# curl http://192.168.1.60执行如下命令,查看命令返回值是否为0,返回值为0,说明nginx服务器搭建成功。
1# echo $?使用Windows系统验证
打开浏览器,在地址栏输入如下地址,如果能正常访问网页,说明nginx服务器搭建成功。
如果修改了端口号,输入地址格式如下:
搭建数据库服务器
PostgreSql服务器
软件介绍
PostgreSQL的架构如图1所示,主要进程说明如表1所示。
图 1 PostgreSql架构

表 1 PostgreSql中的主要进程说明
| 进程类别 | 进程名称 | 说明 |
|---|---|---|
| 主进程 | Postmaster | Postmaster是整个数据库实例的总控进程,负责启动和关闭该数据库实例。 |
| 常驻进程 | 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(检查点) | 检查点是系统设置的事务序列点,设置检查点保证检查点前的日志信息刷到磁盘中。 |
配置环境
说明:
以下环境配置仅为参考示例,具体配置视实际需求做配置
关闭防火墙并取消开机自启动
说明:
测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。
在root权限下停止防火墙。
1systemctl stop firewalld在root权限下关闭防火墙。
1systemctl disable firewalld说明:
执行disable命令关闭防火墙的同时,也取消了开机自启动。
修改SELINUX为disabled
在root权限下修改配置文件。
| |
创建组和用户
说明:
服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。
在root权限下创建PostgreSQL用户(组)。
1 2groupadd postgres useradd -g postgres postgres在root权限下设置postgres用户密码(重复输入密码)。
1passwd postgres
搭建数据盘
说明:
- 测试极限性能时,建议单独挂载IO性能更优的NVME SSD存储介质创建PostgreSQL测试实例,避免磁盘IO对性能测试结果的影响,本文以单独挂载NVME SSD为例,参考步骤1~步骤4。
- 非性能测试时,在root权限下执行以下命令,创建数据目录即可。然后跳过本小节: mkdir /data
在root权限下创建文件系统(以xfs为例,根据实际需求创建文件系统),若磁盘之前已做过文件系统,执行此命令会出现报错,可使用-f参数强制创建文件系统。
1mkfs.xfs /dev/nvme0n1在root权限下创建数据目录。
1mkdir /data在root权限下挂载磁盘。
1mount -o noatime,nobarrier /dev/nvme0n1 /data
数据目录授权
在root权限下修改目录权限。
1chown -R postgres:postgres /data/
安装、运行和卸载
安装
配置本地yum源,详细信息请参考搭建repo服务器。
清除缓存。
1dnf clean all创建缓存。
1dnf makecache在root权限下安装PostgreSQL服务器。
1dnf install postgresql-server查看安装后的rpm包。
1rpm -qa | grep postgresql
运行
初始化数据库
须知:
此步骤在postgres用户下操作。
切换到已创建的PostgreSQL用户。
1su - postgres初始化数据库,其中命令中的/usr/bin是命令initdb所在的目录。
1usr/bin/initdb -D /data/
启动数据库
启动PostgreSQL数据库。
1/usr/bin/pg_ctl -D /data/ -l /data/logfile start确认PostgreSQL数据库进程是否正常启动。
1ps -ef | grep postgres命令执行后,打印信息如下图所示,PostgreSQL相关进程已经正常启动了。

登录数据库
登录数据库。
1/usr/bin/psql -U postgres说明:
初次登录数据库,无需密码。
配置数据库帐号密码
登录后,设置postgres密码。
1postgres=#alter user postgres with password '123456';
退出数据库
执行\q退出数据库。
1postgres=#\q
停止数据库
停止PostgreSQL数据库。
1/usr/bin/pg_ctl -D /data/ -l /data/logfile stop
卸载
在postgres用户下停止数据库。
1/usr/bin/pg_ctl -D /data/ -l /data/logfile stop在root用户下执行dnf remove postgresql-server卸载PostgreSQL数据库。
1dnf remove postgresql-server
管理数据库角色
创建角色
可以使用CREATE ROLE语句或createuser来创建角色。createuser是对CREATE ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
| |
| |
其中:
- 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。
| |
创建一个密码为123456的角色roleexample2。
| |
创建角色名为roleexample3的角色。
| |
查看角色
可以使用SELECT语句或psql的元命令\du查看角色。
| |
| |
其中:rolename:角色名。
示例
查看roleexample1角色。
| |
查看现有角色。
| |
修改角色
修改用户名
可以使用ALTER ROLE语句修改一个已经存在的角色名。
| |
其中:
- oldrolername:旧的角色名。
- newrolename:新的角色名。
修改用户示例
将角色名roleexample1修改为roleexapme2。
| |
修改用户密码
可以使用ALTER ROLE语句修改一个角色的登录密码。
| |
其中:
- rolename:角色名。
- password:密码。
修改角色密码示例
将roleexample1的密码修改为456789。
| |
删除角色
可以使用DROP ROLE语句或dropuser来删除角色。dropuser是对DROP ROLE命令的封装,需要在shell界面执行,而不是在数据库界面。
| |
| |
其中:rolename为角色名。
示例
删除userexample1角色。
| |
删除userexample2角色。
| |
角色授权
可以使用GRANT语句来对角色授权。
对角色授予表的操作权限:
| |
对角色授予序列的操作权限:
| |
对角色授予数据库的操作权限:
| |
对角色授予函数的操作权限:
| |
对角色授予过程语言的操作权限:
| |
对角色授予模式的操作权限:
| |
对角色授予表空间的操作权限:
| |
将角色rolename1的成员关系赋予角色rolename2:
| |
其中:
- 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权限。
| |
对所有用户授予表table1的所有权限。
| |
删除用户权限
可以使用REVOKE语句来撤销以前赋予一个或多个角色的权限。
撤销角色对表的操作权限:
| |
撤销角色对序列的操作权限:
| |
撤销角色对数据库的操作权限:
| |
撤销角色对函数的操作权限:
| |
撤销角色对过程语言的操作权限:
| |
撤销角色对模式的操作权限:
| |
撤销角色对表空间的操作权限:
| |
删除rolename2的rolename1的成员关系:
| |
其中:
- 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权限。
| |
对所有用户授予表table1的所有权限。
| |
管理数据库
创建数据库
可以使用CREATE DATABASE语句或createdb来创建数据库。createrdb是对CREATE DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。
| |
| |
其中:databasename为数据库名。
要使用这条命令,必须拥有CREATEDB权限。
示例
创建一个数据库database1。
| |
选择数据库
可以使用\c语句来选择数据库。
| |
其中:databasename为数据库名称。
示例
选择databaseexample数据库。
| |
查看数据库
可以使用\l语句来查看数据库。
| |
示例
查看所有数据库。
| |
删除数据库
可以使用DROP DATABASE语句或dropdb来删除数据库。dropdb是对DROP DATABASE命令的封装,需要在shell界面执行,而不是在数据库界面。
注意:
删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
| |
| |
其中:databasename为数据库名称。
DROP DATABASE会删除数据库的系统目录项并且删除包含数据的文件目录。
DROP DATABASE只能由超级管理员或数据库拥有者执行。
示例
删除databaseexample数据库。
| |
备份数据库
可以使用pg_dump命令备份数据库,将数据库转储到一个脚本文件或其他归档文件中。
| |
其中:
- 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中。
| |
恢复数据库
可以使用psql命令恢复数据库。
| |
其中:
- 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数据库中。
| |
Mariadb服务器
软件介绍
MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品,MariaDB还提供了许多更好的新特性。
MariaDB的架构如图2所示。
图 2 MariaDB逻辑架构

当Mariadb接受到Sql语句时,其详细的执行过程如下:
- 当客户端连接到mariadb的时候,会认证客户端的主机名、用户、密码,认证功能可以做成插件。
- 如果登录成功,客户端发送sql命令到服务端。由解析器解析sql语句。
- 服务端检查客户端是否有权限去获取它想要的资源。
- 如果查询已经存储在query cache当中,那么结果立即返回。
- 优化器将会找出最快的执行策略,或者是执行计划,也就是说优化器可以决定什么表将会被读,以及哪些索引会被访问,哪些临时表会被使用,一个好的策略能够减少大量的磁盘访问和排序操作等。
- 存储引擎读写数据和索引文件,cache用来加速这些操作,其他的诸如事物和外键特性,都是在存储引擎层处理的。
存储引擎在物理层管控数据,它负责数据文件、数据、索引、cache等的管理,这使得管理和读取数据变得更高效,每一张表,都有一个.frm文件,这些文件包含着表的定义。
每一个存储引擎管理、存储数据的方式都是不同的,所支持的特性和性能也不尽相同。例如:
- MyISAM,适合读多写少的环境,且不支持事务,支持全文索引等。
- noDB,支持事务,支持行锁和外键等。
- MEMORY,将数据存储在内存当中。
- CSV,将数据存储为CSV格式。
配置环境
说明:
以下环境配置仅为参考示例,具体配置视实际需求做配置
关闭防火墙并取消开机自启动
说明:
测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。
在root权限下停止防火墙。
1systemctl stop firewalld在root权限下关闭防火墙。
1systemctl disable firewalld说明:
执行disable命令关闭防火墙的同时,也取消了开机自启动。
修改SELINUX为disabled
在root权限下修改配置文件。
1sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
创建组和用户
说明:
服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。
在root权限下创建MySQL用户(组)。
1groupadd mysql1useradd -g mysql mysql在root权限下设置MySQL用户密码。
1passwd mysql重复输入密码(根据实际需求设置密码)。
搭建数据盘
说明:
- 进行性能测试时,数据目录使用单独硬盘,需要对硬盘进行格式化并挂载,参考方法一或者方法二。
- 非性能测试时,在root权限下执行
mkdir /data创建数据目录即可。然后跳过本小节。
方法一:在root权限下使用fdisk进行磁盘管理
创建分区(以/dev/sdb为例,根据实际情况创建)
1fdisk /dev/sdb输入n,按回车确认。
输入p,按回车确认。
输入1,按回车确认。
采用默认配置,按回车确认。
采用默认配置,按回车确认。
输入w,按回车保存。
创建文件系统(以xfs为例,根据实际需求创建文件系统)
1mkfs.xfs /dev/sdb1挂载分区到“/data”以供操作系统使用。
1mkdir /data1mount /dev/sdb1 /data执行命令“vi /etc/fstab", 编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
其中,/dev/nvme0n1p1为示例,具体名称以实际情况为准。

方法二:在root权限下使用LVM进行磁盘管理
说明:
此步骤需要安装镜像中的lvm2相关包,步骤如下:
- 配置本地yum源,详细信息请参考搭建repo服务器。如果已经执行,则可跳过此步。
- 在root权限下执行
yum install lvm2命令安装lvm2。
创建物理卷(sdb为硬盘名称,具体名字以实际为准)。
1pvcreate /dev/sdb创建物理卷组(其中datavg为创建的卷组名称,具体名字以实际规划为准)。
1vgcreate datavg /dev/sdb创建逻辑卷(其中600G为规划的逻辑卷大小,具体大小以实际情况为准;datalv为创建的逻辑卷的名字,具体名称以实际规划为准)。
1lvcreate -L 600G -n datalv datavg创建文件系统。
1mkfs.xfs /dev/datavg/datalv创建数据目录并挂载。
1 2mkdir /data mount /dev/datavg/datalv /data执行命令vi /etc/fstab,编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
其中,/dev/datavg/datalv为示例,具体名称以实际情况为准。

创建数据库目录并且授权
在已创建的数据目录 /data 基础上,使用root权限继续创建进程所需的相关目录并授权MySQL用户(组)。
1 2 3 4mkdir -p /data/mariadb cd /data/mariadb mkdir data tmp run log chown -R mysql:mysql /data
安装、运行和卸载
安装
配置本地yum源,详细信息请参考搭建repo服务器。
清除缓存。
1dnf clean all创建缓存。
1dnf makecache在root权限下安装mariadb服务器。
1dnf install mariadb-server查看安装后的rpm包。
1rpm -qa | grep mariadb
运行
在root权限下开启mariadb服务器。
1systemctl start mariadb在root权限下初始化数据库。
1/usr/bin/mysql_secure_installation命令执行过程中需要输入数据库的root设置的密码,若没有密码则直接按“Enter”。然后根据提示及实际情况进行设置。
登录数据库。
1mysql -u root -p命令执行后提示输入密码。密码为2中设置的密码。
说明:
执行 \q 或者 exit 可退出数据库。
卸载
在root权限下关闭数据库进程。
1 2ps -ef | grep mysql kill -9 进程ID在root权限下执行dnf remove mariadb-server命令卸载mariadb。
1dnf remove mariadb-server
管理数据库用户
创建用户
可以使用CREATE USER语句来创建一个或多个用户,并设置相应的口令。
| |
其中:
- username:用户名。
- host:主机名,即用户连接数据库时所在的主机的名字。若是本地用户可用localhost,若在创建的过程中,未指定主机名,则主机名默认为“%”,表示一组主机。
- password:用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器,但从安全的角度而言,不推荐这种做法。
使用CREATE USER语句必须拥有数据库的INSERT权限或全局CREATE USER权限。
使用CREATE USER语句创建一个用户帐号后,会在系统自身的数据库的user表中添加一条新记录。若创建的帐户已经存在,则语句执行时会出现错误。
新创建的用户拥有的权限很少,只允许进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。
示例
创建密码为123456,用户名为userexample1的本地用户。
| |
创建密码为123456,用户名为userexample2,主机名为192.168.1.100的用户。
| |
查看用户
可以使用SHOW GRANTS语句或SELECT语句查看一个或多个用户。
查看特定用户:
| |
| |
查看所有用户:
| |
其中:
- username:用户名。
- hostname:主机名。
示例
查看userexample1用户。
| |
查看mysql数据库中所有用户。
| |
修改用户
修改用户名
可以使用RENAME USER语句修改一个或多个已经存在的用户名。
| |
其中:
- oldusername:旧的用户名。
- newusername:新的用户名。
- hostname:主机名。
RENAME USER语句用于对原有的帐号进行重命名。若系统中旧帐号不存在或者新帐号已存在,则该语句执行时会出现错误。
使用RENAME USER语句,必须拥有数据库的UPDATE权限或全局CREATE USER权限。
修改用户示例
将用户名userexample1修改为userexapme2,主机名为locahost。
| |
修改用户密码
可以使用SET PASSWORD语句修改一个用户的登录密码。
| |
其中:
- FOR ‘username’@‘hostname’:FOR字句,可选项,指定欲修改密码的用户名及主机名。
- PASSWORD(’newpassword’):表示使用函数PASSWORD()设置新口令,即新口令必须传递到函数PASSWORD()中进行加密。
注意:
PASSWORD()函数为单向加密函数,一旦加密后不能解密出原明文。
在SET PASSWORD语句中,若不加上FOR子句,表示修改当前用户的密码。
FOR字句中必须以’username’@‘hostname’的格式给定,username为帐户的用户名,hostname为帐户的主机名。
欲修改密码的帐号必须在系统中存在,否则语句执行时会出现错误。
修改用户密码示例
将用户名为userexample的密码修改为0123456,主机名为locahost。
| |
删除用户
可以使用DROP USER语句来删除一个或多个用户帐号以及相关的权限。
| |
注意:
用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,因为数据库并不会记录创建了这些对象的帐号。
DROP USER语句可用于删除一个或多个数据库帐号,并删除其原有权限。
使用DROP USER语句必须拥有数据库的DELETE权限或全局CREATE USER权限。
在DROP USER语句的使用中,若没有明确地给出帐号的主机名,则该主机名默认为“%”。
示例
删除用户名为userexample的本地用户。
| |
用户授权
可以使用GRANT语句来对新建用户的授权。
| |
其中:
- ON字句:用于指定权限授予的对象和级别。
- privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所有的权限则使用ALL。
- databasename:数据库名。
- tablename:表名。
- TO字句:用来设定用户密码,以及指定被赋予权限的用户。
- username:用户名。
- hostname:主机名。
如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*。
如果在TO子句中给系统中存在的用户指定密码,则新密码会将原密码覆盖。
如果权限被授予给一个不存在的用户,则会自动执行一条CREATE USER语句来创建这个用户,但同时必须为该用户指定密码。
示例
对本地用户userexample授予SELECT和INSERT权限。
| |
删除用户权限
可以使用REVOKE语句来删除一个用户的权限,但此用户不会被删除。
| |
其中REVOKE语句的参数与GRANT语句的参数含义相同。
要使用 REVOKE 语句,必须拥有数据库的全局CREATE USER权限或UPDATE权限。
示例
删除本地用户userexample的INSERT权限。
| |
管理数据库
创建数据库
可以使用CREATE DATABASE语句来创建数据库。
| |
其中:databasename为数据库名称,且数据库名称不区分大小写。
示例
创建数据库名为databaseexample的数据库。
| |
查看数据库
可以使用SHOW DATABASES语句来查看数据库。
| |
示例
查看所有数据库。
| |
选择数据库
一般创建表,查询表等操作首先需要选择一个目标数据库。可以使用USE语句来选择数据库。
| |
其中:databasename为数据库名称。
示例
选择databaseexample数据库。
| |
删除数据库
可以使用DROP DATABASE语句来删除数据库。
注意:
删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
| |
其中:databasename为数据库名称。
DROP DATABASE命令用于删除创建过(已存在)的数据库,且会删除数据库中的所有表,但数据库的用户权限不会自动删除。
要使用DROP DATABASE,您需要数据库的DROP权限。
DROP SCHEMA是DROP DATABASE的同义词。
示例
删除databaseexample数据库。
| |
备份数据库
可以在root权限下使用mysqldump命令备份数据库。
备份一个或多个表:
| |
备份一个或多个库:
| |
备份所有库:
| |
其中:
- 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中。
| |
备份主机为192.168.202.144,端口为3306,root用户下的db1数据库到db1.sql中。
| |
备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的tb1表到db1tb1.sql中。
| |
只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的表结构到db1.sql中。
| |
只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的数据到db1.sql中。
| |
恢复数据库
可以在root权限下使用mysql命令恢复数据库。
恢复一个或多个表:
| |
其中:
- hostname:主机名。
- portnumber:端口号。
- username:用户名。
- password:密码。
- databasename:数据库名。
- infile:mysqldump命令中的outfile参数。
示例
恢复数据库。
| |
MySQL服务器
软件介绍
**MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品。**MySQL是业界最流行的RDBMS (Relational Database Management System,关系数据库管理系统)之一,尤其在WEB应用方面。
关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就加快了速度并提高了灵活性。
MySQL所使用的SQL语言是用于访问数据库的最常用标准化语言。MySQL软件采用了双授权模式,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择MySQL作为网站数据库。
配置环境
说明:
以下环境配置仅为参考示例,具体配置视实际需求做配置
关闭防火墙并取消开机自启动
说明:
测试环境下通常会关闭防火墙以避免部分网络因素影响,视实际需求做配置。
在root权限下停止防火墙。
1systemctl stop firewalld在root权限下关闭防火墙。
1systemctl disable firewalld说明:
执行disable命令关闭防火墙的同时,也取消了开机自启动。
修改SELINUX为disabled
在root权限下修改配置文件。
1sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
创建组和用户
说明:
服务器环境下,为了系统安全,通常会为进程分配单独的用户,以实现权限隔离。本章节创建的组和用户都是操作系统层面的,不是数据库层面的。
在root权限下创建MySQL用户(组)。
1groupadd mysql1useradd -g mysql mysql在root权限下设置MySQL用户密码。
1passwd mysql重复输入密码(根据实际需求设置密码)。
搭建数据盘
说明:
- 进行性能测试时,数据目录使用单独硬盘,需要对硬盘进行格式化并挂载,参考方法一或者方法二。
- 非性能测试时,在root权限下执行
mkdir /data创建数据目录即可。然后跳过本小节:
方法一:在root权限下使用fdisk进行磁盘管理
创建分区(以/dev/sdb为例,根据实际情况创建)
1fdisk /dev/sdb输入n,按回车确认。
输入p,按回车确认。
输入1,按回车确认。
采用默认配置,按回车确认。
采用默认配置,按回车确认。
输入w,按回车保存。
创建文件系统(以xfs为例,根据实际需求创建文件系统)
1mkfs.xfs /dev/sdb1挂载分区到“/data”以供操作系统使用。
1mkdir /data1mount /dev/sdb1 /data执行命令“vi /etc/fstab", 编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
其中,/dev/nvme0n1p1为示例,具体名称以实际情况为准。

方法二:在root权限下使用LVM进行磁盘管理
说明:
此步骤需要安装镜像中的lvm2相关包,步骤如下:
- 配置本地yum源,详细信息请参考搭建repo服务器。如果已经执行,则可跳过此步。
- 执行
yum install lvm2安装lvm2。
创建物理卷(sdb为硬盘名称,具体名字以实际为准)。
1pvcreate /dev/sdb创建物理卷组(其中datavg为创建的卷组名称,具体名字以实际规划为准)。
1vgcreate datavg /dev/sdb创建逻辑卷(其中600G为规划的逻辑卷大小,具体大小以实际情况为准;datalv为创建的逻辑卷的名字,具体名称以实际规划为准)。
1lvcreate -L 600G -n datalv datavg创建文件系统。
1mkfs.xfs /dev/datavg/datalv创建数据目录并挂载。
1mkdir /data1mount /dev/datavg/datalv /data执行命令vi /etc/fstab,编辑“/etc/fstab”使重启后自动挂载数据盘。如下图中,添加最后一行内容。
其中,/dev/datavg/datalv为示例,具体名称以实际情况为准。

创建数据库目录并且授权
在已创建的数据目录 /data 基础上,使用root权限继续创建进程所需的相关目录并授权MySQL用户(组)。
1 2 3 4mkdir -p /data/mysql cd /data/mysql mkdir data tmp run log chown -R mysql:mysql /data
安装、运行和卸载
安装
配置本地yum源,详细信息请参考搭建repo服务器章节。
清除缓存。
1dnf clean all创建缓存。
1dnf makecache在root权限下安装MySQL服务器。
1dnf install mysql-server查看安装后的rpm包。
1rpm -qa | grep mysql-server
运行
修改配置文件。
在root权限下创建my.cnf文件,其中文件路径(包括软件安装路径basedir、数据路径datadir等)根据实际情况修改。
1vi /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确保my.cnf配置文件修改正确。
1cat /etc/my.cnf
注意:
其中basedir为软件安装路径,请根据实际情况修改。
在root权限下修改/etc/my.cnf文件的组和用户为mysql:mysql
1chown mysql:mysql /etc/my.cnf
配置环境变量。
安装完成后,在root权限下将MySQL二进制文件路径到PATH。
1echo export PATH=$PATH:/usr/local/mysql/bin >> /etc/profile注意:
其中PATH中的“/usr/local/mysql/bin“路径,为MySQL软件安装目录下的bin文件的绝对路径。请根据实际情况修改。
在root权限下使环境变量配置生效。
1source /etc/profile
在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”为初始密码。
启动数据库。
注意:
如果第一次启动数据库服务,以root用户启动数据库,则启动时会提示缺少mysql.log文件而导致失败。使用mysql用户启动之后,会在/data/mysql/log目录下生成mysql.log文件,再次使用root用户启动则不会报错。
在root权限下修改文件权限。
1 2chmod 777 /usr/local/mysql/support-files/mysql.server chown mysql:mysql /var/log/mysql/*在root权限下启动MySQL。
1 2cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysql chkconfig mysql on以mysql用户启动数据库。
1 2su - mysql service mysql start
登录数据库。
说明:
- 提示输入密码时,请输入3产生的初始密码。
- 如果采用官网RPM安装方式,则mysql文件在/usr/bin目录下。登录数据库的命令根据实际情况修改。
1# /usr/local/mysql/bin/mysql -uroot -p -S /data/mysql/run/mysql.sock
配置数据库帐号密码。
登录数据库以后,修改通过root用户登录数据库的密码。
1mysql> alter user 'root'@'localhost' identified by "123456";创建全域root用户(允许root从其他服务器访问)。
1mysql> create user 'root'@'%' identified by '123456';进行授权。
1 2mysql> grant all privileges on *.* to 'root'@'%'; mysql> flush privileges;
退出数据库。
执行 \q 或者 exit 退出数据库。
1mysql> exit
卸载
在root权限下关闭数据库进程。
1 2ps -ef | grep mysql kill -9 进程ID在root权限下执行dnf remove mysql命令卸载MySQL。
1dnf remove mysql
管理数据库用户
创建用户
可以使用CREATE USER语句来创建一个或多个用户,并设置相应的口令。
| |
其中:
- username:用户名。
- host:主机名,即用户连接数据库时所在的主机的名字。若是本地用户可用localhost,若在创建的过程中,未指定主机名,则主机名默认为“%”,表示一组主机。
- password:用户的登录密码,密码可以为空,如果为空则该用户可以不需要密码登录服务器,但从安全的角度而言,不推荐这种做法。
使用CREATE USER语句必须拥有数据库的INSERT权限或全局CREATE USER权限。
使用CREATE USER语句创建一个用户帐号后,会在系统自身的数据库的user表中添加一条新记录。若创建的帐户已经存在,则语句执行时会出现错误。
新创建的用户拥有的权限很少,只允许进行不需要权限的操作,如使用SHOW语句查询所有存储引擎和字符集的列表等。
示例
创建密码为123456,用户名为userexample1的本地用户。
| |
创建密码为123456,用户名为userexample2,主机名为192.168.1.100的用户。
| |
查看用户
可以使用SHOW GRANTS语句或SELECT语句查看一个或多个用户。
查看特定用户:
| |
| |
查看所有用户:
| |
其中:
- username:用户名。
- hostname:主机名。
示例
查看userexample1用户。
| |
查看mysql数据库中所有用户。
| |
修改用户
修改用户名
可以使用RENAME USER语句修改一个或多个已经存在的用户名。
| |
其中:
- oldusername:旧的用户名。
- newusername:新的用户名。
- hostname:主机名。
RENAME USER语句用于对原有的帐号进行重命名。若系统中旧帐号不存在或者新帐号已存在,则该语句执行时会出现错误。
使用RENAME USER语句,必须拥有数据库的UPDATE权限或全局CREATE USER权限。
修改用户示例
将用户名userexample1修改为userexapme2,主机名为locahost。
| |
修改用户密码
可以使用SET PASSWORD语句修改一个用户的登录密码。
| |
其中:
- FOR ‘username’@‘hostname’:FOR字句,可选项,指定欲修改密码的用户名及主机名。
- ’newpassword’:新密码。
在SET PASSWORD语句中,若不加上FOR子句,表示修改当前用户的密码。
FOR字句中必须以’username’@‘hostname’的格式给定,username为帐户的用户名,hostname为帐户的主机名。
欲修改密码的帐号必须在系统中存在,否则语句执行时会出现错误。
修改用户密码示例
将用户名为userexample的密码修改为0123456,主机名为locahost。
| |
删除用户
可以使用DROP USER语句来删除一个或多个用户帐号以及相关的权限。
| |
注意:
用户的删除不会影响他们之前所创建的表、索引或其他数据库对象,因为数据库并不会记录创建了这些对象的帐号。
DROP USER语句可用于删除一个或多个数据库帐号,并删除其原有权限。
使用DROP USER语句必须拥有数据库的DELETE权限或全局CREATE USER权限。
在DROP USER语句的使用中,若没有明确地给出帐号的主机名,则该主机名默认为“%”。
示例
删除用户名为userexample的本地用户。
| |
用户授权
可以使用GRANT语句来对新建用户的授权。
| |
其中:
- ON字句:用于指定权限授予的对象和级别。
- privileges:用户的操作权限,如SELECT,INSERT,UPDATE等,如果要授予所有的权限则使用ALL。
- databasename:数据库名。
- tablename:表名。
- TO字句:用来设定用户密码,以及指定被赋予权限的用户。
- username:用户名。
- hostname:主机名。
如果要授予该用户对所有数据库和表的相应操作权限则可用表示,如.*。
如果在TO子句中给系统中存在的用户指定密码,则新密码会将原密码覆盖。
如果权限被授予给一个不存在的用户,则会自动执行一条CREATE USER语句来创建这个用户,但同时必须为该用户指定密码。
示例
对本地用户userexample授予SELECT和INSERT权限。
| |
删除用户权限
可以使用REVOKE语句来删除一个用户的权限,但此用户不会被删除。
| |
其中REVOKE语句的参数与GRANT语句的参数含义相同。
要使用 REVOKE 语句,必须拥有数据库的全局CREATE USER权限或UPDATE权限。
示例
删除本地用户userexample的INSERT权限。
| |
管理数据库
创建数据库
可以使用CREATE DATABASE语句来创建数据库。
| |
其中:databasename为数据库名称,且数据库名称不区分大小写。
示例
创建数据库名为databaseexample的数据库。
| |
查看数据库
可以使用SHOW DATABASES语句来查看数据库。
| |
示例
查看所有数据库。
| |
选择数据库
一般创建表,查询表等操作首先需要选择一个目标数据库。可以使用USE语句来选择数据库。
| |
其中:databasename为数据库名称。
示例
选择databaseexample数据库。
| |
删除数据库
可以使用DROP DATABASE语句来删除数据库。
注意:
删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
| |
其中:databasename为数据库名称。
DROP DATABASE命令用于删除创建过(已存在)的数据库,且会删除数据库中的所有表,但数据库的用户权限不会自动删除。
要使用DROP DATABASE,您需要数据库的DROP权限。
DROP SCHEMA是DROP DATABASE的同义词。
示例
删除databaseexample数据库。
| |
备份数据库
可以在root权限下使用mysqldump命令备份数据库。
备份一个或多个表:
| |
备份一个或多个库:
| |
备份所有库:
| |
其中:
- 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中。
| |
备份主机为192.168.202.144,端口为3306,root用户下的db1数据库到db1.sql中。
| |
备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的tb1表到db1tb1.sql中。
| |
只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的表结构到db1.sql中。
| |
只备份主机为192.168.202.144,端口为3306,root用户下的db1数据库的数据到db1.sql中。
| |
恢复数据库
可以在root权限下使用mysql命令恢复数据库。
恢复一个或多个表:
| |
其中:
- hostname:主机名。
- portnumber:端口号。
- username:用户名。
- password:密码。
- databasename:数据库名。
- infile:mysqldump命令中的outfile参数。
示例
恢复数据库。
| |
openGauss服务器
软件介绍
openGauss是一款开源关系型数据库管理系统,采用木兰宽松许可证v2发行。openGauss内核深度融合华为在数据库领域多年的经验,结合企业级场景需求,持续构建竞争力特性。
安装
安装指南请参见《openGauss rpm安装》。
管理数据库角色
创建角色
可以使用CREATE ROLE语句来创建角色,在数据库界面执行。
| |
其中:
- 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。
| |
创建一个角色,从2015年1月1日开始生效,到2026年1月1日失效。
| |
查看角色
可以使用SELECT语句或gsql的元命令du或者du+查看角色。
| |
| |
| |
示例
查看所有角色名包括内置角色。
| |
查看现有角色不包含内置角色。
| |
修改角色
修改用户名
可以使用ALTER ROLE语句修改一个已经存在的角色名。
| |
其中:
- oldrolename:旧的角色名。
- newrolename:新的角色名。
修改用户示例
将角色名manager修改为newmanager。
| |
修改用户密码
可以使用ALTER ROLE语句修改一个角色的登录密码。
| |
其中:
- rolename:角色名。
- password:密码。
修改角色密码示例
将manager的密码修改为xxxxxxxxx。
| |
删除角色
可以使用DROP ROLE语句来删除角色。在数据库界面执行。
| |
其中:rolename为角色名。
示例
删除manager角色。
| |
角色授权
可以使用GRANT语句来对角色授权。
对角色授予表或视图的操作权限:
| |
对角色授予序列的操作权限:
| |
对角色授予数据库的操作权限:
| |
对角色授予函数的操作权限:
| |
对角色授予过程语言的操作权限:
| |
将模式的访问权限赋予指定的角色:
| |
对角色授予表空间的操作权限:
| |
将角色rolename1的成员关系赋予角色rolename2:
| |
其中:
- 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权限。·
| |
对所有用户授予表table1的所有权限。
| |
删除用户权限
可以使用REVOKE语句来撤销一个或多个角色的权限。
撤销角色对表的操作权限:
| |
撤销角色对序列的操作权限:
| |
撤销角色对数据库的操作权限:
| |
撤销角色对函数的操作权限:
| |
撤销角色对过程语言的操作权限:
| |
撤销角色对模式的操作权限:
| |
撤销角色对表空间的操作权限:
| |
删除rolename2的rolename1之间的成员关系:
| |
其中:
- 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权限。
| |
对所有用户撤销表table1的所有权限。
| |
管理数据库
创建数据库
可以使用CREATE DATABASE语句来创建数据库。在数据库界面使用。
| |
其中:databasename为数据库名。
要使用这条命令,必须拥有CREATEDB权限。
示例
创建一个数据库database1。
| |
选择数据库
可以使用\c语句来选择数据库。
| |
其中:databasename为数据库名称。
示例
选择database_example数据库。
| |
查看数据库
可以使用\l语句来查看数据库。
| |
示例
查看所有数据库。
| |
删除数据库
可以使用DROP DATABASE语句来删除数据库。
注意:
删除数据库要谨慎操作,一旦删除,数据库中的所有表和数据都会删除。
| |
其中:databasename为数据库名称。
DROP DATABASE会删除数据库的系统目录项并且删除包含数据的文件目录。
DROP DATABASE只能由超级管理员或数据库管理者执行。
示例
删除databaseexample数据库。
| |
备份数据库
gs_dump支持将数据库信息导出至纯文本格式的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:不出现输入密码提示。如果主机要求密码认证并且密码没有通过其它形式给出,则连接尝试将会失败。 该选项在批量工作和不存在用户输入密码的脚本中很有帮助。
- -F, –format=c|d|t|p:选择输出格式。格式如下:
示例
执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.sql文件格式为纯文本格式。
| |
执行gs_dump,导出postgres数据库全量信息,导出的MPPDB_backup.dmp文件格式为自定义归档格式。
| |
恢复数据库
gs_restore是openGauss提供的针对gs_dump导出数据的导入工具。通过此工具可将由gs_dump生成的导出文件进行导入。
| |
其中:
- 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数据库。
| |
网卡无法启动
| |
管理RPM包
RPM的全名是Red Hat Package Manager,本意是Red Hat 软件包管理。在openEuler、Fedora 、Redhat、Mandriva、SuSE、YellowDog等主流发行版本,以及在这些版本基础上二次开发出来的发行版采用。
RPM以数据库记录的方式将需要的软件安装到Linux主机的一套管理程序,特点是将要安装的软件先编译并打包,通过包装好的软件中默认的数据库记录,记录这个软件在安装的时候需要的依赖属性模块,在用户的Linux主机安装时,RPM会先根据软件里的记录数据,查询Linux主机的依赖属性软件是否满足:
- 若满足则予以安装。
- 若不满足则不安装。
安装时将该软件的信息全部写入RPM的数据库中以便后续查询、验证与卸载。

- rpm包默认安装路径
通常情况下,RPM采用系统默认的安装路径(默认安装路径可以通过命令查询,后续章节中将会详细介绍),所有安装文件都会按照类别分散到如下表格所示的目录中。
表 1 RPM安装路径及其含义
| 安装路径 | 含义 |
|---|---|
| /etc/ | 配置文件安装目录。 |
| /usr/bin/ | 可执行命令安装目录。 |
| /usr/lib/ | 程序所使用的函数库保存位置。 |
| /usr/share/doc | 基本软件使用手册保存位置。 |
| /usr/share/man/ | 帮助文件保存位置。 |
注意: RPM包支持手动指定安装路径,但此方式不推荐使用。通过手动指定安装路径后,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需手动配置才能被系统识别)。
RPM 包的常用操作命令
| |
rpm命令选项
操作1. 软件包RPM签名检查
Linux机器安装RPM包之前,需要检查PGP签名,确保签名的完整性和来源无问题后,使用RPM命令中的以下选项来验证有效性。
| |
操作2. 安装RPM包
Linux系统中安装RPM包时,请在rpm命令中使用 -i 选项。
| |
- -i : 安装软件包
- -v: 详细信息
- -h: 套件安装时列出标记
操作3. 查询已安装的RPM包
查询Linux系统中已经安装的RPM包(dnf),可以在rpm命令中使用 -q 选项。
| |
- -q: 查询操作
如果系统未安装给定的包,会出现以下错误信息。
| |
操作4. 查询所有已安装的RPM包
查询Linux系统中安装的所有RPM包,请在rpm命令中使用 -qa 选项。
| |
注意:一般在使用 -qa 选项时,会配合管道符 “|” 一起使用,提升查找的准确率。
操作5. 查看已安装的RPM包详细信息
在rpm命令中使用 -qi 选项来验证系统中安装的RPM包的详细信息。
| |
操作6. 查看未安装的RPM包所有文件
查看未安装的RPM包的文件列表,可以在rpm命令中使用 -qlp 选项。
| |
操作7. 查看未安装的RPM包依赖项
查看未安装的RPM包编译的依赖包列表,可以在rpm命令中使用 -qRp 选项。
| |
操作8. 验证所有已安装的RPM包
验证已安装的RPM包时,将包中安装的文件信息与rpm数据库中存储的包元数据中获取的文件的信息进行比较,可以通过在rpm命令中使用 -Va 选项。
| |
rpm -Va命令相关输出字段及其含义:
| 字段 | 含义 |
|---|---|
| S | 文件长度发生变化。 |
| M | 文件的访问权限或文件类型发生变化。 |
| 5 | MD5校验和发生变化。 |
| D | 设备节点的属性发生变化。 |
| L | 文件的符号链接发生变化。 |
| U | 文件/子目录/ 设备节点的owner发生变化。 |
| G | 文件/子目录/ 设备节点的group发生变化。 |
| T | 文件最后一次的修改时间发生变化。 |
操作9. 查看特定文件的RPM包
在Linux上找到一个提供特定二进制文件的RPM包,可以在rpm命令中使用 -qf 选项。
| |
操作10. 查看已安装RPM包中的文件
查看特定RPM包的安装文件列表,可以在rpm命令中使用 -ql 选项。
| |
操作11. 查看最近安装的RPM包
Linux是一个多用户操作系统,在使用过程中,其他用户可能已经安装了部分软件包。如需在系统中找到最近安装的包,可以在rpm命令中使用 -qa –last 选项。
| |
操作12. 只查看已安装RPM包的文档
可以从Linux Man页面获得任何命令的帮助(/usr/share/doc/Package_Name-Version_Number/docs* 文档存放路径),查看安装的RPM包相关联的文档列表,请在rpm命令中使用 -qdf 选项,并输入二进制文件路径。
| |
操作13. 升级已安装的RPM包
通过使用 -Uvh 选项和rpm命令,可以轻松地将已经安装的rpm包升级到最新版本。
| |
注意:升级安装的RPM包时,会删除旧RPM包,安装新RPM包。
操作14. 移除已安装的RPM包
删除安装在系统上的rpm包,请在rpm命令中使用 -ev 或 -e 选项。
| |
操作15. 重建损坏的RPM数据库
在尝试使用yum update命令更新系统时,可能会收到一条错误消息(RPM数据库已损坏),如果收到该信息,请在RPM命令中使用 –rebuilddb 选项。
| |
操作16. 检查特定包的漏洞是否已修复
可以通过在rpm命令中使用 –changelog 选项并输入相应的CVE来实现。
| |
操作17. 导入RPM GPG密钥
默认情况下,当向Linux系统添加新的存储库时,GPG密钥将自动导入。同时,也可在RPM命令中添加**–import** 手动导入RPM GPG密钥,用于从存储库下载时检查包的完整性。
| |
配置SSH
- SSH服务介绍
SSH(Secure Shell)**是目前较可靠,专为远程登录会话和其他网络服务**提供安全性保障的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。透过SSH可以对所有传输的数据进行加密,并防止DNS欺骗和IP欺骗。OpenSSH是SSH协议的免费开源实现。
- 配置SSH服务
| |
- SSH服务配置文件主要选项
| |
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
nmcli 是 NetworkManager 的命令行管理工具,它让你能完全通过命令来查询、配置和控制Linux系统的网络连接,非常适合服务器、远程终端或无图形界面的环境。
它的设计哲学是“一个工具,完成所有”,替代了传统的 ifconfig、route 和手动编辑 /etc/network/interfaces 或 /etc/sysconfig/network-scripts/ 下配置文件的方式,提供了更统一、强大的管理方式。
🔧 使用 nmcli 配置静态 IP(有线连接)
这是最常用的场景。假设你要为网卡 enp3s0(请用 ip addr 或 nmcli device status 确认你的实际网卡名)配置静态IP。
核心思路是:修改(或新建)一个与该网卡绑定的“连接”。在 NetworkManager 里,“设备”是物理网卡,“连接”是配置方案,一个设备可以有多个连接配置,但一次只能激活一个。
以下是两种最清晰、可靠的方法:
方法一:直接修改现有连接(推荐,最直接)
此方法直接修改当前活跃的连接配置。
| |
方法二:新建一个连接配置
如果不想改动原配置,或想保留多套配置方案,可以新建连接。
| |
关键参数解释:
ipv4.addresses "192.168.1.100/24":设置IP地址和子网掩码(/24即255.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 shownmcli connection show "连接名" | 列出所有连接配置,或查看某个配置的详细信息。 |
| 启用/禁用连接 | sudo nmcli connection up "连接名"sudo nmcli connection down "连接名" | 激活或停用一个连接配置。 |
| 连接 WiFi | nmcli device wifi listnmcli 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 退出。 |
重要提示:
- 连接名(con-name):操作时,通常使用你在图形界面或命令中设置的**“连接名”**,而不是设备名。用
nmcli connection show查看。 - 生效与持久化:
nmcli的配置修改是即时生效且自动持久化的,配置会保存到/etc/NetworkManager/system-connections/目录下。 - 排错:如果配置后网络不通,按顺序检查:
ip addr show确认IP是否配置上。ping 网关IP检查局域网。ping 8.8.8.8检查外网。nslookup baidu.com检查DNS。
使用nmcli命令
说明:
使用nmcli命令配置的网络配置可以立即生效且系统重启后配置也不会丢失。
nmcli介绍
nmcli是NetworkManager的一个命令行工具,它提供了使用命令行配置由NetworkManager管理网络连接的方法。nmcli命令的基本格式为:
| |
其中,OBJECT选项可以是general、networking、radio、connection或device等。在日常使用中,最常使用的是-t, –terse(用于脚本)、-p, –pretty选项(用于用户)及-h, –help选项,用户可以使用“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将连接到对应网络设备,尝试找到合适的连接配置,并激活配置。
| |
如果不存在相应的配置连接,NetworkManager将创建并激活具有默认设置的新配置文件。
断开设备连接
使用如下命令,NetworkManager将断开设备连接,并防止设备自动激活。
| |
设置网络连接
列出目前可用的网络连接:
| |
说明:
输出结果中的NAME字段代表连接ID(名称)。
添加一个网络连接会生成相应的配置文件,并与相应的设备关联。检查可用的设备,方法如下:
| |
配置动态IP连接
配置IP
要使用 DHCP 分配网络时,可以使用动态IP配置添加网络配置文件,命令格式如下:
| |
例如创建名为net-test的动态连接配置文件,在root权限下使用以下命令:
| |
NetworkManager 会将参数 connection.autoconnect 设定为 yes,并将设置保存到 “/etc/sysconfig/network-scripts/ifcfg-net-test”文件中,在该文件中会将 ONBOOT 设置为 yes。
激活连接并检查状态
在root权限下使用以下命令激活网络连接:
| |
检查这些设备及连接的状态,使用以下命令:
| |
配置静态IP连接
配置IP
添加静态 IPv4 配置的网络连接,可使用以下命令:
| |
说明:
如果要添加 IPv6 地址和网关信息,使用 ip6 和 gw6 选项。
例如创建名为 net-static的静态连接配置文件,在root权限下使用以下命令:
| |
还可为该设备同时指定 IPv6 地址和网关,示例如下:
| |
NetworkManager 会将其内部参数 ipv4.method 设定为 manual,将 connection.autoconnect 设定为yes,并将设置写入 /etc/sysconfig/network-scripts/ifcfg-net-static 文件,其中会将对应 BOOTPROTO 设定为 none,将 ONBOOT 设定为 yes。
设定两个 IPv4 DNS 服务器地址,在root权限下使用以下命令:
| |
设置两个 IPv6 DNS 服务器地址,在root权限下使用以下命令:
| |
激活连接并检查状态
激活新的网络连接,在root权限下使用以下命令:
| |
检查这些设备及连接的状态,使用以下命令:
| |
查看配置的连接详情,使用以下命令(使用 -p,–pretty 选项在输出结果中添加标题和分段):
| |
添加 Wi-Fi 连接
有两种方式添加Wi-Fi 连接。
方法1. 通过网络接口连接wifi
连接到由SSID或BSSID指定的wifi网络。命令如下,该命令找到匹配的连接或创建一个连接,然后在设备上激活它。
| |
方法2. 通过配置文件连接Wi-Fi
1,使用以下命令查看可用 Wi-Fi 访问点:
| |
2,使用以下命令生成使用的静态 IP 配置,但允许自动 DNS 地址分配的 Wi-Fi 连接:
| |
3,请使用以下命令设定 WPA2 密码,例如 “answer”:
| |
4,使用以下命令更改 Wi-Fi 状态:
| |
更改属性
请使用以下命令检查具体属性,比如 mtu:
| |
使用如下命令更改设置的属性:
| |
使用如下命令确认更改:
| |
配置静态路由
使用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 为网卡名称。
| |
配置静态地址
在root权限下,配置静态IP地址,使用示例如下:
| |
查看配置结果,在root权限使用如下命令:
| |
配置多个地址
ip 命令支持为同一接口分配多个地址,可在root权限下重复多次使用 ip 命令实现分配多个地址。使用示例如下:
| |
配置静态路由
如果需要静态路由,可使用 ip route add 命令在路由表中添加,使用 ip route del 命令删除。最常使用的 ip route 命令格式如下:
| |
在root权限下使用 ip route 命令显示当前的 IP 路由表。示例如下:
| |
在主机地址中添加一个静态路由,在 root 权限下,使用以下命令格式:
| |
其中 192.168.2.1 是用点分隔的十进制符号中的 IP 地址,10.0.0.1 是下一个跃点,interface-name 是进入下一个跃点的退出接口。
要在网络中添加一个静态路由,即代表 IP 地址范围的 IP 地址,请在root权限下运行以下命令格式:
| |
其中 192.168.2.1 是目标网络的 IP 地址,10.0.0.1 是网络前缀,interface-name 为网卡名称。
配置网络
配置IP地址
使用IP命令为接口配置地址,interface-name为网卡名称。
1ip addr [ add | del ] address dev interface-name配置静态地址
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配置静态路由
静态路由,可使用
ip route add命令在路由表中添加,使用ip route del命令删除。常用的ip route命令格式如下:1ip route [ add | del | change | append | replace ] destination-address- 在主机地址中添加一个静态路由,在 root 权限下,使用以下命令格式:
1ip route add 192.168.2.1 via 10.0.0.1 [dev interface-name]- 在网络中添加一个静态路由,在root权限下运行以下命令格式:
1ip route add 192.168.2.0/24 via 10.0.0.1 [dev interface-name]通过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 17TYPE=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的文件中,修改参数配置,示例如下:
| |
配置动态网络
要通过ifcfg文件为em1接口配置动态网络,请按照如下操作在/etc/sysconfig/network-scripts/目录中生成名为 ifcfg-em1 的文件,示例如下:
| |
要配置一个向DHCP服务器发送不同的主机名的接口,请在ifcfg文件中新增一行内容,如下所示:
| |
要配置忽略由DHCP服务器发送的路由,防止网络服务使用从DHCP服务器接收的DNS服务器更新/etc/resolv.conf。请在ifcfg文件中新增一行内容,如下所示:
| |
要配置一个接口使用具体DNS服务器,请将参数PEERDNS=no,并在ifcfg文件中添加以下行:
| |
其中ip-address是DNS服务器的地址。这样就会让网络服务使用指定的DNS服务器更新/etc/resolv.conf。
配置默认网关
在确定默认网关时,首先解析 /etc/sysconfig/network 文件,然后解析 ifcfg 文件 ,将最后读取的 GATEWAY 的取值作为路由表中的默认路由。
在动态网络环境中,使用 NetworkManager 管理主机时,建议设置为由 DHCP 来分配。
通过 nmtui 工具
nmtui 工具提供了一个交互式的界面,可以用来配置网络连接。要使用 nmtui 工具,以 root 权限执行以下命令:
| |
选择 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配置主机名
查看所有主机名
查看当前的主机名,使用如下命令:
| |
说明:
如果命令未指定任何选项,则默认使用status选项。
设定所有主机名
在root权限下,设定系统中的所有主机名,使用如下命令:
| |
设定特定主机名
在root权限下,通过不同的参数来设定特定主机名,使用如下命令:
| |
其中option可以是–pretty、–static、–transient中的一个或多个选项。
如果–static或–transient与–pretty选项一同使用时,则会将static和transient主机名简化为pretty主机名格式,使用“-”替换空格,并删除特殊字符。
当设定pretty主机名时,如果主机名中包含空格或单引号,需要使用引号。命令示例如下:
| |
清除特定主机名
要清除特定主机名,并将其还原为默认形式,在root权限下,使用如下命令:
| |
其中 "" 是空白字符串,option是–pretty、–static和–transient中的一个或多个选项。
远程更改主机名
在远程系统中运行hostnamectl命令时,要使用-H,–host 选项,在root权限下使用如下命令:
| |
其中hostname是要配置的远程主机,username为自选项,new_hostname为新主机名。hostnamectl会通过SSH连接到远程系统。
使用nmcli配置主机名
查询static主机名,使用如下命令:
| |
在root权限下,将static主机名设定为host-server,使用如下命令:
| |
要让系统hostnamectl感知到static主机名的更改,在root权限下,重启hostnamed服务,使用如下命令:
| |
通过 nmtui 工具
nmtui 提供了一个交互式的界面,可以用来配置网络连接。要使用 nmtui 工具,以 root 权限执行以下命令:
| |
选择 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[“验证绑定状态与故障切换”]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)。
| |
关键参数详解:
type bond:创建类型为“bond”的连接。con-name bond0 ifname bond0:连接名和设备名都设为bond0。bond.options:绑定的核心选项。mode=active-backup:设置为主备模式(故障切换)。miimon=100:每100毫秒检查一次链路状态,是实现快速切换的关键。
- 其余为标准的静态IP配置。
步骤2:将物理网卡添加为“从属接口”(Slave)
将两块物理网卡(例如 eth1 和 eth2)挂载到刚创建的 bond0 上。
| |
参数解释:
type ethernet:连接类型是以太网。slave-type bond:指定从属类型为bond。master bond0:指明主设备是bond0。
步骤3:激活所有连接
激活绑定连接,它会自动激活其从属连接。
| |
验证与状态查看
配置后,务必进行验证。
查看绑定状态:
1cat /proc/net/bonding/bond0输出会详细显示绑定模式、当前活动接口、所有从接口状态及链路检查计数,这是最重要的诊断文件。
查看网络设备状态:
1nmcli device status确认
bond0为“已连接”,eth1、eth2为“已连接”且显示为bond0的从属。测试故障切换:
- 在持续ping服务器IP(例如
ping 192.168.1.50 -t)的同时,断开eth1的网线。 - 观察ping日志,应该只丢1-2个包(约
miimon设置的时间)就恢复,表示切换成功。 - 查看
/proc/net/bonding/bond0,会显示当前活动接口已变为eth2。
- 在持续ping服务器IP(例如
其他常用绑定模式简介
除了 active-backup,bond.options 中的 mode 参数还可以设置为其他模式以满足不同需求:
| 模式 | 名称 | 特点 | 交换机要求 |
|---|---|---|---|
balance-rr | 轮询 | 出站流量轮流使用所有网卡,可负载均衡和聚合带宽。 | 无需特殊配置。 |
balance-xor | XOR哈希 | 基于源/目IP和端口哈希选择网卡,保证同一会话流量走同一链路。 | 无需特殊配置。 |
802.3ad | LACP动态聚合 | 行业标准,能动态聚合链路并提供带宽聚合与容错。 | 必须支持并配置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)
| |
nmcli con up mybond0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/16)
| |
modprobe –first-time bonding
| |
modinfo bonding
| |
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”
| |
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
| |
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)
| |
nmcli con load /etc/sysconfig/network-scripts/ifcfg-device
| |
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
| |
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”
| |
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
| |
dhclient -6
| |
option dhcp6.vendor-class code 16 = {integer 32, integer 16, string};
interface “enp3s0” {
send dhcp6.vendor-class
| |
dhclient -6
| |
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; } }
| |
dhcpd -6 -cf /etc/dhcp/dhcpd6.conf
| |
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 */
};
| |
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));
| |
BOOTPROTO=none|bootp|dhcp DHCPV6C=yes|no PERSISTENT_DHCLIENT=yes|no|1|0
| |
ip link set IFNAME mtu MTU
| |
ip [-6] addr add IFADDR dev IFNAME
| |
ip [-6] addr add IFADDR dev IFNAME [home|nodad]
| |
ip [-6] addr del IFADDR dev IFNAME
| |
ip [-6] addr show dev IFNAME [tentative|-tentative|deprecated|-deprecated|dadfailed|-dadfailed|temporary]
| |
ip [-6] route add ROUTE [mtu lock MTU]
| |
ip [-6] route del ROUTE
| |
ip [-6] rule list
| |
ip [-6] rule [add|del] [from|to] ADDR table TABLE pref PREF
| |
ip a add/del 192:168::18:X/64 dev DEVICE
| |
ActionQueueType Direct
MainMsgQueueType Direct
| |

在命令的输出信息中,各字段所代表的含义如下:
| 字段 | 含义 |
|---|---|
| procs | 进程信息字段。 |
| memory | 内存信息字段。 |
| swap | 交换分区信息字段。 |
| io | 磁盘读/写信息字段。 |
| system | 系统信息字段。 |
| cpu | CPU信息字段。-us:非内核进程消耗 CPU 运算时间的百分比。-sy:内核进程消耗 CPU 运算时间的百分比。-id:空闲。-wa:等待 I/O 所消耗的 CPU 百分比。-st:被虚拟机所盗用的 CPU 百分比。 |
ps:可用于查看正在运行的进程。
1 2# 查看系统中所有的进程,以及查看进程的父进程的 PID 和进程优先级 ps -le
1 2# 查看当前shell产生的进程 ps -l
top:可以动态地持续监听进程的运行状态,显示最消耗CPU的进程。
1top
vim/vi 文本编辑器
1)常用快捷键:
(在一般模式下使用):
| |
2)查找并替换
1 显示行号 :set nu
2 隐藏行号::set nonu
3 查找关键字 :/you ## 效果:查找文件中出现的you,并定位到第一个找到的地方,按n可以定位到下一个匹配位置(按N定位到上一个)
4 替换操作 :s/sad/bbb 查找光标所在行的第一个sad,替换为bbb
| |
head 显示文件内容头部
| |
tail 显示文件内容尾部
| |
windows永恒之蓝测试
在CMD窗口下,输入如下命令:netstat –ano | findstr “445”,找出相关进程号,其中SYN_SENT状态,很显然,该电脑被感染永恒之蓝病毒了
找出相关进程号对应的进程,在cmd下输入tasklist | findstr 20164,看看是哪个进程产生该数据包
打开任务管理器,找到相应的进程,先打开文件位置,然后结束进程
Cockpit 是什么具体解释:
| |
这条命令的作用是启用并立即启动 Cockpit Web 控制台的按需监听服务。
1. Cockpit 是什么?
- Cockpit 是一个基于 Web 的 Linux 服务器管理界面
- 可通过浏览器(端口 9090)管理服务器:监控系统状态、管理服务、配置网络、查看日志等
2. cockpit.socket 的特殊性
- 这是 Socket 激活(Socket Activation) 方式
- 与传统服务不同:
- 普通服务:
cockpit.service会一直运行 - Socket 服务:
cockpit.socket只监听端口,当有连接请求时才启动服务
- 普通服务:
3. 命令执行的具体效果:
| |
enable:设置开机自动启动--now:立即启动(无需重启系统)- 结果:
- 系统开始监听 9090 端口
- 当用户通过浏览器访问时,才启动 cockpit 服务
- 空闲一段时间后,服务会自动停止(节省资源)
4. 与传统启动方式的对比:
| |
5. 验证命令:
| |
6. 访问方式:
- 浏览器访问:
https://你的服务器IP:9090 - 使用系统账户密码登录
7. 关闭/禁用方法:
| |
优点:Socket 激活方式更节省资源,特别适合不经常使用的管理界面。
ubuntu拓荒指南
1.ubuntu上报E: Unable to locate package update错误的解决方法
| |
[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命令未发现
| |
用户管理及权限、用户授权,登陆相关命令
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状态,传输类型等;
微信