1. 程式人生 > >Linux篇 | 磁盤存儲和文件系統

Linux篇 | 磁盤存儲和文件系統

seek 情況 縮減邏輯卷 raid級別 bit id3 合並 中新 exfat

磁盤存儲和文件系統
  • 分區
  • 文件系統
  • 掛載設備
  • 管理虛擬內存
  • RAID管理
  • LVM管理

我們從一個新硬盤安裝到Linux系統,期間的配置,一直到正常使用的角度,來學習磁盤存儲和文件系統,過程如下:
選擇分區類型(MBR或GPT)-->創建分區-->同步分區-->創建文件系統-->文件系統檢測和修復-->掛載-->虛擬內存的使用-->RAID的使用-->LVM的管理

一。分區

1.為什麽分區

  • 優化I/O性能
  • 實現磁盤空間配額限制
  • 提高修復速度
  • 隔離系統和程序
  • 安裝多個OS
  • 采用不同文件系統

2.分區類型

分區的類型有兩種:MBR和GPT

(1)MBR分區

  • MBR: Master Boot Record,1982年,使用32位表示扇區數,分區不超過2T
  • 如何分區:按柱面
  • 0磁道0扇區:512bytes
    • 446bytes: boot loader
    • 64bytes:分區表,其中每16bytes標識一個分區
    • 2bytes: 55AA
  • MBR分區中一塊硬盤最多有4個主分區,也可以3主分區+1擴展(N個邏輯分區)

MBR分區結構

技術分享圖片

(2)GPT分區

  • GPT:GUID(Globals Unique Identifiers) partition table 支持128個分區,使用64位,支持8Z( 512Byte/block )64Z ( 4096Byte/block)
  • 使用128位UUID(Universally Unique Identifier) 表示磁盤和分區 GPT分區表自動備份在頭和尾兩份,並有CRC校驗位
  • UEFI (統一擴展固件接口)硬件支持GPT,使操作系統啟動

GPT分區結構

技術分享圖片

(3)MBR和GPT開機過程

技術分享圖片

3.新建分區

  1. 我們首先選擇分區的類型是MBR和GPT,根據命令fdisk(新建、管理MBR分區)、gdisk(新建、管理GPT分區)、parted(新建、管理MBR和GPT分區)創建分區。
  2. parted在硬盤上新建分區,實時(馬上)生效;fdisk和gdisk在內存中新建分區,不會實時生效,確定保存後才會生效,常用這兩個命令。

(1)fdisk和gdisk

兩個命令的選項參數一樣,就是命令的書寫不一樣

1)查看分區
  • fdisk -l 設備名<-->gdisk -l 設備名
2)管理分區(新建、刪除、修改)

fdisk 設備名<-->gdisk 設備名

3)分區子命令(使用fdisk進入管理界面的命令)
  • p 分區列表
  • t 更改分區類型
  • n 創建新分區
  • d 刪除分區
  • v 校驗分區
  • u 轉換單位
  • w 保存並退出
  • q 不保存並退出

(2)parted

parted的操作都是實時生效的,小心使用

用法:parted [選項]... [設備 [命令 [參數]...]...]

1)指定設備/dev/sdb分區類型是gpt或msdos(MBR)
parted /dev/sdb mklabel gpt|msdos-->"mklabel"
2)顯示分區表
parted /dev/sdb print-->"print"
3)新建(mkpart)主分區(primary),分區編號1,大小200M
parted /dev/sdb mkpart primary 1 200 (默認M)
4)刪除分區編號是1的分區
parted /dev/sdb rm 1
5)列出分區信息
parted –l

4.同步分區表

真正有效的分區在內存上,但是分區表存放在磁盤上,所以需要兩者同步一致

(1)查看分區表

查看內存中的分區表:

lsblk  
ll /dev/sd*  
cat /proc/partitions

(2)同步分區表

1)適用CentOS5,7
partprobe
2)適用CentOS6
創建分區後同步命令:partx -a 設備名  
刪除分區後同名命令:partx -d --nr N-M(刪除的分區編號) 設備名

二。創建文件系統

新建分區後我們需要格式化,就是創建文件系統。

  • 文件系統是操作系統用於明確存儲設備或分區上的文件的方法和數據結構;即在存儲設備上組織文件的方法。操作系統中負責管理和存儲文件信息的軟件結構稱為文件管理系統,簡稱文件系統
  • 從系統角度來看,文件系統是對文件存儲設備的空間進行組織和分配,負責文件存儲並對存入的文件進行保護和檢索的系統。具體地說,它負責為用戶建立文件,存入、讀出、修改、轉儲文件,控制文件的存取,安全控制,日誌,壓縮,加密等

1.文件系統的類型

  • Linux文件系統:
    • ext2(Extended file system) :適用於那些分區容量不是太大,更新也不頻繁的情況,例如 /boot 分區
    • ext3:是 ext2 的改進版本,其支持日誌功能,能夠幫助系統從非正常關機導致的異常中恢復。它通常被用作通用的文件系統
    • ext4:是 ext 文件系統的最新版。提供了很多新的特性,包括納秒級時間戳、創建和使用巨型文件(16TB)、最大1EB的文件系統,以及速度的提升
    • xfs:SGI,支持最大8EB的文件系統
    • btrfs(Oracle), reiserfs, jfs(AIX), swap
  • 光盤:iso9660
  • Windows:FAT32, exFAT,NTFS
  • Unix: FFS(fast), UFS(unix), JFS2
  • 網絡文件系統:NFS, CIFS
  • 集群文件系統:GFS2, OCFS2(oracle)
  • 分布式文件系統: fastdfs,ceph, moosefs, mogilefs, glusterfs,Lustre
  • RAW:未經處理或者未經格式化產生的文件系統

2.文件系統的分類

  • 根據其是否支持"journal"功能:
    • 日誌型文件系統: ext3, ext4, xfs, ...
    • 非日誌型文件系統: ext2, vfat
  • 文件系統的組成部分:
    • 內核中的模塊:ext4, xfs, vfat
    • 用戶空間的管理工具:mkfs.ext4, mkfs.xfs,mkfs.vfat
  • Linux的虛擬文件系統:VFS
  • 查前支持的文件系統:cat /proc/filesystems

3.查看內核支持的文件系統

ls /lib/modules/`uname –r`/kernel/fs

4.Linux虛擬文件系統:VFS

用戶輸入的命令,在文件系統上執行,並不是直接作用在文件系統,而是執行在Linux的虛擬文件系統VFS(圖中:Virutal file system),VFS通過真正的文件系統執行命令,這裏只是簡單介紹。

技術分享圖片

3.新建文件系統

CentOS6常用ext4文件系統;CentOS7常用xfs文件系統。

創建文件系統有兩種方法:

方法一(常用):
mkfs.文件系統類型 設備名

方法二(很少用):
mkfs -t 文件系統類型 設備名
mkfs -L 卷標名 設備名--&gt;卷標名最好和掛載點的名稱一樣

檢測文件系統是否創建成功
後面有命令會說到,但這裏記錄一個,使用二進制命令查看文件系統是否創建成功。
hexdump -C 設備名-->查看分區是否有數據(全是0表示沒數據,裏面都是二進制數。)

(1)ext文件系統

因為ext系列的文件系統是老牌的文件系統,所以它有很豐富的命令支持各種功能,所以它有自己的命令工具,就是mke2fs。

mke2fs:ext系列文件系統專用管理工具

  • -t {ext2|ext3|ext4} 指定文件系統類型
  • -b {1024|2048|4096} 指定塊大小
  • -L ‘LABEL’ 設置卷標
  • -j 相當於 -t ext3
    mkfs.ext3 = mkfs -t ext3 = mke2fs -j = mke2fs -t ext3
  • -i # 為數據空間中每多少個字節創建一個inode;不應該小於block大小(inode可以理解成文件節點編號,它不應該小於block塊設備的數量。因為節點編號如果大於文件存放量(塊設備數量),就算在創建文件,沒有地方存放,inode將變得毫無意義。)
  • -N # 指定分區中創建多少個inode
  • -I 一個inode記錄占用的磁盤空間大小,128---4096
  • -m # 默認5%,為管理人員預留空間占總空間的百分比(-m可以設置預留空間(其實是預留塊設備數量)的大小占磁盤總大小的百分比。需要註意的是,預留空間是預留給管理員使用的,普通用戶使用不了,如果百分比太大,占有磁盤太多空間,普通用戶又用不了,造成空間浪費的現象,所以有時候要修改百分比。(比如1T磁盤的5%就是50G,這麽多空間放著不是浪費嗎))
  • -O FEATURE[,...] 啟用指定特性
  • -O ^FEATURE 關閉指定特性(後面關於acl會說到這個命令)

(2)文件系統的ACL功能

我們新裝的系統,每個分區都能給文件或目錄設置ACL,但是在已有的系統中,CentOS6新建的分區默認沒有ACL功能,CentOS7默認有。那麽給CentOS6新建的分區添加ACL功能如下:

1.在CentOS6新建分區,創建文件系統後,查看文件系統的屬性:  
tune2fs -l 設備名  
會看到:“Default mount options: 為空”  
2.空表示該分區的文件系統沒有開啟acl功能,開啟命令如下:  
tune2fs -o acl 設備名    
3.接著卸載該分區掛載點,在重新掛載,然後使用查看命令查看,就會看到:“Default mount options:  acl”  
4.有時候會刪除一個分區的acl功能,刪除命令如下:  
tune2fs -o ^acl 設備名  

(3)ext4文件系統默認就存在的目錄

新建ext4文件系統後,把分區進行掛載,進入到掛載目錄會看到名為“lost+found”的文件夾,這個文件夾裏存放分區之前的文件,或是被覆蓋的文件。因為Centos7是xfs文件系統,所以沒有此文件夾。

(4)查看ext系列文件系統的狀態

tune2fs -l 設備名查看文件系統,其中“Filesystem state: clean”反應了分區是否幹凈,即文件系統是否有故障或錯誤。“clean”表示幹凈。

  1. 如果因為一些錯誤操作導致文件系統無法正常訪問,可以修復文件系統,但註意裏面的數據未必能恢復。因為修復的只是文件系統的源文件(超級塊、節點表等)
    2.首先卸載文件系統分區的掛載點,接著用命令“fsck -y 設備名”修復。然後查看文件系統就知道是否恢復成功。

4.文件系統檢測和修復

不能再掛載狀態下修復

(1).修復命令:
fsck -y 設備名
或fsck.補全 設備名
或fsck -t(文件系統) -p(自動修復) -r(交互修復) 設備名

(2).ext系列的文件系統有自己的修復工具:
ezfsck -y(自動回答yes) -f(強制修復)

練習題
查找設備列表/etc/fstab中分區名對應的設備名
思路:blkid -U "UUID"
命令:blkid -U sed -rn ‘/\/data/s#^.*=(.*) /data.*$#\/#p‘ /etc/fstab

三。掛載

  • 可遠程掛載,可本地掛載
  • 一個設備可以掛載多個目錄(掛載點)
  • 多個設備不能同時掛載一個目錄(掛載點)
  • 掛載點必須是空目錄

1.臨時掛載

(1)掛載:mount 設備名或UUID 掛載點

(2)取消掛載:umount 掛載點

(3)強制取消掛載:有時候我們要取消掛載,但因為用戶正在掛載目錄,所以要用到強制取消掛載。
方法一:殺進程。查看進程(lsof 掛載點),殺掉。
方法二:
查看掛載點:fuser -v 掛載點
強殺掛載點:fuser -km 掛載點

(4)掛載選項

  • defaults:相當於rw, suid, dev, exec, auto, nouser, async
  • -o options:(掛載文件系統的選項),多個選項使用逗號分隔
    • async 異步模式 sync 同步模式,內存更改時,同時寫磁盤
    • atime/noatime 包含目錄和文件
    • diratime/nodiratime 目錄的訪問時間戳
    • auto/noauto 是否支持自動掛載,是否支持-a選項
    • exec/noexec 是否支持將文件系統上運行應用程序
    • dev/nodev 是否支持在此文件系統上使用設備文件
    • suid/nosuid 是否支持suid和sgid權限
    • remount 重新掛載
    • ro 只讀
    • rw 讀寫
    • user/nouser 是否允許普通用戶掛載此設備,/etc/fstab使用
    • acl 啟用此文件系統上的acl功能
    • oop 使用loop設備

2.永久掛載

想要永久掛載,就要修改/etc/fstab文件。

(1)/etc/fstab文件格式

/etc/fstab每行定義一個要掛載的文件系統

技術分享圖片

1)要掛載的設備或偽文件系統

  • UUID:UUID=""(強烈建議使用UUID)
  • 設備文件
  • LABEL:LABEL=""
  • 偽文件系統名稱(卷標):proc, sysfs

2)掛載點
掛載點最好是空目錄

3)文件系統類型
ext4,xfs,iso9660,nfs,none

4)掛載選項
常用的掛載選項:
defaults , acl , bind

其它掛載選項:(這些選項也能用作臨時掛載,就是添加“-o 選項”)

  • defaults:相當於rw, suid, dev, exec, auto, nouser, async
  • -o options:(掛載文件系統的選項),多個選項使用逗號分隔
    • async 異步模式 sync 同步模式,內存更改時,同時寫磁盤
    • atime/noatime 包含目錄和文件
    • diratime/nodiratime 目錄的訪問時間戳
    • auto/noauto 是否支持自動掛載,是否支持-a選項
    • exec/noexec 是否支持將文件系統上運行應用程序
    • dev/nodev 是否支持在此文件系統上使用設備文件
    • suid/nosuid 是否支持suid和sgid權限
    • remount 重新掛載
    • ro 只讀
    • rw 讀寫
    • user/nouser 是否允許普通用戶掛載此設備,/etc/fstab使用
    • acl 啟用此文件系統上的acl功能
    • oop 使用loop設備

(5)轉儲頻率
0:不做備份 1:每天轉儲 2:每隔一天轉儲

(6)fsck檢查的文件系統的順序:允許的數字是0 1 2
0:不自檢
1:首先自檢;一般只有rootfs才用
2:非rootfs使用

3.針對不同的設備進行掛載

有時候掛載分區"mount -a(掛載新分區)"沒用,試試"mount -o remount 掛載點(從新掛載)"

示例1:掛載選項defaults的使用(適用特殊文件的掛載,設備的掛載)

創建好掛載點後,打開/etc/fstab文件進行掛載,格式如下:  
UUID   掛載點   文件系統類型   defaults 0 0  
之後退出文件,使用“mount -a”掛載,之後查看掛載(df)

示例2:掛載選項acl的使用

創建好掛載點後,打開/etc/fstab文件進行掛載,格式如下:  
UUID   掛載點   文件系統類型   acl 0 0  
之後退出文件,使用“mount -a”或“mount -o remount 掛載點”掛載,之後查看掛載(df)

示例3:掛載選項none的使用(適用目錄掛載目錄)

創建好掛載點後,打開/etc/fstab文件進行掛載,格式如下:  
目錄   掛載點   none(表示沒有文件系統類型)   bind 0 0  
(臨時掛載命令是:mount 目錄 掛載點 -B --bind)
之後退出文件,使用“mount -a”掛載,  
之後查看掛載(df或mount),註意顯示的是分區,但確實掛載成功,可以查看掛載點和目錄的內容,如果一致表示目錄掛載目錄成功。

示例4:文件掛載目錄

查看文件類型:file 文件絕對路徑
把光盤文件掛載到目錄,首先創建掛載點(即目錄),在/etc/fstab文件裏寫入一行:
文件絕對路徑 掛載點 iso9660 loop 0 0

(CentOS6臨時掛載:mount -o loop /data/centos6.iso 掛載點)
(CentOS7臨時掛載:mount /data/centos7.iso 掛載點)
查看:"losetup"和“df”

3.查看掛載

方法一:findmnt 掛載點(例如:findmnt /mnt/sda1)
有時候掛載設備太多不容易看到,可以用方法二。
方法二:
findmnt 掛載點的上一目錄(例如:findmnt /mnt)
echo $?
“0”表示成功,“非0”表示失敗

4.掛載選項

  • -t vsftype 指定要掛載的設備上的文件系統類型
  • -r readonly,只讀掛載
  • -w read and write, 讀寫掛載
  • -a 自動掛載所有支持自動掛載的設備(定義在了/etc/fstab文件中,且掛載選項中有auto功能)
  • -L ‘LABEL‘ 以卷標指定掛載設備
  • -U ‘UUID‘ 以UUID指定要掛載的設備
  • -B, --bind 綁定目錄到另一個目錄上
  • -n 不更新/etc/mtab,mount不可見--->適用於ext系列的文件系統(隱藏掛載信息。一般掛載其實是將掛載信息寫入到/etc/mtab文件裏,df等命令就可以看到掛載信息,加了“-n”,就不更新/etc/mtab文件,所以看不到掛載信息。如果加了“-n”後還像看掛載信息,就查看“/proc/mounts”文件,此文件記錄了所有的掛載信息。)

虛擬化技術基礎:loop設備文件和稀疏文件

5.文件和loop設備的關聯

示例:我們把CentOS7的一個文件當U盤用。首先在這個文件裏創建很多文件,然後把這個文件放到CentOS6系統裏,掛載這個文件,然後查看掛載目錄,是否有那些文件。
(1).創建文件data.img
dd if=/dev/zero of=/data/data.img bs=1M count=100
(2).給文件創建文件系統
mkfs.ext4 /data/data.img
(3).查看文件的文件系統
blkid /data/data.img
(4).創建掛載點
mkdir /mnt/disk
(5).掛載
1)CentOS7掛載:mount /data/data.img /mnt/disk
2)CentOS6掛載:mount -o loop /data/data.img /mnt/disk
註釋:當一個文件f1掛載到另一個文件f2,系統會分配一個loop設備名關聯此文件(f1),然後利用loop名進行掛載。
(6).復制文件data.img到CentOS6系統
(7).創建掛載點:mkdir /mnt/disk6
(8).在CentOS6掛載
掛載:mount -o loop /data/data.img /mnt/disk6
查看:ls /mnt/disk6
卸載掛載點:umount /mnt/disk6
(9)刪除設備關聯(CentOS6,7都刪):
losetup -d /dev/loopx(“loopx”中x是什麽需要查看命令"losetup -a"去獲取)

6.稀疏文件

稀疏文件的特點是,查看文件大小和查看文件占空間的大小不一樣,像VM虛擬機一樣,實際創建的系統大小是1G,但你可以當8G的用。稀疏文件用作虛擬化技術。

(1).查看稀疏文件

查看稀疏文件實際大小:ll -h 文件名
查看稀疏文件占空間的大小:df -sh 文件名或df 文件所在目錄

(2).創建稀疏文件

dd if=dev/zero of=bigfile bs=1M count=1024 seek=2048
註釋:創建稀疏文件bigfile,大小是3072M,其中2048M為空內容(可留在以後添加內容)

7掛載文件寫錯導致系統無法啟動的解決辦法

CentOS6:

第一步:模擬錯誤的掛載文件
UUID(故意寫錯一位) 掛載點 ext4 defaults 0 3
第二步:重啟系統會看到系統錯誤,進不了系統,讓輸入root用戶的密碼
第三步:輸入密碼後,查看/etc/fstab掛載文件發現UUID寫錯一位,這時修改發現無法保存,用“mount”查看分區有“rw”權限,但文件就是無法保存,其實當前是只讀模式
第四步:修改根目錄“/”只讀模式為讀寫模式"mount -o remount,rw /"
第五步:修改/etc/fstab掛載配置文件,保存成功(修改錯誤有兩種方式可以讓系統重新啟動,第一種就是把UUID寫對;第二種是把“3”改為“0”,這項是檢查系統錯誤的,如果改為“0”表示不檢查)
第六步:重啟,系統成功啟動(如果是改數字的方式,也會成功啟動,但在字符界面會看到紅色的錯誤,記得最後把UUID改回)

CentOS7:
第一步:模擬錯誤的掛載文件
UUID(故意寫錯一位) 掛載點 ext4 defaults 0 0
第二步:重啟系統會看到系統錯誤,進不了系統,讓你等1分鐘左右檢查錯誤
第三步:檢查完後讓輸入管理員密碼,就能進入字符系統,直接進入/etc/fstab文件修改錯誤,保存後重啟,會看到系統成功啟動。
第四步:註意這裏和Centos6有區別,Centos7直接就有修改文件的權限。

四。虛擬內存的使用(交換分區SWAP)

SWAP分區的作用:暫時緩解內存不夠用

1.概述

當我們執行程序時,如果內存資源耗盡,在執行程序時會提示內存不足,這時可以借助SWAP空間當做暫時的內存空間使用,所以:“系統內存最大容量=內存容量+SWAP容量”。其實SWAP容量是磁盤的容量,我們在裝系統,劃分分區時會創建SWAP分區,分區容量最好是當前內存(當前內存不超過4G)的1.5-2倍,最大(當前內存超過4G)不超過8G或16G,SWAP分區的讀寫速度並沒有內存那麽快,查看SWAP分區和內存的容量使用“free -h”命令。

2.優化SWAP分區的讀寫速度:

(1)把SWAP分區放到高速硬盤上,例如固態硬盤(強烈推薦)
(2)因為機械硬盤同一時間指針的角速度不變,而機械硬盤同一磁道外側扇區比內側扇區存放數據多,劃分分區是從外側開始劃分,所以把SWAP分區在新硬盤上劃分為第一個分區,讀寫性能在這個硬盤上是最快的。附兩張機械硬盤圖,如下:

技術分享圖片

技術分享圖片

3.在Linux系統中新建SWAP分區

SWAP分區可以有多個,創建SWAP分區如下:分兩種格式

(1)GPT分區

(2)MBR分區

4.修改其他分區為SWAP分區

分區之間的修改其實是ID的修改,ID在fdisk(或gdisk)--->m--->t-->L 可看到

示例1:把GPT分區的sdc1分區修改為SWAP分區

1)卸載掛載點:  umount 掛載點  
2)使用GPT分區工具:  gdisk /dev/sdc  
3)查看分區:  p
4)查看指定ID的子命令:  m  
5)指定分區的ID:  t  
6)選擇分區編號:  1  
7)顯示ID類型:   L  
8)輸入ID:       8200  
9)查看分區:      p  
10)保存退出:    w  
11)創建SWAP分區的文件系統: mkswap /dev/sdc1   
12)查看:       blkid  
13)在/etc/fstab掛載:  
UUID swap swap  defaults 0 0  
14)使掛載生效:   swapon -a  
15)查看swap容量: free -h  
16)詳細查看swap分區: cat /proc/swaps或者swapon -s  
註意,Prionity是優先級的意思,數字越大,優先級越高。從性能的角度,應該先使用讀寫速度快的swap分區,所以要把那個分區的優先級調高。  
17)調整swap分區的優先級:修改/etc/fstab  
UUID swap swap pri=6(範圍是0-32767,數越大優先級越高) 0 0  
18)禁用修改的swap分區:swapoff /dev/sdc1  
19)查看是否禁用swap分區:cat /proc/swaps或者swapon -s  
20)啟用修改的swap分區:swapon -a  
21)查看swap分區優先級是否生效:cat /proc/swaps或者swapon -s  
22)刪除swap分區:  先禁用swapoff /dev/sdc1然後把/etc/fstab文件裏/dev/sdc1對應的那行刪掉,最後刪除分區。

示例2:把MBR分區的sdd1分區修改為SWAP分區

1)卸載掛載點:  umount 掛載點  
2)使用GPT分區工具:  fdisk /dev/sdd  
3)查看分區:  p
4)查看指定ID的子命令:  m  
5)指定分區的ID:  t  
6)選擇分區編號:  1  
7)顯示ID類型:   L  
8)輸入ID:       82  
9)查看分區:      p  
10)保存退出:    w  
11)創建SWAP分區的文件系統:   mkswap /dev/sdd1  
12)查看:       blkid  
13)在/etc/fstab掛載:  
UUID swap swap  defaults 0 0
14)使掛載生效:   swapon -a  
15)查看swap容量: free -h  
16)詳細查看swap分區: cat /proc/swaps  
註意,Prionity是優先級的意思,數字越大,優先級越高。從性能的角度,應該先使用讀寫速度快的swap分區,所以要把那個分區的優先級調高。  
17)調整swap分區的優先級:修改/etc/fstab  
UUID swap swap pri=6(範圍是0-32767,數越大優先級越高) 0 0  
18)禁用修改的swap分區:swapoff /dev/sdd1  
19)查看是否禁用swap分區:cat /proc/swaps  
20)啟用修改的swap分區:swapon -a  
21)查看swap分區優先級是否生效:cat /proc/swaps  
22)刪除swap分區:  先禁用swapoff /dev/sdd1然後把/etc/fstab文件裏/dev/sdd1對應的那行刪掉,最後刪除分區。

示例3:使用文件當做SWAP分區

有時候電腦不能創建新分區,並且現有的分區不能更改為swap分區,但我們又需要swap為內存做緩存,這時可以用一個文件當做swap分區,Windows系統類似swap功能的就是一個文件。步驟如下:

1)創建fileswap文件大小2G
dd if=/dev/zero of=/fileswap(文件名) bs=1M count=2048  
2)格式化為swap文件系統  
mkswap /fileswap  
3)掛載  
UUID swap swap defaults 0 0  
4)使掛載生效  
swapon -a  
生效的同時會提醒權限警告,如果都有看的權限,普通用戶通過二進制查看方式(hexdump -C /fileswap)可以看到文件裏的內容,所以下一步要修改文件的權限  
5)修改文件權限  
chmod 600 /fileswap  
6)查看swap: cat /proc/swaps或者swapon -s

5.調整使用swap分區的優先級(看上面的示例1,2的“17-22”)

  • 可以指定swap分區0到32767的優先級,值越大優先級越高
  • 如果用戶沒有指定,那麽核心會自動給swap指定一個優先級,這個優先級從-1開始,每加入一個新的沒有用戶指定優先級的swap,會給這個優先級減一
  • 先添加的swap的缺省優先級比較高,除非用戶自己指定一個優先級,而用戶指定的優先級(是正數)永遠高於核心缺省指定的優先級(是負數)
  • 優化性能:分布存放,高性能磁盤存放

    6.掛載USB介質

註意:U盤格式必須是NTFS32文件系統格式。如果是NTFS文件系統,Linux不支持。

  • (1)查看USB設備是否識別
    • lsusb
  • (2)被內核探測為SCSI設備
    • /dev/sdaX、/dev/sdbX或類似的設備文件
  • (3)在圖形環境中自動掛載
    • 圖標在[計算機]窗口中創建
    • 掛載在/run/media/&lt;user&gt;/&lt;label&gt;
  • (4)手動掛載
    mount /dev/sdb1 /mnt

7.總結

  • swap交換分區是系統RAM的補充,Swap 分區支持虛擬內存。當沒有足夠的RAM 保存系統處理的數據時會將數據寫入 swap 分區
  • 當系統缺乏 swap 空間時,內核會因 RAM 內存耗盡而終止進程。配置過多swap 空間會造成存儲設備處於分配狀態但閑置,造成浪費,過多 swap 空間還會掩蓋內存泄露
  • 推薦系統 swap 空間

    技術分享圖片

  • 基本設置包括:
    • 創建交換分區或者文件
    • 使用mkswap寫入特殊簽名
    • 在/etc/fstab文件中添加適當的條目
    • 使用swapon -a 激活交換空間
  • 啟用:swapon
    swapon [OPTION]... [DEVICE]
    • -a:激活所有的交換分區
    • -p PRIORITY:指定優先級
    • /etc/fstab 在第4列中:pri=value
  • 禁用:swapoff [OPTION]... [DEVICE]

五。文件系統工具

1.文件系統空間占用等信息的查看工具

df [OPTION]... [FILE]...

  • -H 以10為單位
  • -T 文件系統類型
  • -h human-readable
  • -i inodes instead of blocks
  • -P 以Posix兼容的格式輸出(如果設備名太長,如光盤,df查看會不清楚,加“-P”會整理格式)

2.查看某目錄總體空間占用狀態

du [OPTION]... DIR

  • -h human-readable
  • -s summary
  • --max-depth=# 指定最大目錄層級

3.dd工具

dd作用:轉換和復制文件

(1)用法

dd if=/PATH/FROM/SRC of=/PATH/TO/DEST bs=# count=#

  • if=file 從所命名文件讀取而不是從標準輸入
  • of=file 寫到所命名的文件而不是到標準輸出
  • ibs=size 一次讀size個byte
  • obs=size 一次寫size個byte
  • bs=size block size, 指定塊大小(既是是ibs也是obs)
  • cbs=size 一次轉化size個byte
  • skip=blocks 從開頭忽略blocks個ibs大小的塊
  • seek=blocks 從開頭忽略blocks個obs大小的塊
  • count=n 復制n個bs

    (2)轉換參數

conv=conversion[,conversion...] 用指定的參數轉換文件

  • ascii 轉換 EBCDIC 為 ASCII
  • ebcdic 轉換 ASCII 為 EBCDIC
  • lcase 把大寫字符轉換為小寫字符
  • ucase 把小寫字符轉換為大寫字符
  • nocreat 不創建輸出文件
  • noerror 出錯時不停止
  • notrunc 不截短輸出文件
  • sync 把每個輸入塊填充到ibs個字節,不足部分用空(NUL)字符補齊
  • fdatasync 寫完成前,物理寫入輸出文件

示例1:把/etc/fstab文件裏的小寫字母轉換為大寫,生成為文件/data/daxie
dd if=/etc/fstab of=/data/daxie conv=ucase

示例2:用dd創建的的文件寫到磁盤上,而不是內存裏

dd創建一個很大的文件一下就創建完了,其實她在創建在內存裏,而不是磁盤上,所以斷電後這個文件如果後臺沒有真正創建完,就會損壞。那麽如何讓dd命令創建的文件直接保存在磁盤上呢,而不是默認的內存裏呢?其實加“fdatasync”就行。如下:
dd if=/dev/zero of=/data/f1 bs=1M count=100 conv=fdatasync

(3)備份MBR

dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1

(4)讀取、替換二進制文件

有一個大與2K的二進制文件fileA。現在想從第64個字節位置開始讀取,需要讀取的大小是128Byts。又有fileB, 想把上面讀取到的128Bytes寫到第32個字節開始的位置,替換128Bytes,實現如下:
dd if=fileA of=fileB bs=1 count=128 skip=63 seek=31 conv=notrunc

(5)備份

將本地的/dev/sdx整盤備份到/dev/sdy
dd if=/dev/sdx of=/dev/sdy
將/dev/sdx全盤數據備份到指定路徑的image文件
dd if=/dev/sdx of=/path/to/image
備份/dev/sdx全盤數據,並利用gzip壓縮,保存到指定路徑
dd if=/dev/sdx | gzip &gt;/path/to/image.gz

(6)恢復

將備份文件恢復到指定盤
dd if=/path/to/image of=/dev/sdx

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

(7)示例

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

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

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

4)得到最恰當的block size(塊設備大小)
通過比較dd指令輸出中命令的執行時間,即可確定系統最佳的block size(塊設備)大小
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000
dd if=/dev/zero of=/root/1Gb.file bs=2048 count=500000
dd if=/dev/zero of=/root/1Gb.file bs=4096 count=250000

(8)測試硬盤讀、寫速度

測試硬盤寫速度:
dd if=/dev/zero of=/root/1Gb.file bs=1024 count=1000000

測試硬盤讀速度:
dd if=/root/1Gb.file bs=64k | dd of=/dev/null

說明:用dd創建的的文件寫到磁盤上,而不是內存裏  

dd創建一個很大的文件一下就創建完了,其實她在創建在內存裏,而不是磁盤上,所以斷電後這個文件如果後臺沒有真正創建完,就會損壞。那麽如何讓dd命令創建的文件直接保存在磁盤上呢,而不是默認的內存裏呢?其實加“fdatasync”就行。如下:  
dd if=/dev/zero of=/data/f1 bs=1M count=100 conv=fdatasync

六。RAID的使用

  • RAID:Redundant Arrays of Inexpensive(Independent) Disks
  • 1988年由加利福尼亞大學伯克利分校(University of California-Berkeley) “A Case for Redundant Arrays of Inexpensive Disks”
  • 多個磁盤合成一個“陣列”來提供更好的性能、冗余,或者兩者都提供
  • 提高IO能力: 磁盤並行讀寫
  • 提高耐用性:磁盤冗余來實現
  • 級別:多塊磁盤組織在一起的工作方式有所不同
  • RAID實現的方式:
    • 外接式磁盤陣列:通過擴展卡提供適配能力
    • 內接式RAID:主板集成RAID控制器,安裝OS前在BIOS裏配置
    • 軟件RAID:通過OS實現

1.RAID級別

RAID-0:條帶卷,strip
RAID-1:鏡像卷,mirror
RAID-2
省略
RAID-5
RAID-6
RAID-10
RAID-01

常用的RAID有RAID-1、RAID-5、RAID-10
企業常用硬件RAID,軟RAID用於測試環境

2.RAID-1

  • 讀性能提升、寫性能略有下降
  • 可用空間:1*min(S1,S2,...)
  • 有冗余能力
  • 最少磁盤數:2, 2N

3.RAID-5

  • 讀、寫性能提升
  • 可用空間:(N-1)*min(S1,S2,...)
  • 有容錯能力:允許最多1塊磁盤損壞
  • 最少磁盤數:3, 3+

4.RAID-10

  • 讀、寫性能提升
  • 可用空間:N*min(S1,S2,...)/2
  • 有容錯能力:每組鏡像最多只能壞一塊
  • 最少磁盤數:4, 4+

七。LVM的管理

1.概述

  • 允許對卷進行方便操作的抽象層,包括重新設定文件系統的大小
  • 允許在多個物理設備間重新組織文件系統:
    • 將設備指定為物理卷
    • 用一個或者多個物理卷來創建一個卷組
    • 物理卷是用固定大小的物理區域(Physical Extent,PE)來定義的
    • 在物理卷上創建的邏輯卷
      物理卷是由物理區域(PE)組成
    • 可以在邏輯卷上創建文件系統
  • LVM可以彈性的更改LVM的容量:
    通過交換PE來進行資料的轉換,將原來LV內的PE轉移到其他的設備中以降低LV的容量,或將其他設備中的PE加到LV中以加大容量
    技術分享圖片
  • LVM: Logical Volume Manager, Version 2
  • dm: device mapper(設備映射器),將一個或多個底層塊設備組織成一個邏輯設備的模塊
  • 設備名:/dev/dm-#
  • 軟鏈接

2.管理工具

將一個分區或硬盤變成邏輯卷,過程是:
第一步:將分區和硬盤變成物理卷
第二步:將物理卷變成卷組
第三步:卷組從卷組劃分出若幹邏輯卷
第四步:將邏輯卷創建文件系統(格式化)
第五步:創建掛載點,掛載(即修改/etc/fstab文件)

(1)pv(物理卷)

  • 顯示pv信息:
    • pvs:簡要pv信息顯示
    • pvdisplay
  • 創建pv:
    • pvcreate /dev/DEVICE
  • 刪除pv:
    • pvremove /dev/DEVICE

使用幫助:pvcreate --help

(2)vg(卷組)

  • 顯示卷組
    • vgs
    • vgdisplay
  • 創建卷組
    • vgcreate [-s #[kKmMgGtTpPeE]] VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
  • 管理卷組
    • 給已有卷組添加物理卷:vgextend VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
    • vgreduce VolumeGroupName PhysicalDevicePath [PhysicalDevicePath...]
  • 刪除卷組
    • 先做pvmove,再做vgremove(即先刪除邏輯卷,在刪除卷組)

使用幫助:vgcreate --help

(3)lv(邏輯卷)

  • 顯示邏輯卷
    • lvs
    • lvdisplay
  • 創建邏輯卷
    • lvcreate -L #[mMgGtT] -n NAME VolumeGroup
    • lvcreate -l 60%VG -n mylv testvg
    • lvcreate -l +100%FREE -n yourlv testvg
      (“-l +100%free”表示:在分區現在容量的基礎上,把卷組的所有空間都用上)
  • 刪除邏輯卷
    • lvremove /dev/VG_NAME/LV_NAME
  • 重設文件系統大小
    • fsadm [options] resize device [new_size[BKMGTEP]]
    • resize2fs [-f] [-F] [-M] [-P] [-p] device [new_size]
    • xfs_growfs /mountpoint

使用幫助:lvcreate --help

示例:使用分區/dev/sdc1和硬盤/dev/sdd創建一個邏輯卷,名為mysql

1)分區要變成邏輯卷,首先卸載掛載,其次把分區ID變為邏輯卷的ID;硬盤不用。  
2)把分區和硬盤加入物理卷,可一次指定多個分區加入物理卷  
  pvcreate 設備名(分區名)  
  pvcreate /dev/sdc1 /dev/sdd  
  pvs(查看物理卷)  
3)創建卷組  
  vgcrte 卷組名 要加入的物理卷 
  vgcreate vg0 /dev/sdc1 /dev/sdd  
  vgs(查看卷組)  
4)創建邏輯卷  
  lvcreate -n 邏輯卷名 -L 邏輯卷大小 卷組  
  lvcreate -n mysql -L 4G vg0  
  lvs(查看邏輯卷)  
  註意你看到的邏輯卷名/dev/vg0/mysql其實是一個軟連接,可通過“ll /dev/vg0/mysql”查看到真名是“dm-數字”,但其實這個真名還有一個軟連接“/dev/mapper/vg0-mysql”。所以當你格式化分區後在"/etc/fstab"查看設備會有兩種情況,要不邏輯卷叫“/dev/vg0/mysql”,或者叫“/dev/mapper/vg0-mysql”。  
5)給邏輯卷創建文件系統  
  mkfs.xfs /dev/vg0/mysql  
6) 創建掛載點,在/etc/fstab文件裏進行掛載  
  UUID 掛載點 xfs defaults 0 0  
  (分享一個復制UUID的辦法,在"vim /etc/fstab"後,輸入“:r!blkid空格/dev/vg0/mysql(邏輯卷的絕對路徑)”後回車就看到UUID出現在此文件裏了)  
7) 重新加載分區:mount -a  
8) 查看邏輯卷是否掛載成功:df  

3.擴展(lvextend)和縮減邏輯卷

擴展:先擴展,在格式化(創建文件系統)邏輯卷
縮減:先格式化,在縮減邏輯卷

(1)擴展邏輯卷

先擴展邏輯卷,在格式化(創建文件系統)邏輯卷

在線擴展:用戶在使用該邏輯卷的時候,可以擴展邏輯卷,不用卸載掛載在擴展,擴展的過程對用戶使用沒有影響,也不會損壞文件

示例:在線擴展邏輯卷mysql,增加3個G

1)擴展:lvextend -L +3G /dev/vg0/mysql
2)查看:df -hT
這時你會看到邏輯卷mysql並沒有擴大,是因為df命令查看的是"分區的文件系統"的大小,想看擴展後邏輯卷的大小需要在重新格式化邏輯卷
3)格式化邏輯卷:(註意不同的文件系統格式化所用的命令不一樣)

  • xfs文件系統的格式化:xfs_growfs 掛載點
  • ext系列文件系統的格式化:resize2fs 邏輯卷名(本例是:/dev/vg0/mysql)

4)查看邏輯卷是否擴展成功
df -hT

5)一條命令實現擴展邏輯卷並格式化文件系統(-r表示格式化,支持各種文件系統)
lvextend -r -L +100M /dev/vg0/mysql

(2)縮減邏輯卷

先格式化,在縮減邏輯卷(前提:邏輯卷處於離線狀態,即卸載掛載點)

縮減前一定要備份
縮減會導致空間變小,所以會丟失數據

xfs文件系統支持擴展,不支持縮減;
ext系列文件系統支持擴展和縮減文件系統,但只能離線縮減,不支持在線縮減。

示例:卸載邏輯卷/dev/vg0/binlog(文件系統是ext4)
1)查看:df -hT
2)卸載掛載點:umount /mnt/binlog
3)檢查文件系統錯誤
e2fsck -f /dev/vg0/binlog
註釋:如果你不執行檢查文件系統錯誤的命令,直接格式化邏輯卷,會提示你先檢查錯誤,並標明命令。
4)格式化邏輯卷
resize2fs /dev/vg0/binlog 1G
註釋:resize2fs默認是擴展的意思,加了大小就是縮減的意思了。
5)縮減邏輯卷為1G大小
lvreduce -L 1G /dev/vg0/binlog
6)重新掛載
mount -a
7)查看:df -hT

4.跨主機遷移卷組(不常用 )

因為邏輯卷是由卷組分配出來的邏輯空間,而卷組的空間是無數個PE組成的(查看PE的大小及數量用“vgdisplay”或“pvdisplay”)。PE的空間又是普通的分區或硬盤給予的,所以在移動(遷移)邏輯卷的時候,把邏輯卷占用的所有的PE遷移到新電腦上就成功遷移了。

(1)源計算機

  • 1.在舊系統中,umount所有卷組上的邏輯卷
  • 2.禁用卷組
    • vgchange –a n vg0(-a n 是禁用的意思)
    • lvdisplay(查看邏輯卷)
  • 3.導出卷組
    • vgexport vg0(導出)
    • pvscan
    • vgdisplay(查看卷組)
  • 4.找到邏輯卷對應的分區或硬盤,插下

(2)目標計算機

  • 在新系統中安裝舊硬盤,並導入卷組:vgimport vg0
  • 啟用:vgchange –ay vg0
  • mount所有卷組上的邏輯卷

5.遷移一個目錄到一個邏輯卷

相當於對之前的命令做一個總結

示例:把家目錄/home遷移到邏輯卷  

1.查看分區,找出能創建邏輯卷的空間
[root@centos7 ~]#  lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0  200G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
├─sda2           8:2    0  100G  0 part /
├─sda3           8:3    0   50G  0 part /data
├─sda4           8:4    0    1K  0 part 
└─sda5           8:5    0    3G  0 part [SWAP]
sdb              8:16   0   20G  0 disk 
├─sdb1           8:17   0    1G  0 part /mnt/sdb1
└─sdb2           8:18   0    2G  0 part 
  └─vg0-binlog 253:1    0    1G  0 lvm  /mnt/binlog
sdc              8:32   0   10G  0 disk 
└─sdc1           8:33   0    3G  0 part 
  └─vg0-mysql  253:0    0   23G  0 lvm  /mnt/mysql
sdd              8:48   0   20G  0 disk 
└─vg0-mysql    253:0    0   23G  0 lvm  /mnt/mysql
sr0             11:0    1   10G  0 rom  
[root@centos7 ~]#
從上面看到sdb和sdc還有空間,所以決定創建sdb3和sdc2,供邏輯卷使用 
2.fdisk -l
查看sdb和sdc的分區類型,使用對應的分區工具劃分sdb3和sdc2
3.同步分區,查看是否創建出新分區
CentOS7上同步:partprobe
查看:lsblk
[root@centos7 ~]# lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda              8:0    0  200G  0 disk 
├─sda1           8:1    0    1G  0 part /boot
├─sda2           8:2    0  100G  0 part /
├─sda3           8:3    0   50G  0 part /data
├─sda4           8:4    0    1K  0 part 
└─sda5           8:5    0    3G  0 part [SWAP]
sdb              8:16   0   20G  0 disk 
├─sdb1           8:17   0    1G  0 part /mnt/sdb1
├─sdb2           8:18   0    2G  0 part 
│ └─vg0-binlog 253:1    0    1G  0 lvm  /mnt/binlog
└─sdb3           8:19   0   17G  0 part 
sdc              8:32   0   10G  0 disk 
├─sdc1           8:33   0    3G  0 part 
│ └─vg0-mysql  253:0    0   23G  0 lvm  /mnt/mysql
└─sdc2           8:34   0    7G  0 part 
sdd              8:48   0   20G  0 disk 
└─vg0-mysql    253:0    0   23G  0 lvm  /mnt/mysql
sr0             11:0    1   10G  0 rom
4.把/dev/sdb3和/dev/sdc2加入物理卷  
[root@centos7 ~]# pvcreate /dev/sdb3 /dev/sdc2
  Physical volume "/dev/sdb3" successfully created.
  Physical volume "/dev/sdc2" successfully created.
5.查看物理卷
[root@centos7 ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree   
  /dev/sdb2  vg0 lvm2 a--   <2.00g 1020.00m
  /dev/sdb3      lvm2 ---  <17.00g  <17.00g
  /dev/sdc1  vg0 lvm2 a--   <3.00g       0 
  /dev/sdc2      lvm2 ---   <7.00g   <7.00g
  /dev/sdd   vg0 lvm2 a--  <20.00g       0 
6.創建卷組vg1,並指定每個PE大小是16M,把sdb3加入卷組
[root@centos7 ~]# vgcreate -s 16M vg1 /dev/sdb3
  Volume group "vg1" successfully created
7.把sdc2加入卷組vg1
[root@centos7 ~]# vgextend vg1 /dev/sdc2
  Volume group "vg1" successfully extended
8.查看物理卷(vgs或者pvdisplay)
[root@centos7 ~]# pvs
  PV         VG  Fmt  Attr PSize   PFree   
  /dev/sdb2  vg0 lvm2 a--   <2.00g 1020.00m
  /dev/sdb3  vg1 lvm2 a--   16.98g   16.98g
  /dev/sdc1  vg0 lvm2 a--   <3.00g       0 
  /dev/sdc2  vg1 lvm2 a--    6.98g    6.98g
  /dev/sdd   vg0 lvm2 a--  <20.00g       0 
[root@centos7 ~]# 
9.查看卷組(vgs或者vgdisplay)
[root@centos7 ~]# vgs
  VG  #PV #LV #SN Attr   VSize   VFree   
  vg0   3   2   0 wz--n- <24.99g 1020.00m
  vg1   2   0   0 wz--n- <23.97g  <23.97g
[root@centos7 ~]#
[root@centos7 ~]# vgdisplay 

    --- Volume group ---
  VG Name               vg1
  System ID             
  Format                lvm2
  Metadata Areas        2
  Metadata Sequence No  2
  VG Access             read/write
  VG Status             resizable
  MAX LV                0
  Cur LV                0
  Open LV               0
  Max PV                0
  Cur PV                2
  Act PV                2
  VG Size               <23.97 GiB
  PE Size               16.00 MiB
  Total PE              1534
  Alloc PE / Size       0 / 0   
  Free  PE / Size       1534 / <23.97 GiB
  VG UUID               rQ4H68-jtLb-1WPf-GhOU-xdax-TO7p-eiF6AZ

[root@centos7 ~]#
10.創建邏輯卷home,分配卷組vg1的所有空間給邏輯卷home
[root@centos7 ~]# lvcreate -n home -l 100%free vg1
  Logical volume "home" created.
11.查看邏輯卷(註意查看邏輯卷的空間單位不再是PE,而是LE)
[root@centos7 ~]# lvdisplay /dev/vg1/home 
  --- Logical volume ---
  LV Path                /dev/vg1/home
  LV Name                home
  VG Name                vg1
  LV UUID                ufnLxD-1UqE-j0Uy-1QVH-pyAh-ZJt8-qvdRdi
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-30 17:17:03 +0800
  LV Status              available
  # open                 0
  LV Size                <23.97 GiB
  Current LE             1534
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:2

[root@centos7 ~]#
12.給邏輯卷/dev/vg1/home創建文件系統
[root@centos7 ~]# mkfs.xfs /dev/vg1/home 
meta-data=/dev/vg1/home          isize=512    agcount=4, agsize=1570816 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=1        finobt=0, sparse=0
data     =                       bsize=4096   blocks=6283264, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=1
log      =internal log           bsize=4096   blocks=3068, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
13.查看邏輯卷/dev/vg1/home設備名和UUID 
[root@centos7 ~]# blkid /dev/vg1/home
/dev/vg1/home: UUID="7bfd7b30-f670-4b04-9f0e-6df3cb364f3b" TYPE="xfs" 
14.因為掛載需要空目錄去掛載,如果目錄裏有文件,掛載就會看不到原有的文件。想要把家目錄遷移到邏輯卷,就是把邏輯卷的掛載點設置為家目錄,可家目錄裏有很多文件該怎麽辦呢?需要把邏輯卷臨時掛載,然後把家目錄的文件復制過去,註意保留屬性。之後清空家目錄,在永久掛載邏輯卷,即編輯/etc/fstab。註意的是,因為一個設備(這裏是邏輯卷)可以掛載多個目錄,所以不用把臨時掛載的掛載點卸載。掛載成功後使用普通用戶登錄,看是不是自己的家目錄,如果是就表示成功遷移。
[root@centos7 ~]#mkdir /mnt/home
15.臨時掛載
[root@centos7 ~]# mount /dev/vg1/home /mnt/home
16.查看家目錄
[root@centos7 ~]# ls /home
niu  niubin
[root@centos7 ~]# ls /mnt/home
17.復制家目錄內容並保留文件原來的屬性和設置
[root@centos7 ~]# cp -a /home/. /mnt/home
18.查看復制到掛載點的文件的屬性是否一致,還有家目錄和掛載點的大小是否一致
[root@centos7 ~]# ls /mnt/home/
niu  niubin
[root@centos7 ~]# ll -a /home
total 0
drwxr-xr-x.  4 root root  31 Mar 17 03:45 .
dr-xr-xr-x. 19 root root 251 Mar 12 11:49 ..
drwx------.  5 niu  niu  159 Mar 17 03:47 niu
drwxr-xr-x.  2 root root  39 Mar 12 15:21 niubin
[root@centos7 ~]# ll -a /mnt/home/
total 0
drwxr-xr-x.  4 root root  31 Mar 17 03:45 .
drwxr-xr-x. 10 root root 102 Mar 30 17:27 ..
drwx------.  5 niu  niu  159 Mar 17 03:47 niu
drwxr-xr-x.  2 root root  39 Mar 12 15:21 niubin
[root@centos7 ~]# du -sh /home
36K /home
[root@centos7 ~]# du -sh /mnt/home
36K /mnt/home
[root@centos7 ~]#
19.刪除家目錄內的文件
[root@centos7 ~]# rm -rf /home/*
20.永久掛載,修改配置文件/etc/fstab
[root@centos7 ~]# blkid /dev/vg1/home
/dev/vg1/home: UUID="7bfd7b30-f670-4b04-9f0e-6df3cb364f3b" TYPE="xfs" 
[root@centos7 ~]# echo "UUID=7bfd7b30-f670-4b04-9f0e-6df3cb364f3b /mnt/home xfs defaults 0 0" >> /etc/fstab 
[root@centos7 ~]# mount -a
21.查看掛載
[root@centos7 ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/sda2               100G  3.6G   97G   4% /
devtmpfs                705M     0  705M   0% /dev
tmpfs                   721M     0  721M   0% /dev/shm
tmpfs                   721M   11M  711M   2% /run
tmpfs                   721M     0  721M   0% /sys/fs/cgroup
/dev/sdb1              1014M   33M  982M   4% /mnt/sdb1
/dev/sda3                50G   33M   50G   1% /data
/dev/sda1              1014M  164M  851M  17% /boot
/dev/mapper/vg0-mysql    23G   33M   23G   1% /mnt/mysql
/dev/mapper/vg0-binlog  976M  2.6M  911M   1% /mnt/binlog
tmpfs                   145M   12K  145M   1% /run/user/42
tmpfs                   145M     0  145M   0% /run/user/0
/dev/mapper/vg1-home     24G   33M   24G   1% /home
22.使用普通用戶登錄,查看剛進系統是不是自己的家目錄  
[root@centos7 ~]# su - niu
Last login: Sun Mar 17 03:48:13 CST 2019 on pts/2
[niu@centos7 ~]$ pwd
/home/niu
[niu@centos7 ~]$
23.遷移成功

6.刪除邏輯卷

  • 刪除前一定要卸載掛載點
  • 如果該邏輯卷有快照,要先刪除快照在刪除邏輯卷
    1)卸載掛載點
    umount 掛載點
    2)刪除邏輯卷
    lvremove 邏輯卷名

7.邏輯卷管理器快照

  • 快照是特殊的邏輯卷,它是在生成快照時存在的邏輯卷的準確拷貝
  • 對於需要備份或者復制的現有數據臨時拷貝以及其它操作來說,快照是最合適的選擇
  • 快照只有在它們和原來的邏輯卷不同時才會消耗空間
    • 在生成快照時會分配給它一定的空間,但只有在原來的邏輯卷或者快照有所改變才會使用這些空間
    • 當原來的邏輯卷中有所改變時,會將舊的數據復制到快照中
    • 快照中只含有原來的邏輯卷中更改的數據或者自生成快照後的快照中更改的數據
    • 建立快照的卷大小小於等於原始邏輯卷,也可以使用lvextend擴展快照
  • 快照就是將當時的系統信息記錄下來,就好像照相一般,若將來有任何數據改動了,則原始數據會被移動到快照區,沒有改動的區域則由快照區和文件系統共享
  • 由於快照區與原本的LV(邏輯卷)共用很多PE的區塊,因此快照與被快照的LV(邏輯卷)必須在同一個VG(卷組)中.系統恢復的時候的文件數量不能高於快照區的實際容量

(1)命令

1)為現有邏輯卷創建快照
lvcreate -l 64 -s -n data-snapshot -p r /dev/vg0/data

2)掛載快照
mkdir -p /mnt/snap
mount -o ro /dev/vg0/data-snapshot /mnt/snap

3)恢復快照
umount /dev/vg0/data-snapshot
umount /dev/vg0/data
lvconvert --merge /dev/vg0/data-snapshot

4)刪除快照
umount /mnt/databackup
lvremove /dev/vg0/databackup

(2)示例

創建快照

1.查看邏輯卷/dev/vg0/mysql
[root@centos7 ~]# lvdisplay /dev/vg0/mysql 
  --- Logical volume ---
  LV Path                /dev/vg0/mysql
  LV Name                mysql
  VG Name                vg0
  LV UUID                IGpiUg-OgXh-QFXA-ZwsV-WkvC-7ehq-nUNEVC
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-29 05:12:23 +0800
  LV Status              available
  # open                 1
  LV Size                22.99 GiB
  Current LE             5886
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

[root@centos7 ~]#
2.給邏輯卷/dev/vg0/mysql創建快照,前提邏輯卷的卷組要有足夠的空間,快照名為“mysql_kuaizhao”,並指定大小100M。(“-s”表示創建快照;還可以加“-p r”,表示創建只讀的快照,這樣快照被掛載後,訪問掛載點,裏面的內容就不怕被改。)
[root@centos7 ~]# lvcreate -n mysql_kuaizhao -s -L 100M /dev/vg0/mysql
  Logical volume "mysql_kuaizhao" created.
3.使用lvdisplay查看/dev/vg0/mysql會看到,該邏輯卷有一個快照
[root@centos7 ~]# lvdisplay /dev/vg0/mysql
  --- Logical volume ---
  LV Path                /dev/vg0/mysql
  LV Name                mysql
  VG Name                vg0
  LV UUID                IGpiUg-OgXh-QFXA-ZwsV-WkvC-7ehq-nUNEVC
  LV Write Access        read/write
  LV Creation host, time centos7.localdomain, 2019-03-29 05:12:23 +0800
  ---------------------------------------------------------
  - LV snapshot status     source of                      -
  -                       mysql_kuaizhao [active]         -
  ---------------------------------------------------------
  LV Status              available
  # open                 1
  LV Size                22.99 GiB
  Current LE             5886
  Segments               2
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     8192
  Block device           253:0

[root@centos7 ~]#
4.或者用lvs可以看到多出一個邏輯卷,並且“Attr”的第一個字符是s,表示快照
[root@centos7 ~]# lvs
  LV             VG  Attr       LSize   Pool Origin Data%  Meta%  Move Log Cpy%Sync Convert
  binlog         vg0 -wi-ao----   1.00g                                                    
  mysql          vg0 owi-aos---  22.99g                                                    
  mysql_kuaizhao vg0 swi-a-s--- 100.00m      mysql  0.02                                   
  home           vg1 -wi-ao---- <23.97g                                                    
[root@centos7 ~]#
5.查看設備blkid會看到邏輯卷/dev/vg0/mysql和它的快照的UUID相同
6.掛載快照
因為快照UUID與原邏輯卷的UUID一樣,所以正常掛載會報錯,xfs文件系統掛載需要加“-o nouuid”,意思是不檢查UUID進行掛載,ext系列的文件系統不用加。建議在加“ro”,讓快照的掛載目錄無法被修改
[root@centos7 ~]# mkdir /mnt/mysql_kuaizhao 
[root@centos7 ~]# mount -o nouuid,ro /dev/vg0/mysql_kuaizhao /mnt/mysql_kuaizhao
7.查看掛載
[root@centos7 ~]# df -h
Filesystem                      Size  Used Avail Use% Mounted on
/dev/sda2                       100G  3.6G   97G   4% /
···············
···············
/dev/mapper/vg0-mysql            23G   33M   23G   1% /mnt/mysql
/dev/mapper/vg1-home             24G   33M   24G   1% /home
/dev/mapper/vg0-binlog          976M  2.6M  911M   1% /mnt/binlog
···············
/dev/mapper/vg0-mysql_kuaizhao   23G   33M   23G   1% /mnt/mysql_kuaizhao
8.查看原邏輯卷和邏輯卷快照的掛載點內容
[root@centos7 ~]# ls /mnt/mysql
f1  f2
[root@centos7 ~]# ls /mnt/mysql_kuaizhao/
f1  f2
註意:雖然在快照的掛載點看到了邏輯卷的數據,但這些數據並不在快照裏,而是在原來的邏輯卷裏,只是顯示一下。

恢復快照

以上面的邏輯卷及其快照為例,刪除邏輯卷的f1文件,在查看快照的掛載點裏f1依然存在,證明了快照的作用。現在要使用快照恢復邏輯卷f1文件。
1.使用快照恢復邏輯卷內容,先卸載該邏輯卷和快照的掛載點
umount /mnt/mysql
umount /mnt/mysql_kuaizhao
2.合並
lvconvert --merge /dev/vg0/mysql_kuaizhao
合並後,快照恢復數據後會自動刪除
3.查看邏輯卷是否有快照(lvdisplay /dev/vg0/mysql),可以看到原來的快照信息消失了。
4.重新掛載,查看掛載,發現快照消失了
[root@centos7 ~]# mount -a
[root@centos7 ~]# df -h
Filesystem              Size  Used Avail Use% Mounted on
/dev/sda2               100G  3.6G   97G   4% /
devtmpfs                705M     0  705M   0% /dev
tmpfs                   721M     0  721M   0% /dev/shm
tmpfs                   721M   11M  711M   2% /run
tmpfs                   721M     0  721M   0% /sys/fs/cgroup
/dev/sdb1              1014M   33M  982M   4% /mnt/sdb1
/dev/sda3                50G   33M   50G   1% /data
/dev/sda1              1014M  164M  851M  17% /boot
/dev/mapper/vg1-home     24G   33M   24G   1% /home
/dev/mapper/vg0-binlog  976M  2.6M  911M   1% /mnt/binlog
tmpfs                   145M   12K  145M   1% /run/user/42
tmpfs                   145M     0  145M   0% /run/user/0
/dev/mapper/vg0-mysql    23G   33M   23G   1% /mnt/mysql
5.查看邏輯卷的掛載目錄裏,f1恢復成功
[root@centos7 ~]# ls /mnt/mysql
f1  f2

8.同一卷組中PE的移動及刪除PE

如果有一塊磁盤閃爍黃燈,表示磁盤快壞了。但是該磁盤加入了物理卷,給邏輯卷提供了空間(即PE),把它拔出代表卷組和邏輯卷的一部分空間沒了,如果有數據就會丟失。解決的辦法是,把該磁盤的提供給卷組的PE復制到正常的磁盤即可。如果情況壞點,當時沒有多余的空間,那麽在添加一個硬盤加入物理卷,給卷組增加空間(PE)即可。在如果沒有多余的插槽添加硬盤,可通過縮減邏輯卷(xfs文件系統不支持縮減,ext系列文件系統支持),在增加卷組空間。
1)添加新硬盤後,使用lsblk看不到硬盤,需要刷新,命令如下
echo "---" &gt; /sys/class/scsi_host/host2/scan
2)把新硬盤添加到物理卷,並添加到卷組
3)移動壞掉的PE(假設硬盤空間都要移動)
"pvmove"命令可以指定,把卷組中的某一空間(PE)移動到同一卷組的其他空間中去。
pvmove 要移動的磁盤分區
4)刪除卷組中快要壞的磁盤分區
vgreduce 卷組 磁盤分區
5)刪除物理卷中快要壞的磁盤分區(其實是刪除PE)
pvremove 磁盤分區

Linux篇 | 磁盤存儲和文件系統