天天看點

一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結

預設情況下建立的 ECS 執行個體隻有一個40G 的高效雲盤系統盤,通過任何形式(控制台、ECS SDK 等) 方式建立的執行個體,如果需要使用資料盤,必須先進行額外的格式化資料盤工作。

如果需要批量建立大量的有特定格式化需求資料盤的 ECS 執行個體,那麼單獨為每一台執行個體格式化資料盤肯定是一件浪費運維資源的工作。是以,這裡介紹一種比較簡單的 ECS 執行個體資料盤自動挂載和格式化的方式,也許有更好的方法,請各位大神拍磚。

背景

阿裡雲 ECS 執行個體對資料盤的使用,由于涉及到使用者自己的業務邏輯,對盤的數目、分區方式、檔案系統要求等都不盡相同,是以 ECS 服務提供了自主的方式,将資料盤的格式化工作全部交托給使用者自行處理,這樣就導緻了使用者需要進行一步的運維工作,才能對資料盤進行正常的使用。如果使用者需要建立批量的執行個體,那麼對這些執行個體分别進行資料盤的初始化操作必然會成為運維中的一項額外的工作。

以 Linux 系統為例,主要的步驟如下:

一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結

如果是新購買的資料盤,那麼需要先

挂載資料盤

。如果是和執行個體一同購買的資料盤,那麼可以直接進行

資料盤的格式化

即可。

我們知道,ECS 提供了自定義鏡像的功能,使用者可以從現有的執行個體建構鏡像,此後就可以使用該鏡像作為新的執行個體建立的模闆,"克隆"業務所需的執行個體了。那麼資料盤的格式化資訊是否也能被"錄制"到鏡像中呢?當然可以。

如何制作資料盤格式化了的鏡像

這裡以 Linux 系統(執行個體基礎鏡像為 linux_17_01_64_20G_cloudinit_20171222.vhd),挂載 SSD 雲盤,建立一個單分區,并挂載檔案系統為例。使用 ECS 的 SDK 進行相關的操作。

首先,通過

CreateInstance

建立一個 ECS 執行個體,注意,建立參數中 DataDisk 參數的内容:

type DataDiskType struct {
    Size                     int
    Category             DiskCategory //Enum cloud, ephemeral, ephemeral_ssd
    SnapshotId         string
    DiskName           string
    Description         string
    Device                string
    DeleteWithInstance bool
}
           
  • Size: 資料盤大小,機關 GB
  • Category: 資料盤的類型,如 ephemeral_ssd, cloud_efficiency 和 cloud_ssd 等,分别對應本地 SSD , 高效雲盤,高效 SSD 等。
  • Device: 資料盤挂載點的裝置名稱,如果不填,預設由系統配置設定,I/O 優化執行個體的資料盤裝置名從

    /dev/vdb 遞增排列,包括 /dev/vdb− /dev/vdz。如果資料盤裝置名為 dev/xvd( 是 a−z 的任意一個字母),表示您使用的是非 I/O 優化執行個體。

在建立時,DataDisk 參數中隻有一塊 DataDiskType 類型,我們選擇使用預設的 Device 。此時建立出來的執行個體,帶有一塊資料盤,但是未格式化。如果登入機器,通過 fdisk -l 可以看到對應的資料盤的資訊以及挂載點。但是檔案系統中是沒有任何該資料盤的資訊的。

一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結
一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結

接下來就是自定義機器的業務邏輯,比如,需要如何配置系統、安裝什麼軟體等等,可以通過 SSH Client 相關工具對機器進行自動化操作。比如資料盤格式化的操作,可以生成這樣的 shell 檔案,通過 SSH Client 拷貝到執行個體機器上,然後執行就可以了。

set -e
setup_disk() {
    tee ./command <<-EOF
n
p
1


w
p
EOF
    fdisk -u /dev/vdb < ./command
    mkfs.ext4 /dev/vdb1
    echo /dev/vdb1 /your_dir ext4 defaults 0 0 >> /etc/fstab
    mkdir -p /your_dir
    mount /dev/vdb1 /your_dir
}

setup_disk           

執行完成之後,你可以看到系統資訊已經發生變化:

一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結
一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結

當然,為了驗證磁盤格式化資訊正确持久化,你可以對這個執行個體重新開機,然後再進行相關的 check,check 邏輯可以簡單如下:

set -e

df -h|grep '/your_dir'|grep '/dev/vdb1'
fdisk -l|tail -1|grep '/dev/vdb1'           

最後,通過

CreateImage

建構鏡像即可。

如何通過鏡像複制執行個體

通過上面的步驟,你應該已經制作了一個帶有資料盤格式化資訊的鏡像了,那麼這時你需要通過這個鏡像來建立你需要的執行個體。建立執行個體的過程和一開始通過

相同,但是有一些坑需要注意:

  • CreateInstance 的參數中 DataDisk 必須填寫,并且 DataDisk 中的一塊資料盤的 Device 資訊必須和鏡像中的資料盤裝置名完全相同。如果不填或者填錯,那麼系統會當做一塊新的資料盤進行處理,此時建立出來的執行個體會有兩塊資料盤。分别挂載 /dev/xvdb 和 /dev/xvdc。而 /dev/xvdb 是鏡像自帶的已經格式化的資料盤,/dev/xvdc 才是你在這次 CreateInstance 指定的資料盤,而且隻挂載沒有格式化化。下圖展示了我的一次失敗的操作結果:
一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結
一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結
  • 鏡像中僅僅儲存了資料盤格式化的資訊,但是并未儲存磁盤類型資訊,比如在建立進行的時候使用的執行個體挂載的資料盤是 cloud_ssd,但是如果不指定 DataDisk 中資料盤的 Category ,預設使用的是高效雲盤。因為資料盤類型屬于業務屬性,鏡像本身并沒有這個屬性。
  • Device 的值并不是你在機器上通過 fdisk -l 看到的,可以需要通過 DescribeImages 檢視。我們通過 fdisk -l 可以看到上面的資料盤都是在 /dev/vdb 這個裝置名上,但是 DescribeImages 的傳回結果卻是:
一種高效自動化ECS執行個體資料盤挂載和格式化方式背景如何制作資料盤格式化了的鏡像如何通過鏡像複制執行個體總結

這個值和虛拟化的類型相關,是以,請以 DescribeImages 的結果為準。

總結

一個簡單的資料盤格式化模闆建構方式,小總結一下~~謝謝拍磚。

繼續閱讀