LVM是 Logical Volume Manager,邏輯的概念,Linux用戶安裝Linux操做系統時遇到的一個常見的難以決定的問題就是如何正確地評估各分區大小,以分配合適的硬盤空間。普通的磁盤分區管理方式在邏輯分區劃分好以後就沒法改變其大小,當一個邏輯分區存放不下某個文件時,這個文件由於受上層文件系統的限制,也不能跨越多個分區來存放,因此也不能同時放到別的磁盤上。而遇到出現某個分區空間耗盡時,解決的方法一般是使用符號連接,或者使用調整分區大小的工具,但這只是暫時解決辦法,沒有從根本上解決問題。隨着Linux的邏輯卷管理功能的出現,這些問題都迎刃而解,用戶在無需停機的狀況下能夠方便地調整各個分區大小。linux
PV,VG,LV構成了一種易於管理擁有一個或多個硬盤的主機的文件系統,這些硬盤可能只有一個分區也可能有多個。經過將這些物理存在的分區(或稱爲卷)PV(physical volume)進行整合,組成一個分區(卷)組VG(volume group),進而再次進行分配造成邏輯分區(卷)LV(logical volume)。建立成功的邏輯分區對於操做系統來講會想普通分區無異,其好處是能夠動態調整分區大小。管理PV,VG,LV的工具稱爲邏輯卷管理器LVM(logical volume manager)。以下圖所示:docker
須要指出的是,在某個物理卷在加入卷組時,會將物理卷的最小存儲單元設定爲一個固定的值,這個值稱爲PE(physical extent)。這個值的建立,是爲了保證用統一的最小分配單元來建立邏輯卷,不至於由於分配單元大小不一樣而形成空間浪費。舉個例子:用於遠洋運輸的集裝箱的設計是是有着統一標準的,最重要一點是集裝箱大小徹底相同,這樣作的好處是集裝箱相互堆疊在一塊兒不會留下多餘的空隙,徹底利用了空間,且便於管理。設定PE的緣由也與此相同。LVM以最小分配單元來建立邏輯卷,該最小分配單元的值稱爲LE(logical extent)。通常來講PE=LE,PE的大小是可配置的,默認爲4MB。後端
pvcreate: 建立PVbash
pvdisplay: 查看已建立的PVapp
vgcreate: 建立VG框架
vgdisplay: 查看VGide
lvcreate: 建立LV工具
lvdisplay: 查看LVoop
如下參考:https://blog.csdn.net/qq_26923057/article/details/52351731測試
Device Mapper是Linux系統中基於內核的高級卷管理技術框架。Docker的devicemapper存儲驅動就是基於該框架的精簡置備和快照功能來實現鏡像和容器的管理。
注:Device Mapper是Linux的一種技術框架,而devicemapper是Docker Engine基於Device Mapper提供的一種存儲驅動。
早期的Docker運行在Ubuntu和Debian Linux上並使用AUFS做爲後端存儲。Docker流行以後,愈來愈多的的公司但願在Red Hat Enterprise Linux這類企業級的操做系統上面運行Docker,但惋惜的是RHEL的內核並不支持AUFS。
這個時候紅帽公司出手了,決定和Docker公司合做去開發一種基於Device Mapper技術的後端存儲,也就是如今的devicemapper。
devicemapper驅動將每個Docker鏡像和容器存儲在它自身的具備精簡置備(thin-provisioned)、寫時拷貝(copy-on-write)和快照功能(snapshotting)的虛擬設備上。因爲Device Mapper技術是在塊(block)層面而非文件層面,因此Docker Engine的devicemapper存儲驅動使用的是塊設備來存儲數據而非文件系統。
devicemapper是RHEL下Docker Engine的默認存儲驅動,它有兩種配置模式:loop-lvm和direct-lvm。
loop-lvm是默認的模式,它使用OS層面離散的文件來構建精簡池(thin pool)。也就是用一個稀疏文件來當成一個塊設備,給devicemapper
用。該模式主要是設計出來讓Docker可以簡單的被」開箱即用(out-of-the-box)」而無需額外的配置。但若是是在生產環境的部署Docker,官方明文不推薦使用該模式。咱們使用docker info命令能夠看到如下警告:
direct-lvm是Docker推薦的生產環境的推薦模式,他使用塊設備來構建精簡池來存放鏡像和容器的數據。
(1)查看當前爲devicemapper模式
注意Pool Name是docker本身生成的;Deferred Deletion Enabled是false
(1)中止docker(若是還沒裝docker就跳過這步吧)
最好是先部署direct-lvm,再安裝docker。
分配裸設備
本例以Nutanix的ABS功能來分配一塊iSCSI盤到docker宿主機,推薦使用外部共享存儲的設備但不侷限於此種方式,可根據本身的環境決定。
建立一個Volume Group
添加50GB的盤
將Volume Group掛給docker宿主機
查看設備,局方提供了一塊sdb盤,50G。
(2)建立PV
(3)建立VG
查看VG信息
[root@docanix ~]# vgdisplay docker --- Volume group --- VG Name docker System ID Format lvm2 Metadata Areas 1 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 1 Act PV 1 VG Size 50.00 GiB PE Size 4.00 MiB Total PE 12799 Alloc PE / Size 0 / 0 Free PE / Size 12799 / 50.00 GiB VG UUID bXJkQH-qSJc-t5JT-f1GL-reTR-XBVf-ylCEFY
(4)建立thinpool,首先建立2個pool
數據LV大小爲VG的95%,元數據LV大小爲VG的1%,剩餘的空間用來自動擴展。 做爲meta的pool大小不能超過16GB。這是爲何???
(5)將pool轉化爲thinpool
[root@docanix ~]# lvconvert -y --zero n -c 512K --thinpool docker/thinpool --poolmetadata docker/thinpoolmeta WARNING: Converting logical volume docker/thinpool and docker/thinpoolmeta to pool's data and metadata volumes. THIS WILL DESTROY CONTENT OF LOGICAL VOLUME (filesystem etc.) Converted docker/thinpool to thin pool.
將pool轉換爲thin-pool同時將thinpool lv的chunksize改成512KB,而且將前 4KB 字節清零。
(6)配置thinpool
配置池的自動擴展
加載上一步文件配置,應用配置變動(文件名稱要對應哦)
監控檢查磁盤,必定要執行,不然磁盤不會自動擴展。
列出塊設備信息
[root@hps4 profile]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 20G 0 part
├─docker-thinpool_tmeta 253:3 0 204M 0 lvm
│ └─docker-thinpool 253:5 0 19G 0 lvm
└─docker-thinpool_tdata 253:4 0 19G 0 lvm
└─docker-thinpool 253:5 0 19G 0 lvm
(7)配置docker,修改服務配置文件
ExecStart=/usr/bin/docker daemon --insecure-registry 0.0.0.0/0 -H unix:///var/run/docker.sock --storage-driver=devicemapper --storage-opt=dm.thinpooldev=/dev/mapper/docker-thinpool --storage-opt=dm.use_deferred_removal=true --storage-opt=dm.use_deferred_deletion=true
(8)清除docker之前的數據,下圖是舉個例子,具體刪的目錄要看安裝配置
不清除之前數據可能會有以下報錯:
Error starting daemon: error initializing graphdriver: devmapper: Base Device UUID and Filesystem verification failed: devicemapper: Error running deviceCreate (ActivateDevice) dm_task_run failed
(9)重啓docker 便可。再看docker info
查看docker info
紅色部分說明已是direct-lvm模式了,除了紅色框框內的變化,Data file 和Metadata file是空的.
(10)測試
pull一個鏡像看是否數據會寫到thinpool裏
能夠看到Data%在pull一個busybox鏡像後使用率由0.04變爲0.08,說明direct-lvm配置成功且正常工做。
If you reboot the host and find that the docker
service failed to start, look for the error, 「Non existing device」. You need to re-activate the logical volumes with this command:
sudo lvchange -ay docker/thinpool
https://docs.docker.com/storage/storagedriver/device-mapper-driver/#configure-loop-lvm-mode-for-testing
補充:
若是局方磁盤只有一塊vdb盤,那麼咱們要把vdb盤分紅兩個盤,一塊正常掛載存放應用和日誌等,另外一塊盤用來作lvs。
2T如下的磁盤分區可使用fdisk工具,步驟以下:
(1)分區
[root@RLSB02 ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table
Building a new DOS disklabel with disk identifier 0xa33a833f.
Command (m for help): n
Partition type:
p primary (0 primary, 0 extended, 4 free)
e extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-838860799, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-838860799, default 838860799): 204800000
Partition 1 of type Linux and of size 97.7 GiB is set
Command (m for help): n
Partition type:
p primary (1 primary, 0 extended, 3 free)
e extended
Select (default p): p
Partition number (2-4, default 2): 2
First sector (204800001-838860799, default 204802048):
Using default value 204802048
Last sector, +sectors or +size{K,M,G} (204802048-838860799, default 838860799):
Using default value 838860799
Partition 2 of type Linux and of size 302.4 GiB is set
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
這樣咱們能夠拿vdb1正常掛載,vdb2作lvs
(2)別忘了初始化兩塊磁盤:
mkfs.ext4 /dev/vdb1
mkfs.ext4 /dev/vdb2
(3)掛載vdb1盤
mkdir /data
在/etc/fstab後面添加下面記錄
/dev/vdb1 /data ext4 noatime,defaults 1 1
保存後,執行mount -a
而後df -h看下磁盤vdb1已經被掛載上了,vdb2就不贅述了,按照前面步驟作吧