
擴大 EC2 執行個體就像呼吸一樣簡單(例如,建立一個 AMI,從中啟動一個執行個體,然後變更儲存大小)。
但減少它變得更加困難。我想要減少 Amazon Web Services (AWS) EC2 執行個體彈性區塊儲存 (EBS) 根磁碟區的大小。網路上有一些舊的高級程式。我找到的更詳細的版本是 StackOverflow 問題上一年前的答案:如何減少我的 ebs 卷容量,步驟有相當高的水平:
建立所需大小的新 EBS 磁碟區(例如 /dev/xvdg)
啟動一個實例,並將兩個 EBS 磁碟區附加到它
檢查(原始根磁碟區的)檔案系統:(例如)e2fsck -f /dev/xvda1
最大程度縮小原始根磁碟區:(例如ext2/3/4)resize2fs -M -p /dev/xvda1
使用 dd 複製資料:
選擇區塊大小(我喜歡 16MB)
計算區塊數(使用 resize2fs 輸出中的區塊數):blocks*4/(chunk_size_in_mb*1024) - 為了安全起見,向上捨入一點
複製資料:(例如)dd if=/dev/xvda1 ibs=16M of=/dev/xvdg obs=16M count=80
調整新(較小)EBS 磁碟區上的檔案系統大小:(例如)resize2fs -p /dev/xvdg
檢查(原始根磁碟區的)檔案系統:(例如)e2fsck -f /dev/xvdg
分離新的 EBS 根卷,並將其附加到原始實例
我無法找到詳細的分步“如何”解決方案。
我的 EBS 根磁碟區附加到 HVM Ubuntu 執行個體。
任何幫助將非常感激。
答案1
如果該磁碟區用作根(可引導)設備,則其他解決方案都不起作用。
新建立的磁碟缺少啟動分割區,因此需要安裝 GRUB 並正確設定一些標誌,然後實例才能將其用作根磁碟區。
我的(截至今天,在職的)縮小根卷的解決方案是:
背景:我們有一個實例 A,我們要縮小其根卷。我們將此體積稱為 VA。我們希望將 VA 從 30GB 縮小到 10GB
- 建立一個新的 ec2 實例 B,其作業系統與實例 A 相同。作為存儲,選擇與 VA 類型相同但大小為 10GB 的磁碟區。 (或無論您的目標大小是什麼)。現在我們有一個實例 B,它使用這個新磁碟區(我們稱之為 VB)作為根卷。
- 一旦新執行個體 (B) 運行。停止它並分離它的根卷 (VB)。
注意:以下步驟主要取自 @bill 的解決方案:
停止要調整大小的實例 (A)。
建立磁碟區 VA 的快照,然後從該快照建立「通用 SSD」磁碟區。這卷我們稱之為 VASNAP。
使用 amazon Linux 啟動一個新實例,我們將此實例稱為 C。我們或許也可以使用實例 A 來執行這些步驟,但我更喜歡在獨立的電腦中執行此操作。
將下列磁碟區附加到實例 C./dev/xvdf(對於 VB)。 /dev/xvdg 用於 VASNAP。
重新啟動實例 C。
透過 SSH 登入實例 C。
建立這些新目錄:
mkdir /source /target
- 使用 ext4 檔案系統格式化 VB 的主分割區:
mkfs.ext4 /dev/xvdf1
如果沒有出現錯誤,請繼續執行步驟 11 /dev/xvdf1
。
i) 如果/dev/xvdf1
由於某種原因不存在,則需要建立它。首先輸入:
sudo fdisk /dev/xvdf
。
ii) 輸入以下內容來擦除磁碟:
wipefs
iii) 輸入以下命令以建立新分區:
n
iv) 輸入p
建立主分區
v) 按住 Enter 鍵繼續使用預設設定。
vi) 當它再次要求命令時,輸入w
以寫入變更並退出。
vii)/dev/xvdf1
透過執行以下操作驗證您是否擁有分割區:
lsblk
您應該會看到類似以下內容:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 250G 0 disk
└─xvda1 202:1 0 250G 0 part
xvdf 202:80 0 80G 0 disk
└─xvdf1 202:81 0 80G 0 part
xvdg 202:96 0 250G 0 disk
└─xvdg1 202:97 0 250G 0 part
現在繼續執行步驟 11。
- 將其掛載到該目錄:
mount -t ext4 /dev/xvdf1 /target
- 這非常重要,檔案系統需要一個 e2label 以便 Linux 識別它並啟動它,在活動實例上使用“e2label /dev/xvda1”來查看它應該是什麼,在本例中標籤是:“/”
e2label /dev/xvdf1 /
- 將 VASNAP 安裝在 /source 上:
mount -t ext4 /dev/xvdg1 /source
- 複製內容:
rsync -vaxSHAX /source/ /target
注意:“/target”後面沒有“/”。另外,可能存在一些關於符號連結和屬性的錯誤,但調整大小仍然成功
- 卸載VB:
umount /target
傳回 AWS 控制台:從執行個體 C 分離 VB,並從 A 分離 VA。
將新大小的磁碟區 (VB) 附加到實例:“/dev/xvda”
啟動實例 A,現在它的根設備是 10GB :)
刪除實例 B 和 C,以及除 VB 之外的所有捲,VB 現在是實例 A 的根卷。
答案2
在 AWS 主控台中:
停止您要調整大小的實例
建立活動磁碟區的快照,然後從該快照建立「通用 SSD」磁碟區。
建立另一個「通用 SSD」磁碟區至您想要的大小。
將這 3 個磁碟區附加到實例,如下所示:
- /dev/sda1 表示活動卷。
- /dev/xvdf 表示目標大小的磁碟區。
- /dev/xvdg 表示從活動磁碟區的快照建立的磁碟區。
啟動實例。
透過 SSH 登入新實例。
建立這些新目錄:
mkdir /source /target
- 在新磁碟區上建立 ext4 檔案系統:
mkfs.ext4 /dev/xvdf
- 將其掛載到該目錄:
mount -t ext4 /dev/xvdf /target
- 這非常重要,檔案系統需要一個 e2label 以便 linux 識別它並啟動它,在活動實例上使用“e2label /dev/xvda1”來查看它應該是什麼,在本例中標籤是:“/”
e2label /dev/xvdf /
- 掛載從快照建立的磁碟區:
mount -t ext4 /dev/xvdg /source
- 複製內容:
rsync -ax /source/ /target
注意:“/target”後面沒有“/”。另外,可能存在一些關於符號連結和屬性的錯誤,但調整大小仍然成功
- 卸載檔案系統:
umount /target
umount /source
傳回 AWS 主控台:停止實例,並分離所有磁碟區。
將新大小的磁碟區附加到實例:“/dev/sda1”
啟動實例,它應該會啟動。
第 10 步很重要:如上所述,使用「e2label」標記新卷,否則實例將顯示在 aws 中啟動,但無法透過連線檢查。
答案3
1. 建立一個新的 ebs 磁碟區並將其附加到實例。
建立新的 EBS 磁碟區。例如,如果您原來有20G,並且想將其縮減為8G,則建立新的8G EBS卷,請確保位於同一可用區。將其附加到您需要收縮根分割區的實例。
2. 對新建立的 ebs 磁碟區上的檔案進行分割、格式化和同步。
(1.檢查分區狀況我們首先使用指令sudo parted -l
查看原卷的分割區資訊:
[root@ip-172-31-16-92 conf.d]# sudo parted -l
Model: NVMe Device (nvme)
Disk /dev/nvme0n1: 20G
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB bbp bios_grub
2 2097kB 20480MB 24G xfs root
可以看到,這個20G的根裝置磁碟區被分成了兩個分割區,一個名為bbp,另一個名為root。 bbp分區中沒有檔案系統,但有一個名為bios_grub的flag,這表示該系統是由grub啟動的。至於什麼是bios_grub,其實就是BIOS開機分割區。參考如下:
https://en.wikipedia.org/wiki/BIOS_boot_partition https://www.cnblogs.com/f-ck-need-u/p/7084627.html
這大約是1MB,我們需要重點關注的是一個名為root的分割區。此分區儲存了原始系統的所有檔案。所以,備份的想法就是將檔案從這個分割區傳輸到新的ebs磁碟區上另一個更小的分割區。
(2 用於parted
對新的 ebs 卷進行分割和格式化。
用於lsblk
列出區塊:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
新的ebs磁碟區是設備nvme1n1,我們需要對其進行分區。
~# parted /dev/nvme1n1
GNU Parted 3.2
Using /dev/xvdg
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt #Using the gpt layout would take up the first 1024 sectors
(parted) mkpart bbp 1MB 2MB # Since the first 1024 sectors are used, the start address here is 1024kb or 1MB, and bbp is the partition name, that is, BIOS boot partition, which needs to take up 1MB, so the end address is 2MB
(parted) set 1 bios_grub on #Set partition 1 as BIOS boot partition
(parted) mkpart root xfs 2MB 100% #allocate the remaining space (2MB to 100%) to the root partition.
分區後,lsblk
再次使用,我們可以看到
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
├─nvme1n1p1 270:1 0 1M 0 part
└─nvme1n1p2 270:2 0 8G 0 part /
可以看到多了兩個分區,nvme1n1p1和nvme1n1p2,其中nvme1n1p2是我們新的根分區。使用以下命令格式化分割區:
mkfs.xfs /dev/nvme1n1p2
格式化後,我們需要掛載該分割區,例如掛載到/mnt/myroot。
mkdir -p /mnt/myroot
mount /dev/nvme1n1p2 /mnt/myroot
(3 使用rsync將所有內容傳送到新磁碟區對應的根分割區。
sudo rsync -axv / /mnt/myroot/
注意上面的-x
參數很重要,因為是備份目前實例的根目錄,所以如果不加這個參數,就會把/mnt/myroot本身備份到/mnt/myroot,陷入無限循環。 rsync指令與cp指令不同。 cp指令會被覆蓋,而rsync是同步增量備份。這會節省很多時間。喝杯咖啡,等待完成同步。
3.替換對應文件中的uuid。
因為volume發生了變化,所以volume的uuid也發生了變化。我們需要替換引導檔案中的 uuid。需要修改以下兩個文件:
/boot/grub2/grub.cfg #or /boot/grub/grub.cfg
/etc/fstab
那麼需要改變什麼?首先,需要透過blkid列出相關卷的uuid:
[root@ip-172-31-16-92 boot]# sudo blkid
/dev/nvme0n1p2: LABEL="/" UUID="add39d87-732e-4e76-9ad7-40a00dbb04e5" TYPE="xfs" PARTLABEL="Linux" PARTUUID="47de1259-f7c2-470b-b49b-5e054f378a95"
/dev/nvme1n1p2: UUID="566a022f-4cda-4a8a-8319-29344c538da9" TYPE="xfs" PARTLABEL="root" PARTUUID="581a7135-b164-4e9a-8ac4-a8a17db65bef"
/dev/nvme0n1: PTUUID="33e98a7e-ccdf-4af7-8a35-da18e704cdd4" PTTYPE="gpt"
/dev/nvme0n1p1: PARTLABEL="BIOS Boot Partition" PARTUUID="430fb5f4-e6d9-4c53-b89f-117c8989b982"
/dev/nvme1n1: PTUUID="0dc70bf8-b8a8-405c-93e1-71c3b8a887c7" PTTYPE="gpt"
/dev/nvme1n1p1: PARTLABEL="bbp" PARTUUID="82075e65-ae7c-4a90-90a1-ea1a82a52f93"
可以看到舊的大EBS卷的根分區的uuid是add39d87-732e-4e76-9ad7-40a00dbb04e5
,新的小EBS卷的uuid是566a022f-4cda-4a8a-8319-29344c538da9
。使用sed指令替換:
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /boot/grub2/grub.cfg
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /etc/fstab
當然,為了方便起見,您也可以嘗試使用grub-install
(在某些系統中是)手動產生 grub 檔案。grub2-install
4.分開兩個卷,然後重新附加新的小卷。
然後使用umount
卸載新的 ebs 磁碟區:
umount /mnt/myroot/
如果提示目標正忙。您可以使用它fuser -mv /mnt/myroot
來查看哪個進程正在其中運行。我發現的是bash,也就是說你必須在bash中退出這個目錄。使用cd
返回主目錄並再次輸入上面的命令進行卸載。
然後分離兩個磁碟區(當然,首先停止實例),並透過在此處填寫裝置名稱重新附加新磁碟區作為根裝置。/dev/xvda
如下圖所示
然後啟動實例。
1.取得系統日誌
參考:
1.https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html#InitialSteps
2.https://www.daniloaz.com/en/partitioning-and-resizing-the-ebs-root-volume-of-an-aws-ec2-instance/
3.https://medium.com/@m.yunan.helmy/decrease-the-size-of-ebs-volume-in-your-ec2-instance-ea326e951bce
答案4
下面的文章是關於如何減小 EBS 磁碟區大小的簡單明了的教學。它有一個易於遵循的分步指南和螢幕截圖。