乐趣区

关于linux:⭐Linux实战技能100讲个人笔记-3-系统管理篇

[TOC]

网络管理

对于网络状态罕用工具包

  • net-tools 工具包

    • ifconfig 命令
    • route 命令
    • netstat 命令
  • iproute2 工具包

    • ip 命令
    • ss 命令
  • iputils-ping

    • ping 命令

      很多精简的容器中没有装置该工具

centos 7 之前罕用 net-tools 工具包, 在 centos 7 及之后则主推 iproute2 工具包.

网络接口

命名规定

概念上, 网络接口名和网卡名在我看来指的是同一个货色.

网络接口 (网卡) 可能的命名

  • eno1(板载网卡)
  • ens33(PCI- E 网卡)
  • enp0s3(无奈获取物理信息的 PCI- E 网卡)
  • eth0

    CentOS 7 应用了一致性网络设备命名, 在以上都不匹配时应用 eth0

eth0 网卡

eth0 通常指第一张网卡, 但有时候配置起因, 并不叫 eth0, 因而为了治理不便, 通常会将网卡名转换成统一的 eth0.

操作步骤如下:

  1. 编辑 /etc/default/grub 文件

    ......
    
    # 默认的配置项
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rghb quiet"
    # ↓
    # 在开端追加配置, 批改后的值如下
    # ↓
    GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rghb quiet biosdevname=0 net.ifnames=0"
    
    ......
  2. 更新 grub 理论的配置

    grub2-mkconfig -o /boot/grub2/grub.cfg
    
    选项
        -o, --output        指定生成的文件的地位
  3. 重启

    reboot
  4. 此时网卡名就变成了 eth0

网卡命名规定受 biosdevnamenet.ifnames 两个参数影响

biosdevname net.ifnames 网卡名
默认 0 1 ens33
组合 1 1 0 em1
组合 2 0 0 eth0

如果一开始的网卡名并非 eth0 , 但通过批改 /etc/default/grub 等相干配置来批改网卡名为 eth0 后, 对应的 ifcfg-* 文件名须要手动批改成 ifcfg-eth0, 包含外面的配置项.

网络配置

mii-tool 命令

查看网卡物理连贯状态

mii-tool [< 网卡名 >]

留神
    CentOS 6 无需写网卡名(接口), 间接执行即可
    CentOS 7 须要指定网卡名 (接口) 能力查看状态
    虚拟机上可能无奈执行(云主机也是), 会报错.

ifup 命令

启用网卡

ifup < 接口 >

ifdown 命令

禁用网卡

ifdown < 接口 >

ifconfig 命令 ⭐

属于 net-tools 工具包.

留神: 应用 ifconfig 批改配置因为没有写入配置文件, 因而仅限品位无效, 重启后生效.

配置网络接口


ifconfig                                      # 显示以后无效网络接口状态
ifconfig < 接口 >                                # 显示指定网络接口状态
ifconfig < 接口 > <IP 地址 > [netmask < 子网掩码 >]        # 设置指定网络接口
                                                 # 子网掩码省略时会默认设置为 255.0.0.0
                                                 # !!! 留神, 操作云主机时会导致掉线且无奈重连. 须要到网页控制台关上 ssh 连贯改回来
ifconfig < 接口 > up                            # 启用该网卡, 等价于 ifup < 接口 >
ifconfig < 接口 > down                            # 禁用该网卡. 等价于 ifdown < 接口 >


网卡
    eth0    # 第一块网卡(网络接口)
    lo        # 本地环回

显示字段解释
    ether XX:XX:XX:XX:XX:XX        # 网卡的 MAC 地址

route 命令

属于 net-tools 工具包.

网关配置命令

route [选项]

罕用
    route -n                                               # 查看以后路由规定
    route add default gw < 网关 ip>                             # 增加默认网关
    route del default gw < 网关 ip>                             # 删除默认网关
    
    route add -host < 指定 ip> gw < 网关 ip>                    # 增加一条路由规定
    route add -net < 指定网段 > netmask < 子网掩码 > gw < 网关 ip>    # 增加一条路由规定
    

选项
    -n    不解析主机名(默认解析主机名会比较慢)

ip 命令

属于 iproute2 工具包

ip 命令是 ifconfig, route, ifup, ifdown 的命令集合体

留神: 应用 ip批改配置因为没有写入配置文件, 因而仅限品位无效, 重启后生效.

网络配置命令

ip addr [ls]                        # 等价 ifconfig
ip addr add 10.0.0.1/24 dev eth1    # 等价 ifconfig eth1 10.0.0.1 netmask 255.255.255.0

ip link set dev eth0 up                # 等价 ifup eth0 以及 ifconfig eth0 up

ip route add 10.0.0.0/24 via 192.168.0.1    # 等价于 route add -net 10.0.0.0 netmask 255.255.255.0 gw 192.168.0.1

网络故障排除

首先检测与指标主机网络是否畅通

  1. 首先应用 ping 确认与指标主机连贯
  2. 如果 ping 不同, 则能够用 traceroutemtr 查看两头的路由状况
  3. 如果 ping 不同, 能够用 nslookup 确认域名是否解析失常

确认端口状态

  1. 应用 telnet 查看端口连贯状态
  2. 应用 tcpdump 详细分析数据包

确认服务状态

  1. 应用 netstatss

ping 命令 ⭐

通过发送 ICMP 报文, 检测与指标主机是否畅通

ping < 地址 >

所属包: inetutils-ping

traceroute 命令

用于辅助 ping 命令, ping 不通的时候追踪每一跳路由.

若是两头局部节点不反对 traceroute 的, 则会显示为 *

检测以后主机到指标主机的路由情况

traceroute [选项] < 指标主机 >

示例
    traceroute -w 1 < 指标主机 >

选项
    -w <waittime>, --wait=<waittime>    超时等待时间, 默认 5 秒

mtr 命令 ⭐

用于辅助 ping 命令, ping 不通的时候检测到指标主机的数据包是否有失落.

相较 traceroute 显示的内容更丰盛, 倡议应用 mtr 来确定是否丢包, 它是 ping, nslookup, traceroute 的结合体

网络诊断工具 My traceroute

mtr [选项] < 指标主机 >

选项
    -n, --no-dns                            不解析主机名, 强制显示为 ip
    -c <count>, --report-cycles <COUNT>        设置发送 ping 包的数量
    -r, --report                            通常配合 -c (若未指定则默认 10 次), 在发送完指定包后以报告模式展现后果.


显示后果阐明
                Packets                                Pings(提早 ms)
    Host    Loss%    Snt                Last        Avg        Best    Wrst    StDev
    ip 地址   丢包率    ?                最初一次      均匀     最佳     最差    标准偏差(掂量数值偏离平均值的水平, 越小则偏差越小)

局部显示失落可能是因为 icmp 爱护机制造成的, 并不代表真的丢包.

同时只有最初的指标丢包才算真正的丢包???

nslookup 命令

查问域名对应的 ip

nslookup < 域名 >

dig 命令

发送域名查问信息包到域名服务器

dig < 域名 >

telnet 命令 ⭐

查看端口连贯状态

telnet < 主机 > < 端口 >


留神:
    如果是在非交互式调用 telnet 时, 须要预留工夫用于连贯和数据传输, 示例:
    (usleep 100000; echo "info"; usleep 100000;) | telnet 127.0.0.1 6379

tcpdump 命令 ⭐

网络抓包工具

tcpdump [选项] < 表达式 >

选项
    -i <interface>    监听网络接口(网卡), 不指定时默认 eth0.
                    "any" 示意监听所有
    -n                不进行域名解析, 而是显示 ip
    -w < 文件名 >      将抓包后果保留到指定文件, 能够用 wireshark 图形化工具来查看该文件内容.
    -s < 字节 >          从每个截取指定长度字节的数据, 而不是默认的 68 字节.
    
表达式
    port < 端口 >        指定监听端口
    host < 主机 >        指定监听主机
    
    逻辑表达式
    and                 逻辑与, 比方 port 80 and host 10.0.0.1
    
示例
    telnet -i any port 23 -s 1500 -w /tmp/a.dump        # 抓取 telnet 的包
    
    
Flags 阐明
    S        SYN
    F        FIN
    R        RST
    P        PUSH
    U        URG
    W        ECN CWR
    E        ECN-Echo
    .        ACK
    none    未设置 Flags
# 装置图形化工具的 wireshark
yum install wireshark-gnome

netstat 命令 ⭐

属于 net-tools 工具包.

显示网络连接, 接口状态等信息

netstat [选项]

选项
    显示格局
    -n, --numeric        显示 ip, 而不是对应的域名    
    -p, --program        显示对应的过程
    
    筛选
    -t, --tcp            筛选 TCP
    -u, --udp            筛选 UDP
    -l, --listening        只显示处于监听状态的

ss 命令

属于 iproute2 工具包

vs netstat

一个 socket 查看工具

ss [选项]

选项
    显示格局
    -n, --numeric        显示 ip, 而不是对应的域名    
    -p, --program        显示对应的过程
    
    筛选
    -a, --all            显示处于 listening 和 non-listening 的 socket(对于 TCP 则蕴含 ESTABLISHE 连贯)
    -t, --tcp            显示 TCP socket
    -u, --udp            显示 UDP socket
    -l, --listening        筛选查看处于监听状态的

网络服务治理

网络服务管理程序分为两种:

  • SysV (也叫 Sys 5)

    CentOS 6 应用

  • systemd

    CentOS 7 应用

network服务和 NetworkManager 服务:

  • network 服务是 centos6 的网络默认管理工具, network 只能反对 service 来治理.
  • centos7 重写了一遍就是 NetworkManager 服务,centos7 默认的服务管理工具换成了systemctl.

    若是为了向下兼容, 能够禁用 NetworkManager.

    systemctl disable NetworkManager.service

网络配置文件

ifcfg-*

/etc/sysconfig/network-scripts/ifcfg-* 网络配置文件(随实在网卡名称变动, 比方 ifcfg-eth0)

留神:

  1. 应用 ipipconfig 命令批改网络配置因为并未写入配置文件, 因而仅限当此无效, 重启后还是以配置文件的为准.
  2. 如果一开始的网卡名并非 eth0 , 但通过批改 /etc/default/grub 等相干配置来批改网卡名为 eth0 后, 对应的 ifcfg-* 文件名须要手动批改.

有可能呈现一个网络配置文件外面配置多个网卡的状况

ifcfg-eth0 动静 (DHCP) 配置文件示例

TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no

# dhcp: 动态分配
# none 或 static: 动态调配
BOOTPROTO=dhcp
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INT=yes
IPV6_AUTOCONF=YES
IPV6_DEFROUTE=YES
IPV6_FAILURE_FATAL=NO
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=eth0
UUID=xxxxxxxxxxxxxxxxx
DEVICE=eth0
ONBOOT=YES

ifcfg-eth0 的动态配置示例 ( 需重点把握)

TYPE=Ethernet
NAME=eth0
DEVICE=eth0
UUID=xxxxxxxxxxxxxxxxxxxxxx
ONBOOT=YES

# dhcp: 动态分配
# none: 动态调配
BOOTPROTO=none
IPADDR=10.211.55.3
NETMASK=255.255.255.0
GATEWAY=10.211.5.1
DNS1=114.114.114.114
DNS2=8.8.8.8
DNS3=8.8.4.4

UUID 能够通过 nmcli con 查看

hostname 命令

主机名的形成: < 主机名称 >.< 域名 >

显示或设置以后主机名

hostname [选项]          # 查看主机名
hostname [< 主机名 >]      # 设置主机名, 立刻失效

选项
    -s, --short            显示短格局主机名, 即 . 之前的局部
    -i, --ip-address    显示主机的 IP 地址

hostnamectl

控制系统主机名(写入配置, 永恒失效)

hostnamectl set-hostname < 主机名 >

/etc/hosts

主机名相干配置, hosts 文件蕴含了 IP 地址和主机名之间的映射,还包含主机名的别名。

在没有域名服务器的状况下,零碎上的所有网络程序都通过查问该文件来解析对应于某个主机名的 IP 地址,否则就须要应用 DNS 服务程序来解决。通常能够将罕用的域名和 IP 地址映射退出到 hosts 文件中,实现疾速不便的拜访。

在批改主机名后, 因为有一些程序是依赖主机名工作的, 因而须要在 hosts 文件里增加 新主机名对应 ip, 否则局部依赖主机名的服务会在解析主机名时超时.

eg. 主机名批改为 yjx-pc 后, 在 /etc/hosts 文件增加一条

127.0.0.1  yjx-pc

这样

SysV 管理程序

CentOS 6 应用

service 命令



service network (start|stop|restart|status)

chkconfig 命令


chkconfig --list            # 列出所有 SysV 服务
chkconfig --list network    # 列出 network 服务

chkconfig [--level < 数字级别 >...] network (off|on)    # 个别 network 会放弃开机启动

systemd 管理程序

CentOS 6 无奈应用, 仅能在 CentOS 7 应用.

systemctl 命令

在 CentOS 7 下应用的 service 命令实际上是调用 systemctl 命令.

重要

在 CentOS 7 下有两套网络管理工具, 一个是 network , 另一个是 NetworkManager, 在理论工作中不要同时用两套工具治理.

CentOS 6 只有 network

倡议依照集体应用习惯禁用掉其中任意一个, 在个人电脑上可能会更倡议应用 Network Manager, 在接入新网络时会主动配置较为不便, 但这个性能在服务器上比拟鸡肋, 因而服务器上个别是沿用 network, 因而举荐禁用掉 NetworkManager

管制 systemd 零碎和服务管理器

systemctl < 命令 >

命令
    管理器生命周期命令
    daemon-reload                # 从新加载 systemd 治理配置

    单位 (unit) 命令
    start <service>
    stop <service>
    restart <service>
    reload <service>
    status <service>
    
    单位 (unit) 文件命令
    list-unit-files    [<unit>]        # 列出所有 systemd 服务, 或指定服务
    enable <service>
    disable <service>

Systemd 入门教程:命令篇

软件包

  • 软件包管理器
  • rpm 包 和 rpm 命令
  • yum 仓库
  • 源代码编译装置
  • 内核降级
  • grub 配置文件

概念 – 包管理器

包管理器是不便软件装置、卸载、解决软件依赖关系的工具.

  • RedHat(RHEL) 系列(RedHat, Fedora, CentOS) 应用 yum 包管理器, 软件安装包格局为 rpm
  • Debian、Ubuntu 应用 apt 包管理器, 软件安装包格局为 deb.

在 RedHat 中的包管理器是 rpm 包, 它应用的是 rpm 命令.

集中寄存包的中央叫做软件仓库, RedHat 中用的是 yum 仓库.

rpm 包

rpm 包格局

格局
    软件名称 - 软件版本. 零碎版本. 平台.rpm

示例
    vim-common-7.4.10-5.el7.x86_64.rpm    
    
    软件名称: vim-common
    软件版本: 7.4.10-5
    零碎版本: el7                # 指 Enterprise Linux 7
    平台: x86_64

rpm 包的取得形式:

  • 零碎光盘 Packages/*.rpm
  • 网上下载

rpm 命令

rpm 包的问题

  • 须要本人解决依赖关系
  • 软件包起源不牢靠
rpm - RedHat Package Manager

rpm [选项] < 残缺软件包名 >

< 残缺软件包名 > 参数不反对通配符

示例
    rpm -qa                            # 查问已装置的所有软件包

选项
    -a, --all                         # 查问 / 验证所有软件包
    -q, --query    [< 残缺软件包名 >]         # 查问软件包, 若应用 -qa 则示意查问所有已装置的, 否则仅查问指定软件包. 若要含糊查问则要 -qa | grep 配合
    -l, --list                         # 列出该包的文件
    -i, --install <rpm 文件 >            # 装置软件包, 此时若提醒依赖关系问题, 则须要先装置好被依赖的安装包. <rpm 文件 > 也能够指定具体的 url
    -e, --erase    < 残缺软件包名 >...         # 卸载软件包
    -U, --upgrade < 残缺软件包名 >         # 降级软件包, 若不存在则装置, 若已存在则会替换旧版本.
    
    -v, --verbose
    -h, --hash                         # 显示装置进度, 常常配置 -v 来显示精确的进度.
    
示例
    rpm -ql < 软件报名 >                  # 查看该软件包的文件列表, 比方用于查看有哪些配置文件.⭐

yum 包管理器

/etc/yum.repos.d/*

yum 命令

yum 包管理器

yum < 命令 >

< 软件包 > 参数反对通配符

示例
    yum list all|installed|available|updates            # 查看列表(默认是 all)
    yum list vim*                # 查看已装置的 vim* 安装包, 倡议用这种形式来速览, 因为同时可提供以后已装置和可装置的列表.
                                # ?? 有些通过 rpm 命令间接装置的如同在这无奈通过含糊查问找到

命令    
    makecache                             # 生成元数据缓存
    repolist [all|enabled|disabled]      # 查看以后已失效的源, 默认是 enabled.
    
    install < 软件包 >                # 装置软件包, < 软件包 > 反对指定本地的 rpm 文件
    remove < 软件包 >                # 卸载软件包
    list [< 软件包 >]                # 查看 (所有) 软件包(已装置和可装置的)    
    list < 软件包 > --showduplicates    #  查看软件包的各个版本, 默认只展现最新的版本
    update [< 软件包 >]                # 降级软件包, 若不指定 "软件包" 参数, 则会降级以后已装置的所有软件包.
    
    grouplist                       # 查看系列软件包列表(蕴含了一系列的软件)
    groupinfo < 软件组 >                # 查看某个具体系列软件包蕴含的软件列表.
    groupinstall < 软件组 >            # 装置系列软件包
    

罕用的软件组

Development Tools            # 根本开发环境

yum-config-manager 命令

治理 yum 配置选项和仓库

yum-config-manager [选项]

选项
    --enable <repo>...        # 启用指定仓库(同时写入配置文件), 反对通配符?
    --disable <repo>...        # 禁用指定仓库(同时写入配置文件), 反对通配符?
    --add-repo < 仓库地址 >     # 增加并启用指定仓库, 地址能够是 url. 也能够通过 `yum install < 仓库地址 >`
    
示例
    yum-config-manager --add-repo https://xxxx/xx.repo        # 增加某个 yum 仓库

可通过 yum repolist all 确认以后有哪些仓库.

yum-config-manager 命令是由 yum-utils 包提供的

yum install -y yum-utils

yum 根底源

CentOS yum 源: http://mirror.centos.org/cent…

国内镜像: https://developer.aliyun.com/…

倡议更换为国内 yum 镜像源

# 1. 备份旧配置
mv /etc/yum.repos.d/CentOS-Base.repo{,.backup}

# 2. 下载新的 yum 镜像源配置文件(抉择任意一个即可)
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo            # 阿里云镜像
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.163.com/.help/CentOS7-Base-163.repo    # 163 镜像

# 3. 从新生成缓存
yum makecache

留神, yum 源配置文件中有的会比拟激进, 因而默认通常是禁用的, 其配置文件中 enabled=0

EPEL 源

EPEL 源(Extra Packages for Enterprise Linux) 比拟风行,它相当于官网 CentOS/RHEL 源仓库的一个补充.

艰深的说,EPEL 能够认为是 Linux(RHEL)及其衍生发行版的一个事实上的官网仓库。

比方 redis 在 epel 源才有

# 1. 装置
yum install epel-release

# 2. 生成缓存
yum makecache

或者间接用阿里的源(下面的命令不用执行)

wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
yum makecache

若出错, 则来个清缓存套餐 yum clean all

webtatic 源

提供最新的稳固版本的 Web 开发 / 托管软件,这些版本未在 CentOS / RHEL 散发版本中提供. php 也在这外面.

依赖 epel-release

比方 默认源只提供 php54 版本, 但 webtatic 提供了 php55, php71, php72 等高版本

# 1. 装置
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

# 2. 生成缓存
yum makecache

city-fan 源

city-fan 源 源提供的包版本很新, 但需注意兼容性, 因而该仓库装置后默认是非启用的.(enabled=0)

比方 curl 版本 7.64.1, 其余源的版本没这么高

# 1. 装置
rpm -Uvh https://mirror.city-fan.org/ftp/contrib/yum-repo/city-fan.org-release-2-1.rhel7.noarch.rpm

# 2. 生成缓存
yum makecache

源代码编译装置

编译装置的个别步骤

以 openresty 为例

# 1. 下载源码包
wget https://openresty.org/download/openresty-1.15.8.1.tar.gz

# 2. 解压
tar -zxvf openresty-<VERSION>

# 3. 进入源代码目录
cd openresty-<VERSION>/

# 4. 主动配置装置所需的相干配置, 比方匹配零碎以后零碎, 内核版本, 编译器等等, 还能够指定装置目录等.
## --prefix=< 指定装置目录 >        默认是装置到 /usr/, 会扩散开导致卸载不不便, 因而通常指定各自的目录.
./configure --prefix=/usr/local/openresty

# 5. 编译: 将源码编译为可执行的二进制
## -j<num>        指定用 <num> 个逻辑 CPU 来减速编译
## 
## 如果在上一阶段配置完结后提醒能够用 gmake 和 gmake install(跨平台编译), 那么此处就能够用这两个命令
## 编译好的内容会先寄存在 ./build 目录
make -j2

# 6. 将 ./build 目录中的文件全副装置到指定目录中
make install

编译常常须要依赖各种装置环境, 以下是局部罕用的

yum install gcc gcc-c++ pcre-devel openssl-devel

*-devel 个别是指开发包

降级内核

TODO

为什么要降级内核?

uname 命令

查看零碎信息

uname [选项]

默认是 -s

选项
    -a, --all            # 展现所有信息
    -r, --release        # 查看操作系统 (内核) 的发行版本
    -m, --machine        # 显示机器 (硬件) 类型, 比方 32 位, 64 位等

rpm 形式降级内核

# 独自降级内核
yum install kernel-< 内核版本 >

# 降级所有已安装包(包含内核)
yum update

源代码编译装置内核

https://www.kernel.org

根分区至多要保留 10G 的空间.

以下以更新到内核 5.5.5 为例.

# 1. 装置依赖包
yum install gcc gcc-c++ make ncurses-devel openssl-devel elfutils-libelf-devel flex bison 

# 2. 下载并解压缩内核
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.5.5.tar.xz
tar xvf linux-5.5.5.tar.xz -C /usr/src/kernels/

# 3. 配置内核编译参数
## 也能够通过复制以后内核配置来间接应用或是在以后零碎内核配置根底上进行批改
cp /boot/config-< 内核版本 >.< 平台 > ./.config
make (menuconfig|allyesconfig|allnoconfig)

# 4. 编译
## -j 可应用多个 CPU 来减速编译
make -j<cpu 数 > all

# 5. 装置内核模块 及 内核
make modules_install
make install

# 6. 重启, 启动时的疏导界面 (grub 界面) 抉择新内核版本
reboot

grub

系统启动时的疏导软件叫做 grub

CentOS 6 应用的是 grub 版本, 须要本人记住设置项, 手动批改配置文件.

CentOS 7 应用的是 grub2 版本, 提供了工具来不便批改, 个别不手动批改配置文件免得出错影响工具应用.

grub 相干命令

grub2-mk-config 命令

生成 grub 配置文件

grub2-mk-config [选项]

选项
    -o, --output <file>        # 指定生成的文件地位, grub 默认应用的是在 /boot/grub2/grub.cfg

grub2-editenv 命令


示例
    grub2-editenv list        # 查看以后默认疏导项

grub2-set-default 命令


示例
    grub2-set-default < 疏导序号, 从 0 开始 >        # 设置默认疏导项

查看所有可抉择的疏导项

# 依照在文件中的程序从上到下的序号顺次是 0~N
grep "^menu" /boot/grub2/grub.cfg

grub 配置文件

/etc/default/grub 根本的 配置 grub 的配置文件, 个别间接批改该文件.

/etc/grub.d/ 具体的 配置 grub 的配置文件, 对内核每一项进行更具体的配置, 个别不须要批改这部分的文件.

/boot/grub2/grub.cfg grub2 的理论配置文件, 个别不手动批改该配置文件免得出错.

grub2-mkconfig -o /boot/grub2/grub.cfg 应用 /etc/default/grub/etc/grub.d/ 来生成 /boot/grub2/grub.cfg 配置文件

/etc/default/grub

GRUB_TIMEOUT=5
GRUB_DEISTIBUTOR="....."

# 默认疏导项, 可通过 grub2-set-default 命令来批改.
GRUB_DEFAULT=saved

GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"

# 疏导时传给内核的参数
## quiet     只打印必要的输入, 在出问题须要排查时可将该参数移除掉
## rghb        以图形界面显示疏导进度, 在出问题须要排查时可将该参数移除掉来显示更多的信息
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rghb quiet biosdevname=0 net.ifnames=0"

GRUB_DISABLE_RECOVERY="true"

文件批改后若想要失效, 则须要执行以下命令来生成 grub 理论应用的配置文件

grub2-mkconfig -o /boot/grub2/grub.cfg

应用单用户进入零碎以重置 root 明码

  1. 在系统启动到抉择疏导项时, 依据提醒输出 e 来编辑所抉择疏导项.
  2. 找到第一个 linx16 .... 行, 此时若是 CentOS6 则在开端追加 single (留神有个空格), 若是 CentOS7 则在开端追加 rd.break
  3. 输出 Ctrl+x 启动, 此时会进入到一个命令提示符状态 switch_root:/#

    留神, 此时 零碎根目录没有挂载在硬盘根上面

    此时的 / 目录是一个位于内存中虚构的目录, 理论的硬盘根目录位于 /sysroot 下, 同时 /sysroot默认是以只读形式挂载的.

    # 1. 以 rw 模式从新挂载文件系统
    ## -o, --options < 挂载选项, 以逗号分隔 >
    mount -o remount,rw /sysroot
    
    # 2. 此时还是处于虚构的文件系统, 因而须要切换到到理论的系统目录下
    ## 执行实现后命令提示符变成 sh-4.2# , 而非之前的 switch_root:/#
    chroot /sysroot
    
    # 3. 批改 root 明码
    echo 123456 | passwd --stdin root
    
    # 4. 敞开 SELinux
    ## 因为 SELinux 会校验 /etc/passwd 和 /etc/shadow 文件, 因而此处敞开 SELinux
    ## 生产环境个别也都会敞开 SELinux
    sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
    
    # 5. 回到虚构的根目录环境
    exit
    
    # 6. 重启
    reboot

批改相干目录权限后开启 selinux 无奈启动

  1. 进入单用户疏导模式(即下面的通过 grub 疏导批改 rd.break 进入)
  2. 执行 genhomedircon 给用户的 home 目录从新生成 selinux 相干的文件标签
  3. 之后就能够失常启动

或者是在根目录下创立一个文件 touch /.autorelabel, 之后 linux 会检测到该文件, 并主动进行从新检测标签, 从新打标签(约 10~20 分钟).

过程治理

CentOS 7 的一号过程是 systemd, CentOS 6 的一号过程是 init

过程查看

ps 命令

查看过程状态, 具体请查看 零碎综合状态查看 种的 ps 大节.

pstree 命令

过程是树形构造的.

查看过程树形构造

pstree 选项 [过程 =1]
 
选项
    -p        打印过程号

top 命令

请参照最下方的 零碎综合状态查看

过程的管制命令

调整过程的优先级

nice 命令

NICE 范畴从 -20~19, 值越小优先级越高, 抢占资源就越多.

以指定的优先级来执行程序

nice [选项] <Command>

选项
    -n < 优先级 >        # 若不指定则默认是 10

renice 命令

从新设置正在运行的过程的优先级

renice [选项] < 过程号 >

选项
    -n, --priority <priority=10>        指定优先级(NICE)

过程的作业控制

过程的前后台切换个别称作过程的作业控制.

& 符号

通过在执行的命令开端追加一个 &(留神有空格), 使得过程间接进入后盾运行状态.

此时咱们的键盘输入仍旧能够被终端捕捉.

执行命令 &

ctrl + z 操作

对于在以后终端在前台执行的作业, 能够通过 ctrl+z 按键使该作业转入后盾并挂起, 作业状态变为 S(stopped)/

能够通过 jobs 查看到作业序号, 再通过 fgbg 将该作业调到前台或后盾执行.

jobs 命令

jobs 是 shell 内嵌的.

显示作业状态

jobs [选项]

选项
    -l        额定打印出过程号

fg 命令

fg 是 shell 内嵌的.

复原作业, 令作业在前台执行

fg < 作业序号 >

bg 命令

bg 是 shell 内嵌的.

复原作业, 令作业在后盾执行

bg < 作业序号 >

过程的通信形式 – 信号

信号是过程间通信的根本形式之一.

管道也是一种过程间根本通信形式.

终止过程

语法
    kill [-s <signal>] <pid| 过程名 |%jobid>    发送信号给指定过程 | 后台作业, 未指定信号则默认发送 SIGTERM(15)
    kill -l [<signal>]                        打印信号列表(或某个信号对应的数字或名称)

示例
    以下命令等效
    kill -1 <pid>    # 发送 SIGHUP 信号给指定过程
    kill -hup <pid>    # 发送 SIGHUP 信号给指定过程(信号名大小写无所谓)
    kill -sighup <pid>    # 发送 SIGHUP 信号给指定过程(信号名大小写无所谓)
    kill -s 1 <pid>    # 发送 SIGHUP 信号给指定过程(信号名大小写无所谓)
    kill -s hup <pid>    # 发送 SIGHUP 信号给指定过程(信号名大小写无所谓)
    kill -s sighup <pid>    # 发送 SIGHUP 信号给指定过程(信号名大小写无所谓)

    发信号给后台作业
    kill -9 %1        # 发送 KILL 信号给作业 id 为 1 的后台作业

选项
    -l                打印信号列表
    -s <signal>        发送信号
    
罕用信号
    除了信号 9 之外, 其余信号都被被过程捕捉并疏忽. 1 号过程不可杀
    SIGHUP(1)        退出终端, hangup(挂起)信号(应用 nohup 能够疏忽该信号)
    SIGINT(2)        告诉前台过程终止过程(等同 `ctrl+c`)
    SIGQUIT(3)        停止并生成 core 文件(等同 `ctrl+\`)
    SIGKILL(9)        立刻完结过程, 不能被阻塞和捕捉解决 kill -9 <pid>
    SIGTERM(15)        会杀死不能捕捉该信号的过程
    SIGCONT(18)        持续(与 STOP 相同, 等同 `bg` 命令)
    SIGSTOP(19)        暂停(等同 `ctrl+z`), 将过程放到后盾挂起(不执行状态).

ctrl+d 不是发信号, 而是用于示意一个非凡的二进制值, 示意 EOF

在一些中央很有用, 比方 cat 时会期待输出, 此时则输出结束后按 ctrl+d 示意输出完结.

守护过程 (daemon) 和系统日志

留神, nohup 启动的过程并不是守护过程, 概念上不要搞错.

nohup 命令

应用 nohup 命令启动的程序会疏忽 SIGHUP 信号, 就算关掉终端, 该程序仍然会持续运行.

在运行该程序的终端被敞开后, 该过程会变成孤儿过程.

该孤儿过程主动会被 1 号过程收容, 也就是其父过程会变成 1.

但仍然会占用其启动时的目录, 导致该目录无奈卸载, 这是其与守护过程的区别之一(守护过程的工作目录是 /)

该命令常常与 & 符号一起应用.

目标是运行某个程序, 并让该程序脱离该终端仍可继续执行.

使程序运行时不挂起, 不向 tty 输入信息, 疏忽输出.
默认是把输入追加到 nohup.out 文件

nohup <command>

/proc 目录

该目录是零碎内存中的信息以文件模式的映射, 并非实在存在的物理文件.

每个过程都有一个对应的 /proc/< 过程号 > 目录, 示意其对应的内存数据.

/proc/< 过程号 > 局部文件阐明

cwd            # (连贯)该过程的工作目录(此时该目录是无奈卸载的), 守护过程个别是指向 /
fd            # 关上的文件描述符
    |- 0    # (连贯)规范输出, 可能是 /dev/pts/0, 或 /dev/null
    |- 1    # (连贯)规范输入, 可能是 /dev/pts/0, 或 /dev/null, /path/to/nohup.out, socket:[xxxx], /var/log/message
    |- 2    # (连贯)规范谬误, 可能是 ...

screen 命令 / 工具

个别在近程连贯到服务器后, 为了避免执行到一半时连贯中断导致数据失落等, 能够通过进入 screen 环境来执行命令, 此时若连贯失落则可在下一次连贯后再次进入 screen 来复原之前的环境.

CentOS 7 默认没有装置该工具, 须要自行装置.

yum install screen
# 进入 screen 环境
screen

# 退出(detached) screen 环境
## 按 Ctrl+ a 时不会有任何提示信息, 此时再按 d 就退出 screen 环境
Ctrl+a d

# 查看 screen 的会话
screen -ls

# 复原会话
screen -r <sessionid>

# 若掉线后查看到会话状态是 attached, 且无奈复原, 则可踢掉踢掉前一用户并复原会话
screen -D -r <sessionid>

screen 命令

screen [选项]

示例
    screen        间接进入 screen 环境
    
选项
    -ls, -list            查看 screen 的会话
    -r <sessionid>        复原到指定会话

留神: screen 默认应用的是 non-login shell, 如果要应用 login shell, 则须要执行如下语句

echo 'defshell -$SHELL' >> ~/.screenrc

# 如果上述语句有效, 则应用如下语句:
echo 'defshell -bash' >> ~/.screenrc

可通过 shopt login_shell 查看以后是否为 login-shell

系统日志

/var/log/

重点关注文件

  • /var/log/messages 零碎惯例日志
  • /var/log/dmesg 内核运行相干音讯(通常时启动时的内核日志)
  • /var/log/secure 平安日志
  • /var/log/cron crond 打算工作日志

服务管理工具 systemctl

服务(提供常见性能的守护过程) 集中管理工具个别是:

  • service
  • systemctl

在 CentOS 7 及以上应用 systemctl 代替 service 工具.

CentOS 6 中应用 service 治理服务, 须要本人编写简单的启停脚本, 而在 systemctl 中则简化了这一部分.

service

配置文件寄存: /etc/init.d/

治理 SysV 服务

service < 服务名 > < 操作 >

操作
    status        查看服务运行状态
    start        启动服务
    stop        进行服务
    restart        重启服务

配置开机自启动须要应用 chkconfig 命令.

service 服务运行级别的查看和设置

chkconfig [选项] < 服务名 >

示例
    chkconfig --list            # 列出所有 SysV 服务的运行级别
    chkconfig --list < 服务名 >      # 查看指定服务的运行级别
    chkconfig [--level <level>...] < 服务名 > (on|off)    # 设置服务在指定级别下是否主动启动
    
罕用级别
    0    关机
    3    字符终端
    5    图形终端
    6    重启

systemctl

配置文件 (服务单元) 存放处: /usr/lib/systemd/system/

管制 systemd 零碎 以及 服务治理

systemctl < 命令 > [< 服务名 >]

示例
    systemctl set-default multi-user.target        # 设置以字符界面启动(即多用户级别)

命令
    status < 服务 >
    start < 服务 >
    stop < 服务 >
    restart < 服务 >
    reload < 服务 >
    enable < 服务 >                    启用开机主动启动
    disable < 服务 >                禁用开机主动启动
    list-unit-files [< 服务 >]
    get-default                         获取以后的 target
    set-default < 字母示意的服务级别 >          设置指定的 target 为默认的运行级别
    isolate < 字母示意的服务级别 >              立刻切换到指定的运行级别
    
示例
    systemctl list-unit-files                            # 列出所有 systemd 服务
    systemctl list-unit-files NetworkManager.service    # 列出 NetworkManager 服务

查看所有服务级别 /lib/systemd/system/

ls -l /lib/systemd/system/runlevel*target

# runlevel0.target -> poweroff.target
# runlevel1.target -> rescue.target
# runlevel2.target -> multi-user.target
# runlevel3.target -> multi-user.target
# runlevel4.target -> multi-user.target
# runlevel5.target -> graphical.target
# runlevel6.target -> reboot.target

systemd 服务配置文件示例(以 sshd 服务的配置文件 /usr/lib/systemd/system/sshd.service 为例)

[Unit]
Description=OpenSSH server daemon            # 服务形容文本
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target sshd-keygen.service    # 在哪些服务之后启动

Wants=sshd-keygen.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS        # 对应 start 命令
ExecReload=/bin/kill -HUP $MAINPID            # 对应 reload 命令
KillMode=process
Restart=on-failure
RestartSec=42s
# Specifies the maximum file descriptor number that can be opened by this process
#LimitNOFILE=65535
# Specifies the maximum number of processes
#LimitNPROC=4096
# Specifies the maximum size of virtual memory
#LimitAS=infinity
# Specifies the maximum file size
#LimitFSIZE=infinity

[Install]
WantedBy=multi-user.target                    # 设置在哪个级别下主动启动

SELinux 简介

SELinux – 平安加强的 Linux 版本

DAC(自主访问控制): 利用用户权限和文件权限来管制.

MAC(强制访问控制): 过程、用户、文件 的标签三者需统一才容许拜访.

SELinux 会升高零碎性能, 因而个别生产环境都会敞开.

查看 SELinux 的命令

# 查看以后 enforce 的状态
getenforce

# 查看过程的标签
ps -Z

# 查看文件的标签
ls -Z

# 查看以后用户的标签
id -Z

敞开 SELinux

# 办法 1: 长期敞开, 重启生效
setenforce 0

# 办法 2: 写入配置永恒失效(需重启零碎才会失效)
## enforcing 强制访问控制
## permissive 只正告而不管制
## disabled 敞开(生产环境举荐)
sed -i 's/^SELINUX=\w+/SELINUX=disabled/' /etc/selinux/config

获取 selinux 的布尔值

获取 selinux 的布尔值
    on 示意容许拜访
    off 示意禁止拜访
    

getsebool [<item>]

选项
    -a        # 查看所有布尔值

设置 selinux 的布尔值

设置 selinux 的布尔值

setsebool 选项 <item> <value>

选项
    -P        # 同时写入配置文件(默认只在内存批改)

value
    0        # 示意 off, 敞开
    1        # 示意 on, 关上

内存和磁盘治理

内存和磁盘使用率查看

内存使用率查看

能够应用 freetop 查看

free 命令

内存应用状况查看

free [选项]

选项
    -b        以 byte 为单位
    -k        以 KB 为单位(默认)
    -m        以 MB 为单位
    -g        以 GB 为单位(1024, 向下取整)
    -h        依据数值大小主动应用适合的单位
    
输入示例
                  total        used        free      shared  buff/cache   available
    Mem:           1837         619         324          30         893        1006
    Swap:          2047           0        2047

输入字段意义解释
    Mem                零碎内存
    Swap            替换分区
    buff/cache        过程运行时拿来作为缓存的内存, 能够通过肯定伎俩开释掉.
    available         示意若 buff/cache 全开释掉后能够应用的内存数量. 个别是看这个值.

个别会设置一部分 Swap 以防止零碎内存耗光后登程零碎 OOM(?)操作导致随机 kill 局部过程.

磁盘使用率查看

fdisk 命令

分区表操作工具软件
只能看到分区信息, 但无奈看到其挂载的信息.

fdisk [选项]

选项
    -l        查看分区表
    
交互式命令
    n        增加一个分区
    d        删除一个分区
    p        打印分区表
    w        将配置写入数据(在此之前只存在内存中)
    q        退出

打印的设施信息中:

  • Boot 列显示 * 示意该分区是启动分区
  • 磁盘设施的 Start、End 是以扇区为单位.
  • System 示意该分区所应用的分区格局
  • Blocks 的单位是 KB

相似的命令还有 parted -l, 显示的格局会稍微不一样, 会更具体.

df 命令

报告文件系统磁盘空间使用率
能够看作是 fdisk 的补充, 能够看到文件系统的挂载信息.

df [选项] [<file>...]

选项
    -h, --human-readable        用适合的单位来展现
    -T, --print-type            显示每个文件系统的类型
    
    
示例
    df -hT /dev/**        # 查看硬盘 / 分区的空间及文件系统格局

du 命令

报告磁盘空间应用状况(理论占用空间)

du [选项]

选项    
    -s, --summarize              对每个参数只显示总和。-h, --human-readable        用适合的单位来展现

ls 与 du 查看文件大小是不同的:

  • ls 统计的是记录到文件结尾和结尾一共占用的长度.
  • du 真正统计了文件的理论长度.

Eg. 比方用 dd 创立有空洞的文件 1GB 时, du 查看的就是实在大小, 可能就几 MB, 而 ls 查看到的大小就是 1GB.

lsblk 命令

显示块设施

lsblk [选项]

选项
    -f, --fs        显示文件系统信息

ext4 文件系统

Linux 反对多种文件系统, 常见:

  • ext4
  • xfs
  • NTFS(需装置额定软件 ntfs-3g)

CentOS 6 默认应用 ext4 文件系统.

CentOS 7 默认应用 xfs 文件系统.

NTFS 格局因为版权问题, 在 Linux 挂载后默认是只读的, 须要装置额定软件 ntfs-3g 能力写入.

ext4 文件系统根本构造

  • 超级块
  • 超级块正本
  • i 节点(inode)

    文件名称, 大小, 编号, 权限信息都会在 i 节点体现.

    也叫索引节点?

    留神, 文件名是记录在文件父目录的 i 节点中.

    引申: 文件的读权限是读取文件的数据块内容, 而目录的读权限是读取目录底下的文件名称.

  • 数据块(datablock)

    记录数据.

    数据块是挂载在 i 节点前面, 造成链式构造.

    ext4 和 xfs 默认创立的数据块是 4KB.

ls 命令查看的是 i 节点中文件大小信息, 而 du 是查看数据块的信息, 所以显示的后果会有差别.

mv 对文件改名理论影响的是其父目录 i 节点中的信息, 因而文件大小并不会影响批改速度.

rm 命令是将文件名和 i 节点的链接断开, 这就是为什么文件的大小不会影响删除的速度, 以及有些文件被删除后空间并没有真正开释.

找回被删掉的文件的原理就是搜寻磁盘上的 i 节点及其链接的数据块, 从而找回失落的数据.

ln 命令原理是让更多的文件名指向 i 节点, 应用命令 ln afile bfile, 此时会有一个新的文件名 bfile 指向同一个 i 节点, 应用 ls -l 命令能够看到该文件对应 i 节点的链接数多了 1 个.

应用 ln 是不能逾越文件系统的, 因为 i 节点信息是存在以后文件系统中.

文件、目录与 inode(i 节点)

Linux 文件系统里文件和文件名的关系如下图。

目录也是文件,文件里存着文件名和对应的 inode 编号。通过这个 inode 编号能够查到文件的元数据和文件内容。文件的元数据有援用计数、操作权限、拥有者 ID、创立工夫、最初批改工夫等等。文件件名并不在元数据里而是在目录文件中。因而文件改名、挪动,都不会批改文件,而是批改目录文件。

借《UNIX 环境高级编程》里的图说一下过程关上文件的机制。

过程每新关上一个文件,零碎会调配一个新的文件描述符给这个文件。文件描述符对应着一个文件表。表外面存着文件的状态信息(O_APPEND/O_CREAT/O_DIRECT…)、以后文件地位和文件的 inode 信息。零碎会为每个过程创立独立的文件描述符和文件表,不同过程是不会共用同一个文件表。正因为如此,不同过程能够同时用不同的状态操作同一个文件的不同地位。文件表中存的是 inode 信息而不是文件门路,所以文件门路产生扭转不会影响文件操作。

下面这部分的形容来自: https://www.lightxue.com/how-…

ln 命令

在文件之间建设连贯
默认是创立硬链接, 即新建一个文件名并让其指向 <src> 的 i 节点.
硬链接不能逾越文件系统.

ln [选项] src dest

选项
    -s        创立软链接(符号链接), 其文件内容记录的是对应的拜访门路. 软链接的权限设置是有效的. 
            软链接能够逾越分区零碎

facl 性能

xfs 和 ext4 反对文件访问控制列表(facl)

ACL 示意访问控制列表 Access Control List(ACL)

设置了 facl 权限的文件会有一个额定的 + 权限示意.

-rw-------+ 2 root root 10 2020-02-24 22:51 afile

getfacl

查看文件或目录的 ACL

getfacl [选项] <file>

选项
    -R, --recursive         # 递归

示例
    getfacl -R < 目录 > > acldir.acl        # 备份目录的 acl 权限信息, 并通过 `cd < 目录 > && setfacl --restore acldir.acl` 来复原

setfacl

设置文件或目录的 ACL

setfacl [选项] < 权限 > <file>

示例
    setfacl -m u:user1:r afile        # 给用户 user1 赋予读 afile 文件的权限
    setfacl -m g:group1:rw afile    # 给组 group1 赋予读写 afile 文件的权限
    setfacl -x u:user1 afile        # 移除给 user1 赋予的 afile 文件权限
    setfacl -x g:group1 afile        # 移除给 group1 赋予的 afile 文件权限

选项
    -m, --modify <acl>        # 批改文件的访问控制权限, 此时 <acl> 格局为: (u|g):(<user>|<group>):(r|w|x)
    -x, --remove <acl>        # 移除文件的访问控制权限, 此时 <acl> 格局为: (u|g):(<user>|<group>)    
    --set <acl>               # 替换以后所有的 acl(能够了解为清空以后的再增加), 留神保留根本的 UGO 权限
    -b, --remove-all        # 删除所有的 acl 权限    
    
    -R, --recursive         # 递归利用到子目录 / 文件
    
    默认权限
    -d, --default            # (只)设置默认的 acl 权限, 只对目录无效, 会被目录中创立的文件和目录继承。# 子文件会继承 acl 权限, 子目录同时会继承 default 权限(即递归继承)
                            # 另外一种格局是: d:u:user1:rw, 也就是在权限的后面多一个 `d:`
    -k, --remove-default    # 移除默认的 acl 权限    
    
    备份和复原 ACL 权限(cp - p 能够保留 ACP 权限, 但 tar 等并不会保留 acl 权限信息, 因而能够先备份这些信息以供复原)
    --restore < 权限备份文件 >    # 复原 acl 权限
    

若是报错 Setfacl : Operation not supported 则示意挂载硬盘时默认没有加载 acl 规定, 因而须要从新挂载硬盘:

  1. 批改 /etc/fstab

    
    /dev/sda1             /data                ext4    defaults,acl    0 0
  2. 从新挂载

    mount -o remount /data

上述操作自己未实际操作过, 需谨慎, 避免从新挂载出错.

示例

我想将某个目录 /data/game 的权限全副分给指定用户 publisher, 同时该目录原先曾经有文件了, 属主和属组都是 root.

# 设置该目录的 default 权限
setfacl -d -m u:user1:rwx /data/game

# 递归更改该目录及底下文件的 facl 权限
setfacl -R -m u:user1:rwx /data/game

磁盘的分区与挂载

新的磁盘的解决步骤:

  1. 分区 fdisk
  2. 格式化 mkfs
  3. 挂载 mount
  4. 写入配置 /etc/fstab

fdisk 命令

只能对小于 2TB 的进行分区

对硬盘分区
留神: 会造成数据失落, 审慎

fdisk

示例
    fdisk -l          # 查看分区表状况
    fdisk < 块设施 >        # 对指定块设施分区
    
分区过程中的常用命令
    n        # 创立新分区
    d        # 删除某个分区
    w        # 将分区信息写入磁盘
    p        # 查看以后分区信息
    q        # 退出

Tip.

  • 服务器上个别一块硬盘划分一个分区.
  • 如果要创立超过 4 个分区, 则须要调配 3 个主分区, 1 个扩大分区, 而后在扩大分区中再创立多个逻辑分区.
  • ext4 和 xfs 默认创立的数据块是 4KB.

mkfs 命令


格式化分区

示例
    mkfs.ext4 [选项] < 分区 >        # 将分区格式化为 ext4 格局
    mkfs.xfs [选项] < 分区 >        # 将分区格式化为 xfs 格局
    
选项
    -f        # 强制操作

parted 命令

分区大于 2T 应应用 parted 命令, 而不是 fdisk

另一个分区工具

parted < 块设施 >

mount 命令

挂载文件系统

mount [选项] < 块设施 > < 指标挂载目录 >

选项    
    信息查看
    -l                # 查看以后挂载状况
    
    -a, --all        # 挂载 /etc/fstab 配置文件中的所有配置
    
    挂载选项
    -t, --types <vfstype>        # 指定分区格局类型, 若不指定或指定为 "auto" 则会自行断定分区格局类型.
    -o, --options <options>        # 指定挂载参数, <options> 可用逗号分隔多个参数
                                # 可用参数
                                #     defaults    默认
                                #    noatime        读文件时不批改 inode 的拜访记录(atime), 能够进步 IO 性能.
                                #    remount        从新挂载
    --bind <src> <dest>            # 将某个目录或文件挂载到指定的目录, 而不要求 <src> 是块设施. 这个操作实际上是批改 / 替换 inode    
    

留神

  • mount 命令并不会写入配置, 仅仅保留在内存, 因而重启后生效

    需写入 /etc/fstab/ 能力长久化

  • 指标挂载目录必须是已存在的.

对文件的操作是文件级别的操作, 是在文件系统的更上一层.

因而咱们无奈间接对相似 /dev/sdc1 这样的设施进行操作, 须要先挂载到目录, 再对目录操作.

umount 命令

卸载文件系统

umount < 挂载目录 >|< 块设施 >

/etc/fstab 配置文件

格局

磁盘挂载配置文件

Eg.
/dev/sdb1     /mnt/sdb1            ext4         defaults         0                         0
< 分区 >        < 挂载目标目录 >    < 文件系统 >        挂载权限    批示是否硬盘备份(dump)        是否开机磁盘自检
            替换分区是 swap     替换分区是 swap                  个别设置为 0              次要是针对 ext2, ext3
                                                                                个别设置为 0

挂载权限
    defaults    # 默认挂载参数

若配置写错导致重启失败, 则可通过 grub 进入单用户模式来修复该文件.

chroot 命令

以特定目录作为过程的根目录运行指定命令
    - 若未指定 command, 则默认是执行 $SHELL -i (即个别是 /bin/bash -i)

chroot [选项] < 新 root 门路 > [<command=$SHELL -i>]

磁盘配额的应用

把握原理和办法即可, 生产环境个别用虚拟化来限度应用资源, 包含 cpu, 内存, 磁盘..

留神: root 用户是不受限的, 不应应用 root 用户来测试.

xfs

xfs 文件系统的用户磁盘配额 quota

操作步骤(以 /dev/sdb1 为例)

# 1. 确保是 xfs 文件系统
mkfs.xfs /dev/sdb1

# 2. 挂载文件系统
mkdir /mnt/disk1
mount -o uquota,gquota /dev/sdb1 /mnt/disk1

# 3. (可选)批改挂载目录权限
## 此处为不便测试, 设置其为 1777, 即 rwxrwxrwt
chmod 1777 /mnt/disk1

# 4. 查看磁盘配额状态
## report 指令参数阐明
### -u 显示 user 限额状态
### -g 显示 group 限额状态
### -i 显示 inode 配额状态
### -b 显示 block(块)配额状态
### -h 以 human-readable 形式展现
xfs_quota -x -c 'report -ugibh' /mnt/disk1

# 5. 设置磁盘配额
## 命令意义阐明: 以下命令是限度用户 "user1" 创立的 inode 数量软硬限度别离是 5 和 10, 超过软限度后会有一段宽限工夫.
## limit 指令参数阐明
### -u 限度用户
### isoft 设置 inode 节点数量的软限度
### ihard 设置 inode 节点数量的硬限度
### bsoft 设置 block 数量的软限度
### bhard 设置 block 数量的硬限度
xfs_quota -x -c 'limit -u isoft=5 ihard=10 user1' /mnt/disk

替换分区 (虚拟内存) 的查看与创立

命令

mkswap 命令

创立替换分区

mkswap

swapon 命令

须要先用 mkswap 将指标文件或设施创立为替换分区才能够挂载.

启用

swapon [选项] [< 文件或设施 >]

示例
    swapon /swapfile    # /swapfile 是替换分区文件, 此处启用该文件作为替换分区.

选项
    -s, --summary        # 显示已应用的替换分区

swapoff 命令

敞开用于替换分区的设施

swapoff [选项] [< 文件或设施 >]

选项
    -a        # 敞开所有用于替换分区的文件和设施

应用新的分区作为替换分区

此处以 /dev/sdb1 作为示例

# 格式化指定分区
mkswap /dev/sdb1

# 启用该分区作为替换分区
swapon /dev/sdb1

# 4. 写入配置以长久化
cat <<"EOF" >> /etc/fstag
/dev/sdb1 swap swap defaults 0 0
EOF

应用文件制作替换分区

应用带空洞的文件 (此处以 /swapfile 文件为例) 来作为替换分区

# 1. 创立带空洞的文件
dd if=/dev/zero of=/swapfile bs=4M count=1024

# 2. 批改文件权限(不然会报正告)
chmod 600 /swapfile

# 3. 启用该文件作为替换分区
swapon /swapfile

# 4. 写入配置以长久化
cat >> /etc/fstag <<"EOF"
/swapfile swap swap defaults 0 0
EOF

软件 RAID 的应用

RAID(磁盘阵列) 的常见级别及含意

  • RAID 0

    stripping 条带形式, 将数据拆成 N 份别离写到 N 个磁盘中 (任意磁盘损坏数据就全毁了), 能够进步单盘吞吐率.

  • RAID 1

    mirroring 镜像形式, 将数据复制到另一个磁盘中 (节约一块硬盘空间), 进步可靠性.

  • RAID 5

    RAID 0RAID 1 的组合和简化, 有奇偶校验, 至多须要 3 块硬盘: 第 1,2 块硬盘写数据, 第 3 块硬盘写奇偶校验.(轮流写数据和校验)

    坏掉任意一块磁盘数据都能够挽回, 但损坏超过 1 块则数据失落.

  • RAID 10

    RIAID 1RAID 0 的组合. 至多须要 4 块硬盘, 2 块硬盘组合RAID 1, 另 2 块硬盘也组合 RAID 1, 再组合作 RAID 0.

    只有不是同一侧的两个硬盘都损坏数据就不会失落.

软件实现的 RAID 会额定占用不少 CPU, 因而在工作中个别是应用 RAID 卡来解决.

madmn 命令

组建 RAID, 尽量放弃每个磁盘大小统一, 如果不统一, 则个别会依照容量最小的来算.

软件 RAID 不支持系统疏导, 即 /boot 不能存储在该阵列中.

治理 MD 设施 - 即软件 RAID
# 个别约定创立的第一个硬盘是 md0

mdadmin [选项] < 设施 >...


选项
    创立
    -C, --create                # 创立新的阵列(array)
    -a, --auto yes                # 主动批准, 对于所有提醒都是 "yes" (若已存在数据则会被清掉, 审慎)
    -l, --level <RAID level>    # RAID 级别
    -n, --raid-devices <num>    # 指定在阵列中有 <num> 个块设施是流动 (active) 的
    
    查看
    -D, --detail                # 查看 md 设施详情
    
    卸载
    -S, --stop                    # 进行 md 设施(deactive), 并开释所有资源
    
    
    --scan
    --verbose
    
示例    
    mdadm -D /dev/md0    # 查看创立的阵列 /dev/md0 的详情
    mdadm -S /dev/md0    # 进行 md 设施

在配置好 RAID 后将以后的配置长久化

mdadm --detail --scan --verbose > /etc/mdadm.conf

示例: 用两个硬盘组成 RAID 1

/dev/md0
    |- /dev/sdb1
    |- /dev/sdc1

# 1. 创立硬盘 /dev/md0 , 有 2 块硬盘是流动的, 由 /dev/sdb1, /dev/sdc1 组成 RAID 1 级别.
mdadmin -C /dev/md0 -a yes -l 1 -n 2 /dev/sd[b,c]1

# 2. 长久化到配置文件, 下次开机后能力放弃软 RAID 失效
echo DEVICE /dev/sd[b,c]1 >> /etc/mdadm.conf

# 3. 追加配置长久化到文件, 下次开机后能力放弃软 RAID 失效
mdadm -Evs >> /etc/mdadm.conf

# 4. 格式化该分区, 以供失常存储数据
mkfs.xfs /dev/md0

示例: 删除软 RAID

# 1. umount 已挂载的 md 设施, 此处以 /dev/md0 设施为例
umount /dev/md0

# 2. 进行 RAID 设施
mdadm -S /dev/md0

# 3. 删除组成 RAID 的硬盘中的超级块数据(此处的 /dev/md0 由 /dev/sd[b,c]1 组成)
# 也能够手动用其余命令毁坏掉, 比方 dd if=/dev/zero of=/dev/sdb1 bs=1M count=1
mdadm --misc --zero-superblock /dev/sdb1
mdadm --misc --zero-superblock /dev/sdc1

# 4. 删除配置文件(此处假如该文件内只有 /dev/md0 的配置)
rm -f /etc/mdadm.conf

逻辑卷治理

相干概念

在服务器上的磁盘空间只增不减

一个物理设施就是一个物理卷.

文件系统无奈跨硬盘应用.

下面的软 RAID 创立的 md0 也是个逻辑卷, Linux 默认应用的根目录也是用逻辑卷去治理的.

能够把 N 个大小不一样的硬盘拼成一个卷组, 再切割成逻辑卷.

应用逻辑卷的益处在于能够动静扩容.

首先要了解文件系统是一个分层的构造.

挂载
↑
文件系统
↑
逻辑卷
↑
卷组
↑
物理卷
↑
分区
↑
硬盘

如果要给某个逻辑卷扩容, 则须要顺次解决以下:

  1. 新增硬盘并分区 fdisk
  2. 将新分区创立为物理卷 pvcreate
  3. 将物理卷退出到需扩容的卷组 vgextend
  4. 给该卷组的指标逻辑卷扩容 lvextend
  5. 给指标卷的文件系统更新新的容量信息 xfs_growfsresize2fs

整个过程是自底向上逐层解决的.

创立逻辑卷的相干命令

物理卷

pvcreate 命令
为 LVM 初始化物理卷(physical volumes)

pvcreate < 块设施 >

示例
    pvs /dev/sd[b,c,d]1        # 初始化物理卷 /dev/sdb1, /dev/sdc1, /dev/sdd1
pvs 命令
显示物理卷 (physical volumes) 信息

pvs


示例输入信息详解
    PV                VG        Fmt        Attr    PSize            PFree
    /dev/sda2        centos    lvm2    a--        <39.00g            4.00m
    /dev/sdb1                lvm2    ---        <2.00g            <2.00g
    /dev/sdc1                lvm2    ---        <2.00g            <2.00g
    /dev/sdd1                lvm2    ---        <2.00g            <2.00g
    物理卷            卷组                     物理的大小  物理卷在物理空间理论残余大小
                Volume Group
输入解释
    lvm2        # linux 逻辑卷管理器
    /dev/sda2 属于卷组 centos, 它的空间被卷组 centos 给简直全占用了.
pvremove 命令
移除物理卷的 LVM 标签

pvremove [选项] 物理卷名

卷组

vgcreate 命令
创立卷组(volume groups)
留神: 单个物理卷只能归属于一个卷组.

vgcreate < 卷组名称 > < 物理卷 >

示例
    vgcreate vg1 /dev/sdb1 /dev/sdc1    # 创立卷组 vg1, 并将物理卷退出到卷组里.
vgs 命令
显示卷组 (volume groups) 信息

vgs

输入示例
    VG        #PV                #LV                #SN    Attr    VSize        VFree
    centos    1                2                0    wz--n-    <39.00g        4.00m
    ????
    卷组名      组成的物理卷数量    划分出的逻辑卷数量                卷组总大小    卷组残余大小
vgremove 命令
移除卷组
    - 移除有逻辑卷的卷组时会提醒是否移除对应逻辑卷

vgremove [选项] 卷组名

逻辑卷

lvcreate 命令
创立逻辑卷

lvcreate [选项] < 卷组名 >

选项
    -L, --size < 大小 >            # 指定创立的逻辑卷的大小, eg. 100M
    -n, --name < 逻辑卷名 >      # 指定要创立的逻辑卷的名字
lvs 命令
查看逻辑卷 (logical volumes) 信息

lvs
lvremove 命令
从零碎上移除逻辑卷
    - 只指定卷组时, 会移除该卷组上的所有逻辑卷

lvremove < 卷组 >[/< 逻辑卷 >]

创立逻辑卷的过程

假如提供了 2 块硬盘 /dev/sdb/dev/sdc, 咱们须要创立一个叫做 vg1 的卷组, 并在该卷组上创立一个叫做 lv1 的逻辑卷, 并将其格式化后挂载在 /mnt/test 目录.

# 1. 别离创立 /dev/sdb1 和 /dev/sdc1 分区
fdisk /dev/sdb
fdisk /dev/sdc

# 2. 初始化物理卷, 并查看物理卷详情
pvcreate /dev/sd[b,c]1
pvs

# 3. 创立卷组, 并查看卷组详情
vgcreate vg1 /dev/sdb1 /dev/sdc1
vgs

# 4. 创立逻辑卷, 并查看逻辑卷详情
lvcreate -L 100M -n lv1 vg1
lvs

# 5. 格式化逻辑卷
mkfs.xfs /dev/vg1/lv1

# 6. 挂载并失常应用
mount /dev/vg1/lv1 /mnt/test

动静扩容逻辑卷

vgextend 命令

卷组扩容, 扩容后卷组的可用空间会变大

vgextend < 卷组 > < 物理卷 >...

示例
    vgextend centos /dev/sdd1        # 应用物理卷 /dev/sdd1 给卷组 centos 扩容.  centos 是某个卷组的名

lvextend 命令

逻辑卷扩容

lvextend [选项]

选项
    -L, --size < 大小 >        # 指定扩容大小

示例
    lvextend -L +10G root        # 给逻辑卷 root 减少 10G 空间. root 是某个逻辑卷的名.

给逻辑卷扩容后, 然而文件系统并没有变大, 因而还须要应用相应命令给具体文件系统扩容.

# xfs 文件系统
xfs_growfs /dev/centos/root        # 给 /dev/centos/root 逻辑卷的文件系统扩容.

# ext4 文件系统
resize2fs /dev/centos/root        # 未确认

其余

dd 命令

转换和拷贝文件

dd 

if=<input>        # /dev/zero
of=<output>        # 

bs=<size>            # 块大小, 每次按指定的块大小来读写. eg. 4M
count=<num>            # 写次数
seek=<block-size>    # 指标文件跳过的块数

对于 if

  • /dev/zero “ 输出设施 ”, 读取时提供有限的空字符, 罕用于产生一个特定大小的空白文件.
  • /dev/null 空设施, 抛弃写入的任意数据, 读取时会立刻失去一个 EOF
  • /dev/random 随机伪设施, 提供永不为空的随机字节数据流.
  • /dev/urandom 随机伪设施, 速度比 /dev/random 快得多, 但 ” 绝对 ” 的不够随机. 对随机性要求不高时间接应用该伪设施即可.

资源管制

ulimit

/etc/security/limit.conf 配置文件

目前集体应用

* hard nofile 1000000 #限度单个过程最大文件句柄数(达到此限度时零碎报警)* soft nofile 1000000 #限度单个过程最大文件句柄数(达到此限度时零碎报错)* soft core unlimited   # 创立的核文件的最大尺寸
* soft stack 10240      # 最大栈尺寸

ulimit 命令

shell 资源限度
    若不填写限度值, 则打印对应资源限度报告.
    若填写限度值, 则是设定.

ulimit [选项] [< 限度 >]

选项
    -a        显示目前资源限度报告

    -S        设定软限度
    -H        设定硬性限度
    
    -c        core 文件创建数量最大值
    -d        程序数据段 (data segment) 最大值
    -n        关上的文件数量最大值
    -s        栈大小 (stack) 最大值
    -b        the socket buffer size
    -e        the maximum scheduling priority (`nice')
    -f        the maximum size of files written by the shell and its children
    -i        the maximum number of pending signals
    -l        the maximum size a process may lock into memory
    -m        the maximum resident set size
    -p        the pipe buffer size
    -q        the maximum number of bytes in POSIX message queues
    -r        the maximum real-time scheduling priority
    -t        the maximum amount of cpu time in seconds
    -u        the maximum number of user processes
    -v        the size of virtual memory
    -x        the maximum number of file locks
    
限度值
    < 具体数值 >         # 限度为指定的具体指, 各自单位请参阅 help ulimit
    soft            # 限度为以后的 soft 值
    hard            # 限度为以后的 hard 值
    ulimited        # 不限度

!!! 留神

  • /etc/security/limit.conf 中的设置对于 systemd 的 service 是不失效的
  • systemd 的 service 有专门的对立配置文件 /etc/systemd/system.conf

    DefaultLimitNOFILE=100000
    DefaultLimitNPROC=100000

    须要从新加载配置文件

    systemctl daemon-reload
  • 针对 systemd 的特定 service, 能够批改其配置文件 /lib/systemd/system/xxx.service

    [Service]
    # ...
    
    LimitNOFILE=65535
    LimitNPROC=65535

    须要从新加载配置文件

    systemctl daemon-reload
    systemctl restart nginx.service

其余待整顿

退出移动版