1. 磁盘阵列
1.1
RAID,磁盘阵列磁盘通过硬件和软件的形式组合成一个容量巨大的磁盘组,提升整个磁盘的系统效能;RAID常见类型:
RAID类型 |
最低磁盘个数 |
空间利用率 |
各自的优缺点 |
|
级别 |
说明 |
|||
RAID0 |
条带卷 |
2+ |
100% |
读写速度快,不容错 |
RAID1 |
镜像卷 |
2 |
50% |
读写速度一般。容错 |
RAID5 |
带奇偶校验的条带卷 |
3+ |
(n-1/n) |
读写速度快,容错,允许坏一块盘 |
RAID10 |
RAID1的安全+RAID0的快速 |
4 |
50% |
读写速度快,容错 |
RAID基本思想:把好几块硬盘通过一定组合方式把它组合起来,成为一个新的硬盘阵列组,从而使它能够达到高性能硬盘的要求。
1.2 RAID的三个关键技术
镜像:提供了数据的安全性;
条带(块大小也可以说是条带的粒度):它的存在的就是提供了数据并发性;
数据的校验:提供了数据的安全。
1.3 RAID工作原理
1) RAID0:条带(strping),是最早出现的RAID模式,需磁盘数量:2块以上(大小最好相同),是组建磁盘阵列中最简单的一种形式,只需要2块以上的硬盘即可。
特点:本低,可以提高整个磁盘的性能。RAID 0没有提供冗余或错误修复能力,速度快,任何一个磁盘的损坏将损坏全部数据;磁盘利用率为100%。
2)RAID1:mirroring(镜像卷),磁盘两块以上;原理:是把一个磁盘的数据镜像到另一个磁盘上,即数据在写入一块磁盘的同时,会在另一块闲置的磁盘上生成镜像文件,(同步);至少需要两块硬盘;磁盘利用率为50%,即2块100G的磁盘构成RAID1只能提供100G的可用空间。如下图:
3)RAID5:需要三块或以上硬盘,可以提供热备盘实现故障的恢复;只损坏一块,没有问题。但如果同时损坏两块磁盘,则数据将都会损坏。 空间利用率: (n-1)/n ,2/3 如下图所示:
奇偶校验信息的作用:当RAID5的一个磁盘数据发生损坏后,利用剩下的数据和相应的奇偶校验信息去恢复被损坏的数据。
异或运算:所谓的“奇偶校验”可以简单理解为二进制运算中的“异或运算”,通常用 xor 标识。
最左边的是原始数据,右边分别是三块硬盘,假设第二块硬盘出了故障,通过第一块硬盘上的 1 和第三块硬盘上的 1 xor 2,就能够还原出 2。同理可以还原出 3 和 8。至于5 xor 6,直接5和6运算出来即可。
4)RAID10:嵌套RAID级别,镜像+条带; RAID 10是将镜像和条带进行两级组合的RAID级别,第一级是RAID1镜像对,第二级为RAID 0。比如我们有8块盘,它是先两两做镜像,形成了新的4块盘,然后对这4块盘做RAID0;当RAID10有一个硬盘受损其余硬盘会继续工作,这个时候受影响的硬盘只有2块
1.4 RAID 硬盘失效处理
热备和热插拔。
1)热备:HotSpare,当冗余的RAID组中某个硬盘失效时,在不干扰当前RAID系统的正常使用的情况下,用RAID系统中另外一个正常的备用硬盘自动顶替失效硬盘,及时保证RAID系统的冗余性。备用盘有全局式和专用式,全局式备用硬盘为系统中所有冗余的RAID组共享,专用式备用硬盘位系统中某一组冗余RAID组专用。下图所示位一个全局热备的示例,该热备盘由系统中两个RAID组共享,可自动顶替任何一个RAID中的一个失效硬盘。
2)热插拔:HotSwap,在不影响系统正常运转的情况下,用正常的物理硬盘替换RAID系统中失效硬盘。
1.5 RAID-0-1-5-10搭建及使用-删除RAID及注意事项
RAID的实现方式
面试题:我们做硬件RAID,是在装系统前还是之后?
答:先做阵列才装系统 ,一般服务器启动时,有显示进入配置RAID的提示。
硬RAID:需要RAID卡,我们的磁盘是接在RAID卡的,由它统一管理和控制。数据也由它来进行分配和维护;它有自己的cpu,处理速度快。
软RAID:通过操作系统实现。
2. 创建阵列方式
硬件:磁盘阵列盒
软件:mdadm
3. mdadm命令
linux内核中有一个md(multiple devices)模块在底层管理RAID设备,它会在应用层给我们提供一个应用程序的工具mdadm,mdadm是linux下用于创建和管理软件RAID的命令。
mdadm命令常见参数
-a |
检测设备名称;添加磁盘 |
-n |
指定设备数量 |
-l |
指定RAID级别 |
-C |
创建 |
-v |
显示创建过程 |
-f |
模拟设备损坏 |
-r |
移除设备 |
-Q |
查看摘要信息 |
-D |
查看详细信息 |
-S |
停止RAID磁盘阵列 |
-x |
备份盘 |
4. 实验
实验1:搭建RAID10阵列
新添加4块硬盘
查看磁盘
下载mdadm,创建raid10阵列。
格式:mdadm 选项 /dev/md0 -a yes -n 4 -l 10 /dev/sd{b,c,d,e}
其中,-a yes表示检查设备。
格式化(指定文件系统类型)磁盘阵列为ext4
挂载
查看/dev/md0的详细信息
[root@localhost zxj]# mdadm -D /dev/md0 /dev/md0: Version : 1.2 Creation Time : Thu apr 11 01:18:16 2019 Raid level : raid10 array Size : 41908224 (39.97 GiB 42.91 GB) Used Dev Size : 20954112 (19.98 GiB 21.46 GB) Raid Devices : 4 Total Devices : 4 Persistence : Superblock is persistent Update Time : Thu apr 11 03:09:55 2019 State : clean active Devices : 4 Working Devices : 4 Failed Devices : 0 Spare Devices : 0 layout : near=2 Chunk Size : 512K Consistency Policy : unknown Name : localhost.localdomain:0 (local to host localhost.localdomain) UUiD : 807aee75:479287b8:930103d6:cbf2a76a Events : 17 Number Major Minor RaidDevice State 0 8 16 0 active sync set-a /dev/sdb 1 8 32 1 active sync set-B /dev/sdc 2 8 48 2 active sync set-a /dev/sdd 3 8 64 3 active sync set-B /dev/sde
然后将其写入到配置文件中,实现开机自动挂载 。
实验2:破损磁盘阵列及修复
之所以在生产环境中部署RAID 10磁盘阵列,是为了提高硬盘存储设备的读写速度及数据的安全性,但由于我们的硬盘设备是在虚拟机中模拟出来的,因此对读写速度的改善可能并不直观。在确认有一块物理硬盘设备出现损坏而不能继续正常使用后,应该使用mdadm命令将其移除,然后查看RAID磁盘阵列的状态,可以发现状态已经改变。
模拟设备损坏:sdb不可用
添加新的磁盘:
在RAID 10级别的磁盘阵列中,当RAID 1磁盘阵列中存在一个故障盘时并不影响RAID 10磁盘阵列的使用。当购买了新的硬盘设备后再使用mdadm命令来予以替换即可,在此期间我们可以在/RAID目录中正常地创建或删除文件。由于我们是在虚拟机中模拟硬盘,所以先重启系统,然后再把新的硬盘添加到RAID磁盘阵列中。
实验3:搭建raid5阵列+备份盘
虚拟机恢复快照,RAID5最少需要3块硬盘,还要一块备份硬盘,所以新建四块硬盘:
查看磁盘:
创建RAID阵列:
-x 1:指定一块备份盘;
格式化为ext4文件系统:
[root@localhost zxj]# mkfs.ext4 /dev/md0 mke2fs 1.42.9 (28-Dec-2013) Filesystem label= OS type: linux Block size=4096 (log=2) Fragment size=4096 (log=2) Stride=128 blocks, Stripe width=256 blocks 2621440 inodes, 10477568 blocks 523878 blocks (5.00%) reserved for the super user First data block=0 Maximum filesystem blocks=2157969408 320 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 4096000, 7962624 allocating group tables: done Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done
挂载:
查看阵列信息:有一块备份盘
模拟/dev/sdb损坏,可以看到备份盘/dev/sdc立即开始构建:
4. CentOS7 系统启动过程及相关配置文件
总的来说,centos7启动分为5个步骤
-
uefi或BIOS初始化,开始post(power on self test)开机自检;
- 加载MBR到内存;
- GRUB阶段;
- 加载内核和initramfs模块;
- 内核开始初始化,centos7使用systemd来代替centos6及以前的init程序。
POST:加电自检
当开机按下电源按钮后,计算机开始加电,主板上的BIOS或UEFI基本输入输出程序开始对硬件进行检查,检查内存,CPU等等吧,当检测到错误的时候机器会中断或者启动不了,这个做过电脑维护的人都知道,内存氧化可导至开不了机,还有的机器如果没插鼠标键盘自检也不会通过卡在那里了,不会继续往下走。
Boot sequence:选择引导顺序
当自检通过后,接着就要选择引导介质或方式,是通过光盘启动,硬盘启动,网络启动,还是U盘启动,这些也是在BIOS中设定的,所以设定的第一启动项是哪个就从那个开始引导,这个装过WINDOWS的都很熟悉了。
Bootloader:引导加载器
确定引导介质后便开始从介质中装载引导程序如grub2,这个是一个微小程序,我们知道MBR引导记录大小为512字节,其中前446个字节就是Bootloader,主要用来引导用户选择要启动的系统或不同的内核版本,把用户选定的内核装载到RAM中的特定空间中,解压,展开,而后把系统控制权移交给内核。
grub2就是linux中Bootloader程序,由于MBR记录限制,所以grub2分为两个部分:
1.在MBR引导记录中,大小为446字节,主要功能是引导启动介质的grub主体文件
2.partition,/boot/grub[2],此为grub的主体。
KERNEl + INITRAMFS(INITRD)—>ROOTFS :加载内核
这时候kernel开始初始化,探测可识别的硬件设备,加载硬件启动程序。以只读方式加载根文件系统
kernel在内存中加载时,为了模拟系统环境,会生成一个ramdisk文件,来进行下一步操作,等到加载到真正的根文件系统时,就会退出ramdisk,切换到真正的根文件系统中去。
ramdisk:内存上临时虚拟的系统
amdisk(虚拟磁盘,双缓冲,双缓存)----> ramfs(虚拟文件系统)
centos5:initrd
工具程序:mkinitrd
centos6,7:initramfs
工具程序:dracut,mkinitrd
/sbin/init:运行用户空间的第一个应用程序
init:
Centos 5: SysV init 配置文件:/etc/inittab
Centos 6: Upstart 配置文件:/etc/inittab;/etc/init/*.conf(主要)
Centos 7: systemd 配置文件:/etc/systemd/system;/usr/lib/systemd/system
至此,内核空间就已经启动完毕,内核启动完成接着开始启动用户态启动过程。systemd是个守护进程,pid号为1,后面所有启动的服务或进程都是systemd的子进程及子进程的子进程。
那么用户态的启动顺序又是什么样的呢?
设置默认允许级别—>初始化脚本,完成系统初始化--->关闭及启动对应级别下的服务----->设置登录终端----->[启动图形终端]
Systemd新特性:
系统引导时实现服务并行启动,没有顺序之分
按需激活进程
支持系统状态快照
基于依赖关系定义服务控制逻辑
关键特性:
基于socket的激活机制:socket与服务程序分离;按需激活程序或服务,可并行启动
基于bus的激活机制:
基于device的激活机制:当某个硬件设备变得可用时就可激活某设备
基于path的激活机制
系统快照:保存各unit的当前状态信息于持久存储设备中
向后兼容sysv init脚本
不兼容:
systemctl命令固定不变,非由systemd启动的服务,systemctl无法与之通信
核心概念:unit
配置文件进行标识和配置,文件中主要包含了系统服务,监听socket,保存的系统快照以及其它与init相关的信息,保存至:
/usr/lib/systemd/system
/run/systemd/system
/etc/systemd/system
unit的类型
Service unit:文件扩展名为.service 无需执行权限,用于定义系统服务
Target unit:文件扩展名为.target,用于模拟实现“运行级别”
Device unit:文件扩展名为.device,用于定义内核识别的设备
Mount unit:文件扩展名为.mount,定义文件系统挂载点
Socket unit:文件扩展名为.socket,用于标识进程间通信用的socket文件
Snapshot unit:文件扩展名为.snapshot,管理系统快照
Swap unit:文件扩展名为.swap,用于标识swap设备
automount unit:文件扩展名为.automount,文件系统的自动挂载点
Path unit:文件扩展名为.path,用于定义文件系统中的一个文件或目录
管理系统服务
启动:systemctl start name.service
停止:systemctl stop name .service
重启:systemctl restart name.service
重载:systemctl reload name.service
条件式重启:systemctl try-restart name.service
查看某服务当前是否运行:systemctl is-active name.service
查看所有已经激活的服务:systemctl list-units –type service systemctl list-units –type service –-all
开机自启动:systemctl enable name.service
开机不启动:systemctl disable name.service
查看所有服务开机自启动状态:systemctl list-unit-files –-type service
查看服务是否开机自启:systemctl is-enabled name.service
查看服务的依赖关系:systemctl list-dependencies name.service
禁止设定为开机自启:systemctl mask name.service
取消禁止设定为开机自启:systemctl unmask name.service
Target units:(模拟运行级别)
unit配置文件,以.target后辍名结尾
关机:runlevel0.target,poweroff.target
救援:runlevel1.target,rescue.target
多用户:multi-user.target
图形:graphical.target
重启:reboot.target
级别切换:systemctl isolate name.target
查看级别:systemctl list-units –-type target systemctl get-default
设置级别:systemctl set-default name.target
切换至紧急救援模式:systemctl rescue
切换至emergency模式:systemctl emergency(服务不加载不启动,驱动不加载,更彻底)
其它常用命令
关机:systemctl halt,systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
快照:systemctl hibernate
快照并挂起:systemctl hybrid-sleep