【BASH】回顾与知识点梳理(三十七)

【BASH】回顾与知识点梳理 三十七

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

三十七. 基础系统设定与备份策略

37.1 系统基本设定

网络设定 (手动设定与 DHCP 自动取得)

通常网络参数的取得方式在台湾常见的有底下这几种:

  • 手动设定固定 IP
    常见于学术网络的服务器设定、公司行号内的特定座位等。这种方式你必须要取得底下的几个参数才能够让你的 Linux 上网的:
    • IP
    • 子网掩码(netmask)
    • 通讯闸(gateway)
    • DNS 主机的 IP (通常会有两个,若记不住的话,硬背 168.95.1.1 即可)
  • 网络参数可自动取得 (dhcp 协议自动取得)
  • 台湾的光纤到府与 ADSL 宽带拨接
    基本上的网卡名称会是这样分类的:
    • eno1 :代表由主板 BIOS 内建的网卡
    • ens1 :代表由主板 BIOS 内建的 PCI-E 界面的网卡
    • enp2s0 :代表 PCI-E 界面的独立网卡,可能有多个插孔,因此会有 s0, s1... 的编号~
    • eth0 :如果上述的名称都不适用,就回到原本的预设网卡编号

手动设定 IP 网络参数(nmcli)

关于nmcli以及详细网络设置,可参考linux网络配置

你得要先知道的是,nmcli 是透过一个名为『联机代号』的名称来设定是否要上网,而每个『联机代号』会有个『网卡代号』, 这两个东西通常设定成相同就是了。那就来先查查看目前系统上默认有什么联机代号吧!

bash 复制代码
[root@study ~]# nmcli connection show [网卡代号]
[root@study ~]# nmcli connection show
NAME UUID TYPE DEVICE
eth0 505a7445-2aac-45c8-92df-dc10317cec22 802-3-ethernet eth0
# NAME 就是联机代号,通常与后面的网卡 DEVICE 会一样!
# UUID 这个是特殊的装置识别,保留就好不要理他!
# TYPE 就是网卡的类型,通常就是以太网卡!
# DEVICE 当然就是网卡名称啰!
# 从上面我们会知道有个 eth0 的联机代号,那么来查察这个联机代号的设定为何?
[root@study ~]# nmcli connection show eth0
connection.id: eth0
connection.uuid: 505a7445-2aac-45c8-92df-dc10317cec22
connection.interface-name: eth0
connection.type: 802-3-ethernet
connection.autoconnect: yes
.....(中间省略).....
ipv4.method: manual
ipv4.dns:
ipv4.dns-search:
ipv4.addresses: 192.168.1.100/24
ipv4.gateway: --
.....(中间省略).....
IP4.ADDRESS[1]: 192.168.1.100/24
IP4.GATEWAY:
IP6.ADDRESS[1]: fe80::5054:ff:fedf:e174/64
IP6.GATEWAY:

比较重要的参数鸟哥将它列出来如下:

  • connection.autoconnect [yes|no] :是否于开机时启动这个联机,预设通常是 yes 才对!
  • ipv4.method [auto|manual] :自动还是手动设定网络参数的意思
  • ipv4.dns [dns_server_ip] :就是填写 DNS 的 IP 地址~
  • ipv4.addresses [IP/Netmask] :就是 IP 与 netmask 的集合,中间用斜线 / 来隔开~
  • ipv4.gateway [gw_ip] :就是 gateway 的 IP 地址!
bash 复制代码
[root@study ~]# nmcli connection modify eth0 \
> connection.autoconnect yes \
> ipv4.method manual \
> ipv4.addresses 172.16.1.1/16 \
> ipv4.gateway 172.16.200.254 \
> ipv4.dns 172.16.200.254
# 上面只是『修改了配置文件』而已,要实际生效还得要启动 (up) 这个 eth0 联机界面才行喔!

[root@study ~]# nmcli connection up eth0
[root@study ~]# nmcli connection show eth0
.....(前面省略).....
IP4.ADDRESS[1]: 172.16.1.1/16
IP4.GATEWAY: 172.16.200.254
IP4.DNS[1]: 172.16.200.254
IP6.ADDRESS[1]: fe80::5054:ff:fedf:e174/64
IP6.GATEWAY:

自动取得 IP 参数(dhcp)

如果你的网络是由自动取得的 DHCP 协议所分配的,那就太棒了!上述的所有功能你通通不需要背~只需要知道 ipv4.method 那个项目填成 auto 即可! 所以来查察,如果变成自动取得,网络设定要如何处理呢?

bash 复制代码
[root@study ~]# nmcli connection modify eth0 \
> connection.autoconnect yes \
> ipv4.method auto
[root@study ~]# nmcli connection up eth0
[root@study ~]# nmcli connection show eth0
IP4.ADDRESS[1]: 172.16.2.76/16
IP4.ADDRESS[2]: 172.16.1.1/16
IP4.GATEWAY: 172.16.200.254
IP4.DNS[1]: 172.16.200.254

修改主机名(hostnamectl)

bash 复制代码
[root@study ~]# hostnamectl [set-hostname 你的主机名]
# 1. 显示目前的主机名与相关信息
[root@study ~]# hostnamectl
 Static hostname: study.centos.vbird # 这就是主机名
 Icon name: computer
 Chassis: n/a
 Machine ID: 309eb890d09f440681f596543d95ec7a
 Boot ID: b2de392ff1f74e568829c716a7166ecd
 Virtualization: kvm
 Operating System: CentOS Linux 7 (Core) # 操作系统名称!
 CPE OS Name: cpe:/o:centos:centos:7
 Kernel: Linux 3.10.0-229.el7.x86_64 # 核心版本也提供!
 Architecture: x86_64 # 硬件等级也提供!
# 2. 尝试修改主机名为 www.centos.vbird 之后再改回来~
[root@study ~]# hostnamectl set-hostname www.centos.vbird
[root@study ~]# cat /etc/hostname
www.centos.vbird
[root@study ~]# hostnamectl set-hostname study.centos.vbird

37.2 日期与时间设定

时区的显示与设定

bash 复制代码
[root@study ~]# timedatectl [commamd]
选项与参数:
list-timezones :列出系统上所有支持的时区名称
set-timezone :设定时区位置
set-time :设定时间
set-ntp :设定网络校时系统

# 1. 显示目前的时区与时间等信息
[root@study ~]# timedatectl
 Local time: Tue 2015-09-01 19:50:09 CST # 本地时间
 Universal time: Tue 2015-09-01 11:50:09 UTC # UTC 时间,可称为格林威治标准时间
 RTC time: Tue 2015-09-01 11:50:12
 Timezone: Asia/Taipei (CST, +0800) # 就是时区啰!
 NTP enabled: no
NTP synchronized: no
RTC in local TZ: no
 DST active: n/a
# 2. 显示出是否有 New_York 时区?若有,则请将目前的时区更新一下
[root@study ~]# timedatectl list-timezones | grep -i new
America/New_York
America/North_Dakota/New_Salem
[root@study ~]# timedatectl set-timezone "America/New_York"
[root@study ~]# timedatectl
 Local time: Tue 2015-09-01 07:53:24 EDT
 Universal time: Tue 2015-09-01 11:53:24 UTC
 RTC time: Tue 2015-09-01 11:53:28
 Timezone: America/New_York (EDT, -0400)
[root@study ~]# timedatectl set-timezone "Asia/Taipei"
# 最后还是要记得改回来台湾时区喔!不要忘记了!

时区 参考https://blog.csdn.net/zhizhengguan/article/details/84071875

时间的调整

由于鸟哥的测试机使用的是虚拟机,预设虚拟机使用的是 UTC 时间而不是本地时间,所以在预设的情况下,测试机每次开机都会快上 8 小时... 所以就需要来调整一下时间啰!时间的格式可以是『 yyyy-mm-dd HH:MM 』的格式!比较方便记忆喔!

bash 复制代码
# 1. 将时间调整到正确的时间点上!
[root@study ~]# timedatectl set-time "2015-09-01 12:02"

用 ntpdate 手动网络校时

如何手动网络校时呢?很简单,透过 ntpdate 这个指令即可!

bash 复制代码
[root@study ~]# ntpdate tock.stdtime.gov.tw
1 Sep 13:15:16 ntpdate[21171]: step time server 211.22.103.157 offset -0.794360 sec
[root@study ~]# hwclock -w

hwclock 是将正确的时间写入你的 BIOS 时间记录内!如果确认可以执行,未来应该可以使用 crontab 来更新系统时间吧!

37.3 语系设定

我们在前面章节知道有个 LANG 与 locale 的指令能够查询目前的语系数据与变量,也知道/etc/locale.conf 其实就是语系的配置文件。 此外,你还得要知道的是,系统的语系与你目前软件的语系数据可能是可以不一样的!如果想要知道目前『系统语系』的话, 除了呼叫配置文件之外,也能够使用 localectl 来查阅:

bash 复制代码
[root@study ~]# localectl
 System Locale: LANG=zh_TW.utf8 # 底下这些数据就是『系统语系』
 LC_NUMERIC=zh_TW.UTF-8
 LC_TIME=zh_TW.UTF-8
 LC_MONETARY=zh_TW.UTF-8
 LC_PAPER=zh_TW.UTF-8
 LC_MEASUREMENT=zh_TW.UTF-8
 VC Keymap: cn
 X11 Layout: cn
 X11 Options: grp:ctrl_shift_toggle
[root@study ~]# locale
LANG=zh_TW.utf8 # 底下的则是『当前这个软件的语系』数据!
LC_CTYPE="en_US.utf8"
LC_NUMERIC="en_US.utf8"
.....(中间省略).....
LC_ALL=en_US.utf8

如果你跟着鸟哥的测试机器一路走来,图形界面将会是中文万国码的提示登入字符。如何改成英文语系的登入界面?

答:就是将 locale 改成 en_US.utf8 之后,再转成图形界面即可!

bash 复制代码
[root@study ~]# localectl set-locale LANG=en_US.utf8
[root@study ~]# systemctl isolate multi-user.target
[root@study ~]# systemctl isolate graphical.target

37.4 防火墙简易设定

防火墙其实是一种网络数据的过滤方式,它可以依据你服务器启动的服务来设定是否放行,也能够针对你信任的用户来放行! 这部份应该要对网络有点概念之后才来谈比较好,所以详细的数据会写入在服务器篇的内容。由于目前 CentOS 7 的预设防火墙机制为 firewalld, 他的管理界面主要是透过指令列 firewall-cmd 这个详细的指令~既然我们还没有谈到更多的防火墙与网络规则,想要了解firewall-cmd 有点难! 所以这个小节我们仅使用图形界面来介绍防火墙的相关数据而已!

组态:『执行时期』与『永久记录』的差异

防火墙的规则拟定大概有两种情况,一种是『暂时用来执行』的规则,一种则是『永久记录』的规则。 一般来说,刚刚启动防火墙时,这两种规则会一模一样。不过,后来可能你会暂时测试而加上几条规则,如果该规则没有写入『永久记录』区的话, 那下次重载防火墙时,该规则就会消失喔!所以请特别注意:『不要只是在运行时间增加规则设定,而是必须要在永久记录区增加规则才行!

界域 (zone):依据不同的环境所设计的网络界域 (zone)

玩过网络后,你可能会听过所谓的本机网络、NAT 与 DMZ 等网域,同时,可能还有可信任的 (trusted) 网域,或者是应该被抵挡 (drop/block) 的网域等等。 这些网域各有其功能~早期的 iptables 防火墙服务,所有的规则你都得要自己手动来撰写,然后规则的细分得要自己去规划, 所以很可能会导致一堆无法理解的规则。

新的 firewalld 服务就预先设计这些可能会被用到的网络环境,里面的规则除了 public (公开网域) 这个界域 (zone) 之外,其它的界域则暂时为没有启动的状况。

相关设定项目

防火墙规则通常需要设定的地方有:

  • 服务:一般来说,如果你的 Linux server 是作为 Internet 的服务器,提供的是比较一般的服务,那么只要处理『服务』项目即可。预设你的服务器已经提供了 ssh 与 dhcpv6-client 的服务埠口喔!
  • 端口:如果你提供的服务所启用的埠口并不是正规的埠口,举例来说,为了玩 systemd 与 SELinux 我们曾经将 ssh 的埠口调整到 222 ,同时也曾经将 ftp 的埠口调整到 555 对吧!那如果你想要让人家连进来,就不能只开放上面的『服务』项目,连这个『端口』的地方也需要调整才行!另外, 如果有某些比较特别的服务是 CentOS 预设没有提供的,所以『服务』当然也就没有存在!这时你也可以直接透过端口来搞定它!
  • 丰富规则(rich rule):如果你有『整个网域』需要放行或者是拒绝的时候,那么前两个项目就没有办法适用,这时就得要这个项目来处理了。不过鸟哥测试了 7.1 这一版的设定,似乎怪怪的~因此,底下我们会以firewall-cmd 来增加这一个项目的设定。
  • 界面:就是这个界域主要是针对哪一个网络卡来做规范的意思,我们只有一张网卡,所以当然就是 eth0 啰!

现在假设我们的 Linux server 是要作为底下的几个重要的服务与相关的网域功能,你该如何设定防火墙呢?

  • 要作为 ssh, www, ftp, https 等等正规埠口的服务;
  • 同时与前几章搭配,还需要放行 port 222 与 port 555 喔!
  • 局域网络 192.168.1.0/24 这一段我们目前想要直接放行这段网域对我们服务器的联机

请注意,因为未来都要持续生效,所以请一定要去到『永久』的防火墙设定项目里头去处理!不然只有这次开机期间会生效而已~注意注意! 好了,首先就来处理一下正规的服务埠口的放行吧!不过因为永久的设定比较重要,因此你得要先经过授权认证才行!

37.5 服务器硬件数据的收集

『工欲善其事,必先利其器』,这是一句大家耳熟能详的古人名言,在我们的信息设备上面也是一样的啊! 在现在 (2015) 正好是 DDR3 切换到 DDR4 的时间点,假设你的服务器硬件刚刚好内存不太够,想要加内存, 那请教一下,你的主板插槽还够吗?你的内存需要 DDR3 还是 DDR4 呢?你的主机能不能吃到 8G 以上的单条内存? 这就需要检查一下系统啰!不想拆机壳吧?那怎办?用软件去查啦!此外,磁盘会不会出问题?你怎么知道哪一颗磁盘出问题了?这就重要啦!

以系统内建 dmidecode 解析硬件配备

系统有个名为 dmidecode 的软件,这个软件挺有趣的,它可以解析 CPU 型号、主板型号与内存相关的型号等等~ 相当的有帮助!尤其是在升级配备上面!现在让我们来查一查鸟哥的虚拟机里头有啥东西吧!

bash 复制代码
[root@study ~]# dmidecode -t type
选项与参数:
详细的 type 项目请 man dmidecode 查询更多的数据,这里仅列出比较常用的项目:
1 :详细的系统数据,含主板的型号与硬件的基础数据等
4 :CPU 的相关资料,包括倍频、外频、核心数、核心绪数等
9 :系统的相关插槽格式,包括 PCI, PCI-E 等等的插槽规格说明
17:每一个内存插槽的规格,若内有内存,则列出该内存的容量与型号
bash 复制代码
# 范例一:秀出整个系统的硬件信息,例如主板型号等等
[root@study ~]# dmidecode -t 1
# dmidecode 2.12
SMBIOS 2.4 present.
Handle 0x0100, DMI type 1, 27 bytes
System Information
 Manufacturer: Red Hat
 Product Name: KVM
 Version: RHEL 6.6.0 PC
 Serial Number: Not Specified
 UUID: AA3CB5D1-4F42-45F7-8DBF-575445D3887F
 Wake-up Type: Power Switch
 SKU Number: Not Specified
 Family: Red Hat Enterprise Linux
 
# 范例二:那内存相关的数据呢?
[root@study ~]# dmidecode -t 17
# dmidecode 2.12
SMBIOS 2.4 present.
Handle 0x1100, DMI type 17, 21 bytes
Memory Device
 Array Handle: 0x1000
 Error Information Handle: 0x0000
 Total Width: 64 bits
 Data Width: 64 bits
 Size: 3072 MB
 Form Factor: DIMM
 Set: None
 Locator: DIMM 0
 Bank Locator: Not Specified
 Type: RAM
 Type Detail: None

因为我们的系统是虚拟机,否则的话,你的主板型号、每一只安插的内存容量等等,都会被列出来在上述的画面中喔! 这样可以让你了解系统的所有主要硬件配备为何!

硬件资源的收集与分析

其实核心所侦测到的硬件可能并非完全正确喔!因为他仅是『使用最适当的模块来驱动这个硬件』而已, 所以有时候难免会误判啦 (虽然机率非常之低)!那你可能想要以最新最正确的模块来驱动你的硬件, 此时,重新编译核心是一条可以达成的道路。不过,现在的 Linux 系统并没有很建议你一定要重新编译核心就是了。

那除了直接呼叫出 /proc 底下的文件内容之外,其实 Linux 有提供几个简单的指令来将核心所侦测到的硬件叫出来的~ 常见的指令有底下这些:

  • gdisk:第七章曾经谈过,可以使用 gdisk -l 将分区表列出;
  • dmesg:第十六章谈过, 观察核心运作过程当中所显示的各项讯息记录;
  • vmstat:第十六章谈过,可分析系统 (CPU/RAM/IO) 目前的状态;
  • lspci:列出整个 PC 系统的 PCI 接口装置!很有用的指令;
  • lsusb:列出目前系统上面各个 USB 端口口的状态,与连接的 USB 装置;
  • iostat:与 vmstat 类似,可实时列出整个 CPU 与接口设备的 Input/Output 状态。
gdisk

『MBR 分区表请使用 fdisk 分区, GPT 分区表请使用 gdisk 分区!』

bash 复制代码
[root@study ~]# gdisk 装置名称
bash 复制代码
# 范例:由前一小节的 lsblk 输出,我们知道系统有个 /dev/vda,请观察该磁盘的分区与相关数据
[root@study ~]# gdisk /dev/vda <==仔细看,不要加上数字喔!
GPT fdisk (gdisk) version 0.8.6
Partition table scan:
 MBR: protective
 BSD: not present
 APM: not present
 GPT: present
Found valid GPT with protective MBR; using GPT. <==找到了 GPT 的分区表!
Command (? for help): <==这里可以让你输入指令动作,可以按问号 (?) 来查看可用指令
Command (? for help): ?
b back up GPT data to a file
c change a partition's name
d delete a partition # 删除一个分区
i show detailed information on a partition
l list known partition types
n add a new partition # 增加一个分区
o create a new empty GUID partition table (GPT)
p print the partition table # 印出分区表 (常用)
q quit without saving changes # 不储存分区就直接离开 gdisk
r recovery and transformation options (experts only)
s sort partitions
t change a partition's type code
v verify disk
w write table to disk and exit # 储存分区操作后离开 gdisk
x extra functionality (experts only)
? print this menu
Command (? for help): 

不管你进行了什么动作,只要离开 gdisk 时按下『q』,那么所有的动作『都不会生效!』相反的, 按下『w』就是动作生效的意思。

lspci
bash 复制代码
[root@study ~]# lspci [-vvn]
选项与参数:
-v :显示更多的 PCI 接口装置的详细信息;
-vv :比 -v 还要更详细的细部信息;
-n :直接观察 PCI 的 ID 而不是厂商名称
bash 复制代码
# 范例一:查阅您系统内的 PCI 总线相关装置:
[root@study ~]# lspci
00:00.0 Host bridge: Intel Corporation 440FX - 82441FX PMC [Natoma] (rev 02)
00:01.0 ISA bridge: Intel Corporation 82371SB PIIX3 ISA [Natoma/Triton II]
...
00:1d.7 USB controller: Intel Corporation 82801I (ICH9 Family) USB2 EHCI Controller #1 (rev 03)
# 不必加任何的参数,就能够显示出目前主机上面的各个 PCI 接口的装置呢!

其实那个就是 PCI 的标准 ID 与厂牌名称的对应表啦!此外,刚刚我们使用 lspci 时,其实所有的数据都是由 /proc/bus/pci/ 目录下的数据所取出的呢!了解了吧! ^_^!不过,由于硬件的发展太过迅速,所以你的 pci.ids 文件可能会落伍了~那怎办? 没关系~可以使用底下的方式来在线更新你的对应档:

bash 复制代码
[root@study ~]# update-pciids
lsusb
bash 复制代码
[root@study ~]# lsusb [-t]
选项与参数:
-t :使用类似树状目录来显示各个 USB 端口口的相关性
bash 复制代码
# 范例一:列出目前鸟哥的测试用主机 USB 各端口口状态
[root@study ~]# lsusb
Bus 002 Device 002: ID 0627:0001 Adomax Technology Co., Ltd
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
# 如上所示,鸟哥的主机在 Bus 002 有接了一个设备,
# 该设备的 ID 是 0627:0001,对应的厂商与产品为 Adomax 的设备。
iostat

刚刚那个 lspci 找到的是目前主机上面的硬件配备,那么整部机器的储存设备, 主要是磁盘对吧!请问,您磁盘由开机到现在,已经存取多少数据呢?这个时候就得要 iostat 这个指令的帮忙了!

默认 CentOS 并没有安装这个软件,因此你必须要先安装他才行!如果你已经有网络了, 那么使用『 yum install sysstat 』先来安装此软件吧!否则无法进行如下的测试喔!

bash 复制代码
[root@study ~]# iostat [-c|-d] [-k|-m] [-t] [间隔秒数] [侦测次数]
选项与参数:
-c :仅显示 CPU 的状态;
-d :仅显示储存设备的状态,不可与 -c 一起用;
-k :默认显示的是 block ,这里可以改成 K bytes 的大小来显示;
-m :与 -k 类似,只是以 MB 的单位来显示结果。
-t :显示日期出来;
bash 复制代码
# 范例一:显示一下目前整个系统的 CPU 与储存设备的状态
[root@study ~]# iostat
Linux 3.10.0-229.el7.x86_64 (study.centos.vbird) 09/02/2015 _x86_64_ (4 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
 0.08 0.01 0.02 0.00 0.01 99.88
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.46 5.42 3.16 973670 568007
scd0 0.00 0.00 0.00 154 0
sda 0.01 0.03 0.00 4826 0
dm-0 0.23 4.59 3.09 825092 555621
# 瞧!上面数据总共分为上下两部分,上半部显示的是 CPU 的当下信息;
# 下面数据则是显示储存装置包括 /dev/vda 的相关数据,他的数据意义:
# tps :平均每秒钟的传送次数!与数据传输『次数』有关,非容量!
# kB_read/s :开机到现在平均的读取单位;
# kB_wrtn/s :开机到现在平均的写入单位;
# kB_read :开机到现在,总共读出来的文件单位;
# kB_wrtn :开机到现在,总共写入的文件单位;

# 范例二:仅针对 vda ,每两秒钟侦测一次,并且共侦测三次储存装置
[root@study ~]# iostat -d 2 3 vda
Linux 3.10.0-229.el7.x86_64 (study.centos.vbird) 09/02/2015 _x86_64_ (4 CPU)
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.46 5.41 3.16 973682 568148
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 1.00 0.00 0.50 0 1
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
vda 0.00 0.00 0.00 0 0
# 仔细看一下,如果是有侦测次数的情况,那么第一次显示的是『从开机到现在的数据』,
# 第二次以后所显示的数据则代表两次侦测之间的系统传输值!举例来说,上面的信息中,
# 第二次显示的数据,则是两秒钟内(本案例)系统的总传输量与平均值。

了解磁盘的健康状态

其实 Linux server 最重要的就是『数据安全』了!而数据都是放在磁盘当中的,所以啰,无时无刻了解一下你的磁盘健康状况,应该是个好习惯吧! 问题是,你怎么知道你的磁盘是好是坏啊?这时就得要来谈一个 smartd 的服务了!

SMART 其实是『 Self-Monitoring, Analysis and Reporting Technology System 』的缩写,主要用来监测目前常见的 ATA 与 SCSI 界面的磁盘, 只是,要被监测的磁盘也必须要支持 SMART 的协议才行!否则 smartd 就无法去下达指令,让磁盘进行自我健康检查~

bash 复制代码
# 1. 用 smartctl 来显示完整的 /dev/sda 的信息
[root@study ~]# smartctl -a /dev/sda
smartctl 6.2 2013-07-26 r3841 [x86_64-linux-3.10.0-229.el7.x86_64] (local build)
Copyright (C) 2002-13, Bruce Allen, Christian Franke, www.smartmontools.org
# 首先来输出一下这部磁盘的整体信息状况!包括制造商、序号、格式、SMART 支持度等等!
=== START OF INFORMATION SECTION ===
Device Model: QEMU HARDDISK
Serial Number: QM00002
Firmware Version: 0.12.1
User Capacity: 2,148,073,472 bytes [2.14 GB]
Sector Size: 512 bytes logical/physical
Device is: Not in smartctl database [for details use: -P showall]
ATA Version is: ATA/ATAPI-7, ATA/ATAPI-5 published, ANSI NCITS 340-2000
Local Time is: Wed Sep 2 18:10:38 2015 CST
SMART support is: Available - device has SMART capability.
SMART support is: Enabled
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
# 接下来则是一堆基础说明!鸟哥这里先略过这段资料喔!
General SMART Values:
Offline data collection status: (0x82) Offline data collection activity
 was completed without error.
Auto Offline Data Collection: Enabled.
.....(中间省略).....
# 再来则是有没有曾经发生过磁盘错乱的问题登录!
SMART Error Log Version: 1
No Errors Logged
# 当你下达过磁盘自我检测的过程,就会被记录在这里了!
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 4660 -
# 2 Short offline Completed without error 00% 4660 -
# 2. 命令磁盘进行一次自我检测的动作,然后再次观察磁盘状态!
[root@study ~]# smartctl -t short /dev/sda
[root@study ~]# smartctl -a /dev/sda
.....(前面省略).....
# 底下会多出一个第三笔的测试信息!看一下 Status 的状态,没有问题就是好消息!
SMART Self-test log structure revision number 1
Num Test_Description Status Remaining LifeTime(hours) LBA_of_first_error
# 1 Short offline Completed without error 00% 4660 -
# 2 Short offline Completed without error 00% 4660 -
# 3 Short offline Completed without error 00% 4660 -

不过要特别强调的是,因为进行磁盘自我检查时,可能磁盘的 I/O 状态会比较频繁,因此不建议在系统忙碌的时候进行喔! 否则系统的效能是可能会被影响的哩!要注意!要注意!

37.6 备份要点

备份是个很重要的工作,很多人总是在系统损毁的时候才在哀嚎说:『我的资料啊!天那...!』此时才会发现备份资料的可爱! 但是备份其实也非常可怕!因为你的重要数据都在备份文件里面,如果这个备份被窃取或遗失,其实对你的系统资安影响也非常大! 同时,备份使用的媒体选择也非常多样,但是各种储存媒体各有其功能与优劣,所以当然得要选择啰!闲话少说,来谈谈备份吧!

备份资料的考虑

  • 造成系统损毁的问题-硬件问题
  • 造成系统损毁的问题-软件与人的问题
  • 主机角色不同,备份任务也不同

备份因素考虑

  • 备份哪些文件:
    哪些数据对系统或用户来说是重要的?那些数据就是值得备份的数据!例如 /etc/* 及 /home/* 等。
  • 选择什么备份的媒介:
    是可擦写光盘、另一颗硬盘、同一颗硬盘的不同 partition、还是使用网络备援系统? 哪一种的速度最快,最便宜,可将数据保存最久?这都可以考虑的。
  • 考虑备份的方式:
    是以完整备份(类似 ghost)来备份所有数据,还是使用差异备份仅备份有被更动过的数据即可?
  • 备份的频率:
    例如 Mariadb 数据库是否天天备份、若完整备份,需要多久进行一次?
  • 备份使用的工具为何:
    是利用 tar 、 cpio 、 dd 还是 dump 等等的备份工具?
哪些 Linux 数据具有备份的意义

具有备份意义的文件通常可以粗分为两大类,一类是系统基本设定信息、一类则是类似网络服务的内容数据。

操作系统本身需要备份的文件

这方面的文件主要跟『账号与系统配置文件』有关系! 主要有哪些账号的文件需要备份呢?就是/etc/passwd, /etc/shadow, /etc/group, /etc/gshadow, /home 底下的用户家目录等等, 而由于Linux 预设的重要参数档都在 /etc/ 底下,所以只要将这个目录备份下来的话, 那么几乎所有的配置文件都可以被保存的!

至于 /home 目录是一般用户的家目录,自然也需要来备份一番!再来,由于使用者会有邮件吧!所以呢,这个 /var/spool/mail/ 内容也需要备份呦!另外,由于如果你曾经自行更动过核心,那么 /boot 里头的信息也就很重要啰!所以啰,这方面的数据你必须要备份的文件为:

  • /etc/ 整个目录
  • /home/ 整个目录
  • /var/spool/mail/
  • /var/spoll/{at|cron}/
  • /boot/
  • /root/
  • 如果你自行安装过其他的软件,那么 /usr/local/ 或 /opt 也最好备份一下!
网络服务的数据库方面

这部份的数据可就多而且复杂了,首先是这些网络服务软件的配置文件部分, 如果你的网络软件安装都是以原厂提供的为主,那么你的配置文件案大多是在 /etc 底下,所以这个就没啥大问题!但若你的套件大多来自于自行的安装,那么 /usr/local 这个目录可就相当的重要了!

再来,每种服务提供的数据都不相同,这些数据很多都是人们提供的!举例来说,你的 WWW 服务器总是需要有人提供网页文件吧?否则浏览器来是要看啥咚咚?你的讨论区总是得要写入数据库系统吧? 否则讨论的数据如何更新与记载?所以,使用者主动提供的文件,以及服务运作过程会产生的数据, 都需要被考虑来备份。若我们假设我们提供的服务软件都是使用原厂的 RPM 安装的!所以要备份的数据文件有:

  • 软件本身的配置文件案,例如:/etc/ 整个目录,/usr/local/ 整个目录
  • 软件服务提供的数据,以 WWW 及 Mariadb 为例:WWW 资料:/var/www 整个目录或 /srv/www 整个目录,及系统的用户家目录Mariadb(/var/lib/mysql )整个目录
  • 其他在 Linux 主机上面提供的服务之数据库文件!
推荐需要备份的目录

如果你的硬件或者是由于经费的关系而无法全部的数据都予以备份时, 鸟哥建议你至少需要备份这些目录呦!

  • /etc
  • /home
  • /root
  • /var/spool/mail/, /var/spool/cron/, /var/spool/at/
  • /var/lib/
不需要备份的目录
  • /dev :这个随便你要不要备份
  • /proc, /sys, /run:这个真的不需要备份啦!
  • /mnt, /media:如果你没有在这个目录内放置你自己系统的东西,也不需要备份
  • /tmp :干嘛存暂存档!不需要备份!
备份用储存媒体的选择
异地备援系统

『异地备援系统』就是将你的系统数据『备份』到其他的地方去, 例如说我的机器在台南,但是我还有另一部机器在高雄老家,这样的话, 我可以将台南机器上面重要的数据都给他定期的自动的透过网络传输回去! 也可以将家里重要的数据给他丢到台南来!这样的最大优点是可以在台南的机器死掉的时候, 即使是遭小偷,也可以有一个『万一』的备份所在!

有没有缺点啊?有啊!缺点就是~带宽严重的不足! 在这种状态下,所能采取的策略大概就是『仅将最重要的数据给他传输回去啰!』 至于一些只要系统从新安装就可以回复的咚咚!那就没有这个必要了!

储存媒体的考虑

在过去我们使用的储存媒体可能有 Tape, Mo, Zip, CD-RW, DVD-RW, 外接式磁盘等等,近年来由于磁盘容量不断上提,加上已经有便宜的桌上型 NAS 储存设备,这些 NAS 储存设备就等于是一部小型 Linux server, 里面还能够提供客制化的服务,包括不同的连接界面与传输协议,因此,你只要记得,就是买还能够自我容错的 NAS 设备来备份就对了!

37.7 备份的种类、频率与工具的选择

那么备份有哪些方式呢?一般可以粗略分为『累积备份』与『差异备份』这两种

完整备份之累积备份 (Incremental backup)

还原的考虑

反过来讲,如果是完整备份的话呢?若硬件出问题导致系统损毁时,只要将完整备份拿出来,整个给他倾倒回去硬盘, 所有事情就搞定了!有些时候 (例如使用 dd 指令) 甚至连系统都不需要重新安装!反正整个系统都给他倒回去,连同重要的 Linux 系统文件等,所以当然也就不需要重新安装啊!因此,很多企业用来提供重要服务的主机都会使用完整备份, 若所提供的服务真的非常重要时,甚至会再架设一部一模一样的机器呢!如此一来, 若是原本的机器出问题,那就立刻将备份的机器拿出来接管!以使企业的网络服务不会中断哩!

那你知道完整备份的定义了吧?没错!完整备份就是将根目录 (/) 整个系统通通备份下来的意思!不过,在某些场合底下,完整备份也可以是备份一个文件系统 (filesystem)!例如 /dev/sda1 或 /dev/md0 或 /dev/myvg/mylv 之类的文件系统就是了。

累积备份的原则

虽然完整备份在还原方面有相当良好的表现,但是我们都知道系统用的越久,数据量就会越大!如此一来, 完整备份所需要花费的时间与储存媒体的使用就会相当麻烦~所以,完整备份并不会也不太可能每天都进行的! 那你想要每天都备份数据该如何进行呢?有两种方式啦,一种是本小节会谈到的累积备份,一种则是下个小节谈到的差异备份。

所谓的累积备份,指的是在系统在进行完第一次完整备份后,经过一段时间的运作, 比较系统与备份文件之间的差异,仅备份有差异的文件而已。而第二次累积备份则与第一次累积备份的数据比较,也是仅备份有差异的数据而已

那如何还原?经过上面的分析,我们也会知道累积备份的还原方面比较麻烦! 假设你的系统在星期五的时候挂点了!那你要如何还原?首先,你必须要还原星期一的完整备份,然后还原星期二的累积备份, 再依序还原星期三、星期四的累积备份才算完全复原!那如果你是经过了九次的累积备份,就得要还原到第九次的阶段, 才是最完整的还原程序!

累积备份使用的备份软件

完整备份常用的工具有 dd, cpio, xfsdump/xfsrestore 等等。因为这些工具都能够备份装置与特殊文件!dd 可以直接读取磁盘的扇区 (sector) 而不理会文件系统,是相当良好的备份工具!不过缺点就是慢很多! cpio 是能够备份所有档名,不过,得要配合 find 或其他找文件名的指令才能够处理妥当。以上两个都能够进行完整备份, 但累积备份就得要额外使用脚本程序来处理。可以直接进行累积备份的就是 xfsdump 这个指令啰!

bash 复制代码
# 1. 用 dd 来将 /dev/sda 备份到完全一模一样的 /dev/sdb 硬盘上:
[root@study ~]# dd if=/dev/sda of=/dev/sdb
# 由于 dd 是读取扇区,所以 /dev/sdb 这颗磁盘可以不必格式化!非常的方便!
# 只是你会等非常非常久!因为 dd 的速度比较慢!
bash 复制代码
# 2. 使用 cpio 来备份与还原整个系统,假设储存媒体为 SATA 磁带机:
[root@study ~]# find / -print | cpio -covB > /dev/st0 <==备份到磁带机
[root@study ~]# cpio -iduv < /dev/st0 <==还原
bash 复制代码
# 1. 完整备份
[root@study ~]# xfsdump -l 0 -L 'full' -M 'full' -f /backupdata/home.dump /home
# 2. 第一次进行累积备份
[root@study ~]# xfsdump -l 1 -L 'full-1' -M 'full-1' -f /backupdata/home.dump1 /home

其实 tar 也可以用来进行完整备份啦!

bash 复制代码
[root@study ~]# tar --exclude /proc --exclude /mnt --exclude /tmp \
> --exclude /backupdata -jcvp -f /backupdata/system.tar.bz2 /

完整备份之差异备份 (Differential backup)

差异备份与累积备份有点类似,也是需要进行第一次的完整备份后才能够进行。只是差异备份指的是:每次的备份都是与原始的完整备份比较的结果。所以系统运作的越久,离完整备份时间越长, 那么该次的差异备份数据可能就会越大!差异备份的示意图如下所示:

差异备份常用的工具与累积备份差不多!因为都需要完整备份嘛!如果使用 xfsdump 来备份的话,那么每次备份的等级 (level) 就都会是 level 1 的意思啦!当然啦,你也可以透过 tar 的 -N 选项来备份喔!如下所示:

bash 复制代码
[root@study ~]# tar -N '2015-09-01' -jpcv -f /backupdata/home.tar.bz2 /home
# 只有在比 2015-09-01 还要新的文件,在 /home 底下的文件才会被打包进 home.bz2 中!
# 有点奇怪的是,目录还是会被记录下来,只是目录内的旧文件就不会备份。

此外,你也可以透过 rsync 来进行镜像备份喔! 这个 rsync 可以对两个目录进行镜像 (mirror) ,算是一个非常快速的备份工具!简单的指令语法为:

bash 复制代码
[root@study ~]# rsync -av 来源目录 目标目录
# 1. 将 /home/ 镜像到 /backupdata/home/ 去
[root@study ~]# rsync -av /home /backupdata/
# 此时会在 /backupdata 底下产生 home 这个目录来!
[root@study ~]# rsync -av /home /backupdata/
# 再次进行会快很多!如果数据没有更动,几乎不会进行任何动作!

建议周期性更新完整备份

关键数据备份

完整备份虽然有许多好处,但就是需要花费很多时间!所以,如果在主机提供的服务并不是一定要 24 小时提供的前提下, 我们可以仅备份重要的关键数据即可。由于主机即使当机个一两天可能也不会影响到你的正常生活时, 仅备份关键数据就好啦!

备份关键数据鸟哥最爱使用 tar 来处理了!如果想要分门别类的将各种不同的服务在不同的时间备份使用不同档名, 配合 date 指令是非常好用的工具!例如底下的案例是依据日期来备份 mariadb 的数据库喔!

bash 复制代码
[root@study ~]# tar -jpcvf mysql.`date +%Y-%m-%d`.tar.bz2 /var/lib/mysql

37.8 鸟哥的备份策略

鸟哥就将我的备份分为两大部分,一个是每日备份经常性变动的重要数据,一个则是每周备份就不常变动的信息。这个时候我就写了两个简单的 scripts ,分别来储存这些数据。

  1. 主机硬件:使用一个独立的 filesystem 来储存备份数据,此 filesystem 挂载到 /backup 当中;
  2. 每日进行:目前仅备份 MySQL 数据库;
  3. 每周进行:包括 /home, /var, /etc, /boot, /usr/local 等目录与特殊服务的目录;
  4. 自动处理:这方面利用 /etc/crontab 来自动提供备份的进行;
  5. 异地备援:每月定期的将数据分别 (a)刻录到光盘上面 (b)使用网络传输到另一部机器上面。

每周系统备份的 script

bash 复制代码
[root@study ~]# vi /backup/backupwk.sh
#!/bin/bash
# ====================================================================
# 用户参数输入位置:
# basedir=你用来储存此脚本所预计备份的数据之目录(请独立文件系统)
basedir=/backup/weekly <==您只要改这里就好了!
# ====================================================================
# 底下请不要修改了!用默认值即可!
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
# 设定要备份的服务的配置文件,以及备份的目录
named=$basedir/named
postfixd=$basedir/postfix
vsftpd=$basedir/vsftp
sshd=$basedir/ssh
sambad=$basedir/samba
wwwd=$basedir/www
others=$basedir/others
userinfod=$basedir/userinfo
# 判断目录是否存在,若不存在则予以建立。
for dirs in $named $postfixd $vsftpd $sshd $sambad $wwwd $others $userinfod
do
[ ! -d "$dirs" ] && mkdir -p $dirs
done
# 1. 将系统主要的服务之配置文件分别备份下来,同时也备份 /etc 全部。
cp -a /var/named/chroot/{etc,var} $named
cp -a /etc/postfix /etc/dovecot.conf $postfixd
cp -a /etc/vsftpd/* $vsftpd
cp -a /etc/ssh/* $sshd
cp -a /etc/samba/* $sambad
cp -a /etc/{my.cnf,php.ini,httpd} $wwwd
cd /var/lib
 tar -jpc -f $wwwd/mysql.tar.bz2 mysql
cd /var/www
 tar -jpc -f $wwwd/html.tar.bz2 html cgi-bin
cd /
 tar -jpc -f $others/etc.tar.bz2 etc
cd /usr/
 tar -jpc -f $others/local.tar.bz2 local
# 2. 关于使用者参数方面
cp -a /etc/{passwd,shadow,group} $userinfod
cd /var/spool
 tar -jpc -f $userinfod/mail.tar.bz2 mail
cd /
 tar -jpc -f $userinfod/home.tar.bz2 home
cd /var/spool
 tar -jpc -f $userinfod/cron.tar.bz2 cron at
[root@study ~]# chmod 700 /backup/backupwk.sh
[root@study ~]# /backup/backupwk.sh <==记得自己试跑看看!

每日备份资料的 script

bash 复制代码
[root@study ~]# vi /backup/backupday.sh
#!/bin/bash
# =========================================================
# 请输入,你想让备份数据放置到那个独立的目录去
basedir=/backup/daily/ <==你只要改这里就可以了!
# =========================================================
PATH=/bin:/usr/bin:/sbin:/usr/sbin; export PATH
export LANG=C
basefile1=$basedir/mysql.$(date +%Y-%m-%d).tar.bz2
basefile2=$basedir/cgi-bin.$(date +%Y-%m-%d).tar.bz2
[ ! -d "$basedir" ] && mkdir $basedir
# 1. MysQL (数据库目录在 /var/lib/mysql)
cd /var/lib
 tar -jpc -f $basefile1 mysql
# 2. WWW 的 CGI 程序 (如果有使用 CGI 程序的话)
cd /var/www
 tar -jpc -f $basefile2 cgi-bin
[root@study ~]# chmod 700 /backup/backupday.sh
[root@study ~]# /backup/backupday.sh <==记得自己试跑看看!
bash 复制代码
[root@study ~]# vi /etc/crontab
# 加入这两行即可 (请注意你的文件目录!不要照抄呦!)
30 3 * * 0 root /backup/backupwk.sh
30 2 * * * root /backup/backupday.sh

有些时候,你在进行备份时,被备份的文件可能同时间被其他的网络服务所修改喔!举例来说,当你备份 Mariadb 数据库时,刚好有人利用你的数据库发表文章,此时, 可能会发生一些错误的讯息。要避免这类的问题时,可以在备份前,将该服务先关掉, 备份完成后,再启动该服务即可!

远程备援的 script

要使用 rsync 你必须要在你的服务器上面取得某个账号使用权后, 并让该账号可以不用密码即可登入才行!

使用 rsync 上传备份数据
bash 复制代码
[root@study ~]# vi /backup/rsync.sh
#!/bin/bash
remotedir=/home/backup/
basedir=/backup/weekly
host=127.0.0.1
id=dmtsai
# 底下为程序阶段!不需要修改喔!
rsync -av -e ssh $basedir ${id}@${host}:${remotedir}

因为 rsync 搭配 sshd 真的很好用!加上它本身就有加密~近期以来大家对于数据在网络上面跑都非常的在乎安全性, 所以鸟哥就取消了 FTP 的传输方式啰~

37.9 灾难复原的考虑

之所以要备份当然就是预防系统挂点啦!如果系统真的挂点的话,那么你该如何还原系统呢?

硬件损毁,且具有完整备份的数据时

由于是硬件损毁,所以我们不需要考虑系统软件的不稳定问题,所以可以直接将完整的系统复原回去即可。 首先,你必须要先处理好你的硬件,举例来说,将你的硬盘作个适当的处理,譬如建置成为磁盘阵列之类的。 然后依据你的备份状态来复原。举例来说,如果是使用差异备份,那么将完整备份复原后, 将最后一次的差异备份复原回去,你的系统就恢复了!非常简单吧!

由于软件的问题产生的被攻破资安事件

由于系统的损毁是因为被攻击,此时即使你恢复到正常的系统,那么这个系统既然会被攻破, 没道理你还原成旧系统就不会被再次攻破!所以,此时完整备份的复原可能不是个好方式喔!最好是需要这样进行啦:

  1. 先拔除网络线,最好将系统进行完整备份到其他媒体上,以备未来查验
  2. 开始查阅登录档,尝试找出各种可能的问题
  3. 开始安装新系统 (最好找最新的 distribution)
  4. 进行系统的升级,与防火墙相关机制的制订
  5. 根据 2 的错误,在安装完成新系统后,将那些 bug 修复
  6. 进行各项服务与相关数据的恢复
  7. 正式上线提供服务,并且开始测试

软件资安事件造成的问题可大可小,一般来说,标准流程都是建议你将出问题的系统备份下来, 如果被追踪到你的主机曾经攻击过别人的话,那么你至少可以拿出备份数据来左证说,你是被攻击者,而不是主动攻击别人的坏人啊!然后,记得一定要找出问题点并予以克服,不然的话,你的系统将一再地被攻击啊! 那样可就伤脑筋啰~

该系列目录 --> 【BASH】回顾与知识点梳理(目录)

相关推荐
尘浮生5 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow19 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
网络安全-杰克27 分钟前
网络安全概论
网络·web安全·php
小牛itbull29 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
怀澈12231 分钟前
高性能服务器模型之Reactor(单线程版本)
linux·服务器·网络·c++
请叫我欧皇i37 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落40 分钟前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++
耗同学一米八1 小时前
2024 年河北省职业院校技能大赛网络建设与运维赛项样题二
运维·网络·mariadb