1. 程式人生 > >Linux學習筆記:存儲管理

Linux學習筆記:存儲管理

linux 磁盤管理


Linux系統中所有的硬件設備都是通過文件的方式來表現和使用的,我們將這些文件稱為設備文件,在Linux下的/dev目錄中有大量的設備文件,根據設備文件的不同,又分為字符設備文件和塊設備文件。
字符設備文件的存取是以字符流的方式來進行的,一次傳送一個字符。常見的有打印機,終端(TTY)、繪圖儀和磁帶設備等等,字符設備文件有時也被稱為“raw” 設備文件。
塊設備文件是以數據塊的方式來存取的,最常見的設備就是磁盤。系統通過塊設備文件存取數據的時候,先從內存中的buffer中讀或寫數據。而不是直接傳送數據到物理磁盤。這種方式有效的提高了磁盤的I/O性能。
下面既是我們此次所學到的在Linux下進行存儲管理的一些操作及命令:

RAID:
IDE
SCSI


RAID的功能:
提高IO能力:
使用多個磁盤實現並行讀寫;
磁盤條帶化,chunk
提高耐用性:
依靠磁盤冗余實現
即使磁盤發生故障或損壞,也不會影響數據;

RAID的實現方式:
硬件實現:
通過硬件RAID控制器或適配器,將所需的磁盤組織成RAID,而後安裝OS;
BIOS程序

軟件模擬實現
操作系統通過系統調用的方式模擬RAID實現;

RAID的操作級別:
RAID0:
提升IO性能,條帶卷,strip

至少兩塊磁盤,沒有冗余容錯能力,沒有存儲空間浪費,要求每個磁盤必須提供相同大小的存儲空間。
RAID1:鏡像卷,mirror
提供高可用性
需要兩塊磁盤
先將數據存入主盤,然後再將數據存入從盤;
寫入效率較低,略微提高讀效率,磁盤空間的整體利用率為50%,有冗余容錯能力
...
RAID4:
用多塊磁盤進行異或運算,得到校驗值,並且使用專門的一塊磁盤存放校驗值;即使一塊磁盤損壞,也不會丟失數據;檢驗盤IO壓力巨大,很容易形成性能瓶頸;
RAID5:
多塊磁盤進行循環冗余檢驗,將校驗值隨機分配到不同磁盤的條帶中;讀、寫IO性能均明顯提升,又不會出現性能瓶頸
磁盤利用率=(n-1)/n * 100%
冗余容錯,,
至少需要3塊磁盤
RAID6:
多塊磁盤進行兩輪循環冗余校驗,將校驗值隨機分配到兩個不同磁盤的條帶中;
讀寫IO性能均明顯提升,又不會出現性能瓶頸
最多運行兩塊磁盤出現故障或損壞依然不會數據流式
代價就是增加了計算校驗值的時間;
RAID7:

RAID混合級別:
RAID01:
先做RAID0,再做RAID1
RAID10:
先做RAID1,再做RAID0
RAID50:
RAID7:可以理解為一個存儲計算機,自帶操作系統已經相應的管理工具,可以獨立運行。

JBOD:僅僅就是一組磁盤;
將多塊磁盤的存儲空間連接到一起,順序存放數據;

在CentOS上實現軟RAID:
內核提供一個md的模塊(multi disks,multi devices)
用戶空間需要mdadm的工具,來設置和修改md內核模塊的參數;

mdadm:模式化工具
mdadm [mode] <raiddevice> [option...] <component device>
模式包括:
創建模式:-C
-n #:使用#塊磁盤創建RAID設備
-l #:指示RAID的級別
-a {yes|no}:允許系統或不允許系統自動創建md設備文件;
-c CHUNK_SIZE:指定CHUNK大小
-x #:指定在陣列中空閑磁盤的數量
裝配模式:-A
管理模式:-a, -r, -f
雜項:
-D --scan
顯示RAID設備的詳細信息
mdadm -D --scan > /etc/mdadm.conf
該配置文件用於RAID設備的再次裝配
-S:停止RAID的設備

LVM2
Logical Volume Manager,邏輯卷管理器,Version 2
IBM

使用純軟件的方式組織一個或多個底層的塊設備,將它們從新定義為一個邏輯快設備的解決方案;;

利用內核中的dm模塊實現:
dm:device mapper ,設備映射表
dm模塊可以將一個或多個底層塊設備組織成一個邏輯塊設備;
用戶空間中的相應命令來向dm模塊發出系統調用,就可以完成後邏輯快設備的管理;

邏輯塊設備統一存放在/dev/dn-#

使用DM機制實現LVM管理的步驟:
1.創建並表示物理卷,PV
2.基於PV創建卷組,邏輯塊設備,創建的卷組的同時指定PE的大小;
註意:一旦PE大小被指定,就不允許更改;
3.在已經創建的卷組中創建邏輯卷
4.在邏輯卷中創建文件系統(高級格式化)
5.掛載

物理卷的管理操作:
pvcreate:創建物理卷
pvdisplay:顯示物理卷的詳細信息
pvs:顯示物理卷的簡單信息
pvremove:刪除物理卷
pvmove:將某個物理卷中的所有的PE移動到其他物理卷中;

卷組的管理操作:
vgcreate:創建卷組
-s #{kKmMgG}:指定PE的大小,如果省略該選項,默認的PE為4M;
vgremove:刪除卷組
vgextend:擴展卷組容量,將新的pv添加到卷組中;
vgreduce:縮減卷組容量,將pv從卷組中移除;在做此操作之前,應該先使用pvmove,保證被移除的pv上沒有被占用的PE
vgdisplay:顯示卷組的詳細信息
vgs:顯示卷組的簡短信息


邏輯卷的管理操作:
lvcreate:創建邏輯卷
-L LV_SIZE

lvremove:移除邏輯卷
lvdisplay:顯示邏輯卷的詳細信息
lvs:顯示邏輯卷的簡短信息
lvchange:修改LV的狀態
-ay:激活邏輯卷
-an:停用邏輯卷
lvextend:擴展邏輯卷的空間,
註意:一定要先擴展邏輯卷的物理邊界,再擴展邏輯卷的邏輯邊界;
使用ext系列文件系統的時候,resize2fs命令擴展邏輯邊界;
lvreduce:縮減邏輯卷的空間
註意:先縮減邏輯卷的邏輯邊界,再縮減邏輯卷的物理邊界;
使用ext系列文件系統的時候,resize2fs命令縮減邏輯邊界;

為了更方便的使用邏輯卷,為/dev/dm-#設備創建了兩個符號鏈接文件;

/dev/mapper/VG_NAME-LV_NAME --> ../dm-#
/dev/VG_NAME/LV_NAME --> ../dm-#


邏輯卷的快照:
快照,本身也是一種邏輯卷;目標邏輯卷的另外一個訪問路徑。

快照是特殊的邏輯卷,它是在生成快照時存在的邏輯卷的準確拷貝
對於需要備份或者復制的現有數據集臨時拷貝以及其它操作來說,快照是最合適的選擇。
快照只有在它們和原來的邏輯卷不同時才會消耗空間。
在生成快照時會分配給它一定的空間,但只有在原來的邏輯卷或者快照有所改變才會使用這些空間
當原來的邏輯卷中有所改變時,會將舊的數據復制到快照中。
快照中只含有原來的邏輯卷中更改的數據或者自生成快照後的快照中更改的數據
也可以使用lvextend擴展快照卷。

快照就是將當時的系統信息記錄下來,就好像照相一般,若將來有任何數據改動了,則原始數據會被移動到快照區,沒有改動的區域則由快照區和文件系統共享。

由於快照區與原本的LV共用很多PE的區塊,因此快照去與被快照的LV必須要要在同一個VG上!系統恢復的時候的文件數量不能高於快照區的實際容量。

快照邏輯卷
lvcreate -L SNAPSHOT_SIZE -s -p r -n SNAPSHOT_NAME /PATH/TO/ORIGIN_LVM
-L SIZE:指定快照邏輯卷的大小
-s:創建一個快照邏輯卷
-p r:創建處理的邏輯卷是只讀權限
-n SNAPSHOT_NAME:指定快照邏輯卷的名稱

三個命令:
df命令:
df - report file system disk space usage
df [OPTION]... [FILE]...
-h, --human-readble:單位轉換
-l, --local:只顯示本地文件系統,不顯示網絡文件系統
-i, --inodes:顯示inode使用狀態
-T, --print-type:顯示文件系統類型
-P, --portability:使用POSIX輸出格式,更易於閱讀


du命令:
du - estimate file space usage
du [OPTION]... [FILE]...
-s, sumary,:顯示整個目錄匯總的文件大小
-h, human-readble:單位轉換

dd命令:convert and copy a file
dd [OPERAND]...
dd OPTION

常見的OPERAND:
dd if=/PATH/FROM/SRC of=/PATH/TO/DEST
bs=BYTES:block size, 復制單元大小
count=N:復制多少個bs
of=FILE:寫到所命名的文件而不是到標準輸出
if=FILE:從所命名文件讀取而不是從標準輸入
ibs=BYTES:一次讀size個byte
obs=BYTES:一次寫size個byte
skip=BLOCKS:從開頭忽略blocks個ibs大小的塊
seek=BLOCKS:從開頭忽略blocks個obs大小的塊
conv=conversion[,conversion...]:用指定的參數轉換文件。
轉換參數:
ascii:轉換EBCDIC為ASCII。
ebcdic:轉換ASCII為EBCDIC。
block:把每一行轉換為長度為cbs的記錄,不足部分用空格填充。
unblock:使每一行的長度都為cbs,不足部分用空格填充。
lcase:把大寫字符轉換為小寫字符。
ucase:把小寫字符轉換為大寫字符。
swab:交換輸入的每對字節。
noerror:讀取出錯時繼續讀取。
notrunc:不截短輸出文件。
sync:把每個輸入塊填充到ibs個字節,不足部分用空(NULL)字符補齊

磁盤拷貝:
~]# dd if=/dev/sda of=/dev/sdb
備份MBR:
~]# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
破壞MBR中的bootloader:
~]# dd if=/dev/zero of=/dev/sda bs=64 count=1 seek=446
有二進制文件fileA,size>2K。現在想從第64個字節位置開始讀取,需要讀取的大小是128Byts。又有fileB, 想把上面讀取到的128Bytes寫到第32個字節開始的位置,替換128Bytes,請問如何實現?
~]# dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc
備份:
將本地的/dev/sdx整盤備份到/dev/sdy
~]# dd if=/dev/sdx of=/dev/sdy將本地的/dev/sdx整盤備份到/dev/sdy
將/dev/sdx全盤數據備份到指定路徑的image文件
~]# dd if=/dev/sdx of=/path/to/image
備份/dev/sdx全盤數據,並利用gzip工具進行壓縮,保存到指定路徑
~]# dd if=/dev/sdx | gzip >/path/to/image.gz

恢復:
將備份文件恢復到指定盤
~]# dd if=/path/to/image of=/dev/sdx
將壓縮的備份文件恢復到指定盤
~]# gzip -dc /path/to/image.gz | dd of=/dev/sdx

拷貝內存資料到硬盤
將內存裏的數據拷貝到root目錄下的mem.bin文件
~]# dd if=/dev/mem of=/root/mem.bin bs=1024

從光盤拷貝iso鏡像
拷貝光盤數據到root文件夾下,並保存為cd.iso文件
~]# dd if=/dev/cdrom of=/root/cd.iso

銷毀磁盤數據
利用隨機的數據填充硬盤,在某些必要的場合可以用來銷毀數據。執行此操作以後,/dev/sda1將無法掛載,創建和拷貝操作無法執行。
~]# dd if=/dev/urandom of=/dev/sda1

得到最恰當的block size
通過比較dd指令輸出中所顯示的命令執行時間,即可確定系統最佳的block size大小
~]# dd if=/dev/zero bs=1024 count=1000000 of=/root/1Gb.file
~]# dd if=/dev/zero bs=2048 count=500000 of=/root/1Gb.file
~]# dd if=/dev/zero bs=4096 count=250000 of=/root/1Gb.file
~]# dd if=/dev/zero bs=8192 count=125000 of=/root/1Gb.file

測試硬盤讀寫速度
通過上兩個命令輸出的執行時間,可以計算出測試硬盤的讀/寫速度
~]# dd if=/root/1Gb.file bs=64k | dd of=/dev/null
~]# dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

修復硬盤
當硬盤較長時間(比如1,2年)放置不使用後,磁盤上會產生消磁點。當磁頭讀到這些區域時會遇到困難,並可能導致I/O錯誤。當這種情況影響到硬盤的第一個扇區時,可能導致硬盤報廢。上邊的命令有可能使這些數據起死回生。且這個過程是安全,高效的。
~]# dd if=/dev/sda of=/dev/sda

Linux學習筆記:存儲管理