Linux管理员指南 -红旗Asianux服务器操作系统 v8.1 openEuler版
1 查看系统信息
查看系统信息,命令如下:
$ cat /etc/os-release
例如,命令和输出如下:
$ cat /etc/os-release
NAME="redflag asianux"
VERSION="8.1(openEuler)"
ID="redflag"
VERSION_ID="8.1"
PRETTY_NAME="redflag asianux 8.1 (openEuler)"
ANSI_COLOR="0;31"
查看系统相关的资源信息。
查看CPU信息,命令如下:
$ lscpu
查看内存信息,命令如下:
$ free
查看磁盘信息,命令如下:
$ fdisk -l
查看系统资源实时信息,命令如下:
$ top
2 基础配置
5.2.1 设置语言环境
您可以通过localectl修改系统的语言环境,对应的参数设置保存在/etc/locale.conf文件中。这些参数会在系统启动过程中被systemd的守护进程读取。
5.2.1.1 显示当前语言环境状态
显示当前语言环境,命令如下:
$ localectl status
例如显示系统当前的设置,命令和输出如下:
$ localectl status
System Locale:.UTF-8
VC Keymap: cn
X11 Layout: cn
5.2.1.2 列出可用的语言环境
显示当前可用的语言环境,命令如下:
$ localectl list-locales
例如显示当前系统中所有可用的中文环境,命令和输出如下:
$ localectl list-locales | grep zh
zh_CN.UTF-8
5.2.1.3 设置语言环境
要设置语言环境,在root权限下执行如下命令,其中 locale 是您要设置的语言类型,取值范围可通过localectl list-locales获取,请根据实际情况修改。
# localectl set-locale
例如设置为简体中文语言环境,在root权限下执行如下命令:
# localectl set-locale.UTF-8
说明:修改后需要重新登录或者在root权限下执行source /etc/locale.conf命令刷新配置文件,使修改生效。
5.2.2 设置键盘
您可以通过localectl修改系统的键盘设置,对应的参数设置保存在/etc/locale.conf文件中。这些参数,会在系统启动的早期被systemd的守护进程读取。
5.2.2.1 显示当前设置
显示当前键盘设置,命令如下:
$ localectl status
例如显示系统当前的设置,命令和输出如下:
$ localectl status
System Locale:.UTF-8
VC Keymap: cn
X11 Layout: cn
5.2.2.2 列出可用的键盘布局
显示当前可用的键盘布局,命令如下:
$ localectl list-keymaps
例如显示系统当前的中文键盘布局,命令和输出如下:
$ localectl list-keymaps | grep cn
cn
5.2.2.3 设置键盘布局
设置键盘布局,在root权限下执行如下命令,其中 map 是您想要设置的键盘类型,取值范围可通过localectl list-keymaps获取,请根据实际情况修改:
# localectl set-keymap map
此时设置的键盘布局同样也会应用到图形界面中。
设置完成后,查看当前状态:
$ localectl status
System Locale:.UTF-8
VC Keymap: cn
X11 Layout: us
5.2.3 设置日期和时间
本节介绍如何通过timedatectl、date、hwclock命令来设置系统的日期、时间和时区等。
5.2.3.1 使用timedatectl命令设置
1.显示日期和时间
显示当前的日期和时间,命令如下:
$ timedatectl
例如显示系统当前的日期和时间,命令和输出如下:
$ timedatectl
Local time: Mon 2020-09-30 04:05:00 EDT
Universal time: Mon 2020-09-30 08:05:00 UTC
RTC time: Mon 2020-09-30 08:05:00
Time zone: America/New_York (EDT, -0400)
System clock synchronized: no
NTP service: inactive
RTC in local TZ: no
2.通过远程服务器进行时间同步
您可以启用NTP远程服务器进行系统时钟的自动同步。是否启用NTP,可在root权限下执行如下命令进行设置。其中 boolean 可取值yes和no,分别表示启用和不启用NTP进行系统时钟自动同步,请根据实际情况修改。
说明:若启用了NTP远程服务器进行系统时钟自动同步,则不能手动修改日期和时间。若需要手动修改日期或时间,则需确保已经关闭NTP系统时钟自动同步。可执行timedatectl set-ntp no命令进行关闭。
# timedatectl set-ntp boolean
例如开启自动远程时间同步,命令如下:
# timedatectl set-ntp yes
3.修改日期
说明:修改日期前,请确保已经关闭NTP系统时钟自动同步。
修改当前的日期,在root权限下执行如下命令,其中 YYYY 代表年份,MM 代表月份,DD 代表某天,请根据实际情况修改:
# timedatectl set-time YYYY-MM-DD
例如修改当前的日期为2020年4月24号,命令如下:
# timedatectl set-time '2020-04-24'
4.修改时间
说明:修改时间前,请确保已经关闭NTP系统时钟自动同步。
修改当前的时间,在root权限下执行如下命令,其中 HH 代表小时,MM 代表分钟,SS 代表秒,请根据实际情况修改:
# timedatectl set-time HH:MM:SS
例如修改当前的时间为15点57分24秒,命令如下:
# timedatectl set-time 15:57:24
5.修改时区
显示当前可用时区,命令如下:
$ timedatectl list-timezones
要修改当前的时区,在root权限下执行如下命令,其中 time_zone 是您想要设置的时区,请根据实际情况修改:
# timedatectl set-timezone time_zone
例如修改当前的时区,首先查询所在地域的可用时区,此处以Asia为例:
# timedatectl list-timezones | grep Asia
Asia/Aden
Asia/Almaty
Asia/Amman
Asia/Anadyr
Asia/Aqtau
Asia/Aqtobe
Asia/Ashgabat
Asia/Baghdad
Asia/Bahrain
……
Asia/Seoul
Asia/Shanghai
Asia/Singapore
Asia/Srednekolymsk
Asia/Taipei
Asia/Tashkent
Asia/Tbilisi
Asia/Tehran
Asia/Thimphu
Asia/Tokyo
然后修改当前的时区为“Asia/Shanghai”,命令如下:
# timedatectl set-timezone Asia/Shanghai
5.2.3.2 使用date命令设置
1.显示当前的日期和时间
显示当前的日期和时间,命令如下:
$ date
默认情况下,date命令显示本地时间。要显示UTC时间,添加--utc或-u参数:
$ date --utc
要自定义对应的输出信息格式,添加 +"format" 参数:
$ date +"format"
表1 参数说明
实际使用示例如下:
显示当前的日期和本地时间。
$ date
2020年 04月 24日 星期六 17:26:34 CST
显示当前的日期和UTC时间。
$ date --utc
2020年 04月 24日 星期六 09:26:18 UTC
自定义date命令的输出。
$ date +"%Y-%m-%d %H:%M"
2020-04-24 17:24
2.修改时间
要修改当前的时间,添加--set或者-s参数。在root权限下执行如下命令,其中 HH 代表小时,MM 代表分钟,SS 代表秒,请根据实际情况修改:
# date --set HH:MM:SS
默认情况下, date命令设置本地时间。要设置UTC时间,添加--utc或-u参数:
# date --set HH:MM:SS --utc
例如修改当前的时间为23点26分00秒,在root权限下执行如下命令:
# date --set 23:26:00
3.修改日期
修改当前的日期,添加--set或者-s参数。在root权限下执行如下命令,其中 YYYY 代表年份,MM 代表月份,DD 代表某天,请根据实际情况修改:
# date --set YYYY-MM-DD
例如修改当前的日期为2020年11月2日,命令如下:
# date --set 2020-11-02
5.2.3.3 使用hwclock命令设置
可以使用 hwclock 命令设置硬件时钟RTC (Real Time Clock) 。
1.硬件时钟和系统时钟
Linux 将时钟分为:
l 系统时钟 (System Clock) :当前Linux Kernel中的时钟。
l 硬件时钟 RTC:主板上由电池供电的主板硬件时钟,该时钟可以在BIOS的 "Standard BIOS Feature" 项中进行设置。
当Linux启动时,会读取硬件时钟,并根据硬件时间来设置系统时间。
2.显示日期和时间
显示当前硬件的日期和时间,在root权限下执行如下命令:
# hwclock
例如显示当前硬件的日期和时间,命令和输出如下:
# hwclock
2020-08-26 10:18:42.528948+08:00
3.设置日期和时间
修改当前硬件的日期和时间,在root权限下执行如下命令,其中 dd 表示日,mm 表示月份,yyyy 表示年份,HH 表示小时,MM 表示分钟,请根据实际情况修改:
# hwclock --set --date "dd mm yyyy HH:MM"
例如修改当前的时间为2020年10月21日21点17分,命令如下:
# hwclock --set --date "21 Oct 2020 21:17" --utc
5.2.4 设置kdump
本节介绍如何设置kdump预留内存及kdump配置文件参数修改。
5.2.4.1 设置kdump预留内存
1.预留内存参数格式
kdump预留内存参数必须添加到内核启动参数中,配置文件为/boot/efi/EFI/openEuler/grub.cfg,openEuler发布版本中默认已经添加,可以根据实际使用情况调整。添加和修改启动参数后,重启系统生效。kdump预留内存参数格式如下:
2.预留内存推荐值
推荐方案 | 预留参数 | 参数说明 |
通用方案 | crashkernel=2048M,high | 4G以下预留256M,4G以上预留2048M内存给kdump使用。共256+2048M。 |
经济方案 | crashkernel=1024M,high | 4G以下预留256M,4G以上预留1024M内存给kdump使用。共256+1024M。 推荐系统512G内存以内的场景,并不使用网络转储kdump文件。对于虚拟机场景,可以适当减少内存预留值,推荐虚拟机设置为crashkernel=512M或者crashkernel=256M,high |
说明:不通过网络转储kdump文件时,需要设置kdump文件系统不打包网络相关驱动。网络驱动加载需要申请较大内存,可能导致预留内存不足,kdump失败。因此建议禁用网络相关驱动。
3.禁用网络相关驱动
kdump配置文件(/etc/kdump.conf)中,dracut参数可以设置裁剪的驱动模块,可以将网络驱动配置到裁剪驱动列表中,让kdump文件系统中不加载该驱动,修改配置文件后,重启kdump服务生效。dracut参数配置如下所示:
dracut_args --omit-drivers "mdio-gpi usb_8dev et1011c rt2x00usb bcm-phy-lib mac80211_hwsim rtl8723be rndis_host hns3_cae amd vrf rtl8192cu mt76x02-lib int51x1 ppp_deflate team_mode_loadbalance smsc911x aweth bonding mwifiex_usb hnae dnet rt2x00pci vaser_pci hdlc_ppp marvell rtl8xxxu mlxsw_i2c ath9k_htc rtl8150 smc91x cortina at803x rockchip cxgb4 spi_ks8995 mt76x2u smsc9420 mdio-cavium bnxt_en ch9200 dummy macsec ice mt7601u rtl8188ee ixgbevf net1080 liquidio_vf be2net mlxsw_switchx2 gl620a xilinx_gmii2rgmii ppp_generic rtl8192de sja1000_platform ath10k_core cc770_platform realte igb c_can_platform c_can ethoc dm9601 smsc95xx lg-vl600 ifb enic ath9 mdio-octeon ppp_mppe ath10k_pci cc770 team_mode_activebackup marvell10g hinic rt2x00lib mlx4_en iavf broadcom igc c_can_pci alx rtl8192se rtl8723ae microchip lan78xx atl1c rtl8192c-common almia ax88179_178a qed netxen_nic brcmsmac rt2800usb e1000 qla3xxx mdio-bitbang qsemi mdio-mscc-miim plx_pci ipvlan r8152 cx82310_eth slhc mt76x02-usb ems_pci xen-netfront usbnet pppoe mlxsw_minimal mlxsw_spectrum cdc_ncm rt2800lib rtl_usb hnae3 ath9k_common ath9k_hw catc mt76 hns_enet_drv ppp_async huawei_cdc_ncm i40e rtl8192ce dl2 qmi_wwan mii peak_usb plusb can-dev slcan amd-xgbe team_mode_roundrobin ste10Xp thunder_xcv pptp thunder_bgx ixgbe davicom icplus tap tun smsc75xx smsc dlci hns_dsaf mlxsw_core rt2800mmi softing uPD60620 vaser_usb dp83867 brcmfmac mwifiex_pcie mlx4_core micrel team macvlan bnx2 virtio_net rtl_pci zaurus hns_mdi libcxgb hv_netvsc nicvf mt76x0u teranetics mlxfw cdc_eem qcom-emac pppox mt76-usb sierra_net i40evf bcm87xx mwifiex pegasus rt2x00mmi sja1000 ena hclgevf cnic cxgb4vf ppp_synctty iwlmvm team_mode_broadcast vxlan vsockmon hdlc_cisc rtl8723-common bsd_comp fakelb dp83822 dp83tc811 cicada fm10 8139t sfc hs geneve hclge xgene-enet-v2 cdc_mbim hdlc asix netdevsim rt2800pci team_mode_random lxt ems_usb mlxsw_pci sr9700 mdio-thun
5.2.5 设置磁盘调度算法
本节介绍如何设置磁盘调度算法。
5.2.5.1 临时修改调度策略
例如将所有IO调度算法修改为mq-deadline,此修改重启后会失效。
echo mq-deadline > /sys/block/sd*/queue/scheduler
5.2.5.2 永久设置调度策略
可以通过在内核启动配置文件grub.cfg中的kernel行追加:elevator=mq-deadline,重启后生效。
linux /vmlinuz-4.19.90-2003.4.0.0036.oe1.x86_64 root=/dev/mapper/openeuler-root ro resume=/dev/mapper/openeuler-swap rd.lvm.lv=openeuler/root rd.lvm.lv=openeuler/swap quiet crashkernel=512M elevator=mq-deadline
5.2.5.3 设置NMI watchdog
NMI(Non-Maskable Interrupt)作为系统最高优先级的中断,属于不可屏蔽的中断类型。NMI watchdog 可用于检测服务器异常挂起事件,触发系统收集故障信息后重启。openEuler QA 团队实验室测试结果表明:开启 NMI watchdog 的情况下,NMI 偶尔会产生大量中断,并可能会降低服务器部分性能,请在了解该功能影响的情况下合理使用。
Note:以下NMI watchdog设置仅限openEuler社区已完成兼容性验证的硬件服务器类型,其余类型服务器和虚拟机下NMI watchdog仅限参考;
5.2.5.4 显示当前NMI watchdog配置状态
# sudo sysctl kernel.nmi_watchdog
kernel.nmi_watchdog = 0
设置NMI watchdog配置参数
# sudo sysctl -w kernel.nmi_watchdog=1
参数值为 1 表示开启, 0 表示关闭。
3 管理用户和用户组
在Linux中,每个普通用户都有一个账户,包括用户名、密码和主目录等信息。除此之外,还有一些系统本身创建的特殊用户,它们具有特殊的意义,其中最重要的是管理员账户,默认用户名是root。同时Linux也提供了用户组,使每一个用户至少属于一个组,从而便于权限管理。
用户和用户组管理是系统安全管理的重要组成部分,本章主要介绍红旗Asianux服务器操作系统(欧拉版)提供的用户管理和组管理命令,以及为普通用户分配特权的方法。
l 管理用户
l 增加用户
l 修改用户账号
l 删除用户
l 管理员账户授权
l 管理用户组
l 增加用户组
l 修改用户组
l 删除用户组
l 将用户加入用户组或从用户组中移除
l 切换用户组
l 管理用户
5.3.1 管理用户
5.3.1.1 增加用户
1 useradd命令
在root权限下,通过useradd命令可以为系统添加新用户信息,其中 options 为相关参数, username 为用户名称。
useradd [options] username
2 用户信息文件
与用户账号信息有关的文件如下:
l /etc/passwd:用户账号信息文件。
l /etc/shadow:用户账号信息加密文件。
l /etc/group:组信息文件。
l /etc/default/useradd:定义默认设置文件。
l /etc/login.defs:系统广义设置文件。
l /etc/skel:默认的初始配置文件目录。
3 创建用户实例
例如新建一个用户名为userexample的用户,在root权限下执行如下命令:
# useradd userexample
说明:没有任何提示,表明用户建立成功。这时并没有设置用户的口令,请使用passwd命令修改用户的密码,没有设置密码的新账号不能登录系统。
使用id命令查看新建的用户信息,命令如下:
# id userexample
uid=502(userexample) gid=502(userexample) groups=502(userexample)
修改用户userexample的密码:
# passwd userexample
修改用户密码时需要满足密码复杂度要求,密码的复杂度的要求如下:
1. 口令长度至少8个字符。
2. 口令至少包含大写字母、小写字母、数字和特殊字符中的任意3种。
3. 口令不能和账号一样。
4. 口令不能使用字典词汇。
l 查询字典 在已装好的红旗Asianux服务器操作系统(欧拉版)环境中,可以通过如下命令导出字典库文件dictionary.txt,用户可以查询密码是否在该字典中。
l 修改字典 修改上面导出的字典文件,执行如下命令更新系统字典库。
# create-cracklib-dict dictionary.txt
l 在原字典库基础上新增其他字典内容custom.txt。
# create-cracklib-dict dictionary.txt custom.txt
根据提示两次输入新用户的密码,完成密码更改。过程如下:
# passwd userexample
Changing password for user userexample.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
说明:若打印信息中出现“BAD PASSWORD: The password fails the dictionary check - it is too simplistic/sytematic”,表示设置的密码过于简单,建议设置复杂度较高的密码。
5.3.1.2 修改用户账号
1 修改密码
普通用户可以用passwd修改自己的密码,只有管理员才能用passwd username为其他用户修改密码。
2 修改用户shell设置
使用chsh命令可以修改自己的shell,只有管理员才能用chsh username为其他用户修改shell设置。
用户也可以使用usermod命令修改shell信息,在root权限下执行如下命令,其中 new_shell_path 为目标shell路径,username 为要修改用户的用户名,请根据实际情况修改:
usermod -s new_shell_path username
例如,将用户userexample的shell改为csh,命令如下:
# usermod -s /bin/csh userexample
3 修改主目录
修改主目录,可以在root权限下执行如下命令,其中 new_home_directory 为已创建的目标主目录的路径,username 为要修改用户的用户名,请根据实际情况修改:
usermod -d new_home_directory username
如果想将现有主目录的内容转移到新的目录,应该使用-m选项,命令如下:
usermod -d new_home_directory -m username
4 修改UID
修改用户ID,在root权限下执行如下命令,其中 UID 代表目标用户ID,username 代表用户名,请根据实际情况修改:
usermod -u UID username
该用户主目录中所拥有的文件和目录都将自动修改UID设置。但是,对于主目录外所拥有的文件,只能使用chown命令手动修改所有权。
5 修改账号的有效期
如果使用了影子口令,则可以在root权限下,执行如下命令来修改一个账号的有效期,其中 MM 代表月份,DD 代表某天,YY 代表年份,username 代表用户名,请根据实际情况修改:
usermod -e MM/DD/YY username
5.3.1.3 删除用户
在root权限下,使用userdel命令可删除现有用户。
例如,删除用户Test,命令如下:
# userdel Test
如果想同时删除该用户的主目录以及其中所有内容,要使用-r参数递归删除。
说明:不建议直接删除已经进入系统的用户,如果需要强制删除,请使用 userdel -f Test 命令。
5.3.1.4 管理员账户授权
使用sudo命令可以允许普通用户执行管理员账户才能执行的命令。
sudo命令允许已经在/etc/sudoers文件中指定的用户运行管理员账户命令。例如,一个已经获得许可的普通用户可以运行如下命令:
sudo /usr/sbin/useradd newuserl
实际上,sudo的配置完全可以指定某个已经列入/etc/sudoers文件的普通用户可以做什么,不可以做什么。
/etc/sudoers的配置行如下所示。
l 空行或注释行(以#字符打头):无具体功能的行。
l 可选的主机别名行:用来创建主机列表的简称。必须以Host_Alias关键词开头,列表中的主机必须用逗号隔开,如:
Host_Alias linux=ted1,ted2
其中ted1和ted2是两个主机名,可使用linux(别名)称呼它们。
l 可选的用户别名行:用来创建用户列表的简称。用户别名行必须以User_Alias关键词开头,列表中的用户名必须以逗号隔开。其格式同主机别名行。
l 可选的命令别名行:用来创建命令列表的简称。必须以Cmnd_Alias开头,列表中的命令必须用逗号隔开。
l 可选的运行方式别名行:用来创建用户列表的简称。不同的是,使用这样的别名可以告诉sudo程序以列表中某一用户的身份来运行程序。
l 必要的用户访问说明行。
用户访问的说明语法如下:
user host = [ run as user ] command list
在user处指定一个真正的用户名或定义过的别名,host也可以是一个真正的主机名或者定义过的主机别名。默认情况下,sudo执行的所有命令都是以root身份执行。如果您想使用其他身份可以指定。command list可以是以逗号分隔的命令列表,也可以是一个已经定义过的别名,如:
ted1 ted2=/sbin/shutdown
这一句说明ted1可以在ted2主机上运行关机命令。
newuser1 ted1=(root) /usr/sbin/useradd,/usr/sbin/userdel
这一句说明ted1主机上的newuser1具有以root用户权限执行useradd,userdel命令的功能。
说明:
l 可以在一行定义多个别名,中间用冒号 (:) 隔开。
l 可在命令或命令别名之前加上感叹号 (!),使该命令或命令别名无效。
l 有两个关键词:ALL和NOPASSWD。ALL意味着“所有”(所有文件、所有主机或所有命令),NOPASSWD意味着不用密码。
l 通过修改用户访问,将普通用户的访问权限修改为同root一样,则可以给普通用户分配特权。
下面是一个sudoers文件的例子:
#sudoers files
#User alias specification
User_Alias ADMIN=ted1:POWERUSER=globus,ted2
#user privilege specification
ADMIN ALL=ALL
POWERUSER ALL=ALL,!/bin/su
其中:
User_Alias ADMIN=ted1:POWERUSER=globus,ted2
定义了两个别名ADMIN和POWERUSER
ADMIN ALL=ALL
说明在所有主机上,ADMIN用户都可以以root身份执行所有命令
POWERUSER ALL=ALL,!/bin/su
给POWERUSER用户除了运行su命令外等同ADMIN的权限
5.3.2 管理用户组
5.3.2.1 增加用户组
1 groupadd命令
在root权限下,通过groupadd命令可以为系统添加新用户组信息,其中 options 为相关参数, groupname 为用户组名称。
groupadd [options] groupname
2 用户组信息文件
与用户组信息有关的文件如下:
/etc/gshadow:用户组信息加密文件。
/etc/group:组信息文件。
/etc/login.defs:系统广义设置文件。
3 创建用户组实例
例如新建一个用户组名为groupexample的用户,在root权限下执行如下命令:
# groupadd groupexample
5.3.2.2 修改用户组
1 修改GID
修改用户组ID,在root权限下执行如下命令,其中 GID 代表目标用户组ID, groupname 代表用户组,请根据实际情况修改:
groupmod -g GID groupname
2 修改用户组名
修改用户组名,在root权限下执行如下命令,其中 newgroupname 代表新用户组名, oldgroupname 代表已经存在的待修改的用户组名,请根据实际情况修改:
groupmod -n newgroupname oldgroupname
5.3.2.3 删除用户组
在root权限下,使用groupdel命令可删除用户组。
例如,删除用户组Test,命令如下:
# groupdel Test
说明:groupdel不能直接删除用户的主组,如果需要强制删除用户主组,请使用 groupdel -f Test 命令。
5.3.2.4 将用户加入用户组或从用户组中移除
在root权限下,使用gpasswd命令将用户加入用户组或从用户组中移除。
例如,将用户 userexample 加入用户组 Test ,命令如下:
# gpasswd -a userexample Test
例如,将用户 userexample 从 Test 用户组中移除,命令如下:
# gpasswd -d userexample Test
5.3.2.5 切换用户组
一个用户同时属于多个用户组时,则在用户登录后,使用newgrp命令可以切换到其他用户组,以便具有其他用户组的权限。
例如,将用户 userexample 切换到 Test 用户组,命令如下:
$ newgrp Test
4 使用DNF管理软件包
DNF是一款Linux软件包管理工具,用于管理RPM软件包。DNF可以查询软件包信息,从指定软件库获取软件包,自动处理依赖关系以安装或卸载软件包,以及更新系统到最新可用版本。
说明:
l DNF与YUM完全兼容,提供了YUM兼容的命令行以及为扩展和插件提供的API。
l 使用DNF需要管理员权限,本章所有命令需要在管理员权限下执行。
l 使用DNF管理软件包
l 配置DNF
l DNF配置文件
l 创建本地软件源仓库
l 添加、启用和禁用软件源
l 管理软件包
l 搜索软件包
l 列出软件包清单
l 显示RPM包信息
l 安装RPM包
l 下载软件包
l 删除软件包
l 管理软件包组
l 列出软件包组清单
l 显示软件包组信息
l 安装软件包组
l 删除软件包组
l 检查并更新
l 检查更新
l 升级
l 更新所有的包和它们的依赖
5.4.1 配置DNF
5.4.1.1 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文件。
5.4.1.2 配置main部分
/etc/dnf/dnf.conf 文件包含的“main”部分,配置示例如下:
[main]
gpgcheck=1
installonly_limit=3
clean_requirements_on_remove=True
best=True
常用选项说明:
表 1 main参数说明
参数 | 说明 |
cachedir | 缓存目录,该目录用于存储RPM包和数据库文件。 |
keepcache | 可选值是1和0,表示是否要缓存已安装成功的那些RPM包及头文件,默认值为0,即不缓存。 |
debuglevel | 设置dnf生成的debug信息。取值范围:[0-10],数值越大会输出越详细的debug信息。默认值为2,设置为0表示不输出debug信息。 |
clean_requirements_on_remove | 删除在dnf remove期间不再使用的依赖项,如果软件包是通过DNF安装的,而不是通过显式用户请求安装的,则只能通过clean_requirements_on_remove删除软件包,即它是作为依赖项引入的。 默认值为True。 |
best | 升级包时,总是尝试安装其最高版本,如果最高版本无法安装,则提示无法安装的原因并停止安装。默认值为True。 |
obsoletes | 可选值1和0,设置是否允许更新陈旧的RPM包。默认值为1,表示允许更新。 |
gpgcheck | 可选值1和0,设置是否进行gpg校验。默认值为1,表示需要进行校验。 |
plugins | 可选值1和0,表示启用或禁用dnf插件。默认值为1,表示启用dnf插件。 |
installonly_limit | 设置可以同时安装“installonlypkgs”指令列出包的数量。默认值为3,不建议降低此值 |
5.4.1.3 配置repository部分
repository部分允许您定义定制化的openEuler软件源仓库,各个仓库的名称不能相同,否则会引起冲突。配置repository部分有两种方式,一种是直接配置/etc/dnf/dnf.conf文件中的“repository”部分,另外一种是配置/etc/yum.repos.d目录下的.repo文件。
直接配置/etc/dnf/dnf.conf文件中的“repository”部分
下面是[repository]部分的一个最小配置示例:
[repository]
name=repository_name
baseurl=repository_url
说明:红旗Asianux服务器操作系统(欧拉版)提供在线的镜像源,地址:https://repo.chinaredflag.cn/。
选项说明:
表 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文件
红旗Asianux服务器操作系统(欧拉版)提供了多种repo源供用户在线使用,各repo源含义可参考系统安装,使用管理员权限添加红旗Asianux服务器操作系统(欧拉版)repo源。
说明:
l enabled为是否启用该软件源仓库,可选值为1和0。默认值为1,表示启用该软件源仓库。
l gpgkey为验证签名用的公钥。
5.4.1.4 显示当前配置
要显示当前的配置信息:
dnf config-manager --dump
要显示相应软件源的配置,首先查询repo id:
dnf repolist
然后执行如下命令,显示对应id的软件源配置,其中 repository 为查询得到的repo id:
dnf config-manager --dump repository
您也可以使用一个全局正则表达式,来显示所有匹配部分的配置:
dnf config-manager --dump glob_expression
5.4.1.5 创建本地软件源仓库
要建立一个本地软件源仓库,请按照下列步骤操作。
安装createrepo软件包。在root权限下执行如下命令:
dnf install createrepo
将需要的软件包复制到一个目录下,如/mnt/local_repo/ 。
创建软件源,执行以下命令:
createrepo --database /mnt/local_repo
5.4.2 添加、启用和禁用软件源
本节将介绍如何通过“dnf config-manager”命令添加、启用和禁用软件源仓库。
5.4.2.1 添加软件源
要定义一个新的软件源仓库,您可以在 /etc/dnf/dnf.conf 文件中添加“repository”部分,或者在/etc/yum.repos.d/目录下添加“.repo”文件进行说明。建议您通过添加“.repo”的方式,每个软件源都有自己对应的“.repo”文件,以下介绍该方式的操作方法。
要在您的系统中添加一个这样的源,请在root权限下执行如下命令,执行完成之后会在/etc/yum.repos.d/目录下生成对应的repo文件。其中 repository_url 为repo源地址,详情请参见表2。
dnf config-manager --add-repo repository_url
5.4.2.2 启用软件源
要启用软件源,请在root权限下执行如下命令,其中 repository 为新增.repo文件中的repo id(可通过dnf repolist查询):
dnf config-manager --set-enable repository
您也可以使用一个全局正则表达式,来启用所有匹配的软件源。其中 glob_expression 为对应的正则表达式,用于同时匹配多个repo id:
dnf config-manager --set-enable glob_expression
5.4.2.3 禁用软件源
要禁用软件源,请在root权限下执行如下命令:
dnf config-manager --set-disable repository
同样的,您也可以使用一个全局正则表达式来禁用所有匹配的软件源:
dnf config-manager --set-disable glob_expression
5.4.3 管理软件包
使用dnf能够让您方便的进行查询、安装、删除软件包等操作。
5.4.3.1 搜索软件包
您可以使用rpm包名称、缩写或者描述搜索需要的RPM包,使用命令如下:
dnf search term
示例如下:
$ dnf search httpd
========================================== N/S matched: httpd ==========================================
httpd.aarch64 : Apache HTTP Server
httpd-devel.aarch64 : Development interfaces for the Apache HTTP server
httpd-manual.noarch : Documentation for the Apache HTTP server
httpd-tools.aarch64 : Tools for use with the Apache HTTP Server
libmicrohttpd.aarch64 : Lightweight library for embedding a webserver in applications
mod_auth_mellon.aarch64 : A SAML 2.0 authentication module for the Apache Httpd Server
mod_dav_svn.aarch64 : Apache httpd module for Subversion server
5.4.3.2 列出软件包清单
要列出系统中所有已安装的以及可用的RPM包信息,使用命令如下:
dnf list all
要列出系统中特定的RPM包信息,使用命令如下:
dnf list glob_expression...
示例如下:
$ dnf list httpd
Available Packages
httpd.aarch64 2.4.34-8.h5.oe1 Local
5.4.3.3 显示RPM包信息
要显示一个或者多个RPM包信息,使用命令如下:
dnf info package_name...
例如搜索,命令如下:
$ dnf info httpd
Available Packages
Name : httpd
Version : 2.4.34
Release : 8.h5.oe1
Arch : aarch64
Size : 1.2 M
Repo : Local
Summary : Apache HTTP Server
URL : http://httpd.apache.org/
License : ASL 2.0
Description : The Apache HTTP Server is a powerful, efficient, and extensible
: web server.
5.4.3.4 安装RPM包
要安装一个软件包及其所有未安装的依赖,请在root权限下执行如下命令:
dnf install package_name
您也可以通过添加软件包名字同时安装多个软件包。配置文件/etc/dnf/dnf.conf添加参数strict=False,运行dnf命令参数添加--setopt=strict=0。请在root权限下执行如下命令:
dnf install package_name package_name... --setopt=strict=0
示例如下:
# dnf install httpd
说明:
安装RPM包过程中,若出现安装失败,可参考安装时出现软件包冲突、文件冲突或缺少软件包导致安装失败。
5.4.3.5 下载软件包
使用dnf下载软件包,请在root权限下输入如下命令:
dnf download package_name
如果需要同时下载未安装的依赖,则加上--resolve,使用命令如下:
dnf download --resolve package_name
示例如下:
# dnf download --resolve httpd
5.4.3.6 删除软件包
要卸载软件包以及相关的依赖软件包,请在root权限下执行如下命令:
dnf remove package_name...
示例如下:
# dnf remove totem
5.4.4 管理软件包组
软件包集合是服务于一个共同的目的一组软件包,例如系统工具集等。使用dnf可以对软件包组进行安装/删除等操作,使相关操作更高效。
5.4.4.1 列出软件包组清单
使用summary参数,可以列出系统中所有已安装软件包组、可用的组,可用的环境组的数量,命令如下:
dnf groups summary
使用示例如下:
# dnf groups summary
Last metadata expiration check: 0:11:56 ago on Sat 17 Aug 2019 07:45:14 PM CST.
Available Groups: 8
要列出所有软件包组和它们的组ID ,命令如下:
dnf group list
使用示例如下:
# dnf group list
Last metadata expiration check: 0:10:32 ago on Sat 17 Aug 2019 07:45:14 PM CST.
Available Environment Groups:
Minimal Install
Custom Operating System
Server
Available Groups:
Development Tools
Graphical Administration Tools
Headless Management
Legacy UNIX Compatibility
Network Servers
Scientific Support
Security Tools
System Tools
5.4.4.2 显示软件包组信息
要列出包含在一个软件包组中必须安装的包和可选包,使用命令如下:
dnf group info glob_expression...
例如显示Development Tools信息,示例如下:
# dnf group info "Development Tools"
Last metadata expiration check: 0:14:54 ago on Wed 05 Jun 2019 08:38:02 PM CST.
Group: Development Tools
Description: A basic development environment.
Mandatory Packages:
binutils
glibc-devel
make
pkgconf
pkgconf-m4
pkgconf-pkg-config
rpm-sign
Optional Packages:
expect
5.4.4.3 安装软件包组
每一个软件包组都有自己的名称以及相应的ID(groupid),您可以使用软件包组名称或它的ID进行安装。
要安装一个软件包组,请在root权限下执行如下命令:
dnf group install group_name
dnf group install groupid
例如安装Development Tools相应的软件包组,命令如下:
# dnf group install "Development Tools"
# dnf group install development
5.4.4.4 删除软件包组
要卸载软件包组,您可以使用软件包组名称或它的ID,在root权限下执行如下命令:
dnf group remove group_name
dnf group remove groupid
例如删除Development Tools相应的软件包组,命令如下:
# dnf group remove "Development Tools"
# dnf group remove development
5.4.5 检查并更新
dnf可以检查您的系统中是否有软件包需要更新。您可以通过dnf列出需要更新的软件包,并可以选择一次性全部更新或者只对指定包进行更新。
5.4.5.1 检查更新
如果您需要显示当前系统可用的更新,使用命令如下:
dnf check-update
使用实例如下:
# dnf check-update
Last metadata expiration check: 0:02:10 ago on Sun 01 Sep 2019 11:28:07 PM CST.
anaconda-core.aarch64 19.31.123-1.14 updates
anaconda-gui.aarch64 19.31.123-1.14 updates
anaconda-tui.aarch64 19.31.123-1.14 updates
anaconda-user-help.aarch64 19.31.123-1.14 updates
anaconda-widgets.aarch64 19.31.123-1.14 updates
bind-libs.aarch64 32:9.9.4-29.3 updates
bind-libs-lite.aarch64 32:9.9.4-29.3 updates
bind-license.noarch 32:9.9.4-29.3 updates
bind-utils.aarch64 32:9.9.4-29.3 updates
...
5.4.5.2 升级
如果您需要升级单个软件包,在root权限下执行如下命令:
dnf update package_name
例如升级rpm包,示例如下:
# dnf update anaconda-gui.aarch64
Last metadata expiration check: 0:02:10 ago on Sun 01 Sep 2019 11:30:27 PM CST.
Dependencies Resolved
================================================================================
Package Arch Version Repository Size
================================================================================
Updating:
anaconda-gui aarch64 19.31.123-1.14 updates 461 k
anaconda-core aarch64 19.31.123-1.14 updates 1.4 M
anaconda-tui aarch64 19.31.123-1.14 updates 274 k
anaconda-user-help aarch64 19.31.123-1.14 updates 315 k
anaconda-widgets aarch64 19.31.123-1.14 updates 748 k
Transaction Summary
================================================================================
Upgrade 5 Package
Total download size: 3.1 M
Is this ok [y/N]:
类似的,如果您需要升级软件包组,在root权限下执行如下命令:
dnf group update group_name
5.4.5.3 更新所有的包和它们的依赖
要更新所有的包和它们的依赖,在root权限下执行如下命令:
dnf update
5 管理服务
本章介绍如何使用systemd进行系统和服务管理。
5.5.1 简介
systemd是在Linux下,与SysV和LSB初始化脚本兼容的系统和服务管理器。systemd使用socket和D-Bus来开启服务,提供基于守护进程的按需启动策略,支持快照和系统状态恢复,维护挂载和自挂载点,实现了各服务间基于从属关系的一个更为精细的逻辑控制,拥有更高的并行性能。
5.5.2 概念介绍
systemd开启和监督整个系统是基于unit的概念。unit是由一个与配置文件对应的名字和类型组成的(例如:avahi.service unit有一个具有相同名字的配置文件,是守护进程Avahi的一个封装单元)。unit有多重类型,如表1所示。
表 1 unit说明
it名称 | 后缀名 | 描述 |
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。 |
5.5.3 特性说明
5.5.3.1 更快的启动速度
systemd提供了比UpStart更激进的并行启动能力,采用了socket/D-Bus activation等技术启动服务,带来了更快的启动速度。
为了减少系统启动时间,systemd的目标是:
l 尽可能启动更少的进程。
l 尽可能将更多进程并行启动。
5.5.3.2 提供按需启动能力
当sysvinit系统初始化的时候,它会将所有可能用到的后台服务进程全部启动运行。并且系统必须等待所有的服务都启动就绪之后,才允许用户登录。这种做法有两个缺点:首先是启动时间过长;其次是系统资源浪费。
某些服务很可能在很长一段时间内,甚至整个服务器运行期间都没有被使用过。比如CUPS,打印服务在多数服务器上很少被真正使用到。您可能没有想到,在很多服务器上SSHD也是很少被真正访问到的。花费在启动这些服务上的时间是不必要的;同样,花费在这些服务上的系统资源也是一种浪费。
systemd可以提供按需启动的能力,只有在某个服务被真正请求的时候才启动它。当该服务结束,systemd可以关闭它,等待下次需要时再次启动它。
5.5.3.3 采用cgroup特性跟踪和管理进程的生命周期
init系统的一个重要职责就是负责跟踪和管理服务进程的生命周期。它不仅可以启动一个服务,也能够停止服务。这看上去没有什么特别的,然而在真正用代码实现的时候,您或许会发现停止服务比一开始想的要困难。
服务进程一般都会作为守护进程(daemon)在后台运行,为此服务程序有时候会派生(fork)两次。在UpStart中,需要在配置文件中正确地配置expect小节。这样UpStart通过对fork系统调用进行计数,从而获知真正的精灵进程的PID号。
cgroup已经出现了很久,它主要用来实现系统资源配额管理。cgroup提供了类似文件系统的接口,使用方便。当进程创建子进程时,子进程会继承父进程的cgroup。因此无论服务如何启动新的子进程,所有的这些相关进程都会属于同一个cgroup,systemd只需要简单地遍历指定的cgroup即可正确地找到所有的相关进程,将它们逐一停止即可。
5.5.3.4 启动挂载点和自动挂载的管理
传统的Linux系统中,用户可以用/etc/fstab文件来维护固定的文件系统挂载点。这些挂载点在系统启动过程中被自动挂载,一旦启动过程结束,这些挂载点就会确保存在。这些挂载点都是对系统运行至关重要的文件系统,比如HOME目录。和sysvinit一样,systemd管理这些挂载点,以便能够在系统启动时自动挂载它们。systemd还兼容/etc/fstab文件,您可以继续使用该文件管理挂载点。
有时候用户还需要动态挂载点,比如打算访问DVD内容时,才临时执行挂载以便访问其中的内容,而不访问光盘时该挂载点被取消(umount),以便节约资源。传统地,人们依赖autofs服务来实现这种功能。
systemd内建了自动挂载服务,无需另外安装autofs服务,可以直接使用systemd提供的自动挂载管理能力来实现autofs的功能。
5.5.3.5 实现事务性依赖关系管理
系统启动过程是由很多的独立工作共同组成的,这些工作之间可能存在依赖关系,比如挂载一个NFS文件系统必须依赖网络能够正常工作。systemd虽然能够最大限度地并发执行很多有依赖关系的工作,但是类似“挂载NFS”和“启动网络”这样的工作还是存在天生的先后依赖关系,无法并发执行。对于这些任务,systemd维护一个“事务一致性”的概念,保证所有相关的服务都可以正常启动而不会出现互相依赖,以至于死锁的情况。
5.5.3.6 与SysV初始化脚本兼容
和UpStart一样,systemd引入了新的配置方式,对应用程序的开发也有一些新的要求。如果systemd想替代目前正在运行的初始化系统,就必须和现有程序兼容。任何一个Linux发行版都很难为了采用systemd而在短时间内将所有的服务代码都修改一遍。
systemd提供了和sysvinit以及LSB initscripts兼容的特性。系统中已经存在的服务和进程无需修改。这降低了系统向systemd迁移的成本,使得systemd替换现有初始化系统成为可能。
5.5.3.7 能够对系统进行快照和恢复
systemd支持按需启动,因此系统的运行状态是动态变化的,人们无法准确地知道系统当前运行了哪些服务。systemd快照提供了一种将当前系统运行状态保存并恢复的能力。
比如系统当前正运行服务A和B,可以用systemd命令行对当前系统运行状况创建快照。然后将进程A停止,或者做其他的任意的对系统的改变,比如启动新的进程C。在这些改变之后,运行systemd的快照恢复命令,就可立即将系统恢复到快照时刻的状态,即只有服务A,B在运行。一个可能的应用场景是调试:比如服务器出现一些异常,为了调试用户将当前状态保存为快照,然后可以进行任意的操作,比如停止服务等等。等调试结束,恢复快照即可。
5.5.4 管理系统服务
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 | 当您创建新服务文件或者变更设置时使用。 |
5.5.4.1 显示所有当前服务
如果您需要显示当前正在运行的服务,使用命令如下:
systemctl list-units --type service
如果您需要显示所有的服务(包括未运行的服务),需要添加-all参数,使用命令如下:
systemctl list-units --type service --all
例如显示当前正在运行的服务,命令如下:
$ systemctl list-units --type service
UNIT LOAD ACTIVE SUB JOB DESCRIPTION
atd.service loaded active running Deferred execution scheduler
auditd.service loaded active running Security Auditing Service
avahi-daemon.service loaded active running Avahi mDNS/DNS-SD Stack
chronyd.service loaded active running NTP client/server
crond.service loaded active running Command Scheduler
dbus.service loaded active running D-Bus System Message Bus
dracut-shutdown.service loaded active exited Restore /run/initramfs on shutdown
firewalld.service loaded active running firewalld - dynamic firewall daemon
getty@tty1.service loaded active running Getty on tty1
gssproxy.service loaded active running GSSAPI Proxy Daemon
irqbalance.service loaded active running irqbalance daemon
iscsid.service loaded activating start start Open-iSCSI
5.5.4.2 显示服务状态
如果您需要显示某个服务的状态,可执行如下命令:
systemctl status name.service
相关状态显示参数说明如表4所示。
表 4 状态参数说明
参数 | 描述 |
Loaded | 说明服务是否被加载,并显示服务对应的绝对路径以及是否启用。 |
Active | 说明服务是否正在运行,并显示时间节点。 |
Main PID | 相应的系统服务的PID值。 |
CGroup | 相关控制组(CGroup)的其他信息。 |
如果您需要鉴别某个服务是否运行,可执行如下命令:
systemctl is-active name.service
is-active命令的返回结果如下:
表 5 is-active命令的返回结果
状态 | 含义 |
active(running) | 有一只或多只程序正在系统中执行 |
active(exited) | 仅执行一次就正常结束的服务,目前并没有任何程序在系统中执行。 举例来说,开机或者 是挂载时才会进行一次的 quotaon 功能 |
active(waiting) | 正在执行当中,不过要等待其他的事件才能继续处理。例如:打印的队列相关服务 就是这种状态,虽然正在启动中,不过也需要真的有队列进来 (打印作业) 这样他才会继续唤醒打印机 服务来进行下一步打印的功能 |
inactive | 这个服务没有运行 |
同样,如果您需要判断某个服务是否被启用,可执行如下命令:
systemctl is-enabled name.service
is-enabled命令的返回结果如下:
表 6 is-enabled命令的返回结果
状态 | 含义 |
"enabled" | 已经通过 /etc/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软连接被永久启用。 |
"enabled-runtime" | 已经通过 /run/systemd/system/ 目录下的 Alias= 别名、 .wants/ 或 .requires/ 软连接被临时启用。 |
"linked" | 虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软连接已经存在于 /etc/systemd/system/ 永久目录中。 |
"linked-runtime" | 虽然单元文件本身不在标准单元目录中,但是指向此单元文件的一个或多个软连接已经存在于 /run/systemd/system/ 临时目录中。 |
"masked" | 已经被 /etc/systemd/system/ 目录永久屏蔽(软连接指向 /dev/null 文件),因此 start 操作会失败。 |
"masked-runtime" | 已经被 /run/systemd/systemd/ 目录临时屏蔽(软连接指向 /dev/null 文件),因此 start 操作会失败。 |
"static" | 尚未被启用,并且单元文件的 "[Install]" 小节中没有可用于 enable 命令的选项。 |
"indirect" | 尚未被启用,但是单元文件的 "[Install]" 小节中 Also= 选项的值列表非空(也就是列表中的某些单元可能已被启用)、或者它拥有一个不在 Also= 列表中的其他名称的别名软连接。对于模版单元来说,表示已经启用了一个不同于 DefaultInstance= 的实例。 |
"disabled" | 尚未被启用,但是单元文件的 "[Install]" 小节中存在可用于 enable 命令的选项 |
"generated" | 单元文件是被单元生成器动态生成的。被生成的单元文件可能并未被直接启用,而是被单元生成器隐含的启用了。 |
"transient" | 单元文件是被运行时API动态临时生成的。该临时单元可能并未被启用。 |
"bad" | 单元文件不正确或者出现其他错误。 is-enabled 不会返回此状态,而是会显示一条出错信息。 list-unit-files 命令有可能会显示此单元。 |
例如查看gdm.service服务状态,命令如下:
# systemctl status gdm.service
gdm.service - GNOME Display Manager Loaded: loaded (/usr/lib/systemd/system/gdm.service; enabled) Active: active (running) since Thu 2013-10-17 17:31:23 CEST; 5min ago
Main PID: 1029 (gdm)
CGroup: /system.slice/gdm.service
├─1029 /usr/sbin/gdm
├─1037 /usr/libexec/gdm-simple-slave --display-id /org/gno...
└─1047 /usr/bin/Xorg :0 -background none -verbose -auth /r...Oct 17 17:31:23 localhost systemd[1]: Started GNOME Display Manager.
5.5.4.3 运行服务
如果您需要运行某个服务,请在root权限下执行如下命令:
systemctl start name.service
例如运行httpd服务,命令如下:
# systemctl start httpd.service
5.5.4.4 关闭服务
如果您需要关闭某个服务,请在root权限下执行如下命令:
systemctl stop name.service
例如关闭蓝牙服务,命令如下:
# systemctl stop bluetooth.service
5.5.4.5 重启服务
如果您需要重启某个服务,请在root权限下执行如下命令:
systemctl restart name.service
执行命令后,当前服务会被关闭,但马上重新启动。如果您指定的服务,当前处于关闭状态,执行命令后,服务也会被启动。
例如重启蓝牙服务,命令如下:
# systemctl restart bluetooth.service
5.5.4.6 启用服务
如果您需要在开机时启用某个服务,请在root权限下执行如下命令:
systemctl enable name.service
例如设置httpd服务开机时启动,命令如下:
# systemctl enable httpd.service
ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'
5.5.4.7 禁用服务
如果您需要在开机时禁用某个服务,请在root权限下执行如下命令:
systemctl disable name.service
例如在开机时禁用蓝牙服务启动,命令如下:
# systemctl disable bluetooth.service
Removed /etc/systemd/system/bluetooth.target.wants/bluetooth.service.
Removed /etc/systemd/system/dbus-org.bluez.service.
5.5.5 改变运行级别
5.5.5.1 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 | 重启系统。 |
5.5.5.2 查看系统默认启动目标
查看当前系统默认的启动目标,命令如下:
systemctl get-default
5.5.5.3 查看当前系统所有的启动目标
查看当前系统所有的启动目标,命令如下:
systemctl list-units --type=target
5.5.5.4 改变默认目标
改变系统默认的目标,在root权限下执行如下命令:
systemctl set-default name.target
5.5.5.5 改变当前目标
改变当前系统的目标,在root权限下执行如下命令:
systemctl isolate name.target
5.5.5.6 切换到救援模式
改变当前系统为救援模式,在root权限下执行如下命令:
systemctl rescue
这条命令和“systemctl isolate rescue.target”类似。命令执行后会在串口有如下打印信息:
You are in rescue mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):
说明:用户需要重启系统,从救援模式进入正常模式。
5.5.5.7 切换到紧急模式
改变当前系统为紧急模式,在root权限下执行如下命令:
systemctl emergency
这条命令和“systemctl isolate emergency.target”类似。命令执行后会在串口有如下打印信息:
You are in emergency mode. After logging in, type "journalctl -xb" to viewsystem logs, "systemctl reboot" to reboot, "systemctl default" or "exit"to boot into default mode.
Give root password for maintenance
(or press Control-D to continue):
说明:用户需要重启系统,从紧急模式进入正常模式。
5.5.6 关闭、暂停和休眠系统
5.5.6.1 systemctl命令
systemd通过systemctl命令可以对系统进行关机、重启、休眠等一系列操作。当前仍兼容部分Linux常用管理命令,对应关系如表8。建议用户使用systemctl命令进行操作。
表 8 命令对应关系
Linux常用管理命令 | systemctl命令 | 描述 |
halt | systemctl halt | 关闭系统 |
poweroff | systemctl poweroff | 关闭电源 |
reboot | systemctl reboot | 重启 |
5.5.6.2 关闭系统
关闭系统并下电,在root权限下执行如下命令:
systemctl poweroff
关闭系统但不下电机器,在root权限下执行如下命令:
systemctl halt
执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“--no-wall”参数。具体命令如下:
systemctl --no-wall poweroff
5.5.6.3 重启系统
重启系统,在root权限下执行如下命令:
systemctl reboot
执行上述命令会给当前所有的登录用户发送一条提示消息。如果不想让systemd发送该消息,您可以添加“--no-wall”参数。具体命令如下:
systemctl --no-wall reboot
5.5.6.4 使系统待机
使系统待机,在root权限下执行如下命令:
systemctl suspend
5.5.6.5 使系统休眠
使系统休眠,在root权限下执行如下命令:
systemctl hibernate
使系统待机且处于休眠状态,在root权限下执行如下命令:
systemctl hybrid-sleep
6 管理进程
操作系统管理多个用户的请求和多个任务。大多数系统都只有一个CPU和一个主要存储,但一个系统可能有多个二级存储磁盘和多个输入/输出设备。操作系统管理这些资源并在多个用户间共享资源,当用户提出一个请求时,造成好像系统被用户独占的假象。实际上操作系统监控着一个等待执行的任务队列,这些任务包括用户任务、操作系统任务、邮件和打印任务等。本章节将从用户的角度讲述如何控制进程。
5.6.1 查看进程
Linux是一个多任务系统,经常需要对这些进程进行一些调配和管理。要进行管理,首先就要知道现在的进程情况:有哪些进程、进程的状态如何等。Linux提供了多种命令来了解进程的状况。
5.6.1.1 who命令
who命令主要用于查看当前系统中的用户情况。如果用户想和其他用户建立即时通讯,比如使用talk命令,那么首先要确定的就是该用户确实在线上,不然talk进程就无法建立起来。又如,系统管理员希望监视每个登录的用户此时此刻的所作所为,也要使用who命令。who命令应用起来非常简单,可以比较准确地掌握用户的情况,所以使用非常广泛。
例如查看系统中的用户及其状态。使用如下:
$ who
admin tty1 Jul 28 15:55
admin pts/0 Aug 5 15:46 (192.168.0.110)
admin pts/2 Jul 29 19:52 (192.168.0.110)
root pts/3 Jul 30 12:07 (192.168.0.110)
root pts/4 Jul 31 10:29 (192.168.0.144)
root pts/5 Jul 31 14:52 (192.168.0.11)
root pts/6 Aug 6 10:12 (192.168.0.234)
root pts/8 Aug 6 11:34 (192.168.0.234)
5.6.1.2 ps命令
ps命令是最基本又非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵尸、哪些进程占用了过多的资源等,大部分进程信息都是可以通过执行该命令得到的。
ps命令最常用的还是用来监控后台进程的工作情况,因为后台进程是不与屏幕、键盘这些标准输入/输出设备进行通信的,所以如果需要检测其状况,就可使用ps命令。ps命令的常见选项如表1所示。
表 1 选项说明
选项 | 描述 |
-e | 显示所有进程。 |
-f | 全格式。 |
-h | 不显示标题。 |
-l | 使用长格式。 |
-w | 宽行输出。 |
-a | 显示终端上的所有进程,包括其他用户的进程。 |
-r | 只显示正在运行的进程。 |
-x | 显示没有控制终端的进程。 |
例如显示系统中终端上的所有进行进程。命令如下:
$ ps -a
PID TTY TIME CMD
12175 pts/6 00:00:00 bash
24526 pts/0 00:00:00 vsftpd
29478 pts/5 00:00:00 ps
32461 pts/0 1-01:58:33 sh
5.6.1.3 top命令
top命令和ps命令的基本作用是相同的,显示系统当前的进程和其他状况,但是top是一个动态显示过程,即可以通过用户按键来不断刷新进程的当前状态,如果在前台执行该命令,它将独占前台,直到用户终止该程序为止。其实top命令提供了实时的对系统处理器的状态监视。它将显示系统中CPU的任务列表。该命令可以按CPU使用、内存使用和执行时间对任务进行排序,而且该命令的很多特性都可以通过交互式命令或者在定制文件中进行设定。
top命令输出的实例如图1所示:
图 1 top显示
5.6.1.4 kill命令
当需要中断一个前台进程的时候,通常足使用“Ctrl+c”组合键,而对于后台进程不能用组合键来终止,这时就可以使用kill命令。该命令可以终止前台和后台进程。终止后台进程的原因包括:该进程占用CPU的时间过多、该进程已经死锁等。
kill命令是通过向进程发送指定的信号来结束进程的。如果没有指定发送的信号,那么默认值为TERM信号。TERM信号将终止所有不能捕获该信号的进程。至于那些可以捕获该信号的进程可能就需要使用KILL信号(它的编号为9),而该信号不能被捕捉。
kill命令的浯法格式有以下两种方式:
kill [-s 信号 | -p] [-a] 进程号…
kill -l [信号]
其中进程号可以通过ps命令的输出得到。-s选项是给程序发送指定的信号,详细的信号可以用“kill -l”命令查看;-p选项只显示指定进程的ID号。
杀死pid为1409的进程,在root权限下执行如下命令:
# kill -9 1409
显示所有的信号及其编号对应关系,示例如下:
$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
5.6.2 调度启动进程
有时候需要对系统进行一些比较费时而且占用资源的维护工作,这些工作适合在深夜进行,这时候用户就可以事先进行调度安排,指定任务运行的时间或者场合,到时候系统会自动完成这些任务。要使用自动启动进程的功能,就需要掌握以下几个启动命令。
5.6.2.1 定时运行一批程序(at)
1 at命令
用户使用at命令在指定时刻执行指定的命令序列。该命令至少需要指定一个命令和一个执行时间。at命令可以只指定时间,也可以时间和日期一起指定。
at命令的语法格式如下:
at [-V] [-q 队列] [-f 文件名] [-mldbv] 时间
at -c 作业 [作业…]
2 设置时间
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日,可用命令格式如下:
at 4:30pm
at 16:30
at 16:30 today
at now+4 hours
at now+ 240 minutes
at 16:30 7.6.19
at 16:30 6/7/19
at 16:30 Jun 7
以上这些命令表达的意义是完全一样的,所以在安排时间的时候完全可以根据个人喜好和具体情况自由选择。一般采用绝对时间的24小时计时法可以避免由于用户自己的疏忽造成计时错误,例如上例可以写成:at 16:30 6/7/19。
3 执行权限
对于at命令来说,需要定时执行的命令是从标准输入或者使用-f选项指定的文件中读取并执行的。如果at命令是从一个使用su命令切换到用户shell中执行的,那么当前用户被认为是执行用户,所有的错误和输出结果都会送给这个用户。但是如果有邮件送出的话,收到邮件的将是原来的用户,也就是登录时shell的所有者。
例如在6月8日上午10点执行slocate -u命令。在root权限下执行命令如下:
# at 10:00 6/8/19
at> slocate -u
at>
[1]+ Stopped at 10:00 6/8/19
上面的结果中,输入at命令之后,会出现提示符at>,提示用户输入命令,在此输入了slocate -u,然后按回车键。还可以输入多条命令,当所有要执行的命令输入结束后,按Ctrl+d键结束at命令。
在任何情况下,管理员账户都可以使用这个命令。对于其他用户来说,是否可以使用就取决于/etc/at.allow和/etc/at.deny文件。
5.6.2.2 周期性运行一批程序(cron)
前面介绍at命令都会在一定时间内完成一定任务,但是它只能执行一次。也就是说,当指定了运行命令后,系统在指定时间完成任务,以后就不再执行了。但是在很多情况下需要周期性重复执行一些命令,这时候就需要使用cron命令来完成任务。
1 运行机制
首先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中要执行的命令。
2 crontab命令
crontab命令用于安装、删除或者显示用于驱动cron后台进程的表格。用户把需要执行的命令序列放到crontab文件中以获得执行,而且每个用户都可以有自己的crontab文件。
crontab命令的常用方法如下:
crontab -u //设置某个用户的cron服务,root用户在执行crontab时需要此参数。
crontab -l //列出某个用户cron服务的详细内容。
crontab -r //删除某个用户的cron服务。
crontab -e //编辑某个用户的cron服务。
例如root查看自己的cron设置。命令如下:
# crontab -u root -l
3 crontab文件
在crontab文件中输入需要执行的命令和时间。该文件中每行都包括6个域,其中前5个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:
minute hour day-of-month month-of-year day-of-week commands
对于每一项的说明如所示。
表 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文件中对应的行如下:
* 18-22/2 * * * echo "sleepy" >> /tmp/test.txt
每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件。此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e来编辑。用户也可以另外建立一个文件,使用“cron文件名”命令导入cron设置。
假设有个用户名为userexample,它需要为自己创建的一个crontab文件。步骤如下:
首先可以使用任何文本编辑器建立一个新文件,并将向该文件加入需要运行的命令和要定期执行的时间,假设该文件为 ~/userexample.cron。
然后在root权限下使用crontab命令安装这个文件,使用crontab命令使之成为该用户的crontab文件。命令如下:
# crontab -u userexample ~/userexample.cron
这样crontab文件就建立好了,可以转到/var/spool/cron目录下面查看,发现多了一个userexample文件。这个文件就是所需的crontab文件。
说明:cron启动后,每过一分钟读一次crontab文件,检查是否要执行里面的命令。因此该文件被修改后不需要重新启动cron服务。
5.6.2.3 编辑配置文件
cron服务每分钟不仅要读一次/var/spool/cron内的所有文件,还需要读一次/etc/crontab,因此通过配置这个文件也能得到cron的服务。用crontab配置是针对某个用户的,而编辑/etc/crontab是针对系统的任务。此文件的文件格式如下:
SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root //如果出现错误,或者有数据输出,数据作为邮件发给这个账号
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly //每个小时执行一次/etc/cron.hourly里的脚本
02 4 * * * root run-parts /etc/cron.daily //每天执行一次/etc/cron.daily里的脚本
22 4 * * 0 root run-parts /etc/cron.weekly //每周执行一次/etc/cron.weekly里的脚本
42 4 1 * * root run-parts /etc/cron.monthly //每月执行一次/etc/cron.monthly里的脚本
说明:如果去掉run-parts参数,其后面就是运行的某个脚本名,而不是目录名。
5.6.3 挂起/恢复进程
作业控制允许进程挂起并可以在需要时恢复进程的运行,被挂起的作业恢复后将从中止处开始继续运行。只要在键盘上按Ctrl+Z键,即可挂起当前的前台作业。在键盘上按Ctrl+Z键后,将挂起当前执行的命令cat。使用jobs命令可以显示shell的作业清单,包括具体的作业、作业号以及作业当前所处的状态。
恢复进程执行时,有两种选择:用fg命令将挂起的作业放回到前台执行;用bg命令将挂起的作业放到后台执行。灵活使用上述命令,将给自己带来很大的方便。
7 配置网络
5.7.1 使用nmcli命令
说明:使用nmcli命令配置的网络配置可以立即生效且系统重启后配置也不会丢失。
1 nmcli介绍
nmcli是NetworkManager的一个命令行工具,它提供了使用命令行配置由NetworkManager管理网络连接的方法。nmcli命令的基本格式为:
nmcli [OPTIONS] OBJECT { COMMAND | help }
其中,OBJECT选项可以是general、networking、radio、connection或device等。在日常使用中,最常使用的是-t, --terse(用于脚本)、-p, --pretty选项(用于用户)及-h, --help选项,用户可以使用“ nmcli help”获取更多参数及使用信息。
$ nmcli help
2 常用命令使用举例如下:
l 显示NetworkManager状态:
$ nmcli general status
l 显示所有连接:
$ nmcli connection show
l 只显示当前活动连接,如下所示添加 -a, --active:
$ nmcli connection show --active
l 显示由NetworkManager识别到设备及其状态:
$ nmcli device status
l 使用nmcli工具启动和停止网络接口,在root权限下执行如下命令:
# nmcli connection up id enp3s0
# nmcli device disconnect enp3s0
5.7.1.1 设备管理
1 连接到设备
使用如下命令,NetworkManager将连接到对应网络设备,尝试找到合适的连接配置,并激活配置。
$nmcli device connect "$IFNAME"
如果不存在相应的配置连接,NetworkManager将创建并激活具有默认设置的新配置文件。
2 断开设备连接
使用如下命令,NetworkManager将断开设备连接,并防止设备自动激活。
$nmcli device disconnect "$IFNAME"
5.7.1.2 设置网络连接
列出目前可用的网络连接:
$ nmcli con show
NAME UUID TYPE DEVICE
enp4s0 5afce939-400e-42fd-91ee-55ff5b65deab ethernet enp4s0
enp3s0 c88d7b69-f529-35ca-81ab-aa729ac542fd ethernet enp3s0
virbr0 ba552da6-f014-49e3-91fa-ec9c388864fa bridge virbr0
说明:输出结果中的NAME字段代表连接ID(名称)。
添加一个网络连接会生成相应的配置文件,并与相应的设备关联。检查可用的设备,方法如下:
$ nmcli dev status
DEVICE TYPE STATE CONNECTION
enp3s0 ethernet connected enp3s0
enp4s0 ethernet connected enp4s0
virbr0 bridge connected virbr0
lo loopback unmanaged --
virbr0-nic tun unmanaged --
5.7.1.3 配置动态IP连接
1 配置IP
要使用 DHCP 分配网络时,可以使用动态IP配置添加网络配置文件,命令格式如下:
nmcli connection add type ethernet con-name connection-name ifname interface-name
例如创建名为net-test的动态连接配置文件,在root权限下使用以下命令:
# nmcli connection add type ethernet con-name net-test ifname enp3s0
Connection 'net-test' (a771baa0-5064-4296-ac40-5dc8973967ab) successfully added.
NetworkManager 会将参数 connection.autoconnect 设定为 yes,并将设置保存到 “/etc/sysconfig/network-scripts/ifcfg-net-test”文件中,在该文件中会将 ONBOOT 设置为 yes。
2 激活连接并检查状态
在root权限下使用以下命令激活网络连接:
# nmcli con up net-test
Connection successfully activated (D-Bus active path:/org/freedesktop/NetworkManager/ActiveConnection/5)
检查这些设备及连接的状态,使用以下命令:
$ nmcli device status
DEVICE TYPE STATE CONNECTION
enp4s0 ethernet connected enp4s0
enp3s0 ethernet connected net-test
virbr0 bridge connected virbr0
lo loopback unmanaged --
virbr0-nic tun unmanaged --
5.7.1.4 配置静态IP连接
1 配置IP
添加静态 IPv4 配置的网络连接,可使用以下命令:
nmcli connection add type ethernet con-name connection-name ifname interface-name ip4 address gw4 address
说明:如果要添加 IPv6 地址和网关信息,使用 ip6 和 gw6 选项。
例如创建名为 net-static的静态连接配置文件,在root权限下使用以下命令:
# nmcli con add type ethernet con-name net-static ifname enp3s0 ip4 192.168.0.10/24 gw4 192.168.0.254
2 还可为该设备同时指定 IPv6 地址和网关,示例如下:
# nmcli con add type ethernet con-name test-lab ifname enp3s0 ip4 192.168.0.10/24 gw4 192.168.0.254 ip6 abbe::**** gw6 2001:***::*
Connection 'net-static' (63aa2036-8665-f54d-9a92-c3035bad03f7) successfully added.
NetworkManager 会将其内部参数 ipv4.method 设定为 manual,将 connection.autoconnect 设定为yes,并将设置写入 /etc/sysconfig/network-scripts/ifcfg-my-office 文件,其中会将对应 BOOTPROTO 设定为 none,将 ONBOOT 设定为 yes。
3 设定两个 IPv4 DNS 服务器地址,在root权限下使用以下命令:
# nmcli con mod net-static ipv4.dns "*.*.*.* *.*.*.*"
设置两个 IPv6 DNS 服务器地址,在root权限下使用以下命令:
# nmcli con mod net-static ipv6.dns "2001:4860:4860::**** 2001:4860:4860::****"
4 激活连接并检查状态
激活新的网络连接,在root权限下使用以下命令:
# nmcli con up net-static ifname enp3s0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)
5 检查这些设备及连接的状态,使用以下命令:
$ nmcli device status
DEVICE TYPE STATE CONNECTION
enp4s0 ethernet connected enp4s0
enp3s0 ethernet connected net-static
virbr0 bridge connected virbr0
lo loopback unmanaged --
virbr0-nic tun unmanaged --
6 查看配置的连接详情,使用以下命令(使用 -p, --pretty 选项在输出结果中添加标题和分段):
$ nmcli -p con show net-static
===================================================================
Connection profile details (net-static )
===================================================================
connection.id: net-static
connection.uuid: b9f18801-6084-4aee-af28-c8f0598ff5e1
connection.stable-id: --
connect
5.7.1.5 添加 Wi-Fi 连接
有两种方式添加Wi-Fi 连接。
方法1,通过网络接口连接wifi
连接到由SSID或BSSID指定的wifi网络。命令如下,该命令找到匹配的连接或创建一个连接,然后在设备上激活它。
$ nmcli device wifi connect "$SSID" password "$PASSWORD" ifname "$IFNAME"
$ nmcli --ask device wifi connect "$SSID"
方法2,通过配置文件连接Wi-Fi
1,使用以下命令查看可用 Wi-Fi 访问点:
$ nmcli dev wifi list
2,使用以下命令生成使用的静态 IP 配置,但允许自动 DNS 地址分配的 Wi-Fi 连接:
$ nmcli con add con-name Wifi ifname wlan0 type wifi ssid MyWifi ip4 192.168.100.101/24 gw4 192.168.100.1
3,请使用以下命令设定 WPA2 密码,例如 “answer”:
$ nmcli con modify Wifi wifi-sec.key-mgmt wpa-psk
$ nmcli con modify Wifi wifi-sec.psk answer
4,使用以下命令更改 Wi-Fi 状态:
$ nmcli radio wifi [ on | off ]
更改属性
请使用以下命令检查具体属性,比如 mtu:
$ nmcli connection show id 'Wifi ' | grep mtu
802-11-wireless.mtu: auto
使用如下命令更改设置的属性:
$ nmcli connection modify id 'Wifi ' 802-11-wireless.mtu 1350
使用如下命令确认更改:
$ nmcli connection show id 'Wifi ' | grep mtu
802-11-wireless.mtu: 1350
5.7.1.6 配置静态路由
使用nmcli命令为网络连接配置静态路由,使用命令如下:
$ nmcli connection modify enp3s0 +ipv4.routes "192.168.122.0/24 10.10.10.1"
使用编辑器配置静态路由,使用如下命令:
$ 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
5.7.2 使用ip命令
说明:使用ip命令配置的网络配置可以立即生效但系统重启后配置会丢失。
5.7.2.1 配置IP地址
使用ip命令为接口配置地址,命令格式如下,其中 interface-name 为网卡名称。
ip addr [ add | del ] address dev interface-name
5.7.2.2 配置静态地址
在root权限下,配置设置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
5.7.2.3 配置多个地址
ip 命令支持为同一接口分配多个地址,可在root权限下重复多次使用 ip 命令实现分配多个地址。使用示例如下:
# ip address add 192.168.2.223/24 dev enp4s0
# ip address add 192.168.4.223/24 dev enp4s0
# ip addr
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 52:54:00:aa:da:e2 brd ff:ff:ff:ff:ff:ff
inet 192.168.203.12/16 brd 192.168.255.255 scope global dynamic noprefixroute enp4s0
valid_lft 8389sec preferred_lft 8389sec
inet 192.168.2.223/24 scope global enp4s0
valid_lft forever preferred_lft forever
inet 192.168.4.223/24 scope global enp4s0
valid_lft forever preferred_lft forever
inet6 fe80::1eef:5e24:4b67:f07f/64 scope link noprefixroute
valid_lft forever preferred_lft forever
5.7.2.4 配置静态路由
如果需要静态路由,可使用 ip route add 命令在路由表中添加,使用 ip route del 命令删除。最常使用的 ip route 命令格式如下:
ip route [ add | del | change | append | replace ] destination-address
在root权限下使用 ip route 命令显示当前的 IP 路由表。示例如下:
# ip route
default via 192.168.0.1 dev enp3s0 proto dhcp metric 100
default via 192.168.0.1 dev enp4s0 proto dhcp metric 101
192.168.0.0/16 dev enp3s0 proto kernel scope link src 192.168.202.248 metric 100
192.168.0.0/16 dev enp4s0 proto kernel scope link src 192.168.203.12 metric 101
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1 linkdown
在主机地址中添加一个静态路由,在 root 权限下,使用以下命令格式:
ip route add 192.168.2.1 via 10.0.0.1 [dev interface-name]
其中 192.168.2.1 是用点分隔的十进制符号中的 IP 地址,10.0.0.1 是下一个跃点,interface-name 是进入下一个跃点的退出接口。
要在网络中添加一个静态路由,即代表 IP 地址范围的 IP 地址,请在root权限下运行以下命令格式:
ip route add 192.168.2.0/24 via 10.0.0.1 [dev interface-name]
其中 192.168.2.1 是目标网络的 IP 地址,10.0.0.1 是网络前缀,interface-name为网卡名称。
5.7.3 通过ifcfg文件配置网络
说明:通过ifcfg文件配置的网络配置不会立即生效,需要在root权限下执行systemctl reload NetworkManager命令以重启网络服务后才生效。
5.7.3.1 配置静态网络
以enp4s0网络接口进行静态网络设置为例,通过在root权限下修改ifcfg文件实现,在/etc/sysconfig/network-scripts/目录中生成名为ifcfg-enp4s0的文件中,修改参数配置,示例如下:
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=none
IPADDR=192.168.0.10
PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=enp4s0static
UUID=08c3a30e-c5e2-4d7b-831f-26c3cdc29293
DEVICE=enp4s0
ONBOOT=yes
5.7.3.2 配置动态网络
要通过ifcfg文件为em1接口配置动态网络,请按照如下操作在/etc/sysconfig/network-scripts/目录中生成名为 ifcfg-em1 的文件,示例如下:
DEVICE=em1
BOOTPROTO=dhcp
ONBOOT=yes
要配置一个向DHCP服务器发送不同的主机名的接口,请在ifcfg文件中新增一行内容,如下所示:
DHCP_HOSTNAME=hostname
要配置忽略由DHCP服务器发送的路由,防止网络服务使用从DHCP服务器接收的DNS服务器更新/etc/resolv.conf。请在ifcfg文件中新增一行内容,如下所示:
PEERDNS=no
要配置一个接口使用具体DNS服务器,请将参数PEERDNS=no,并在ifcfg文件中添加以下行:
DNS1=ip-address
DNS2=ip-address
其中ip-address是DNS服务器的地址。这样就会让网络服务使用指定的DNS服务器更新/etc/resolv.conf。
5.7.3.3 配置默认网关
在确定默认网关时,首先解析 /etc/sysconfig/network 文件,然后解析 ifcfg 文件 ,将最后读取的 GATEWAY 的取值作为路由表中的默认路由。
在动态网络环境中,使用 NetworkManager 管理主机时,建议设置为由 DHCP 来分配。
5.7.4 配置主机名
5.7.4.1 简介
hostname有三种类型:static、transient和pretty。
static:静态主机名,可由用户自行设置,并保存在/etc/hostname 文件中。
transient:动态主机名,由内核维护,初始是 static 主机名,默认值为“localhost”。可由DHCP或mDNS在运行时更改。
pretty:灵活主机名,允许使用自由形式(包括特殊/空白字符)进行设置。静态/动态主机名遵从域名的通用限制。
说明:static和transient主机名只能包含a-z、A-Z、0-9、“-”、“_”和“.”,不能在开头或结尾处使用句点,不允许使用两个相连的句点,大小限制为 64 个字符。
5.7.4.2 使用hostnamectl配置主机名
1 查看所有主机名
查看当前的主机名,使用如下命令:
$ hostnamectl status
说明:如果命令未指定任何选项,则默认使用status选项。
2 设定所有主机名
在root权限下,设定系统中的所有主机名,使用如下命令:
# hostnamectl set-hostname name
3 设定特定主机名
在root权限下,通过不同的参数来设定特定主机名,使用如下命令:
# hostnamectl set-hostname name [option...]
其中option可以是--pretty、--static、--transient中的一个或多个选项。
如果--static或--transient与--pretty选项一同使用时,则会将static和transient主机名简化为pretty主机名格式,使用“-”替换空格,并删除特殊字符。
当设定pretty主机名时,如果主机名中包含空格或单引号,需要使用引号。命令示例如下:
# hostnamectl set-hostname "Stephen's notebook" --pretty
4 清除特定主机名
要清除特定主机名,并将其还原为默认形式,在root权限下,使用如下命令:
# hostnamectl set-hostname "" [option...]
其中 "" 是空白字符串,option是--pretty、--static和--transient中的一个或多个选项。
5 远程更改主机名
在远程系统中运行hostnamectl命令时,要使用-H,--host 选项,在root权限下使用如下命令:
# hostnamectl set-hostname -H [username]@hostname new_hostname
其中hostname是要配置的远程主机,username为自选项,new_hostname为新主机名。hostnamectl会通过SSH连接到远程系统。
5.7.4.3 使用nmcli配置主机名
查询static主机名,使用如下命令:
$ nmcli general hostname
在root权限下,将static主机名设定为host-server,使用如下命令:
# nmcli general hostname host-server
要让系统hostnamectl感知到static主机名的更改,在root权限下,重启hostnamed服务,使用如下命令:
# systemctl restart systemd-hostnamed
5.7.5 配置网络绑定
5.7.5.1 使用nmcli
创建名为mybond0的绑定,使用示例如下:
$ nmcli con add type bond con-name mybond0 ifname mybond0 mode active-backup
添加从属接口,使用示例如下:
$ nmcli con add type bond-slave ifname enp3s0 master mybond0
要添加其他从属接口,重复上一个命令,并在命令中使用新的接口,使用示例如下:
$ 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)
5.7.5.2 使用命令行
1 检查是否已安装Bonding内核模块
在系统中默认已加载相应模块。要载入绑定模块,可在root权限下使用如下命令:
# modprobe --first-time bonding
显示该模块的信息,可在root权限下使用如下命令:
# modinfo bonding
更多命令请在root权限下使用modprobe --help查看。
2 创建频道绑定接口
要创建绑定接口,可在root权限下通过在 /etc/sysconfig/network-scripts/ 目录中创建名为 ifcfg-bondN 的文件(使用接口号码替换 N,比如 0)。
根据要绑定接口类型的配置文件来编写相应的内容,比如网络接口。接口配置文件示例如下:
DEVICE=bond0
NAME=bond0
TYPE=Bond
BONDING_MASTER=yes
IPADDR=192.168.1.1
PREFIX=24
ONBOOT=yes
BOOTPROTO=none
BONDING_OPTS="bonding parameters separated by spaces"
3 创建从属接口
创建频道绑定接口后,必须在从属接口的配置文件中添加 MASTER 和 SLAVE 指令。
例如将两个网络接口enp3s0 和 enp4s0 以频道方式绑定,其配置文件示例分别如下:
TYPE=Ethernet
NAME=bond-slave-enp3s0
UUID=3b7601d1-b373-4fdf-a996-9d267d1cac40
DEVICE=enp3s0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
TYPE=Ethernet
NAME=bond-slave-enp4s0
UUID=00f0482c-824f-478f-9479-abf947f01c4a
DEVICE=enp4s0
ONBOOT=yes
MASTER=bond0
SLAVE=yes
4 激活频道绑定
要激活绑定,则需要启动所有从属接口。请在root权限下,运行以下命令:
# ifup enp3s0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
# ifup enp4s0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/8)
说明:对于已经处于“up”状态的接口,请首先使用“ifdown enp3s0 ”命令修改状态为down,其中 enp3s0 为实际网卡名称。
完成后,启动所有从属接口以便启动绑定(不将其设定为 “down”)。
要让 NetworkManager 感知到系统所做的修改,在每次修改后,请在root权限下,运行以下命令:
# nmcli con load /etc/sysconfig/network-scripts/ifcfg-device
查看绑定接口的状态,请在root权限下运行以下命令:
# ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:aa:ad:4a brd ff:ff:ff:ff:ff:ff
3: enp4s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 52:54:00:aa:da:e2 brd ff:ff:ff:ff:ff:ff
4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default qlen 1000
link/ether 86:a1:10:fb:ef:07 brd ff:ff:ff:ff:ff:ff
5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc fq_codel master virbr0 state DOWN mode DEFAULT group default qlen 1000
link/ether 52:54:00:29:35:4c brd ff:ff:ff:ff:ff:ff
5.7.5.3 创建多个绑定
系统会为每个绑定创建一个频道绑定接口,包括 BONDING_OPTS 指令。使用这个配置方法可让多个绑定设备使用不同的配置。请按照以下操作创建多个频道绑定接口:
创建多个 ifcfg-bondN 文件,文件中包含 BONDING_OPTS 指令,让网络脚本根据需要创建绑定接口。
创建或编辑要绑定的现有接口配置文件,添加 SLAVE 指令。
使用 MASTER 指令工具在频道绑定接口中分配要绑定的接口,即从属接口。
以下是频道绑定接口配置文件示例:
DEVICE=bondN
NAME=bondN
TYPE=Bond
BONDING_MASTER=yes
IPADDR=192.168.1.1
PREFIX=24
ONBOOT=yes
BOOTPROTO=none
BONDING_OPTS="bonding parameters separated by spaces"
在这个示例中,使用绑定接口的号码替换 N。例如要创建两个接口,则需要使用正确的 IP 地址创建两个配置文件 ifcfg-bond0 和 ifcfg-bond1。
5.7.6 IPv6使用差异说明(vs IPv4)
5.7.6.1 约束限制
chrony支持全局地址(global address),不支持链路本地地址(link-local address)。
Firefox支持通过http/https协议访问全局地址(global address),不支持链路本地地址(link-local address)。
5.7.6.2 配置说明
1 设置接口设备MTU值
IPv6场景中会发现整个路由路径中的最小mtu的值作为当前链接的PMTU的值,源端根据PMTU的值确定是否进行分片发送,而在整个路径中的其它设备将不再需要进行分片处理,从而可以降低中间路由设备的负载大小。其中IPv6 PMTU设置的最小值为1280。
2 设置接口设备的mtu
如果在配置了IPv6地址的接口上设置mtu的值小于1280(IPv6 PMTU设置的最小值),则会导致该接口的IPv6地址被删除。并且无法再次添加IPv6地址。所以在IPv6场景中,对接口设备的mtu的配置一定要大于等于1280。 请在root权限下运行如下命令查看具体现象:
# ip addr show enp3s0
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx
inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0
valid_lft 38663sec preferred_lft 38663sec
inet6 2001:222::2/64 scope global
valid_lft forever preferred_lft forever
# ip link set dev enp3s0 mtu 1200
# ip addr show enp3s0
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1200 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx
inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0
valid_lft 38642sec preferred_lft 38642sec
# ip addr add 2001:222::2/64 dev enp3s0
RTNETLINK answers: No buffer space available
# ip link set dev enp3s0 mtu 1500
# ip addr show enp3s0
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx
inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0
valid_lft 38538sec preferred_lft 38538sec
# ip addr add 2001:222::2/64 dev enp3s0
# ip addr show enp3s0
3: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 52:54:00:62:xx:xx brd ff:ff:ff:ff:xx:xx
inet 10.41.125.236/16 brd 10.41.255.255 scope global noprefixroute dynamic enp3s0
valid_lft 38531sec preferred_lft 38531sec
inet6 2001:222::2/64 scope global
valid_lft forever preferred_lft forever
5.7.6.3 有状态自动配置IPv6地址
IPv6与IPv4都可以在root权限下通过DHCP的方式获得IP地址。IPv6地址有两种配置方式:无状态自动配置和有状态自动配置。
5.7.6.4 无状态自动配置
不需要DHCP服务进行管理,设备根据网络RA(路由公告)获得网络前缀,或者link-local地址为固定fe80::。而接口ID则根据ifcfg配置IPV6_ADDR_GEN_MODE的具体设置来进行自动获得:
IPv6_ADDR_GEN_MODE="stable-privacy" 则根据设备及网络环境来确定一个随机接口ID。
IPv6_ADDR_GEN_MODE="EUI64" 则根据设备MAC地址来确定接口ID。
有状态自动配置:需要DHCP服务器进行管理分配,服从DHCPv6协议来从DHCPv6服务器端租赁IPv6地址。
在有状态自动配置IPv6地址时,DHCPv6服务端可以通过客户端设置的vendor class将客户端进行分类,不同类别分配不同地址段的IPv6地址。在IPv4场景中,客户端可以直接用dhclient的-V选项来设置vendor-class-identifier,DHCP服务端在配置文件中根据vendor-class-identifier来对客户端进行分类处理。而IPv6场景中,如果使用同样的方法对客户端分类,则分类并不会生效。
dhclient -6 <interface> -V <vendor-class-identifier string> <interface>
这是由于DHCPv6和DHCP协议存在较大差异,DHCPv6的可选项中使用vendor-class-option替代了DHCP中的vendor-class-identifier。而dhclient的-V选项并不能设置vendor-class-option。
有状态自动配置IPv6地址时dhclient设置vendor class方法
在客户端使用配置文件方式添加对vendor class的设置,使用方法如下:
客户端配置文件(/etc/dhcp/dhclient6.conf),文件位置可以自定义,在使用时需要通过dhclient -cf选项来指定配置文件:
option dhcp6.vendor-class code 16 = {integer 32, integer 16, string};
interface "enp3s0" {
send dhcp6.vendor-class <Enterprise-ID number> <vendor class string length> <vendor class string>;
}
说明:
l <Enterprise-ID number>,32位整型数字,企业标识号,企业通过IANA注册。
l <vendor class string length>,16位整型数字,vendor class字符串长度。
l <vendor class string>,要设置的vendor class字符串,例如:“HWHW”。
客户端使用方法:
dhclient -6 <interface> -cf /etc/dhcp/dhclient6.conf
DHCPv6服务端配置文件(/etc/dhcp/dhcpd6.conf),需要dhcpd -cf选项来指定该配置文件:
option dhcp6.vendor-class code 16 = {integer 32, integer 16, string};
subnet6 fc00:4:12:ffff::/64 {
class "hw" {
match if substring ( option dhcp6.vendor-class, 6, 10 ) = "HWHW";
}
pool6 {
allow members of "hw";
range6 fc00:4:12:ffff::ff10 fc00:4:12:ffff::ff20;
}
pool6 {
allow unknown clients;
range6 fc00:4:12:ffff::100 fc00:4:12:ffff::120;
}
}
说明:
substring ( option dhcp6.vendor-class, 6, 10 ) 其中子字符串的开始位置为6,因为前面包含4个字节的<Enterprise-ID number>和2个字节的<string length>。而子字符串的结束位置位:6+<vendor class string length>。这里vendor class string为“HWHW”,字符串的长度为4,所以子字符串的结束位置为6+4=10。用户可以根据实际需要来确定<vendor class string>及相应的<vendor class string length>。
服务端使用方法:
dhcpd -6 -cf /etc/dhcp/dhcpd6.conf <interface>
5.7.7 内核支持socket相关系统调用
5.7.7.1 概述
IPv6地址长度扩展到128比特,所以有足够的IPv6地址可供分配使用。同时IPv6头相比IPv4头进行了简化,并增强了IPv6的自动配置功能。IPv6地址分为单播地址,组播地址和任意播地址。常用的单播地址又包含:链路本地地址(link-local address),唯一本地地址(Unique local address)和全局地址(global address)。由于IPv6的全局地址十分充足,唯一本地地址一般不被使用(其前身为站点本地地址(site-local address),已于2004年被废弃)。当前主要使用的单播地址为:链路本地地址(link-local address)和全局地址(global address)。当前内核支持socket系统调用,在使用单播地址的链路本地地址和全局地址时存在差异。
5.7.7.2 link-local地址和global地址在socket调用时的差异
RFC 2553: Basic Socket Interface Extensions for IPv6 定义sockaddr_in6的数据结构如下;
struct sockaddr_in6 {
uint8_t sin6_len; /* length of this struct */
sa_family_t sin6_family; /* AF_INET6 */
in_port_t sin6_port; /* transport layer port # */
uint32_t sin6_flowinfo; /* IPv6 flow information */
struct in6_addr sin6_addr; /* IPv6 address */
uint32_t sin6_scope_id; /* set of interfaces for a scope */
};
说明:
sin6_scope_id: 32位整型,对于链路本地地址(link-local address),对于链路范围的sin6_addr,它可以用来标识指定的接口索引号。如果是站点范围的sin6_addr,则用来作为站点的标识符(站点本地地址已被抛弃)。
在使用link-local地址进行socket通信时,在构造目的地址时,需要制定该地址所对应的接口索引号。一般可以通过if_nametoindex函数将接口名转化为接口索引号。具体方式如下,
int port = 1234;
int sk_fd;
int iff_index = 0;
char iff_name[100] = "enp3s0";
char * ll_addr[100] = "fe80::123:456:789";
struct sockaddr_in6 server_addr;
memset(&server_addr,0,sizeof(structsockaddr_in6));
iff_index=if_nametoindex(iff_name);
server_addr.sin6_family=AF_INET6;
server_addr.sin6_port=htons(port);
server_addr.sin6_scope_id=iff_index;
inet_pton(AF_INET6, ll_addr, &(server_addr.sin6_addr));
sk_fd=socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP);
connect(sk_fd, (struct sockaddr *)&server_addr, sizeof(struct sockaddr_in6));
5.7.8 IPv4的dhclient守护进程持久化配置
5.7.8.1 概述
通过NetworkManager服务来管理网络服务时,如果接口ifcfg-<interface-name>配置文件中配置了DHCP方式获得IP地址,则相应地NetworkManager服务会拉起dhclient守护进程来通过DHCP协议方式来从DHCP服务器获取IP地址。
dhclient提供了"-1"选项来决定dhclient进程在未获得DHCP服务响应时,是会不断持久化尝试请求地址还是会尝试时间超时后退出。针对IPv4的dhclient守护进程,可以在ifcfg-<interface-name>配置文件中设置PERSISTENT_DHCLIENT来决定是否设置IPv4的dhclient进程的持久化。
5.7.8.2 约束限制
当dhclient进程在运行中被杀死,network服务无法自动将其拉起,可靠性需要用户自己保障。
配置了持久化选项PERSISTENT_DHCLIENT,需要确保有相应的DHCP服务器。如果在拉起network时无可用DHCP服务器,dhclient进程不断尝试发送请求包但无回应,则会导致network服务卡死直到network服务超时失败。由于network服务在拉起多个网卡的IPv4 dhclient进程时,是通过串行的方式来拉起的。如果有网卡配置了持久化而DHCP服务器没有准备好,则会导致network服务在给该网卡获取IPv4地址超时卡死,进而导致后续网卡无法获得IPv4/IPv6地址。
以上两种约束限制是特殊的应用场景,需要用户自己进行可靠性保障。
IPv4 DHCP和IPv6 DHCPv6方式获取地址的配置差异
可以通过配置接口ifcfg-<interface-name>参数来分别实现IPv4和IPv6通过DHCP/DHCPv6协议来动态获取IP地址,具体配置说明如下;
BOOTPROTO=none|bootp|dhcp
DHCPV6C=yes|no
PERSISTENT_DHCLIENT=yes|no|1|0
BOOTPROTO: none表示静态配置IPv4地址,bootp|dhcp则会拉起DHCP dhclient来动态获取IPv4地址。
DHCPV6C: no表示静态配置IPv6地址,yes则会拉起DHCPv6 dhclient来动态获取IPv6地址。
PERSISTENT_DHCLIENT:no|0表示IPv4的dhclient进程配置为“非持久化”,当dhclient向DHCP服务器发送一次请求报文而无响应,则会间隔一段时间后退出,退出值为2。yes|1则表示IPv4的dhclient进程配置为“持久化”,dhclient会向DHCP服务器反复发送请求报文。如果没有配置PERSISTENT_DHCLIENT项,则IPv4的dhclient会默认设置为“持久化”。
说明:PERSISTENT_DHCLIENT配置只针对IPv4生效,对IPv6相关dhclient -6进程不生效,IPv6默认不进行持久化配置。
5.7.9 iproute相关命令配置IPv4与IPv6时的差异说明
5.7.9.1 概述
由于IPv4和IPv6是两个不同的协议标准,iproute相关命令在使用方法上存在一定的差异。本章节主要梳理iproute包中用户经常使用到命令在IPv4和IPv6使用方面的差异,从而可以更好地指导用户使用iproute包中相关命令。
iproute相关命令均需要在root权限下运行。
5.7.9.2 IPv6地址的生命周期
Pv6状态 | 解释 |
tentative | 临时状态:刚添加地址还处于地址重复检测DAD过程 |
preferred | 首选状态:完成DAD过程,没有收到相应的NA报文,表示该地址没有冲突。 |
deprecated | 弃用状态:地址有一定的使用时限(valid_lft和preferred_lft),preferred_lft到期后地址会变化deprecated状态。 该状态下的地址不能用于创建新的连接,但是原有的连接可以继续使用。 |
invalid | 无效状态:使用时限超过preferred_lft一段时间后仍然没有成功进行租约续约,则valid_lft时间到后地址状态会被设置为invalid,表示该地址不可以再被使用。 |
其它说明:
l preferred_lft:preferred lifetime,地址为首选状态的寿命,preferred_lft没有到期的地址可以用于正常通信使用,若有多个preferred地址则按照内核具体机制选择地址。
l valid_lft: valid lifetime,地址有效的寿命,在[preferred_lft, valid_lft]时间段内该地址不能被用于新建连接,已经创建的连接继续有效。
5.7.9.3 ip link 命令
命令:
ip link set IFNAME mtu MTU
IPv6中PMTU的最小值为1280,如果mtu值设置小于1280则会导致IPv6地址丢失。其它设备无法ping通该IPv6地址。
5.7.9.4 ip addr命令
命令:
ip [-6] addr add IFADDR dev IFNAME
添加IPv6地址可以选择添加-6选项也可以不添加,ip addr命令会根据具体地址类型来判断是ipv4地址还是IPv6地址。
如果指定“-6”选项,但是IFADDR 是ipv4地址则会有错误返回。
命令:
ip [-6] addr add IFADDR dev IFNAME [home|nodad]
[home|nodad] 选项只针对IPv6地址有效。
home:将该地址指定为RFC 6275中定义的家庭地址。(这是移动节点从家庭链路获取的地址, 是移动节点的永久地址,如果移动节点保持在相同的归属链路中,则各种实体之间的通信照常进行。)
nodad:配置该项(仅限IPv6)添加此地址时不执行重复地址检测DAD(RFC 4862)。如果一台设备上多个接口通过nodad配置了多个相同的IPv6地址,则会按照接口顺序使用该IPv6地址。同一个接口上不能添加一个nodad一个非nodad的相同IPv6地址。因为两个地址是一样的,所以会报“RTNETLINK answers: File exists”。
命令:
ip [-6] addr del IFADDR dev IFNAME
删除IPv6地址可以选择添加-6选项也可以不添加,ip addr del命令会根据具体地址类型来判断是ipv4地址还是IPv6地址。
命令:
ip [-6] addr show dev IFNAME [tentative|-tentative|deprecated|-deprecated|dadfailed|-dadfailed|temporary]
l 不指定-6选项,则会同时打印IPv4和IPv6地址。指定-6选项则只打印IPv6地址。
l [tentative|-tentative|deprecated|-deprecated|dadfailed|-dadfailed|temporary],这些选项只针对IPv6,可以根据IPv6地址状态对地址进行筛选查看。tentative:(仅限IPv6)仅列出尚未通过重复地址检测的地址。
1. -tentative:(仅限IPv6)仅列出当前未处于重复地址检测过程中的地址。
2. deprecated:(仅限IPv6)仅列出已弃用的地址。
3. -deprecated:(仅限IPv6)仅列出未弃用的地址。
4. dadfailed:(仅限IPv6)仅列出重复地址检测失败的地址。
5. -dadfailed:(仅限IPv6)仅列出未重复地址检测失败的地址。
6. temporary:(仅限IPv6)仅列出临时地址
5.7.9.5 ip route命令
命令:
ip [-6] route add ROUTE [mtu lock MTU]
-6选项:添加IPv6路由可以选择添加-6选项也可以不添加,ip route命令会根据具体地址类型来判断是IPv4地址还是IPv6地址。
mtu lock MTU:锁定路由的MTU值。如果不锁定MTU,则MTU的值则可能在PMTUD过程中被内核改变。如果锁定MTU,则不会尝试PMTUD,所有IPv4包都将不设置DF位发出,IPv6包则会按照MTU进行分段处理。
命令:
ip [-6] route del ROUTE
删除IPv6路由可以选择添加-6选项也可以不添加,ip route命令会根据具体地址类型来判断是IPv4地址还是IPv6地址。
5.7.9.6 ip rule命令
命令:
ip [-6] rule list
-6选项:设置-6选项打印IPv6的策略路由,不设置-6选项打印IPv4的策略路由。所以需要根据具体协议类型来配置-6选项。
命令:
ip [-6] rule [add|del] [from|to] ADDR table TABLE pref PREF
-6选项:IPv6相关的策略路由表项需要设置-6选项,否则会报错:“Error: Invalid source address.”。相应地,IPv4相关的策略路由表项不可以设置-6选项,否则会报错:“Error: Invalid source address.”。
5.7.10 NetworkManager服务配置差异说明
5.7.10.1 概述
NetworkManager服务使用ifup/ifdown的逻辑接口定义进行高级网络设置。其参数大多数都是在/etc/sysconfig/network和/etc/sysconfig/network-scripts/ifcfg-<interface-name>两个配置文件设置。前者为全局设置,后者为指定网卡的设置,当两者有冲突时,后者生效。
5.7.10.2 配置差异说明
其中在/etc/sysconfig/network下的配置差异有:
IPv4 | IPv6 | 含义说明 |
NA | IPV6FORWARDING=yes|no | IPv6转发, 默认不转发。 |
NA | IPV6_AUTOCONF=yes|no | IPv6转发 打开是no,否则是yes。 |
NA | IPV6_ROUTER=yes|no | IPv6转发 打开是yes,否则是no。 |
NA | IPV6_AUTOTUNNEL=yes|no | 指定Tunnel为自动隧道模式, 默认是no。 |
GATEWAY | IPV6_DEFAULTGW=<IPv6 address[%interface]> (optional) | 在IPv6中设置默认网关。 |
NA | IPV6_DEFAULTDEV=<interface> (optional) | 指定默认转发的网卡。 |
NA | IPV6_RADVD_PIDFILE=<pid-file> (optional) | 默认ipv6_radvd_pid路径:/var/run/radvd/radvd.pid。 |
NA | IPV6_RADVD_TRIGGER_ACTION=startstop|reload|restart|SIGHUP (optional) | radvd默认触发动作。 |
而在/etc/sysconfig/network-scripts/ifcfg-<interface-name>下的差异主要有:
IPv4 | IPv6 | 含义说明 |
IPADDRn | IPV6ADDR=<IPv6 address>[/<prefix length>] | ip地址。 |
PREFIXn | NA | 网络前缀,网络别名和ppp无效,优先级高于NETMASK。 |
NETMASKn | NA | 子网掩码,仅用于别名和ppp。 |
GATEWAY | IPV6_DEFAULTGW=<IPv6 address[%interface]> (optional) | 默认网关。 |
MTU | IPV6_MTU=<MTU of link> (optional) | 默认MTU。 |
IPV4_FAILURE_FATAL=yes|no | IPV6_FAILURE_FATAL | 默认值是no。若设置为yes,dhclient失败ifup-eth会直接退出。 |
NA | IPV6_PRIVACY=rfc3041 | 默认禁用。 |
NA | IPV6INIT=yes|no | 默认开启IPv6。 |
NA | IPV6FORWARDING=yes|no | 默认关闭,已废弃。 |
5.7.11 FAQ
5.7.11.1 iscsi-initiator-utils不支持登录fe80 IPv6地址
问题现象
客户端通过IPv6登录iscsi服务端时,使用如“iscsiadm -m node -p ipv6address -l”的命令格式登录,如果是全局地址(global address),直接替换将命令范例中的“ipv6address”替换为全局地址即可;但如果是链路本地地址(link-local address,fe80开头的IPv6地址)则无法使用,因为iscsi-initiator-utils目前机制还不支持用链路本地地址(link-local address)地址登录iscsi服务端。
原因分析
如果使用格式如“iscsiadm -m node -p fe80::xxxx -l”登录,会登录超时返回,这是因为使用链路本地地址必须指定接口,否则使用iscsi_io_tcp_connect函数调用connect函数会失败,并且产生标准错误码22。
如果使用格式如“iscsiadm -m node -p fe80::xxxx%enp3s0 -l”登录时,iscsi_addr_match函数会将地址“fe80::xxxx%enp3s0”与服务端返回的node信息中的地址“fe80::xxxx”对比,对比结果不匹配,导致登录失败。
因此,iscsi-initiator-utils目前机制还不支持用链路本地地址(link-local address)登录iscsi服务端。
5.7.11.2 网卡down掉之后,IPv6地址丢失
问题现象
通过ip link down+up网卡或ifconfig down+up网卡命令,将网卡down掉之后再上线,查看网卡上配置的ip地址,发现ipv4地址不丢失,而配置的IPv6地址丢失。
原因分析
内核中的处理逻辑为如果网卡设置为down状态,会清空所有IPv4及IPv6地址,将网卡重新up之后,ipv4地址自动恢复,网卡上自动配置的IPv6链路本地地址也会恢复,但是其他IPv6地址默认会丢失。如果需要保留这些IPv6地址,可以通过“sysctl -w net.ipv6.conf.<网卡名>.keep_addr_on_down=1”来实现。
5.7.11.3 bond口已具有多个IPv6地址时,添加或删除IPv6地址耗时过久
问题现象
下列方式配置或删除(包括flush)IPv6地址方式,X为动态变化的低16位,并且配置在bond口时,耗时会随已配置的IPv6地址数量成数倍增加。例如由4个物理网卡组成的bond口添加IPv6地址时,单线程添加删除3000 IPv6地址均需大概5分钟,而普通物理网卡耗时在10秒内。
ip a add/del 192:168::18:X/64 dev DEVICE
原因分析
bond口在添加IPv6地址时,会生成IPv6组播地址,并进行同步到所有的物理网卡上,此耗时会随IPv6数量增加而增加,导致耗时过长。
解决方法
IPv6的组播地址是由IPv6地址的低24位与33-33-ff组合生成,组播地址过多会导致添加删除耗时增加,如果生成的组播地址为少量,耗时不会受此影响。
建议添加IPv6地址时,可保持低24位一致,保持高位变动,单网卡中仅需一个网段的一个地址即可与外部正常通信,此配置更符合常规使用。
5.7.11.4 Rsyslog在IPv4和IPv6混合使用场景中日志传输延迟
问题现象
rsyslog客户端配置文件同时配置IPv4和IPv6地址,且端口配置相同的情况下,服务端收集log时会概率性出现日志打印延迟。
原因分析
延迟是因为rsyslog内部存在缓冲队列机制,默认情况下需要缓冲区队列达到一定数量才会写入文件。
解决方法
可在root权限下通过配置Direct模式,关闭缓冲队列机制解决该问题。在rsyslog远程传输服务端的/etc/rsyslog.d目录下新增的远程传输配置文件中,最开头增加如下配置:
$ActionQueueType Direct
$MainMsgQueueType Direct
说明:
l Direct模式减少队列大小为1,所以在队列中会保留1条日志到下次日志打印;
l Direct模式会降低服务器端的rsyslog性能。
8 使用LVM管理硬盘
5.8.1 LVM简介
LVM是逻辑卷管理(Logical Volume Manager)的简称,它是Linux环境下对磁盘分区进行管理的一种机制。LVM通过在硬盘和文件系统之间添加一个逻辑层,来为文件系统屏蔽下层硬盘分区布局,提高硬盘分区管理的灵活性,
使用LVM管理硬盘的基本过程如下:
1. 将硬盘创建为物理卷
2. 将多个物理卷组合成卷组
3. 在卷组中创建逻辑卷
4. 在逻辑卷之上创建文件系统
通过LVM管理硬盘之后,文件系统不再受限于硬盘的大小,可以分布在多个硬盘上,也可以动态扩容
5.8.2 基本概念
l 物理存储介质(The physical media):指系统的物理存储设备,如硬盘,系统中为/dev/hda、/dev/sda等等,是存储系统最低层的存储单元。
l 物理卷(Physical Volume,PV):指硬盘分区或从逻辑上与磁盘分区具有同样功能的设备(如RAID),是LVM的基本存储逻辑块。物理卷包括一个特殊的标签,该标签默认存放在第二个 512 字节扇区,但也可以将标签放在最开始的四个扇区之一。该标签包含物理卷的随机唯一识别符(UUID),记录块设备的大小和LVM元数据在设备中的存储位置。
l 卷组(Volume Group,VG):由物理卷组成,屏蔽了底层物理卷细节。可在卷组上创建一个或多个逻辑卷且不用考虑具体的物理卷信息。
l 逻辑卷(Logical Volume,LV):卷组不能直接用,需要划分成逻辑卷才能使用。逻辑卷可以格式化成不同的文件系统,挂载后直接使用。
l 物理块(Physical Extent,PE):物理卷以大小相等的“块”为单位存储,块的大小与卷组中逻辑卷块的大小相同。
l 逻辑块(Logical Extent,LE):逻辑卷以“块”为单位存储,在一卷组中的所有逻辑卷的块大小是相同的。
5.8.3 安装
说明:系统默认已安装LVM。可通过rpm -qa | grep lvm2命令查询,若打印信息中包含“lvm2”信息,则表示已安装LVM,可跳过本章节内;若无任何打印信息,则表示未安装,可参考本章节内容进行安装。
1.配置本地yum源,详细信息请参考搭建repo服务器。
2.清除缓存。
$ dnf clean all
3.创建缓存。
$ dnf makecache
4.在root权限下安装LVM。
# dnf install lvm2
5.查看安装后的rpm包。
$ rpm -qa | grep lvm2
5.8.4 管理物理卷
5.8.4.1 创建物理卷
可在root权限下通过pvcreate命令创建物理卷。
pvcreate [option] devname ...
其中:
option:命令参数选项。常用的参数选项有:
l -f:强制创建物理卷,不需要用户确认。
l -u:指定设备的UUID。
l -y:所有的问题都回答“yes”。
devname:指定要创建的物理卷对应的设备名称,如果需要批量创建,可以填写多个设备名称,中间以空格间隔。
示例1:将/dev/sdb、/dev/sdc创建为物理卷。
# pvcreate /dev/sdb /dev/sdc
示例2:将/dev/sdb1、/dev/sdb2创建为物理卷。
# pvcreate /dev/sdb1 /dev/sdb2
5.8.4.2 查看物理卷
可在root权限通过pvdisplay命令查看物理卷的信息,包括:物理卷名称、所属的卷组、物理卷大小、PE大小、总PE数、可用PE数、已分配的PE数和UUID。
pvdisplay [option] devname
其中:
option:命令参数选项。常用的参数选项有:
l -s:以短格式输出。
l -m:显示PE到LE的映射。
devname:指定要查看的物理卷对应的设备名称。如果不指定物理卷名称,则显示所有物理卷的信息。
示例:显示物理卷/dev/sdb的基本信息。
# pvdisplay /dev/sdb
5.8.4.3 修改物理卷属性
可在root权限下通过pvchange命令修改物理卷的属性。
pvchange [option] pvname ...
其中:
option:命令参数选项。常用的参数选项有:
l -u:生成新的UUID。
l -x:是否允许分配PE”。
pvname:指定要要修改属性的物理卷对应的设备名称,如果需要批量修改,可以填写多个设备名称,中间以空格间隔。
示例:禁止分配/dev/sdb物理卷上的PE。
# pvchange -x n /dev/sdb
5.8.4.4 删除物理卷
可在root权限下通过pvremove命令删除物理卷。
pvremove [option] pvname ...
其中:
option:命令参数选项。常用的参数选项有:
l -f:强制删除物理卷,不需要用户确认。
l -y:所有的问题都回答“yes”。
pvname:指定要删除的物理卷对应的设备名称,如果需要批量删除,可以填写多个设备名称,中间以空格间隔。
示例:删除物理卷/dev/sdb。
# pvremove /dev/sdb
5.8.5 管理卷组
5.8.5.1 创建卷组
可在root权限下通过vgcreate命令创建卷组。
vgcreate [option] vgname pvname ...
其中:
option:命令参数选项。常用的参数选项有:
l -l:卷组上允许创建的最大逻辑卷数。
l -p:卷组中允许添加的最大物理卷数。
l -s:卷组上的物理卷的PE大小。
vgname:要创建的卷组名称。
pvname:要加入到卷组中的物理卷名称。
示例:创建卷组 vg1,并且将物理卷/dev/sdb和/dev/sdc添加到卷组中。
# vgcreate vg1 /dev/sdb /dev/sdc
5.8.5.2 查看卷组
可在root权限下通过vgdisplay命令查看卷组的信息。
vgdisplay [option] [vgname]
其中:
option:命令参数选项。常用的参数选项有:
l -s:以短格式输出。
l -A:仅显示活动卷组的属性。
vgname:指定要查看的卷组名称。如果不指定卷组名称,则显示所有卷组的信息。
示例:显示卷组vg1的基本信息。
# vgdisplay vg1
5.8.5.3 修改卷组属性
可在root权限下通过vgchange命令修改卷组的属性。
vgchange [option] vgname
其中:
option:命令参数选项。常用的参数选项有:
l -a:设置卷组的活动状态。
vgname:指定要修改属性的卷组名称。
示例:将卷组vg1状态修改为活动。
# vgchange -ay vg1
5.8.5.4 扩展卷组
可在root权限下通过vgextend命令动态扩展卷组。它通过向卷组中添加物理卷来增加卷组的容量。
vgextend [option] vgname pvname ...
其中:
option:命令参数选项。常用的参数选项有:
l -d:调试模式。
l -t:仅测试。
vgname:要扩展容量的卷组名称。
pvname:要加入到卷组中的物理卷名称。
示例:将卷组vg1中添加物理卷/dev/sdb。
# vgextend vg1 /dev/sdb
5.8.5.5 收缩卷组
可在root权限下通过vgreduce命令删除卷组中的物理卷来减少卷组容量。不能删除卷组中剩余的最后一个物理卷。
vgreduce [option] vgname pvname ...
其中:
option:命令参数选项。常用的参数选项有:
-a:如果命令行中没有指定要删除的物理卷,则删除所有的空物理卷。
--removemissing:删除卷组中丢失的物理卷,使卷组恢复正常状态。
vgname:要收缩容量的卷组名称。
pvname:要从卷组中删除的物理卷名称。
示例:从卷组vg1中移除物理卷/dev/sdb2。
# vgreduce vg1 /dev/sdb2
5.8.5.6 删除卷组
可在root权限下通过vgremove命令删除卷组。
vgremove [option] vgname
其中:
option:命令参数选项。常用的参数选项有:
-f:强制删除卷组,不需要用户确认。
vgname:指定要删除的卷组名称。
示例:删除卷组vg1。
# vgremove vg1
5.8.6 管理逻辑卷
5.8.6.1 创建逻辑卷
可在root权限下通过lvcreate命令创建逻辑卷。
lvcreate [option] vgname
其中:
option:命令参数选项。常用的参数选项有:
l -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节。
l -l:指定逻辑卷的大小(LE数)。
l -n:指定要创建的逻辑卷名称。
l -s:创建快照。
vgname:要创建逻辑卷的卷组名称。
示例1:在卷组vg1中创建10G大小的逻辑卷。
# lvcreate -L 10G vg1
示例2:在卷组vg1中创建200M的逻辑卷,并命名为lv1。
# lvcreate -L 200M -n lv1 vg1
5.8.6.2 查看逻辑卷
可在root权限下通过lvdisplay命令查看逻辑卷的信息,包括逻辑卷空间大小、读写状态和快照信息等属性。
lvdisplay [option] [lvname]
其中:
option:命令参数选项。常用的参数选项有:
-v:显示LE到PE的映射
lvname:指定要显示属性的逻辑卷对应的设备文件。如果省略,则显示所有的逻辑卷属性。
说明:
逻辑卷对应的设备文件保存在卷组目录下,例如:在卷组vg1上创建一个逻辑卷lv1,则此逻辑卷对应的设备文件为/dev/vg1/lv1。
示例:显示逻辑卷lv1的基本信息。
# lvdisplay /dev/vg1/lv1
5.8.6.3 调整逻辑卷大小
可在root权限下通过lvresize命令调整LVM逻辑卷的空间大小,可以增大空间和缩小空间。使用lvresize命令调整逻辑卷空间大小和缩小空间时需要谨慎,因为有可能导致数据丢失。
lvresize [option] vgname
其中:
option:命令参数选项。常用的参数选项有:
l -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节。
l -l:指定逻辑卷的大小(LE数)。
l -f:强制调整逻辑卷大小,不需要用户确认。
lvname:指定要调整的逻辑卷名称。
示例1:为逻辑卷/dev/vg1/lv1增加200M空间。
# lvresize -L +200 /dev/vg1/lv1
示例2:为逻辑卷/dev/vg1/lv1减少200M空间。
# lvresize -L -200 /dev/vg1/lv1
5.8.6.4 扩展逻辑卷
可在root权限下通过lvextend命令动态在线扩展逻辑卷的空间大小,而不中断应用程序对逻辑卷的访问。
lvextend [option] lvname
其中:
option:命令参数选项。常用的参数选项有:
l -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节。
l -l:指定逻辑卷的大小(LE数)。
l -f:强制调整逻辑卷大小,不需要用户确认。
lvname:指定要扩展空间的逻辑卷的设备文件。
示例:为逻辑卷/dev/vg1/lv1增加100M空间。
# lvextend -L +100M /dev/vg1/lv1
5.8.6.5 收缩逻辑卷
可在root权限下通过lvreduce命令减少逻辑卷占用的空间大小。使用lvreduce命令收缩逻辑卷的空间大小有可能会删除逻辑卷上已有的数据,所以在操作前必须进行确认。
lvreduce [option] lvname
其中:
option:命令参数选项。常用的参数选项有:
l -L:指定逻辑卷的大小,单位为“kKmMgGtT”字节。
l -l:指定逻辑卷的大小(LE数)。
l -f:强制调整逻辑卷大小,不需要用户确认。
lvname:指定要扩展空间的逻辑卷的设备文件。
示例:将逻辑卷/dev/vg1/lv1的空间减少100M。
# lvreduce -L -100M /dev/vg1/lv1
5.8.6.6 删除逻辑卷
可在root权限下通过lvremove命令删除逻辑卷。如果逻辑卷已经使用mount命令加载,则不能使用lvremove命令删除。必须使用umount命令卸载后,逻辑卷方可被删除。
lvremove [option] vgname
其中:
option:命令参数选项。常用的参数选项有:
-f:强制删除逻辑卷,不需要用户确认。
vgname:指定要删除的逻辑卷。
示例:删除逻辑卷/dev/vg1/lv1。
# lvremove /dev/vg1/lv1
5.8.7 创建并挂载文件系统
在创建完逻辑卷之后,需要在逻辑卷之上创建文件系统并挂载文件系统到相应目录下。
5.8.7.1 创建文件系统
可在root权限下通过mkfs命令创建文件系统。
mkfs [option] lvname
其中:
option:命令参数选项。常用的参数选项有:
-t:指定创建的linux系统类型,如ext2,ext3,ext4等等,默认类型为ext2。
lvname:指定要创建的文件系统对应的逻辑卷设备文件名。
示例:在逻辑卷/dev/vg1/lv1上创建ext4文件系统。
# mkfs -t ext4 /dev/vg1/lv1
5.8.7.2 手动挂载文件系统
手动挂载的文件系统仅在当时有效,一旦操作系统重启则会不存在。
可在root权限下通过mount命令挂载文件系统。
mount lvname mntpath
其中:
lvname:指定要挂载文件系统的逻辑卷设备文件名。
mntpath:挂载路径。
示例:将逻辑卷/dev/vg1/lv1挂载到/mnt/data目录。
# mount /dev/vg1/lv1 /mnt/data
5.8.7.3 自动挂载文件系统
手动挂载的文件系统在操作系统重启之后会不存在,需要重新手动挂载文件系统。但若在手动挂载文件系统后在root权限下进行如下设置,可以实现操作系统重启后文件系统自动挂载文件系统。
1 执行blkid命令查询逻辑卷的UUID,逻辑卷以/dev/vg1/lv1为例。
# blkid /dev/vg1/lv1
查看打印信息,打印信息中包含如下内容,其中 uuidnumber 是一串数字,为UUID, fstype 为文件系统。
/dev/vg1/lv1: UUID=" uuidnumber " TYPE=" fstype "
2 执行vi /etc/fstab命令编辑fstab文件,并在最后加上如下内容
UUID=uuidnumber mntpath fstype defaults 0 0
内容说明如下:
l 第一列:UUID,此处填写1查询的 uuidnumber 。
l 第二列:文件系统的挂载目录 mntpath 。
l 第三列:文件系统的文件格式,此处填写1查询的 fstype 。
l 第四列:挂载选项,此处以“defaults”为例;
l 第五列:备份选项,设置为“1”时,系统自动对该文件系统进行备份;设置为“0”时,不进行备份。此处以“0”为例;
l 第六列:扫描选项,设置为“1”时,系统在启动时自动对该文件系统进行扫描;设置为“0”时,不进行扫描。此处以“0”为例。
3 验证自动挂载功能。
01.执行umount命令卸载文件系统,逻辑卷以/dev/vg1/lv1为例。
# umount /dev/vg1/lv1
02.执行如下命令,将/etc/fstab文件所有内容重新加载。
# mount -a
03.执行如下命令,查询文件系统挂载信息,挂载目录以/mnt/data为例。
# mount | grep /mnt/data
查看打印信息,若信息中包含如下信息表示自动挂载功能生效。
/dev/vg1/lv1 on /mnt/data