Contents

Linux - 虛擬資料優化系統 - VDO

建立一個雲端空間共同存放影片是的很好的地方,不過有 100 個每個人都存一部內容一模一樣佔 10GB 空間影片,就必須騰出 1TB 來存放,十分浪費,故 VDO ( Virtual Data Optimizer )目的就是重複檔案僅存一次,重複的內容使用捷徑方式儲存就可以大大的降低空間浪費。

1. VDO 簡介

VDO 虛擬資料優化系統 ( Virtual Data Optimizer ),透過軟體來壓縮及去除重複的資料,變可以有效的增加儲存空間,其架構圖如下。

https://i.imgur.com/ZukFfKa.png
From access.redhat.com


2. VDO 安裝

VDO 安裝方式十分容易 , 已經預設在 RHEL 8 的 BaseOS 倉庫裡,直接透過 yum 即可安裝

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[root@serverc ~]# yum install vdo
Dependencies resolved.
==================================================================================================================================================================================================================
 Package                                               Architecture                                  Version                                                  Repository                                     Size
==================================================================================================================================================================================================================
Installing:
 vdo                                                   x86_64                                        6.2.5.74-14.el8                                          BaseOS                                        661 k
Installing dependencies:
 kmod-kvdo                                             x86_64                                        6.2.5.72-81.el8                                          BaseOS                                        339 k
 python3-pyyaml                                        x86_64                                        3.12-12.el8                                              BaseOS                                        192 k
...

3. VDO 創建以掛載

VDO 指定一個分割好的硬碟 ( 需大於 5G ),如尚未分割可以使用 parted 進行分割。

3.1. 分割硬碟

1
2
3
4
5
6
7
8
9
[root@serverc ~]# parted -s /dev/vdd mklabel msdos mkpart  primary xfs 2048s 100% print
Model: Virtio Block Device (virtblk)
Disk /dev/vdd: 10.7GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos
Disk Flags: 

Number  Start   End     Size    Type     File system  Flags
 1      1049kB  10.7GB  10.7GB  primary  xfs          lba

3.2. 創建 VDO

1
2
3
4
5
6
7
8
[root@serverc ~]# vdo create --name=vdo1 --device=/dev/vdd1 --vdoLogicalSize=10T
Creating VDO vdo1
      The VDO volume can address 6 GB in 3 data slabs, each 2 GB.
      It can grow to address at most 16 TB of physical storage in 8192 slabs.
      If a larger maximum size might be needed, use bigger slabs.
Starting VDO vdo1
Starting compression on VDO vdo1
VDO instance 1 volume is ready at /dev/mapper/vdo1
Tip
創建的 VDO SIZE 可以比硬碟空間來的大是沒有問題,VDO 透過軟體虛擬出來的,如空間不足多加幾個硬碟即可。

3.3. 格式化 VDO

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[root@serverc ~]# mkfs.xfs -K /dev/mapper/vdo1 
meta-data=/dev/mapper/vdo1       isize=512    agcount=10, agsize=268435455 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=2684354550, imaxpct=5
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=521728, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

3.4. 創建目錄並使用 VDO 掛載

1
2
3
4
5
6
[root@serverc ~]# mkdir -v /vdo
mkdir: created directory '/vdo'
[root@serverc ~]# mount /dev/mapper/vdo1 /vdo
[root@serverc ~]# df -h /vdo
Filesystem        Size  Used Avail Use% Mounted on
/dev/mapper/vdo1   10T   72G   10T   1% /vdo

3.5. 開機自動掛載

囿於 VDO 服務是由 systemd 託管,不過再開機過程中先 mount 硬碟最後才會啟動 systemd ,在沒有 VDO 服務時,系統會認定找不到該硬碟導致無法開機進入救援模式,所以必須加上特定參數,使得 VDO 等服務啟動後再執行 mount。

1
2
3
[root@serverc ~]# cat >> /etc/fstab << EOL
> /dev/mapper/vdo0 /vdo xfs defaults,x-systemd.requires=vdo.service 0 0
> EOL
注意
一定要加上 x-systemd.requires=vdo.service 參數,不然會導致開機不起來..

4. VDO 操作方式

4.1. 查看 VDO 實際佔用的空間

1
2
3
[root@serverc ~]# vdostats --human-readable 
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdo1         10.0G      4.0G      6.0G  40%           99%
Note
就算沒有任何檔案, VDO 預設會保留 3 - 4G的空間做為緩衝。

4.2. 複製一個較大檔案至 /vdo 目錄並查看 VDO 狀態

1
2
3
4
5
[root@serverc ~]# ls -lh /usr/lib/locale/locale-archive
-rw-r--r--. 1 root root 208M Feb 16 12:49 /usr/lib/locale/locale-archive
[root@serverc ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdo1         10.0G      4.1G      5.9G  40%           96%

4.3. 使用回圈多複製30個上述檔案,並查看 VDO 狀態

使用迴圈複製相同檔案多次,實際上只佔用一次檔案的空間,可以看出 saving% 比上一步驟增加了 4% ,不過 Used 還是維持 4.1 G。

1
2
3
4
[root@serverc ~]# for i in {1..30} ; do cp /usr/lib/locale/locale-archive /vdo/test${i}; done
[root@serverc ~]# vdostats --human-readable
Device                    Size      Used Available Use% Space saving%
/dev/mapper/vdo1         10.0G      4.1G      5.9G  41%           98%

5. LAB 練習

5.1. LAB

練習環境

可以使用 HowHow 的創建 Lab 練習環境,操作錯誤導致系統失敗可以直接重置還原,使用方式請參閱 HowHow 網站

囿於 HowHow 預設掛載硬碟較小,請在 bastion 機器下載 initVDO.sh 腳本後會自動擴展 serverc VDD的硬碟大小,執行方式如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[root@bastion tmp]# curl  https://how64bit.com/RHCSA/script/initVDO.sh -O initVOD.sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   944    0   944    0     0   2551      0 --:--:-- --:--:-- --:--:--  2551
[root@bastion tmp]# sh initVDO.sh
...

# Serverc 預設沒有 yum.repo,手動複製 倉庫清單
[root@serverc ~]# cp /etc/yum.repos.d/back_repo/rhel8.repo /etc/yum.repos.d/.
# 安裝 VDO
[root@serverc ~]# yum install vdo
...

LAB 如下要求,創建新的 VDO

  • 使用一個未分割的硬碟
  • VDO名稱為 vdough
  • 大小為 50G
  • 使用 xfs 檔案系統格式化
  • 開機後自動掛載到 /vbread 目錄下
還原初始設定
LAB練習完畢後,可以至 bastion 機器執行 rht-vmctl reset serverc 重置 serverc 將硬碟回初始設定。

5.2. LAB 解答

5.2.1. 下載並安裝 VDO

1
2
3
# 使用 HowHow 的 LAB 需先配置倉庫清單
[root@serverc ~]# cp /etc/yum.repos.d/back_repo/rhel8.repo /etc/yum.repos.d/. && yum install -y vdo
...

5.2.2. 分割硬碟並創建 VDO

1
2
3
4
5
6
7
8
9
[root@serverc ~]# parted -s /dev/vdd mklabel msdos mkpart  primary xfs 2048s 100%
[root@serverc ~]# vdo create --name=vdough --device=/dev/vdd1 --vdoLogicalSize=50G
Creating VDO vdough
      The VDO volume can address 6 GB in 3 data slabs, each 2 GB.
      It can grow to address at most 16 TB of physical storage in 8192 slabs.
      If a larger maximum size might be needed, use bigger slabs.
Starting VDO vdough
Starting compression on VDO vdough
VDO instance 0 volume is ready at /dev/mapper/vdough

5.2.3. 使用 XFS 檔案系統格式化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[root@serverc ~]# mkfs.xfs -K /dev/mapper/vdough 
meta-data=/dev/mapper/vdough     isize=512    agcount=4, agsize=3276800 blks
         =                       sectsz=4096  attr=2, projid32bit=1
         =                       crc=1        finobt=1, sparse=1, rmapbt=0
         =                       reflink=1
data     =                       bsize=4096   blocks=13107200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
log      =internal log           bsize=4096   blocks=6400, version=2
         =                       sectsz=4096  sunit=1 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0

5.2.4. 設定開機自動掛載至 /vbread 目錄

1
2
3
4
5
6
7
8
9
[root@serverc ~]# mkdir -v /vbread
mkdir: created directory '/vbread'
[root@serverc ~]# cat >> /etc/fstab << EOL
> /dev/mapper/vdough /vbread xfs defaults,x-systemd.requires=vdo.service 0 0
> EOL
[root@serverc ~]# mount -a
[root@serverc ~]# df -h /vbread/
Filesystem          Size  Used Avail Use% Mounted on
/dev/mapper/vdough   50G  390M   50G   1% /vbread

5.2.5. reboot 重新開機

確保重新開機後,所有目錄都正常掛載。

Tip
如果無法正常開機,表示 /etc/fstab 中有錯誤,可以至 bastion 機器執行 rht-vmctl reset serverc 重置 serverc 回初始設定,並再次執行 initVDO.sh 擴展硬碟空間 。

6. 小結

VDO 是架設共享雲端空間非常好用的利器,如果有要打造公司內部分享可以使用此軟體,大大的降低儲存成本。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!