1. 程式人生 > >文件系統和本地存儲管理 2

文件系統和本地存儲管理 2

linux 文件系統和存儲管理

回顧:

壓縮、歸檔工具

gzip

bzip2

xz

zip/unzip


tar

cpio


機械式磁盤的工作原理,技術參數,常用術語

使用磁盤的步驟:

分區

fdisk gdisk

parted

高級格式化

ext

超級塊(備份),GDT,metadata,data

mkfs.ext2/3/4 mkfs.vfat

mke2fs

dumpe2fs

tune2fs

blkid

掛載

mount

-o

acl

umount


/etc/fstab

設備文件(設備名,卷標,UUID...) 掛載點 fs類型 選項 轉儲頻率 自檢次序


兩種特殊文件:

設備文件:

mknod


符號鏈接文件:


鏈接:就是訪問一個文件的不同的路徑;

硬鏈接

數據塊指針指向同一個數據塊的文件;

不能跨文件系統創建硬鏈接

目錄文件不能創建硬鏈接

每次創建硬連接都會增加inode的引用計數


符號鏈接(軟鏈接)

用於存儲被鏈接文件的路徑的文件

可以跨文件系統創建

也可以對目錄創建

每次都必須進行兩組路徑的查找



ln命令:

ln [option...] src_file link_file

-s, --symbolic:創建符號鏈接,省略該選項,即創建硬鏈接;

-v:顯示鏈接創建的過程;


註意:創建符號鏈接時,如果想要保證該鏈接文件被復制或移動到其他路徑中依然可以,最好鏈接至被鏈接文件的絕對路徑;


版本管理:

apache:

2.2 2.4


將不同的版本的軟件分別放置於不同的目錄中,使用符號鏈接,將軟件鏈接的一個統一的路徑:


/usr/local/apache --> /usr/local/apache-2.2


/usr/local/apache-2.2

/usr/local/apache-2.4


user.sh --> user1.sh

user1.sh user2.sh user3.sh


什麽是RAID

RAID:Redundant Arrays of Inexpensive Disks

即:廉價磁盤冗余陣列

Redundant Arrays of Independent Disks

獨立磁盤冗余陣列

1988年由加利福尼亞大學伯克利分校(University of California-Berkeley)提出的“A Case for Redundant Arrays of Inexpensive Disks”。

旨在將多個相對廉價的IDE接口的磁盤合成一個“陣列”來提供更好的IO性能、實現磁盤冗余,或者兩者都提供。


RAID

提高IO能力:

磁盤並行讀寫

提高耐用性;

磁盤冗余來實現

級別:多塊磁盤組織在一起的工作方式有所不同

RAID實現的方式:

外接式磁盤陣列:通過擴展卡提供適配能力

內接式RAID:主板集成RAID控制器

安裝OS前在BIOS裏配置

Software RAID:


RAID級別

RAID-0:條帶卷,strip

RAID-1: 鏡像卷,mirror

RAID-2

..

RAID-5

RAID-6

RAID-10

RAID-01


RAID-0:

讀、寫性能提升;

可用空間:N*min(S1,S2,...)

無容錯能力

最少磁盤數:2, 2

RAID-1:

讀性能提升、寫性能略有下降;

可用空間:1*min(S1,S2)

有冗余能力

最少磁盤數:2, 2+

RAID-4:

多塊數據盤異或運算值,存於專用校驗盤

壞了一塊硬盤仍然可以繼續工作的模式稱為降級模式

校驗盤壓力最大,很容易形成性能瓶頸;

RAID-5:

讀、寫性能提升

可用空間:(N-1)*min(S1,S2,...)

有容錯能力:允許最多1塊磁盤損壞

最少磁盤數:3, 3+

RAID-6:

讀、寫性能提升

可用空間:(N-2)*min(S1,S2,...)

有容錯能力:允許最多2塊磁盤損壞

最少磁盤數:4, 4+


RAID混合類型級別

RAID-10:

讀、寫性能提升

可用空間:N*min(S1,S2,...)/2

有容錯能力:每組鏡像最多只能壞一塊

最少磁盤數:4, 4+

RAID-01、RAID-50

RAID7:可以理解為一個獨立存儲計算機,自身帶有操作系統和管理工具,可以獨立運行,理論上性能最高的RAID模式

JBOD:Just a Bunch Of Disks

功能:將多塊磁盤的空間合並一個大的連續空間使用

可用空間:sum(S1,S2,...)

常用級別:RAID-0, RAID-1, RAID-5, RAID-10, RAID-50, JBOD


實現方式:

硬件實現方式

軟件實現方式


CentOS 6上的軟件RAID的實現:

結合內核中的md(multi devices)模塊實現;


mdadm:模式化工具

命令的語法格式:

mdadm [mode] <raiddevice> [options] <component-devices>

支持的RAID級別:LINEAR, RAID0, RAID1, RAID4, RAID5, RAID6, RAID10,...

模式:

創建模式:-C

裝配模式:-A

監控模式:-F

管理模式:-f, -r, -a


<raiddevice>:/dev/md#

<component-devices>:任意塊設備,註意如果是分區的話,其分區類型要改為fd


-C:創建模式

-n #:使用#個塊設備來創建此RAID

-l #:指明要創建的RAID的級別

-a {yes|no}:自動創建目標RAID設備的設備文件

-c CHUNK_SIZE:指明塊大小, 默認值為512K

-x #:指明空閑盤的個數


例如:創建一個10GB可用空間的RAID5


混雜模式

顯示RAID的詳細信息

-D

mdadm -D /dev/md#

停止md設備:

mdadm -S /dev/md0


管理模式:

-f:為指定的磁盤或分區添加損壞標記

-a:添加磁盤或分區到md設備中

-r:從md設備中移除磁盤或分區


裝配模式:Assemble

-A

用於將停止的RAID設備重新裝配使之能夠正常工作。

在裝配RAID設備的時候,需要依賴/etc/mdadm.conf文件進行


mdadm -D --scan >> /etc/mdadm.conf

mdadm -S /dev/md2

mdadm -S /dev/md0

mdadm -C -n 2 -l 0 /dev/sdc /dev/sdf

mdadm -A /dev/md2

mdadm /dev/md2 -a /dev/md0


觀察md的狀態:

cat /proc/mkstat


watch命令:

-n #:刷新時間間隔,單位為秒,默認為1秒;

watch -n # ‘COMMAND‘


寫一個腳本:模擬Linux登錄界面

1) 將用戶名和密碼(明文即可)存放於/tmp/userinfo文件中,格式為username:password

2) 運行腳本後提示用戶輸入用戶名和密碼

3) 用戶輸入完成後,判斷用戶輸入的是否正確

a) 如果輸入錯誤的用戶名,直接提示用戶重新輸入正確的用戶名;

b) 如果用戶名正確,密碼錯誤,提示用戶重新輸入密碼,三次連續輸錯,則讓用戶重新輸入用戶名

#!/bin/bash

#

while : ; do

read -p "login: " GET_USERNAME

if ! grep -q "^\<$GET_USERNAME\>" /tmp/userinfo ; then

continue

fi

COUNT=0

until false ; do

if [ $COUNT -eq 3 ] ; then

break

fi

read -p "password: " GET_PASSWORD

PASSWORD=$(grep "^\<$GET_USERNAME\>" /tmp/userinfo| cut -d: -f2)

if [ "$GET_PASSWORD" != "$PASSWORD" ] ; then

let COUNT++

continue

else

break 2

fi

done

done

echo "login successfully."


LVM2

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

IBM


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


利用內核中的dm模塊實現;

dm:device mapper,設備映射表

dm模塊可以將一個或多個底層塊設備組織成一個邏輯塊設備;

用戶空間中的相應命令來向dm模塊發出系統調用,就可以完成後邏輯塊設備的管理;


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


使用DM機制實現LVM管理的步驟:

1.創建並表示物理卷,PV

註意:如果用來創建物理卷的設備是普通分區,一定要將分區的ID修改為8e;

2.基於PV創建卷組,邏輯塊設備,創建的卷組的同時指定PE的大小;

註意:一旦PE大小被指定,就不允許更改;

3.在已經創建的卷組中創建邏輯卷

4.在邏輯卷中創建文件系統(高級格式化)

5.掛載


物理卷的管理操作:

pvcreate:創建物理卷

pvdisplay:顯示物理卷的詳細信息

pvs:顯示物理卷的簡單信息

pvremove:刪除物理卷

pvmove:將某個物理卷中的所有的PE移動到其他物理卷中;


卷組的管理操作:

vgcreate:創建卷組

-s #{kKmMgG}:指定PE的大小,如果省略該選項,默認的PE為4M;

vgremove:刪除卷組

vgextend:擴展卷組容量,將新的pv添加到卷組中

vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]

vgreduce:縮減卷組容量,將pv從卷組中移除;在做此操作之前,應該先使用pvmove,保證被移除的pv上沒有被占用的PE;

vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]

vgdisplay:顯示卷組的詳細信息

vgs:顯示卷組的簡短信息


邏輯卷的管理操作:

lvcreate:創建邏輯卷

-L LV_SIZE(#{kK|mM|gG}):指定邏輯卷的大小,不能超過卷組的容量;

-l #%{FREE|VG|ORIGIN|PVS}:指定邏輯卷占用對應存儲單元的百分比;

-n LV_NAME:指定邏輯卷的名稱

-i #:在創建邏輯卷的時候,以條帶的方式創建,並指明這個邏輯卷上有#個條帶

-I #:在創建邏輯卷的時候,以條帶的方式創建,並指明CHUNK的大小;

lvremove:移除邏輯卷

lvdisplay:顯示邏輯卷的詳細信息

lvs:顯示邏輯卷的簡短信息

lvchange:修改LV的狀態

-ay:激活邏輯卷

-an:停用邏輯卷

lvextend:擴展邏輯卷的空間,

註意:一定要先擴展邏輯卷的物理邊界,再擴展邏輯卷的邏輯邊界;

使用ext系列文件系統的時候,resize2fs命令擴展邏輯邊界;


擴大邏輯卷的物理邊界:

lvextend -L [+]SIZE /PATH/TO/LVM

如果SIZE有+:表示在原有邏輯卷容量的基礎上,增加SIZE空間

如果SIZE無+:表示將邏輯卷的容量擴大到SIZE空間

擴大邏輯卷的邏輯邊界:

e2fsck /PATH/TO/LVM

resize2fs [-f] /PATH/TO/LVM

lvreduce:縮減邏輯卷的空間

註意:先縮減邏輯卷的邏輯邊界,再縮減邏輯卷的物理邊界;

使用ext系列文件系統的時候,resize2fs命令縮減邏輯邊界

lvreduce -L [-]SIZE /PATH/TO/LVM

如果SIZE有-:表示在原有邏輯卷容量的基礎上,削減SIZE空間

如果SIZE無-:表示將邏輯卷的容量直接削減至SIZE空間

umount /PATH/TO/LVM

e2fsck /PATH/TO/LVM //強制校驗數據一致性

resize2fs -f /PATH/TO/LVM LV_SiZE //修改邏輯卷的邏輯邊界,LV_SIZE為調整後的邏輯卷大小

lvchange -an /PATH/TO/LVM //關閉邏輯卷

lvreduce -L [+]SIZE /PATH/TO/LVM //修改邏輯卷的物理邊界,大小要和邏輯邊界保持一致

lvchange -ay /PATH/TO/LVM //重新激活邏輯卷

mount /PATH/TO/LVM /PATH/TO/LVM_MOUNT_POINT


為了更方便的使用邏輯卷,為/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


寫一個腳本:

1) 顯示一個菜單給用戶:

d|D) show disk usages.

m|M) show memory usages.

s|S) show swap usages.

q|Q) quit.

2) 當用戶給定選項後顯示相應的內容;

3) 每次執行完成後不退出腳本,而是提示用戶可以繼續查看其它信息;直到用戶鍵入q、Q、quit或QUIT退出;

4) 如果用戶給出的不是菜單中可用的選項,則告訴用戶選項錯誤,需要重新選擇;

#!/bin/bash

#

menu(){

cat << EOF

d|D) show disk usages.

m|M) show memory usages.

s|S) show swap usages.

q|Q) quit.

EOF

}


while : ;do

menu

read -p "please give me choice:" NUM

case $NUM in

d|D)

df -hTP

continue

;;

m|M)

free -m | head -2

continue

;;

s|S)

free -m | head -1

free -m | tail -1

continue

;;

[Qq]|[Qq][Uu][Ii][Tt])

break

;;

*)

echo "Warning: please choose another option"

continue

;;

esac

done


btrfs

Balance-tree FS

Better FS

Butter FS


2007年有Oracle開源,到目前為止,仍然是技術預覽版(Technical Preview)。


btrfs開發目的就是取代ext系列文件系統,成為下一代Linux的標準文件系統。


在Linux上運行的btrfs,遵循GPL開源協定;2014年8月,穩定版推出。


btrfs的特性:

1.可擴展性

extent是最小管理邏輯單元,每個extent是由一組連續的block組成

ext文件系統inode數量是一定的,btrfs的inode數量是動態可調整的


2.多物理卷支持:

btrfs可以跨越多個物理設備,動態的增加或減少設備來達到擴容或縮容的目的;

而且,從技術角度來講,btrfs還支持RAID-0,RAID-1,RAID-5,RAID-10等

還支持在線添加,刪除,及修改設備;


3.寫時復制更新機制(CoW, Copy on Write)

所謂的CoW,就是每次寫磁盤數據的時候,先將當前塊的數據復制到一個新塊中,然後在新塊中進行數據更新寫入,當新塊寫入完成後,只需要將原來指向舊塊的指針指向新塊即可。


4.雙重校驗機制——數據及元數據都有校驗碼:checksum


5.支持子卷:


6.快照卷:

對父卷做快照

對子卷做快照

對快照卷做快照


7.透明壓縮,隱形壓縮:


mkfs.btrfs

選項:

-L|--label <name>:為即將創建的btrfs文件系統指定卷標

-d|--data <type>:為數據存儲指定類型;可以選擇的類型有:raid0, raid1, raid5, raid6, raid10 or single

-m|--metadata <profile>:指定元數據的存儲方式;可以選擇的類型有:raid0, raid1, raid5, raid6, raid10, single or dup

-O|--features <feature1>[,<feature2>...]:指定btrfs文件系統的特性,如果想要查看哪些特性,可以使用命令:mkfs.btrfs -O list-all


可以用支持btrfs文件系統的mount命令中使用下列方式開啟透明壓縮功能:

mount -o compress={lzo|zlib} DEVICE MOUNT_POINT


btrfs

btrfs - control a btrfs filesystem

btrfs <command> [<args>]


btrfs filesystem show

查看btrfs文件系統的詳細屬性;


btrfs filesystem df MOUNT_POINT

查看文件系統的掛載和使用情況

例:btrfs filesystem df /mnt/btrfs/


在線修改文件系統大小:

btrfs filesystem resize {+|-}SIZE[KkMmGgTtPpEe] MOUNT_POINT


例:btrfs filesystem resize -15G /mnt/btrfs/

btrfs filesystem resize +5G /mnt/btrfs/

btrfs filesystem resize max /mnt/btrfs/


向btrfs文件系統中添加或刪除設備

btrfs device

btrfs device add [options] <device> [<device>...] <path>

向文件系統中添加一個新設備

btrfs device delete <device> [<device>...] <path>

從文件系統中刪除一個設備



平衡數據:

btrfs balance start [options] <path>

開啟跨設備的chunk的數據平衡

-mconvert={radi0|raid1|raid5|radi10|raid6|single|dup}

改變元數據的數據平衡布局方式

例:btrfs balance start -mconvert=raid5 /mnt/btrfs/


-dconvert={radi0|raid1|raid5|radi10|raid6|single}

改變數據的數據平衡布局方式

例:btrfs balance start -dconvert=raid6 /mnt/btrfs/


btrfs balance pause <path>

暫停數據平衡

btrfs balance cancel <path>

取消正在進行的或已經暫停的數據平衡

btrfs balance resume <path>

恢復被打斷的數據平衡

btrfs balance status [-v] <path>

顯示正在進行的或已經暫停的數據平衡的狀態信息


子卷管理:

btrfs subvolume create [-i <qgroupid>] [<dest>/]<name>

創建子卷

例:btrfs subvolume create /mnt/btrfs/mysub1/


btrfs subvolume delete [options] <subvolume> [<subvolume>...]

刪除子卷

例:btrfs subvolume delete /mnt/btrfs/mysub1/


btrfs subvolume show <subvol-path>

顯示子卷的信息

例:btrfs subvolume show /mnt/btrfs/mysub1/



子卷類似於ext文件系統中的將其他分區掛載到根目錄下的某個空閑子目錄的操作;


快照:

btrfs subvolume snapshot [-r] [-i <qgroupid>] <source> <dest>|[<dest>/]<name>

創建指定子卷的快照卷


例:btrfs subvolume snapshot /mnt/btrfs/mysub1/ /mnt/btrfs/snap_mysub1


將btrfs和ext系列進行轉換:

btrfs-convert

btrfs-convert - convert from ext2/3/4 filesystem to btrfs or rollback

btrfs-convert [options] <device>


將文件系統從ext轉換為btrfs:

~]# btrfs-convert /dev/sdb1


註意:/dev/sdb1分區,應該事先格式化為ext系列文件系統;


將文件系統從btrfs回滾到ext

~]# btrfs-convert -r /dev/sdb1


文件系統和本地存儲管理 2