Linux進階之RAID磁盤陣列、系統啟動及dd命令


本節內容

1.      磁盤陣列

              RAID0 條帶卷 2+ 100% 讀寫速度快,不容錯

              RAID1 鏡像卷 2   50% 讀寫速度慢,容錯

              RAID5: 奇偶校驗條帶卷 3 讀寫速度快,容錯,只允許錯一塊

              RAID10 RAID0+RAID1 4 50% 讀寫速度快,容錯

       2. 創建陣列方式

              硬件:磁盤陣列盒

              軟件: mdadm

       3.  mdadm命令

              -C: 創建

              -v: 顯示創建過程

              -a: 添加磁盤、自動檢測設備

              -l: 陣列級別

              -n: 磁盤數量

              -x: 備份盤數量

              -f: 模擬損壞

              -D:查看陣列詳細信息

              -S:停止陣列

              -r: 移除磁盤

       4. 創建RAID10

              mdadm -Cv /dev/md10 -n 4 -l 10 /dev/sd{b,c,d,e}          

       5. 模擬損壞

              mdadm /dev/md10 -f /dev/sdd

       6. 磁盤損壞后的操作

              poweroff

              移除壞磁盤

              新硬盤添加

          虛擬機操作: mdadm /dev/md10 -a /dev/sdd

       7. 搭建RAID5+熱備盤

              mdadm -Cv /dev/md5 -n 3 -l 5 -x 1 /dev/sd{b,c,d,e}

       8. 自動掛載

              echo "/dev/md5 /ken xfs defaults 0 0" >> /etc/fstab

       9. 系統啟動

              1. BISO初始化,post開機自檢

              2. 加載MBR到內存

              3. grub階段

              4. 加載內核和initramfs模塊

              5. 內核初始化,使用centos7系統使用的是systemd替換了centos6當中的init

       10. dd if=/dev/zero of=/dev/swap bs=XM count=2048




磁盤陣列

一、概念

1、什么是RAID

RAID全稱Redundant Array of Inexpensive Disks廉價冗余磁盤陣列,通過多塊磁盤組成一種模式,來提高吞吐量和可靠性。磁盤陣列是由很多價格較便宜的磁盤,以硬件(RAID卡)或軟件(MDADM)形式組合成一個容量巨大的磁盤組,利用多個磁盤組合在一起,提升整個磁盤系統效能。

RAID可以把硬盤整合成一個大磁盤,還可以在大磁盤上再分區,放數據;還有一個大功能,多塊盤放在一起可以有冗余(備份)。

RAID的創建有兩種方式:軟RAID(通過操作系統軟件來實現)和硬RAID(使用硬件陣列卡)

RAID基本思想:把好幾塊硬盤通過一定組合方式把它組合起來,成為一個新的硬盤陣列組,從而使它能夠達到高性能硬盤的要求。

2、磁盤陣列功能

A 整合閑置磁盤空間

B 提高磁盤讀取效率

C 提供容錯功能

3、磁盤陣列等級

  •        RAID-0:要求磁盤的容量相同,總容量為所有磁盤容量的和
  •        RAID-1:要求磁盤容量相同,總容量為一塊硬盤容量
  •        RAID-1+0:請參考RAID-0/1
  •        RAID-5:要求容量相同,總容量為磁盤容量減一
  •    備用磁盤:閑着沒用,用於頂替壞盤

RAID類型

最低磁盤個數

空間利用率

各自的優缺點

級別

說明

RAID0

條帶卷

2+

100%

讀寫速度快,不容錯

RAID1

鏡像卷

2

50%(1/n)

讀寫速度一般,容錯

RAID5

帶奇偶校驗的條帶卷

3+

n-1/n

讀寫速度快,容錯,允許壞一塊盤

RAID10

RAID1的安全+RAID0的高速

4

50%

讀寫速度快,容錯

4RAID三個關鍵技術

鏡像:提供了數據的安全性;

條帶(塊大小也可以說是條帶的粒度),它的存在就是提供了數據並發性

數據的校驗:提供了數據的安全

5RAID等級詳解

1RAID-0的工作原理

條帶(strping),也是我們最早出現的RAID模式,需磁盤數量2塊以上(大小最好相同),是組建磁盤陣列中最簡單的一種形式,只需要2塊以上的硬盤即可。

特點:成本低,可以提高整個磁盤的性能。RAID 0沒有提供冗余或錯誤修復能力,速度快。

任何一個磁盤的損壞將損壞全部數據;磁盤利用率為100%

2RAID-1的工作原理

RAID 1 mirroring(鏡像卷),至少需要兩塊硬盤。

原理:是把一個磁盤的數據鏡像到另一個磁盤上,也就是說數據在寫入一塊磁盤的同時,會在另一塊閑置的磁盤上生成鏡像文件,(同步)

磁盤利用率為50%,即2100G的磁盤構成RAID1只能提供100G的可用空間。

缺點:浪費資源,成本高

3RAID-5的工作原理

需要三塊或以上硬盤,可以提供熱備盤實現故障的恢復;只損壞一塊,沒有問題。但如果同時損壞兩塊磁盤,則數據將都會損壞。 空間利用率: (n-1)/n

特點:讀寫性能一般,讀還好一點,寫不好

奇偶檢驗:raid5的數據恢復原理就是用公式算出來的

最左邊的是原始數據,右邊分別是三塊硬盤,假設第二塊硬盤出了故障,通過第一塊硬盤上的 1 和第三塊硬盤上的 1 xor 2,就能夠還原出 2。同理可以還原出 3 8。至於 5 xor 6 則更簡單了,直接用 5 6 運算出來即可。

RAID硬盤失效處理:熱備和熱插拔

a、熱備:HotSpare

定義:當冗余的RAID組中某個硬盤失效時,在不干擾當前RAID系統的正常使用的情況下,用RAID系統中另外一個正常的備用硬盤自動頂替失效硬盤,及時保證RAID系統的冗余性

全局式:備用硬盤為系統中所有的冗余RAID組共享

專用式:備用硬盤為系統中某一組冗余RAID組專用

b、熱插拔:HotSwap

定義:在不影響系統正常運轉的情況下,用正常的物理硬盤替換RAID系統中失效硬盤。

4RAID-10鏡像+條帶(嵌套RAID級別)

RAID 10是將鏡像和條帶進行兩級組合的RAID級別,第一級是RAID1鏡像對,第二級為RAID 0。比如我們有8塊盤,它是先兩兩做鏡像,形成了新的4塊盤,然后對這4塊盤做RAID0;當RAID10有一個硬盤受損其余硬盤會繼續工作,這個時候受影響的硬盤只有2塊。

6、三種RAID的排序

冗余從好到壞:RAID1 RAID10 RAID5 RAID0

性能從好到壞:RAID0 RAID10 RAID5 RAID1

成本從低到高:RAID0 RAID5 RAID1 RAID10

二、硬件磁盤陣列介紹

不需要CPU處理的磁盤陣列就叫硬件磁盤陣列

面試題:我們做硬件RAID,是在裝系統前還是之后? 

答:先做陣列才裝系統 ,一般服務器啟動時,有顯示進入配置Riad的提示。

RAID:需要RAID卡,我們的磁盤是接在RAID卡的,由它統一管理和控制。數據也由它來進行分配和維護;它有自己的cpu,處理速度快

RAID:通過操作系統實現

三、軟件磁盤陣列

1mdadm命令詳解

Linux內核中有一個md(multiple devices)模塊在底層管理RAID設備,它會在應用層給我們提供一個應用程序的工具mdadm mdadmlinux下用於創建和管理軟件RAID的命令。

Mdadm命令常見參數:

參數

全寫

作用

-a

--add

--auto{=yesmdmdppartp}

添加磁盤

檢測設備名稱;

-n

--raid-devices=N

指定設備數量

-x

--spare-devices=N

指定冗余設備數量

-l

--level=[0 1 5]

指定RAID級別

-C

--create

創建

-v

--verbose

顯示過程

-f

--fail

模擬設備損壞

-r

--remove

移除設備

-Q

--query

查看摘要信息

-D

--detail

查看詳細信息

-S

--stop

停止RAID磁盤陣列

2、實戰搭建raid10陣列

第一步:新添加4塊硬盤,查看磁盤

[root@renyz08 ~]# ls /dev/sd*

/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdc /dev/sdd /dev/sde

第二步:下載mdadm

[root@renyz08 ~]# yum install mdadm -y

第三步:創建raid10陣列

[root@renyz08 ~]# mdadm --create --verbose /dev/md10 --auto=yes --raid-devices=4 --level=10 /dev/sd{b,c,d,e}

mdadm: layout defaults to n2

mdadm: layout defaults to n2

mdadm: chunk size defaults to 512K

mdadm: size set to 20954112K

mdadm: Defaulting to version 1.2 metadata

mdadm: array /dev/md10 started.

第四步:格式化磁盤陣列為ext4

[root@renyz08 ~]# mkfs.ext4 /dev/md10

mke2fs 1.42.9 (28-Dec-2013)

文件系統標簽=

OS type: Linux

塊大小=4096 (log=2)

分塊大小=4096 (log=2)

Stride=128 blocks, Stripe width=256 blocks

2621440 inodes, 10477056 blocks

523852 blocks (5.00%) reserved for the super user

第一個數據塊=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: 完成                           

正在寫入inode: 完成                            

Creating journal (32768 blocks): 完成

Writing superblocks and filesystem accounting information: 完成  

第五步:掛載

[root@renyz08 ~]# mkdir /raid10

[root@renyz08 ~]# mount /dev/md10 /raid10

[root@renyz08 ~]# df -h

文件系統                 容量 已用 可用 已用% 掛載點

/dev/mapper/centos-root   17G 1.2G   16G    7% /

devtmpfs                 475M     0 475M    0% /dev

tmpfs                    487M     0 487M    0% /dev/shm

tmpfs                    487M 7.6M 479M    2% /run

tmpfs                    487M     0 487M    0% /sys/fs/cgroup

/dev/sda1               1014M 133M 882M   14% /boot

tmpfs                     98M     0   98M    0% /run/user/0

/dev/md10                 40G   49M   38G    1% /raid10

第六步:查看/dev/md0的詳細信息

[root@renyz08 ~]# mdadm --detail /dev/md10

/dev/md10:

           Version : 1.2

     Creation Time : Thu Jul 18 10:44:59 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 Jul 18 10:49:20 2019

             State : clean

    Active Devices : 4

   Working Devices : 4

    Failed Devices : 0

     Spare Devices : 0

            Layout : near=2

        Chunk Size : 512K

Consistency Policy : resync

              Name : renyz08:10 (local to host renyz08)

              UUID : 8c2449e5:889b6950:3c8643c7:5a7cb07d

            Events : 19

    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

第七步:寫入配置文件

[root@renyz08 ~]# echo "/dev/md10 /raid10 ext4 defaults 0 0" >> /etc/fstab

3、損壞磁盤陣列及修復

之所以在生產環境中部署RAID 10磁盤陣列,是為了提高硬盤存儲設備的讀寫速度及數據的安全性,但由於我們的硬盤設備是在虛擬機中模擬出來的,因此對讀寫速度的改善可能並不直觀。

在確認有一塊物理硬盤設備出現損壞而不能繼續正常使用后,應該使用mdadm命令將其移除,然后查看RAID磁盤陣列的狀態,可以發現狀態已經改變。

第一步:模擬設備損壞

[root@renyz08 ~]# cat /proc/mdstat   #查看設備運行狀態

Personalities : [raid10]

md10 : active raid10 sde[3] sdd[2] sdc[1] sdb[0]

      41908224 blocks super 1.2 512K chunks 2 near-copies [4/4] [UUUU]

      unused devices: <none>

[root@renyz08 ~]# mdadm /dev/md10 --fail /dev/sdb     #損壞磁盤sdb

mdadm: set /dev/sdb faulty in /dev/md10

[root@renyz08 ~]# cat /proc/mdstat

Personalities : [raid10]

md10 : active raid10 sde[3] sdd[2] sdc[1] sdb[0](F)

      41908224 blocks super 1.2 512K chunks 2 near-copies [4/3] [_UUU]

      unused devices: <none>

第二步:添加新的磁盤

RAID 10級別的磁盤陣列中,當RAID 1磁盤陣列中存在一個故障盤時並不影響RAID 10磁盤陣列的使用。當購買了新的硬盤設備后再使用mdadm命令來予以替換即可,在此期間我們可以在/RAID目錄中正常地創建或刪除文件。由於我們是在虛擬機中模擬硬盤,所以先重啟系統,然后再把新的硬盤添加到RAID磁盤陣列中。

[root@renyz08 ~]# reboot

[root@renyz08 ~]# umount /raid10

[root@renyz08 ~]# mdadm /dev/md10 -a /dev/sdb

mdadm: added /dev/sdb

[root@renyz08 ~]# cat /proc/mdstat

Personalities : [raid10]

md10 : active raid10 sdb[4] sde[3] sdd[2] sdc[1]

      41908224 blocks super 1.2 512K chunks 2 near-copies [4/3] [_UUU]

      [==============>......] recovery = 71.4% (14966144/20954112) finish=0.1min speed=650701K/sec

     unused devices: <none>

第三步:再次查看,已經構建完成

[root@renyz08 ~]# mdadm -D /dev/md10

4、實戰搭建raid5陣列+備份盤

第一步:創建raid5磁盤陣列

[root@renyz08 ~]# ls /dev/sdb*

/dev/sdb /dev/sdb1 /dev/sdb2 /dev/sdb3 /dev/sdb4 /dev/sdb5

[root@renyz08 ~]# mdadm -C -a yes /dev/md5 -l 5 -n 3 -x 1 /dev/sdb{1,2,3,5}

mdadm: Defaulting to version 1.2 metadata

mdadm: array /dev/md5 started.

第二步:格式化

[root@renyz08 ~]# mkfs.xfs /dev/md5

第三步:掛載

[root@renyz08 ~]# mkdir /raid5

[root@renyz08 ~]# mount /dev/md5 /raid5

[root@renyz08 ~]# df -h

文件系統          容量 已用 可用 已用% 掛載點

/dev/md5           8.0G   33M 8.0G 1% /raid5

第四步:查看

[root@renyz08 ~]# cat /proc/mdstat     #查詢運行狀態

Personalities : [raid6] [raid5] [raid4]

md5 : active raid5 sdb3[4] sdb5[3](S) sdb2[1] sdb1[0]

      8376320 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/3] [UUU]

    unused devices: <none>

[root@renyz08 ~]# mdadm -D /dev/md5       #查詢磁盤陣列信息

第五步:模擬錯誤

[root@renyz08 ~]# cat /proc/mdstat

md5 : active raid5 sdb1[5](S) sdb5[3] sdb2[1] sdb3[4]

[root@renyz08 ~]# mdadm /dev/md5 -f /dev/sdb2

mdadm: set /dev/sdb2 faulty in /dev/md5

[root@renyz08 ~]# cat /proc/mdstat

Personalities : [raid6] [raid5] [raid4]

md5 : active raid5 sdb1[5] sdb5[3] sdb2[1](F) sdb3[4]

第六步:移除磁盤

[root@renyz08 ~]# mdadm --manage /dev/md5 -r /dev/sdb2

mdadm: hot removed /dev/sdb2 from /dev/md5

[root@renyz08 ~]# cat /proc/mdstat

Personalities : [raid6] [raid5] [raid4]

md5 : active raid5 sdb1[5] sdb5[3] sdb3[4]

第七步:增加磁盤

[root@renyz08 ~]# mdadm --manage /dev/md5 -a /dev/sdb2

mdadm: added /dev/sdb2

[root@renyz08 ~]# cat /proc/mdstat

Personalities : [raid6] [raid5] [raid4]

md5 : active raid5 sdb2[6](S) sdb1[5] sdb5[3] sdb3[4]

第八步:停用磁盤陣列

[root@renyz08 ~]# mdadm -S /dev/md5   #未取消掛載,停用操作無用

mdadm: Cannot get exclusive access to /dev/md5:Perhaps a running process, mounted filesystem or active volume group?

[root@renyz08 ~]# umount /dev/md5 /raid5 #先取消掛載

umount: /raid5:未掛載

[root@renyz08 ~]# mdadm -S /dev/md5   #停用磁盤陣列

mdadm: stopped /dev/md5



四、centos7系統啟動過程及相關配置文件

1. uefiBIOS初始化,開始post(power on self test)開機自檢;這個過程是開機后,BIOSUEFI進行硬件檢查的階段。

2. 加載MBR到內存

自檢硬件沒有問題時候,這里以BIOS為例,BIOS將會直接找硬盤的第一個扇區,找到前446字節,將MBR加載到內存中,MBR將告訴程序下一階段去哪里找系統的grub引導。此階段屬於grub第一階段。grub還有1.5階段和2階段。

3. GRUB階段

grub1.5和第2階段,信息默認存放在扇區中,如果使用grub-install生成的第2階段的文件是存放在/boot分區中的。

為了加載內核系統,不得不加載/boot分區,而加載/boot分區,要有/boot分區的驅動,/boot分區驅動是放在/boot分區中的啊,我們好像進入死循環了,Linux是怎么解決的呢?就是靠放在1.5階段中的數據,放在第一個扇區后的后續扇區中,第1.5階段和2階段總共27個扇區。

1.5階段:mbr之后的扇區,識別stage2所在的分區上的文件系統。

2階段:開機啟動的時候看到Grub選項、信息,還有修改GRUB背景等功能都是stage2提供的,stage2會去讀入/boot/grub/grub.conf或者menu.lst等配置文件。

 4. 加載內核和initramfs模塊

加載內核,核心開始解壓,啟動一些最核心的程序。

為了讓內核足夠的輕小,硬件驅動並沒放在內核文件里面。

5. 內核開始初始化,使用systemd來代替centos6以前的init程序

(1)執行initrd.target

包括掛載/etc/fstab文件中的系統,此時掛載后,就可以切換到根目錄了

(2)initramfs根文件系統切換到磁盤根目錄

(3)systemd執行默認target配置

centos7表面是有運行級別這個概念,實際上是為了兼容以前的系統,每個所謂的運行級別都有對應的軟連接指向,默認的啟動級別時/etc/systemd/system/default.target,根據它的指向可以找到系統要進入哪個模式 

模式:

0 ==> runlevel0.target, poweroff.target

1 ==> runlevel1.target, rescue.target

2 ==> runlevel2.target, multi-user.target

3 ==> runlevel3.target, multi-user.target

4 ==> runlevel4.target, multi-user.target

5 ==> runlevel5.target, graphical.target

6 ==> runlevel6.target, reboot.target

(4)systemd執行sysinit.target

有沒有很眼熟?是的,在CentOS6上是被叫做rc.sysint程序,初始化系統及basic.target准備操作系統

(5)systemd啟動multi-user.target下的本機與服務器服務

(6)systemd執行multi-user.target下的/etc/rc.d/rc.local

6. Systemd執行multi-user.target下的getty.target及登錄服務

getty.target我們也眼熟,它是啟動終端的systemd對象。如果到此步驟,系統沒有被指定啟動圖形桌面,到此就可以結束了,如果要啟動圖形界面,需要在此基礎上啟動桌面程序

7. systemd執行graphical需要的服務

CentOS67啟動區別

系統啟動和服務器守護進程管理器,它不同於centos5Sysv initcentos6UpstartUbuntu制作出來),systemd是由Redhat的一個員工首先提出來的,它在內核啟動后,服務什么的全都被systemd接管,kernel只是用來管理硬件資源,相當於內核被架空了,因此linus很不滿意Redhat這種做法。



五、如何不用新分區添加swapdd

在之前的教程中我們提到過如何去添加一個swap分區,以及如何給你的swap進行擴容。在教程中我們使用的是新分區的方式,也就是新添加一塊硬盤,或在原有硬盤空余空間的基礎上新建一個分區,然后將其格式化為交換分區,最后進行掛載。

現在很多朋友使用的都是雲主機,雲主機一般不會設置swap(如某里雲)購買之后一般使用的都是贈送的磁盤空間,且因為數據量小的原因並不會購買數據盤,導致沒有可用分區轉換為swap,有沒有什么辦法可以不用分區即可添加或擴容swap呢?今天就來教大家個方法!

首先使用dd命令生成一個固定大小的文件,文件的大小就是添加或擴容swap的大小:

  1.      dd if=/dev/zero of=/opt/swap bs=1M count=2048

然后使用mkswap命令將其格式化:

  1.      mkswap /opt/swap

使用swapon命令掛載:

  1.      swapon /opt/swap

看下一下,交換分區是不是變大了?

[root@renyz08 ~]# free -h

        total     used     free    shared buff/cache   available

Mem:   972M    85M    766M    7.6M    119M      741M

Swap:   2.0G     0B      2.0G

[root@renyz08 ~]# dd if=/dev/zero of=/opt/swap bs=1M count=2048

記錄了2048+0 的讀入

記錄了2048+0 的寫出

2147483648字節(2.1 GB)已復制,20.2102 秒,106 MB/

[root@renyz08 ~]# mkswap /opt/swap

正在設置交換空間版本 1,大小 = 2097148 KiB

無標簽,UUID=88cbe933-fdc6-495c-9155-deea9b0b8948

[root@renyz08 ~]# swapon /opt/swap

swapon: /opt/swap:不安全的權限 0644,建議使用 0600

[root@renyz08 ~]# chmod 600 /opt/swap

[root@renyz08 ~]# free -h

         total      used      free    shared buff/cache   available

Mem:    972M     84M     60M     7.6M     826M     712M

Swap:   4.0G      0B      4.0G

原理:Linux中皆是文件,swap對於linux系統來說也是一個文件,/opt/swap對於linux系統來說也是一個文件,這樣概念就對等了。實際上這些文件就像一個筆記本,它是一個實體也是一個載體,我們是可以在筆記本中記錄內容,如同可以在/opt/swap中寫入數據的。

/dev/null 黑洞文件(不保存)

/dev/zero 白洞文件源源不斷的向外輸出文件

轉換和拷貝文件

if=file

file 中讀而不是標准輸入。

of=file

寫到 file 里去而不是標准輸出

bs=bytes

一次讀和寫 bytes 字節

count=blocks

只拷貝輸入文件的前 blocks

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM