Giảm dung lượng Amazon EBS Volume trên Linux

Bạn đã bao giờ lauch một EC2 instance với một Amazon EBS Volume có dung lượng lớn so với dung lượng cần thiết để sử dụng và bạn không có cách nào để giảm bớt dung lượng? EBS Volume tương đối dễ sử dụng và mở rộng, tuy nhiên lại rất khỏ để giảm bớt dung lượng của nó. Đặc biết nếu nó được mount vào root. Mình đã tìm hiểu rất nhiều cách giảm dung lượng EBS Volume trên internet, đa số sẽ hoạt động tốt nếu nó không được mount vào root, dối với Root Volume thì hầu hết không start EC2 instance được.

Bạn đừng quá lo lắng. Trong bài viết này mình sẽ hướng dẫn bạn rất chi tiết làm thế nào để giảm dung lượng EBS Volume mà không mất dữ liệu giúp bạn tiết kiệm được một chút chi phí.

Tóm tắt một số bước mà chúng ta sẽ phải làm:

  • Stop EC2 instance.
  • Tạo một snapshot của Volume gốc.
  • Tạo một volume từ snapshot.
  • Tạo một EC2 instance mới với một EBS Root Volume với dung lượng mong muốn. Volume này sẽ được sử dụng làm Boot Volume sau này.
  • Stop EC2 instance mới và sau đó detach EBS Root Volume từ instance mới này.
  • Attach tất cả volumes vào EC2 instance.
  • Copy data từ volume lớn vào volume nhỏ.
  • Detach tất cả volumes từ EC2 instance và attach chỉ volume nhỏ.
  • Start EC2 instance.
  • Xoá volume cũ, volume được tạo từ snapshot, snapshot và terminate instance mới.

Tất cả cá bước sẽ được giải thích chi tiết dưới đây.

Bắt đầu nhé! Tôi có một EC2 instance tại US East (N.Virginia) region:

1.png

Instance có 1 volume đã được attach, dung lượng của volume là 30GB. Volume được attach tại /dev/xvda. Instance được launch tại us-east-1d Availability Zone (AZ). Bạn cần phải nhớ tất cả sẽ chỉ làm việc tốt khi cùng AZ:

2.png

Dưới đây là một số chi tiết về volume. Như bạn có thể thấy, tôi đã đặt tên cho Volume gốc là LARGE_VOL, vì vậy chúng ta có thể xác định nó sau khi có thêm các Volume khác:

3.png

Bây giờ hãy stop EC2 instance:

4.png

Tiếp theo chúng ta cần tạo snapshot của volume gốc. Chọn volume, click chuột phải sau đó chọn Create Snapshot:

5.png

Ở màn hình tiếp theo, bạn cần nhập vào tên và mô tả cho snapshot. Click Create để tiếp tục:

6.png

Bây giờ snapshot đã được tạo và bạn có thể thấy nó trong mục snapshot:

7.png

Tiếp tục, bạn tạo một volume từ snapshot, tôi đặt tên là SNAP_LARGE_VOL. Chọn snapshot, click chuột phải và chọn Create Volume:

8.png

Trong màn hình tiếp theo, bạn sẽ cần nhấp vào một số thông tin. Điều quan trọng nhất là chọn đúng AZ bạn thấy trước đó. Click Create để tạo volume:

9.png

Bây giờ chúng ta có 2 volumes: volume gốc và volume được tạo từ snapshot. Như bạn có thể thấy, chỉ volume gốc đã được sử dụng, nghĩa là nó đã được được attach vào một EC2 instance:

10.png

Bây giờ chúng ta cần tạo một instance với một EBS root volume với dung lượng mong muốn. Tại mục Instances, click Launch Instance và chọn một Amazon Machine Image(AMI). Hãy chọn AMI bạn đã sử dụng để launch instance cũ. Trong trường hợp của tôi, tôi chọn Amazon Linux. Sau đó click Select để chọn AMI:

11.png

Trong màn hình tiếp theo, click vào 4. Add Storage trên progress tracker để chuyển tới bước Add Storage:

12.png

Trong màn hình Add Storage, bạn cần nhập vào dung lượng mong muốn trong cột Size (GiB). Click vào Review and Launch để chuyển tới bước Review:

13.png

Trong màn Review, click Launch để launch instance:

14.png

Trong màn hình tiếp theo chọn một key pair có sẵn hoặc tạo mới sau đó click Launch Instance để kết thúc:

15.png

Trong màn hình tiếp theo, click vào View Instances để xem instance của bạn đã được tạo. Bây giờ chúng ta có 2 instances: một instance gốc và một instance mới được tạo dùng để tạo volume nhỏ:

16.png

Stop instance mới:

17.png

Detach volume nhỏ đã được attach trên instance mới:

18.png

Bây giờ chúng ta đã có thể attach các volume mới vào EC2 instance. Click chuột phải vào volume được tạo từ snapshot và chọn Attach Volume:

19.png

Chọn EC2 instance:

20.png

Và sau đó chọn Device, nơi mà bạn sẽ attach volume này vào EC2 instance. Bạn có thể giữ giá trị mặc định. Bạn chỉ cần nhớ rằng /dev/sdf sẽ convert thành /dev/xvdf. /dev/sdg sẽ convert thành dev/xvdg và tương tự. Sau đó click vào Attach:

21.png

Làm tương tự đối với volume nhỏ:

22.png

Bây giờ tất cả các volumes đã được attach:

23.png

Start EC2 instance:

24.png

Chúng ta cần xác nhận các volumes đã được attach đã hoạt động tốt, để làm điều này chúng ta cần ssh tới EC2 instance:

FFW:~ thinhhung$ ssh -i AMAZON_LINUX.pem [email protected]

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
No packages needed for security; 2 packages available
Run "sudo yum update" to apply all updates.

Hãy xem các volumes đã được attach tới EC2 instance như thế nào:

[[email protected] ~]$ lsblk
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0  30G  0 disk
`-xvda1 202:1    0  30G  0 part
xvdf    202:80   0  30G  0 disk
`-xvdf1 202:81   0  30G  0 part /
xvdg    202:96   0  20G  0 disk
`-xvdg1 202:97   0  20G  0 part

EC2 instance đã được boot từ partition /dev/xvdf1, chính là partition của volume đã được tạo từ snapshot thay vì volume gốc. Chúng ta sẽ copy dữ liệu từ partition của volume gốc /dev/xvda1 tới volume nhỏ /dev/xvdg. Trong trường hợp EC2 instance boot từ partition /dev/xvda1 của volume gốc, chúng ta sẽ copy dữ liệu từ parition /dev/xvdf1 của volume được tạo từ snapshot.

Chúng ta sử dụng quyền root:

[[email protected] ~]$ sudo su
[[email protected] ec2-user]#

Chúng ta tạo file system trên /dev/xvdg1: (Chú ý: partition /dev/xvdg1, không phải volume /dev/xvdg)

[email protected] ec2-user]# mkfs -t ext4 /dev/xvdg1
mke2fs 1.42.12 (29-Aug-2014)
/dev/xvdg1 contains a ext4 file system labelled '/'
	last mounted on / on Tue Jun 21 07:33:36 2016
Proceed anyway? (y,n) y
Creating filesystem with 5242363 4k blocks and 1310720 inodes
Filesystem UUID: a9d09ea9-aeb2-416d-af8f-cff5ec29d3f5
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
	4096000

Allocating group tables: done
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

Bây giờ chúng ta cần tạo 2 directories dùng để mount 2 paritions của volume lớn và nhỏ:

[[email protected] ec2-user]# mkdir /mnt/small_vol /mnt/large_vol
[[email protected] ec2-user]#

Tiếp theo chúng ta mount các paritions tới các directories mới đã tạo:

[[email protected] ec2-user]# mount /dev/xvdg1 /mnt/small_vol
[[email protected] ec2-user]# mount /dev/xvda1 /mnt/large_vol
[[email protected] ec2-user]#

Kiểm tra xem chúng đã được mount hay chưa:

[[email protected] ec2-user]# mount | grep xvd
/dev/xvdf1 on / type ext4 (rw,noatime,data=ordered)
/dev/xvdg1 on /mnt/small_vol type ext4 (rw,relatime,data=ordered)
/dev/xvda1 on /mnt/large_vol type ext4 (rw,relatime,data=ordered)
[[email protected] ec2-user]#

Tiếp theo chúng ta cần copy dữ liệu từ directory large_vol sang directory small_vol như thế này:

[[email protected] ec2-user]# rsync -ax /mnt/large_vol/ /mnt/small_vol
[[email protected] ec2-user]#

Chú ý lệnh rsync: directory large_vol kết thúc bởi / trong khi directory small_vol thì không.

Unmount các paritions:

[[email protected] ec2-user]# umount /mnt/large_vol
[[email protected] ec2-user]# umount /mnt/small_vol
[[email protected] ec2-user]#

Chắc chắn rằng parition của volume nhỏ có e2label giống với root partition. Hãy xem e2label trên root partition:

[[email protected] ec2-user]# e2label /dev/xvdf1
/
[[email protected] ec2-user]#

Update e2label trên parition của volume nhỏ:

[[email protected] ec2-user]# e2label /dev/xvdg1 /
[[email protected] ec2-user]#

Và bây giờ bạn có thể logout khỏi EC2 instance và stop nó.

Detach tất cả volumes từ EC2 instance:

25.png

Và attach chỉ volume nhỏ:

26.png

Bạn cần cẩn thận khi chọn device. Nó phải giống với device đã được sử dụng bởi volume gốc bạn đã thấy trong những phần đầu bài viết:

27.png

Start EC2 instance:

28.png

Và nó đã boot thành công, bạn có thế ssh tới nó:

FFW:~ thinhhung$ ssh -i AMAZON_LINUX.pem [email protected]
The authenticity of host '54.233.154.216 (54.233.154.216)' can't be established.
ECDSA key fingerprint is e2:b3:87:1f:21:4b:5c:3f:d9:1a:87:17:df:3e:d9:ee.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '54.233.154.216' (ECDSA) to the list of known hosts.

       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2016.03-release-notes/
No packages needed for security; 2 packages available
Run "sudo yum update" to apply all updates.

Tất cả đã hoàn thành. Bây giờ bạn đã có root volume với dung lượng mong muốn.

Xoá volume gốc và volume được tạo từ snapshot:

29.png

Xoá snapshot:

30.png

Terminate EC2 instance mới dùng để tạo volume nhỏ:

31.png

All Rights Reserved